mirror of
https://github.com/slawkens/myaac.git
synced 2025-04-26 17:29:21 +02:00

* wip * wip * wip * wip * wip * fix: reusing pdo connection from pot * wip * wip * wip * wip * move files In future, all classes will be in src/ folder * Replace namespace name, for future * Remove duplicated exception * Fix towns from db * Fix spells page * Add default FAQ question + FAQ model * feat: reset colors in menus * Add confirm + save button at the top (menus) * Do not insert duplicated FAQ on install * Refactor install menus * Fix changelogs showing * Fix menu update, only with specified template name * Fix account create -> missing compat * Fix bans_per_page * banned_by is player_id. type = 2 is namelock in tfs 0.3 * Add getPlayerNameById, fix getPlayerNameByAccount * Change link name * Order by lastlogin * fix: query optimize * wip * wip * wip * wip * wip * wip * wip * Refactor notepad.php, class was useless * This is showing error, if the updated rows = 0 * Fix success & error class (bootstrap) * Uncomment require migrate.php * Some distro have owner_id * Update Player.php --------- Co-authored-by: slawkens <slawkens@gmail.com>
275 lines
8.4 KiB
PHP
275 lines
8.4 KiB
PHP
<?php
|
|
|
|
use MyAAC\Models\Player;
|
|
|
|
/**
|
|
* CreateCharacter
|
|
*
|
|
* @package MyAAC
|
|
* @author Gesior <jerzyskalski@wp.pl>
|
|
* @author Slawkens <slawkens@gmail.com>
|
|
* @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 <b>' . $maxLength . '</b> letters.';
|
|
return false;
|
|
}
|
|
|
|
if(strlen($name) < $minLength) {
|
|
$errors['name'] = 'Name is too short. Min. length <b>' . $minLength . '</b> 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;
|
|
}
|
|
|
|
if(Player::where('name', '=', $name)->exists()) {
|
|
$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 <b>('.$number_of_players_on_account.'/'.config('characters_per_account').')</b>!';
|
|
}
|
|
|
|
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: <b>'.$char_to_copy_name.'</b> 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 <b>' . $name . '</b> has been created.<br/>
|
|
Please select the outfit when you log in for the first time.<br/><br/>
|
|
<b>See you on ' . configLua('serverName') . '!</b>'
|
|
));
|
|
|
|
$account->logAction('Created character <b>' . $name . '</b>.');
|
|
return true;
|
|
}
|
|
}
|