PageRenderTime 27ms CodeModel.GetById 7ms RepoModel.GetById 1ms app.codeStats 0ms

/src/ImagicalGamer/BuildBattle/Main.php

https://gitlab.com/Skull3x/BuildBattlePE-1
PHP | 419 lines | 403 code | 16 blank | 0 comment | 38 complexity | 2d314fb1d4f3160684a88908998d69a2 MD5 | raw file
  1. <?php
  2. namespace ImagicalGamer\BuildBattle;
  3. use pocketmine\plugin\PluginBase;
  4. use pocketmine\scheduler\PluginTask;
  5. use pocketmine\event\Listener;
  6. use pocketmine\level\sound\TNTPrimeSound;
  7. use pocketmine\level\sound\PopSound;
  8. use pocketmine\event\player\PlayerInteractEvent;
  9. use pocketmine\event\player\PlayerJoinEvent;
  10. use pocketmine\event\player\PlayerDeathEvent;
  11. use pocketmine\command\CommandSender;
  12. use pocketmine\command\Command;
  13. use pocketmine\utils\TextFormat as C;
  14. use pocketmine\utils\Config;
  15. use pocketmine\math\Vector3;
  16. use pocketmine\level\Position;
  17. use pocketmine\Player;
  18. use pocketmine\block\Block;
  19. use pocketmine\tile\Sign;
  20. use pocketmine\level\Level;
  21. use pocketmine\item\Item;
  22. use pocketmine\event\block\BlockBreakEvent;
  23. use pocketmine\event\block\BlockPlaceEvent;
  24. use pocketmine\event\player\PlayerMoveEvent;
  25. use pocketmine\event\player\PlayerChatEvent;
  26. use pocketmine\event\entity\EntityDamageEvent;
  27. use pocketmine\entity\Effect;
  28. use pocketmine\event\entity\EntityLevelChangeEvent ;
  29. use pocketmine\tile\Chest;
  30. use pocketmine\inventory\ChestInventory;
  31. use pocketmine\event\plugin\PluginEvent;
  32. use pocketmine\entity\Entity;
  33. use pocketmine\network\protocol\AddEntityPacket;
  34. use pocketmine\event\entity\EntityDamageByEntityEvent;
  35. class Main extends PluginBase implements Listener {
  36. public $prefix = C::YELLOW . C::BOLD . "[BuildBattle] " . C::RESET . C::WHITE;
  37. public $mode = 0;
  38. public $arenas = array();
  39. public $currentLevel = "";
  40. public function onEnable()
  41. {
  42. $this->getServer()->setAutoSave(false);
  43. $this->getServer()->getPluginManager()->registerEvents($this ,$this);
  44. $this->getLogger()->info(C::YELLOW . " Enabled!");
  45. $this->saveResource("rank.yml");
  46. $this->saveResource("config.yml");
  47. @mkdir($this->getDataFolder());
  48. $config = new Config($this->getDataFolder() . "/config.yml", Config::YAML);
  49. if($config->get("arenas")!=null)
  50. {
  51. $this->arenas = $config->get("arenas");
  52. }
  53. foreach($this->arenas as $lev)
  54. {
  55. $this->getServer()->loadLevel($lev);
  56. }
  57. $config->save();
  58. $this->getServer()->getScheduler()->scheduleRepeatingTask(new GameTask($this), 20);
  59. $this->getServer()->getScheduler()->scheduleRepeatingTask(new RefreshSigns($this), 10);
  60. $this->getServer()->getScheduler()->scheduleRepeatingTask(new ParticleSigns($this), 1);
  61. }
  62. public function getTheme(){
  63. $config = new Config($this->getDataFolder() . "/config.yml", Config::YAML);
  64. $themes = $config->get("themes");
  65. $theme = array_rand($themes);
  66. return $theme;
  67. }
  68. public function onMove(PlayerMoveEvent $event)
  69. {
  70. $player = $event->getPlayer();
  71. $level = $player->getLevel()->getFolderName();
  72. if(in_array($level,$this->arenas))
  73. {
  74. $config = new Config($this->getDataFolder() . "/config.yml", Config::YAML);
  75. $sofar = $config->get($level . "StartTime");
  76. if($sofar > 0)
  77. {
  78. $f = $event->getFrom();
  79. $t = $event->getTo();
  80. if($f->x != $t->x or $f->y != $ t->x or $f->z != $t->z){
  81. $event->setCancelled();
  82. }
  83. }
  84. }
  85. }
  86. public function onBreak(BlockBreakEvent $event){
  87. if($event->getBlock()->getId() == 5){
  88. $event->getPlayer()->sendMessage(C::YELLOW . C::BOLD . "You can't leave the arena!");
  89. $event->setCancelled(true);
  90. }
  91. if($event->getBlock()->getId() == 44){
  92. $event->setCancelled(true);
  93. $event->getPlayer()->sendMessage(C::YELLOW . C::BOLD . "You can't leave the arena!");
  94. }
  95. }
  96. public function onPlace(BlockPlaceEvent $event){
  97. if($event->getBlock()->getId() == 10){
  98. $event->setCancelled(true);
  99. $event->getPlayer()->sendMessage(C::RED . C::BOLD . "No Griefing!");
  100. }
  101. if($event->getBlock()->getId() == 46){
  102. $event->setCancelled(true);
  103. $event->getPlayer()->sendMessage(C::RED . C::BOLD . "No Griefing!");
  104. }
  105. }
  106. public function onCommand(CommandSender $player, Command $cmd, $label, array $args) {
  107. switch($cmd->getName()){
  108. case "bb":
  109. if($player->isOp())
  110. {
  111. if(!empty($args[0]))
  112. {
  113. if($args[0]=="create")
  114. {
  115. if(!empty($args[1]))
  116. {
  117. if(file_exists($this->getServer()->getDataPath() . "/worlds/" . $args[1]))
  118. {
  119. $this->getServer()->loadLevel($args[1]);
  120. $this->getServer()->getLevelByName($args[1])->loadChunk($this->getServer()->getLevelByName($args[1])->getSafeSpawn()->getFloorX(), $this->getServer()->getLevelByName($args[1])->getSafeSpawn()->getFloorZ());
  121. array_push($this->arenas,$args[1]);
  122. $this->currentLevel = $args[1];
  123. $this->mode = 1;
  124. $player->sendMessage($this->prefix . "You are about to register an match. Tap a block to set a spawn point there!");
  125. $player->setGamemode(1);
  126. $player->teleport($this->getServer()->getLevelByName($args[1])->getSafeSpawn(),0,0);
  127. }
  128. else
  129. {
  130. $player->sendMessage($this->prefix . "There is no world with this name.");
  131. }
  132. }
  133. else
  134. {
  135. $player->sendMessage($this->prefix . "BuildBattle Commands!");
  136. $player->sendMessage($this->prefix . "/bb create <world> Creates an arena in the specified world!");
  137. }
  138. }
  139. else
  140. {
  141. $player->sendMessage($this->prefix . "There is no such command.");
  142. }
  143. }
  144. else
  145. {
  146. $player->sendMessage($this->prefix . "BuildBattle Commands!");
  147. $player->sendMessage($this->prefix . "/bb create <world> Creates an arena in the specified world!");
  148. }
  149. }
  150. }
  151. }
  152. public function onChat(PlayerChatEvent $event){
  153. $player = $event->getPlayer();
  154. $event->setRecipients($player->getLevel()->getPlayers());
  155. }
  156. public function onInteract(PlayerInteractEvent $event)
  157. {
  158. $player = $event->getPlayer();
  159. $block = $event->getBlock();
  160. $tile = $player->getLevel()->getTile($block);
  161. if($tile instanceof Sign)
  162. {
  163. if($this->mode==12)
  164. {
  165. $tile->setText("§b§l[Join]","§f0 §c/ §f10",$this->currentLevel,$this->prefix);
  166. $this->refreshArenas();
  167. $this->currentLevel = "";
  168. $this->mode = 0;
  169. $player->sendMessage($this->prefix . "The arena has been registered successfully!");
  170. }
  171. else
  172. {
  173. $text = $tile->getText();
  174. if($text[3] == $this->prefix)
  175. {
  176. if($text[0]=="§b§l[Join]")
  177. {
  178. $config = new Config($this->getDataFolder() . "/config.yml", Config::YAML);
  179. $level = $this->getServer()->getLevelByName($text[2]);
  180. $aop = count($level->getPlayers());
  181. $thespawn = $config->get($text[2] . "Lobby");
  182. $spawn = new Position($thespawn[0]+0.5,$thespawn[1],$thespawn[2]+0.5,$level);
  183. $level->loadChunk($spawn->getFloorX(), $spawn->getFloorZ());
  184. $player->teleport($spawn,0,0);
  185. $player->setGamemode(1);
  186. $player->setNameTag(C::BOLD . C::RED . $player->getName());
  187. $player->getInventory()->clearAll();
  188. $player->setNameTagVisible(false);
  189. $player->setGamemode(1);
  190. $player->sendMessage($this->prefix . "You have Joined a battle!");
  191. $levelplayers = $level->getPlayers();
  192. if($levelplayers==5){
  193. $spawn1 = $this->getServer()->getDefaultLevel()->getSafeSpawn();
  194. $this->getServer()->getDefaultLevel()->loadChunk($spawn1->getFloorX(),
  195. $spawn1->getFloorZ()); $player->teleport($spawn1,0,0);
  196. $player->sendMessage($this->prefix . "The battle is full!");
  197. }
  198. }
  199. else
  200. {
  201. $player->sendMessage($this->prefix . "Theres been an error joining the match! Please contact an Admin");
  202. }
  203. }
  204. }
  205. }
  206. else if($this->mode>=1&&$this->mode<=10)
  207. {
  208. $config = new Config($this->getDataFolder() . "/config.yml", Config::YAML);
  209. $config->set($this->currentLevel . "Spawn" . $this->mode, array($block->getX(),$block->getY()+1,$block->getZ()));
  210. $player->sendMessage($this->prefix . "Spawn " . $this->mode . " has been registered!");
  211. $this->mode++;
  212. if($this->mode==11)
  213. {
  214. $player->sendMessage($this->prefix . "Now tap on a lobby spawn.");
  215. $config->set($this->currentLevel . "Lobby" , array($block->getX(),$block->getY()+1,$block->getZ()));
  216. }
  217. $config->save();
  218. }
  219. else if($this->mode==11)
  220. {
  221. $config = new Config($this->getDataFolder() . "/config.yml", Config::YAML);
  222. $level = $this->getServer()->getLevelByName($this->currentLevel);
  223. $level->setSpawn = (new Vector3($block->getX(),$block->getY()+1,$block->getZ()));
  224. $config->set("arenas",$this->arenas);
  225. $player->sendMessage($this->prefix . "You've been teleported back. Tap a sign to register it for the arena!");
  226. $spawn = $this->getServer()->getDefaultLevel()->getSafeSpawn();
  227. $this->getServer()->getDefaultLevel()->loadChunk($spawn->getFloorX(), $spawn->getFloorZ());
  228. $player->teleport($spawn,0,0);
  229. $config->save();
  230. $this->mode=12;
  231. }
  232. }
  233. public function refreshArenas()
  234. {
  235. $config = new Config($this->getDataFolder() . "/config.yml", Config::YAML);
  236. $config->set("arenas",$this->arenas);
  237. foreach($this->arenas as $arena)
  238. {
  239. $config->set($arena . "PlayTime", 300);
  240. $config->set($arena . "StartTime", 60);
  241. $config->set($arena . "VoteTime", 120);
  242. }
  243. $config->save();
  244. }
  245. public function onDisable()
  246. {
  247. $this->saveResource("config.yml");
  248. $this->saveResource("rank.yml");
  249. }
  250. }
  251. class RefreshSigns extends PluginTask {
  252. public $prefix = C::YELLOW . C::BOLD . "[BuildBattle] " . C::RESET . C::WHITE;
  253. public function __construct($plugin)
  254. {
  255. $this->plugin = $plugin;
  256. parent::__construct($plugin);
  257. }
  258. public function onRun($tick)
  259. {
  260. $allplayers = $this->plugin->getServer()->getOnlinePlayers();
  261. $level = $this->plugin->getServer()->getDefaultLevel();
  262. $tiles = $level->getTiles();
  263. foreach($tiles as $t) {
  264. if($t instanceof Sign) {
  265. $text = $t->getText();
  266. if($text[3]==$this->prefix)
  267. {
  268. $aop = 0;
  269. foreach($allplayers as $player){if($player->getLevel()->getFolderName()==$text[2]){$aop=$aop+1;}}
  270. $ingame = "§b§l[Join]";
  271. $config = new Config($this->plugin->getDataFolder() . "/config.yml", Config::YAML);
  272. if($config->get($text[2] . "PlayTime")!=780)
  273. {
  274. $ingame = "§l§a[Running]";
  275. }
  276. else if($aop>=24)
  277. {
  278. $ingame = "§l§c[Full]";
  279. }
  280. $t->setText($ingame,"§c" . $aop . " §f/§c 10",$text[2],$this->prefix);
  281. }
  282. }
  283. }
  284. }
  285. }
  286. class GameTask extends PluginTask {
  287. public $prefix = C::YELLOW . C::BOLD . "[BuildBattle] " . C::RESET . C::WHITE;
  288. public $vote = 0;
  289. public function __construct($plugin){
  290. $this->plugin = $plugin;
  291. parent::__construct($plugin);
  292. }
  293. public function onRun($tick){
  294. $config = new Config($this->getDataFolder()."/config.yml");
  295. $arenas = $config->get("arenas");
  296. if(!empty($arenas)){
  297. foreach($arenas as $arena){
  298. $time = $config->get($arena . "PlayTime");
  299. $wait = $config->get($arena . "StartTime");
  300. $vote = $config->get($arena . "VoteTime");
  301. $level = $this->plugin->getServer()->getLevelByName($arena);
  302. if($level instanceof Level){
  303. $players = $level->getPlayers();
  304. if(count($players) == 0){
  305. $config->set($arena . "PlayTime", 300);
  306. $config->set($arena . "StartTime", 60);
  307. $config->get($arena . "VoteTime", 120);
  308. }else{
  309. if(count($players) > 2){
  310. if($wait > 0){
  311. $wait--;
  312. foreach($players as $p){
  313. $p->sendPopup(C::YELLOW . C::BOLD . "Starting in " . $wait . " Seconds");
  314. $level = $p->getLevel();
  315. $level->addSound(new PopSound($p));
  316. $config->set($arena . "StartTime", $wait);
  317. }
  318. if($wait <= 0){
  319. foreach($players as $p){
  320. $level = $p->getLevel();
  321. $level->addSound(new TNTPrimeSound($p));
  322. $p->sendMessage("§b-------------------------------§r");
  323. $p->sendMessage($this->prefix . C::GRAY . "Start" . C::RED . C::BOLD . " Building!");
  324. $p->sendMessage("§b-------------------------------§r");
  325. }
  326. $config->set($arena . "StartTime", 60);
  327. }
  328. }else{
  329. $aop = count($level->getPlayers());
  330. if($aop === 1){
  331. foreach($players as $p){
  332. $spawn = $this->plugin->getServer()->getDefaultLevel()->getSafeSpawn();
  333. $this->plugin->getServer()->getDefaultLevel()->loadChunk($spawn->getX(), $spawn->getZ());
  334. $p->teleport($spawn,0,0);
  335. $p->sendMessage(C::RED."There Wasn't Enough Players!");
  336. }
  337. $config->set($arena . "PlayTime", 300);
  338. $config->set($arena . "StartTime", 60);
  339. }
  340. $time--;
  341. foreach($players as $p){
  342. $p->sendPopup(C::YELLOW . C::BOLD . "> Ending in " . $time . " Seconds <");
  343. $level = $p->getLevel();
  344. $config->set($arena . "PlayTime", $time);
  345. $min = $time / 60;
  346. if($time === 300 || $time === 240 || $time === 180 || $time === 120 || $time === 60){
  347. $p->sendMessage(C::DARK_AQUA."You Have ".C::YELLOW."$min".C::DARK_AQUA." Minutes Left Until You Vote!");
  348. }
  349. if($time <= 0){
  350. $this->vote = 1;
  351. if($this->vote==1){
  352. $thespawn = $config->get($levelArena . "Spawn" . ("1");$thespawn = $config->get($text[2] . "Spawn" . ($aop+1));
  353. $spawn = new Position($thespawn[0]+0.5,$thespawn[1],$thespawn[2]+0.5,$level);
  354. $level->loadChunk($spawn->getFloorX(), $spawn->getFloorZ());
  355. foreach($levelArena->getPlayers() as $p){
  356. $p->teleport($spawn);
  357. }
  358. }
  359. }
  360. }
  361. }
  362. }
  363. }
  364. }
  365. }
  366. }
  367. }
  368. }
  369. class ParticleSigns extends PluginTask {
  370. public function __construct($plugin)
  371. {
  372. $this->plugin = $plugin;
  373. parent::__construct($plugin);
  374. }
  375. public function onRun($tick)
  376. {
  377. $level = $this->plugin->getServer()->getLevelByName("BuildBattlePE");
  378. $tiles = $level->getTiles();
  379. $heart = "[Heart]";
  380. foreach($tiles as $t) {
  381. if($t instanceof Sign) {
  382. $text = $t->getText();
  383. $world = $text[1];
  384. if($text[0]==$heart)
  385. {
  386. $x = $t->x;
  387. $y = $t->y;
  388. $z = $t->x;
  389. $level->addParticle(new HeartParticle(new Vector3($x+1, $y, $z+1)));
  390. $level->addParticle(new HeartParticle(new Vector3($x-1, $y, $z-1)));
  391. $level->setBlock(new Vector3($x,$y,$z), Block::get(0));
  392. }
  393. }
  394. }
  395. }
  396. }