From f3c46b12c5dad9391e1bf19a3152713e95ab9486 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Sun, 17 May 2015 19:33:41 +0200 Subject: [PATCH] Block breaking part 1 --- src/pocketmine/Player.php | 2 +- src/pocketmine/block/AcaciaWoodStairs.php | 13 +++++++ src/pocketmine/block/Air.php | 8 ++++ src/pocketmine/block/Bed.php | 2 +- src/pocketmine/block/Bedrock.php | 4 ++ src/pocketmine/block/BirchWoodStairs.php | 13 +++++++ src/pocketmine/block/Block.php | 47 ++++++++++++++++++++++- src/pocketmine/block/Bookshelf.php | 8 +++- src/pocketmine/block/BrickStairs.php | 14 +++++++ src/pocketmine/block/Bricks.php | 26 +++++-------- src/pocketmine/block/BurningFurnace.php | 7 +++- src/pocketmine/block/Cactus.php | 2 +- src/pocketmine/block/Dirt.php | 7 +++- src/pocketmine/block/Flowable.php | 10 ++--- src/pocketmine/block/Grass.php | 7 +++- src/pocketmine/block/Stair.php | 4 -- src/pocketmine/item/Tool.php | 7 ++++ src/pocketmine/level/Level.php | 12 ++++-- 18 files changed, 155 insertions(+), 38 deletions(-) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 8efafbdbb..11e8d2bec 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -2223,7 +2223,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $oldItem = clone $item; - if($this->canInteract($vector->add(0.5, 0.5, 0.5), 13) and $this->level->useBreakOn($vector, $item, $this, true)){ + if($this->canInteract($vector->add(0.5, 0.5, 0.5), $this->isCreative() ? 13 : 6) and $this->level->useBreakOn($vector, $item, $this)){ if($this->isSurvival()){ if(!$item->equals($oldItem, true) or $item->getCount() !== $oldItem->getCount()){ $this->inventory->setItemInHand($item, $this); diff --git a/src/pocketmine/block/AcaciaWoodStairs.php b/src/pocketmine/block/AcaciaWoodStairs.php index de34f9993..1efa40a94 100644 --- a/src/pocketmine/block/AcaciaWoodStairs.php +++ b/src/pocketmine/block/AcaciaWoodStairs.php @@ -22,6 +22,7 @@ namespace pocketmine\block; use pocketmine\item\Item; +use pocketmine\item\Tool; class AcaciaWoodStairs extends Stair{ @@ -40,4 +41,16 @@ class AcaciaWoodStairs extends Stair{ [$this->id, 0, 1], ]; } + + public function getHardness(){ + return 2; + } + + public function getResistance(){ + return 15; + } + + public function getToolType(){ + return Tool::TYPE_AXE; + } } \ No newline at end of file diff --git a/src/pocketmine/block/Air.php b/src/pocketmine/block/Air.php index 02920d54c..17380c7a5 100644 --- a/src/pocketmine/block/Air.php +++ b/src/pocketmine/block/Air.php @@ -68,4 +68,12 @@ class Air extends Transparent{ return null; } + public function getHardness(){ + return -1; + } + + public function getResistance(){ + return 0; + } + } \ No newline at end of file diff --git a/src/pocketmine/block/Bed.php b/src/pocketmine/block/Bed.php index 1584afb67..7302655f1 100644 --- a/src/pocketmine/block/Bed.php +++ b/src/pocketmine/block/Bed.php @@ -40,7 +40,7 @@ class Bed extends Transparent{ } public function getHardness(){ - return 1; + return 0.2; } public function getName(){ diff --git a/src/pocketmine/block/Bedrock.php b/src/pocketmine/block/Bedrock.php index 4f8f04257..f8ef97394 100644 --- a/src/pocketmine/block/Bedrock.php +++ b/src/pocketmine/block/Bedrock.php @@ -36,6 +36,10 @@ class Bedrock extends Solid{ } public function getHardness(){ + return -1; + } + + public function getResistance(){ return 18000000; } diff --git a/src/pocketmine/block/BirchWoodStairs.php b/src/pocketmine/block/BirchWoodStairs.php index ae0517878..7dd5571ff 100644 --- a/src/pocketmine/block/BirchWoodStairs.php +++ b/src/pocketmine/block/BirchWoodStairs.php @@ -22,6 +22,7 @@ namespace pocketmine\block; use pocketmine\item\Item; +use pocketmine\item\Tool; class BirchWoodStairs extends Stair{ @@ -40,4 +41,16 @@ class BirchWoodStairs extends Stair{ [$this->id, 0, 1], ]; } + + public function getHardness(){ + return 2; + } + + public function getResistance(){ + return 15; + } + + public function getToolType(){ + return Tool::TYPE_AXE; + } } \ No newline at end of file diff --git a/src/pocketmine/block/Block.php b/src/pocketmine/block/Block.php index efc72589b..483c895f0 100644 --- a/src/pocketmine/block/Block.php +++ b/src/pocketmine/block/Block.php @@ -29,6 +29,7 @@ use pocketmine\entity\Squid; use pocketmine\entity\Villager; use pocketmine\entity\Zombie; use pocketmine\item\Item; +use pocketmine\item\Tool; use pocketmine\level\Level; use pocketmine\level\MovingObjectPosition; use pocketmine\level\Position; @@ -605,7 +606,14 @@ class Block extends Position implements Metadatable{ * @return int */ public function getResistance(){ - return 1; + return $this->getHardness() * 5; + } + + /** + * @return int + */ + public function getToolType(){ + return Tool::TYPE_NONE; } /** @@ -747,7 +755,42 @@ class Block extends Position implements Metadatable{ * @return float */ public function getBreakTime(Item $item){ - return 0.20; + $base = $this->getHardness() * 1.5; + if($this->canBeBrokenWith($item)){ + if($this->getToolType() === Tool::TYPE_SHEARS and $item->isShears()){ + $base /= 15; + }elseif( + ($this->getToolType() === Tool::TYPE_PICKAXE and ($tier = $item->isPickaxe()) !== false) or + ($this->getToolType() === Tool::TYPE_AXE and ($tier = $item->isAxe()) !== false) or + ($this->getToolType() === Tool::TYPE_SHOVEL and ($tier = $item->isShovel()) !== false) + ){ + switch($tier){ + case Tool::TIER_WOODEN: + $base /= 2; + break; + case Tool::TIER_STONE: + $base /= 4; + break; + case Tool::TIER_IRON: + $base /= 6; + break; + case Tool::TIER_DIAMOND: + $base /= 8; + break; + case Tool::TIER_GOLD: + $base /= 12; + break; + } + } + }else{ + $base *= 3.33; + } + + return $base; + } + + public function canBeBrokenWith(Item $item){ + return $this->getHardness() !== -1; } /** diff --git a/src/pocketmine/block/Bookshelf.php b/src/pocketmine/block/Bookshelf.php index 8e930b2f3..d24bd0d72 100644 --- a/src/pocketmine/block/Bookshelf.php +++ b/src/pocketmine/block/Bookshelf.php @@ -22,6 +22,8 @@ namespace pocketmine\block; +use pocketmine\item\Tool; + class Bookshelf extends Solid{ protected $id = self::BOOKSHELF; @@ -35,7 +37,11 @@ class Bookshelf extends Solid{ } public function getHardness(){ - return 7.5; + return 1.5; + } + + public function getToolType(){ + return Tool::TYPE_AXE; } } \ No newline at end of file diff --git a/src/pocketmine/block/BrickStairs.php b/src/pocketmine/block/BrickStairs.php index f8830cc80..dd503a61d 100644 --- a/src/pocketmine/block/BrickStairs.php +++ b/src/pocketmine/block/BrickStairs.php @@ -22,6 +22,8 @@ namespace pocketmine\block; +use pocketmine\item\Tool; + class BrickStairs extends Stair{ protected $id = self::BRICK_STAIRS; @@ -30,6 +32,18 @@ class BrickStairs extends Stair{ $this->meta = $meta; } + public function getHardness(){ + return 2; + } + + public function getResistance(){ + return 30; + } + + public function getToolType(){ + return Tool::TYPE_PICKAXE; + } + public function getName(){ return "Brick Stairs"; } diff --git a/src/pocketmine/block/Bricks.php b/src/pocketmine/block/Bricks.php index cb6d65592..ef73423b9 100644 --- a/src/pocketmine/block/Bricks.php +++ b/src/pocketmine/block/Bricks.php @@ -22,6 +22,7 @@ namespace pocketmine\block; use pocketmine\item\Item; +use pocketmine\item\Tool; class Bricks extends Solid{ @@ -32,30 +33,21 @@ class Bricks extends Solid{ } public function getHardness(){ + return 2; + } + + public function getResistance(){ return 30; } + public function getToolType(){ + return Tool::TYPE_PICKAXE; + } + public function getName(){ return "Bricks"; } - public function getBreakTime(Item $item){ - switch($item->isPickaxe()){ - case 5: - return 0.4; - case 4: - return 0.5; - case 3: - return 0.75; - case 2: - return 0.25; - case 1: - return 1.5; - default: - return 10; - } - } - public function getDrops(Item $item){ if($item->isPickaxe() >= 1){ return [ diff --git a/src/pocketmine/block/BurningFurnace.php b/src/pocketmine/block/BurningFurnace.php index 21382ac5a..95d8f7dcb 100644 --- a/src/pocketmine/block/BurningFurnace.php +++ b/src/pocketmine/block/BurningFurnace.php @@ -22,6 +22,7 @@ namespace pocketmine\block; use pocketmine\item\Item; +use pocketmine\item\Tool; use pocketmine\nbt\NBT; use pocketmine\nbt\tag\Compound; use pocketmine\nbt\tag\Enum; @@ -48,7 +49,11 @@ class BurningFurnace extends Solid{ } public function getHardness(){ - return 17.5; + return 3.5; + } + + public function getToolType(){ + return Tool::TYPE_PICKAXE; } public function getLightLevel(){ diff --git a/src/pocketmine/block/Cactus.php b/src/pocketmine/block/Cactus.php index e8a09c0db..47f82c5de 100644 --- a/src/pocketmine/block/Cactus.php +++ b/src/pocketmine/block/Cactus.php @@ -41,7 +41,7 @@ class Cactus extends Transparent{ } public function getHardness(){ - return 2; + return 0.4; } public function hasEntityCollision(){ diff --git a/src/pocketmine/block/Dirt.php b/src/pocketmine/block/Dirt.php index fa05a2e93..fa7fca00c 100644 --- a/src/pocketmine/block/Dirt.php +++ b/src/pocketmine/block/Dirt.php @@ -22,6 +22,7 @@ namespace pocketmine\block; use pocketmine\item\Item; +use pocketmine\item\Tool; use pocketmine\Player; class Dirt extends Solid{ @@ -37,7 +38,11 @@ class Dirt extends Solid{ } public function getHardness(){ - return 2.5; + return 0.5; + } + + public function getToolType(){ + return Tool::TYPE_SHOVEL; } public function getName(){ diff --git a/src/pocketmine/block/Flowable.php b/src/pocketmine/block/Flowable.php index 1072234a8..d74c9867e 100644 --- a/src/pocketmine/block/Flowable.php +++ b/src/pocketmine/block/Flowable.php @@ -30,7 +30,11 @@ abstract class Flowable extends Transparent{ return true; } - public function getBreakTime(Item $item){ + public function getHardness(){ + return 0; + } + + public function getResistance(){ return 0; } @@ -41,8 +45,4 @@ abstract class Flowable extends Transparent{ public function getBoundingBox(){ return null; } - - public function getHardness(){ - return 0; - } } \ No newline at end of file diff --git a/src/pocketmine/block/Grass.php b/src/pocketmine/block/Grass.php index 3234b1717..bb6f63eb7 100644 --- a/src/pocketmine/block/Grass.php +++ b/src/pocketmine/block/Grass.php @@ -23,6 +23,7 @@ namespace pocketmine\block; use pocketmine\event\block\BlockSpreadEvent; use pocketmine\item\Item; +use pocketmine\item\Tool; use pocketmine\level\generator\object\TallGrass as TallGrassObject; use pocketmine\level\Level; use pocketmine\math\Vector3; @@ -47,7 +48,11 @@ class Grass extends Solid{ } public function getHardness(){ - return 3; + return 0.6; + } + + public function getToolType(){ + return Tool::TYPE_SHOVEL; } public function getDrops(Item $item){ diff --git a/src/pocketmine/block/Stair.php b/src/pocketmine/block/Stair.php index 016bda4ce..bb02a76d1 100644 --- a/src/pocketmine/block/Stair.php +++ b/src/pocketmine/block/Stair.php @@ -27,10 +27,6 @@ use pocketmine\Player; abstract class Stair extends Transparent{ - public function getHardness(){ - return 30; - } - /* public function collidesWithBB(AxisAlignedBB $bb, &$list = []){ $damage = $this->getDamage(); diff --git a/src/pocketmine/item/Tool.php b/src/pocketmine/item/Tool.php index 45d2787a7..9b4b9e147 100644 --- a/src/pocketmine/item/Tool.php +++ b/src/pocketmine/item/Tool.php @@ -32,6 +32,13 @@ abstract class Tool extends Item{ const TIER_IRON = 4; const TIER_DIAMOND = 5; + const TYPE_NONE = 0; + const TYPE_SWORD = 1; + const TYPE_SHOVEL = 2; + const TYPE_PICKAXE = 3; + const TYPE_AXE = 4; + const TYPE_SHEARS = 5; + public function __construct($id, $meta = 0, $count = 1, $name = "Unknown"){ parent::__construct($id, $meta, $count, $name); } diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 4a808350e..b67b55db1 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -1513,10 +1513,16 @@ class Level implements ChunkManager, Metadatable{ $breakTime = $player->isCreative() ? 0.15 : $target->getBreakTime($item); if($player->hasEffect(Effect::SWIFTNESS)){ - $breakTime *= 0.80 * ($player->getEffect(Effect::SWIFTNESS)->getAmplifier() + 1); + $breakTime *= 1 - (0.2 * ($player->getEffect(Effect::SWIFTNESS)->getAmplifier() + 1)); } - if(!$ev->getInstaBreak() and ($player->lastBreak + $breakTime) >= microtime(true)){ + if($player->hasEffect(Effect::MINING_FATIGUE)){ + $breakTime *= 1 + (0.3 * ($player->getEffect(Effect::MINING_FATIGUE)->getAmplifier() + 1)); + } + + $breakTime -= 0.05; //1 tick compensation + + if(!$ev->getInstaBreak() and ($player->lastBreak + $breakTime) > microtime(true)){ return false; } @@ -1532,7 +1538,7 @@ class Level implements ChunkManager, Metadatable{ $drops[$k] = Item::get($i[0], $i[1], $i[2]); } } - + $above = $this->getBlock(new Vector3($target->x, $target->y + 1, $target->z)); if($above !== null){ if($above->getId() === Item::FIRE){