From 9ff09e7f0369e3c0ca371e5faa5cb763dff2c6d7 Mon Sep 17 00:00:00 2001 From: onebone Date: Fri, 14 Aug 2015 00:43:53 +0900 Subject: [PATCH] Initial commit --- plugin.yml | 5 ++ src/onebone/boat/Main.php | 90 +++++++++++++++++++ src/onebone/boat/entity/Boat.php | 65 ++++++++++++++ src/onebone/boat/item/Boat.php | 57 ++++++++++++ src/onebone/boat/packet/PlayerInputPacket.php | 47 ++++++++++ 5 files changed, 264 insertions(+) create mode 100644 plugin.yml create mode 100644 src/onebone/boat/Main.php create mode 100644 src/onebone/boat/entity/Boat.php create mode 100644 src/onebone/boat/item/Boat.php create mode 100644 src/onebone/boat/packet/PlayerInputPacket.php diff --git a/plugin.yml b/plugin.yml new file mode 100644 index 0000000..d1fa95e --- /dev/null +++ b/plugin.yml @@ -0,0 +1,5 @@ +name: Boat +main: onebone\boat\Main +version: "1.0" +author: onebone +api: [1.12.0] diff --git a/src/onebone/boat/Main.php b/src/onebone/boat/Main.php new file mode 100644 index 0000000..ca5947a --- /dev/null +++ b/src/onebone/boat/Main.php @@ -0,0 +1,90 @@ +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))); + + Entity::registerEntity("\\onebone\\boat\\entity\\Boat", true); + + $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 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->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 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 new file mode 100644 index 0000000..aec3a33 --- /dev/null +++ b/src/onebone/boat/entity/Boat.php @@ -0,0 +1,65 @@ +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); + + 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(); + + foreach($this->getDrops() as $item){ + $this->getLevel()->dropItem($this, $item); + } + } + + public function getDrops(){ + return [ + Item::get(333, 0, 1) + ]; + } + + 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 new file mode 100644 index 0000000..2b4c2ec --- /dev/null +++ b/src/onebone/boat/item/Boat.php @@ -0,0 +1,57 @@ +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; + } +} diff --git a/src/onebone/boat/packet/PlayerInputPacket.php b/src/onebone/boat/packet/PlayerInputPacket.php new file mode 100644 index 0000000..7633c90 --- /dev/null +++ b/src/onebone/boat/packet/PlayerInputPacket.php @@ -0,0 +1,47 @@ +motX = $this->getFloat(); + $this->motY = $this->getFloat(); + $flags = $this->getByte(); + $this->jumping = (($flags & 0x80) > 0); + $this->sneaking = (($flags & 0x40) > 0); + } + + public function encode(){ + + } + +}