diff --git a/src/Player.php b/src/Player.php index 6d12754af7..27745470da 100644 --- a/src/Player.php +++ b/src/Player.php @@ -1171,7 +1171,7 @@ class Player{ $this->entity->updateMetadata(); } if($this->blocked === true or Utils::distance($this->entity->position, $data) > 10){ - }elseif($this->getSlot($this->slot)->getID() !== $data["block"] or $this->getSlot($this->slot)->getMetadata() !== $data["meta"]){ + }elseif($this->getSlot($this->slot)->getID() !== $data["block"] or ($this->getSlot($this->slot)->isTool() === false and $this->getSlot($this->slot)->getMetadata() !== $data["meta"])){ $this->sendInventorySlot($this->slot); }else{ $this->server->api->block->playerBlockAction($this, new Vector3($data["x"], $data["y"], $data["z"]), $data["face"], $data["fx"], $data["fy"], $data["fz"]); @@ -1287,7 +1287,8 @@ class Player{ }elseif($target->class === ENTITY_PLAYER and ($this->server->api->getProperty("pvp") == false or $this->server->difficulty <= 0 or ($target->player->gamemode & 0x01) === 0x01)){ break; }elseif($this->server->handle("player.interact", $data) !== false){ - switch($this->getSlot($this->slot)->getID()){ + $slot = $this->getSlot($this->slot); + switch($slot->getID()){ case WOODEN_SWORD: case GOLD_SWORD: $damage = 4; @@ -1348,6 +1349,11 @@ class Player{ $damage = 1;//$this->server->difficulty; } $this->server->api->entity->harm($data["target"], $damage, $this->eid); + if($slot->isSword() !== false){ + $slot->meta++; + }elseif($slot->isTool() === true){ + $slot->meta += 2; + } } } break; @@ -1407,7 +1413,8 @@ class Player{ RAW_FISH => 2, ); - if($this->entity->getHealth() < 20 and isset($items[($slot = $this->getSlot($this->slot))->getID()])){ + $slot = $this->getSlot($this->slot); + if($this->entity->getHealth() < 20 and isset($items[$slot->getID()])){ $this->dataPacket(MC_ENTITY_EVENT, array( "eid" => 0, "event" => 9, diff --git a/src/material/Item.php b/src/material/Item.php index 350ef44e31..8914b89e9b 100644 --- a/src/material/Item.php +++ b/src/material/Item.php @@ -131,6 +131,10 @@ class Item{ } + final public function isTool(){ + return ($this->isPickaxe !== false or $this->isAxe !== false or $this->isShovel !== false or $this->isSword !== false or $this->isHoe !== false); + } + final public function isPickaxe(){ //Returns false or level of the pickaxe switch($this->id){ case IRON_PICKAXE: @@ -148,6 +152,40 @@ class Item{ } } + final public function isAxe(){ + switch($this->id){ + case IRON_AXE: + return 4; + case WOODEN_AXE: + return 1; + case STONE_AXE: + return 3; + case DIAMOND_AXE: + return 5; + case GOLD_AXE: + return 2; + default: + return false; + } + } + + final public function isSword(){ + switch($this->id){ + case IRON_SWORD: + return 4; + case WOODEN_SWORD: + return 1; + case STONE_SWORD: + return 3; + case DIAMOND_SWORD: + return 5; + case GOLD_SWORD: + return 2; + default: + return false; + } + } + final public function isShovel(){ switch($this->id){ case IRON_SHOVEL: diff --git a/src/material/block/solid/Dirt.php b/src/material/block/solid/Dirt.php index 5b744d72e8..f74b34b264 100644 --- a/src/material/block/solid/Dirt.php +++ b/src/material/block/solid/Dirt.php @@ -33,6 +33,7 @@ class DirtBlock extends SolidBlock{ public function onActivate(Item $item, Player $player){ if($item->isHoe()){ + $item->meta++; $this->level->setBlock($this, BlockAPI::get(FARMLAND, 0)); return true; } diff --git a/src/material/block/solid/Grass.php b/src/material/block/solid/Grass.php index 8c537e6e0f..c255b3c978 100644 --- a/src/material/block/solid/Grass.php +++ b/src/material/block/solid/Grass.php @@ -41,6 +41,7 @@ class GrassBlock extends SolidBlock{ TallGrassObject::growGrass($this->level, $this, new Random()); return true; }elseif($item->isHoe()){ + $item->meta++; $this->level->setBlock($this, new FarmlandBlock()); return true; }