Block breaking part 1

This commit is contained in:
Shoghi Cervantes 2015-05-17 19:33:41 +02:00
parent b14d14d3d5
commit f3c46b12c5
18 changed files with 155 additions and 38 deletions

View File

@ -2223,7 +2223,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade
$oldItem = clone $item; $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($this->isSurvival()){
if(!$item->equals($oldItem, true) or $item->getCount() !== $oldItem->getCount()){ if(!$item->equals($oldItem, true) or $item->getCount() !== $oldItem->getCount()){
$this->inventory->setItemInHand($item, $this); $this->inventory->setItemInHand($item, $this);

View File

@ -22,6 +22,7 @@
namespace pocketmine\block; namespace pocketmine\block;
use pocketmine\item\Item; use pocketmine\item\Item;
use pocketmine\item\Tool;
class AcaciaWoodStairs extends Stair{ class AcaciaWoodStairs extends Stair{
@ -40,4 +41,16 @@ class AcaciaWoodStairs extends Stair{
[$this->id, 0, 1], [$this->id, 0, 1],
]; ];
} }
public function getHardness(){
return 2;
}
public function getResistance(){
return 15;
}
public function getToolType(){
return Tool::TYPE_AXE;
}
} }

View File

@ -68,4 +68,12 @@ class Air extends Transparent{
return null; return null;
} }
public function getHardness(){
return -1;
}
public function getResistance(){
return 0;
}
} }

View File

@ -40,7 +40,7 @@ class Bed extends Transparent{
} }
public function getHardness(){ public function getHardness(){
return 1; return 0.2;
} }
public function getName(){ public function getName(){

View File

@ -36,6 +36,10 @@ class Bedrock extends Solid{
} }
public function getHardness(){ public function getHardness(){
return -1;
}
public function getResistance(){
return 18000000; return 18000000;
} }

View File

@ -22,6 +22,7 @@
namespace pocketmine\block; namespace pocketmine\block;
use pocketmine\item\Item; use pocketmine\item\Item;
use pocketmine\item\Tool;
class BirchWoodStairs extends Stair{ class BirchWoodStairs extends Stair{
@ -40,4 +41,16 @@ class BirchWoodStairs extends Stair{
[$this->id, 0, 1], [$this->id, 0, 1],
]; ];
} }
public function getHardness(){
return 2;
}
public function getResistance(){
return 15;
}
public function getToolType(){
return Tool::TYPE_AXE;
}
} }

View File

