diff --git a/src/API/PlayerAPI.php b/src/API/PlayerAPI.php index ba1f9e974..60659685d 100644 --- a/src/API/PlayerAPI.php +++ b/src/API/PlayerAPI.php @@ -261,6 +261,7 @@ class PlayerAPI{ "z" => $this->server->spawn["z"], ), "inventory" => array_fill(0, 36, array(0, 0, 0)), + "armor" => array(0, 0, 0, 0), "health" => 20, "lastIP" => "", "lastID" => 0, diff --git a/src/classes/Player.php b/src/classes/Player.php index f31956085..96eab8563 100644 --- a/src/classes/Player.php +++ b/src/classes/Player.php @@ -47,6 +47,7 @@ class Player{ var $spawned = false; var $inventory; var $equipment = array(1, 0); + var $armor = array(0, 0, 0, 0); var $loggedIn = false; function __construct(PocketMinecraftServer $server, $clientID, $ip, $port, $MTU){ $this->MTU = $MTU; @@ -187,6 +188,15 @@ class Player{ public function eventHandler($data, $event){ switch($event){ + case "player.armor": + if($data["eid"] === $this->eid){ + $data["eid"] = 0; + $this->armor = array($data["slot0"], $data["slot1"], $data["slot2"], $data["slot3"]); + $this->dataPacket(MC_SET_ARMOR, $data); + }else{ + $this->dataPacket(MC_SET_ARMOR, $data); + } + break; case "player.block.place": if($data["eid"] === $this->eid and $this->server->gamemode === 0){ $this->removeItem($data["original"][0], $data["original"][1], 1); @@ -437,6 +447,7 @@ class Player{ $this->data["inventory"] = $this->inventory; } $this->inventory = &$this->data["inventory"]; + $this->armor = &$this->data["armor"]; $this->data["lastIP"] = $this->ip; $this->data["lastID"] = $this->clientID; @@ -480,9 +491,11 @@ class Player{ $this->evid[] = $this->server->event("entity.event", array($this, "eventHandler")); $this->evid[] = $this->server->event("entity.metadata", array($this, "eventHandler")); $this->evid[] = $this->server->event("player.equipment.change", array($this, "eventHandler")); + $this->evid[] = $this->server->event("player.armor", array($this, "eventHandler")); $this->evid[] = $this->server->event("player.pickup", array($this, "eventHandler")); $this->evid[] = $this->server->event("block.change", array($this, "eventHandler")); $this->evid[] = $this->server->event("player.block.place", array($this, "eventHandler")); + $this->handle("player.armor", array("eid" => $this->eid, "slot0" => $this->armor[0], "slot1" => $this->armor[1], "slot2" => $this->armor[2], "slot3" => $this->armor[3])); console("[DEBUG] Player \"".$this->username."\" EID ".$this->eid." spawned at X ".$this->entity->x." Y ".$this->entity->y." Z ".$this->entity->z, true, true, 2); $this->eventHandler(new Container($this->server->motd), "server.chat"); if($this->MTU <= 548){ @@ -561,6 +574,10 @@ class Player{ } $this->server->handle("player.block.break", $data); break; + case MC_SET_ARMOR: + $data["eid"] = $this->eid; + $this->handle("player.armor", $data); + break; case MC_INTERACT: if(isset($this->server->entities[$data["target"]]) and Utils::distance($this->entity->position, $this->server->entities[$data["target"]]->position) <= 8){ if($this->handle("player.interact", $data) !== false){ diff --git a/src/classes/network/CustomPacketHandler.php b/src/classes/network/CustomPacketHandler.php index 264b67f1e..c105406b9 100644 --- a/src/classes/network/CustomPacketHandler.php +++ b/src/classes/network/CustomPacketHandler.php @@ -445,6 +445,21 @@ class CustomPacketHandler{ $this->raw .= Utils::writeShort($this->data["meta"]); } break; + case MC_SET_ARMOR: + if($this->c === false){ + $this->data["eid"] = Utils::readInt($this->get(4)); + $this->data["slot0"] = ord($this->get(1)); + $this->data["slot1"] = ord($this->get(1)); + $this->data["slot2"] = ord($this->get(1)); + $this->data["slot3"] = ord($this->get(1)); + }else{ + $this->raw .= Utils::writeInt($this->data["eid"]); + $this->raw .= chr($this->data["slot0"]); + $this->raw .= chr($this->data["slot1"]); + $this->raw .= chr($this->data["slot2"]); + $this->raw .= chr($this->data["slot3"]); + } + break; case MC_INTERACT: if($this->c === false){ $this->data["action"] = Utils::readByte($this->get(1)); diff --git a/src/protocol/current.php b/src/protocol/current.php index fbd232aa5..e844c0256 100644 --- a/src/protocol/current.php +++ b/src/protocol/current.php @@ -64,7 +64,7 @@ define("MC_ENTITY_EVENT", 0x9c); define("MC_REQUEST_CHUNK", 0x9d); define("MC_CHUNK_DATA", 0x9e); define("MC_PLAYER_EQUIPMENT", 0x9f); -//define("MC_SET_ARMOR_SLOT", 0xa0); +define("MC_SET_ARMOR", 0xa0); define("MC_INTERACT", 0xa1); define("MC_USE_ITEM", 0xa2); define("MC_PLAYER_ACTION", 0xa3); diff --git a/src/protocol/dataName.php b/src/protocol/dataName.php index 6fed0a57c..c77cd8b6a 100644 --- a/src/protocol/dataName.php +++ b/src/protocol/dataName.php @@ -69,7 +69,7 @@ $dataName = array( MC_CHUNK_DATA => "ChunkData", MC_PLAYER_EQUIPMENT => "PlayerEquipment", - + MC_SET_ARMOR => "SetArmorSlot", MC_INTERACT => "Interact", MC_USE_ITEM => "UseItem", MC_PLAYER_ACTION => "PlayerAction",