From f022641b4289551d6f3d8245e73f0691d54c7dd4 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 15:15:33 +0900 Subject: [PATCH 01/68] Version dump to 0.1.0-REVIVAL --- plugin.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugin.yml b/plugin.yml index d1fa95e..830a520 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,5 +1,7 @@ +--- name: Boat main: onebone\boat\Main -version: "1.0" +version: 0.1.0-REVIVAL author: onebone api: [1.12.0] +... \ No newline at end of file From b093f2b0f7e4efb40a46868c9624c639d42bb82e Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 15:16:00 +0900 Subject: [PATCH 02/68] Support api 3.0.0, 4.0.0 --- plugin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.yml b/plugin.yml index 830a520..434467d 100644 --- a/plugin.yml +++ b/plugin.yml @@ -3,5 +3,5 @@ name: Boat main: onebone\boat\Main version: 0.1.0-REVIVAL author: onebone -api: [1.12.0] +api: [3.0.0, 4.0.0] ... \ No newline at end of file From ab2e0b9f69b62637d28e753aaa5600f0b3e31335 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 15:18:03 +0900 Subject: [PATCH 03/68] Reformat code --- src/onebone/boat/Main.php | 139 +++++++++++++++---------------- src/onebone/boat/entity/Boat.php | 88 +++++++++---------- src/onebone/boat/item/Boat.php | 86 ++++++++++--------- 3 files changed, 155 insertions(+), 158 deletions(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index ca5947a..b4d7a1e 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -2,89 +2,88 @@ namespace onebone\boat; -use pocketmine\plugin\PluginBase; +use onebone\boat\entity\Boat; +use onebone\boat\item\Boat as BoatItem; +use onebone\boat\packet\PlayerInputPacket; +use pocketmine\entity\Entity; use pocketmine\event\Listener; +use pocketmine\event\player\PlayerQuitEvent; +use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\inventory\BigShapelessRecipe; use pocketmine\item\Item; -use pocketmine\entity\Entity; -use pocketmine\event\server\DataPacketReceiveEvent; -use pocketmine\network\protocol\InteractPacket; -use pocketmine\network\protocol\SetEntityLinkPacket; -use pocketmine\network\protocol\MovePlayerPacket; -use pocketmine\event\player\PlayerQuitEvent; - -use onebone\boat\item\Boat as BoatItem; -use onebone\boat\packet\PlayerInputPacket; -use onebone\boat\entity\Boat; +use pocketmine\network\protocol\{ + InteractPacket, MovePlayerPacket, SetEntityLinkPacket +}; +use pocketmine\plugin\PluginBase; class Main extends PluginBase implements Listener{ - private $riding = []; + private $riding = []; - public function onEnable(){ - $this->getServer()->getPluginManager()->registerEvents($this, $this); + public function onEnable(){ + $this->getServer()->getPluginManager()->registerEvents($this, $this); - Item::$list[333] = BoatItem::class; - Item::addCreativeItem(new Item(333)); - $this->getServer()->addRecipe((new BigShapelessRecipe(Item::get(333, 0, 1)))->addIngredient(Item::get(Item::WOODEN_PLANK, null, 5))->addIngredient(Item::get(Item::WOODEN_SHOVEL, null, 1))); + Item::$list[333] = BoatItem::class; + Item::addCreativeItem(new Item(333)); + $this->getServer()->addRecipe((new BigShapelessRecipe(Item::get(333, 0, 1)))->addIngredient(Item::get(Item::WOODEN_PLANK, null, 5))->addIngredient(Item::get(Item::WOODEN_SHOVEL, null, 1))); - Entity::registerEntity("\\onebone\\boat\\entity\\Boat", true); + Entity::registerEntity("\\onebone\\boat\\entity\\Boat", true); - $this->getServer()->getNetwork()->registerPacket(0xae, PlayerInputPacket::class); - } + $this->getServer()->getNetwork()->registerPacket(0xae, PlayerInputPacket::class); + } - public function onQuit(PlayerQuitEvent $event){ - if(isset($this->riding[$event->getPlayer()->getName()])){ - unset($this->riding[$event->getPlayer()->getName()]); - } - } + public function onQuit(PlayerQuitEvent $event){ + if(isset($this->riding[$event->getPlayer()->getName()])){ + unset($this->riding[$event->getPlayer()->getName()]); + } + } - public function onPacketReceived(DataPacketReceiveEvent $event){ - $packet = $event->getPacket(); - $player = $event->getPlayer(); - if($packet instanceof InteractPacket){ - $boat = $player->getLevel()->getEntity($packet->target); - if($boat instanceof Boat){ - if($packet->action === 1){ - $pk = new SetEntityLinkPacket(); - $pk->from = $boat->getId(); - $pk->to = $player->getId(); - $pk->type = 2; + public function onPacketReceived(DataPacketReceiveEvent $event){ + $packet = $event->getPacket(); + $player = $event->getPlayer(); + if($packet instanceof InteractPacket){ + $boat = $player->getLevel()->getEntity($packet->target); + if($boat instanceof Boat){ + if($packet->action === 1){ + $pk = new SetEntityLinkPacket(); + $pk->from = $boat->getId(); + $pk->to = $player->getId(); + $pk->type = 2; - $this->getServer()->broadcastPacket($player->getLevel()->getPlayers(), $pk); - $pk = new SetEntityLinkPacket(); - $pk->from = $boat->getId(); - $pk->to = 0; - $pk->type = 2; - $player->dataPacket($pk); + $this->getServer()->broadcastPacket($player->getLevel()->getPlayers(), $pk); + $pk = new SetEntityLinkPacket(); + $pk->from = $boat->getId(); + $pk->to = 0; + $pk->type = 2; + $player->dataPacket($pk); - $this->riding[$player->getName()] = $packet->target; - }elseif($packet->action === 3){ - $pk = new SetEntityLinkPacket(); - $pk->from = $boat->getId(); - $pk->to = $player->getId(); - $pk->type = 3; + $this->riding[$player->getName()] = $packet->target; + }elseif($packet->action === 3){ + $pk = new SetEntityLinkPacket(); + $pk->from = $boat->getId(); + $pk->to = $player->getId(); + $pk->type = 3; - $this->getServer()->broadcastPacket($player->getLevel()->getPlayers(), $pk); - $pk = new SetEntityLinkPacket(); - $pk->from = $boat->getId(); - $pk->to = 0; - $pk->type = 3; - $player->dataPacket($pk); + $this->getServer()->broadcastPacket($player->getLevel()->getPlayers(), $pk); + $pk = new SetEntityLinkPacket(); + $pk->from = $boat->getId(); + $pk->to = 0; + $pk->type = 3; + $player->dataPacket($pk); - if(isset($this->riding[$event->getPlayer()->getName()])){ - unset($this->riding[$event->getPlayer()->getName()]); - } - } - } - }elseif($packet instanceof MovePlayerPacket){ - if(isset($this->riding[$player->getName()])){ - $boat = $player->getLevel()->getEntity($this->riding[$player->getName()]); - if($boat instanceof Boat){ - $boat->x = $packet->x; - $boat->y = $packet->y; - $boat->z = $packet->z; - } - } - } - } + if(isset($this->riding[$event->getPlayer()->getName()])){ + unset($this->riding[$event->getPlayer()->getName()]); + } + } + } + }elseif($packet instanceof MovePlayerPacket){ + if(isset($this->riding[$player->getName()])){ + $boat = $player->getLevel()->getEntity($this->riding[$player->getName()]); + if($boat instanceof Boat){ + $boat->x = $packet->x; + $boat->y = $packet->y; + $boat->z = $packet->z; + } + } + } + } } diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index aec3a33..1e128e9 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -3,63 +3,63 @@ namespace onebone\boat\entity; use pocketmine\entity\Entity; -use pocketmine\network\protocol\AddEntityPacket; -use pocketmine\event\entity\EntityDeathEvent; -use pocketmine\Player; use pocketmine\event\entity\EntityDamageEvent; -use pocketmine\network\protocol\EntityEventPacket; use pocketmine\item\Item; +use pocketmine\network\protocol\{ + AddEntityPacket, EntityEventPacket +}; +use pocketmine\Player; class Boat extends Entity{ - const NETWORK_ID = 90; + const NETWORK_ID = 90; - public function spawnTo(Player $player){ - $pk = new AddEntityPacket(); - $pk->eid = $this->getId(); - $pk->type = self::NETWORK_ID; - $pk->x = $this->x; - $pk->y = $this->y; - $pk->z = $this->z; - $pk->speedX = 0; - $pk->speedY = 0; - $pk->speedZ = 0; - $pk->yaw = 0; - $pk->pitch = 0; - $pk->metadata = $this->dataProperties; - $player->dataPacket($pk); + public function spawnTo(Player $player){ + $pk = new AddEntityPacket(); + $pk->eid = $this->getId(); + $pk->type = self::NETWORK_ID; + $pk->x = $this->x; + $pk->y = $this->y; + $pk->z = $this->z; + $pk->speedX = 0; + $pk->speedY = 0; + $pk->speedZ = 0; + $pk->yaw = 0; + $pk->pitch = 0; + $pk->metadata = $this->dataProperties; + $player->dataPacket($pk); - parent::spawnTo($player); - } + parent::spawnTo($player); + } - public function attack($damage, EntityDamageEvent $source){ - parent::attack($damage, $source); + public function attack($damage, EntityDamageEvent $source){ + parent::attack($damage, $source); - if(!$source->isCancelled()){ - $pk = new EntityEventPacket(); - $pk->eid = $this->id; - $pk->event = EntityEventPacket::HURT_ANIMATION; - foreach($this->getLevel()->getPlayers() as $player){ - $player->dataPacket($pk); - } - } - } + if(!$source->isCancelled()){ + $pk = new EntityEventPacket(); + $pk->eid = $this->id; + $pk->event = EntityEventPacket::HURT_ANIMATION; + foreach($this->getLevel()->getPlayers() as $player){ + $player->dataPacket($pk); + } + } + } - public function kill(){ - parent::kill(); + public function kill(){ + parent::kill(); foreach($this->getDrops() as $item){ $this->getLevel()->dropItem($this, $item); } - } + } - public function getDrops(){ - return [ - Item::get(333, 0, 1) - ]; - } + public function getDrops(){ + return [ + Item::get(333, 0, 1) + ]; + } - public function getSaveId(){ - $class = new \ReflectionClass(static::class); - return $class->getShortName(); - } + public function getSaveId(){ + $class = new \ReflectionClass(static::class); + return $class->getShortName(); + } } diff --git a/src/onebone/boat/item/Boat.php b/src/onebone/boat/item/Boat.php index 2b4c2ec..330ecb3 100644 --- a/src/onebone/boat/item/Boat.php +++ b/src/onebone/boat/item/Boat.php @@ -2,56 +2,54 @@ namespace onebone\boat\item; +use onebone\boat\entity\Boat as BoatEntity; +use pocketmine\block\Block; use pocketmine\item\Item; use pocketmine\level\Level; -use pocketmine\block\Block; +use pocketmine\nbt\tag\{ + Compound, Double, Enum, Float +}; use pocketmine\Player; -use pocketmine\nbt\tag\Compound; -use pocketmine\nbt\tag\Enum; -use pocketmine\nbt\tag\Double; -use pocketmine\nbt\tag\Float; - -use onebone\boat\entity\Boat as BoatEntity; class Boat extends Item{ - public function __construct($meta = 0, $count = 1){ + public function __construct($meta = 0, $count = 1){ parent::__construct(333, $meta, $count, "Boat"); } - public function canBeActivated(){ - return true; - } - - public function onActivate(Level $level, Player $player, Block $block, Block $target, $face, $fx, $fy, $fz){ - $realPos = $block->getSide($face); - - $boat = new BoatEntity($player->getLevel()->getChunk($realPos->getX() >> 4, $realPos->getZ() >> 4), new Compound("", [ - "Pos" => new Enum("Pos", [ - new Double("", $realPos->getX()), - new Double("", $realPos->getY()), - new Double("", $realPos->getZ()) - ]), - "Motion" => new Enum("Motion", [ - new Double("", 0), - new Double("", 0), - new Double("", 0) - ]), - "Rotation" => new Enum("Rotation", [ - new Float("", 0), - new Float("", 0) - ]), - ])); - $boat->spawnToAll(); - - $item = $player->getInventory()->getItemInHand(); - $count = $item->getCount(); - if(--$count <= 0){ - $player->getInventory()->setItemInHand(Item::get(Item::AIR)); - return; - } - - $item->setCount($count); - $player->getInventory()->setItemInHand($item); - return true; - } + public function canBeActivated(){ + return true; + } + + public function onActivate(Level $level, Player $player, Block $block, Block $target, $face, $fx, $fy, $fz){ + $realPos = $block->getSide($face); + + $boat = new BoatEntity($player->getLevel()->getChunk($realPos->getX() >> 4, $realPos->getZ() >> 4), new Compound("", [ + "Pos" => new Enum("Pos", [ + new Double("", $realPos->getX()), + new Double("", $realPos->getY()), + new Double("", $realPos->getZ()) + ]), + "Motion" => new Enum("Motion", [ + new Double("", 0), + new Double("", 0), + new Double("", 0) + ]), + "Rotation" => new Enum("Rotation", [ + new Float("", 0), + new Float("", 0) + ]), + ])); + $boat->spawnToAll(); + + $item = $player->getInventory()->getItemInHand(); + $count = $item->getCount(); + if(--$count <= 0){ + $player->getInventory()->setItemInHand(Item::get(Item::AIR)); + return; + } + + $item->setCount($count); + $player->getInventory()->setItemInHand($item); + return true; + } } From 0b4edb258b21c395bcc1841563a2c93c2f338bcd Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 15:27:18 +0900 Subject: [PATCH 04/68] Fix protocol namespace According to https://github.com/pmmp/PocketMine-MP/commit/56990eb28b454c4c8203847e6fb0eb9631771e47#diff-06174961a3539d65939bd24707fff5c1 --- src/onebone/boat/Main.php | 2 +- src/onebone/boat/entity/Boat.php | 2 +- src/onebone/boat/packet/PlayerInputPacket.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index b4d7a1e..91d2a24 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -11,7 +11,7 @@ use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\inventory\BigShapelessRecipe; use pocketmine\item\Item; -use pocketmine\network\protocol\{ +use pocketmine\network\mcpe\protocol\{ InteractPacket, MovePlayerPacket, SetEntityLinkPacket }; use pocketmine\plugin\PluginBase; diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index 1e128e9..18e8766 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -5,7 +5,7 @@ use pocketmine\entity\Entity; use pocketmine\event\entity\EntityDamageEvent; use pocketmine\item\Item; -use pocketmine\network\protocol\{ +use pocketmine\network\mcpe\protocol\{ AddEntityPacket, EntityEventPacket }; use pocketmine\Player; diff --git a/src/onebone/boat/packet/PlayerInputPacket.php b/src/onebone/boat/packet/PlayerInputPacket.php index 7633c90..a72391f 100644 --- a/src/onebone/boat/packet/PlayerInputPacket.php +++ b/src/onebone/boat/packet/PlayerInputPacket.php @@ -21,7 +21,7 @@ namespace onebone\boat\packet; -use pocketmine\network\protocol\DataPacket; +use pocketmine\network\mcpe\protocol\DataPacket; class PlayerInputPacket extends DataPacket{ const NETWORK_ID = 0xae; From 23a002bad4a4e2d3a83a9ad8eb873e3ec67152db Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 15:31:45 +0900 Subject: [PATCH 05/68] Remove PlayerInputPacket : Already implemented According to https://github.com/pmmp/PocketMine-MP/commit/86ed0f1397566c33a970743500904d09f34c74e1#diff-e3f1e14ace92d3b40881c005967bb756 --- src/onebone/boat/Main.php | 3 -- src/onebone/boat/packet/PlayerInputPacket.php | 47 ------------------- 2 files changed, 50 deletions(-) delete mode 100644 src/onebone/boat/packet/PlayerInputPacket.php diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index 91d2a24..a2bf372 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -4,7 +4,6 @@ use onebone\boat\entity\Boat; use onebone\boat\item\Boat as BoatItem; -use onebone\boat\packet\PlayerInputPacket; use pocketmine\entity\Entity; use pocketmine\event\Listener; use pocketmine\event\player\PlayerQuitEvent; @@ -27,8 +26,6 @@ public function onEnable(){ $this->getServer()->addRecipe((new BigShapelessRecipe(Item::get(333, 0, 1)))->addIngredient(Item::get(Item::WOODEN_PLANK, null, 5))->addIngredient(Item::get(Item::WOODEN_SHOVEL, null, 1))); Entity::registerEntity("\\onebone\\boat\\entity\\Boat", true); - - $this->getServer()->getNetwork()->registerPacket(0xae, PlayerInputPacket::class); } public function onQuit(PlayerQuitEvent $event){ diff --git a/src/onebone/boat/packet/PlayerInputPacket.php b/src/onebone/boat/packet/PlayerInputPacket.php deleted file mode 100644 index a72391f..0000000 --- a/src/onebone/boat/packet/PlayerInputPacket.php +++ /dev/null @@ -1,47 +0,0 @@ -motX = $this->getFloat(); - $this->motY = $this->getFloat(); - $flags = $this->getByte(); - $this->jumping = (($flags & 0x80) > 0); - $this->sneaking = (($flags & 0x40) > 0); - } - - public function encode(){ - - } - -} From 4b1aeb714a66ff90015b08ad5ab4b14311f48780 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 15:46:43 +0900 Subject: [PATCH 06/68] BoatItem : Extends from already implemented boat item According to https://github.com/pmmp/PocketMine-MP/commit/8a0bd85656580614d823c6fdffa08d74a9e434ed#diff-d0bff1a7da0df8b7673b17bae3108b2e --- src/onebone/boat/item/Boat.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/onebone/boat/item/Boat.php b/src/onebone/boat/item/Boat.php index 330ecb3..1720b25 100644 --- a/src/onebone/boat/item/Boat.php +++ b/src/onebone/boat/item/Boat.php @@ -4,18 +4,16 @@ use onebone\boat\entity\Boat as BoatEntity; use pocketmine\block\Block; -use pocketmine\item\Item; +use pocketmine\item\{ + Boat as BoatItemPM, Item +}; use pocketmine\level\Level; use pocketmine\nbt\tag\{ Compound, Double, Enum, Float }; use pocketmine\Player; -class Boat extends Item{ - public function __construct($meta = 0, $count = 1){ - parent::__construct(333, $meta, $count, "Boat"); - } - +class Boat extends BoatItemPM{ public function canBeActivated(){ return true; } From 571aef1b512ba102793d7fae2f1af76bc327a178 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 15:49:07 +0900 Subject: [PATCH 07/68] Main : Set alias of entity\Boat to BoatEntity --- src/onebone/boat/Main.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index a2bf372..99328f9 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -2,7 +2,7 @@ namespace onebone\boat; -use onebone\boat\entity\Boat; +use onebone\boat\entity\Boat as BoatEntity; use onebone\boat\item\Boat as BoatItem; use pocketmine\entity\Entity; use pocketmine\event\Listener; @@ -39,7 +39,7 @@ public function onPacketReceived(DataPacketReceiveEvent $event){ $player = $event->getPlayer(); if($packet instanceof InteractPacket){ $boat = $player->getLevel()->getEntity($packet->target); - if($boat instanceof Boat){ + if($boat instanceof BoatEntity){ if($packet->action === 1){ $pk = new SetEntityLinkPacket(); $pk->from = $boat->getId(); @@ -75,7 +75,7 @@ public function onPacketReceived(DataPacketReceiveEvent $event){ }elseif($packet instanceof MovePlayerPacket){ if(isset($this->riding[$player->getName()])){ $boat = $player->getLevel()->getEntity($this->riding[$player->getName()]); - if($boat instanceof Boat){ + if($boat instanceof BoatEntity){ $boat->x = $packet->x; $boat->y = $packet->y; $boat->z = $packet->z; From 316c1f32b43b3e66461012acf58eb72e41737e35 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 15:51:31 +0900 Subject: [PATCH 08/68] Main : Use "::class" See : http://php.net/oop5.basic#language.oop5.basic.class.class --- src/onebone/boat/Main.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index 99328f9..defe1dc 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -25,7 +25,7 @@ public function onEnable(){ Item::addCreativeItem(new Item(333)); $this->getServer()->addRecipe((new BigShapelessRecipe(Item::get(333, 0, 1)))->addIngredient(Item::get(Item::WOODEN_PLANK, null, 5))->addIngredient(Item::get(Item::WOODEN_SHOVEL, null, 1))); - Entity::registerEntity("\\onebone\\boat\\entity\\Boat", true); + Entity::registerEntity(BoatEntity::class, true); } public function onQuit(PlayerQuitEvent $event){ From 47cb3031fbe8a0b91a99554e5cb83e6130184720 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 15:58:04 +0900 Subject: [PATCH 09/68] BoatEntity : Remove useless override --- src/onebone/boat/entity/Boat.php | 28 +--------------------------- 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index 18e8766..05c6ed4 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -5,32 +5,11 @@ use pocketmine\entity\Entity; use pocketmine\event\entity\EntityDamageEvent; use pocketmine\item\Item; -use pocketmine\network\mcpe\protocol\{ - AddEntityPacket, EntityEventPacket -}; -use pocketmine\Player; +use pocketmine\network\mcpe\protocol\EntityEventPacket; class Boat extends Entity{ const NETWORK_ID = 90; - public function spawnTo(Player $player){ - $pk = new AddEntityPacket(); - $pk->eid = $this->getId(); - $pk->type = self::NETWORK_ID; - $pk->x = $this->x; - $pk->y = $this->y; - $pk->z = $this->z; - $pk->speedX = 0; - $pk->speedY = 0; - $pk->speedZ = 0; - $pk->yaw = 0; - $pk->pitch = 0; - $pk->metadata = $this->dataProperties; - $player->dataPacket($pk); - - parent::spawnTo($player); - } - public function attack($damage, EntityDamageEvent $source){ parent::attack($damage, $source); @@ -57,9 +36,4 @@ public function getDrops(){ Item::get(333, 0, 1) ]; } - - public function getSaveId(){ - $class = new \ReflectionClass(static::class); - return $class->getShortName(); - } } From e6d48caf7e45865ad3e8dc98439b4169352eeb39 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 16:01:26 +0900 Subject: [PATCH 10/68] Add return types --- src/onebone/boat/Main.php | 6 +++--- src/onebone/boat/entity/Boat.php | 6 +++--- src/onebone/boat/item/Boat.php | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index defe1dc..ebdd042 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -18,7 +18,7 @@ class Main extends PluginBase implements Listener{ private $riding = []; - public function onEnable(){ + public function onEnable() : void{ $this->getServer()->getPluginManager()->registerEvents($this, $this); Item::$list[333] = BoatItem::class; @@ -28,13 +28,13 @@ public function onEnable(){ Entity::registerEntity(BoatEntity::class, true); } - public function onQuit(PlayerQuitEvent $event){ + public function onQuit(PlayerQuitEvent $event) : void{ if(isset($this->riding[$event->getPlayer()->getName()])){ unset($this->riding[$event->getPlayer()->getName()]); } } - public function onPacketReceived(DataPacketReceiveEvent $event){ + public function onPacketReceived(DataPacketReceiveEvent $event) : void{ $packet = $event->getPacket(); $player = $event->getPlayer(); if($packet instanceof InteractPacket){ diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index 05c6ed4..8b1b048 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -10,7 +10,7 @@ class Boat extends Entity{ const NETWORK_ID = 90; - public function attack($damage, EntityDamageEvent $source){ + public function attack($damage, EntityDamageEvent $source) : void{ parent::attack($damage, $source); if(!$source->isCancelled()){ @@ -23,7 +23,7 @@ public function attack($damage, EntityDamageEvent $source){ } } - public function kill(){ + public function kill() : void{ parent::kill(); foreach($this->getDrops() as $item){ @@ -31,7 +31,7 @@ public function kill(){ } } - public function getDrops(){ + public function getDrops(): array{ return [ Item::get(333, 0, 1) ]; diff --git a/src/onebone/boat/item/Boat.php b/src/onebone/boat/item/Boat.php index 1720b25..9748741 100644 --- a/src/onebone/boat/item/Boat.php +++ b/src/onebone/boat/item/Boat.php @@ -14,11 +14,11 @@ use pocketmine\Player; class Boat extends BoatItemPM{ - public function canBeActivated(){ + public function canBeActivated() : bool{ return true; } - public function onActivate(Level $level, Player $player, Block $block, Block $target, $face, $fx, $fy, $fz){ + public function onActivate(Level $level, Player $player, Block $block, Block $target, $face, $fx, $fy, $fz) : bool{ $realPos = $block->getSide($face); $boat = new BoatEntity($player->getLevel()->getChunk($realPos->getX() >> 4, $realPos->getZ() >> 4), new Compound("", [ From e59dcac6f9359f645319d1095c0341b6442ca777 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 16:11:15 +0900 Subject: [PATCH 11/68] BoatEntity : Remove obsolete parameter of attack() According to https://github.com/pmmp/PocketMine-MP/commit/456ddd3fb3ca96a4bc340837f8b620e05fa08dc2#diff-9649873f1670ddd60984257dd0380943 --- src/onebone/boat/entity/Boat.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index 8b1b048..d8f15ff 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -10,8 +10,8 @@ class Boat extends Entity{ const NETWORK_ID = 90; - public function attack($damage, EntityDamageEvent $source) : void{ - parent::attack($damage, $source); + public function attack(EntityDamageEvent $source) : void{ + parent::attack($source); if(!$source->isCancelled()){ $pk = new EntityEventPacket(); From 429c4180bfe8078aef64aebf535c34caa00e2b22 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 16:25:20 +0900 Subject: [PATCH 12/68] BoatEntity : Remove useless override --- src/onebone/boat/entity/Boat.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index d8f15ff..7f4fc6a 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -23,15 +23,7 @@ public function attack(EntityDamageEvent $source) : void{ } } - public function kill() : void{ - parent::kill(); - - foreach($this->getDrops() as $item){ - $this->getLevel()->dropItem($this, $item); - } - } - - public function getDrops(): array{ + public function getDrops() : array{ return [ Item::get(333, 0, 1) ]; From d55a49bfac9042fb5d69e4a23da7b9a944478275 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 16:26:02 +0900 Subject: [PATCH 13/68] BoatEntity : Set max hp on initEntity() --- src/onebone/boat/entity/Boat.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index 7f4fc6a..b084753 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -10,6 +10,13 @@ class Boat extends Entity{ const NETWORK_ID = 90; + public function initEntity() : void{ + $this->setMaxHealth(4); + //TODO: Set Entity::DATA_RIDER_SEAT_POSITION + + parent::initEntity(); + } + public function attack(EntityDamageEvent $source) : void{ parent::attack($source); From 208f347b02a2ebb89f4357fd28a2fe52cfe001db Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 16:34:11 +0900 Subject: [PATCH 14/68] Main : Register item to ItemFactory https://github.com/pmmp/PocketMine-MP/commit/02f42eba48e7622c757926ee8eafb6f672025d63#diff-c7f684d27490460ac75733f50da43132 --- src/onebone/boat/Main.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index ebdd042..b61401c 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -9,7 +9,9 @@ use pocketmine\event\player\PlayerQuitEvent; use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\inventory\BigShapelessRecipe; -use pocketmine\item\Item; +use pocketmine\item\{ + Item, ItemFactory +}; use pocketmine\network\mcpe\protocol\{ InteractPacket, MovePlayerPacket, SetEntityLinkPacket }; @@ -21,7 +23,7 @@ class Main extends PluginBase implements Listener{ public function onEnable() : void{ $this->getServer()->getPluginManager()->registerEvents($this, $this); - Item::$list[333] = BoatItem::class; + ItemFactory::registerItem(new BoatItem(), true); Item::addCreativeItem(new Item(333)); $this->getServer()->addRecipe((new BigShapelessRecipe(Item::get(333, 0, 1)))->addIngredient(Item::get(Item::WOODEN_PLANK, null, 5))->addIngredient(Item::get(Item::WOODEN_SHOVEL, null, 1))); From bfcad2f348c8bf2869ba574071850c460b06f7b7 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 16:35:16 +0900 Subject: [PATCH 15/68] Main : Register creative item with direct constructed item instance --- src/onebone/boat/Main.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index b61401c..900b458 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -24,7 +24,7 @@ public function onEnable() : void{ $this->getServer()->getPluginManager()->registerEvents($this, $this); ItemFactory::registerItem(new BoatItem(), true); - Item::addCreativeItem(new Item(333)); + Item::addCreativeItem(new BoatItem()); $this->getServer()->addRecipe((new BigShapelessRecipe(Item::get(333, 0, 1)))->addIngredient(Item::get(Item::WOODEN_PLANK, null, 5))->addIngredient(Item::get(Item::WOODEN_SHOVEL, null, 1))); Entity::registerEntity(BoatEntity::class, true); From 6b1a80ea433e950454447be95351bfc3dfef5e07 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 16:40:20 +0900 Subject: [PATCH 16/68] Main : Register recipe to CraftingManager Accoding to https://github.com/pmmp/PocketMine-MP/commit/ab2df8b11bfcdde72156a040a4b23333c2c8c05d --- src/onebone/boat/Main.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index 900b458..fafcfa3 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -25,7 +25,7 @@ public function onEnable() : void{ ItemFactory::registerItem(new BoatItem(), true); Item::addCreativeItem(new BoatItem()); - $this->getServer()->addRecipe((new BigShapelessRecipe(Item::get(333, 0, 1)))->addIngredient(Item::get(Item::WOODEN_PLANK, null, 5))->addIngredient(Item::get(Item::WOODEN_SHOVEL, null, 1))); + $this->getServer()->getCraftingManager()->registerRecipe((new BigShapelessRecipe(Item::get(333, 0, 1)))->addIngredient(Item::get(Item::WOODEN_PLANK, null, 5))->addIngredient(Item::get(Item::WOODEN_SHOVEL, null, 1))); Entity::registerEntity(BoatEntity::class, true); } From d683630bdb4ac3c87eec5e26cb9a57f85bc0b43d Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 16:44:06 +0900 Subject: [PATCH 17/68] Main : Use ShapelessRecipe instead of BigShapelessRecipe According to https://github.com/pmmp/PocketMine-MP/commit/f0755d1659463e66a20f5d3eb616e8708ba341be#diff-654e8603ad921c8816479346c762101b --- src/onebone/boat/Main.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index fafcfa3..477c177 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -8,7 +8,7 @@ use pocketmine\event\Listener; use pocketmine\event\player\PlayerQuitEvent; use pocketmine\event\server\DataPacketReceiveEvent; -use pocketmine\inventory\BigShapelessRecipe; +use pocketmine\inventory\ShapelessRecipe; use pocketmine\item\{ Item, ItemFactory }; @@ -25,7 +25,14 @@ public function onEnable() : void{ ItemFactory::registerItem(new BoatItem(), true); Item::addCreativeItem(new BoatItem()); - $this->getServer()->getCraftingManager()->registerRecipe((new BigShapelessRecipe(Item::get(333, 0, 1)))->addIngredient(Item::get(Item::WOODEN_PLANK, null, 5))->addIngredient(Item::get(Item::WOODEN_SHOVEL, null, 1))); + $this->getServer()->getCraftingManager()->registerRecipe( + new ShapelessRecipe( + [ + Item::get(Item::WOODEN_PLANK, null, 5), + Item::get(Item::WOODEN_SHOVEL, null, 1) + ], + [Item::get(333, 0, 1)]) + ); Entity::registerEntity(BoatEntity::class, true); } From ec480c9b0c375fede259c62db8bf23c5c58f8b00 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 16:46:59 +0900 Subject: [PATCH 18/68] Main : Saperate event listener --- src/onebone/boat/Main.php | 69 +------------------- src/onebone/boat/listener/EventListener.php | 72 +++++++++++++++++++++ 2 files changed, 75 insertions(+), 66 deletions(-) create mode 100644 src/onebone/boat/listener/EventListener.php diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index 477c177..02270f0 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -4,25 +4,16 @@ use onebone\boat\entity\Boat as BoatEntity; use onebone\boat\item\Boat as BoatItem; +use onebone\boat\listener\EventListener; use pocketmine\entity\Entity; -use pocketmine\event\Listener; -use pocketmine\event\player\PlayerQuitEvent; -use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\inventory\ShapelessRecipe; use pocketmine\item\{ Item, ItemFactory }; -use pocketmine\network\mcpe\protocol\{ - InteractPacket, MovePlayerPacket, SetEntityLinkPacket -}; use pocketmine\plugin\PluginBase; -class Main extends PluginBase implements Listener{ - private $riding = []; - +class Main extends PluginBase{ public function onEnable() : void{ - $this->getServer()->getPluginManager()->registerEvents($this, $this); - ItemFactory::registerItem(new BoatItem(), true); Item::addCreativeItem(new BoatItem()); $this->getServer()->getCraftingManager()->registerRecipe( @@ -35,61 +26,7 @@ public function onEnable() : void{ ); Entity::registerEntity(BoatEntity::class, true); - } - - public function onQuit(PlayerQuitEvent $event) : void{ - if(isset($this->riding[$event->getPlayer()->getName()])){ - unset($this->riding[$event->getPlayer()->getName()]); - } - } - - public function onPacketReceived(DataPacketReceiveEvent $event) : void{ - $packet = $event->getPacket(); - $player = $event->getPlayer(); - if($packet instanceof InteractPacket){ - $boat = $player->getLevel()->getEntity($packet->target); - if($boat instanceof BoatEntity){ - if($packet->action === 1){ - $pk = new SetEntityLinkPacket(); - $pk->from = $boat->getId(); - $pk->to = $player->getId(); - $pk->type = 2; - - $this->getServer()->broadcastPacket($player->getLevel()->getPlayers(), $pk); - $pk = new SetEntityLinkPacket(); - $pk->from = $boat->getId(); - $pk->to = 0; - $pk->type = 2; - $player->dataPacket($pk); - - $this->riding[$player->getName()] = $packet->target; - }elseif($packet->action === 3){ - $pk = new SetEntityLinkPacket(); - $pk->from = $boat->getId(); - $pk->to = $player->getId(); - $pk->type = 3; - - $this->getServer()->broadcastPacket($player->getLevel()->getPlayers(), $pk); - $pk = new SetEntityLinkPacket(); - $pk->from = $boat->getId(); - $pk->to = 0; - $pk->type = 3; - $player->dataPacket($pk); - if(isset($this->riding[$event->getPlayer()->getName()])){ - unset($this->riding[$event->getPlayer()->getName()]); - } - } - } - }elseif($packet instanceof MovePlayerPacket){ - if(isset($this->riding[$player->getName()])){ - $boat = $player->getLevel()->getEntity($this->riding[$player->getName()]); - if($boat instanceof BoatEntity){ - $boat->x = $packet->x; - $boat->y = $packet->y; - $boat->z = $packet->z; - } - } - } + $this->getServer()->getPluginManager()->registerEvents(new EventListener(), $this); } } diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php new file mode 100644 index 0000000..a050ba7 --- /dev/null +++ b/src/onebone/boat/listener/EventListener.php @@ -0,0 +1,72 @@ +riding[$event->getPlayer()->getName()])){ + unset($this->riding[$event->getPlayer()->getName()]); + } + } + + public function onPacketReceived(DataPacketReceiveEvent $event) : void{ + $packet = $event->getPacket(); + $player = $event->getPlayer(); + if($packet instanceof InteractPacket){ + $boat = $player->getLevel()->getEntity($packet->target); + if($boat instanceof BoatEntity){ + if($packet->action === 1){ + $pk = new SetEntityLinkPacket(); + $pk->from = $boat->getId(); + $pk->to = $player->getId(); + $pk->type = 2; + + Server::getInstance()->broadcastPacket($player->getLevel()->getPlayers(), $pk); + $pk = new SetEntityLinkPacket(); + $pk->from = $boat->getId(); + $pk->to = 0; + $pk->type = 2; + $player->dataPacket($pk); + + $this->riding[$player->getName()] = $packet->target; + }elseif($packet->action === 3){ + $pk = new SetEntityLinkPacket(); + $pk->from = $boat->getId(); + $pk->to = $player->getId(); + $pk->type = 3; + + Server::getInstance()->broadcastPacket($player->getLevel()->getPlayers(), $pk); + $pk = new SetEntityLinkPacket(); + $pk->from = $boat->getId(); + $pk->to = 0; + $pk->type = 3; + $player->dataPacket($pk); + + if(isset($this->riding[$event->getPlayer()->getName()])){ + unset($this->riding[$event->getPlayer()->getName()]); + } + } + } + }elseif($packet instanceof MovePlayerPacket){ + if(isset($this->riding[$player->getName()])){ + $boat = $player->getLevel()->getEntity($this->riding[$player->getName()]); + if($boat instanceof BoatEntity){ + $boat->x = $packet->x; + $boat->y = $packet->y; + $boat->z = $packet->z; + } + } + } + } +} \ No newline at end of file From 605d11195022c0458cdf051e32fb1aa9a3a5b49d Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 16:51:13 +0900 Subject: [PATCH 19/68] Main : Fix WOODEN_PLANK to WOODEN_PLANKS Accroding to https://github.com/pmmp/PocketMine-MP/commit/58ff3815571ffc4fb55155b329474d019b1a7518#diff-2bd2e180f132ad27afaf363a297b0cc5 --- src/onebone/boat/Main.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index 02270f0..5a00af8 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -19,7 +19,7 @@ public function onEnable() : void{ $this->getServer()->getCraftingManager()->registerRecipe( new ShapelessRecipe( [ - Item::get(Item::WOODEN_PLANK, null, 5), + Item::get(Item::WOODEN_PLANKS, null, 5), Item::get(Item::WOODEN_SHOVEL, null, 1) ], [Item::get(333, 0, 1)]) From a112a8132c5fb90a05dc3a04bb105da60f8c527c Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 16:54:37 +0900 Subject: [PATCH 20/68] BoatItem : Change the reduce item count code --- src/onebone/boat/item/Boat.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/onebone/boat/item/Boat.php b/src/onebone/boat/item/Boat.php index 9748741..222a381 100644 --- a/src/onebone/boat/item/Boat.php +++ b/src/onebone/boat/item/Boat.php @@ -40,14 +40,11 @@ public function onActivate(Level $level, Player $player, Block $block, Block $ta $boat->spawnToAll(); $item = $player->getInventory()->getItemInHand(); - $count = $item->getCount(); - if(--$count <= 0){ + if(--$item->count <= 0){ $player->getInventory()->setItemInHand(Item::get(Item::AIR)); - return; + }else{ + $player->getInventory()->setItemInHand($item); } - - $item->setCount($count); - $player->getInventory()->setItemInHand($item); return true; } } From 884658a3703bf959435b4ea2a1eae6ac88aba086 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 17:12:56 +0900 Subject: [PATCH 21/68] BoatItem : Remove redundant Level parameter from onActivate() According to https://github.com/pmmp/PocketMine-MP/commit/6c8a1a5b80e9700cdbeb92adf4146fd9a0d299dc --- src/onebone/boat/item/Boat.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/onebone/boat/item/Boat.php b/src/onebone/boat/item/Boat.php index 222a381..2987e20 100644 --- a/src/onebone/boat/item/Boat.php +++ b/src/onebone/boat/item/Boat.php @@ -7,7 +7,7 @@ use pocketmine\item\{ Boat as BoatItemPM, Item }; -use pocketmine\level\Level; +use pocketmine\math\Vector3; use pocketmine\nbt\tag\{ Compound, Double, Enum, Float }; @@ -18,8 +18,8 @@ public function canBeActivated() : bool{ return true; } - public function onActivate(Level $level, Player $player, Block $block, Block $target, $face, $fx, $fy, $fz) : bool{ - $realPos = $block->getSide($face); + public function onActivate(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : bool{ + $realPos = $blockClicked->getSide($face); $boat = new BoatEntity($player->getLevel()->getChunk($realPos->getX() >> 4, $realPos->getZ() >> 4), new Compound("", [ "Pos" => new Enum("Pos", [ From e9d56bd993c6d1922a47c67208fb4d29957265a8 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 17:26:23 +0900 Subject: [PATCH 22/68] BoatItem : Fix BoatEntity construct - Give Level instead of Chunk (According to https://github.com/pmmp/PocketMine-MP/commit/c21197ef176166b1c2c19b091cf84664aa878c00#diff-9649873f1670ddd60984257dd0380943) - Use createBaseNBT() (Arrcoding to https://github.com/pmmp/PocketMine-MP/commit/50be26958a58d66ae022b3cd0f3193ceafff8d94) --- src/onebone/boat/item/Boat.php | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/src/onebone/boat/item/Boat.php b/src/onebone/boat/item/Boat.php index 2987e20..edd68c0 100644 --- a/src/onebone/boat/item/Boat.php +++ b/src/onebone/boat/item/Boat.php @@ -8,9 +8,6 @@ Boat as BoatItemPM, Item }; use pocketmine\math\Vector3; -use pocketmine\nbt\tag\{ - Compound, Double, Enum, Float -}; use pocketmine\Player; class Boat extends BoatItemPM{ @@ -19,24 +16,7 @@ public function canBeActivated() : bool{ } public function onActivate(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : bool{ - $realPos = $blockClicked->getSide($face); - - $boat = new BoatEntity($player->getLevel()->getChunk($realPos->getX() >> 4, $realPos->getZ() >> 4), new Compound("", [ - "Pos" => new Enum("Pos", [ - new Double("", $realPos->getX()), - new Double("", $realPos->getY()), - new Double("", $realPos->getZ()) - ]), - "Motion" => new Enum("Motion", [ - new Double("", 0), - new Double("", 0), - new Double("", 0) - ]), - "Rotation" => new Enum("Rotation", [ - new Float("", 0), - new Float("", 0) - ]), - ])); + $boat = new BoatEntity($player->getLevel(), BoatEntity::createBaseNBT($blockClicked->getSide($face))); $boat->spawnToAll(); $item = $player->getInventory()->getItemInHand(); From 6da048806f576a3e11aa40b0f72ecddc29eb3e8c Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 17:48:40 +0900 Subject: [PATCH 23/68] Refactoring about packets --- src/onebone/boat/entity/Boat.php | 2 +- src/onebone/boat/listener/EventListener.php | 27 +++++---------------- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index b084753..b2da7d3 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -22,7 +22,7 @@ public function attack(EntityDamageEvent $source) : void{ if(!$source->isCancelled()){ $pk = new EntityEventPacket(); - $pk->eid = $this->id; + $pk->entityRuntimeId = $this->id; $pk->event = EntityEventPacket::HURT_ANIMATION; foreach($this->getLevel()->getPlayers() as $player){ $player->dataPacket($pk); diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index a050ba7..5bc230c 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -9,6 +9,7 @@ use pocketmine\network\mcpe\protocol\{ InteractPacket, MovePlayerPacket, SetEntityLinkPacket }; +use pocketmine\network\mcpe\protocol\types\EntityLink; use pocketmine\Server; class EventListener implements Listener{ @@ -28,29 +29,15 @@ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ if($boat instanceof BoatEntity){ if($packet->action === 1){ $pk = new SetEntityLinkPacket(); - $pk->from = $boat->getId(); - $pk->to = $player->getId(); - $pk->type = 2; - - Server::getInstance()->broadcastPacket($player->getLevel()->getPlayers(), $pk); - $pk = new SetEntityLinkPacket(); - $pk->from = $boat->getId(); - $pk->to = 0; - $pk->type = 2; + $pk->link = new EntityLink($player->getId(), $boat->getId(), EntityLink::TYPE_RIDER); + Server::getInstance()->broadcastPacket($player->getViewers(), $pk); $player->dataPacket($pk); $this->riding[$player->getName()] = $packet->target; }elseif($packet->action === 3){ $pk = new SetEntityLinkPacket(); - $pk->from = $boat->getId(); - $pk->to = $player->getId(); - $pk->type = 3; - - Server::getInstance()->broadcastPacket($player->getLevel()->getPlayers(), $pk); - $pk = new SetEntityLinkPacket(); - $pk->from = $boat->getId(); - $pk->to = 0; - $pk->type = 3; + $pk->link = new EntityLink($player->getId(), $boat->getId(), EntityLink::TYPE_REMOVE); + Server::getInstance()->broadcastPacket($player->getViewers(), $pk); $player->dataPacket($pk); if(isset($this->riding[$event->getPlayer()->getName()])){ @@ -62,9 +49,7 @@ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ if(isset($this->riding[$player->getName()])){ $boat = $player->getLevel()->getEntity($this->riding[$player->getName()]); if($boat instanceof BoatEntity){ - $boat->x = $packet->x; - $boat->y = $packet->y; - $boat->z = $packet->z; + $boat->teleport($packet->position); } } } From 99d34b869ffd766cb83b8477141c2903eb1ebd9b Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 17:50:31 +0900 Subject: [PATCH 24/68] Main : Fix Item::get() parameter --- src/onebone/boat/Main.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index 5a00af8..bace11c 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -19,8 +19,8 @@ public function onEnable() : void{ $this->getServer()->getCraftingManager()->registerRecipe( new ShapelessRecipe( [ - Item::get(Item::WOODEN_PLANKS, null, 5), - Item::get(Item::WOODEN_SHOVEL, null, 1) + Item::get(Item::WOODEN_PLANKS, 0, 5), + Item::get(Item::WOODEN_SHOVEL, 0, 1) ], [Item::get(333, 0, 1)]) ); From ac2eaa40e34d5d935e7365357d6bbc0592b07d46 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 18:00:56 +0900 Subject: [PATCH 25/68] Version dump to 0.2.0-REVIVAL Complete fixing of existing code, To be fix according to current system --- plugin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.yml b/plugin.yml index 434467d..0bf1aa4 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,7 +1,7 @@ --- name: Boat main: onebone\boat\Main -version: 0.1.0-REVIVAL +version: 0.2.0-REVIVAL author: onebone api: [3.0.0, 4.0.0] ... \ No newline at end of file From eb511a1634ae992fa0f3c355fdf20e79d31b4054 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 18:12:16 +0900 Subject: [PATCH 26/68] BoatEntity : Add properties about bounding box $height, $width, $gravity and $drag --- src/onebone/boat/entity/Boat.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index b2da7d3..fa907b0 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -10,6 +10,12 @@ class Boat extends Entity{ const NETWORK_ID = 90; + public $height = 0.455; + public $width = 1.4; + + public $gravity = 0; + public $drag = 0.1; + public function initEntity() : void{ $this->setMaxHealth(4); //TODO: Set Entity::DATA_RIDER_SEAT_POSITION From 5a7344b9672206428a1c93b9437ca29bd88d6a16 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 18:25:16 +0900 Subject: [PATCH 27/68] EventListener : Unhandle InteractPacket when unknown action --- src/onebone/boat/listener/EventListener.php | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index 5bc230c..3564af6 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -27,14 +27,7 @@ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ if($packet instanceof InteractPacket){ $boat = $player->getLevel()->getEntity($packet->target); if($boat instanceof BoatEntity){ - if($packet->action === 1){ - $pk = new SetEntityLinkPacket(); - $pk->link = new EntityLink($player->getId(), $boat->getId(), EntityLink::TYPE_RIDER); - Server::getInstance()->broadcastPacket($player->getViewers(), $pk); - $player->dataPacket($pk); - - $this->riding[$player->getName()] = $packet->target; - }elseif($packet->action === 3){ + if($packet->action === 3){ $pk = new SetEntityLinkPacket(); $pk->link = new EntityLink($player->getId(), $boat->getId(), EntityLink::TYPE_REMOVE); Server::getInstance()->broadcastPacket($player->getViewers(), $pk); From 76d03b32b1aa4baad08f27ec54150b34b9e81770 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 18:25:38 +0900 Subject: [PATCH 28/68] EventListener : Handle InventoryTransactionPacket for ride boat --- src/onebone/boat/listener/EventListener.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index 3564af6..0b5cca6 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -7,7 +7,7 @@ use pocketmine\event\player\PlayerQuitEvent; use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\network\mcpe\protocol\{ - InteractPacket, MovePlayerPacket, SetEntityLinkPacket + InteractPacket, InventoryTransactionPacket, MovePlayerPacket, SetEntityLinkPacket }; use pocketmine\network\mcpe\protocol\types\EntityLink; use pocketmine\Server; @@ -24,7 +24,19 @@ public function onQuit(PlayerQuitEvent $event) : void{ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ $packet = $event->getPacket(); $player = $event->getPlayer(); - if($packet instanceof InteractPacket){ + if($packet instanceof InventoryTransactionPacket){ + if($packet->transactionType === 3){ + $boat = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); + if($boat instanceof BoatEntity){ + $pk = new SetEntityLinkPacket(); + $pk->link = new EntityLink($player->getId(), $boat->getId(), EntityLink::TYPE_RIDER); + Server::getInstance()->broadcastPacket($player->getViewers(), $pk); + $player->dataPacket($pk); + + $this->riding[$player->getName()] = $packet->trData->entityRuntimeId; + } + } + }elseif($packet instanceof InteractPacket){ $boat = $player->getLevel()->getEntity($packet->target); if($boat instanceof BoatEntity){ if($packet->action === 3){ From 62c6ebd5abd24c5c5c5e74578a9f01927545cf12 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 18:27:11 +0900 Subject: [PATCH 29/68] Use constants for more readability --- src/onebone/boat/Main.php | 2 +- src/onebone/boat/entity/Boat.php | 2 +- src/onebone/boat/listener/EventListener.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index bace11c..1b74203 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -22,7 +22,7 @@ public function onEnable() : void{ Item::get(Item::WOODEN_PLANKS, 0, 5), Item::get(Item::WOODEN_SHOVEL, 0, 1) ], - [Item::get(333, 0, 1)]) + [Item::get(Item::BOAT, 0, 1)]) ); Entity::registerEntity(BoatEntity::class, true); diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index fa907b0..a5e13c6 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -38,7 +38,7 @@ public function attack(EntityDamageEvent $source) : void{ public function getDrops() : array{ return [ - Item::get(333, 0, 1) + Item::get(Item::BOAT, 0, 1) ]; } } diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index 0b5cca6..b0449f7 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -25,7 +25,7 @@ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ $packet = $event->getPacket(); $player = $event->getPlayer(); if($packet instanceof InventoryTransactionPacket){ - if($packet->transactionType === 3){ + if($packet->transactionType === InventoryTransactionPacket::TYPE_USE_ITEM_ON_ENTITY){ $boat = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); if($boat instanceof BoatEntity){ $pk = new SetEntityLinkPacket(); @@ -39,7 +39,7 @@ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ }elseif($packet instanceof InteractPacket){ $boat = $player->getLevel()->getEntity($packet->target); if($boat instanceof BoatEntity){ - if($packet->action === 3){ + if($packet->action === InteractPacket::ACTION_LEAVE_VEHICLE){ $pk = new SetEntityLinkPacket(); $pk->link = new EntityLink($player->getId(), $boat->getId(), EntityLink::TYPE_REMOVE); Server::getInstance()->broadcastPacket($player->getViewers(), $pk); From 34b210185544b83ac4b9cea501ce90d0740361ae Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 18:29:05 +0900 Subject: [PATCH 30/68] EventListener : Merge if-statement for more readability --- src/onebone/boat/listener/EventListener.php | 34 +++++++++------------ 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index b0449f7..75a4a5f 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -24,30 +24,26 @@ public function onQuit(PlayerQuitEvent $event) : void{ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ $packet = $event->getPacket(); $player = $event->getPlayer(); - if($packet instanceof InventoryTransactionPacket){ - if($packet->transactionType === InventoryTransactionPacket::TYPE_USE_ITEM_ON_ENTITY){ - $boat = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); - if($boat instanceof BoatEntity){ - $pk = new SetEntityLinkPacket(); - $pk->link = new EntityLink($player->getId(), $boat->getId(), EntityLink::TYPE_RIDER); - Server::getInstance()->broadcastPacket($player->getViewers(), $pk); - $player->dataPacket($pk); + if($packet instanceof InventoryTransactionPacket && $packet->transactionType === InventoryTransactionPacket::TYPE_USE_ITEM_ON_ENTITY){ + $boat = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); + if($boat instanceof BoatEntity){ + $pk = new SetEntityLinkPacket(); + $pk->link = new EntityLink($player->getId(), $boat->getId(), EntityLink::TYPE_RIDER); + Server::getInstance()->broadcastPacket($player->getViewers(), $pk); + $player->dataPacket($pk); - $this->riding[$player->getName()] = $packet->trData->entityRuntimeId; - } + $this->riding[$player->getName()] = $packet->trData->entityRuntimeId; } - }elseif($packet instanceof InteractPacket){ + }elseif($packet instanceof InteractPacket && $packet->action === InteractPacket::ACTION_LEAVE_VEHICLE){ $boat = $player->getLevel()->getEntity($packet->target); if($boat instanceof BoatEntity){ - if($packet->action === InteractPacket::ACTION_LEAVE_VEHICLE){ - $pk = new SetEntityLinkPacket(); - $pk->link = new EntityLink($player->getId(), $boat->getId(), EntityLink::TYPE_REMOVE); - Server::getInstance()->broadcastPacket($player->getViewers(), $pk); - $player->dataPacket($pk); + $pk = new SetEntityLinkPacket(); + $pk->link = new EntityLink($player->getId(), $boat->getId(), EntityLink::TYPE_REMOVE); + Server::getInstance()->broadcastPacket($player->getViewers(), $pk); + $player->dataPacket($pk); - if(isset($this->riding[$event->getPlayer()->getName()])){ - unset($this->riding[$event->getPlayer()->getName()]); - } + if(isset($this->riding[$event->getPlayer()->getName()])){ + unset($this->riding[$event->getPlayer()->getName()]); } } }elseif($packet instanceof MovePlayerPacket){ From e0530f44f64a4c197def188bff5514d95ec1d61f Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 18:34:46 +0900 Subject: [PATCH 31/68] EventListener : Handle MoveEntityAbsolutePacket instead of MovePlayerPacket --- src/onebone/boat/listener/EventListener.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index 75a4a5f..94ae9e4 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -7,7 +7,7 @@ use pocketmine\event\player\PlayerQuitEvent; use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\network\mcpe\protocol\{ - InteractPacket, InventoryTransactionPacket, MovePlayerPacket, SetEntityLinkPacket + InteractPacket, InventoryTransactionPacket, MoveEntityAbsolutePacket, SetEntityLinkPacket }; use pocketmine\network\mcpe\protocol\types\EntityLink; use pocketmine\Server; @@ -46,11 +46,11 @@ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ unset($this->riding[$event->getPlayer()->getName()]); } } - }elseif($packet instanceof MovePlayerPacket){ + }elseif($packet instanceof MoveEntityAbsolutePacket){ if(isset($this->riding[$player->getName()])){ $boat = $player->getLevel()->getEntity($this->riding[$player->getName()]); if($boat instanceof BoatEntity){ - $boat->teleport($packet->position); + $boat->teleport($packet->position, $packet->xRot, $packet->zRot); } } } From b31a6e2f48033d64ff44b43ea6e214457bfb02b4 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 18:39:34 +0900 Subject: [PATCH 32/68] EventListener : Replace rider and vehicle --- src/onebone/boat/listener/EventListener.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index 94ae9e4..db2a39a 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -28,7 +28,7 @@ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ $boat = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); if($boat instanceof BoatEntity){ $pk = new SetEntityLinkPacket(); - $pk->link = new EntityLink($player->getId(), $boat->getId(), EntityLink::TYPE_RIDER); + $pk->link = new EntityLink($boat->getId(), $player->getId(), EntityLink::TYPE_RIDER); Server::getInstance()->broadcastPacket($player->getViewers(), $pk); $player->dataPacket($pk); @@ -38,7 +38,7 @@ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ $boat = $player->getLevel()->getEntity($packet->target); if($boat instanceof BoatEntity){ $pk = new SetEntityLinkPacket(); - $pk->link = new EntityLink($player->getId(), $boat->getId(), EntityLink::TYPE_REMOVE); + $pk->link = new EntityLink($boat->getId(), $player->getId(), EntityLink::TYPE_REMOVE); Server::getInstance()->broadcastPacket($player->getViewers(), $pk); $player->dataPacket($pk); From 53afafb902b6d1d7535670534a4f3242200e5675 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 18:39:49 +0900 Subject: [PATCH 33/68] EventListener : Ready to handle PlayerInputPacket --- src/onebone/boat/listener/EventListener.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index db2a39a..9b505ad 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -7,7 +7,7 @@ use pocketmine\event\player\PlayerQuitEvent; use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\network\mcpe\protocol\{ - InteractPacket, InventoryTransactionPacket, MoveEntityAbsolutePacket, SetEntityLinkPacket + InteractPacket, InventoryTransactionPacket, MoveEntityAbsolutePacket, PlayerInputPacket, SetEntityLinkPacket }; use pocketmine\network\mcpe\protocol\types\EntityLink; use pocketmine\Server; @@ -53,6 +53,10 @@ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ $boat->teleport($packet->position, $packet->xRot, $packet->zRot); } } + }elseif($packet instanceof PlayerInputPacket){ + if(isset($this->riding[$player->getName()])){ + //TODO: Handle PlayerInputPacket + } } } } \ No newline at end of file From 742f21315f820d1d067e8743cd162ed1cbf7b888 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 18:42:22 +0900 Subject: [PATCH 34/68] EventListener : Cancel event of data packets --- src/onebone/boat/listener/EventListener.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index 9b505ad..24808e1 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -33,6 +33,7 @@ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ $player->dataPacket($pk); $this->riding[$player->getName()] = $packet->trData->entityRuntimeId; + $event->setCancelled(); } }elseif($packet instanceof InteractPacket && $packet->action === InteractPacket::ACTION_LEAVE_VEHICLE){ $boat = $player->getLevel()->getEntity($packet->target); @@ -45,17 +46,20 @@ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ if(isset($this->riding[$event->getPlayer()->getName()])){ unset($this->riding[$event->getPlayer()->getName()]); } + $event->setCancelled(); } }elseif($packet instanceof MoveEntityAbsolutePacket){ if(isset($this->riding[$player->getName()])){ $boat = $player->getLevel()->getEntity($this->riding[$player->getName()]); if($boat instanceof BoatEntity){ $boat->teleport($packet->position, $packet->xRot, $packet->zRot); + $event->setCancelled(); } } }elseif($packet instanceof PlayerInputPacket){ if(isset($this->riding[$player->getName()])){ //TODO: Handle PlayerInputPacket + $event->setCancelled(); } } } From 6bd385eb94c369459332c4564644970a32608f3d Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 20:18:24 +0900 Subject: [PATCH 35/68] BoatItem : Remove unused method canBeActivated() --- src/onebone/boat/item/Boat.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/onebone/boat/item/Boat.php b/src/onebone/boat/item/Boat.php index edd68c0..11557fa 100644 --- a/src/onebone/boat/item/Boat.php +++ b/src/onebone/boat/item/Boat.php @@ -11,10 +11,6 @@ use pocketmine\Player; class Boat extends BoatItemPM{ - public function canBeActivated() : bool{ - return true; - } - public function onActivate(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : bool{ $boat = new BoatEntity($player->getLevel(), BoatEntity::createBaseNBT($blockClicked->getSide($face))); $boat->spawnToAll(); From 50cbcf030cbaca8193d1aa51bd9217fd2699d7d4 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 20:19:04 +0900 Subject: [PATCH 36/68] BoatItem : Prevent reduce item when player is creative --- src/onebone/boat/item/Boat.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/onebone/boat/item/Boat.php b/src/onebone/boat/item/Boat.php index 11557fa..4c89723 100644 --- a/src/onebone/boat/item/Boat.php +++ b/src/onebone/boat/item/Boat.php @@ -15,11 +15,13 @@ public function onActivate(Player $player, Block $blockReplace, Block $blockClic $boat = new BoatEntity($player->getLevel(), BoatEntity::createBaseNBT($blockClicked->getSide($face))); $boat->spawnToAll(); - $item = $player->getInventory()->getItemInHand(); - if(--$item->count <= 0){ - $player->getInventory()->setItemInHand(Item::get(Item::AIR)); - }else{ - $player->getInventory()->setItemInHand($item); + if(!$player->isCreative()){ + $item = $player->getInventory()->getItemInHand(); + if(--$item->count <= 0){ + $player->getInventory()->setItemInHand(Item::get(Item::AIR)); + }else{ + $player->getInventory()->setItemInHand($item); + } } return true; } From 3eeee6d9f2e04de01fbc99cc97fcf4a3f3822ecd Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 20:22:30 +0900 Subject: [PATCH 37/68] BoatItem : Spawn boat on center --- src/onebone/boat/item/Boat.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebone/boat/item/Boat.php b/src/onebone/boat/item/Boat.php index 4c89723..238e3c0 100644 --- a/src/onebone/boat/item/Boat.php +++ b/src/onebone/boat/item/Boat.php @@ -12,7 +12,7 @@ class Boat extends BoatItemPM{ public function onActivate(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : bool{ - $boat = new BoatEntity($player->getLevel(), BoatEntity::createBaseNBT($blockClicked->getSide($face))); + $boat = new BoatEntity($player->getLevel(), BoatEntity::createBaseNBT($blockClicked->getSide($face)->add(0.5, 0.5, 0.5))); $boat->spawnToAll(); if(!$player->isCreative()){ From 90778afe0ada02732671839980998ec03eb08eba Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 20:53:52 +0900 Subject: [PATCH 38/68] EventListener : Cancel all interact to boat --- src/onebone/boat/listener/EventListener.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index 24808e1..80bab7d 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -35,16 +35,18 @@ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ $this->riding[$player->getName()] = $packet->trData->entityRuntimeId; $event->setCancelled(); } - }elseif($packet instanceof InteractPacket && $packet->action === InteractPacket::ACTION_LEAVE_VEHICLE){ + }elseif($packet instanceof InteractPacket){ $boat = $player->getLevel()->getEntity($packet->target); if($boat instanceof BoatEntity){ - $pk = new SetEntityLinkPacket(); - $pk->link = new EntityLink($boat->getId(), $player->getId(), EntityLink::TYPE_REMOVE); - Server::getInstance()->broadcastPacket($player->getViewers(), $pk); - $player->dataPacket($pk); + if($packet->action === InteractPacket::ACTION_LEAVE_VEHICLE){ + $pk = new SetEntityLinkPacket(); + $pk->link = new EntityLink($boat->getId(), $player->getId(), EntityLink::TYPE_REMOVE); + Server::getInstance()->broadcastPacket($player->getViewers(), $pk); + $player->dataPacket($pk); - if(isset($this->riding[$event->getPlayer()->getName()])){ - unset($this->riding[$event->getPlayer()->getName()]); + if(isset($this->riding[$event->getPlayer()->getName()])){ + unset($this->riding[$event->getPlayer()->getName()]); + } } $event->setCancelled(); } From ee6192fab79700fa008522875159eba002fe2110 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 21:02:09 +0900 Subject: [PATCH 39/68] EventListener : Filter out transaction when is not interact action --- src/onebone/boat/listener/EventListener.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index 80bab7d..f4cc128 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -27,13 +27,15 @@ public function onPacketReceived(DataPacketReceiveEvent $event) : void{ if($packet instanceof InventoryTransactionPacket && $packet->transactionType === InventoryTransactionPacket::TYPE_USE_ITEM_ON_ENTITY){ $boat = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); if($boat instanceof BoatEntity){ - $pk = new SetEntityLinkPacket(); - $pk->link = new EntityLink($boat->getId(), $player->getId(), EntityLink::TYPE_RIDER); - Server::getInstance()->broadcastPacket($player->getViewers(), $pk); - $player->dataPacket($pk); + if($packet->trData->actionType === InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_INTERACT){ + $pk = new SetEntityLinkPacket(); + $pk->link = new EntityLink($boat->getId(), $player->getId(), EntityLink::TYPE_RIDER); + Server::getInstance()->broadcastPacket($player->getViewers(), $pk); + $player->dataPacket($pk); - $this->riding[$player->getName()] = $packet->trData->entityRuntimeId; - $event->setCancelled(); + $this->riding[$player->getName()] = $packet->trData->entityRuntimeId; + $event->setCancelled(); + } } }elseif($packet instanceof InteractPacket){ $boat = $player->getLevel()->getEntity($packet->target); From 9053449b17fb60efb6db9782dbced8468d1196ab Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 21:11:41 +0900 Subject: [PATCH 40/68] EventListener : Rename handle methods --- src/onebone/boat/listener/EventListener.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index f4cc128..d47c17a 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -15,13 +15,13 @@ class EventListener implements Listener{ private $riding = []; - public function onQuit(PlayerQuitEvent $event) : void{ + public function onPlayerQuitEvent(PlayerQuitEvent $event) : void{ if(isset($this->riding[$event->getPlayer()->getName()])){ unset($this->riding[$event->getPlayer()->getName()]); } } - public function onPacketReceived(DataPacketReceiveEvent $event) : void{ + public function onDataPacketReceiveEvent(DataPacketReceiveEvent $event) : void{ $packet = $event->getPacket(); $player = $event->getPlayer(); if($packet instanceof InventoryTransactionPacket && $packet->transactionType === InventoryTransactionPacket::TYPE_USE_ITEM_ON_ENTITY){ From b9a55c4813617fb03a2566a9636e6249ee85ba24 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 21:20:19 +0900 Subject: [PATCH 41/68] Add PHP DOCs --- src/onebone/boat/Main.php | 6 ++++++ src/onebone/boat/entity/Boat.php | 13 +++++++++++-- src/onebone/boat/item/Boat.php | 13 +++++++++++++ src/onebone/boat/listener/EventListener.php | 7 +++++++ 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index 1b74203..459d657 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -13,7 +13,11 @@ use pocketmine\plugin\PluginBase; class Main extends PluginBase{ + /** + * Called when the plugin is enabled + */ public function onEnable() : void{ + //Register boat items ItemFactory::registerItem(new BoatItem(), true); Item::addCreativeItem(new BoatItem()); $this->getServer()->getCraftingManager()->registerRecipe( @@ -25,8 +29,10 @@ public function onEnable() : void{ [Item::get(Item::BOAT, 0, 1)]) ); + //Register boat entities Entity::registerEntity(BoatEntity::class, true); + //Register event listeners $this->getServer()->getPluginManager()->registerEvents(new EventListener(), $this); } } diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index a5e13c6..d89835d 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -10,19 +10,25 @@ class Boat extends Entity{ const NETWORK_ID = 90; + /** @var float */ public $height = 0.455; + /** @var float */ public $width = 1.4; - public $gravity = 0; + /** @var float */ + public $gravity = 0.0; + /** @var float */ public $drag = 0.1; public function initEntity() : void{ $this->setMaxHealth(4); - //TODO: Set Entity::DATA_RIDER_SEAT_POSITION parent::initEntity(); } + /** + * @param EntityDamageEvent $source + */ public function attack(EntityDamageEvent $source) : void{ parent::attack($source); @@ -36,6 +42,9 @@ public function attack(EntityDamageEvent $source) : void{ } } + /** + * @return Item[] + */ public function getDrops() : array{ return [ Item::get(Item::BOAT, 0, 1) diff --git a/src/onebone/boat/item/Boat.php b/src/onebone/boat/item/Boat.php index 238e3c0..d86b143 100644 --- a/src/onebone/boat/item/Boat.php +++ b/src/onebone/boat/item/Boat.php @@ -11,10 +11,23 @@ use pocketmine\Player; class Boat extends BoatItemPM{ + /** + * Called when a player uses this item on a block. + * + * @param Player $player + * @param Block $blockReplace + * @param Block $blockClicked + * @param int $face + * @param Vector3 $clickVector + * + * @return bool + */ public function onActivate(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : bool{ + //Spawn boat entity $boat = new BoatEntity($player->getLevel(), BoatEntity::createBaseNBT($blockClicked->getSide($face)->add(0.5, 0.5, 0.5))); $boat->spawnToAll(); + //Reduce boat item count if(!$player->isCreative()){ $item = $player->getInventory()->getItemInHand(); if(--$item->count <= 0){ diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index d47c17a..a73f131 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -13,14 +13,21 @@ use pocketmine\Server; class EventListener implements Listener{ + /** @var int[] */ private $riding = []; + /** + * @param PlayerQuitEvent $event + */ public function onPlayerQuitEvent(PlayerQuitEvent $event) : void{ if(isset($this->riding[$event->getPlayer()->getName()])){ unset($this->riding[$event->getPlayer()->getName()]); } } + /** + * @param DataPacketReceiveEvent $event + */ public function onDataPacketReceiveEvent(DataPacketReceiveEvent $event) : void{ $packet = $event->getPacket(); $player = $event->getPlayer(); From 3d25519539d55d388e5f004eda3a78a072f02b83 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 21:22:54 +0900 Subject: [PATCH 42/68] BoatEntity : Set visibiliy of NETWORK_ID and use constant --- src/onebone/boat/entity/Boat.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index d89835d..7dc1257 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -8,7 +8,7 @@ use pocketmine\network\mcpe\protocol\EntityEventPacket; class Boat extends Entity{ - const NETWORK_ID = 90; + public const NETWORK_ID = self::BOAT; /** @var float */ public $height = 0.455; From 264d7789bfa495d98444dd0ef2a11ddbe0f65402 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 23:46:58 +0900 Subject: [PATCH 43/68] Support boat wood type --- src/onebone/boat/entity/Boat.php | 32 +++++++++++++++++++++++++++++-- src/onebone/boat/item/Boat.php | 33 +++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index 7dc1257..6ab7ec8 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -2,6 +2,8 @@ namespace onebone\boat\entity; +use onebone\boat\item\Boat as BoatItem; +use pocketmine\block\Planks; use pocketmine\entity\Entity; use pocketmine\event\entity\EntityDamageEvent; use pocketmine\item\Item; @@ -10,6 +12,8 @@ class Boat extends Entity{ public const NETWORK_ID = self::BOAT; + public const TAG_WOOD_ID = "WoodID"; + /** @var float */ public $height = 0.455; /** @var float */ @@ -21,9 +25,19 @@ class Boat extends Entity{ public $drag = 0.1; public function initEntity() : void{ + parent::initEntity(); + + $woodId = $this->namedtag->getInt(self::TAG_WOOD_ID, Planks::OAK); + if($woodId > 5 || $woodId < 0){ + $woodId = Planks::OAK; + } + $this->setWoodId($woodId); $this->setMaxHealth(4); + } - parent::initEntity(); + public function saveNBT() : void{ + parent::saveNBT(); + $this->namedtag->setInt(self::TAG_WOOD_ID, $this->getWoodId()); } /** @@ -47,7 +61,21 @@ public function attack(EntityDamageEvent $source) : void{ */ public function getDrops() : array{ return [ - Item::get(Item::BOAT, 0, 1) + new BoatItem($this->getWoodId()) ]; } + + /** + * @return int + */ + public function getWoodId() : int{ + return $this->propertyManager->getInt(self::DATA_VARIANT); + } + + /** + * @param int $woodId + */ + public function setWoodId(int $woodId) : void{ + $this->propertyManager->setInt(self::DATA_VARIANT, $woodId); + } } diff --git a/src/onebone/boat/item/Boat.php b/src/onebone/boat/item/Boat.php index d86b143..95cb796 100644 --- a/src/onebone/boat/item/Boat.php +++ b/src/onebone/boat/item/Boat.php @@ -4,6 +4,7 @@ use onebone\boat\entity\Boat as BoatEntity; use pocketmine\block\Block; +use pocketmine\block\Planks; use pocketmine\item\{ Boat as BoatItemPM, Item }; @@ -11,6 +12,34 @@ use pocketmine\Player; class Boat extends BoatItemPM{ + /** + * BoatItem constructor. + * + * @param int $meta + */ + public function __construct(int $meta = 0){ + parent::__construct($meta); + + $this->name = $this->getVanillaName(); + } + + /** + * Returns the vanilla name of the item, disregarding custom names. + * + * @return string + */ + public function getVanillaName() : string{ + static $names = [ + Planks::OAK => "%item.boat.oak.name", + Planks::SPRUCE => "%item.boat.spruce.name", + Planks::BIRCH => "%item.boat.birch.name", + Planks::JUNGLE => "%item.boat.jungle.name", + Planks::ACACIA => "%item.boat.acacia.name", + Planks::DARK_OAK => "%item.boat.dark_oak.name", + ]; + return $names[$this->meta] ?? "Boat"; + } + /** * Called when a player uses this item on a block. * @@ -24,7 +53,9 @@ class Boat extends BoatItemPM{ */ public function onActivate(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : bool{ //Spawn boat entity - $boat = new BoatEntity($player->getLevel(), BoatEntity::createBaseNBT($blockClicked->getSide($face)->add(0.5, 0.5, 0.5))); + $nbt = BoatEntity::createBaseNBT($blockClicked->getSide($face)->add(0.5, 0.5, 0.5)); + $nbt->setInt(BoatEntity::TAG_WOOD_ID, $this->meta); + $boat = new BoatEntity($player->getLevel(), $nbt); $boat->spawnToAll(); //Reduce boat item count From da37e95c7eb9d936c5706c19debf69080484c8b0 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sat, 28 Jul 2018 23:50:12 +0900 Subject: [PATCH 44/68] Main : Remove addCreativeItem() is already exists --- src/onebone/boat/Main.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index 459d657..4967019 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -19,7 +19,6 @@ class Main extends PluginBase{ public function onEnable() : void{ //Register boat items ItemFactory::registerItem(new BoatItem(), true); - Item::addCreativeItem(new BoatItem()); $this->getServer()->getCraftingManager()->registerRecipe( new ShapelessRecipe( [ From 751cb4eb6505c67156bfb0b05540973e02b917ca Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sun, 29 Jul 2018 00:00:12 +0900 Subject: [PATCH 45/68] BoatEntity : Set stactable to true --- src/onebone/boat/entity/Boat.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index 6ab7ec8..0c49b29 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -33,6 +33,7 @@ public function initEntity() : void{ } $this->setWoodId($woodId); $this->setMaxHealth(4); + $this->setGenericFlag(self::DATA_FLAG_STACKABLE, true); } public function saveNBT() : void{ From 1e82675bb2858870a05bbe76a4a351595e8e5213 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sun, 29 Jul 2018 00:56:36 +0900 Subject: [PATCH 46/68] BoatItem : Fix logic of `Reduce boat item count` --- src/onebone/boat/item/Boat.php | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/onebone/boat/item/Boat.php b/src/onebone/boat/item/Boat.php index 95cb796..d4b0d23 100644 --- a/src/onebone/boat/item/Boat.php +++ b/src/onebone/boat/item/Boat.php @@ -3,11 +3,10 @@ namespace onebone\boat\item; use onebone\boat\entity\Boat as BoatEntity; -use pocketmine\block\Block; -use pocketmine\block\Planks; -use pocketmine\item\{ - Boat as BoatItemPM, Item +use pocketmine\block\{ + Block, Planks }; +use pocketmine\item\Boat as BoatItemPM; use pocketmine\math\Vector3; use pocketmine\Player; @@ -59,14 +58,7 @@ public function onActivate(Player $player, Block $blockReplace, Block $blockClic $boat->spawnToAll(); //Reduce boat item count - if(!$player->isCreative()){ - $item = $player->getInventory()->getItemInHand(); - if(--$item->count <= 0){ - $player->getInventory()->setItemInHand(Item::get(Item::AIR)); - }else{ - $player->getInventory()->setItemInHand($item); - } - } + --$this->count; return true; } } From 43356567526ade68f30a6279d9ec8d6195dfc5e5 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sun, 29 Jul 2018 01:13:37 +0900 Subject: [PATCH 47/68] =?UTF-8?q?BoatEntity=20:=20Regenerate=201=E2=81=841?= =?UTF-8?q?0=20per=20tick?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit According to https://minecraft.gamepedia.com/Boat#Behavior --- src/onebone/boat/entity/Boat.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index 0c49b29..ce151d8 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -6,6 +6,7 @@ use pocketmine\block\Planks; use pocketmine\entity\Entity; use pocketmine\event\entity\EntityDamageEvent; +use pocketmine\event\entity\EntityRegainHealthEvent; use pocketmine\item\Item; use pocketmine\network\mcpe\protocol\EntityEventPacket; @@ -57,6 +58,23 @@ public function attack(EntityDamageEvent $source) : void{ } } + /** + * @param int $currentTick + * + * @return bool + */ + public function onUpdate(int $currentTick) : bool{ + if($this->closed){ + return false; + } + + //Regenerate health 1⁄10 per tick + if($this->getHealth() < $this->getMaxHealth() && $currentTick % 10 === 0){ + $this->heal(new EntityRegainHealthEvent($this, 1, EntityRegainHealthEvent::CAUSE_REGEN)); + } + return parent::onUpdate($currentTick); + } + /** * @return Item[] */ From b4cdc8c1580a17d5f374077f1885f486a982721d Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sun, 29 Jul 2018 01:25:40 +0900 Subject: [PATCH 48/68] BoatEntity : Drop item when boat death, Use getDrops() --- src/onebone/boat/entity/Boat.php | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index ce151d8..c68f319 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -5,10 +5,12 @@ use onebone\boat\item\Boat as BoatItem; use pocketmine\block\Planks; use pocketmine\entity\Entity; -use pocketmine\event\entity\EntityDamageEvent; -use pocketmine\event\entity\EntityRegainHealthEvent; +use pocketmine\event\entity\{ + EntityDamageByEntityEvent, EntityDamageEvent, EntityRegainHealthEvent +}; use pocketmine\item\Item; use pocketmine\network\mcpe\protocol\EntityEventPacket; +use pocketmine\Player; class Boat extends Entity{ public const NETWORK_ID = self::BOAT; @@ -58,6 +60,20 @@ public function attack(EntityDamageEvent $source) : void{ } } + public function kill() : void{ + parent::kill(); + + if($this->lastDamageCause instanceof EntityDamageByEntityEvent){ + $damager = $this->lastDamageCause->getDamager(); + if($damager instanceof Player and $damager->isCreative()){ + return; + } + } + foreach($this->getDrops() as $item){ + $this->getLevel()->dropItem($this, $item); + } + } + /** * @param int $currentTick * From a7c39c760e4363c06b7fd650694380601726bf7c Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sun, 29 Jul 2018 01:32:10 +0900 Subject: [PATCH 49/68] EventListener : Ready to handle SetEntityMotionPacket --- src/onebone/boat/listener/EventListener.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index a73f131..473b93e 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -6,8 +6,9 @@ use pocketmine\event\Listener; use pocketmine\event\player\PlayerQuitEvent; use pocketmine\event\server\DataPacketReceiveEvent; +use pocketmine\math\Vector3; use pocketmine\network\mcpe\protocol\{ - InteractPacket, InventoryTransactionPacket, MoveEntityAbsolutePacket, PlayerInputPacket, SetEntityLinkPacket + InteractPacket, InventoryTransactionPacket, MoveEntityAbsolutePacket, PlayerInputPacket, SetEntityLinkPacket, SetEntityMotionPacket }; use pocketmine\network\mcpe\protocol\types\EntityLink; use pocketmine\Server; @@ -67,9 +68,9 @@ public function onDataPacketReceiveEvent(DataPacketReceiveEvent $event) : void{ $event->setCancelled(); } } - }elseif($packet instanceof PlayerInputPacket){ + }elseif($packet instanceof PlayerInputPacket || $packet instanceof SetEntityMotionPacket){ if(isset($this->riding[$player->getName()])){ - //TODO: Handle PlayerInputPacket + //TODO: Handle PlayerInputPacket and SetEntityMotionPacket $event->setCancelled(); } } From 0b71c99924a001d3bc6e102bc7d707d40f5ef38b Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sun, 29 Jul 2018 02:13:20 +0900 Subject: [PATCH 50/68] Move link methods to BoatEntity from EventListener --- src/onebone/boat/entity/Boat.php | 84 ++++++++++++++++++++- src/onebone/boat/listener/EventListener.php | 52 +++++-------- 2 files changed, 101 insertions(+), 35 deletions(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index c68f319..afa1792 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -3,14 +3,19 @@ namespace onebone\boat\entity; use onebone\boat\item\Boat as BoatItem; +use pocketmine\{ + math\Vector3, Player, Server +}; use pocketmine\block\Planks; use pocketmine\entity\Entity; use pocketmine\event\entity\{ EntityDamageByEntityEvent, EntityDamageEvent, EntityRegainHealthEvent }; use pocketmine\item\Item; -use pocketmine\network\mcpe\protocol\EntityEventPacket; -use pocketmine\Player; +use pocketmine\network\mcpe\protocol\{ + EntityEventPacket, SetEntityLinkPacket +}; +use pocketmine\network\mcpe\protocol\types\EntityLink; class Boat extends Entity{ public const NETWORK_ID = self::BOAT; @@ -27,6 +32,9 @@ class Boat extends Entity{ /** @var float */ public $drag = 0.1; + /** @var Entity */ + public $rider; + public function initEntity() : void{ parent::initEntity(); @@ -113,4 +121,76 @@ public function getWoodId() : int{ public function setWoodId(int $woodId) : void{ $this->propertyManager->setInt(self::DATA_VARIANT, $woodId); } + + /** + * @param Entity $rider + * + * @return bool + */ + public function canLink(Entity $rider) : bool{ + return $this->rider === null; + } + + /** + * @param Entity $rider + * + * @return bool + */ + public function link(Entity $rider) : bool{ + if($this->rider === null){ + $rider->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_RIDING, true); + + $pk = new SetEntityLinkPacket(); + $pk->link = new EntityLink($this->getId(), $rider->getId(), EntityLink::TYPE_RIDER); + Server::getInstance()->broadcastPacket($this->getViewers(), $pk); + + $this->rider = $rider; + return true; + } + return false; + } + + /** + * @param Entity $rider + * + * @return bool + */ + public function unlink(Entity $rider) : bool{ + if($this->rider === $rider){ + $rider->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_RIDING, false); + + $pk = new SetEntityLinkPacket(); + $pk->link = new EntityLink($this->getId(), $rider->getId(), EntityLink::TYPE_REMOVE); + Server::getInstance()->broadcastPacket($this->getViewers(), $pk); + + $this->rider = null; + return true; + } + return false; + } + + /** + * @param Vector3 $pos + * @param float|null $yaw + * @param float|null $pitch + */ + public function absoluteMove(Vector3 $pos, ?float $yaw = null, ?float $pitch = null) : void{ + $this->teleport($pos, $yaw, $pitch); + } + + /** + * @return null|Entity + */ + public function getRider() : ?Entity{ + return $this->rider; + } + + /** + * @param Entity $rider + * + * @return bool + */ + public function isRider(Entity $rider) : bool{ + return $this->rider === $rider; + } } diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index 473b93e..d247b3f 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -3,26 +3,26 @@ namespace onebone\boat\listener; use onebone\boat\entity\Boat as BoatEntity; +use pocketmine\entity\Entity; use pocketmine\event\Listener; use pocketmine\event\player\PlayerQuitEvent; use pocketmine\event\server\DataPacketReceiveEvent; -use pocketmine\math\Vector3; use pocketmine\network\mcpe\protocol\{ - InteractPacket, InventoryTransactionPacket, MoveEntityAbsolutePacket, PlayerInputPacket, SetEntityLinkPacket, SetEntityMotionPacket + InteractPacket, InventoryTransactionPacket, MoveEntityAbsolutePacket, PlayerInputPacket, SetEntityMotionPacket }; -use pocketmine\network\mcpe\protocol\types\EntityLink; -use pocketmine\Server; class EventListener implements Listener{ - /** @var int[] */ - private $riding = []; - /** * @param PlayerQuitEvent $event */ public function onPlayerQuitEvent(PlayerQuitEvent $event) : void{ - if(isset($this->riding[$event->getPlayer()->getName()])){ - unset($this->riding[$event->getPlayer()->getName()]); + $player = $event->getPlayer(); + if($player->getDataFlag(Entity::DATA_FLAGS, Entity::DATA_FLAG_RIDING)){ + foreach($player->getLevel()->getNearbyEntities($player->getBoundingBox()->expand(2, 2, 2), $player) as $key => $entity){ + if($entity instanceof BoatEntity && $entity->unlink($player)){ + return; + } + } } } @@ -35,41 +35,27 @@ public function onDataPacketReceiveEvent(DataPacketReceiveEvent $event) : void{ if($packet instanceof InventoryTransactionPacket && $packet->transactionType === InventoryTransactionPacket::TYPE_USE_ITEM_ON_ENTITY){ $boat = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); if($boat instanceof BoatEntity){ - if($packet->trData->actionType === InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_INTERACT){ - $pk = new SetEntityLinkPacket(); - $pk->link = new EntityLink($boat->getId(), $player->getId(), EntityLink::TYPE_RIDER); - Server::getInstance()->broadcastPacket($player->getViewers(), $pk); - $player->dataPacket($pk); - - $this->riding[$player->getName()] = $packet->trData->entityRuntimeId; - $event->setCancelled(); + if($packet->trData->actionType === InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_INTERACT && $boat->canLink($player)){ + $boat->link($player); } + $event->setCancelled(); } }elseif($packet instanceof InteractPacket){ $boat = $player->getLevel()->getEntity($packet->target); if($boat instanceof BoatEntity){ - if($packet->action === InteractPacket::ACTION_LEAVE_VEHICLE){ - $pk = new SetEntityLinkPacket(); - $pk->link = new EntityLink($boat->getId(), $player->getId(), EntityLink::TYPE_REMOVE); - Server::getInstance()->broadcastPacket($player->getViewers(), $pk); - $player->dataPacket($pk); - - if(isset($this->riding[$event->getPlayer()->getName()])){ - unset($this->riding[$event->getPlayer()->getName()]); - } + if($packet->action === InteractPacket::ACTION_LEAVE_VEHICLE && $boat->isRider($player)){ + $boat->unlink($player); } $event->setCancelled(); } }elseif($packet instanceof MoveEntityAbsolutePacket){ - if(isset($this->riding[$player->getName()])){ - $boat = $player->getLevel()->getEntity($this->riding[$player->getName()]); - if($boat instanceof BoatEntity){ - $boat->teleport($packet->position, $packet->xRot, $packet->zRot); - $event->setCancelled(); - } + $boat = $player->getLevel()->getEntity($packet->entityRuntimeId); + if($boat instanceof BoatEntity && $boat->isRider($player)){ + $boat->absoluteMove($packet->position, $packet->xRot, $packet->zRot); + $event->setCancelled(); } }elseif($packet instanceof PlayerInputPacket || $packet instanceof SetEntityMotionPacket){ - if(isset($this->riding[$player->getName()])){ + if($player->getDataFlag(Entity::DATA_FLAGS, Entity::DATA_FLAG_RIDING)){ //TODO: Handle PlayerInputPacket and SetEntityMotionPacket $event->setCancelled(); } From b98a758bbdfb732b4c870f39f632e63132cdd3dd Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sun, 29 Jul 2018 02:20:51 +0900 Subject: [PATCH 51/68] BoatEntity : Not teleport when absoluteMove() --- src/onebone/boat/entity/Boat.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index afa1792..77095d1 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -175,7 +175,9 @@ public function unlink(Entity $rider) : bool{ * @param float|null $pitch */ public function absoluteMove(Vector3 $pos, ?float $yaw = null, ?float $pitch = null) : void{ - $this->teleport($pos, $yaw, $pitch); + $this->setComponents($pos->x, $pos->y, $pos->z); + $this->setRotation($yaw, $pitch); + $this->updateMovement(); } /** From b27fabff5e18aafa8f92aa630c1cb2d8d73fc9de Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sun, 29 Jul 2018 02:21:14 +0900 Subject: [PATCH 52/68] EventListener : Rename $boat to $entity --- src/onebone/boat/listener/EventListener.php | 22 ++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index d247b3f..140796e 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -33,25 +33,25 @@ public function onDataPacketReceiveEvent(DataPacketReceiveEvent $event) : void{ $packet = $event->getPacket(); $player = $event->getPlayer(); if($packet instanceof InventoryTransactionPacket && $packet->transactionType === InventoryTransactionPacket::TYPE_USE_ITEM_ON_ENTITY){ - $boat = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); - if($boat instanceof BoatEntity){ - if($packet->trData->actionType === InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_INTERACT && $boat->canLink($player)){ - $boat->link($player); + $entity = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); + if($entity instanceof BoatEntity){ + if($packet->trData->actionType === InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_INTERACT && $entity->canLink($player)){ + $entity->link($player); } $event->setCancelled(); } }elseif($packet instanceof InteractPacket){ - $boat = $player->getLevel()->getEntity($packet->target); - if($boat instanceof BoatEntity){ - if($packet->action === InteractPacket::ACTION_LEAVE_VEHICLE && $boat->isRider($player)){ - $boat->unlink($player); + $entity = $player->getLevel()->getEntity($packet->target); + if($entity instanceof BoatEntity){ + if($packet->action === InteractPacket::ACTION_LEAVE_VEHICLE && $entity->isRider($player)){ + $entity->unlink($player); } $event->setCancelled(); } }elseif($packet instanceof MoveEntityAbsolutePacket){ - $boat = $player->getLevel()->getEntity($packet->entityRuntimeId); - if($boat instanceof BoatEntity && $boat->isRider($player)){ - $boat->absoluteMove($packet->position, $packet->xRot, $packet->zRot); + $entity = $player->getLevel()->getEntity($packet->entityRuntimeId); + if($entity instanceof BoatEntity && $entity->isRider($player)){ + $entity->absoluteMove($packet->position, $packet->xRot, $packet->zRot); $event->setCancelled(); } }elseif($packet instanceof PlayerInputPacket || $packet instanceof SetEntityMotionPacket){ From 06252318383de66efbec6ff7f05c710238c3911c Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sun, 29 Jul 2018 02:29:23 +0900 Subject: [PATCH 53/68] BoatEntity : Lock the rider rotation -90 to 90 --- src/onebone/boat/entity/Boat.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index 77095d1..d03374e 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -140,6 +140,12 @@ public function link(Entity $rider) : bool{ if($this->rider === null){ $rider->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_RIDING, true); + //Lock the rider rotation -90 to 90 + $rider->getDataPropertyManager()->setByte(self::DATA_RIDER_ROTATION_LOCKED, true); + $rider->getDataPropertyManager()->setFloat(self::DATA_RIDER_MAX_ROTATION, 90); + $rider->getDataPropertyManager()->setFloat(self::DATA_RIDER_MIN_ROTATION, -90); + + //Link entity to boat $pk = new SetEntityLinkPacket(); $pk->link = new EntityLink($this->getId(), $rider->getId(), EntityLink::TYPE_RIDER); Server::getInstance()->broadcastPacket($this->getViewers(), $pk); @@ -159,6 +165,10 @@ public function unlink(Entity $rider) : bool{ if($this->rider === $rider){ $rider->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_RIDING, false); + //Unlock the rider rotation + $rider->getDataPropertyManager()->setByte(self::DATA_RIDER_ROTATION_LOCKED, false); + + //Unlink entity from boat $pk = new SetEntityLinkPacket(); $pk->link = new EntityLink($this->getId(), $rider->getId(), EntityLink::TYPE_REMOVE); Server::getInstance()->broadcastPacket($this->getViewers(), $pk); From b07d4784bf431e68ebd2683269d5f881f9518ba0 Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sun, 29 Jul 2018 02:38:08 +0900 Subject: [PATCH 54/68] BoatEntity : Set the rider seat position to y + 1 --- src/onebone/boat/entity/Boat.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index d03374e..3abb05d 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -140,6 +140,9 @@ public function link(Entity $rider) : bool{ if($this->rider === null){ $rider->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_RIDING, true); + //Set the rider seat position to y + 1 + $rider->getDataPropertyManager()->setVector3(Entity::DATA_RIDER_SEAT_POSITION, new Vector3(0, 1, 0)); + //Lock the rider rotation -90 to 90 $rider->getDataPropertyManager()->setByte(self::DATA_RIDER_ROTATION_LOCKED, true); $rider->getDataPropertyManager()->setFloat(self::DATA_RIDER_MAX_ROTATION, 90); @@ -165,6 +168,9 @@ public function unlink(Entity $rider) : bool{ if($this->rider === $rider){ $rider->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_RIDING, false); + //Reset the rider seat position + $rider->getDataPropertyManager()->setVector3(Entity::DATA_RIDER_SEAT_POSITION, new Vector3(0, 0, 0)); + //Unlock the rider rotation $rider->getDataPropertyManager()->setByte(self::DATA_RIDER_ROTATION_LOCKED, false); From e1de9d83a4c275532aef8e301d84cc5358345aad Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sun, 29 Jul 2018 02:39:23 +0900 Subject: [PATCH 55/68] BoatEntity : Use Server::broadcastPacket() --- src/onebone/boat/entity/Boat.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index 3abb05d..ceba6e3 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -62,9 +62,7 @@ public function attack(EntityDamageEvent $source) : void{ $pk = new EntityEventPacket(); $pk->entityRuntimeId = $this->id; $pk->event = EntityEventPacket::HURT_ANIMATION; - foreach($this->getLevel()->getPlayers() as $player){ - $player->dataPacket($pk); - } + Server::getInstance()->broadcastPacket($this->getViewers(), $pk); } } From e1ba26ac9f0d0d85eb19d08b22d5fd3c5fa2fdee Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sun, 29 Jul 2018 02:41:21 +0900 Subject: [PATCH 56/68] BoatEntity : Not allow null on absoluteMove() $yaw, $pitch Supports default values instead --- src/onebone/boat/entity/Boat.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index ceba6e3..981a3ce 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -184,11 +184,11 @@ public function unlink(Entity $rider) : bool{ } /** - * @param Vector3 $pos - * @param float|null $yaw - * @param float|null $pitch + * @param Vector3 $pos + * @param float $yaw = 0 + * @param float $pitch = 0 */ - public function absoluteMove(Vector3 $pos, ?float $yaw = null, ?float $pitch = null) : void{ + public function absoluteMove(Vector3 $pos, float $yaw = 0, float $pitch = 0) : void{ $this->setComponents($pos->x, $pos->y, $pos->z); $this->setRotation($yaw, $pitch); $this->updateMovement(); From 9b46c50c14ba50743a07636de9d5aabb4b87088e Mon Sep 17 00:00:00 2001 From: PresentKim Date: Sun, 29 Jul 2018 02:55:31 +0900 Subject: [PATCH 57/68] EventListener : Fix an error that can't attack the boat --- src/onebone/boat/listener/EventListener.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index 140796e..2b55b22 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -35,10 +35,12 @@ public function onDataPacketReceiveEvent(DataPacketReceiveEvent $event) : void{ if($packet instanceof InventoryTransactionPacket && $packet->transactionType === InventoryTransactionPacket::TYPE_USE_ITEM_ON_ENTITY){ $entity = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); if($entity instanceof BoatEntity){ - if($packet->trData->actionType === InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_INTERACT && $entity->canLink($player)){ - $entity->link($player); + if($packet->trData->actionType === InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_INTERACT){ + if($entity->canLink($player)){ + $entity->link($player); + } + $event->setCancelled(); } - $event->setCancelled(); } }elseif($packet instanceof InteractPacket){ $entity = $player->getLevel()->getEntity($packet->target); From 2660e45b34a9a2d363508cbd729bb2184e4ec1cf Mon Sep 17 00:00:00 2001 From: Takuya Sawada Date: Fri, 28 Jun 2019 18:19:14 +0900 Subject: [PATCH 58/68] change base class of Boat class --- src/onebone/boat/entity/Boat.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index 981a3ce..8dcc157 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -8,6 +8,7 @@ }; use pocketmine\block\Planks; use pocketmine\entity\Entity; +use pocketmine\entity\Vehicle; use pocketmine\event\entity\{ EntityDamageByEntityEvent, EntityDamageEvent, EntityRegainHealthEvent }; @@ -17,7 +18,7 @@ }; use pocketmine\network\mcpe\protocol\types\EntityLink; -class Boat extends Entity{ +class Boat extends Vehicle{ public const NETWORK_ID = self::BOAT; public const TAG_WOOD_ID = "WoodID"; From 838475dca083e77543a15c3add3f64159db631b1 Mon Sep 17 00:00:00 2001 From: Takuya Sawada Date: Sun, 30 Jun 2019 10:25:48 +0900 Subject: [PATCH 59/68] handle AnimatePacket --- src/onebone/boat/entity/Boat.php | 24 ++++++++++++++++++++- src/onebone/boat/listener/EventListener.php | 17 +++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index 981a3ce..172d235 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -13,7 +13,7 @@ }; use pocketmine\item\Item; use pocketmine\network\mcpe\protocol\{ - EntityEventPacket, SetEntityLinkPacket + EntityEventPacket, SetEntityLinkPacket, AnimatePacket }; use pocketmine\network\mcpe\protocol\types\EntityLink; @@ -22,6 +22,11 @@ class Boat extends Entity{ public const TAG_WOOD_ID = "WoodID"; + public const ACTION_ROW_RIGHT = 128; + public const ACTION_ROW_LEFT = 129; + public const DATA_PADDLE_TIME_LEFT = 13; + public const DATA_PADDLE_TIME_RIGHT = 14; + /** @var float */ public $height = 0.455; /** @var float */ @@ -194,6 +199,23 @@ public function absoluteMove(Vector3 $pos, float $yaw = 0, float $pitch = 0) : v $this->updateMovement(); } + /** + * @param AnimatePacket $packet + */ + public function handleAnimatePacket(AnimatePacket $packet) : void{ + if($this->rider !== null){ + switch($packet->action){ + case self::ACTION_ROW_RIGHT: + $this->propertyManager->setFloat(self::DATA_PADDLE_TIME_RIGHT, $packet->float); + break; + + case self::ACTION_ROW_LEFT: + $this->propertyManager->setFloat(self::DATA_PADDLE_TIME_LEFT, $packet->float); + break; + } + } + } + /** * @return null|Entity */ diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index 2b55b22..6eb896e 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -8,7 +8,7 @@ use pocketmine\event\player\PlayerQuitEvent; use pocketmine\event\server\DataPacketReceiveEvent; use pocketmine\network\mcpe\protocol\{ - InteractPacket, InventoryTransactionPacket, MoveEntityAbsolutePacket, PlayerInputPacket, SetEntityMotionPacket + InteractPacket, InventoryTransactionPacket, MoveEntityAbsolutePacket, PlayerInputPacket, SetEntityMotionPacket, AnimatePacket }; class EventListener implements Listener{ @@ -56,6 +56,19 @@ public function onDataPacketReceiveEvent(DataPacketReceiveEvent $event) : void{ $entity->absoluteMove($packet->position, $packet->xRot, $packet->zRot); $event->setCancelled(); } + }elseif($packet instanceof AnimatePacket){ + foreach($player->getLevel()->getEntities() as $entity){ + if($entity instanceof BoatEntity && $entity->isRider($player)){ + switch($packet->action){ + case BoatEntity::ACTION_ROW_RIGHT: + case BoatEntity::ACTION_ROW_LEFT: + $entity->handleAnimatePacket($packet); + $event->setCancelled(); + break; + } + break; + } + } }elseif($packet instanceof PlayerInputPacket || $packet instanceof SetEntityMotionPacket){ if($player->getDataFlag(Entity::DATA_FLAGS, Entity::DATA_FLAG_RIDING)){ //TODO: Handle PlayerInputPacket and SetEntityMotionPacket @@ -63,4 +76,4 @@ public function onDataPacketReceiveEvent(DataPacketReceiveEvent $event) : void{ } } } -} \ No newline at end of file +} From 70cb24d8435234807e504d422fa38d90ebc47a7d Mon Sep 17 00:00:00 2001 From: Takuya Sawada Date: Tue, 2 Jul 2019 17:50:57 +0900 Subject: [PATCH 60/68] send entity link at boat spawning when boat has rider --- src/onebone/boat/entity/Boat.php | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index 981a3ce..adf7ee9 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -13,7 +13,7 @@ }; use pocketmine\item\Item; use pocketmine\network\mcpe\protocol\{ - EntityEventPacket, SetEntityLinkPacket + EntityEventPacket, SetEntityLinkPacket, AddEntityPacket }; use pocketmine\network\mcpe\protocol\types\EntityLink; @@ -66,6 +66,29 @@ public function attack(EntityDamageEvent $source) : void{ } } + /** + * Called by spawnTo() to send whatever packets needed to spawn the entity to the client. + * + * @param Player $player + * @override + */ + protected function sendSpawnPacket(Player $player) : void{ + $pk = new AddEntityPacket(); + $pk->entityRuntimeId = $this->getId(); + $pk->type = static::NETWORK_ID; + $pk->position = $this->asVector3(); + $pk->motion = $this->getMotion(); + $pk->yaw = $this->yaw; + $pk->headYaw = $this->yaw; //TODO + $pk->pitch = $this->pitch; + $pk->attributes = $this->attributeMap->getAll(); + $pk->metadata = $this->propertyManager->getAll(); + if($this->rider !== null){ + $pk->links[] = new EntityLink($this->getId(), $this->rider->getId(), EntityLink::TYPE_RIDER); + } + $player->dataPacket($pk); + } + public function kill() : void{ parent::kill(); From 62b5e61e7a3b381e5dfc1ed3baa1484e6b75b8f7 Mon Sep 17 00:00:00 2001 From: Takuya Sawada Date: Tue, 2 Jul 2019 18:45:17 +0900 Subject: [PATCH 61/68] blame my self!! remove duplicate definition (already defined in pmmp) --- src/onebone/boat/entity/Boat.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index ad80411..aafad7a 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -25,8 +25,6 @@ class Boat extends Vehicle{ public const ACTION_ROW_RIGHT = 128; public const ACTION_ROW_LEFT = 129; - public const DATA_PADDLE_TIME_LEFT = 13; - public const DATA_PADDLE_TIME_RIGHT = 14; /** @var float */ public $height = 0.455; From da376a1bd2e40c502c1d794612a584e83913f533 Mon Sep 17 00:00:00 2001 From: Song ki ho <44698603+GodVas@users.noreply.github.com> Date: Fri, 26 Feb 2021 14:59:38 +0900 Subject: [PATCH 62/68] Source updated successfully. --- src/onebone/boat/Main.php | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index 4967019..808085a 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -7,31 +7,25 @@ use onebone\boat\listener\EventListener; use pocketmine\entity\Entity; use pocketmine\inventory\ShapelessRecipe; -use pocketmine\item\{ - Item, ItemFactory -}; +use pocketmine\item\Item; +use pocketmine\item\ItemFactory; use pocketmine\plugin\PluginBase; class Main extends PluginBase{ - /** - * Called when the plugin is enabled - */ - public function onEnable() : void{ - //Register boat items - ItemFactory::registerItem(new BoatItem(), true); - $this->getServer()->getCraftingManager()->registerRecipe( - new ShapelessRecipe( - [ - Item::get(Item::WOODEN_PLANKS, 0, 5), - Item::get(Item::WOODEN_SHOVEL, 0, 1) - ], - [Item::get(Item::BOAT, 0, 1)]) - ); - //Register boat entities - Entity::registerEntity(BoatEntity::class, true); + public function onLoad(): void{ + Entity::registerEntity(BoatEntity::class, true); + ItemFactory::registerItem($item = new BoatItem(), true); + if (!Item::isCreativeItem($item)) + Item::addCreativeItem($item); + } - //Register event listeners + public function onEnable() : void{ + $this->getServer()->getCraftingManager()->registerShapelessRecipe(new ShapelessRecipe([ + Item::get(Item::WOODEN_PLANKS, 0, 5), + Item::get(Item::WOODEN_SHOVEL, 0, 1) + ], [Item::get(Item::BOAT, 0, 1)])) + ; $this->getServer()->getPluginManager()->registerEvents(new EventListener(), $this); } } From 25cf4ff938835b33ac6977084dd8630c08cafe8b Mon Sep 17 00:00:00 2001 From: Song ki ho <44698603+GodVas@users.noreply.github.com> Date: Fri, 26 Feb 2021 15:00:07 +0900 Subject: [PATCH 63/68] Source updated successfully. --- src/onebone/boat/Main.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index 808085a..041c101 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -20,12 +20,11 @@ public function onLoad(): void{ Item::addCreativeItem($item); } - public function onEnable() : void{ - $this->getServer()->getCraftingManager()->registerShapelessRecipe(new ShapelessRecipe([ + public function onEnable() : void{ + $this->getServer()->getCraftingManager()->registerShapelessRecipe(new ShapelessRecipe([ Item::get(Item::WOODEN_PLANKS, 0, 5), Item::get(Item::WOODEN_SHOVEL, 0, 1) - ], [Item::get(Item::BOAT, 0, 1)])) - ; - $this->getServer()->getPluginManager()->registerEvents(new EventListener(), $this); - } + ], [Item::get(Item::BOAT, 0, 1)])); + $this->getServer()->getPluginManager()->registerEvents(new EventListener(), $this); + } } From 6c2d02dfe72ce9a6ea2b07b2c4c09886f5384276 Mon Sep 17 00:00:00 2001 From: Song ki ho <44698603+GodVas@users.noreply.github.com> Date: Fri, 26 Feb 2021 15:01:33 +0900 Subject: [PATCH 64/68] Source updated successfully. --- src/onebone/boat/Main.php | 11 +- src/onebone/boat/entity/Boat.php | 135 ++++++-------------- src/onebone/boat/item/Boat.php | 31 +---- src/onebone/boat/listener/EventListener.php | 124 +++++++++--------- 4 files changed, 113 insertions(+), 188 deletions(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index 041c101..808085a 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -20,11 +20,12 @@ public function onLoad(): void{ Item::addCreativeItem($item); } - public function onEnable() : void{ - $this->getServer()->getCraftingManager()->registerShapelessRecipe(new ShapelessRecipe([ + public function onEnable() : void{ + $this->getServer()->getCraftingManager()->registerShapelessRecipe(new ShapelessRecipe([ Item::get(Item::WOODEN_PLANKS, 0, 5), Item::get(Item::WOODEN_SHOVEL, 0, 1) - ], [Item::get(Item::BOAT, 0, 1)])); - $this->getServer()->getPluginManager()->registerEvents(new EventListener(), $this); - } + ], [Item::get(Item::BOAT, 0, 1)])) + ; + $this->getServer()->getPluginManager()->registerEvents(new EventListener(), $this); + } } diff --git a/src/onebone/boat/entity/Boat.php b/src/onebone/boat/entity/Boat.php index aafad7a..a8b1c70 100644 --- a/src/onebone/boat/entity/Boat.php +++ b/src/onebone/boat/entity/Boat.php @@ -3,22 +3,23 @@ namespace onebone\boat\entity; use onebone\boat\item\Boat as BoatItem; -use pocketmine\{ - math\Vector3, Player, Server -}; +use pocketmine\network\mcpe\protocol\AddActorPacket; +use pocketmine\Player; +use pocketmine\Server; +use pocketmine\math\Vector3; use pocketmine\block\Planks; use pocketmine\entity\Entity; use pocketmine\entity\Vehicle; -use pocketmine\event\entity\{ - EntityDamageByEntityEvent, EntityDamageEvent, EntityRegainHealthEvent -}; -use pocketmine\item\Item; -use pocketmine\network\mcpe\protocol\{ - EntityEventPacket, SetEntityLinkPacket, AnimatePacket, AddEntityPacket -}; +use pocketmine\event\entity\EntityDamageByEntityEvent; +use pocketmine\event\entity\EntityDamageEvent; +use pocketmine\event\entity\EntityRegainHealthEvent; +use pocketmine\network\mcpe\protocol\ActorEventPacket; +use pocketmine\network\mcpe\protocol\SetActorLinkPacket; +use pocketmine\network\mcpe\protocol\AnimatePacket; use pocketmine\network\mcpe\protocol\types\EntityLink; class Boat extends Vehicle{ + public const NETWORK_ID = self::BOAT; public const TAG_WOOD_ID = "WoodID"; @@ -26,9 +27,8 @@ class Boat extends Vehicle{ public const ACTION_ROW_RIGHT = 128; public const ACTION_ROW_LEFT = 129; - /** @var float */ public $height = 0.455; - /** @var float */ + public $width = 1.4; /** @var float */ @@ -36,8 +36,8 @@ class Boat extends Vehicle{ /** @var float */ public $drag = 0.1; - /** @var Entity */ - public $rider; + public ?Entity $rider = null; + public function initEntity() : void{ parent::initEntity(); @@ -46,6 +46,7 @@ public function initEntity() : void{ if($woodId > 5 || $woodId < 0){ $woodId = Planks::OAK; } + $this->setWoodId($woodId); $this->setMaxHealth(4); $this->setGenericFlag(self::DATA_FLAG_STACKABLE, true); @@ -56,41 +57,30 @@ public function saveNBT() : void{ $this->namedtag->setInt(self::TAG_WOOD_ID, $this->getWoodId()); } - /** - * @param EntityDamageEvent $source - */ public function attack(EntityDamageEvent $source) : void{ parent::attack($source); if(!$source->isCancelled()){ - $pk = new EntityEventPacket(); + $pk = new ActorEventPacket(); $pk->entityRuntimeId = $this->id; - $pk->event = EntityEventPacket::HURT_ANIMATION; + $pk->event = ActorEventPacket::HURT_ANIMATION; Server::getInstance()->broadcastPacket($this->getViewers(), $pk); } } - /** - * Called by spawnTo() to send whatever packets needed to spawn the entity to the client. - * - * @param Player $player - * @override - */ protected function sendSpawnPacket(Player $player) : void{ - $pk = new AddEntityPacket(); - $pk->entityRuntimeId = $this->getId(); - $pk->type = static::NETWORK_ID; - $pk->position = $this->asVector3(); - $pk->motion = $this->getMotion(); - $pk->yaw = $this->yaw; - $pk->headYaw = $this->yaw; //TODO - $pk->pitch = $this->pitch; - $pk->attributes = $this->attributeMap->getAll(); - $pk->metadata = $this->propertyManager->getAll(); - if($this->rider !== null){ - $pk->links[] = new EntityLink($this->getId(), $this->rider->getId(), EntityLink::TYPE_RIDER); - } - $player->dataPacket($pk); + $pk = new AddActorPacket(); + $pk->type = "minecraft:boat"; + $pk->entityRuntimeId = $this->getId(); + $pk->position = $this->getPosition(); + $pk->motion = $this->getMotion(); + $pk->attributes = $this->getAttributeMap()->getAll(); + $pk->metadata = $this->getDataPropertyManager()->getAll(); + if ($this->rider !== null) { + $pk->links[] = new EntityLink($this->getId(), $this->rider->getId(), EntityLink::TYPE_RIDER, true, true); + } + + $player->sendDataPacket($pk); } public function kill() : void{ @@ -107,123 +97,78 @@ public function kill() : void{ } } - /** - * @param int $currentTick - * - * @return bool - */ public function onUpdate(int $currentTick) : bool{ if($this->closed){ return false; } - //Regenerate health 1⁄10 per tick if($this->getHealth() < $this->getMaxHealth() && $currentTick % 10 === 0){ $this->heal(new EntityRegainHealthEvent($this, 1, EntityRegainHealthEvent::CAUSE_REGEN)); } + return parent::onUpdate($currentTick); } - /** - * @return Item[] - */ public function getDrops() : array{ return [ new BoatItem($this->getWoodId()) ]; } - /** - * @return int - */ public function getWoodId() : int{ return $this->propertyManager->getInt(self::DATA_VARIANT); } - /** - * @param int $woodId - */ public function setWoodId(int $woodId) : void{ $this->propertyManager->setInt(self::DATA_VARIANT, $woodId); } - /** - * @param Entity $rider - * - * @return bool - */ public function canLink(Entity $rider) : bool{ return $this->rider === null; } - /** - * @param Entity $rider - * - * @return bool - */ public function link(Entity $rider) : bool{ if($this->rider === null){ $rider->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_RIDING, true); - - //Set the rider seat position to y + 1 $rider->getDataPropertyManager()->setVector3(Entity::DATA_RIDER_SEAT_POSITION, new Vector3(0, 1, 0)); - - //Lock the rider rotation -90 to 90 $rider->getDataPropertyManager()->setByte(self::DATA_RIDER_ROTATION_LOCKED, true); $rider->getDataPropertyManager()->setFloat(self::DATA_RIDER_MAX_ROTATION, 90); $rider->getDataPropertyManager()->setFloat(self::DATA_RIDER_MIN_ROTATION, -90); - //Link entity to boat - $pk = new SetEntityLinkPacket(); - $pk->link = new EntityLink($this->getId(), $rider->getId(), EntityLink::TYPE_RIDER); + $pk = new SetActorLinkPacket(); + $pk->link = new EntityLink($this->getId(), $rider->getId(), EntityLink::TYPE_RIDER, true, true); Server::getInstance()->broadcastPacket($this->getViewers(), $pk); $this->rider = $rider; return true; } + return false; } - /** - * @param Entity $rider - * - * @return bool - */ public function unlink(Entity $rider) : bool{ if($this->rider === $rider){ $rider->setDataFlag(self::DATA_FLAGS, self::DATA_FLAG_RIDING, false); - - //Reset the rider seat position $rider->getDataPropertyManager()->setVector3(Entity::DATA_RIDER_SEAT_POSITION, new Vector3(0, 0, 0)); - - //Unlock the rider rotation $rider->getDataPropertyManager()->setByte(self::DATA_RIDER_ROTATION_LOCKED, false); - //Unlink entity from boat - $pk = new SetEntityLinkPacket(); - $pk->link = new EntityLink($this->getId(), $rider->getId(), EntityLink::TYPE_REMOVE); + $pk = new SetActorLinkPacket(); + $pk->link = new EntityLink($this->getId(), $rider->getId(), EntityLink::TYPE_REMOVE, true, true); Server::getInstance()->broadcastPacket($this->getViewers(), $pk); $this->rider = null; return true; } + return false; } - /** - * @param Vector3 $pos - * @param float $yaw = 0 - * @param float $pitch = 0 - */ public function absoluteMove(Vector3 $pos, float $yaw = 0, float $pitch = 0) : void{ $this->setComponents($pos->x, $pos->y, $pos->z); $this->setRotation($yaw, $pitch); $this->updateMovement(); } - /** - * @param AnimatePacket $packet - */ public function handleAnimatePacket(AnimatePacket $packet) : void{ if($this->rider !== null){ switch($packet->action){ @@ -238,18 +183,10 @@ public function handleAnimatePacket(AnimatePacket $packet) : void{ } } - /** - * @return null|Entity - */ public function getRider() : ?Entity{ return $this->rider; } - /** - * @param Entity $rider - * - * @return bool - */ public function isRider(Entity $rider) : bool{ return $this->rider === $rider; } diff --git a/src/onebone/boat/item/Boat.php b/src/onebone/boat/item/Boat.php index d4b0d23..84cbb99 100644 --- a/src/onebone/boat/item/Boat.php +++ b/src/onebone/boat/item/Boat.php @@ -11,22 +11,12 @@ use pocketmine\Player; class Boat extends BoatItemPM{ - /** - * BoatItem constructor. - * - * @param int $meta - */ + public function __construct(int $meta = 0){ parent::__construct($meta); - $this->name = $this->getVanillaName(); } - /** - * Returns the vanilla name of the item, disregarding custom names. - * - * @return string - */ public function getVanillaName() : string{ static $names = [ Planks::OAK => "%item.boat.oak.name", @@ -39,26 +29,15 @@ public function getVanillaName() : string{ return $names[$this->meta] ?? "Boat"; } - /** - * Called when a player uses this item on a block. - * - * @param Player $player - * @param Block $blockReplace - * @param Block $blockClicked - * @param int $face - * @param Vector3 $clickVector - * - * @return bool - */ public function onActivate(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : bool{ - //Spawn boat entity + if ($player->isSurvival()) { + $player->getInventory()->setItemInHand($this->pop()); + } + $nbt = BoatEntity::createBaseNBT($blockClicked->getSide($face)->add(0.5, 0.5, 0.5)); $nbt->setInt(BoatEntity::TAG_WOOD_ID, $this->meta); $boat = new BoatEntity($player->getLevel(), $nbt); $boat->spawnToAll(); - - //Reduce boat item count - --$this->count; return true; } } diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index 6eb896e..6404257 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -7,73 +7,81 @@ use pocketmine\event\Listener; use pocketmine\event\player\PlayerQuitEvent; use pocketmine\event\server\DataPacketReceiveEvent; -use pocketmine\network\mcpe\protocol\{ - InteractPacket, InventoryTransactionPacket, MoveEntityAbsolutePacket, PlayerInputPacket, SetEntityMotionPacket, AnimatePacket -}; +use pocketmine\network\mcpe\protocol\InteractPacket; +use pocketmine\network\mcpe\protocol\InventoryTransactionPacket; +use pocketmine\network\mcpe\protocol\MoveActorAbsolutePacket; +use pocketmine\network\mcpe\protocol\PlayerInputPacket; +use pocketmine\network\mcpe\protocol\SetActorMotionPacket; +use pocketmine\network\mcpe\protocol\AnimatePacket; class EventListener implements Listener{ - /** - * @param PlayerQuitEvent $event - */ + + /** @priority HIGHEST */ public function onPlayerQuitEvent(PlayerQuitEvent $event) : void{ $player = $event->getPlayer(); - if($player->getDataFlag(Entity::DATA_FLAGS, Entity::DATA_FLAG_RIDING)){ - foreach($player->getLevel()->getNearbyEntities($player->getBoundingBox()->expand(2, 2, 2), $player) as $key => $entity){ - if($entity instanceof BoatEntity && $entity->unlink($player)){ - return; - } - } - } + if (!$player->getDataFlag(Entity::DATA_FLAGS, Entity::DATA_FLAG_RIDING)) + return; + + foreach($player->getLevel()->getNearbyEntities($player->getBoundingBox()->expand(2, 2, 2), $player) as $key => $entity) { + if ($entity instanceof BoatEntity && $entity->unlink($player)) + return; + } } - /** - * @param DataPacketReceiveEvent $event - */ + /** @priority HIGHEST */ public function onDataPacketReceiveEvent(DataPacketReceiveEvent $event) : void{ $packet = $event->getPacket(); $player = $event->getPlayer(); - if($packet instanceof InventoryTransactionPacket && $packet->transactionType === InventoryTransactionPacket::TYPE_USE_ITEM_ON_ENTITY){ - $entity = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); - if($entity instanceof BoatEntity){ - if($packet->trData->actionType === InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_INTERACT){ - if($entity->canLink($player)){ - $entity->link($player); - } - $event->setCancelled(); - } - } - }elseif($packet instanceof InteractPacket){ - $entity = $player->getLevel()->getEntity($packet->target); - if($entity instanceof BoatEntity){ - if($packet->action === InteractPacket::ACTION_LEAVE_VEHICLE && $entity->isRider($player)){ - $entity->unlink($player); - } - $event->setCancelled(); - } - }elseif($packet instanceof MoveEntityAbsolutePacket){ - $entity = $player->getLevel()->getEntity($packet->entityRuntimeId); - if($entity instanceof BoatEntity && $entity->isRider($player)){ - $entity->absoluteMove($packet->position, $packet->xRot, $packet->zRot); - $event->setCancelled(); - } - }elseif($packet instanceof AnimatePacket){ - foreach($player->getLevel()->getEntities() as $entity){ - if($entity instanceof BoatEntity && $entity->isRider($player)){ - switch($packet->action){ - case BoatEntity::ACTION_ROW_RIGHT: - case BoatEntity::ACTION_ROW_LEFT: - $entity->handleAnimatePacket($packet); - $event->setCancelled(); - break; - } - break; - } - } - }elseif($packet instanceof PlayerInputPacket || $packet instanceof SetEntityMotionPacket){ - if($player->getDataFlag(Entity::DATA_FLAGS, Entity::DATA_FLAG_RIDING)){ - //TODO: Handle PlayerInputPacket and SetEntityMotionPacket - $event->setCancelled(); - } + if ($packet instanceof InventoryTransactionPacket) { + if ($packet->transactionType !== InventoryTransactionPacket::TYPE_USE_ITEM_ON_ENTITY) + return; + + $entity = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); + if (!$entity instanceof BoatEntity) + return; + + if ($packet->trData->actionType !== InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_INTERACT) + return; + + if($entity->canLink($player)){ + $entity->link($player); + } + + $event->setCancelled(); + } else if ($packet instanceof InteractPacket) { + $entity = $player->getLevel()->getEntity($packet->target); + if (!$entity instanceof BoatEntity) + return; + + if ($packet->action === InteractPacket::ACTION_LEAVE_VEHICLE && $entity->isRider($player)){ + $entity->unlink($player); + } + + $event->setCancelled(); + } else if ($packet instanceof MoveActorAbsolutePacket) { + $entity = $player->getLevel()->getEntity($packet->entityRuntimeId); + if ($entity instanceof BoatEntity && $entity->isRider($player)) { + $entity->absoluteMove($packet->position, $packet->xRot, $packet->zRot); + $event->setCancelled(); + } + } else if ($packet instanceof AnimatePacket) { + foreach ($player->getLevel()->getEntities() as $entity) { + if ($entity instanceof BoatEntity && $entity->isRider($player)){ + switch ($packet->action) { + case BoatEntity::ACTION_ROW_RIGHT: + case BoatEntity::ACTION_ROW_LEFT: + $entity->handleAnimatePacket($packet); + $event->setCancelled(); + break; + } + break; + } + } + } else if ($packet instanceof PlayerInputPacket or $packet instanceof SetActorMotionPacket) { + if (!$player->getDataFlag(Entity::DATA_FLAGS, Entity::DATA_FLAG_RIDING)) + return; + + $event->setCancelled(); } } } From 73b7f0b970d5965407c61645c488f42daad6ca1e Mon Sep 17 00:00:00 2001 From: Song ki ho <44698603+GodVas@users.noreply.github.com> Date: Fri, 26 Feb 2021 15:19:48 +0900 Subject: [PATCH 65/68] Modified the onload and onable parts. - [Remove] registerRecipe - [Change] Entity::registerEntity moved to onLoad method. - [Change] ItemFactory::registerItem moved to onLaod method. - [Add] Add items to the creative inventory. --- src/onebone/boat/Main.php | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php index 808085a..5ff57a8 100644 --- a/src/onebone/boat/Main.php +++ b/src/onebone/boat/Main.php @@ -12,20 +12,19 @@ use pocketmine\plugin\PluginBase; class Main extends PluginBase{ - - public function onLoad(): void{ - Entity::registerEntity(BoatEntity::class, true); - ItemFactory::registerItem($item = new BoatItem(), true); - if (!Item::isCreativeItem($item)) - Item::addCreativeItem($item); - } - + + public function onLoad(): void{ + Entity::registerEntity(BoatEntity::class, true); + ItemFactory::registerItem($item = new BoatItem(), true); + if (!Item::isCreativeItem($item)) + Item::addCreativeItem($item); + } + public function onEnable() : void{ $this->getServer()->getCraftingManager()->registerShapelessRecipe(new ShapelessRecipe([ - Item::get(Item::WOODEN_PLANKS, 0, 5), - Item::get(Item::WOODEN_SHOVEL, 0, 1) - ], [Item::get(Item::BOAT, 0, 1)])) - ; + Item::get(Item::WOODEN_PLANKS, 0, 5), + Item::get(Item::WOODEN_SHOVEL, 0, 1) + ], [Item::get(Item::BOAT, 0, 1)])); $this->getServer()->getPluginManager()->registerEvents(new EventListener(), $this); } } From df4e471645bf56095b096abd43a75cf5a2f93d73 Mon Sep 17 00:00:00 2001 From: Song ki ho <44698603+GodVas@users.noreply.github.com> Date: Fri, 26 Feb 2021 15:27:07 +0900 Subject: [PATCH 66/68] Source Alignment and Source Modified - [Change] SetEntityMotionPacket has been modified to SetActorMotionPacket. - [Change] MoveEntityAbsolutePacket has been modified to MoveActorAbsolutePacket. --- src/onebone/boat/listener/EventListener.php | 110 ++++++++++---------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index 6404257..135f80b 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -15,73 +15,73 @@ use pocketmine\network\mcpe\protocol\AnimatePacket; class EventListener implements Listener{ - - /** @priority HIGHEST */ + + /** @priority HIGHEST */ public function onPlayerQuitEvent(PlayerQuitEvent $event) : void{ $player = $event->getPlayer(); if (!$player->getDataFlag(Entity::DATA_FLAGS, Entity::DATA_FLAG_RIDING)) return; foreach($player->getLevel()->getNearbyEntities($player->getBoundingBox()->expand(2, 2, 2), $player) as $key => $entity) { - if ($entity instanceof BoatEntity && $entity->unlink($player)) - return; - } + if ($entity instanceof BoatEntity && $entity->unlink($player)) + return; + } } - - /** @priority HIGHEST */ + + /** @priority HIGHEST */ public function onDataPacketReceiveEvent(DataPacketReceiveEvent $event) : void{ $packet = $event->getPacket(); $player = $event->getPlayer(); if ($packet instanceof InventoryTransactionPacket) { - if ($packet->transactionType !== InventoryTransactionPacket::TYPE_USE_ITEM_ON_ENTITY) - return; - - $entity = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); - if (!$entity instanceof BoatEntity) - return; - - if ($packet->trData->actionType !== InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_INTERACT) - return; - - if($entity->canLink($player)){ - $entity->link($player); - } - - $event->setCancelled(); - } else if ($packet instanceof InteractPacket) { - $entity = $player->getLevel()->getEntity($packet->target); - if (!$entity instanceof BoatEntity) - return; - - if ($packet->action === InteractPacket::ACTION_LEAVE_VEHICLE && $entity->isRider($player)){ - $entity->unlink($player); - } - - $event->setCancelled(); - } else if ($packet instanceof MoveActorAbsolutePacket) { - $entity = $player->getLevel()->getEntity($packet->entityRuntimeId); - if ($entity instanceof BoatEntity && $entity->isRider($player)) { - $entity->absoluteMove($packet->position, $packet->xRot, $packet->zRot); - $event->setCancelled(); - } - } else if ($packet instanceof AnimatePacket) { - foreach ($player->getLevel()->getEntities() as $entity) { - if ($entity instanceof BoatEntity && $entity->isRider($player)){ - switch ($packet->action) { - case BoatEntity::ACTION_ROW_RIGHT: - case BoatEntity::ACTION_ROW_LEFT: - $entity->handleAnimatePacket($packet); - $event->setCancelled(); - break; - } - break; - } - } - } else if ($packet instanceof PlayerInputPacket or $packet instanceof SetActorMotionPacket) { - if (!$player->getDataFlag(Entity::DATA_FLAGS, Entity::DATA_FLAG_RIDING)) - return; + if ($packet->transactionType !== InventoryTransactionPacket::TYPE_USE_ITEM_ON_ENTITY) + return; + + $entity = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); + if (!$entity instanceof BoatEntity) + return; + + if ($packet->trData->actionType !== InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_INTERACT) + return; + + if($entity->canLink($player)){ + $entity->link($player); + } + + $event->setCancelled(); + } else if ($packet instanceof InteractPacket) { + $entity = $player->getLevel()->getEntity($packet->target); + if (!$entity instanceof BoatEntity) + return; + + if ($packet->action === InteractPacket::ACTION_LEAVE_VEHICLE && $entity->isRider($player)){ + $entity->unlink($player); + } - $event->setCancelled(); + $event->setCancelled(); + } else if ($packet instanceof MoveActorAbsolutePacket) { + $entity = $player->getLevel()->getEntity($packet->entityRuntimeId); + if ($entity instanceof BoatEntity && $entity->isRider($player)) { + $entity->absoluteMove($packet->position, $packet->xRot, $packet->zRot); + $event->setCancelled(); + } + } else if ($packet instanceof AnimatePacket) { + foreach ($player->getLevel()->getEntities() as $entity) { + if ($entity instanceof BoatEntity && $entity->isRider($player)){ + switch ($packet->action) { + case BoatEntity::ACTION_ROW_RIGHT: + case BoatEntity::ACTION_ROW_LEFT: + $entity->handleAnimatePacket($packet); + $event->setCancelled(); + break; + } + break; + } + } + } else if ($packet instanceof PlayerInputPacket or $packet instanceof SetActorMotionPacket) { + if (!$player->getDataFlag(Entity::DATA_FLAGS, Entity::DATA_FLAG_RIDING)) + return; + + $event->setCancelled(); } } } From f9ea5d834741c5ba7f2e6e3ad42900c24966a032 Mon Sep 17 00:00:00 2001 From: Song ki ho <44698603+GodVas@users.noreply.github.com> Date: Fri, 26 Feb 2021 15:29:56 +0900 Subject: [PATCH 67/68] Modified the part related to the item. --- src/onebone/boat/item/Boat.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/onebone/boat/item/Boat.php b/src/onebone/boat/item/Boat.php index 84cbb99..9ec737a 100644 --- a/src/onebone/boat/item/Boat.php +++ b/src/onebone/boat/item/Boat.php @@ -30,9 +30,9 @@ public function getVanillaName() : string{ } public function onActivate(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : bool{ - if ($player->isSurvival()) { - $player->getInventory()->setItemInHand($this->pop()); - } + if ($player->isSurvival()) { + $player->getInventory()->setItemInHand($this->pop()); + } $nbt = BoatEntity::createBaseNBT($blockClicked->getSide($face)->add(0.5, 0.5, 0.5)); $nbt->setInt(BoatEntity::TAG_WOOD_ID, $this->meta); From 0f58682d2c8316194d929832f598c0b2b585774f Mon Sep 17 00:00:00 2001 From: sky-min <81374952+sky-min@users.noreply.github.com> Date: Thu, 22 Jul 2021 12:50:05 +0900 Subject: [PATCH 68/68] update EventListener.php --- src/onebone/boat/listener/EventListener.php | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/onebone/boat/listener/EventListener.php b/src/onebone/boat/listener/EventListener.php index 135f80b..58df0ba 100644 --- a/src/onebone/boat/listener/EventListener.php +++ b/src/onebone/boat/listener/EventListener.php @@ -13,6 +13,7 @@ use pocketmine\network\mcpe\protocol\PlayerInputPacket; use pocketmine\network\mcpe\protocol\SetActorMotionPacket; use pocketmine\network\mcpe\protocol\AnimatePacket; +use pocketmine\network\mcpe\protocol\types\inventory\UseItemOnEntityTransactionData; class EventListener implements Listener{ @@ -33,15 +34,15 @@ public function onDataPacketReceiveEvent(DataPacketReceiveEvent $event) : void{ $packet = $event->getPacket(); $player = $event->getPlayer(); if ($packet instanceof InventoryTransactionPacket) { - if ($packet->transactionType !== InventoryTransactionPacket::TYPE_USE_ITEM_ON_ENTITY) - return; - - $entity = $player->getLevel()->getEntity($packet->trData->entityRuntimeId); - if (!$entity instanceof BoatEntity) - return; - - if ($packet->trData->actionType !== InventoryTransactionPacket::USE_ITEM_ON_ENTITY_ACTION_INTERACT) - return; + if ($packet->trData->getTypeId() !== InventoryTransactionPacket::TYPE_USE_ITEM_ON_ENTITY) + return; + + $entity = $player->getLevel()->getEntity($packet->trData->getEntityRuntimeId()); + if (!$entity instanceof BoatEntity) + return; + + if ($packet->trData->getActionType() !== UseItemOnEntityTransactionData::ACTION_INTERACT) + return; if($entity->canLink($player)){ $entity->link($player);