public static function createAccount($ninja_name, $email, $class_identity) { $found = Player::findByName($ninja_name); if ($found) { throw new Exception("Test user found [{$found}] with name [{$ninja_name}] already exists"); } $ip = isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1'; // Create test user, unconfirmed, whatever the default is for activity. $confirm = rand(1000, 9999); //generate confirmation code $class_id = query_item('SELECT class_id FROM class WHERE identity = :class_identity', [':class_identity' => $class_identity]); $ninja = new Player(); $ninja->uname = $ninja_name; $ninja->verification_number = $confirm; $ninja->active = 1; $ninja->_class_id = $class_id; $ninja->save(); Account::create($ninja->id(), $email, TestAccountCreateAndDestroy::$test_password, $confirm, 0, 1, $ip); if ($confirm) { $ninja->active = 1; $ninja->save(); $account = Account::findByChar($ninja); $account->confirmed = 1; $account->setOperational(true); $account->save(); } return $ninja->id(); }
/** * Perform the effects of a clonekill. * @return string outcome or false */ public static function kill(Player $self, Player $clone1, Player $clone2) { if (self::canKill($clone1, $clone2)) { $today = date("F j, Y, g:i a"); $clone1_health = $clone1->health; $clone2_health = $clone2->health; $clone1_turns = $clone1->turns; $clone2_turns = $clone2->turns; $clone1->changeTurns(-1 * $clone1->turns); $clone1->death(); $clone2->changeTurns(-1 * $clone2->turns); $clone2->death(); $clone1->save(); $clone2->save(); $result_message = "You obliterate the clone {$clone1->name()} for {$clone1_health} health, {$clone1_turns} turns\n and the clone {$clone2->name()} for {$clone2_health} health, {$clone2_turns} turns."; Event::create($self->id(), $clone1->id(), "You and {$clone2->name()} were Clone Killed at {$today}."); Event::create($self->id(), $clone2->id(), "You and {$clone1->name()} were Clone Killed at {$today}."); return $result_message; } else { return false; } }
/** * Drop a certain enemy from the list. * * @param Player $p_player * @param Player $p_enemy * @return void */ private function removeEnemyFromPlayer(Player $p_player, Player $p_enemy) { DatabaseConnection::getInstance(); $query = 'DELETE FROM enemies WHERE _player_id = :pid AND _enemy_id = :eid'; $statement = DatabaseConnection::$pdo->prepare($query); $statement->bindValue(':pid', $p_player->id()); $statement->bindValue(':eid', $p_enemy->id()); $statement->execute(); }
/** * Tests whether the specified player is a leader of the specified clan * * @param Player $p_objPlayer The player in question * @param Clan $p_objClan The clan to check against * @return boolean */ private function playerIsLeader(Player $p_objPlayer, Clan $p_objClan) { $leaders = $p_objClan->getAllClanLeaders(); foreach ($leaders as $leader) { if ($leader['player_id'] == $p_objPlayer->id()) { return true; } } return false; }
/** * Just update the last attack attempt of a player in the database. */ private function updateLastAttack(Player $attacker) { // updates the timestamp of the last_attacked column to slow excessive attacks. $update_last_attacked = "UPDATE players SET last_started_attack = now() WHERE player_id = :pid"; $updated = update_query($update_last_attacked, [':pid' => $attacker->id()]); return (bool) $updated; }
/** * mark all messages of a type for a ninja as read */ public static function markAsRead(Player $char, $type) { return self::where(['send_to' => $char->id(), 'type' => $type])->update(['unread' => 0]); }
/** * Actual login! Performs the login of a user using pre-vetted info! * * Creates the cookie and session stuff for the login process. * * @param Account $account * @param Player $player * @return void */ private function createGameSession(Account $account, Player $player) { $_COOKIE['username'] = $player->name(); $session = SessionFactory::getSession(); $session->set('username', $player->name()); $session->set('player_id', $player->id()); $session->set('account_id', $account->id()); $session->set('authenticated', true); $request = RequestWrapper::$request; $user_ip = $request->getClientIp(); query('UPDATE players SET active = 1, days = 0 WHERE player_id = :player', [':player' => [$player->id(), PDO::PARAM_INT]]); query('UPDATE accounts SET last_ip = :ip, last_login = now() WHERE account_id = :account', [':ip' => $user_ip, ':account' => [$account->id(), PDO::PARAM_INT]]); }
/** * Get an account for a character * * @param Character $char * @return Account|null */ public static function findByChar(Player $char) { $query = 'SELECT account_id FROM accounts JOIN account_players ON _account_id = account_id JOIN players ON _player_id = player_id WHERE players.player_id = :pid'; return self::findById(query_item($query, [':pid' => $char->id()])); }
/** * Find the clan belonging to a player, if any * * @param Player $player * @return Clan|null */ public static function findByMember(Player $player) { $clan_info = query_row('select clan_id, clan_name, clan_created_date, clan_founder, clan_avatar_url, description from clan JOIN clan_player ON clan_id = _clan_id where _player_id = :pid', [':pid' => $player->id()]); if (empty($clan_info)) { return null; } else { return new Clan($clan_info['clan_id'], $clan_info['clan_name'], $clan_info); } }
/** * Get the count of how many of an item a player has. * * @return int */ private function itemCount(Player $player, Item $item) { $statement = query("SELECT sum(amount) FROM inventory WHERE item_type = :item AND owner = :owner", [':owner' => $player->id(), ':item' => $item->item_id]); return $statement->fetchColumn(); }