PageRenderTime 48ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/src/MyPlot/EventListener.php

https://gitlab.com/Skull3x/MyPlot
PHP | 189 lines | 158 code | 20 blank | 11 comment | 22 complexity | a9077f686b7252d6f734946e06e53a59 MD5 | raw file
  1. <?php
  2. namespace MyPlot;
  3. use pocketmine\block\Sapling;
  4. use pocketmine\event\player\PlayerMoveEvent;
  5. use pocketmine\Player;
  6. use pocketmine\event\block\BlockUpdateEvent;
  7. use pocketmine\event\entity\EntityExplodeEvent;
  8. use pocketmine\event\entity\EntityMotionEvent;
  9. use pocketmine\event\Listener;
  10. use pocketmine\event\level\LevelLoadEvent;
  11. use pocketmine\event\level\LevelUnloadEvent;
  12. use pocketmine\utils\Config;
  13. use pocketmine\event\block\BlockPlaceEvent;
  14. use pocketmine\event\block\BlockBreakEvent;
  15. use pocketmine\event\player\PlayerInteractEvent;
  16. use pocketmine\utils\TextFormat;
  17. class EventListener implements Listener
  18. {
  19. /** @var MyPlot */
  20. private $plugin;
  21. public function __construct(MyPlot $plugin){
  22. $this->plugin = $plugin;
  23. }
  24. public function onLevelLoad(LevelLoadEvent $event) {
  25. if ($event->getLevel()->getProvider()->getGenerator() === "myplot") {
  26. $settings = $event->getLevel()->getProvider()->getGeneratorOptions();
  27. if (isset($settings["preset"]) === false or $settings["preset"] === "") {
  28. return;
  29. }
  30. $settings = json_decode($settings["preset"], true);
  31. if ($settings === false) {
  32. return;
  33. }
  34. $levelName = $event->getLevel()->getName();
  35. $filePath = $this->plugin->getDataFolder() . "worlds/" . $levelName . ".yml";
  36. $config = $this->plugin->getConfig();
  37. $default = [
  38. "RestrictEntityMovement" => $config->getNested("DefaultWorld.RestrictEntityMovement"),
  39. "ClaimPrice" => $config->getNested("DefaultWorld.ClaimPrice"),
  40. "ClearPrice" => $config->getNested("DefaultWorld.ClearPrice"),
  41. "DisposePrice" => $config->getNested("DefaultWorld.DisposePrice"),
  42. "ResetPrice" => $config->getNested("DefaultWorld.ResetPrice"),
  43. ];
  44. $config = new Config($filePath, Config::YAML, $default);
  45. foreach (array_keys($default) as $key) {
  46. $settings[$key] = $config->get($key);
  47. }
  48. $this->plugin->addLevelSettings($levelName, new PlotLevelSettings($levelName, $settings));
  49. }
  50. }
  51. public function onLevelUnload(LevelUnloadEvent $event) {
  52. $levelName = $event->getLevel()->getName();
  53. $this->plugin->unloadLevelSettings($levelName);
  54. }
  55. public function onBlockPlace(BlockPlaceEvent $event) {
  56. $this->onEventOnBlock($event);
  57. }
  58. public function onBlockBreak(BlockBreakEvent $event) {
  59. $this->onEventOnBlock($event);
  60. }
  61. public function onPlayerInteract(PlayerInteractEvent $event) {
  62. $this->onEventOnBlock($event);
  63. }
  64. public function onBlockUpdate(BlockUpdateEvent $event) {
  65. /*
  66. * Disables water and lava flow as a temporary solution.
  67. */
  68. $levelName = $event->getBlock()->getLevel()->getName();
  69. if ($this->plugin->isLevelLoaded($levelName)) {
  70. $event->setCancelled(true);
  71. }
  72. }
  73. public function onExplosion(EntityExplodeEvent $event) {
  74. $levelName = $event->getEntity()->getLevel()->getName();
  75. if (!$this->plugin->isLevelLoaded($levelName))
  76. return;
  77. $plot = $this->plugin->getPlotByPosition($event->getPosition());
  78. if ($plot === null) {
  79. $event->setCancelled(true);
  80. return;
  81. }
  82. $beginPos = $this->plugin->getPlotPosition($plot);
  83. $endPos = clone $beginPos;
  84. $plotSize = $this->plugin->getLevelSettings($levelName)->plotSize;
  85. $endPos->x += $plotSize;
  86. $endPos->z += $plotSize;
  87. $blocks = array_filter($event->getBlockList(), function($block) use($beginPos, $endPos) {
  88. if ($block->x >= $beginPos->x and $block->z >= $beginPos->z and $block->x < $endPos->x and $block->z < $endPos->z) {
  89. return true;
  90. }
  91. return false;
  92. });
  93. $event->setBlockList($blocks);
  94. }
  95. /**
  96. * @param BlockPlaceEvent|BlockBreakEvent|PlayerInteractEvent $event
  97. */
  98. private function onEventOnBlock($event) {
  99. $levelName = $event->getBlock()->getLevel()->getName();
  100. if (!$this->plugin->isLevelLoaded($levelName)) {
  101. return;
  102. }
  103. $plot = $this->plugin->getPlotByPosition($event->getBlock());
  104. if ($plot !== null) {
  105. $username = $event->getPlayer()->getName();
  106. if ($plot->owner == $username or $plot->isHelper($username) or $event->getPlayer()->hasPermission("myplot.admin.build.plot")) {
  107. if (!($event instanceof PlayerInteractEvent and $event->getBlock() instanceof Sapling))
  108. return;
  109. /*
  110. * Prevent growing a tree near the edge of a plot
  111. * so the leaves won't go outside the plot
  112. */
  113. $block = $event->getBlock();
  114. $maxLengthLeaves = (($block->getDamage() & 0x07) == Sapling::SPRUCE) ? 3 : 2;
  115. $beginPos = $this->plugin->getPlotPosition($plot);
  116. $endPos = clone $beginPos;
  117. $beginPos->x += $maxLengthLeaves;
  118. $beginPos->z += $maxLengthLeaves;
  119. $plotSize = $this->plugin->getLevelSettings($levelName)->plotSize;
  120. $endPos->x += $plotSize - $maxLengthLeaves;
  121. $endPos->z += $plotSize - $maxLengthLeaves;
  122. if ($block->x >= $beginPos->x and $block->z >= $beginPos->z and $block->x < $endPos->x and $block->z < $endPos->z) {
  123. return;
  124. }
  125. }
  126. } elseif ($event->getPlayer()->hasPermission("myplot.admin.build.road")) {
  127. return;
  128. }
  129. $event->setCancelled(true);
  130. }
  131. public function onEntityMotion(EntityMotionEvent $event) {
  132. $levelName = $event->getEntity()->getLevel()->getName();
  133. if (!$this->plugin->isLevelLoaded($levelName))
  134. return;
  135. $settings = $this->plugin->getLevelSettings($levelName);
  136. if ($settings->restrictEntityMovement and !($event->getEntity() instanceof Player)) {
  137. $event->setCancelled(true);
  138. }
  139. }
  140. public function onPlayerMove(PlayerMoveEvent $event) {
  141. if (!$this->plugin->getConfig()->get("ShowPlotPopup", true))
  142. return;
  143. $levelName = $event->getPlayer()->getLevel()->getName();
  144. if (!$this->plugin->isLevelLoaded($levelName))
  145. return;
  146. $plot = $this->plugin->getPlotByPosition($event->getTo());
  147. if ($plot !== null and $plot !== $this->plugin->getPlotByPosition($event->getFrom())) {
  148. $plotName = TextFormat::GREEN . $plot;
  149. $popup = $this->plugin->getLanguage()->translateString("popup", [$plotName]);
  150. if ($plot->owner != "") {
  151. $owner = TextFormat::GREEN . $plot->owner;
  152. $ownerPopup = $this->plugin->getLanguage()->translateString("popup.owner", [$owner]);
  153. $paddingSize = floor((strlen($popup) - strlen($ownerPopup)) / 2);
  154. $paddingPopup = str_repeat(" ", max(0, -$paddingSize));
  155. $paddingOwnerPopup = str_repeat(" ", max(0, $paddingSize));
  156. $popup = TextFormat::WHITE . $paddingPopup . $popup . "\n" .
  157. TextFormat::WHITE . $paddingOwnerPopup . $ownerPopup;
  158. } else {
  159. $ownerPopup = $this->plugin->getLanguage()->translateString("popup.available");
  160. $paddingSize = floor((strlen($popup) - strlen($ownerPopup)) / 2);
  161. $paddingPopup = str_repeat(" ", max(0, -$paddingSize));
  162. $paddingOwnerPopup = str_repeat(" ", max(0, $paddingSize));
  163. $popup = TextFormat::WHITE . $paddingPopup . $popup . "\n" .
  164. TextFormat::WHITE . $paddingOwnerPopup . $ownerPopup;
  165. }
  166. $event->getPlayer()->sendTip($popup);
  167. }
  168. }
  169. }