/** * * @param * $ticks */ public function onRun($ticks) { try { if (empty($this->lv)) { return; } $start_time = microtime(true); $k = 1; foreach ($this->lv->currentMap->livePlayers as $gamer) { $targetWorldName = $gamer->levelName . "_TEMP"; $this->lv->level->addSound(new LaunchSound($gamer->player->getPosition()), array($gamer->player)); MapPortal::teleportToMap($targetWorldName, $gamer->player); $this->lv->currentMap->enterArena($gamer); MagicUtil::addEffect($gamer->player, Effect::INVISIBILITY, 1); foreach ($this->lv->currentMap->livePlayers as $gp) { if ($gp instanceof GamePlayer) { $gamer->hidePlayerFrom($gp->player); } } $this->plugin->log("[HungerGamesLevelPlayerToArenaTask] " . $this->lv->type . " | selected map " . $targetWorldName . " TP player [" . $k++ . "]" . $gamer->player->getName() . ")"); } $this->plugin->log("[HungerGamesLevelPlayerToArenaTask: took " . (microtime(true) - $start_time)); } catch (\Exception $e) { $this->plugin->printError($e); } }
/** * * @param GameLevelModel $lv */ public function generateRandomEffect(GameLevelModel $lv) { if (!empty($lv->currentMap) && count($lv->currentMap->livePlayers) > 0 && $lv->type === 2) { if ($lv->currentStep === GameLevelModel::STEP_HUNTING or $lv->currentStep === GameLevelModel::STEP_DEATH_MATCH) { foreach ($lv->currentMap->livePlayers as $gplayer) { if ($gplayer instanceof GamePlayer) { $eid = MagicUtil::generateRandomEffects(); MagicUtil::addEffect($gplayer->player, $eid, 80); $particleName = MagicUtil::matchEffectParticles($eid); if (!is_null($eid) && !is_null($particleName)) { MagicUtil::addParticles($lv->currentMap->level, "explode", $gplayer->player->getPosition(), 120); } } } } } }
/** * * @param * $ticks */ public function onRun($ticks) { try { if (empty($this->lv) || empty($this->lv->currentMap)) { return; } $start_time = microtime(true); $k = 1; foreach ($this->lv->currentMap->livePlayers as $gamer) { $gamer->player->teleport(new Vector3($this->lv->currentMap->deathMatchEnter->x, $this->lv->currentMap->deathMatchEnter->y, $this->lv->currentMap->deathMatchEnter->z)); MagicUtil::addEffect($gamer->player, Effect::INVISIBILITY, 1); $players[] = $gamer->player; $this->lv->level->addSound(new LaunchSound($gamer->player->getPosition()), $players); foreach ($this->lv->currentMap->livePlayers as $gp) { $gamer->showPlayerTo($gp->player); } unset($players); $this->plugin->log("[HungerGamesPlayerToDeathMatchTask] " . $this->lv->type . " | death-match |" . $this->lv->currentMap->name . " TP player [" . $k++ . "]" . $gamer->player->getName() . ")"); } $this->plugin->log("[HungerGamesPlayerToDeathMatchTask: took " . (microtime(true) - $start_time)); } catch (\Exception $e) { $this->plugin->printError($e); } }
/** * * @param GameLevelModel $lv * @param Player $player * @return boolean */ public function portalEnter(HungerGamesPlugIn $plugin, GameLevelModel $lv, Player $player) { if ($player->getLevel()->getName() != $lv->levelName) { return true; } if ($lv->insideLevelEntracePortal($player->getPosition())) { if (!isset($this->joinedPlayers[$player->getName()])) { if ($plugin->storyenforceaccess && $lv->type != 1) { $w = $plugin->storyManager->hasPlayerWonLevel($player->getName(), $lv->type - 1); if (!$w) { $player->sendMessage(TextFormat::RED . "[HG Story Mode Enabled]"); $player->sendMessage(TextFormat::YELLOW . "Required " . TextFormat::GOLD . "WIN " . TextFormat::YELLOW . "previous level before play this level!"); $player->getLevel()->addSound(new LaunchSound($player->getPosition()), array($player)); if ($player->isOp()) { $player->sendMessage(TextFormat::AQUA . "[Admin BY-PASS Story Mode Checking]"); } else { $player->teleport($lv->enterpos); return; } } } $this->joinedPlayers[$player->getName()] = $player; $message = TextFormat::GRAY . "[HG] [" . TextFormat::AQUA . $player->getName() . TextFormat::GRAY . "] joined " . $lv->displayName . " [" . TextFormat::GREEN . count($lv->joinedPlayers) . TextFormat::GRAY . " |" . TextFormat::WHITE . "minimal " . TextFormat::YELLOW . $lv->minPlayers . TextFormat::GRAY . "]"; $player->getServer()->broadcastMessage($message, $this->joinedPlayers); $lv->level->addSound(new DoorSound($player->getPosition()), $lv->joinedPlayers); $effect = MagicUtil::addEffect($player, Effect::STRENGTH); if ($effect != null) { $this->playersWithEffects[$player->getName()] = $effect; } if (!$player->isOp()) { if (!$player->isSurvival()) { $player->setGamemode(Player::SURVIVAL); } } $player->sendMessage(TextFormat::YELLOW . "[HG] Please wait here"); $player->sendMessage(TextFormat::GRAY . "[HG] The game auto start with minimal players"); } } else { if (isset($this->joinedPlayers[$player->getName()])) { $message = TextFormat::GRAY . "[ " . $player->getName() . " ] left " . $lv->displayName; $player->getServer()->broadcastMessage($message, $this->joinedPlayers); $lv->level->addSound(new DoorSound($player), $lv->joinedPlayers); unset($this->joinedPlayers[$player->getName()]); if (count($this->joinedPlayers) < $lv->minPlayers) { $lv->joinDownCounter = $lv->joinDownCounterReset; } foreach ($plugin->arenaManager->arenas as &$arena) { if ($arena instanceof MapArenaModel) { if (isset($arena->votedPlayers[$player->getName()])) { unset($arena->votedPlayers[$player->getName()]); if ($arena->vote >= 1) { $arena->vote--; } break; } } } if (isset($this->playersWithEffects[$player->getName()])) { $effect = $this->playersWithEffects[$player->getName()]; if ($effect != null) { $player->removeEffect($effect->getId()); unset($this->playersWithEffects[$player->getName()]); } } } } }
/** * * @param GameLevelModel $lv */ public function handleLevelGameOver(GameLevelModel &$lv) { $start = microtime(true); if (!empty($lv->currentMap)) { if (count($lv->currentMap->livePlayers) === 0) { Server::getInstance()->broadcastMessage(TextFormat::AQUA . "[HG] Game ended without winner!", $lv->currentMap->joinedPlayers); } if (count($lv->currentMap->livePlayers) > 0) { foreach ($lv->currentMap->livePlayers as $gamer) { if ($gamer instanceof GamePlayer) { $lv->level->addSound(new FizzSound($gamer->player), array($gamer->player)); $lv->level->addSound(new PopSound($gamer->player), array($gamer->player)); if (count($lv->currentMap->livePlayers) === 1) { if (isset($lv->currentMap->playerscores[$gamer->player->getName()])) { $scores = $lv->currentMap->playerscores[$gamer->player->getName()]; if ($scores != null) { $message = TextFormat::WHITE . "Final : "; $message .= TextFormat::AQUA . "shots " . TextFormat::LIGHT_PURPLE . $scores["shots"] . TextFormat::GRAY . " | "; $message .= TextFormat::AQUA . "points " . TextFormat::LIGHT_PURPLE . $scores["hits"] . TextFormat::GRAY . " | "; $message .= "\n"; $winmsg = TextFormat::GOLD . "--------------------------------------\n"; $winmsg .= TextFormat::GOLD . TextFormat::WHITE . " " . TextFormat::BOLD . TextFormat::LIGHT_PURPLE . "BRAVO " . TextFormat::WHITE . "[" . TextFormat::GOLD . $gamer->player->getName() . TextFormat::WHITE . "] Won [" . TextFormat::GOLD . $lv->winnerCoins . TextFormat::WHITE . "] coins \n"; $winmsg .= TextFormat::WHITE . " Level: " . TextFormat::GREEN . $lv->displayName . TextFormat::WHITE . " | Map: " . TextFormat::GREEN . $lv->currentMap->name . "\n"; $winmsg .= TextFormat::GREEN . " " . $message . "\n"; $winmsg .= TextFormat::GOLD . "--------------------------------------\n"; Server::getInstance()->broadcastMessage($winmsg, $lv->currentMap->joinedPlayers); if (isset($lv->currentMap->playerscores[$gamer->player->getName()])) { unset($lv->currentMap->playerscores[$gamer->player->getName()]); } if (isset($lv->currentMap->votedPlayers[$gamer->player->getName()])) { unset($lv->currentMap->votedPlayers[$gamer->player->getName()]); } $pmap = $lv->currentMap->name; $recordwins = new HungerGamesRecordWinsTask($this->plugin, $lv, $pmap, $gamer->player->getName(), $scores["hits"]); $this->plugin->getServer()->getScheduler()->scheduleDelayedTask($recordwins, mt_rand(2, 5)); for ($i = 0; $i < 50; $i++) { $gamer->player->sendTip(TextFormat::BOLD . TextFormat::GOLD . "[ = V I C T O R Y ! = ]"); } } } } else { if (isset($lv->currentMap->playerscores[$gamer->player->getName()])) { $scores = $lv->currentMap->playerscores[$gamer->player->getName()]; if ($scores != null) { $message = TextFormat::WHITE . "Final : "; $message .= TextFormat::AQUA . "shots " . TextFormat::LIGHT_PURPLE . $scores["shots"] . TextFormat::GRAY . " | "; $message .= TextFormat::AQUA . "points " . TextFormat::LIGHT_PURPLE . $scores["hits"] . TextFormat::GRAY . " | "; $message .= "\n"; } } for ($i = 0; $i < 50; $i++) { $gamer->player->sendTip(TextFormat::BOLD . TextFormat::AQUA . "[ * IT'S A DRAW ! * ]"); } $drawmsg = TextFormat::RED . "--------------------------------------\n"; $drawmsg .= TextFormat::RED . " -more than 1 player remains [" . count($lv->currentMap->livePlayers) . "]\n"; $drawmsg .= TextFormat::WHITE . " " . TextFormat::BOLD . TextFormat::YELLOW . "IT's A DRAW " . TextFormat::WHITE . "[" . TextFormat::GOLD . $gamer->player->getName() . TextFormat::WHITE . "]" . TextFormat::WHITE . "- try again?\n"; $drawmsg .= TextFormat::GREEN . " " . $message . "\n"; $drawmsg .= TextFormat::RED . "--------------------------------------" . "\n"; Server::getInstance()->broadcastMessage($drawmsg, $lv->currentMap->joinedPlayers); } $lv->level->addSound(new FizzSound($gamer->player), array($gamer->player)); MapPortal::teleportToMap($lv->levelName, $gamer->player); for ($i = 0; $i < 500; $i++) { } MapPortal::safeTeleporting($gamer->player, $lv->currentMap->arenaExitPos); foreach ($lv->currentMap->livePlayers as $gp) { $gamer->showPlayerTo($gp->player); } if (!empty($gamer->player->getInventory())) { HungerGameKit::clearAllInventories($gamer->player); $gamer->player->getInventory()->clearAll(); $gamer->player->setHealth(20); } MagicUtil::addEffect($gamer->player, Effect::JUMP, 10); MagicUtil::addParticles($gamer->player->level, "heart", $gamer->player->getPosition(), 30); $players[] = $gamer->player; $lv->level->addSound(new PopSound($gamer->player), $players); } } } try { $task = new HungerGamesMapResetTask($this->plugin, $lv->currentMap); $this->plugin->getServer()->getScheduler()->scheduleDelayedTask($task, 12); foreach ($lv->maps as $mapname) { if (isset($this->plugin->getAvailableArenas()[$mapname])) { $this->plugin->log($lv->name . "> * reset votes for map: " . $mapname); $arena = $this->plugin->getAvailableArenas()[$mapname]; $arena->vote = 0; $arena->votedPlayers = []; $this->plugin->getAvailableArenas()[$mapname] = $arena; break; } } $lv->joinDownCounter = 10; } catch (Exception $e) { $this->plugin->printError($e); } } $this->plugin->log("#8 " . $lv->name . " handleLevelGameOver took " . (microtime(true) - $start) . " ms"); }