Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- namespace Bluplayz;
- use pocketmine\entity\Entity;
- use pocketmine\item\Item;
- use pocketmine\level\Position;
- use pocketmine\network\mcpe\protocol\AddPlayerPacket;
- use pocketmine\network\mcpe\protocol\RemoveEntityPacket;
- use pocketmine\network\mcpe\protocol\SetEntityDataPacket;
- use pocketmine\Player;
- use pocketmine\scheduler\CallbackTask;
- use pocketmine\scheduler\ServerScheduler;
- use pocketmine\Server;
- use pocketmine\utils\MainLogger;
- use pocketmine\utils\UUID;
- use raklib\protocol\DataPacket;
- class Generator{
- /** Константы, обозначающие тип */
- const TYPE_EMERALD = 0x00;
- const TYPE_IRON = 0x01;
- const TYPE_GOLD = 0x02;
- const TYPE_DIAMOND = 0x03;
- const MAX_LEVEL = 3;
- const TIME_TO_UPDATE = [
- self::TYPE_DIAMOND => [
- 1 => 30,
- 2 => 180,
- 3 => 360
- ],
- self::TYPE_EMERALD => [
- 1 => 60,
- 2 => 180,
- 3 => 360
- ]
- ];
- const CAN_UP = [
- self::TYPE_EMERALD => true,
- self::TYPE_IRON => false,
- self::TYPE_GOLD => false,
- self::TYPE_DIAMOND => true
- ];
- const ITEM = [
- self::TYPE_EMERALD => Item::EMERALD,
- self::TYPE_IRON => Item::IRON_INGOT,
- self::TYPE_GOLD => Item::GOLD_INGOT,
- self::TYPE_DIAMOND => Item::DIAMOND
- ];
- const TITLE = [
- self::TYPE_EMERALD => "§a§lИзумруд§r",
- self::TYPE_GOLD => "§e§lЗолото",
- self::TYPE_DIAMOND => "§b§lАлмаз",
- self::TYPE_IRON => "§7§lЖелезо"
- ];
- const TIME = [
- self::TYPE_EMERALD => [
- 1 => 3,
- 2 => 2,
- 3 => 1
- ],
- self::TYPE_IRON => [
- 1 => 10
- ],
- self::TYPE_GOLD => [
- 1 => 10
- ],
- self::TYPE_DIAMOND => [
- 1 => 10,
- 2 => 9,
- 3 => 5
- ]
- ];
- public $eid = [
- ];
- /**
- * Типа генератора (алмаз или прочая херня)
- * @var int
- */
- public $type;
- /**
- * Позиция генератора
- * @var Position
- */
- public $pos;
- /** @var Item */
- public $item;
- /** @var bool */
- public $working = false;
- /** @var ServerScheduler */
- public $scheduler;
- /** @var MainLogger */
- public $logger;
- /**
- * Уровень генератора
- * @var int
- */
- public $level = 1;
- /**
- * ID таска
- * @var int
- */
- public $id;
- /**
- * @var int
- */
- public $time = 0;
- /** @var bool */
- public $canUp = true;
- /** @var AddPlayerPacket[] */
- public $spawnTextPackets = [];
- /** @var RemoveEntityPacket[] */
- public $removeTextPackets = [];
- /** @var Server */
- public $server;
- public function __construct(int $type, Position $pos){
- $this->server = $server = Server::getInstance();
- $this->logger = $server->getLogger();
- if(!isset(self::ITEM[$type])){
- $this->logger->error("Невозможно запустить генератор: неизвестный тип ".$type);
- }
- $this->type = $type;
- $this->pos = $pos;
- $this->item = Item::get(self::ITEM[$type]);
- $this->scheduler = $server->getScheduler();
- $this->canUp = self::CAN_UP[$type];
- $x = $pos->x;
- $y = $pos->y;
- $z = $pos->z;
- if($this->canUp){
- $this->spawnTextPackets[] = $this->createPacket("§eУровень §cI", $x, $y+5, $z);
- $this->spawnTextPackets[] = $this->createPacket(self::TITLE[$this->type], $x, $y+4.7, $z);
- $this->spawnTextPackets[] = $this->createPacket("§eСпавн через §c".self::TIME[$this->type][$this->level]." §eсек.", $x, $y+4.4, $z);
- $this->removeTextPackets[] = $this->removePacket($this->eid[0]);
- $this->removeTextPackets[] = $this->removePacket($this->eid[1]);
- $this->removeTextPackets[] = $this->removePacket($this->eid[2]);
- }
- }
- public function start(){
- $this->working = true;
- $this->id = $this->scheduler->scheduleRepeatingTask(new CallbackTask([$this, 'tick']), 20)->getTaskId();
- }
- public function stop(){
- $this->working = false;
- $this->level = 1;
- $this->time = 0;
- foreach($this->pos->level->getEntities() as $e){
- if($e instanceof \pocketmine\entity\Item){
- $e->close();
- }
- }
- if($this->id !== null){
- $this->scheduler->cancelTask($this->id);
- $this->id = null;
- }
- }
- /**
- * Отправить пакеты летающего текста игрокам
- * @param Player[] $p
- */
- public function createToPlayers(array $p){
- if($this->canUp){
- $this->server->batchPackets($p, $this->spawnTextPackets);
- }
- }
- public function createToPlayer(Player $p){
- if($this->canUp){
- $this->server->batchPackets([$p], $this->spawnTextPackets);
- }
- }
- public function removeFromPlayer(Player $p){
- if($this->canUp){
- $this->server->batchPackets([$p], $this->removeTextPackets);
- }
- }
- public function removeFromPlayers(array $p){
- if($this->canUp){
- $this->server->batchPackets($p, $this->removeTextPackets);
- }
- }
- /**
- * Функция, исполняющаяся каждую секунду, если Generator::$working == true
- */
- public function tick(){
- if(!$this->working) return;
- ++$this->time;
- /** @var DataPacket[] $pkk */
- $pkk = [];
- if($this->canUp) {
- if ($this->time % self::TIME_TO_UPDATE[$this->type][$this->level] === 0 && $this->level < self::MAX_LEVEL) {
- $l = '';
- switch(++$this->level) { //Сделал через switch, а не str_repeat, потому что вдруг ты захочешь сделать 4 уровень и выше
- case 1:
- $l = 'I';
- break;
- case 2:
- $l = 'II';
- break;
- case 3:
- $l = 'III';
- break;
- }
- $pkk[] = $this->updatePacket($this->eid[0], "§eУровень §c".$l);
- }
- $pkk[] = $this->updatePacket($this->eid[2], "§eСпавн через §c".$this->getTimeToSpawn()." §eсек.");
- $this->server->batchPackets($this->pos->level->getPlayers(), $pkk);
- }
- if($this->time % self::TIME[$this->type][$this->level] === 0){
- $this->pos->level->dropItem($this->pos, $this->item);
- }
- }
- public function getTimeToSpawn(){
- return self::TIME[$this->type][$this->level] - $this->time % self::TIME[$this->type][$this->level];
- }
- public function updatePacket($eid, $text){
- $pk = new SetEntityDataPacket();
- $pk->entityRuntimeId = $eid;
- $flags = (
- (1 << Entity::DATA_FLAG_CAN_SHOW_NAMETAG) |
- (1 << Entity::DATA_FLAG_ALWAYS_SHOW_NAMETAG) |
- (1 << Entity::DATA_FLAG_IMMOBILE)
- );
- $pk->metadata = [
- Entity::DATA_FLAGS => [Entity::DATA_TYPE_LONG, $flags],
- Entity::DATA_NAMETAG => [Entity::DATA_TYPE_STRING, $text],
- Entity::DATA_SCALE => [Entity::DATA_TYPE_FLOAT, 0],
- ];
- return $pk;
- }
- public function removePacket($eid){
- $pk = new RemoveEntityPacket();
- $pk->entityUniqueId = $eid;
- return $pk;
- }
- public function createPacket($text, $x,$y,$z){
- $pk = new AddPlayerPacket();
- $pk->uuid = UUID::fromRandom();
- $pk->username = '';
- $pk->entityRuntimeId = $this->eid[] = Entity::$entityCount++;
- $pk->x = $x+0.5;
- $pk->y = $y;
- $pk->z = $z+0.5;
- $pk->item = Item::get(0);
- $flags = (
- (1 << Entity::DATA_FLAG_CAN_SHOW_NAMETAG) |
- (1 << Entity::DATA_FLAG_ALWAYS_SHOW_NAMETAG) |
- (1 << Entity::DATA_FLAG_IMMOBILE)
- );
- $pk->metadata = [
- Entity::DATA_FLAGS => [Entity::DATA_TYPE_LONG, $flags],
- Entity::DATA_NAMETAG => [Entity::DATA_TYPE_STRING, $text],
- Entity::DATA_SCALE => [Entity::DATA_TYPE_FLOAT, 0],
- ];
- return $pk;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement