Advertisement
Guest User

Untitled

a guest
Jul 10th, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 7.58 KB | None | 0 0
  1. <?php
  2.  
  3. namespace Minifixio\onevsone\model;
  4.  
  5. use Minifixio\onevsone\OneVsOne;
  6. use Minifixio\onevsone\ArenaManager;
  7.  
  8. use pocketmine\Player;
  9. use pocketmine\scheduler\TaskHandler;
  10. use pocketmine\Server;
  11. use pocketmine\level\Position;
  12. use pocketmine\item\Item;
  13. use pocketmine\utils\TextFormat;
  14. use pocketmine\math\Vector3;
  15. use pocketmine\block\Block;
  16. use pocketmine\level\particle\DestroyBlockParticle;
  17.  
  18. class Arena{
  19.  
  20.     public $active = FALSE;
  21.    
  22.     public $startTime;
  23.    
  24.     public $players = array();
  25.    
  26.     /** @var Position */
  27.     public $position;
  28.    
  29.     /** @var ArenaManager */
  30.     private $manager;
  31.    
  32.     // Roound duration (3min)
  33.     const ROUND_DURATION = 180;
  34.    
  35.     const PLAYER_1_OFFSET_X = 10;
  36.     const PLAYER_2_OFFSET_X = -10;
  37.    
  38.     // Variable for stop the round's timer
  39.     /** @var TaskHandler $taskHandler */
  40.     private $taskHandler;
  41.     /** @var TaskHandler $countdownTaskHandler */
  42.     private $countdownTaskHandler;
  43.     /**
  44.      * Build a new Arena
  45.      *
  46.      * @param Position position Base position of the Arena
  47.      * @param ArenaManager $manager
  48.      */
  49.     public function __construct($position, ArenaManager $manager){
  50.         $this->position = $position;
  51.         $this->manager = $manager;
  52.         $this->active = FALSE;
  53.     }
  54.    
  55.     /**
  56.      * Demarre un match.
  57.      * @param Player[] $players
  58.      */
  59.     public function startRound(array $players){
  60.        
  61.         // Set active to prevent new players
  62.         $this->active = TRUE;
  63.        
  64.         // Set players
  65.         $this->players = $players;
  66.         $player1 = $players[0];
  67.         $player2 = $players[1];
  68.        
  69.         $player1->sendMessage(OneVsOne::getMessage("duel_against") . $player2->getName());
  70.         $player2->sendMessage(OneVsOne::getMessage("duel_against") . $player1->getName());
  71.  
  72.         // Create a new countdowntask
  73.         $task = new CountDownToDuelTask(OneVsOne::getInstance(), $this);
  74.         $this->countdownTaskHandler = getServer()->getScheduler()->scheduleDelayedRepeatingTask($task, 20, 20);
  75.     }
  76.    
  77.     /**
  78.      * Really starts the duel after countdown
  79.      */
  80.     public function startDuel(){
  81.        
  82.         Server::getInstance()->getScheduler()->cancelTask($this->countdownTaskHandler->getTaskId());
  83.        
  84.         $player1 = $this->players[0];
  85.         $player2 = $this->players[1];
  86.        
  87.         $pos_player1 = Position::fromObject($this->position, $this->position->getLevel());
  88.         $pos_player1->x += self::PLAYER_1_OFFSET_X;
  89.        
  90.         $pos_player2 = Position::fromObject($this->position, $this->position->getLevel());
  91.         $pos_player2->x += self::PLAYER_2_OFFSET_X;
  92.         $player1->teleport($pos_player1, 90, 0);
  93.         $player2->teleport($pos_player2, -90, 0);
  94.         $this->sparyParticle($player1);
  95.         $this->sparyParticle($player2);
  96.         $player1->setGamemode(0);
  97.         $player2->setGamemode(0);
  98.        
  99.         // Give kit
  100.         foreach ($this->players as $player){
  101.             $this->giveKit($player);
  102.         }
  103.        
  104.         // Fix start time
  105.         $this->startTime = new \DateTime('now');
  106.        
  107.         $player1->sendTip(OneVsOne::getMessage("duel_tip"));
  108.         $player1->sendMessage(OneVsOne::getMessage("duel_start"));
  109.        
  110.         $player2->sendTip(OneVsOne::getMessage("duel_tip"));
  111.         $player2->sendMessage(OneVsOne::getMessage("duel_start"));
  112.        
  113.         // Launch the end round task
  114.         $task = new RoundCheckTask(OneVsOne::getInstance());
  115.         $task->arena = $this;
  116.         $this->taskHandler = Server::getInstance()->getScheduler()->scheduleDelayedTask($task, self::ROUND_DURATION * 20);
  117.     }
  118.    
  119.     /**
  120.      * Abort duel during countdown if one of the players has quit
  121.      */
  122.     public function abortDuel(){
  123.         Server::getInstance()->getScheduler()->cancelTask($this->countdownTaskHandler->getTaskId());
  124.     }
  125.    
  126.     private function giveKit(Player $player){
  127.         // Clear inventory
  128.         $player->getInventory()->clearAll();
  129.        
  130.         // Give sword, food and armor
  131.         $player->getInventory()->addItem(Item::get(ITEM::IRON_SWORD));
  132.         $player->getInventory()->addItem(Item::get(ITEM::MUSHROOM_STEW));
  133.         $player->getInventory()->addItem(Item::get(ITEM::MUSHROOM_STEW));
  134.         $player->getInventory()->addItem(Item::get(ITEM::MUSHROOM_STEW));
  135.         $player->getInventory()->addItem(Item::get(ITEM::MUSHROOM_STEW));
  136.         $player->getInventory()->addItem(Item::get(ITEM::MUSHROOM_STEW));
  137.         $player->getInventory()->addItem(Item::get(ITEM::MUSHROOM_STEW));
  138.         $player->getInventory()->addItem(Item::get(ITEM::MUSHROOM_STEW));
  139.         $player->getInventory()->addItem(Item::get(ITEM::MUSHROOM_STEW));
  140.         $player->getInventory()->addItem(Item::get(ITEM::MUSHROOM_STEW));
  141.         $player->getInventory()->setItemInHand(Item::get(ITEM::IRON_SWORD));
  142.        
  143.         // Pur the armor on the player
  144.         $player->getArmorInventory()->setHelmet(Item::get(310, 0, 1));
  145.         $player->getArmorInventory()->setChestplate(Item::get(311, 0, 1));
  146.         $player->getArmorInventory()->setLeggings(Item::get(312, 0, 1));
  147.         $player->getArmorInventory()->setBoots(Item::get(313, 0, 1));
  148.         $player->getArmorInventory()->sendContents($player);
  149.        
  150.         // Set his life to 20
  151.         $player->setHealth(20);
  152.         $player->removeAllEffects();
  153.  
  154.    }
  155.    
  156.    /**
  157.     * When a player was killed
  158.     * @param Player $loser
  159.     */
  160.    public function onPlayerDeath(Player $loser){
  161.    
  162.         // Finish the duel and teleport the winner at spawn
  163.         if($loser == $this->players[0]){
  164.             $winner = $this->players[1];
  165.         }
  166.         else{
  167.             $winner = $this->players[0];
  168.         }      
  169.         $loser->sendMessage(OneVsOne::getMessage("duel_loser") . $winner->getName());
  170.         $loser->removeAllEffects();
  171.        
  172.         $winner->sendMessage( OneVsOne::getMessage("duel_winner") . $loser->getName());
  173.         $winner->removeAllEffects();
  174.        
  175.         // Teleport the winner at spawn
  176.         $winner->teleport($winner->getSpawn());
  177.  
  178.         // Set his life to 20
  179.         $winner->setHealth(20);
  180.         Server::getInstance()->broadcastMessage(TextFormat::GREEN . TextFormat::BOLD . "ยป " . TextFormat::GOLD . $winner->getName() . TextFormat::WHITE . OneVsOne::getMessage("duel_broadcast") . TextFormat::RED . $loser->getName() . TextFormat::WHITE . " !");
  181.        
  182.         // Reset arena
  183.         $this->reset();
  184.    }
  185.  
  186.    /**
  187.     * Reset the Arena to current state
  188.     */
  189.    private function reset(){
  190.         // Put active a rena after the duel
  191.         $this->active = FALSE;
  192.         foreach ($this->players as $player){
  193.             $player->getInventory()->setItemInHand(new Item(Item::AIR,0,0));
  194.             $player->getInventory()->clearAll();
  195.             $player->getArmorInventory()->sendContents($player);
  196.             $player->getInventory()->sendContents($player);
  197.             $player->getInventory()->sendHeldItem($player);
  198.         }
  199.         $this->players = array();
  200.         $this->startTime = NULL;
  201.         if($this->taskHandler != NULL){
  202.             Server::getInstance()->getScheduler()->cancelTask($this->taskHandler->getTaskId());
  203.             $this->manager->notifyEndOfRound($this);
  204.         }
  205.    }
  206.    
  207.    /**
  208.     * When a player quit the game
  209.     * @param Player $loser
  210.     */
  211.    public function onPlayerQuit(Player $loser){
  212.         // Finish the duel when a player quit
  213.         // With onPlayerDeath() function
  214.         $this->onPlayerDeath($loser);
  215.    }
  216.    
  217.    /**
  218.     * When maximum round time is reached
  219.     */
  220.    public function onRoundEnd(){
  221.         foreach ($this->players as $player){
  222.             $player->teleport($player->getSpawn());
  223.             $player->sendMessage(TextFormat::BOLD . "++++++++=++++++++");
  224.             $player->sendMessage(OneVsOne::getMessage("duel_timeover"));
  225.             $player->sendMessage(TextFormat::BOLD . "++++++++=++++++++");
  226.             $player->removeAllEffects();
  227.         }
  228.        
  229.         // Reset arena
  230.         $this->reset();        
  231.      }
  232.      
  233.      public function isPlayerInArena(Player $player){
  234.         return in_array($player, $this->players);
  235.      }
  236.      
  237.      public function sparyParticle(Player $player){
  238.         $particle = new DestroyBlockParticle(new Vector3($player->getX(), $player->getY(), $player->getZ()), Block::get(8));
  239.         $player->getLevel()->addParticle($particle);
  240.     }
  241. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement