Advertisement
Guest User

Untitled

a guest
Jun 21st, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.64 KB | None | 0 0
  1. <?php
  2.  
  3. namespace Bluplayz;
  4.  
  5. use pocketmine\entity\Entity;
  6. use pocketmine\item\Item;
  7. use pocketmine\level\Position;
  8. use pocketmine\network\mcpe\protocol\AddPlayerPacket;
  9. use pocketmine\network\mcpe\protocol\RemoveEntityPacket;
  10. use pocketmine\network\mcpe\protocol\SetEntityDataPacket;
  11. use pocketmine\Player;
  12. use pocketmine\scheduler\CallbackTask;
  13. use pocketmine\scheduler\ServerScheduler;
  14. use pocketmine\Server;
  15. use pocketmine\utils\MainLogger;
  16. use pocketmine\utils\UUID;
  17. use raklib\protocol\DataPacket;
  18.  
  19. class Generator{
  20.  
  21. /** Константы, обозначающие тип */
  22. const TYPE_EMERALD = 0x00;
  23. const TYPE_IRON = 0x01;
  24. const TYPE_GOLD = 0x02;
  25. const TYPE_DIAMOND = 0x03;
  26.  
  27. const MAX_LEVEL = 3;
  28.  
  29. const TIME_TO_UPDATE = [
  30. self::TYPE_DIAMOND => [
  31. 1 => 30,
  32. 2 => 180,
  33. 3 => 360
  34. ],
  35. self::TYPE_EMERALD => [
  36. 1 => 60,
  37. 2 => 180,
  38. 3 => 360
  39. ]
  40. ];
  41.  
  42. const CAN_UP = [
  43. self::TYPE_EMERALD => true,
  44. self::TYPE_IRON => false,
  45. self::TYPE_GOLD => false,
  46. self::TYPE_DIAMOND => true
  47. ];
  48.  
  49. const ITEM = [
  50. self::TYPE_EMERALD => Item::EMERALD,
  51. self::TYPE_IRON => Item::IRON_INGOT,
  52. self::TYPE_GOLD => Item::GOLD_INGOT,
  53. self::TYPE_DIAMOND => Item::DIAMOND
  54. ];
  55.  
  56. const TITLE = [
  57. self::TYPE_EMERALD => "§a§lИзумруд§r",
  58. self::TYPE_GOLD => "§e§lЗолото",
  59. self::TYPE_DIAMOND => "§b§lАлмаз",
  60. self::TYPE_IRON => "§7§lЖелезо"
  61. ];
  62.  
  63. const TIME = [
  64. self::TYPE_EMERALD => [
  65. 1 => 3,
  66. 2 => 2,
  67. 3 => 1
  68. ],
  69. self::TYPE_IRON => [
  70. 1 => 10
  71. ],
  72. self::TYPE_GOLD => [
  73. 1 => 10
  74. ],
  75. self::TYPE_DIAMOND => [
  76. 1 => 10,
  77. 2 => 9,
  78. 3 => 5
  79. ]
  80. ];
  81.  
  82. public $eid = [
  83.  
  84. ];
  85.  
  86. /**
  87. * Типа генератора (алмаз или прочая херня)
  88. * @var int
  89. */
  90. public $type;
  91.  
  92. /**
  93. * Позиция генератора
  94. * @var Position
  95. */
  96. public $pos;
  97.  
  98. /** @var Item */
  99. public $item;
  100.  
  101. /** @var bool */
  102. public $working = false;
  103.  
  104. /** @var ServerScheduler */
  105. public $scheduler;
  106.  
  107. /** @var MainLogger */
  108. public $logger;
  109.  
  110. /**
  111. * Уровень генератора
  112. * @var int
  113. */
  114. public $level = 1;
  115.  
  116. /**
  117. * ID таска
  118. * @var int
  119. */
  120. public $id;
  121.  
  122. /**
  123. * @var int
  124. */
  125. public $time = 0;
  126.  
  127. /** @var bool */
  128. public $canUp = true;
  129.  
  130. /** @var AddPlayerPacket[] */
  131. public $spawnTextPackets = [];
  132.  
  133. /** @var RemoveEntityPacket[] */
  134. public $removeTextPackets = [];
  135.  
  136. /** @var Server */
  137. public $server;
  138.  
  139. public function __construct(int $type, Position $pos){
  140. $this->server = $server = Server::getInstance();
  141. $this->logger = $server->getLogger();
  142. if(!isset(self::ITEM[$type])){
  143. $this->logger->error("Невозможно запустить генератор: неизвестный тип ".$type);
  144. }
  145. $this->type = $type;
  146. $this->pos = $pos;
  147. $this->item = Item::get(self::ITEM[$type]);
  148. $this->scheduler = $server->getScheduler();
  149. $this->canUp = self::CAN_UP[$type];
  150. $x = $pos->x;
  151. $y = $pos->y;
  152. $z = $pos->z;
  153. if($this->canUp){
  154. $this->spawnTextPackets[] = $this->createPacket("§eУровень §cI", $x, $y+5, $z);
  155. $this->spawnTextPackets[] = $this->createPacket(self::TITLE[$this->type], $x, $y+4.7, $z);
  156. $this->spawnTextPackets[] = $this->createPacket("§eСпавн через §c".self::TIME[$this->type][$this->level]." §eсек.", $x, $y+4.4, $z);
  157. $this->removeTextPackets[] = $this->removePacket($this->eid[0]);
  158. $this->removeTextPackets[] = $this->removePacket($this->eid[1]);
  159. $this->removeTextPackets[] = $this->removePacket($this->eid[2]);
  160. }
  161. }
  162.  
  163. public function start(){
  164. $this->working = true;
  165. $this->id = $this->scheduler->scheduleRepeatingTask(new CallbackTask([$this, 'tick']), 20)->getTaskId();
  166. }
  167.  
  168. public function stop(){
  169. $this->working = false;
  170. $this->level = 1;
  171. $this->time = 0;
  172. foreach($this->pos->level->getEntities() as $e){
  173. if($e instanceof \pocketmine\entity\Item){
  174. $e->close();
  175. }
  176. }
  177. if($this->id !== null){
  178. $this->scheduler->cancelTask($this->id);
  179. $this->id = null;
  180. }
  181. }
  182.  
  183. /**
  184. * Отправить пакеты летающего текста игрокам
  185. * @param Player[] $p
  186. */
  187. public function createToPlayers(array $p){
  188. if($this->canUp){
  189. $this->server->batchPackets($p, $this->spawnTextPackets);
  190. }
  191. }
  192.  
  193. public function createToPlayer(Player $p){
  194. if($this->canUp){
  195. $this->server->batchPackets([$p], $this->spawnTextPackets);
  196. }
  197. }
  198.  
  199. public function removeFromPlayer(Player $p){
  200. if($this->canUp){
  201. $this->server->batchPackets([$p], $this->removeTextPackets);
  202. }
  203. }
  204.  
  205. public function removeFromPlayers(array $p){
  206. if($this->canUp){
  207. $this->server->batchPackets($p, $this->removeTextPackets);
  208. }
  209. }
  210.  
  211. /**
  212. * Функция, исполняющаяся каждую секунду, если Generator::$working == true
  213. */
  214. public function tick(){
  215. if(!$this->working) return;
  216. ++$this->time;
  217. /** @var DataPacket[] $pkk */
  218. $pkk = [];
  219. if($this->canUp) {
  220. if ($this->time % self::TIME_TO_UPDATE[$this->type][$this->level] === 0 && $this->level < self::MAX_LEVEL) {
  221. $l = '';
  222. switch(++$this->level) { //Сделал через switch, а не str_repeat, потому что вдруг ты захочешь сделать 4 уровень и выше
  223. case 1:
  224. $l = 'I';
  225. break;
  226. case 2:
  227. $l = 'II';
  228. break;
  229. case 3:
  230. $l = 'III';
  231. break;
  232. }
  233. $pkk[] = $this->updatePacket($this->eid[0], "§eУровень §c".$l);
  234. }
  235. $pkk[] = $this->updatePacket($this->eid[2], "§eСпавн через §c".$this->getTimeToSpawn()." §eсек.");
  236. $this->server->batchPackets($this->pos->level->getPlayers(), $pkk);
  237. }
  238. if($this->time % self::TIME[$this->type][$this->level] === 0){
  239. $this->pos->level->dropItem($this->pos, $this->item);
  240. }
  241. }
  242.  
  243. public function getTimeToSpawn(){
  244. return self::TIME[$this->type][$this->level] - $this->time % self::TIME[$this->type][$this->level];
  245. }
  246.  
  247. public function updatePacket($eid, $text){
  248. $pk = new SetEntityDataPacket();
  249. $pk->entityRuntimeId = $eid;
  250. $flags = (
  251. (1 << Entity::DATA_FLAG_CAN_SHOW_NAMETAG) |
  252. (1 << Entity::DATA_FLAG_ALWAYS_SHOW_NAMETAG) |
  253. (1 << Entity::DATA_FLAG_IMMOBILE)
  254. );
  255. $pk->metadata = [
  256. Entity::DATA_FLAGS => [Entity::DATA_TYPE_LONG, $flags],
  257. Entity::DATA_NAMETAG => [Entity::DATA_TYPE_STRING, $text],
  258. Entity::DATA_SCALE => [Entity::DATA_TYPE_FLOAT, 0],
  259. ];
  260. return $pk;
  261. }
  262.  
  263. public function removePacket($eid){
  264. $pk = new RemoveEntityPacket();
  265. $pk->entityUniqueId = $eid;
  266. return $pk;
  267. }
  268.  
  269. public function createPacket($text, $x,$y,$z){
  270. $pk = new AddPlayerPacket();
  271. $pk->uuid = UUID::fromRandom();
  272. $pk->username = '';
  273. $pk->entityRuntimeId = $this->eid[] = Entity::$entityCount++;
  274. $pk->x = $x+0.5;
  275. $pk->y = $y;
  276. $pk->z = $z+0.5;
  277. $pk->item = Item::get(0);
  278. $flags = (
  279. (1 << Entity::DATA_FLAG_CAN_SHOW_NAMETAG) |
  280. (1 << Entity::DATA_FLAG_ALWAYS_SHOW_NAMETAG) |
  281. (1 << Entity::DATA_FLAG_IMMOBILE)
  282. );
  283. $pk->metadata = [
  284. Entity::DATA_FLAGS => [Entity::DATA_TYPE_LONG, $flags],
  285. Entity::DATA_NAMETAG => [Entity::DATA_TYPE_STRING, $text],
  286. Entity::DATA_SCALE => [Entity::DATA_TYPE_FLOAT, 0],
  287. ];
  288. return $pk;
  289. }
  290.  
  291. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement