Merge branch 'master' into mcpe-1.2

This commit is contained in:
Dylan K. Taylor 2017-08-27 16:09:23 +01:00
commit c7fd3eb725
205 changed files with 1131 additions and 1493 deletions

View File

@ -38,7 +38,6 @@ use pocketmine\entity\Projectile;
use pocketmine\event\entity\EntityDamageByBlockEvent;
use pocketmine\event\entity\EntityDamageByEntityEvent;
use pocketmine\event\entity\EntityDamageEvent;
use pocketmine\event\entity\EntityShootBowEvent;
use pocketmine\event\entity\ProjectileLaunchEvent;
use pocketmine\event\inventory\CraftItemEvent;
use pocketmine\event\inventory\InventoryCloseEvent;
@ -103,7 +102,6 @@ use pocketmine\nbt\tag\FloatTag;
use pocketmine\nbt\tag\IntTag;
use pocketmine\nbt\tag\ListTag;
use pocketmine\nbt\tag\LongTag;
use pocketmine\nbt\tag\ShortTag;
use pocketmine\nbt\tag\StringTag;
use pocketmine\network\mcpe\PlayerNetworkSessionAdapter;
use pocketmine\network\mcpe\protocol\AdventureSettingsPacket;
@ -765,6 +763,29 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
return $this->inAirTicks;
}
/**
* Returns whether the player is currently using an item (right-click and hold).
* @return bool
*/
public function isUsingItem() : bool{
return $this->getGenericFlag(self::DATA_FLAG_ACTION) and $this->startAction > -1;
}
public function setUsingItem(bool $value){
$this->startAction = $value ? $this->server->getTick() : -1;
$this->setGenericFlag(self::DATA_FLAG_ACTION, $value);
}
/**
* Returns how long the player has been using their currently-held item for. Used for determining arrow shoot force
* for bows.
*
* @return int
*/
public function getItemUseDuration() : int{
return $this->startAction === -1 ? -1 : ($this->server->getTick() - $this->startAction);
}
protected function switchLevel(Level $targetLevel) : bool{
$oldLevel = $this->level;
if(parent::switchLevel($targetLevel)){
@ -2362,35 +2383,10 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
return false;
}
$item = $this->inventory->getItemInHand();
$damageTable = [
Item::WOODEN_SWORD => 4,
Item::GOLDEN_SWORD => 4,
Item::STONE_SWORD => 5,
Item::IRON_SWORD => 6,
Item::DIAMOND_SWORD => 7,
Item::WOODEN_AXE => 3,
Item::GOLDEN_AXE => 3,
Item::STONE_AXE => 3,
Item::IRON_AXE => 5,
Item::DIAMOND_AXE => 6,
Item::WOODEN_PICKAXE => 2,
Item::GOLDEN_PICKAXE => 2,
Item::STONE_PICKAXE => 3,
Item::IRON_PICKAXE => 4,
Item::DIAMOND_PICKAXE => 5,
Item::WOODEN_SHOVEL => 1,
Item::GOLDEN_SHOVEL => 1,
Item::STONE_SHOVEL => 2,
Item::IRON_SHOVEL => 3,
Item::DIAMOND_SHOVEL => 4,
];
$heldItem = $this->inventory->getItemInHand();
$damage = [
EntityDamageEvent::MODIFIER_BASE => $damageTable[$item->getId()] ?? 1,
EntityDamageEvent::MODIFIER_BASE => $heldItem->getAttackPoints(),
];
if(!$this->canInteract($target, 8)){
@ -2402,33 +2398,9 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
$cancelled = true;
}
$armorValues = [
Item::LEATHER_CAP => 1,
Item::LEATHER_TUNIC => 3,
Item::LEATHER_PANTS => 2,
Item::LEATHER_BOOTS => 1,
Item::CHAINMAIL_HELMET => 1,
Item::CHAINMAIL_CHESTPLATE => 5,
Item::CHAINMAIL_LEGGINGS => 4,
Item::CHAINMAIL_BOOTS => 1,
Item::GOLDEN_HELMET => 1,
Item::GOLDEN_CHESTPLATE => 5,
Item::GOLDEN_LEGGINGS => 3,
Item::GOLDEN_BOOTS => 1,
Item::IRON_HELMET => 2,
Item::IRON_CHESTPLATE => 6,
Item::IRON_LEGGINGS => 5,
Item::IRON_BOOTS => 2,
Item::DIAMOND_HELMET => 3,
Item::DIAMOND_CHESTPLATE => 8,
Item::DIAMOND_LEGGINGS => 6,
Item::DIAMOND_BOOTS => 3,
];
$points = 0;
foreach($target->getInventory()->getArmorContents() as $index => $i){
if(isset($armorValues[$i->getId()])){
$points += $armorValues[$i->getId()];
}
foreach($target->getInventory()->getArmorContents() as $armorItem){
$points += $armorItem->getDefensePoints();
}
$damage[EntityDamageEvent::MODIFIER_ARMOR] = -floor($damage[EntityDamageEvent::MODIFIER_BASE] * $points * 0.04);
@ -2442,18 +2414,18 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
$target->attack($ev);
if($ev->isCancelled()){
if($item->isTool() and $this->isSurvival()){
if($heldItem->isTool() and $this->isSurvival()){
$this->inventory->sendContents($this);
}
return true;
}
if($this->isSurvival()){
if($item->isTool()){
if($item->useOn($target) and $item->getDamage() >= $item->getMaxDurability()){
if($heldItem->isTool()){
if($heldItem->useOn($target) and $heldItem->getDamage() >= $heldItem->getMaxDurability()){
$this->inventory->setItemInHand(ItemFactory::get(Item::AIR, 0, 1));
}else{
$this->inventory->setItemInHand($item);
$this->inventory->setItemInHand($heldItem);
}
}
@ -2470,70 +2442,10 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
$type = $packet->transactionData->releaseItemActionType;
switch($type){
case InventoryTransactionPacket::RELEASE_ITEM_ACTION_RELEASE:
if($this->startAction > -1 and $this->getGenericFlag(self::DATA_FLAG_ACTION)){
if($this->inventory->getItemInHand()->getId() === Item::BOW){
$bow = $this->inventory->getItemInHand();
if($this->isSurvival() and !$this->inventory->contains(ItemFactory::get(Item::ARROW, 0, 1))){
$this->inventory->sendContents($this);
return false;
}
$nbt = new CompoundTag("", [
new ListTag("Pos", [
new DoubleTag("", $this->x),
new DoubleTag("", $this->y + $this->getEyeHeight()),
new DoubleTag("", $this->z)
]),
new ListTag("Motion", [
new DoubleTag("", -sin($this->yaw / 180 * M_PI) * cos($this->pitch / 180 * M_PI)),
new DoubleTag("", -sin($this->pitch / 180 * M_PI)),
new DoubleTag("", cos($this->yaw / 180 * M_PI) * cos($this->pitch / 180 * M_PI))
]),
new ListTag("Rotation", [
//yaw/pitch for arrows taken crosswise, not along the arrow shaft.
new FloatTag("", ($this->yaw > 180 ? 360 : 0) - $this->yaw), //arrow yaw must range from -180 to +180
new FloatTag("", -$this->pitch)
]),
new ShortTag("Fire", $this->isOnFire() ? 45 * 60 : 0)
]);
$diff = ($this->server->getTick() - $this->startAction);
$p = $diff / 20;
$f = min((($p ** 2) + $p * 2) / 3, 1) * 2;
$ev = new EntityShootBowEvent($this, $bow, Entity::createEntity("Arrow", $this->getLevel(), $nbt, $this, $f == 2), $f);
if($f < 0.1 or $diff < 5){
$ev->setCancelled();
}
$this->server->getPluginManager()->callEvent($ev);
if($ev->isCancelled()){
$ev->getProjectile()->kill();
$this->inventory->sendContents($this);
}else{
$ev->getProjectile()->setMotion($ev->getProjectile()->getMotion()->multiply($ev->getForce()));
if($this->isSurvival()){
$this->inventory->removeItem(ItemFactory::get(Item::ARROW, 0, 1));
$bow->setDamage($bow->getDamage() + 1);
if($bow->getDamage() >= 385){
$this->inventory->setItemInHand(ItemFactory::get(Item::AIR, 0, 0));
}else{
$this->inventory->setItemInHand($bow);
}
}
if($ev->getProjectile() instanceof Projectile){
$this->server->getPluginManager()->callEvent($projectileEv = new ProjectileLaunchEvent($ev->getProjectile()));
if($projectileEv->isCancelled()){
$ev->getProjectile()->kill();
}else{
$ev->getProjectile()->spawnToAll();
$this->level->addSound(new LaunchSound($this), $this->getViewers());
}
}else{
$ev->getProjectile()->spawnToAll();
}
}
if($this->isUsingItem()){
$item = $this->inventory->getItemInHand();
if($item->onReleaseUsing($this)){
$this->inventory->setItemInHand($item);
}
}else{
$this->inventory->sendContents($this);

View File

@ -482,7 +482,7 @@ namespace pocketmine {
}
$gitHash = str_repeat("00", 20);
#ifndef COMPILE
if(\Phar::running(true) === ""){
if(Utils::execute("git rev-parse HEAD", $out) === 0){
$gitHash = trim($out);
@ -490,8 +490,14 @@ namespace pocketmine {
$gitHash .= "-dirty";
}
}
}else{
$phar = new \Phar(\Phar::running(false));
$meta = $phar->getMetadata();
if(isset($meta["git"])){
$gitHash = $meta["git"];
}
#endif
}
define('pocketmine\GIT_COMMIT', $gitHash);

View File

@ -75,16 +75,16 @@ class Anvil extends Fallable{
return true;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$direction = ($player !== null ? $player->getDirection() : 0) & 0x03;
$this->meta = ($this->meta & 0x0c) | $direction;
return $this->getLevel()->setBlock($block, $this, true, true);
return $this->getLevel()->setBlock($blockReplace, $this, true, true);
}
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_WOODEN){
return [
ItemFactory::get($this->getItemId(), $this->getDamage() & 0x0c, 1),
ItemFactory::get($this->getItemId(), $this->getDamage() & 0x0c, 1)
];
}

View File

@ -175,21 +175,21 @@ class Bed extends Transparent{
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$down = $this->getSide(Vector3::SIDE_DOWN);
if(!$down->isTransparent()){
$meta = (($player instanceof Player ? $player->getDirection() : 0) - 1) & 0x03;
$next = $this->getSide(self::getOtherHalfSide($meta));
if($next->canBeReplaced() === true and !$next->getSide(Vector3::SIDE_DOWN)->isTransparent()){
$this->getLevel()->setBlock($block, BlockFactory::get($this->id, $meta), true, true);
$this->getLevel()->setBlock($blockReplace, BlockFactory::get($this->id, $meta), true, true);
$this->getLevel()->setBlock($next, BlockFactory::get($this->id, $meta | self::BITFLAG_HEAD), true, true);
$nbt = new CompoundTag("", [
new StringTag("id", Tile::BED),
new ByteTag("color", $item->getDamage() & 0x0f),
new IntTag("x", $block->x),
new IntTag("y", $block->y),
new IntTag("z", $block->z),
new IntTag("x", $blockReplace->x),
new IntTag("y", $blockReplace->y),
new IntTag("z", $blockReplace->z)
]);
$nbt2 = clone $nbt;

View File

@ -117,7 +117,10 @@ class Block extends Position implements BlockIds, Metadatable{
* @param int $meta
*/
final public function setDamage(int $meta){
$this->meta = $meta & 0x0f;
if($meta < 0 or $meta > 0xf){
throw new \InvalidArgumentException("Block damage values must be 0-15, not $meta");
}
$this->meta = $meta;
}
/**
@ -137,15 +140,15 @@ class Block extends Position implements BlockIds, Metadatable{
* Places the Block, using block space and block target, and side. Returns if the block has been placed.
*
* @param Item $item
* @param Block $block
* @param Block $target
* @param Block $blockReplace
* @param Block $blockClicked
* @param int $face
* @param Vector3 $facePos
* @param Player|null $player
*
* @return bool
*/
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
return $this->getLevel()->setBlock($this, $this, true, true);
}
@ -263,6 +266,15 @@ class Block extends Position implements BlockIds, Metadatable{
return false;
}
/**
* Returns whether random block updates will be done on this block.
*
* @return bool
*/
public function ticksRandomly() : bool{
return false;
}
/**
* AKA: Block->isPlaceable
* @return bool
@ -342,7 +354,7 @@ class Block extends Position implements BlockIds, Metadatable{
*/
public function getDrops(Item $item) : array{
return [
ItemFactory::get($this->getItemId(), $this->getDamage() & $this->getVariantBitmask(), 1),
ItemFactory::get($this->getItemId(), $this->getDamage() & $this->getVariantBitmask(), 1)
];
}

View File

@ -277,7 +277,7 @@ class BlockFactory{
self::registerBlock(new Magma());
self::registerBlock(new NetherWartBlock());
self::registerBlock(new NetherBrick(Block::RED_NETHER_BRICK, 0, "Red Nether Bricks"));
//TODO: BONE_BLOCK
self::registerBlock(new BoneBlock());
//TODO: SHULKER_BOX
self::registerBlock(new GlazedTerracotta(Block::PURPLE_GLAZED_TERRACOTTA, 0, "Purple Glazed Terracotta"));
@ -297,7 +297,7 @@ class BlockFactory{
self::registerBlock(new GlazedTerracotta(Block::GREEN_GLAZED_TERRACOTTA, 0, "Green Glazed Terracotta"));
self::registerBlock(new GlazedTerracotta(Block::RED_GLAZED_TERRACOTTA, 0, "Red Glazed Terracotta"));
self::registerBlock(new GlazedTerracotta(Block::BLACK_GLAZED_TERRACOTTA, 0, "Black Glazed Terracotta"));
//TODO: CONCRETE
self::registerBlock(new Concrete());
//TODO: CONCRETEPOWDER
//TODO: CHORUS_PLANT
@ -370,16 +370,14 @@ class BlockFactory{
* @return Block
*/
public static function get(int $id, int $meta = 0, Position $pos = null) : Block{
try{
$block = self::$fullList[($id << 4) | $meta];
if($block !== null){
$block = clone $block;
}else{
$block = new UnknownBlock($id, $meta);
if($meta < 0 or $meta > 0xf){
throw new \InvalidArgumentException("Block meta value $meta is out of bounds");
}
try{
$block = clone self::$fullList[($id << 4) | $meta];
}catch(\RuntimeException $e){
//TODO: this probably should return null (out of bounds IDs may cause unexpected behaviour)
$block = new UnknownBlock($id, $meta);
throw new \InvalidArgumentException("Block ID $id is out of bounds");
}
if($pos !== null){

View File

@ -137,7 +137,7 @@ interface BlockIds{
const STONE_BRICK_STAIRS = 109;
const MYCELIUM = 110;
const LILY_PAD = 111, WATERLILY = 111, WATER_LILY = 111;
const NETHER_BRICK = 112, NETHER_BRICK_BLOCK = 112;
const NETHER_BRICK_BLOCK = 112;
const NETHER_BRICK_FENCE = 113;
const NETHER_BRICK_STAIRS = 114;
const NETHER_WART_PLANT = 115;

View File

@ -0,0 +1,69 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\PillarRotationHelper;
use pocketmine\item\Item;
use pocketmine\item\Tool;
use pocketmine\math\Vector3;
use pocketmine\Player;
class BoneBlock extends Solid{
protected $id = Block::BONE_BLOCK;
public function __construct(int $meta = 0){
$this->meta = $meta;
}
public function getName() : string{
return "Bone Block";
}
public function getHardness() : float{
return 2;
}
public function getToolType() : int{
return Tool::TYPE_PICKAXE;
}
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$this->meta = PillarRotationHelper::getMetaFromFace($this->meta, $face);
return $this->getLevel()->setBlock($blockReplace, $this, true, true);
}
public function getVariantBitmask() : int{
return 0x03;
}
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_WOODEN){
return parent::getDrops($item); // TODO: Change the autogenerated stub
}
return [];
}
}

View File

@ -23,19 +23,10 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\level\Level;
use pocketmine\math\Vector3;
use pocketmine\Player;
class BrownMushroom extends Flowable{
class BrownMushroom extends RedMushroom{
protected $id = self::BROWN_MUSHROOM;
public function __construct(int $meta = 0){
$this->meta = $meta;
}
public function getName() : string{
return "Brown Mushroom";
}
@ -43,28 +34,4 @@ class BrownMushroom extends Flowable{
public function getLightLevel() : int{
return 1;
}
public function onUpdate(int $type){
if($type === Level::BLOCK_UPDATE_NORMAL){
if($this->getSide(Vector3::SIDE_DOWN)->isTransparent() === true){
$this->getLevel()->useBreakOn($this);
return Level::BLOCK_UPDATE_NORMAL;
}
}
return false;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
$down = $this->getSide(Vector3::SIDE_DOWN);
if($down->isTransparent() === false){
$this->getLevel()->setBlock($block, $this, true, true);
return true;
}
return false;
}
}

View File

@ -59,15 +59,15 @@ class BurningFurnace extends Solid{
return 13;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$faces = [
0 => 4,
1 => 2,
2 => 5,
3 => 3,
3 => 3
];
$this->meta = $faces[$player instanceof Player ? $player->getDirection() : 0];
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
$nbt = new CompoundTag("", [
new ListTag("Items", []),
new StringTag("id", Tile::FURNACE),

View File

@ -66,6 +66,10 @@ class Cactus extends Transparent{
);
}
public function ticksRandomly() : bool{
return true;
}
public function onEntityCollide(Entity $entity){
$ev = new EntityDamageByBlockEvent($this, $entity, EntityDamageEvent::CAUSE_CONTACT, 1);
$entity->attack($ev);
@ -108,7 +112,7 @@ class Cactus extends Transparent{
return false;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$down = $this->getSide(Vector3::SIDE_DOWN);
if($down->getId() === self::SAND or $down->getId() === self::CACTUS){
$block0 = $this->getSide(Vector3::SIDE_NORTH);

View File

@ -62,10 +62,10 @@ class Cake extends Transparent implements FoodSource{
);
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$down = $this->getSide(Vector3::SIDE_DOWN);
if($down->getId() !== self::AIR){
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}

View File

@ -62,10 +62,10 @@ class Carpet extends Flowable{
);
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$down = $this->getSide(Vector3::SIDE_DOWN);
if($down->getId() !== self::AIR){
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}

View File

@ -67,12 +67,12 @@ class Chest extends Transparent{
);
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$faces = [
0 => 4,
1 => 2,
2 => 5,
3 => 3,
3 => 3
];
$chest = null;
@ -94,7 +94,7 @@ class Chest extends Transparent{
}
}
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
$nbt = new CompoundTag("", [
new ListTag("Items", []),
new StringTag("id", Tile::CHEST),

View File

@ -21,12 +21,38 @@
declare(strict_types=1);
namespace pocketmine\item;
namespace pocketmine\block;
use pocketmine\block\utils\ColorBlockMetaHelper;
use pocketmine\item\Item;
use pocketmine\item\Tool;
class Feather extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::FEATHER, $meta, $count, "Feather");
class Concrete extends Solid{
protected $id = Block::CONCRETE;
public function __construct(int $meta = 0){
$this->meta = $meta;
}
public function getName() : string{
return ColorBlockMetaHelper::getColorFromMeta($this->meta) . " Concrete";
}
public function getHardness() : float{
return 1.8;
}
public function getToolType() : int{
return Tool::TYPE_PICKAXE;
}
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_WOODEN){
return parent::getDrops($item);
}
return [];
}
}

View File

@ -32,9 +32,9 @@ use pocketmine\Server;
abstract class Crops extends Flowable{
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
if($block->getSide(Vector3::SIDE_DOWN)->getId() === Block::FARMLAND){
$this->getLevel()->setBlock($block, $this, true, true);
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
if($blockReplace->getSide(Vector3::SIDE_DOWN)->getId() === Block::FARMLAND){
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}
@ -65,6 +65,10 @@ abstract class Crops extends Flowable{
return false;
}
public function ticksRandomly() : bool{
return true;
}
public function onUpdate(int $type){
if($type === Level::BLOCK_UPDATE_NORMAL){
if($this->getSide(Vector3::SIDE_DOWN)->getId() !== Block::FARMLAND){

View File

@ -41,10 +41,10 @@ class Dandelion extends Flowable{
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$down = $this->getSide(Vector3::SIDE_DOWN);
if($down->getId() === 2 or $down->getId() === 3 or $down->getId() === 60){
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}

View File

@ -216,7 +216,7 @@ abstract class Door extends Transparent{
return false;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
if($face === Vector3::SIDE_UP){
$blockUp = $this->getSide(Vector3::SIDE_UP);
$blockDown = $this->getSide(Vector3::SIDE_DOWN);
@ -228,7 +228,7 @@ abstract class Door extends Transparent{
0 => 3,
1 => 4,
2 => 2,
3 => 5,
3 => 5
];
$next = $this->getSide($faces[($direction + 2) % 4]);
$next2 = $this->getSide($faces[$direction]);
@ -238,7 +238,7 @@ abstract class Door extends Transparent{
}
$this->setDamage($player->getDirection() & 0x03);
$this->getLevel()->setBlock($block, $this, true, true); //Bottom
$this->getLevel()->setBlock($blockReplace, $this, true, true); //Bottom
$this->getLevel()->setBlock($blockUp, $b = BlockFactory::get($this->getId(), $metaUp), true); //Top
return true;
}

View File

@ -54,11 +54,11 @@ class DoublePlant extends Flowable{
return $names[$this->meta & 0x07] ?? "";
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
$id = $block->getSide(Vector3::SIDE_DOWN)->getId();
if(($id === Block::GRASS or $id === Block::DIRT) and $block->getSide(Vector3::SIDE_UP)->canBeReplaced()){
$this->getLevel()->setBlock($block, $this, false, false);
$this->getLevel()->setBlock($block->getSide(Vector3::SIDE_UP), BlockFactory::get($this->id, $this->meta | self::BITFLAG_TOP), false, false);
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$id = $blockReplace->getSide(Vector3::SIDE_DOWN)->getId();
if(($id === Block::GRASS or $id === Block::DIRT) and $blockReplace->getSide(Vector3::SIDE_UP)->canBeReplaced()){
$this->getLevel()->setBlock($blockReplace, $this, false, false);
$this->getLevel()->setBlock($blockReplace->getSide(Vector3::SIDE_UP), BlockFactory::get($this->id, $this->meta | self::BITFLAG_TOP), false, false);
return true;
}

View File

@ -52,7 +52,7 @@ class DoubleStoneSlab extends Solid{
4 => "Brick",
5 => "Stone Brick",
6 => "Quartz",
7 => "Nether Brick",
7 => "Nether Brick"
];
return "Double " . $names[$this->meta & 0x07] . " Slab";
}
@ -60,7 +60,7 @@ class DoubleStoneSlab extends Solid{
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_WOODEN){
return [
ItemFactory::get(Item::STONE_SLAB, $this->getDamage() & 0x07, 2),
ItemFactory::get(Item::STONE_SLAB, $this->getDamage() & 0x07, 2)
];
}

View File

@ -50,7 +50,7 @@ class EmeraldOre extends Solid{
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_IRON){
return [
ItemFactory::get(Item::EMERALD, 0, 1),
ItemFactory::get(Item::EMERALD, 0, 1)
];
}

View File

@ -41,8 +41,8 @@ class EnchantingTable extends Transparent{
$this->meta = $meta;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
$this->getLevel()->setBlock($block, $this, true, true);
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$this->getLevel()->setBlock($blockReplace, $this, true, true);
$nbt = new CompoundTag("", [
new StringTag("id", Tile::ENCHANT_TABLE),
new IntTag("x", $this->x),

View File

@ -40,17 +40,17 @@ class EndRod extends Flowable{
return "End Rod";
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
if($face === Vector3::SIDE_UP or $face === Vector3::SIDE_DOWN){
$this->meta = $face;
}else{
$this->meta = $face ^ 0x01;
}
if($target instanceof EndRod and $target->getDamage() === $this->meta){
if($blockClicked instanceof EndRod and $blockClicked->getDamage() === $this->meta){
$this->meta ^= 0x01;
}
return $this->level->setBlock($block, $this, true, true);
return $this->level->setBlock($blockReplace, $this, true, true);
}
public function isSolid() : bool{

View File

@ -56,7 +56,7 @@ abstract class Fallable extends Solid{
new FloatTag("", 0)
]),
new IntTag("TileID", $this->getId()),
new ByteTag("Data", $this->getDamage()),
new ByteTag("Data", $this->getDamage())
]));
$fall->spawnToAll();

View File

@ -26,6 +26,7 @@ namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
use pocketmine\level\Level;
use pocketmine\math\AxisAlignedBB;
class Farmland extends Transparent{
@ -48,6 +49,10 @@ class Farmland extends Transparent{
return Tool::TYPE_SHOVEL;
}
public function ticksRandomly() : bool{
return true;
}
protected function recalculateBoundingBox(){
return new AxisAlignedBB(
$this->x,
@ -59,6 +64,14 @@ class Farmland extends Transparent{
);
}
public function onUpdate(int $type){
if($type === Level::BLOCK_UPDATE_RANDOM){
//TODO: hydration
}
return false;
}
public function getDrops(Item $item) : array{
return [
ItemFactory::get(Item::DIRT, 0, 1)

View File

@ -69,9 +69,9 @@ class FenceGate extends Transparent{
}
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$this->meta = ($player instanceof Player ? ($player->getDirection() - 1) & 0x03 : 0);
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}

View File

@ -61,6 +61,10 @@ class Fire extends Flowable{
return true;
}
public function ticksRandomly() : bool{
return true;
}
public function onEntityCollide(Entity $entity){
$ev = new EntityDamageByBlockEvent($this, $entity, EntityDamageEvent::CAUSE_FIRE, 1);
$entity->attack($ev);
@ -103,6 +107,8 @@ class Fire extends Flowable{
return Level::BLOCK_UPDATE_NORMAL;
}
}
//TODO: fire spread
}
return false;

View File

@ -60,10 +60,10 @@ class Flower extends Flowable{
return $names[$this->meta] ?? "Unknown";
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$down = $this->getSide(Vector3::SIDE_DOWN);
if($down->getId() === Block::GRASS or $down->getId() === Block::DIRT or $down->getId() === Block::FARMLAND){
$this->getLevel()->setBlock($block, $this, true);
$this->getLevel()->setBlock($blockReplace, $this, true);
return true;
}

View File

@ -63,20 +63,20 @@ class FlowerPot extends Flowable{
);
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
if($this->getSide(Vector3::SIDE_DOWN)->isTransparent()){
return false;
}
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
$nbt = new CompoundTag("", [
new StringTag("id", Tile::FLOWER_POT),
new IntTag("x", $block->x),
new IntTag("y", $block->y),
new IntTag("z", $block->z),
new IntTag("x", $blockReplace->x),
new IntTag("y", $blockReplace->y),
new IntTag("z", $blockReplace->z),
new ShortTag("item", 0),
new IntTag("mData", 0),
new IntTag("mData", 0)
]);
if($item->hasCustomBlockData()){

View File

@ -39,7 +39,7 @@ class GlazedTerracotta extends Solid{
return Tool::TYPE_PICKAXE;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
if($player !== null){
$faces = [
0 => 4,
@ -50,7 +50,7 @@ class GlazedTerracotta extends Solid{
$this->meta = $faces[(~($player->getDirection() - 1)) & 0x03];
}
return $this->getLevel()->setBlock($block, $this, true, true);
return $this->getLevel()->setBlock($blockReplace, $this, true, true);
}
public function getVariantBitmask() : int{

View File

@ -40,4 +40,11 @@ class GlowingObsidian extends Solid{
return 12;
}
public function getHardness() : float{
return 10;
}
public function getBlastResistance() : float{
return 50;
}
}

View File

@ -55,10 +55,14 @@ class Grass extends Solid{
public function getDrops(Item $item) : array{
return [
ItemFactory::get(Item::DIRT, 0, 1),
ItemFactory::get(Item::DIRT, 0, 1)
];
}
public function ticksRandomly() : bool{
return true;
}
public function onUpdate(int $type){
if($type === Level::BLOCK_UPDATE_RANDOM){
$lightAbove = $this->level->getFullLightAt($this->x, $this->y + 1, $this->z);

View File

@ -43,18 +43,18 @@ class HayBale extends Solid{
return 0.5;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$faces = [
0 => 0,
1 => 0,
2 => 0b1000,
3 => 0b1000,
4 => 0b0100,
5 => 0b0100,
5 => 0b0100
];
$this->meta = ($this->meta & 0x03) | $faces[$face];
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}

View File

@ -57,8 +57,10 @@ class Ice extends Transparent{
}
public function onBreak(Item $item, Player $player = null) : bool{
$this->getLevel()->setBlock($this, BlockFactory::get(Block::WATER), true);
return $this->getLevel()->setBlock($this, BlockFactory::get(Block::WATER), true);
}
public function ticksRandomly() : bool{
return true;
}

View File

@ -105,7 +105,7 @@ class ItemFrame extends Flowable{
return false;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
if($face === Vector3::SIDE_DOWN or $face === Vector3::SIDE_UP){
return false;
}
@ -118,13 +118,13 @@ class ItemFrame extends Flowable{
];
$this->meta = $faces[$face];
$this->level->setBlock($block, $this, true, true);
$this->level->setBlock($blockReplace, $this, true, true);
$nbt = new CompoundTag("", [
new StringTag("id", Tile::ITEM_FRAME),
new IntTag("x", $block->x),
new IntTag("y", $block->y),
new IntTag("z", $block->z),
new IntTag("x", $blockReplace->x),
new IntTag("y", $blockReplace->y),
new IntTag("z", $blockReplace->z),
new FloatTag("ItemDropChance", 1.0),
new ByteTag("ItemRotation", 0)
]);

View File

@ -110,17 +110,17 @@ class Ladder extends Transparent{
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
if($target->isTransparent() === false){
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
if($blockClicked->isTransparent() === false){
$faces = [
2 => 2,
3 => 3,
4 => 4,
5 => 5,
5 => 5
];
if(isset($faces[$face])){
$this->meta = $faces[$face];
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}

View File

@ -63,7 +63,7 @@ class Lava extends Liquid{
$entity->resetFallDistance();
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$ret = $this->getLevel()->setBlock($this, $this, true, false);
$this->getLevel()->scheduleDelayedBlockUpdate($this, $this->tickRate());

View File

@ -59,7 +59,7 @@ class Leaves extends Transparent{
self::OAK => "Oak Leaves",
self::SPRUCE => "Spruce Leaves",
self::BIRCH => "Birch Leaves",
self::JUNGLE => "Jungle Leaves",
self::JUNGLE => "Jungle Leaves"
];
return $names[$this->meta & 0x03];
}
@ -68,6 +68,10 @@ class Leaves extends Transparent{
return true;
}
public function ticksRandomly() : bool{
return true;
}
protected function findLog(Block $pos, array $visited, $distance, &$check, $fromSide = null){
++$check;
$index = $pos->x . "." . $pos->y . "." . $pos->z;
@ -160,7 +164,7 @@ class Leaves extends Transparent{
return false;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$this->meta |= 0x04;
return $this->getLevel()->setBlock($this, $this, true);
}

View File

@ -34,7 +34,7 @@ class Leaves2 extends Leaves{
public function getName() : string{
static $names = [
self::ACACIA => "Acacia Leaves",
self::DARK_OAK => "Dark Oak Leaves",
self::DARK_OAK => "Dark Oak Leaves"
];
return $names[$this->meta & 0x03] ?? "Unknown";
}

View File

@ -57,6 +57,10 @@ class Mycelium extends Solid{
];
}
public function ticksRandomly() : bool{
return true;
}
public function onUpdate(int $type){
if($type === Level::BLOCK_UPDATE_RANDOM){
//TODO: light levels

View File

@ -40,10 +40,14 @@ class NetherWartPlant extends Flowable{
$this->meta = $meta;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function ticksRandomly() : bool{
return true;
}
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$down = $this->getSide(Vector3::SIDE_DOWN);
if($down->getId() === Block::SOUL_SAND){
$this->getLevel()->setBlock($block, $this, false, true);
$this->getLevel()->setBlock($blockReplace, $this, false, true);
return true;
}

View File

@ -46,6 +46,10 @@ class Obsidian extends Solid{
return 35; //50 in PC
}
public function getBlastResistance() : float{
return 6000;
}
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_DIAMOND){
return parent::getDrops($item);

View File

@ -46,7 +46,7 @@ class Prismarine extends Solid{
static $names = [
self::NORMAL => "Prismarine",
self::DARK => "Dark Prismarine",
self::BRICKS => "Prismarine Bricks",
self::BRICKS => "Prismarine Bricks"
];
return $names[$this->meta & 0x03] ?? "Unknown";
}

View File

@ -48,11 +48,11 @@ class Pumpkin extends Solid{
return "Pumpkin";
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
if($player instanceof Player){
$this->meta = ((int) $player->getDirection() + 1) % 4;
}
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}

View File

@ -23,15 +23,17 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\PillarRotationHelper;
use pocketmine\item\Item;
use pocketmine\item\Tool;
use pocketmine\math\Vector3;
use pocketmine\Player;
class Quartz extends Solid{
const QUARTZ_NORMAL = 0;
const QUARTZ_CHISELED = 1;
const QUARTZ_PILLAR = 2;
const QUARTZ_PILLAR2 = 3;
protected $id = self::QUARTZ_BLOCK;
@ -47,10 +49,16 @@ class Quartz extends Solid{
static $names = [
self::QUARTZ_NORMAL => "Quartz Block",
self::QUARTZ_CHISELED => "Chiseled Quartz Block",
self::QUARTZ_PILLAR => "Quartz Pillar",
self::QUARTZ_PILLAR2 => "Quartz Pillar",
self::QUARTZ_PILLAR => "Quartz Pillar"
];
return $names[$this->meta & 0x03];
return $names[$this->meta & 0x03] ?? "Unknown";
}
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
if($this->meta !== self::QUARTZ_NORMAL){
$this->meta = PillarRotationHelper::getMetaFromFace($this->meta, $face);
}
return $this->getLevel()->setBlock($blockReplace, $this, true, true);
}
public function getToolType() : int{

View File

@ -55,9 +55,9 @@ class Rail extends Flowable{
return 0.7;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
if(!$block->getSide(Vector3::SIDE_DOWN)->isTransparent()){
return $this->getLevel()->setBlock($block, $this, true, true);
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
if(!$blockReplace->getSide(Vector3::SIDE_DOWN)->isTransparent()){
return $this->getLevel()->setBlock($blockReplace, $this, true, true);
}
return false;

View File

@ -40,6 +40,9 @@ class RedMushroom extends Flowable{
return "Red Mushroom";
}
public function ticksRandomly() : bool{
return true;
}
public function onUpdate(int $type){
if($type === Level::BLOCK_UPDATE_NORMAL){
@ -53,10 +56,10 @@ class RedMushroom extends Flowable{
return false;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$down = $this->getSide(Vector3::SIDE_DOWN);
if($down->isTransparent() === false){
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}

View File

@ -46,7 +46,7 @@ class RedstoneOre extends Solid{
return 3;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
return $this->getLevel()->setBlock($this, $this, true, false);
}

View File

@ -57,11 +57,14 @@ class Sapling extends Flowable{
return $names[$this->meta & 0x07] ?? "Unknown";
}
public function ticksRandomly() : bool{
return true;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$down = $this->getSide(Vector3::SIDE_DOWN);
if($down->getId() === self::GRASS or $down->getId() === self::DIRT or $down->getId() === self::FARMLAND){
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}

View File

@ -60,13 +60,13 @@ class SignPost extends Transparent{
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
if($face !== Vector3::SIDE_DOWN){
$nbt = new CompoundTag("", [
new StringTag("id", Tile::SIGN),
new IntTag("x", $block->x),
new IntTag("y", $block->y),
new IntTag("z", $block->z),
new IntTag("x", $blockReplace->x),
new IntTag("y", $blockReplace->y),
new IntTag("z", $blockReplace->z),
new StringTag("Text1", ""),
new StringTag("Text2", ""),
new StringTag("Text3", ""),
@ -85,10 +85,10 @@ class SignPost extends Transparent{
if($face === Vector3::SIDE_UP){
$this->meta = floor((($player->yaw + 180) * 16 / 360) + 0.5) & 0x0f;
$this->getLevel()->setBlock($block, $this, true);
$this->getLevel()->setBlock($blockReplace, $this, true);
}else{
$this->meta = $face;
$this->getLevel()->setBlock($block, new WallSign($this->meta), true);
$this->getLevel()->setBlock($blockReplace, new WallSign($this->meta), true);
}
Tile::createTile(Tile::SIGN, $this->getLevel(), $nbt);

View File

@ -64,7 +64,7 @@ class Skull extends Flowable{
);
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
if($face !== Vector3::SIDE_DOWN){
$this->meta = $face;
if($face === Vector3::SIDE_UP){
@ -72,7 +72,7 @@ class Skull extends Flowable{
}else{
$rot = $face;
}
$this->getLevel()->setBlock($block, $this, true);
$this->getLevel()->setBlock($blockReplace, $this, true);
$nbt = new CompoundTag("", [
new StringTag("id", Tile::SKULL),
new ByteTag("SkullType", $item->getDamage()),

View File

@ -54,11 +54,14 @@ class SnowLayer extends Flowable{
return Tool::TYPE_SHOVEL;
}
public function ticksRandomly() : bool{
return true;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
if($block->getSide(Vector3::SIDE_DOWN)->isSolid()){
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
if($blockReplace->getSide(Vector3::SIDE_DOWN)->isSolid()){
//TODO: fix placement
$this->getLevel()->setBlock($block, $this, true);
$this->getLevel()->setBlock($blockReplace, $this, true);
return true;
}

View File

@ -130,18 +130,18 @@ abstract class Stair extends Transparent{
}
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$faces = [
0 => 0,
1 => 2,
2 => 1,
3 => 3,
3 => 3
];
$this->meta = $faces[$player->getDirection()] & 0x03;
if(($facePos->y > 0.5 and $face !== Vector3::SIDE_UP) or $face === Vector3::SIDE_DOWN){
$this->meta |= 0x04; //Upside-down stairs
}
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}

View File

@ -51,7 +51,7 @@ class StoneBricks extends Solid{
self::NORMAL => "Stone Bricks",
self::MOSSY => "Mossy Stone Bricks",
self::CRACKED => "Cracked Stone Bricks",
self::CHISELED => "Chiseled Stone Bricks",
self::CHISELED => "Chiseled Stone Bricks"
];
return $names[$this->meta & 0x03];
}

View File

@ -53,7 +53,7 @@ class StoneSlab extends WoodenSlab{
self::BRICK => "Brick",
self::STONE_BRICK => "Stone Brick",
self::QUARTZ => "Quartz",
self::NETHER_BRICK => "Nether Brick",
self::NETHER_BRICK => "Nether Brick"
];
return (($this->meta & 0x08) > 0 ? "Upper " : "") . $names[$this->meta & 0x07] . " Slab";
}

View File

@ -44,6 +44,10 @@ class Sugarcane extends Flowable{
return "Sugarcane";
}
public function ticksRandomly() : bool{
return true;
}
public function onActivate(Item $item, Player $player = null) : bool{
if($item->getId() === Item::DYE and $item->getDamage() === 0x0F){ //Bonemeal
if($this->getSide(Vector3::SIDE_DOWN)->getId() !== self::SUGARCANE_BLOCK){
@ -102,10 +106,10 @@ class Sugarcane extends Flowable{
return false;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$down = $this->getSide(Vector3::SIDE_DOWN);
if($down->getId() === self::SUGARCANE_BLOCK){
$this->getLevel()->setBlock($block, BlockFactory::get(Block::SUGARCANE_BLOCK), true);
$this->getLevel()->setBlock($blockReplace, BlockFactory::get(Block::SUGARCANE_BLOCK), true);
return true;
}elseif($down->getId() === self::GRASS or $down->getId() === self::DIRT or $down->getId() === self::SAND){
@ -114,7 +118,7 @@ class Sugarcane extends Flowable{
$block2 = $down->getSide(Vector3::SIDE_WEST);
$block3 = $down->getSide(Vector3::SIDE_EAST);
if(($block0 instanceof Water) or ($block1 instanceof Water) or ($block2 instanceof Water) or ($block3 instanceof Water)){
$this->getLevel()->setBlock($block, BlockFactory::get(Block::SUGARCANE_BLOCK), true);
$this->getLevel()->setBlock($blockReplace, BlockFactory::get(Block::SUGARCANE_BLOCK), true);
return true;
}

View File

@ -50,10 +50,10 @@ class TallGrass extends Flowable{
return $names[$this->meta & 0x03] ?? "Unknown";
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$down = $this->getSide(Vector3::SIDE_DOWN);
if($down->getId() === self::GRASS){
$this->getLevel()->setBlock($block, $this, true);
$this->getLevel()->setBlock($blockReplace, $this, true);
return true;
}

View File

@ -68,24 +68,24 @@ class Torch extends Flowable{
return false;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$below = $this->getSide(Vector3::SIDE_DOWN);
if($target->isTransparent() === false and $face !== Vector3::SIDE_DOWN){
if($blockClicked->isTransparent() === false and $face !== Vector3::SIDE_DOWN){
$faces = [
Vector3::SIDE_UP => 5,
Vector3::SIDE_NORTH => 4,
Vector3::SIDE_SOUTH => 3,
Vector3::SIDE_WEST => 2,
Vector3::SIDE_EAST => 1,
Vector3::SIDE_EAST => 1
];
$this->meta = $faces[$face];
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}elseif($below->isTransparent() === false or $below->getId() === self::FENCE or $below->getId() === self::COBBLESTONE_WALL){
$this->meta = 0;
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}

View File

@ -124,7 +124,7 @@ class Trapdoor extends Transparent{
return $bb;
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$directions = [
0 => 1,
1 => 3,
@ -137,7 +137,7 @@ class Trapdoor extends Transparent{
if(($facePos->y > 0.5 and $face !== self::SIDE_UP) or $face === self::SIDE_DOWN){
$this->meta |= self::MASK_UPPER; //top half of block
}
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}

View File

@ -67,6 +67,10 @@ class Vine extends Transparent{
return true;
}
public function ticksRandomly() : bool{
return true;
}
public function onEntityCollide(Entity $entity){
$entity->resetFallDistance();
}
@ -132,18 +136,18 @@ class Vine extends Transparent{
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
//TODO: multiple sides
if($target->isSolid()){
if($blockClicked->isSolid()){
$faces = [
2 => self::FLAG_SOUTH,
3 => self::FLAG_NORTH,
4 => self::FLAG_EAST,
5 => self::FLAG_WEST,
5 => self::FLAG_WEST
];
if(isset($faces[$face])){
$this->meta = $faces[$face];
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}
@ -169,6 +173,8 @@ class Vine extends Transparent{
$this->level->useBreakOn($this);
return Level::BLOCK_UPDATE_NORMAL;
}
}elseif($type === Level::BLOCK_UPDATE_RANDOM){
//TODO: vine growth
}
return false;

View File

@ -38,7 +38,7 @@ class WallSign extends SignPost{
2 => 3,
3 => 2,
4 => 5,
5 => 4,
5 => 4
];
if($type === Level::BLOCK_UPDATE_NORMAL){
if(isset($faces[$this->meta])){

View File

@ -53,7 +53,7 @@ class Water extends Liquid{
$entity->resetFallDistance();
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$ret = $this->getLevel()->setBlock($this, $this, true, false);
$this->getLevel()->scheduleDelayedBlockUpdate($this, $this->tickRate());

View File

@ -57,9 +57,9 @@ class WaterLily extends Flowable{
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
if($target instanceof Water){
$up = $target->getSide(Vector3::SIDE_UP);
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
if($blockClicked instanceof Water){
$up = $blockClicked->getSide(Vector3::SIDE_UP);
if($up->getId() === Block::AIR){
$this->getLevel()->setBlock($up, $this, true, true);
return true;

View File

@ -23,6 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\PillarRotationHelper;
use pocketmine\item\Item;
use pocketmine\item\Tool;
use pocketmine\math\Vector3;
@ -49,25 +50,14 @@ class Wood extends Solid{
self::OAK => "Oak Wood",
self::SPRUCE => "Spruce Wood",
self::BIRCH => "Birch Wood",
self::JUNGLE => "Jungle Wood",
self::JUNGLE => "Jungle Wood"
];
return $names[$this->meta & 0x03];
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
$faces = [
Vector3::SIDE_DOWN => 0,
Vector3::SIDE_UP => 0,
Vector3::SIDE_NORTH => 0b1000,
Vector3::SIDE_SOUTH => 0b1000,
Vector3::SIDE_WEST => 0b0100,
Vector3::SIDE_EAST => 0b0100,
];
$this->meta = ($this->meta & 0x03) | $faces[$face];
$this->getLevel()->setBlock($block, $this, true, true);
return true;
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$this->meta = PillarRotationHelper::getMetaFromFace($this->meta, $face);
return $this->getLevel()->setBlock($blockReplace, $this, true, true);
}
public function getVariantBitmask() : int{

View File

@ -82,34 +82,34 @@ class WoodenSlab extends Transparent{
return $with !== null and $with->getId() === $this->getId() and ($with->getDamage() & 0x07) === ($this->getDamage() & 0x07);
}
public function place(Item $item, Block $block, Block $target, int $face, Vector3 $facePos, Player $player = null) : bool{
public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $facePos, Player $player = null) : bool{
$this->meta &= 0x07;
if($face === Vector3::SIDE_DOWN){
if($target->getId() === $this->id and ($target->getDamage() & 0x08) === 0x08 and ($target->getDamage() & 0x07) === $this->meta){
$this->getLevel()->setBlock($target, BlockFactory::get($this->doubleId, $this->meta), true);
if($blockClicked->getId() === $this->id and ($blockClicked->getDamage() & 0x08) === 0x08 and ($blockClicked->getDamage() & 0x07) === $this->meta){
$this->getLevel()->setBlock($blockClicked, BlockFactory::get($this->doubleId, $this->meta), true);
return true;
}elseif($block->getId() === $this->id and ($block->getDamage() & 0x07) === $this->meta){
$this->getLevel()->setBlock($block, BlockFactory::get($this->doubleId, $this->meta), true);
}elseif($blockReplace->getId() === $this->id and ($blockReplace->getDamage() & 0x07) === $this->meta){
$this->getLevel()->setBlock($blockReplace, BlockFactory::get($this->doubleId, $this->meta), true);
return true;
}else{
$this->meta |= 0x08;
}
}elseif($face === Vector3::SIDE_UP){
if($target->getId() === $this->id and ($target->getDamage() & 0x08) === 0 and ($target->getDamage() & 0x07) === $this->meta){
$this->getLevel()->setBlock($target, BlockFactory::get($this->doubleId, $this->meta), true);
if($blockClicked->getId() === $this->id and ($blockClicked->getDamage() & 0x08) === 0 and ($blockClicked->getDamage() & 0x07) === $this->meta){
$this->getLevel()->setBlock($blockClicked, BlockFactory::get($this->doubleId, $this->meta), true);
return true;
}elseif($block->getId() === $this->id and ($block->getDamage() & 0x07) === $this->meta){
$this->getLevel()->setBlock($block, BlockFactory::get($this->doubleId, $this->meta), true);
}elseif($blockReplace->getId() === $this->id and ($blockReplace->getDamage() & 0x07) === $this->meta){
$this->getLevel()->setBlock($blockReplace, BlockFactory::get($this->doubleId, $this->meta), true);
return true;
}
}else{ //TODO: collision
if($block->getId() === $this->id){
if(($block->getDamage() & 0x07) === $this->meta){
$this->getLevel()->setBlock($block, BlockFactory::get($this->doubleId, $this->meta), true);
if($blockReplace->getId() === $this->id){
if(($blockReplace->getDamage() & 0x07) === $this->meta){
$this->getLevel()->setBlock($blockReplace, BlockFactory::get($this->doubleId, $this->meta), true);
return true;
}
@ -122,10 +122,10 @@ class WoodenSlab extends Transparent{
}
}
if($block->getId() === $this->id and ($target->getDamage() & 0x07) !== ($this->meta & 0x07)){
if($blockReplace->getId() === $this->id and ($blockClicked->getDamage() & 0x07) !== ($this->meta & 0x07)){
return false;
}
$this->getLevel()->setBlock($block, $this, true, true);
$this->getLevel()->setBlock($blockReplace, $this, true, true);
return true;
}

View File

@ -42,7 +42,7 @@ class ColorBlockMetaHelper{
12 => "Brown",
13 => "Green",
14 => "Red",
15 => "Black",
15 => "Black"
];
return $names[$meta] ?? "Unknown";

View File

@ -21,12 +21,19 @@
declare(strict_types=1);
namespace pocketmine\item;
namespace pocketmine\block\utils;
use pocketmine\math\Vector3;
class Diamond extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::DIAMOND, $meta, $count, "Diamond");
class PillarRotationHelper{
public static function getMetaFromFace(int $meta, int $face) : int{
$faces = [
Vector3::SIDE_DOWN => 0,
Vector3::SIDE_NORTH => 0x08,
Vector3::SIDE_WEST => 0x04,
];
return ($meta & 0x03) | $faces[$face & ~0x01];
}
}

View File

@ -25,8 +25,8 @@ namespace pocketmine\item;
class Apple extends Food{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::APPLE, $meta, $count, "Apple");
public function __construct(int $meta = 0){
parent::__construct(self::APPLE, $meta, "Apple");
}
public function getFoodRestore() : int{

View File

@ -24,8 +24,8 @@ declare(strict_types=1);
namespace pocketmine\item;
class Arrow extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::ARROW, $meta, $count, "Arrow");
public function __construct(int $meta = 0){
parent::__construct(self::ARROW, $meta, "Arrow");
}
}

View File

@ -24,8 +24,8 @@ declare(strict_types=1);
namespace pocketmine\item;
class BakedPotato extends Food{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::BAKED_POTATO, $meta, $count, "Baked Potato");
public function __construct(int $meta = 0){
parent::__construct(self::BAKED_POTATO, $meta, "Baked Potato");
}
public function getFoodRestore() : int{

View File

@ -27,9 +27,9 @@ use pocketmine\block\Block;
use pocketmine\block\BlockFactory;
class Bed extends Item{
public function __construct($meta = 0, $count = 1){
public function __construct(int $meta = 0){
$this->block = BlockFactory::get(Block::BED_BLOCK);
parent::__construct(self::BED, $meta, $count, "Bed");
parent::__construct(self::BED, $meta, "Bed");
}
public function getMaxStackSize(){

View File

@ -24,8 +24,8 @@ declare(strict_types=1);
namespace pocketmine\item;
class Beetroot extends Food{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::BEETROOT, $meta, $count, "Beetroot");
public function __construct(int $meta = 0){
parent::__construct(self::BEETROOT, $meta, "Beetroot");
}
public function getFoodRestore() : int{

View File

@ -27,8 +27,8 @@ use pocketmine\block\Block;
use pocketmine\block\BlockFactory;
class BeetrootSeeds extends Item{
public function __construct($meta = 0, $count = 1){
public function __construct(int $meta = 0){
$this->block = BlockFactory::get(Block::BEETROOT_BLOCK);
parent::__construct(self::BEETROOT_SEEDS, $meta, $count, "Beetroot Seeds");
parent::__construct(self::BEETROOT_SEEDS, $meta, "Beetroot Seeds");
}
}

View File

@ -25,8 +25,8 @@ namespace pocketmine\item;
class BeetrootSoup extends Food{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::BEETROOT_SOUP, $meta, $count, "Beetroot Soup");
public function __construct(int $meta = 0){
parent::__construct(self::BEETROOT_SOUP, $meta, "Beetroot Soup");
}
public function getMaxStackSize(){

View File

@ -1,30 +0,0 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\item;
class BlazePowder extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::BLAZE_POWDER, $meta, $count, "Blaze Powder");
}
}

View File

@ -24,11 +24,13 @@ declare(strict_types=1);
namespace pocketmine\item;
class Boat extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::BOAT, $meta, $count, "Boat");
public function __construct(int $meta = 0){
parent::__construct(self::BOAT, $meta, "Boat");
}
public function getFuelTime() : int{
return 1200; //400 in PC
}
//TODO
}

View File

@ -1,32 +0,0 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\item;
class Bone extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::BONE, $meta, $count, "Bone");
}
}

View File

@ -24,8 +24,8 @@ declare(strict_types=1);
namespace pocketmine\item;
class Book extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::BOOK, $meta, $count, "Book");
public function __construct(int $meta = 0){
parent::__construct(self::BOOK, $meta, "Book");
}
}

View File

@ -23,14 +23,103 @@ declare(strict_types=1);
namespace pocketmine\item;
use pocketmine\entity\Entity;
use pocketmine\entity\Projectile;
use pocketmine\event\entity\EntityShootBowEvent;
use pocketmine\event\entity\ProjectileLaunchEvent;
use pocketmine\level\sound\LaunchSound;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\nbt\tag\DoubleTag;
use pocketmine\nbt\tag\FloatTag;
use pocketmine\nbt\tag\ListTag;
use pocketmine\nbt\tag\ShortTag;
use pocketmine\Player;
class Bow extends Tool{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::BOW, $meta, $count, "Bow");
public function __construct(int $meta = 0){
parent::__construct(self::BOW, $meta, "Bow");
}
public function getFuelTime() : int{
return 200;
}
public function getMaxDurability(){
return 385;
}
public function onReleaseUsing(Player $player) : bool{
if($player->isSurvival() and !$player->getInventory()->contains(ItemFactory::get(Item::ARROW, 0, 1))){
$player->getInventory()->sendContents($player);
}
$nbt = new CompoundTag("", [
new ListTag("Pos", [
new DoubleTag("", $player->x),
new DoubleTag("", $player->y + $player->getEyeHeight()),
new DoubleTag("", $player->z)
]),
new ListTag("Motion", [
new DoubleTag("", -sin($player->yaw / 180 * M_PI) * cos($player->pitch / 180 * M_PI)),
new DoubleTag("", -sin($player->pitch / 180 * M_PI)),
new DoubleTag("", cos($player->yaw / 180 * M_PI) * cos($player->pitch / 180 * M_PI))
]),
new ListTag("Rotation", [
//yaw/pitch for arrows taken crosswise, not along the arrow shaft.
new FloatTag("", ($player->yaw > 180 ? 360 : 0) - $player->yaw), //arrow yaw must range from -180 to +180
new FloatTag("", -$player->pitch)
]),
new ShortTag("Fire", $player->isOnFire() ? 45 * 60 : 0)
]);
$diff = $player->getItemUseDuration();
$p = $diff / 20;
$force = min((($p ** 2) + $p * 2) / 3, 1) * 2;
$entity = Entity::createEntity("Arrow", $player->getLevel(), $nbt, $player, $force == 2);
if($entity instanceof Projectile){
$ev = new EntityShootBowEvent($player, $this, $entity, $force);
if($force < 0.1 or $diff < 5){
$ev->setCancelled();
}
$player->getServer()->getPluginManager()->callEvent($ev);
$entity = $ev->getProjectile(); //This might have been changed by plugins
if($ev->isCancelled()){
$entity->kill();
$player->getInventory()->sendContents($player);
}else{
$entity->setMotion($entity->getMotion()->multiply($ev->getForce()));
if($player->isSurvival()){
$player->getInventory()->removeItem(ItemFactory::get(Item::ARROW, 0, 1));
$this->setDamage($this->getDamage() + 1);
if($this->getDamage() >= $this->getMaxDurability()){
$player->getInventory()->setItemInHand(ItemFactory::get(Item::AIR, 0, 0));
}else{
$player->getInventory()->setItemInHand($this);
}
}
if($entity instanceof Projectile){
$player->getServer()->getPluginManager()->callEvent($projectileEv = new ProjectileLaunchEvent($entity));
if($projectileEv->isCancelled()){
$ev->getProjectile()->kill();
}else{
$ev->getProjectile()->spawnToAll();
$player->level->addSound(new LaunchSound($player), $player->getViewers());
}
}else{
$entity->spawnToAll();
}
}
}else{
$entity->spawnToAll();
}
return true;
}
}

View File

@ -25,8 +25,9 @@ namespace pocketmine\item;
class Bowl extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::BOWL, $meta, $count, "Bowl");
public function __construct(int $meta = 0){
parent::__construct(self::BOWL, $meta, "Bowl");
}
//TODO: check fuel
}

View File

@ -24,8 +24,8 @@ declare(strict_types=1);
namespace pocketmine\item;
class Bread extends Food{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::BREAD, $meta, $count, "Bread");
public function __construct(int $meta = 0){
parent::__construct(self::BREAD, $meta, "Bread");
}
public function getFoodRestore() : int{

View File

@ -23,8 +23,11 @@ declare(strict_types=1);
namespace pocketmine\item;
use pocketmine\block\Block;
class BrewingStand extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::BREWING_STAND, $meta, $count, "Brewing Stand");
public function __construct(int $meta = 0){
$this->block = Block::get(Block::BREWING_STAND_BLOCK);
parent::__construct(self::BREWING_STAND, $meta, "Brewing Stand");
}
}

View File

@ -1,32 +0,0 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\item;
class Brick extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::BRICK, $meta, $count, "Brick");
}
}

View File

@ -33,8 +33,8 @@ use pocketmine\math\Vector3;
use pocketmine\Player;
class Bucket extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::BUCKET, $meta, $count, "Bucket");
public function __construct(int $meta = 0){
parent::__construct(self::BUCKET, $meta, "Bucket");
}
public function getMaxStackSize(){

View File

@ -27,9 +27,9 @@ use pocketmine\block\Block;
use pocketmine\block\BlockFactory;
class Cake extends Item{
public function __construct($meta = 0, $count = 1){
public function __construct(int $meta = 0){
$this->block = BlockFactory::get(Block::CAKE_BLOCK);
parent::__construct(self::CAKE, $meta, $count, "Cake");
parent::__construct(self::CAKE, $meta, "Cake");
}
public function getMaxStackSize(){

View File

@ -27,9 +27,9 @@ use pocketmine\block\Block;
use pocketmine\block\BlockFactory;
class Carrot extends Food{
public function __construct($meta = 0, $count = 1){
public function __construct(int $meta = 0){
$this->block = BlockFactory::get(Block::CARROT_BLOCK);
parent::__construct(self::CARROT, $meta, $count, "Carrot");
parent::__construct(self::CARROT, $meta, "Carrot");
}
public function getFoodRestore() : int{

View File

@ -25,7 +25,11 @@ namespace pocketmine\item;
class ChainBoots extends Armor{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::CHAIN_BOOTS, $meta, $count, "Chainmail Boots");
public function __construct(int $meta = 0){
parent::__construct(self::CHAIN_BOOTS, $meta, "Chainmail Boots");
}
public function getDefensePoints() : int{
return 1;
}
}

View File

@ -25,7 +25,11 @@ namespace pocketmine\item;
class ChainChestplate extends Armor{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::CHAIN_CHESTPLATE, $meta, $count, "Chain Chestplate");
public function __construct(int $meta = 0){
parent::__construct(self::CHAIN_CHESTPLATE, $meta, "Chain Chestplate");
}
public function getDefensePoints() : int{
return 5;
}
}

View File

@ -25,7 +25,11 @@ namespace pocketmine\item;
class ChainHelmet extends Armor{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::CHAIN_HELMET, $meta, $count, "Chainmail Helmet");
public function __construct(int $meta = 0){
parent::__construct(self::CHAIN_HELMET, $meta, "Chainmail Helmet");
}
public function getDefensePoints() : int{
return 2;
}
}

View File

@ -25,7 +25,11 @@ namespace pocketmine\item;
class ChainLeggings extends Armor{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::CHAIN_LEGGINGS, $meta, $count, "Chain Leggings");
public function __construct(int $meta = 0){
parent::__construct(self::CHAIN_LEGGINGS, $meta, "Chain Leggings");
}
public function getDefensePoints() : int{
return 4;
}
}

View File

@ -1,32 +0,0 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\item;
class Clay extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::CLAY, $meta, $count, "Clay");
}
}

View File

@ -24,8 +24,8 @@ declare(strict_types=1);
namespace pocketmine\item;
class Clock extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::CLOCK, $meta, $count, "Clock");
public function __construct(int $meta = 0){
parent::__construct(self::CLOCK, $meta, "Clock");
}
}

View File

@ -25,8 +25,8 @@ namespace pocketmine\item;
class Coal extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::COAL, $meta, $count, "Coal");
public function __construct(int $meta = 0){
parent::__construct(self::COAL, $meta, "Coal");
if($this->meta === 1){
$this->name = "Charcoal";
}

View File

@ -24,8 +24,8 @@ declare(strict_types=1);
namespace pocketmine\item;
class Compass extends Item{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::COMPASS, $meta, $count, "Compass");
public function __construct(int $meta = 0){
parent::__construct(self::COMPASS, $meta, "Compass");
}
}

View File

@ -24,8 +24,8 @@ declare(strict_types=1);
namespace pocketmine\item;
class CookedChicken extends Food{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::COOKED_CHICKEN, $meta, $count, "Cooked Chicken");
public function __construct(int $meta = 0){
parent::__construct(self::COOKED_CHICKEN, $meta, "Cooked Chicken");
}
public function getFoodRestore() : int{

View File

@ -24,8 +24,8 @@ declare(strict_types=1);
namespace pocketmine\item;
class CookedFish extends Fish{
public function __construct($meta = 0, $count = 1){
Food::__construct(self::COOKED_FISH, $meta, $count, $meta === self::FISH_SALMON ? "Cooked Salmon" : "Cooked Fish");
public function __construct(int $meta = 0){
Food::__construct(self::COOKED_FISH, $meta, $meta === self::FISH_SALMON ? "Cooked Salmon" : "Cooked Fish");
}
public function getFoodRestore() : int{

View File

@ -24,8 +24,8 @@ declare(strict_types=1);
namespace pocketmine\item;
class CookedPorkchop extends Food{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::COOKED_PORKCHOP, $meta, $count, "Cooked Porkchop");
public function __construct(int $meta = 0){
parent::__construct(self::COOKED_PORKCHOP, $meta, "Cooked Porkchop");
}
public function getFoodRestore() : int{

View File

@ -24,8 +24,8 @@ declare(strict_types=1);
namespace pocketmine\item;
class CookedRabbit extends Food{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::COOKED_RABBIT, $meta, $count, "Cooked Rabbit");
public function __construct(int $meta = 0){
parent::__construct(self::COOKED_RABBIT, $meta, "Cooked Rabbit");
}
public function getFoodRestore() : int{

View File

@ -24,8 +24,8 @@ declare(strict_types=1);
namespace pocketmine\item;
class Cookie extends Food{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::COOKIE, $meta, $count, "Cookie");
public function __construct(int $meta = 0){
parent::__construct(self::COOKIE, $meta, "Cookie");
}
public function getFoodRestore() : int{

View File

@ -25,12 +25,15 @@ namespace pocketmine\item;
class DiamondAxe extends Tool{
public function __construct($meta = 0, $count = 1){
parent::__construct(self::DIAMOND_AXE, $meta, $count, "Diamond Axe");
public function __construct(int $meta = 0){
parent::__construct(self::DIAMOND_AXE, $meta, "Diamond Axe");
}
public function isAxe(){
return Tool::TIER_DIAMOND;
}
public function getAttackPoints() : int{
return 7;
}
}

Some files were not shown because too many files have changed in this diff Show More