@ -29,6 +29,7 @@ use pocketmine\entity\Squid;
use pocketmine\entity\Villager; use pocketmine\entity\Villager;
use pocketmine\entity\Zombie; use pocketmine\entity\Zombie;
use pocketmine\item\Item; use pocketmine\item\Item;
use pocketmine\item\Tool;
use pocketmine\level\Level; use pocketmine\level\Level;
use pocketmine\level\MovingObjectPosition; use pocketmine\level\MovingObjectPosition;
use pocketmine\level\Position; use pocketmine\level\Position;
@ -605,7 +606,14 @@ class Block extends Position implements Metadatable{
* @return int * @return int
*/ */
public function getResistance(){ 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 * @return float
*/ */
public function getBreakTime(Item $item){ 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;
} }
/** /**

View File

@ -22,6 +22,8 @@
namespace pocketmine\block; namespace pocketmine\block;
use pocketmine\item\Tool;
class Bookshelf extends Solid{ class Bookshelf extends Solid{
protected $id = self::BOOKSHELF; protected $id = self::BOOKSHELF;
@ -35,7 +37,11 @@ class Bookshelf extends Solid{
} }
public function getHardness(){ public function getHardness(){
return 7.5; return 1.5;
}
public function getToolType(){
return Tool::TYPE_AXE;
} }
} }

View File

@ -22,6 +22,8 @@
namespace pocketmine\block; namespace pocketmine\block;
use pocketmine\item\Tool;
class BrickStairs extends Stair{ class BrickStairs extends Stair{
protected $id = self::BRICK_STAIRS; protected $id = self::BRICK_STAIRS;
@ -30,6 +32,18 @@ class BrickStairs extends Stair{
$this->meta = $meta; $this->meta = $meta;
} }
public function getHardness(){
return 2;
}
public function getResistance(){
return 30;
}
public function getToolType(){
return Tool::TYPE_PICKAXE;
}
public function getName(){ public function getName(){
return "Brick Stairs"; return "Brick Stairs";
} }

View File

@ -22,6 +22,7 @@
namespace pocketmine\block; namespace pocketmine\block;
use pocketmine\item\Item; use pocketmine\item\Item;
use pocketmine\item\Tool;
class Bricks extends Solid{ class Bricks extends Solid{
@ -32,30 +33,21 @@ class Bricks extends Solid{
} }
public function getHardness(){ public function getHardness(){
return 2;
}
public function getResistance(){
return 30; return 30;
} }
public function getToolType(){
return Tool::TYPE_PICKAXE;
}
public function getName(){ public function getName(){
return "Bricks"; 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){ public function getDrops(Item $item){
if($item->isPickaxe() >= 1){ if($item->isPickaxe() >= 1){
return [ return [

View File

@ -22,6 +22,7 @@
namespace pocketmine\block; namespace pocketmine\block;
use pocketmine\item\Item; use pocketmine\item\Item;
use pocketmine\item\Tool;
use pocketmine\nbt\NBT; use pocketmine\nbt\NBT;
use pocketmine\nbt\tag\Compound; use pocketmine\nbt\tag\Compound;
use pocketmine\nbt\tag\Enum; use pocketmine\nbt\tag\Enum;
@ -48,7 +49,11 @@ class BurningFurnace extends Solid{
} }
public function getHardness(){ public function getHardness(){
return 17.5; return 3.5;
}
public function getToolType(){
return Tool::TYPE_PICKAXE;
} }
public function getLightLevel(){ public function getLightLevel(){

View File

@ -41,7 +41,7 @@ class Cactus extends Transparent{
} }
public function getHardness(){ public function getHardness(){
return 2; return 0.4;
} }
public function hasEntityCollision(){ public function hasEntityCollision(){

View File

@ -22,6 +22,7 @@
namespace pocketmine\block; namespace pocketmine\block;
use pocketmine\item\Item; use pocketmine\item\Item;
use pocketmine\item\Tool;
use pocketmine\Player; use pocketmine\Player;
class Dirt extends Solid{ class Dirt extends Solid{
@ -37,7 +38,11 @@ class Dirt extends Solid{
} }
public function getHardness(){ public function getHardness(){
return 2.5; return 0.5;
}
public function getToolType(){
return Tool::TYPE_SHOVEL;
} }
public function getName(){ public function getName(){

View File

@ -30,7 +30,11 @@ abstract class Flowable extends Transparent{
return true; return true;
} }
public function getBreakTime(Item $item){ public function getHardness(){
return 0;
}
public function getResistance(){
return 0; return 0;
} }
@ -41,8 +45,4 @@ abstract class Flowable extends Transparent{
public function getBoundingBox(){ public function getBoundingBox(){
return null; return null;
} }
public function getHardness(){
return 0;
}
} }

View File

@ -23,6 +23,7 @@ namespace pocketmine\block;
use pocketmine\event\block\BlockSpreadEvent; use pocketmine\event\block\BlockSpreadEvent;
use pocketmine\item\Item; use pocketmine\item\Item;
use pocketmine\item\Tool;
use pocketmine\level\generator\object\TallGrass as TallGrassObject; use pocketmine\level\generator\object\TallGrass as TallGrassObject;
use pocketmine\level\Level; use pocketmine\level\Level;
use pocketmine\math\Vector3; use pocketmine\math\Vector3;
@ -47,7 +48,11 @@ class Grass extends Solid{
} }
public function getHardness(){ public function getHardness(){
return 3; return 0.6;
}
public function getToolType(){
return Tool::TYPE_SHOVEL;
} }
public function getDrops(Item $item){ public function getDrops(Item $item){

View File

@ -27,10 +27,6 @@ use pocketmine\Player;
abstract class Stair extends Transparent{ abstract class Stair extends Transparent{
public function getHardness(){
return 30;
}
/* /*
public function collidesWithBB(AxisAlignedBB $bb, &$list = []){ public function collidesWithBB(AxisAlignedBB $bb, &$list = []){
$damage = $this->getDamage(); $damage = $this->getDamage();

View File

@ -32,6 +32,13 @@ abstract class Tool extends Item{
const TIER_IRON = 4; const TIER_IRON = 4;
const TIER_DIAMOND = 5; 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"){ public function __construct($id, $meta = 0, $count = 1, $name = "Unknown"){
parent::__construct($id, $meta, $count, $name); parent::__construct($id, $meta, $count, $name);
} }

View File

@ -1513,10 +1513,16 @@ class Level implements ChunkManager, Metadatable{
$breakTime = $player->isCreative() ? 0.15 : $target->getBreakTime($item); $breakTime = $player->isCreative() ? 0.15 : $target->getBreakTime($item);
if($player->hasEffect(Effect::SWIFTNESS)){ 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; return false;
} }