* @author Slawkens * @copyright 2019 MyAAC * @link https://my-aac.org */ class CreateCharacter { /** * @param $name * @param $errors * @return bool */ public function checkName($name, &$errors) { $minLength = setting('core.create_character_name_min_length'); $maxLength = setting('core.create_character_name_max_length'); if(empty($name)) { $errors['name'] = 'Please enter a name for your character!'; return false; } if(strlen($name) > $maxLength) { $errors['name'] = 'Name is too long. Max. length ' . $maxLength . ' letters.'; return false; } if(strlen($name) < $minLength) { $errors['name'] = 'Name is too short. Min. length ' . $minLength . ' letters.'; return false; } $name_length = strlen($name); if(strspn($name, "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM- '") != $name_length) { $errors['name'] = 'This name contains invalid letters, words or format. Please use only a-Z, - , \' and space.'; return false; } if(!preg_match("/[A-z ']/", $name)) { $errors['name'] = 'Your name contains illegal characters.'; return false; } if(!admin() && !Validator::newCharacterName($name)) { $errors['name'] = Validator::getLastError(); return false; } $player = new OTS_Player(); $player->find($name); if($player->isLoaded()) { $errors['name'] = 'Character with this name already exist.'; return false; } return empty($errors); } /** * @param string $name * @param int $sex * @param int $vocation * @param int $town * @param array $errors * @return bool */ public function check($name, $sex, &$vocation, &$town, &$errors) { $this->checkName($name, $errors); if(empty($sex) && $sex != "0") { $errors['sex'] = 'Please select the sex for your character!'; } if(count(config('character_samples')) > 1) { if(!isset($vocation)) $errors['vocation'] = 'Please select a vocation for your character.'; } else { $vocation = config('character_samples')[0]; } if(count(config('character_towns')) > 1) { if(!isset($town)) { $errors['town'] = 'Please select a town for your character.'; } } else { $town = config('character_towns')[0]; } if(empty($errors)) { if(!isset(config('genders')[$sex])) $errors['sex'] = 'Sex is invalid.'; if(!in_array($town, config('character_towns'), false)) $errors['town'] = 'Please select valid town.'; if(count(config('character_samples')) > 1) { $newchar_vocation_check = false; foreach((array)config('character_samples') as $char_vocation_key => $sample_char) if($vocation === $char_vocation_key) $newchar_vocation_check = true; if(!$newchar_vocation_check) $errors['vocation'] = 'Unknown vocation. Please fill in form again.'; } else $vocation = 0; } return empty($errors); } /** * @param string $name * @param int $sex * @param int $vocation * @param int $town * @param OTS_Account $account * @param array $errors * @return bool * @throws E_OTS_NotLoaded * @throws Twig_Error_Loader * @throws Twig_Error_Runtime * @throws Twig_Error_Syntax */ public function doCreate($name, $sex, $vocation, $town, $account, &$errors) { if(!$this->check($name, $sex, $vocation, $town, $errors)) { return false; } if(empty($errors)) { $number_of_players_on_account = $account->getPlayersList(true)->count(); if($number_of_players_on_account >= config('characters_per_account')) $errors[] = 'You have too many characters on your account ('.$number_of_players_on_account.'/'.config('characters_per_account').')!'; } if(empty($errors)) { $char_to_copy_name = config('character_samples')[$vocation]; $char_to_copy = new OTS_Player(); $char_to_copy->find($char_to_copy_name); if(!$char_to_copy->isLoaded()) $errors[] = 'Wrong characters configuration. Try again or contact with admin. ADMIN: Go to Admin Panel -> Settings -> Create Character and set valid characters to copy names. Character to copy: '.$char_to_copy_name.' doesn\'t exist.'; } if(!empty($errors)) { return false; } global $db; if($sex == "0") $char_to_copy->setLookType(136); $player = new OTS_Player(); $player->setName($name); $player->setAccount($account); $player->setGroupId(1); $player->setSex($sex); $player->setVocation($char_to_copy->getVocation()); if($db->hasColumn('players', 'promotion')) $player->setPromotion($char_to_copy->getPromotion()); if($db->hasColumn('players', 'direction')) $player->setDirection($char_to_copy->getDirection()); $player->setConditions($char_to_copy->getConditions()); $rank = $char_to_copy->getRank(); if($rank->isLoaded()) { $player->setRank($char_to_copy->getRank()); } if($db->hasColumn('players', 'lookaddons')) $player->setLookAddons($char_to_copy->getLookAddons()); $player->setTownId($town); $player->setExperience($char_to_copy->getExperience()); $player->setLevel($char_to_copy->getLevel()); $player->setMagLevel($char_to_copy->getMagLevel()); $player->setHealth($char_to_copy->getHealth()); $player->setHealthMax($char_to_copy->getHealthMax()); $player->setMana($char_to_copy->getMana()); $player->setManaMax($char_to_copy->getManaMax()); $player->setManaSpent($char_to_copy->getManaSpent()); $player->setSoul($char_to_copy->getSoul()); for($skill = POT::SKILL_FIRST; $skill <= POT::SKILL_LAST; $skill++) { $value = 10; if (setting('core.use_character_sample_skills')) { $value = $char_to_copy->getSkill($skill); } $player->setSkill($skill, $value); } $player->setLookBody($char_to_copy->getLookBody()); $player->setLookFeet($char_to_copy->getLookFeet()); $player->setLookHead($char_to_copy->getLookHead()); $player->setLookLegs($char_to_copy->getLookLegs()); $player->setLookType($char_to_copy->getLookType()); $player->setCap($char_to_copy->getCap()); $player->setBalance(0); $player->setPosX(0); $player->setPosY(0); $player->setPosZ(0); if($db->hasColumn('players', 'stamina')) { $player->setStamina($char_to_copy->getStamina()); } if($db->hasColumn('players', 'loss_experience')) { $player->setLossExperience($char_to_copy->getLossExperience()); $player->setLossMana($char_to_copy->getLossMana()); $player->setLossSkills($char_to_copy->getLossSkills()); } if($db->hasColumn('players', 'loss_items')) { $player->setLossItems($char_to_copy->getLossItems()); $player->setLossContainers($char_to_copy->getLossContainers()); } $player->save(); $player->setCustomField('created', time()); $player = new OTS_Player(); $player->find($name); if(!$player->isLoaded()) { error("Error. Can't create character. Probably problem with database. Please try again later or contact with admin."); return false; } if($db->hasTable('player_skills')) { for($skill = POT::SKILL_FIRST; $skill <= POT::SKILL_LAST; $skill++) { $value = 10; if (setting('core.use_character_sample_skills')) { $value = $char_to_copy->getSkill($skill); } $skillExists = $db->query('SELECT `skillid` FROM `player_skills` WHERE `player_id` = ' . $player->getId() . ' AND `skillid` = ' . $skill); if($skillExists->rowCount() <= 0) { $db->query('INSERT INTO `player_skills` (`player_id`, `skillid`, `value`, `count`) VALUES ('.$player->getId().', '.$skill.', ' . $value . ', 0)'); } } } if ($db->hasTable('player_items') && $db->hasColumn('player_items', 'pid') && $db->hasColumn('player_items', 'sid') && $db->hasColumn('player_items', 'itemtype')) { $loaded_items_to_copy = $db->query("SELECT * FROM player_items WHERE player_id = ".$char_to_copy->getId().""); foreach($loaded_items_to_copy as $save_item) { $blob = $db->quote($save_item['attributes']); $db->query("INSERT INTO `player_items` (`player_id` ,`pid` ,`sid` ,`itemtype`, `count`, `attributes`) VALUES ('".$player->getId()."', '".$save_item['pid']."', '".$save_item['sid']."', '".$save_item['itemtype']."', '".$save_item['count']."', $blob);"); } } global $twig; $twig->display('success.html.twig', array( 'title' => 'Character Created', 'description' => 'The character ' . $name . ' has been created.
Please select the outfit when you log in for the first time.

See you on ' . configLua('serverName') . '!' )); $account->logAction('Created character ' . $name . '.'); return true; } }