PageRenderTime 44ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/src/Ad5001/SpectatorPlus/Main.php

https://gitlab.com/Skull3x/SpectatorPlus
PHP | 237 lines | 192 code | 40 blank | 5 comment | 27 complexity | 3e491247834ab97a22f2f0184b6d5ce9 MD5 | raw file
  1. <?php
  2. namespace Ad5001\SpectatorPlus;
  3. use pocketmine\command\CommandSender;
  4. use pocketmine\command\Command;
  5. use pocketmine\event\Listener;
  6. use pocketmine\plugin\PluginBase;
  7. use pocketmine\event\player\PlayerGameModeChangeEvent;
  8. use pocketmine\event\player\PlayerInteractEvent;
  9. use pocketmine\event\player\PlayerQuitEvent;
  10. use pocketmine\event\player\PlayerJoinEvent;
  11. use pocketmine\event\player\PlayerChatEvent;
  12. use pocketmine\event\block\BlockBreakEvent;
  13. use pocketmine\event\block\BlockPlaceEvent;
  14. use pocketmine\event\entity\EntityDamageEvent;
  15. use pocketmine\item\Item;
  16. use pocketmine\math\Vector3;
  17. use pocketmine\nbt\NBT;
  18. use pocketmine\Server;
  19. use pocketmine\Player;
  20. class Main extends PluginBase implements Listener{
  21. public function onEnable(){
  22. $this->saveDefaultConfig();
  23. $this->reloadConfig();
  24. $this->getServer()->getPluginManager()->registerEvents($this, $this);
  25. $this->getServer()->getScheduler()->scheduleRepeatingTask(new setGamemodeTask($this), 5);
  26. $this->getServer()->getScheduler()->scheduleRepeatingTask($this->teleportTask = new teleportTask($this), 5);
  27. $this->players = [];
  28. $this->quitedplayers = [];
  29. $this->lastPlayer = null;
  30. }
  31. public function test(Player $p, int $id) {
  32. $this->getLogger()->info("Item : " . $id . ". Is spectator : " . $this->isSpectator($p));
  33. if($this->isSpectator($p) and $id == 345) {
  34. // if($event->getPacket() instanceof \pocketmine\network\protocol\UseItemPacket) {
  35. $founds = [];
  36. foreach($p->getLevel()->getPlayers() as $player) {
  37. if(!$this->isSpectator($player)) {
  38. array_push($founds, $player);
  39. if(!in_array($player, $this->players[$p->getName()]) and !isset($found)) {
  40. array_push($this->players[$p->getName()], $player);
  41. $found = true;
  42. $event->getPlayer()->teleport(new Vector3($player->x, $player->y, $player->z));
  43. $event->getPlayer()->sendTip(str_ireplace("{to}", $player->getName(), str_ireplace("{player}", $p->getName(), str_ireplace("{count}", count($founds), $this->getConfig()->get("TeleportMessage")))));
  44. }
  45. }
  46. }
  47. if(!isset($found)) {
  48. $this->players[$p->getName()] = [];
  49. }
  50. foreach($p->getLevel()->getPlayers() as $player) {
  51. if(!$this->isSpectator($player)) {
  52. array_push($founds, $player);
  53. if(!in_array($player, $this->players[$p->getName()]) and !isset($found)) {
  54. array_push($this->players[$p->getName()], $player);
  55. $found = true;
  56. $p->teleport(new Vector3($player->x, $player->y, $player->z));
  57. $event->getPlayer()->sendTip(str_ireplace("{to}", $player->getName(), str_ireplace("{player}", $p->getName(), str_ireplace("{count}", count($founds), $this->getConfig()->get("TeleportMessage")))));
  58. }
  59. }
  60. }
  61. // }
  62. } elseif($this->isSpectator($p) and $id == 355) {
  63. // if($event->getPacket() instanceof \pocketmine\network\protocol\UseItemPacket) {
  64. $p->getInventory()->clearAll();
  65. $p->teleport($this->getServer()->getLevelByName($this->getConfig()->get("LobbyWorld"))->getSpawnLocation());
  66. $p->sendTip(str_ireplace("{lobby}", $this->getConfig()->get("LobbyWorld"), str_ireplace("{player}", $p->getName(), $this->getConfig()->get("LobbyMessage"))));
  67. // }
  68. }
  69. }
  70. public function onInteract(PlayerInteractEvent $event) {
  71. $this->test($event->getPlayer(), $event->getPlayer()->getInventory()->getItemInHand()->getId());
  72. }
  73. public function onBlockPlace(BlockPlaceEvent $event) {
  74. $this->test($event->getPlayer(), $event->getBlock()->getId());
  75. if($this->isSpectator($event->getPlayer())) {
  76. $event->setCancelled();
  77. }
  78. }
  79. public function onBlockBreak(BlockBreakEvent $event) {
  80. $this->test($event->getPlayer(), $event->getPlayer()->getInventory()->getItemInHand()->getId());
  81. if($this->isSpectator($event->getPlayer())) {
  82. $event->setCancelled();
  83. }
  84. }
  85. public function onEntityDamage(EntityDamageEvent $event) {
  86. if($event->getEntity() instanceof Player) {
  87. if($this->isSpectator($event->getEntity())) {
  88. $event->setCancelled();
  89. }
  90. }
  91. if($event instanceof \pocketmine\event\entity\EntityDamageByEntityEvent) {
  92. if($event->getDamager() instanceof Player) {
  93. if($this->isSpectator($event->getDamager())) {
  94. $event->setCancelled();
  95. $this->test($event->getDamager(), $event->getDamager()->getInventory()->getItemInHand()->getId());
  96. }
  97. if($this->isSpectator($event->getDamager()) and $event->getEntity() instanceof Player) {
  98. if($this->isSpectator($event->getEntity())) {
  99. $this->teleportTask->add($event->getEntity());
  100. }
  101. }
  102. }
  103. }
  104. }
  105. public function onPlayerChat(PlayerChatEvent $event) {
  106. if($this->getConfig()->get("PrivateSpecChat") == "true") {
  107. foreach($event->getPlayer()->getLevel()->getPlayers() as $p) {
  108. if($this->isSpectator($p)) {
  109. $p->sendMessage(\pocketmine\utils\TextFormat::GRAY . "[SPEC] " . $event->getPlayer()->getName() . " > " . $event->getMessage());
  110. }
  111. }
  112. $event->setCancelled();
  113. }
  114. }
  115. public function onPlayerGameModeChange(PlayerGameModeChangeEvent $event) {
  116. if($event->getNewGamemode() == 3) { // Testing if spectator.
  117. $player = $event->getPlayer();
  118. $this->players[$player->getName()] = [];
  119. $this->lastPlayer = $player;
  120. $player->setDisplayedName(\pocketmine\utils\TextFormat::GRAY . "[SPEC] " . $event->getPlayer()->getName());
  121. } elseif($this->lastPlayer !== $event->getPlayer() and isset($this->players[$event->getPlayer()->getName()])) {
  122. unset($this->players[$event->getPlayer()->getName()]);
  123. $event->getPlayer()->setAllowFlight(false);
  124. $event->getPlayer()->getInventory()->clearAll();
  125. $this->lastPlayer = null;
  126. $event->getPlayer()->setDisplayedName($event->getPlayer()->getName());
  127. }
  128. }
  129. public function isSpectator(Player $player) {
  130. return isset($this->players[$player->getName()]);
  131. }
  132. public function onPlayerQuit(PlayerQuitEvent $event) {
  133. if($this->isSpectator($event->getPlayer())) {
  134. $this->quitedplayers[$event->getPlayer()->getName()] = true;
  135. unset($this->players[$event->getPlayer()->getName()]);
  136. }
  137. }
  138. public function onPlayerJoin(PlayerJoinEvent $event) {
  139. if(isset($this->quitedplayers[$event->getPlayer()->getName()])) {
  140. $this->players[$player->getName()] = [];
  141. unset($this->quitedplayers[$event->getPlayer()->getName()]);
  142. }
  143. }
  144. public function onCommand(CommandSender $sender, Command $cmd, $label, array $args){
  145. switch($cmd->getName()){
  146. case "default":
  147. break;
  148. }
  149. return false;
  150. }
  151. }
  152. class setGamemodeTask extends \pocketmine\scheduler\PluginTask {
  153. public function __construct(Main $main) {
  154. parent::__construct($main);
  155. $this->main = $main;
  156. }
  157. public function onRun($tick) {
  158. foreach($this->main->players as $playername => $tped) {
  159. $player = $this->main->getServer()->getPlayer($playername);
  160. // $this->main->getLogger()->info($player->getGamemode() . "/" . $player->isSpectator());
  161. if($player->isSpectator()) {
  162. $player->setGamemode(0);
  163. $compass = Item::get(345, 0, 1);
  164. $compass->setNamedTag(NBT::parseJSON('{display:{Name:"§r' . $this->main->getConfig()->get("TPCompassName") . '"}}'));
  165. $player->getInventory()->addItem($compass);
  166. $compass = Item::get(Item::BED, 0, 1);
  167. $compass->setNamedTag(NBT::parseJSON('{display:{Name:"§r' . $this->main->getConfig()->get("BedBackName") . '"}}'));
  168. $player->getInventory()->addItem($compass);
  169. foreach($player->getLevel()->getPlayers() as $p) {
  170. if(!$this->main->isSpectator($p)) {
  171. $p->hidePlayer($player);
  172. }
  173. }
  174. $player->setAllowFlight(true);
  175. }
  176. }
  177. }
  178. }
  179. class setGamemodeTask extends \pocketmine\scheduler\PluginTask {
  180. public function __construct(Main $main) {
  181. parent::__construct($main);
  182. $this->main = $main;
  183. $this->players = null;
  184. }
  185. public function onRun($tick) {
  186. foreach($this->players as $pname => $tpname) {
  187. $p = $this->main->getServer()->getPlayer($pname);
  188. $tp = $this->main->getServer()->getPlayer($tpname);
  189. if($p instanceof Player and $tp instanceof Player) {
  190. $p->teleport(new Vector3($tp->x, $tp->y, $tp->z));
  191. }
  192. }
  193. }
  194. public function add(Player $player, Player $to) {
  195. $this->players[$player->getName()] = $to->getName();
  196. }
  197. }