Item factory refactor and added capability to register custom items

This commit is contained in:
Dylan K. Taylor 2017-08-20 19:11:21 +01:00
parent 604d11a8fd
commit 876659cc73
66 changed files with 491 additions and 347 deletions

View File

@ -83,6 +83,7 @@ use pocketmine\inventory\ShapedRecipe;
use pocketmine\inventory\ShapelessRecipe;
use pocketmine\inventory\SimpleTransactionGroup;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\ChunkLoader;
use pocketmine\level\format\Chunk;
use pocketmine\level\Level;
@ -1416,7 +1417,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}
if($entity instanceof Arrow and $entity->hadCollision){
$item = Item::get(Item::ARROW, 0, 1);
$item = ItemFactory::get(Item::ARROW, 0, 1);
if($this->isSurvival() and !$this->inventory->canAddItem($item)){
continue;
}
@ -2320,7 +2321,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
if($this->isSurvival()){
if($item->isTool()){
if($item->useOn($target) and $item->getDamage() >= $item->getMaxDurability()){
$this->inventory->setItemInHand(Item::get(Item::AIR, 0, 1));
$this->inventory->setItemInHand(ItemFactory::get(Item::AIR, 0, 1));
}else{
$this->inventory->setItemInHand($item);
}
@ -2453,7 +2454,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
$snowball->setMotion($snowball->getMotion()->multiply($f));
if($this->isSurvival()){
$item->setCount($item->getCount() - 1);
$this->inventory->setItemInHand($item->getCount() > 0 ? $item : Item::get(Item::AIR));
$this->inventory->setItemInHand($item->getCount() > 0 ? $item : ItemFactory::get(Item::AIR));
}
if($snowball instanceof Projectile){
$this->server->getPluginManager()->callEvent($projectileEv = new ProjectileLaunchEvent($snowball));
@ -2521,7 +2522,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
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(Item::get(Item::ARROW, 0, 1))){
if($this->isSurvival() and !$this->inventory->contains(ItemFactory::get(Item::ARROW, 0, 1))){
$this->inventory->sendContents($this);
break;
}
@ -2562,10 +2563,10 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
}else{
$ev->getProjectile()->setMotion($ev->getProjectile()->getMotion()->multiply($ev->getForce()));
if($this->isSurvival()){
$this->inventory->removeItem(Item::get(Item::ARROW, 0, 1));
$this->inventory->removeItem(ItemFactory::get(Item::ARROW, 0, 1));
$bow->setDamage($bow->getDamage() + 1);
if($bow->getDamage() >= 385){
$this->inventory->setItemInHand(Item::get(Item::AIR, 0, 0));
$this->inventory->setItemInHand(ItemFactory::get(Item::AIR, 0, 0));
}else{
$this->inventory->setItemInHand($bow);
}
@ -2602,7 +2603,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
$slot = $this->inventory->getItemInHand();
--$slot->count;
$this->inventory->setItemInHand($slot);
$this->inventory->addItem(Item::get(Item::BUCKET, 0, 1));
$this->inventory->addItem(ItemFactory::get(Item::BUCKET, 0, 1));
}
$this->removeAllEffects();
@ -2757,7 +2758,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
return true;
}
$this->inventory->setItemInHand(Item::get(Item::AIR, 0, 1));
$this->inventory->setItemInHand(ItemFactory::get(Item::AIR, 0, 1));
$motion = $this->getDirectionVector()->multiply(0.4);
$this->level->dropItem($this->add(0, 1.3, 0), $item, $motion, 40);
@ -2983,7 +2984,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
$newItem = clone $item;
$newItem->setCount($item->getCount() - $count);
}else{
$newItem = Item::get(Item::AIR, 0, 0);
$newItem = ItemFactory::get(Item::AIR, 0, 0);
}
$this->inventory->setItem($slot, $newItem);
@ -3015,7 +3016,7 @@ class Player extends Human implements CommandSender, ChunkLoader, IPlayer{
case Item::CAKE:
//TODO: detect complex recipes like cake that leave remains
$this->awardAchievement("bakeCake");
$this->inventory->addItem(Item::get(Item::BUCKET, 0, 3));
$this->inventory->addItem(ItemFactory::get(Item::BUCKET, 0, 3));
break;
case Item::STONE_PICKAXE:
case Item::GOLDEN_PICKAXE:

View File

@ -50,7 +50,7 @@ use pocketmine\inventory\CraftingManager;
use pocketmine\inventory\InventoryType;
use pocketmine\inventory\Recipe;
use pocketmine\item\enchantment\Enchantment;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\lang\BaseLang;
use pocketmine\level\format\io\leveldb\LevelDB;
use pocketmine\level\format\io\LevelProvider;
@ -1585,7 +1585,7 @@ class Server{
InventoryType::init();
BlockFactory::init();
Enchantment::init();
Item::init();
ItemFactory::init();
Biome::init();
Effect::init();
Attribute::init();

View File

@ -25,6 +25,7 @@ namespace pocketmine\block;
use pocketmine\inventory\AnvilInventory;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
use pocketmine\math\Vector3;
use pocketmine\Player;
@ -83,7 +84,7 @@ class Anvil extends Fallable{
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_WOODEN){
return [
Item::get($this->getItemId(), $this->getDamage() & 0x0c, 1),
ItemFactory::get($this->getItemId(), $this->getDamage() & 0x0c, 1),
];
}

View File

@ -25,6 +25,7 @@ namespace pocketmine\block;
use pocketmine\event\TranslationContainer;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\Level;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Vector3;
@ -219,11 +220,11 @@ class Bed extends Transparent{
$tile = $this->getLevel()->getTile($this);
if($tile instanceof TileBed){
return [
Item::get($this->getItemId(), $tile->getColor(), 1)
ItemFactory::get($this->getItemId(), $tile->getColor(), 1)
];
}else{
return [
Item::get($this->getItemId(), 14, 1) //Red
ItemFactory::get($this->getItemId(), 14, 1) //Red
];
}
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
class Beetroot extends Crops{
@ -40,13 +41,13 @@ class Beetroot extends Crops{
public function getDrops(Item $item) : array{
if($this->meta >= 0x07){
return [
Item::get(Item::BEETROOT, 0, 1),
Item::get(Item::BEETROOT_SEEDS, 0, mt_rand(0, 3))
ItemFactory::get(Item::BEETROOT, 0, 1),
ItemFactory::get(Item::BEETROOT_SEEDS, 0, mt_rand(0, 3))
];
}
return [
Item::get(Item::BEETROOT_SEEDS, 0, 1)
ItemFactory::get(Item::BEETROOT_SEEDS, 0, 1)
];
}
}

View File

@ -28,6 +28,7 @@ namespace pocketmine\block;
use pocketmine\entity\Entity;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
use pocketmine\level\Level;
use pocketmine\level\MovingObjectPosition;
@ -338,7 +339,7 @@ class Block extends Position implements BlockIds, Metadatable{
*/
public function getDrops(Item $item) : array{
return [
Item::get($this->getItemId(), $this->getDamage() & $this->getVariantBitmask(), 1),
ItemFactory::get($this->getItemId(), $this->getDamage() & $this->getVariantBitmask(), 1),
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class Bookshelf extends Solid{
@ -48,7 +49,7 @@ class Bookshelf extends Solid{
public function getDrops(Item $item) : array{
return [
Item::get(Item::BOOK, 0, 3)
ItemFactory::get(Item::BOOK, 0, 3)
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
class Carrot extends Crops{
@ -39,7 +40,7 @@ class Carrot extends Crops{
public function getDrops(Item $item) : array{
return [
Item::get(Item::CARROT, 0, $this->meta >= 0x07 ? mt_rand(1, 4) : 1)
ItemFactory::get(Item::CARROT, 0, $this->meta >= 0x07 ? mt_rand(1, 4) : 1)
];
}
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class Clay extends Solid{
@ -48,7 +49,7 @@ class Clay extends Solid{
public function getDrops(Item $item) : array{
return [
Item::get(Item::CLAY_BALL, 0, 4)
ItemFactory::get(Item::CLAY_BALL, 0, 4)
];
}
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class CoalOre extends Solid{
@ -49,7 +50,7 @@ class CoalOre extends Solid{
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_WOODEN){
return [
Item::get(Item::COAL, 0, 1)
ItemFactory::get(Item::COAL, 0, 1)
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class DiamondOre extends Solid{
@ -49,7 +50,7 @@ class DiamondOre extends Solid{
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_IRON){
return [
Item::get(Item::DIAMOND, 0, 1)
ItemFactory::get(Item::DIAMOND, 0, 1)
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\Level;
use pocketmine\math\Vector3;
use pocketmine\Player;
@ -112,7 +113,7 @@ class DoublePlant extends Flowable{
if(!$item->isShears() and ($this->meta === 2 or $this->meta === 3)){ //grass or fern
if(mt_rand(0, 24) === 0){
return [
Item::get(Item::SEEDS, 0, 1)
ItemFactory::get(Item::SEEDS, 0, 1)
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class DoubleStoneSlab extends Solid{
@ -59,7 +60,7 @@ class DoubleStoneSlab extends Solid{
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_WOODEN){
return [
Item::get(Item::STONE_SLAB, $this->getDamage() & 0x07, 2),
ItemFactory::get(Item::STONE_SLAB, $this->getDamage() & 0x07, 2),
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class DoubleWoodenSlab extends Solid{
@ -56,7 +57,7 @@ class DoubleWoodenSlab extends Solid{
public function getDrops(Item $item) : array{
return [
Item::get(Item::WOODEN_SLAB, $this->getDamage() & 0x07, 2)
ItemFactory::get(Item::WOODEN_SLAB, $this->getDamage() & 0x07, 2)
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class EmeraldOre extends Solid{
@ -49,7 +50,7 @@ class EmeraldOre extends Solid{
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_IRON){
return [
Item::get(Item::EMERALD, 0, 1),
ItemFactory::get(Item::EMERALD, 0, 1),
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
use pocketmine\math\AxisAlignedBB;
@ -60,7 +61,7 @@ class Farmland extends Transparent{
public function getDrops(Item $item) : array{
return [
Item::get(Item::DIRT, 0, 1)
ItemFactory::get(Item::DIRT, 0, 1)
];
}
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\Level;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Vector3;
@ -116,7 +117,7 @@ class FlowerPot extends Flowable{
if($player instanceof Player){
if($player->isSurvival()){
$item->setCount($item->getCount() - 1);
$player->getInventory()->setItemInHand($item->getCount() > 0 ? $item : Item::get(Item::AIR));
$player->getInventory()->setItemInHand($item->getCount() > 0 ? $item : ItemFactory::get(Item::AIR));
}
}
return true;

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class Glowstone extends Transparent{
@ -52,7 +53,7 @@ class Glowstone extends Transparent{
public function getDrops(Item $item) : array{
return [
Item::get(Item::GLOWSTONE_DUST, 0, mt_rand(2, 4))
ItemFactory::get(Item::GLOWSTONE_DUST, 0, mt_rand(2, 4))
];
}
}

View File

@ -25,6 +25,7 @@ namespace pocketmine\block;
use pocketmine\event\block\BlockSpreadEvent;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
use pocketmine\level\generator\object\TallGrass as TallGrassObject;
use pocketmine\level\Level;
@ -54,7 +55,7 @@ class Grass extends Solid{
public function getDrops(Item $item) : array{
return [
Item::get(Item::DIRT, 0, 1),
ItemFactory::get(Item::DIRT, 0, 1),
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
use pocketmine\math\AxisAlignedBB;
@ -60,7 +61,7 @@ class GrassPath extends Transparent{
public function getDrops(Item $item) : array{
return [
Item::get(Item::DIRT, 0, 1)
ItemFactory::get(Item::DIRT, 0, 1)
];
}
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class Gravel extends Fallable{
@ -49,7 +50,7 @@ class Gravel extends Fallable{
public function getDrops(Item $item) : array{
if(mt_rand(1, 10) === 1){
return [
Item::get(Item::FLINT, 0, 1)
ItemFactory::get(Item::FLINT, 0, 1)
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\Level;
use pocketmine\math\Vector3;
use pocketmine\nbt\tag\{
@ -69,7 +70,7 @@ class ItemFrame extends Flowable{
$item->setCount($item->getCount() - 1);
$tile->setItem($frameItem);
if($player instanceof Player and $player->isSurvival()){
$player->getInventory()->setItemInHand($item->getCount() <= 0 ? Item::get(Item::AIR) : $item);
$player->getInventory()->setItemInHand($item->getCount() <= 0 ? ItemFactory::get(Item::AIR) : $item);
}
}
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class LapisOre extends Solid{
@ -49,7 +50,7 @@ class LapisOre extends Solid{
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_STONE){
return [
Item::get(Item::DYE, 4, mt_rand(4, 8))
ItemFactory::get(Item::DYE, 4, mt_rand(4, 8))
];
}

View File

@ -25,6 +25,7 @@ namespace pocketmine\block;
use pocketmine\event\block\LeavesDecayEvent;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
use pocketmine\level\Level;
use pocketmine\math\Vector3;
@ -170,13 +171,13 @@ class Leaves extends Transparent{
$variantMeta = $this->getDamage() & 0x03;
if($item->isShears()){
$drops[] = Item::get($this->getItemId(), $variantMeta, 1);
$drops[] = ItemFactory::get($this->getItemId(), $variantMeta, 1);
}else{
if(mt_rand(1, 20) === 1){ //Saplings
$drops[] = Item::get(Item::SAPLING, $variantMeta, 1);
$drops[] = ItemFactory::get(Item::SAPLING, $variantMeta, 1);
}
if($variantMeta === self::OAK and mt_rand(1, 200) === 1){ //Apples
$drops[] = Item::get(Item::APPLE, 0, 1);
$drops[] = ItemFactory::get(Item::APPLE, 0, 1);
}
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
class Leaves2 extends Leaves{
@ -43,11 +44,11 @@ class Leaves2 extends Leaves{
if($item->isShears()){
return [
Item::get($this->getItemId(), $variantMeta, 1)
ItemFactory::get($this->getItemId(), $variantMeta, 1)
];
}elseif(mt_rand(1, 20) === 1){ //Saplings
return [
Item::get(Item::SAPLING, $variantMeta + 4, 1)
ItemFactory::get(Item::SAPLING, $variantMeta + 4, 1)
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class Melon extends Transparent{
@ -48,7 +49,7 @@ class Melon extends Transparent{
public function getDrops(Item $item) : array{
return [
Item::get(Item::MELON_SLICE, 0, mt_rand(3, 7))
ItemFactory::get(Item::MELON_SLICE, 0, mt_rand(3, 7))
];
}
}

View File

@ -25,6 +25,7 @@ namespace pocketmine\block;
use pocketmine\event\block\BlockGrowEvent;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\Level;
use pocketmine\math\Vector3;
use pocketmine\Server;
@ -84,7 +85,7 @@ class MelonStem extends Crops{
public function getDrops(Item $item) : array{
return [
Item::get(Item::MELON_SEEDS, 0, mt_rand(0, 2))
ItemFactory::get(Item::MELON_SEEDS, 0, mt_rand(0, 2))
];
}
}

View File

@ -25,6 +25,7 @@ namespace pocketmine\block;
use pocketmine\event\block\BlockSpreadEvent;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
use pocketmine\level\Level;
use pocketmine\math\Vector3;
@ -52,7 +53,7 @@ class Mycelium extends Solid{
public function getDrops(Item $item) : array{
return [
Item::get(Item::DIRT, 0, 1)
ItemFactory::get(Item::DIRT, 0, 1)
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class NetherQuartzOre extends Solid{
@ -49,7 +50,7 @@ class NetherQuartzOre extends Solid{
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_WOODEN){
return [
Item::get(Item::QUARTZ, 0, 1)
ItemFactory::get(Item::QUARTZ, 0, 1)
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class NetherReactor extends Solid{
@ -53,8 +54,8 @@ class NetherReactor extends Solid{
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_WOODEN){
return [
Item::get(Item::IRON_INGOT, 0, 6),
Item::get(Item::DIAMOND, 0, 3)
ItemFactory::get(Item::IRON_INGOT, 0, 6),
ItemFactory::get(Item::DIAMOND, 0, 3)
];
}

View File

@ -26,6 +26,7 @@ namespace pocketmine\block;
use pocketmine\event\block\BlockGrowEvent;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\Level;
use pocketmine\math\Vector3;
use pocketmine\Player;
@ -78,7 +79,7 @@ class NetherWartPlant extends Flowable{
public function getDrops(Item $item) : array{
return [
Item::get($this->getItemId(), 0, ($this->getDamage() === 3 ? mt_rand(2, 4) : 1))
ItemFactory::get($this->getItemId(), 0, ($this->getDamage() === 3 ? mt_rand(2, 4) : 1))
];
}
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
class Potato extends Crops{
@ -39,7 +40,7 @@ class Potato extends Crops{
public function getDrops(Item $item) : array{
return [
Item::get(Item::POTATO, 0, $this->getDamage() >= 0x07 ? mt_rand(1, 4) : 1)
ItemFactory::get(Item::POTATO, 0, $this->getDamage() >= 0x07 ? mt_rand(1, 4) : 1)
];
}
}

View File

@ -25,6 +25,7 @@ namespace pocketmine\block;
use pocketmine\event\block\BlockGrowEvent;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\Level;
use pocketmine\math\Vector3;
use pocketmine\Server;
@ -84,7 +85,7 @@ class PumpkinStem extends Crops{
public function getDrops(Item $item) : array{
return [
Item::get(Item::PUMPKIN_SEEDS, 0, mt_rand(0, 2))
ItemFactory::get(Item::PUMPKIN_SEEDS, 0, mt_rand(0, 2))
];
}
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
use pocketmine\level\Level;
use pocketmine\math\Vector3;
@ -66,7 +67,7 @@ class RedstoneOre extends Solid{
public function getDrops(Item $item) : array{
if($item->isPickaxe() >= Tool::TIER_IRON){
return [
Item::get(Item::REDSTONE_DUST, 0, mt_rand(4, 5))
ItemFactory::get(Item::REDSTONE_DUST, 0, mt_rand(4, 5))
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\generator\object\Tree;
use pocketmine\level\Level;
use pocketmine\math\Vector3;
@ -109,7 +110,7 @@ class Sapling extends Flowable{
public function getDrops(Item $item) : array{
return [
Item::get($this->getItemId(), $this->getDamage() & 0x07, 1)
ItemFactory::get($this->getItemId(), $this->getDamage() & 0x07, 1)
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
class SeaLantern extends Transparent{
@ -47,7 +48,7 @@ class SeaLantern extends Transparent{
public function getDrops(Item $item) : array{
return [
Item::get(Item::PRISMARINE_CRYSTALS, 0, 3)
ItemFactory::get(Item::PRISMARINE_CRYSTALS, 0, 3)
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Vector3;
use pocketmine\nbt\tag\ByteTag;
@ -94,7 +95,7 @@ class Skull extends Flowable{
$tile = $this->level->getTile($this);
if($tile instanceof SkullTile){
return [
Item::get(Item::SKULL, $tile->getType(), 1)
ItemFactory::get(Item::SKULL, $tile->getType(), 1)
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
use pocketmine\level\Level;
use pocketmine\math\Vector3;
@ -86,7 +87,7 @@ class SnowLayer extends Flowable{
public function getDrops(Item $item) : array{
if($item->isShovel() !== false){
return [
Item::get(Item::SNOWBALL, 0, 1) //TODO: check layer count
ItemFactory::get(Item::SNOWBALL, 0, 1) //TODO: check layer count
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class Stone extends Solid{
@ -66,7 +67,7 @@ class Stone extends Solid{
if($item->isPickaxe() >= Tool::TIER_WOODEN){
if($this->getDamage() === self::NORMAL){
return [
Item::get(Item::COBBLESTONE, $this->getDamage(), 1)
ItemFactory::get(Item::COBBLESTONE, $this->getDamage(), 1)
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\Level;
use pocketmine\math\Vector3;
use pocketmine\Player;
@ -76,7 +77,7 @@ class TallGrass extends Flowable{
public function getDrops(Item $item) : array{
if(mt_rand(0, 15) === 0){
return [
Item::get(Item::WHEAT_SEEDS, 0, 1)
ItemFactory::get(Item::WHEAT_SEEDS, 0, 1)
];
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
class Wheat extends Crops{
@ -40,12 +41,12 @@ class Wheat extends Crops{
public function getDrops(Item $item) : array{
if($this->meta >= 0x07){
return [
Item::get(Item::WHEAT, 0, 1),
Item::get(Item::WHEAT_SEEDS, 0, mt_rand(0, 3))
ItemFactory::get(Item::WHEAT, 0, 1),
ItemFactory::get(Item::WHEAT_SEEDS, 0, mt_rand(0, 3))
];
}else{
return [
Item::get(Item::WHEAT_SEEDS, 0, 1)
ItemFactory::get(Item::WHEAT_SEEDS, 0, 1)
];
}
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\item\Tool;
class WoodenStairs extends Stair{
@ -43,7 +44,7 @@ class WoodenStairs extends Stair{
public function getDrops(Item $item) : array{
//TODO: Hierarchy problem (base class is for stone stairs)
return [
Item::get($this->getItemId(), $this->getDamage() & $this->getVariantBitmask(), 1)
ItemFactory::get($this->getItemId(), $this->getDamage() & $this->getVariantBitmask(), 1)
];
}
}

View File

@ -27,7 +27,7 @@ use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\utils\InvalidCommandSyntaxException;
use pocketmine\event\TranslationContainer;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\nbt\JsonNBTParser;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\Player;
@ -54,7 +54,7 @@ class GiveCommand extends VanillaCommand{
}
$player = $sender->getServer()->getPlayer($args[0]);
$item = Item::fromString($args[1]);
$item = ItemFactory::fromString($args[1]);
if(!isset($args[2])){
$item->setCount($item->getMaxStackSize());

View File

@ -28,6 +28,7 @@ use pocketmine\command\CommandSender;
use pocketmine\command\utils\InvalidCommandSyntaxException;
use pocketmine\event\TranslationContainer;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\particle\AngryVillagerParticle;
use pocketmine\level\particle\BlockForceFieldParticle;
use pocketmine\level\particle\BubbleParticle;
@ -173,12 +174,12 @@ class ParticleCommand extends VanillaCommand{
case "reddust":
return new RedstoneParticle($pos, $data ?? 1);
case "snowballpoof":
return new ItemBreakParticle($pos, Item::get(Item::SNOWBALL));
return new ItemBreakParticle($pos, ItemFactory::get(Item::SNOWBALL));
case "slime":
return new ItemBreakParticle($pos, Item::get(Item::SLIMEBALL));
return new ItemBreakParticle($pos, ItemFactory::get(Item::SLIMEBALL));
case "itembreak":
if($data !== null and $data !== 0){
return new ItemBreakParticle($pos, Item::get($data));
return new ItemBreakParticle($pos, ItemFactory::get($data));
}
break;
case "terrain":
@ -206,7 +207,7 @@ class ParticleCommand extends VanillaCommand{
if(strpos($name, "iconcrack_") === 0){
$d = explode("_", $name);
if(count($d) === 3){
return new ItemBreakParticle($pos, Item::get((int) $d[1], (int) $d[2]));
return new ItemBreakParticle($pos, ItemFactory::get((int) $d[1], (int) $d[2]));
}
}elseif(strpos($name, "blockcrack_") === 0){
$d = explode("_", $name);

View File

@ -27,6 +27,7 @@ use pocketmine\block\BlockFactory;
use pocketmine\event\entity\EntityBlockChangeEvent;
use pocketmine\event\entity\EntityDamageEvent;
use pocketmine\item\Item as ItemItem;
use pocketmine\item\ItemFactory;
use pocketmine\math\Vector3;
use pocketmine\nbt\tag\ByteTag;
use pocketmine\nbt\tag\IntTag;
@ -95,7 +96,7 @@ class FallingSand extends Entity{
$block = $this->level->getBlock($pos);
if($block->getId() > 0 and $block->isTransparent() and !$block->canBeReplaced()){
//FIXME: anvils are supposed to destroy torches
$this->getLevel()->dropItem($this, ItemItem::get($this->getBlock(), $this->getDamage(), 1));
$this->getLevel()->dropItem($this, ItemFactory::get($this->getBlock(), $this->getDamage(), 1));
}else{
$this->server->getPluginManager()->callEvent($ev = new EntityBlockChangeEvent($this, $block, BlockFactory::get($this->getBlock(), $this->getDamage())));
if(!$ev->isCancelled()){

View File

@ -26,6 +26,7 @@ namespace pocketmine\entity;
use pocketmine\event\entity\EntityDamageByEntityEvent;
use pocketmine\event\entity\EntityDamageEvent;
use pocketmine\item\Item as ItemItem;
use pocketmine\item\ItemFactory;
use pocketmine\math\Vector3;
use pocketmine\network\mcpe\protocol\AddEntityPacket;
use pocketmine\network\mcpe\protocol\EntityEventPacket;
@ -147,7 +148,7 @@ class Squid extends WaterAnimal{
public function getDrops() : array{
return [
ItemItem::get(ItemItem::DYE, 0, mt_rand(1, 3))
ItemFactory::get(ItemItem::DYE, 0, mt_rand(1, 3))
];
}
}

View File

@ -25,6 +25,7 @@ namespace pocketmine\entity;
use pocketmine\event\entity\EntityDamageByEntityEvent;
use pocketmine\item\Item as ItemItem;
use pocketmine\item\ItemFactory;
use pocketmine\network\mcpe\protocol\AddEntityPacket;
use pocketmine\Player;
@ -59,19 +60,19 @@ class Zombie extends Monster{
public function getDrops() : array{
$drops = [
ItemItem::get(ItemItem::FEATHER, 0, 1)
ItemFactory::get(ItemItem::FEATHER, 0, 1)
];
if($this->lastDamageCause instanceof EntityDamageByEntityEvent and $this->lastDamageCause->getEntity() instanceof Player){
if(mt_rand(0, 199) < 5){
switch(mt_rand(0, 2)){
case 0:
$drops[] = ItemItem::get(ItemItem::IRON_INGOT, 0, 1);
$drops[] = ItemFactory::get(ItemItem::IRON_INGOT, 0, 1);
break;
case 1:
$drops[] = ItemItem::get(ItemItem::CARROT, 0, 1);
$drops[] = ItemFactory::get(ItemItem::CARROT, 0, 1);
break;
case 2:
$drops[] = ItemItem::get(ItemItem::POTATO, 0, 1);
$drops[] = ItemFactory::get(ItemItem::POTATO, 0, 1);
break;
}
}

View File

@ -27,6 +27,7 @@ use pocketmine\entity\Entity;
use pocketmine\event\entity\EntityInventoryChangeEvent;
use pocketmine\event\inventory\InventoryOpenEvent;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\network\mcpe\protocol\ContainerSetContentPacket;
use pocketmine\network\mcpe\protocol\ContainerSetSlotPacket;
use pocketmine\Player;
@ -106,7 +107,7 @@ abstract class BaseInventory implements Inventory{
public function getItem(int $index) : Item{
assert($index >= 0, "Inventory slot should not be negative");
return isset($this->slots[$index]) ? clone $this->slots[$index] : Item::get(Item::AIR, 0, 0);
return isset($this->slots[$index]) ? clone $this->slots[$index] : ItemFactory::get(Item::AIR, 0, 0);
}
public function getContents() : array{
@ -340,7 +341,7 @@ abstract class BaseInventory implements Inventory{
public function clear(int $index) : bool{
if(isset($this->slots[$index])){
$item = Item::get(Item::AIR, 0, 0);
$item = ItemFactory::get(Item::AIR, 0, 0);
$old = $this->slots[$index];
$holder = $this->getHolder();
if($holder instanceof Entity){

View File

@ -25,6 +25,7 @@ namespace pocketmine\inventory;
use pocketmine\event\Timings;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\network\mcpe\protocol\CraftingDataPacket;
use pocketmine\Server;
use pocketmine\utils\Config;
@ -81,7 +82,7 @@ class CraftingManager{
case 3:
$result = $recipe["output"];
$resultItem = Item::jsonDeserialize($result);
$this->registerRecipe(new FurnaceRecipe($resultItem, Item::get($recipe["inputId"], $recipe["inputDamage"] ?? -1, 1)));
$this->registerRecipe(new FurnaceRecipe($resultItem, ItemFactory::get($recipe["inputId"], $recipe["inputDamage"] ?? -1, 1)));
break;
default:
break;

View File

@ -28,6 +28,7 @@ use pocketmine\event\entity\EntityArmorChangeEvent;
use pocketmine\event\entity\EntityInventoryChangeEvent;
use pocketmine\event\player\PlayerItemHeldEvent;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\network\mcpe\protocol\ContainerSetContentPacket;
use pocketmine\network\mcpe\protocol\ContainerSetSlotPacket;
use pocketmine\network\mcpe\protocol\MobArmorEquipmentPacket;
@ -76,7 +77,7 @@ class PlayerInventory extends BaseInventory{
}
if($inventorySlot === -1){
$item = Item::get(Item::AIR, 0, 0);
$item = ItemFactory::get(Item::AIR, 0, 0);
}else{
$item = $this->getItem($inventorySlot);
}
@ -143,7 +144,7 @@ class PlayerInventory extends BaseInventory{
if($inventorySlot !== -1){
return $this->getItem($inventorySlot);
}else{
return Item::get(Item::AIR, 0, 0);
return ItemFactory::get(Item::AIR, 0, 0);
}
}
@ -350,7 +351,7 @@ class PlayerInventory extends BaseInventory{
public function clear(int $index) : bool{
if(isset($this->slots[$index])){
$item = Item::get(Item::AIR, 0, 0);
$item = ItemFactory::get(Item::AIR, 0, 0);
$old = $this->slots[$index];
if($index >= $this->getSize() and $index < $this->size){ //Armor change
Server::getInstance()->getPluginManager()->callEvent($ev = new EntityArmorChangeEvent($this->getHolder(), $old, $item, $index));
@ -441,7 +442,7 @@ class PlayerInventory extends BaseInventory{
public function setArmorContents(array $items){
for($i = 0; $i < 4; ++$i){
if(!isset($items[$i]) or !($items[$i] instanceof Item)){
$items[$i] = Item::get(Item::AIR, 0, 0);
$items[$i] = ItemFactory::get(Item::AIR, 0, 0);
}
if($items[$i]->getId() === Item::AIR){
@ -500,7 +501,7 @@ class PlayerInventory extends BaseInventory{
//Because PE is stupid and shows 9 less slots than you send it, give it 9 dummy slots so it shows all the REAL slots.
for($i = $this->getSize(); $i < $this->getSize() + $this->getHotbarSize(); ++$i){
$pk->slots[$i] = Item::get(Item::AIR, 0, 0);
$pk->slots[$i] = ItemFactory::get(Item::AIR, 0, 0);
}
foreach($target as $player){

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\inventory;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\math\Vector2;
use pocketmine\Server;
use pocketmine\utils\UUID;
@ -141,7 +142,7 @@ class ShapedRecipe implements Recipe{
if($ingredient !== null){
$ingredients[$y][$x] = clone $ingredient;
}else{
$ingredients[$y][$x] = Item::get(Item::AIR);
$ingredients[$y][$x] = ItemFactory::get(Item::AIR);
}
}
}
@ -156,7 +157,7 @@ class ShapedRecipe implements Recipe{
* @return Item
*/
public function getIngredient(int $x, int $y) : Item{
return $this->ingredients[$y][$x] ?? Item::get(Item::AIR);
return $this->ingredients[$y][$x] ?? ItemFactory::get(Item::AIR);
}
/**

View File

@ -42,6 +42,6 @@ class BeetrootSoup extends Food{
}
public function getResidue(){
return Item::get(Item::BOWL);
return ItemFactory::get(Item::BOWL);
}
}

View File

@ -40,7 +40,7 @@ abstract class Food extends Item implements FoodSource{
public function getResidue(){
if($this->getCount() === 1){
return Item::get(0);
return ItemFactory::get(0);
}else{
$new = clone $this;
$new->count--;

View File

@ -76,185 +76,35 @@ class Item implements ItemIds, \JsonSerializable{
return self::$cachedParser->write();
}
/** @var \SplFixedArray */
public static $list = null;
/** @var Block|null */
protected $block;
/** @var int */
protected $id;
/** @var int */
protected $meta;
/** @var string */
private $tags = "";
/** @var CompoundTag|null */
private $cachedNBT = null;
/** @var int */
public $count;
/** @var string */
protected $name;
/**
* @param int $id
* @param int $meta
* @param int $count
* @param CompoundTag|string $tags
*
* @return Item
*/
public static function init(){
if(self::$list === null){
self::$list = new \SplFixedArray(65536);
self::$list[self::IRON_SHOVEL] = IronShovel::class;
self::$list[self::IRON_PICKAXE] = IronPickaxe::class;
self::$list[self::IRON_AXE] = IronAxe::class;
self::$list[self::FLINT_STEEL] = FlintSteel::class;
self::$list[self::APPLE] = Apple::class;
self::$list[self::BOW] = Bow::class;
self::$list[self::ARROW] = Arrow::class;
self::$list[self::COAL] = Coal::class;
self::$list[self::DIAMOND] = Diamond::class;
self::$list[self::IRON_INGOT] = IronIngot::class;
self::$list[self::GOLD_INGOT] = GoldIngot::class;
self::$list[self::IRON_SWORD] = IronSword::class;
self::$list[self::WOODEN_SWORD] = WoodenSword::class;
self::$list[self::WOODEN_SHOVEL] = WoodenShovel::class;
self::$list[self::WOODEN_PICKAXE] = WoodenPickaxe::class;
self::$list[self::WOODEN_AXE] = WoodenAxe::class;
self::$list[self::STONE_SWORD] = StoneSword::class;
self::$list[self::STONE_SHOVEL] = StoneShovel::class;
self::$list[self::STONE_PICKAXE] = StonePickaxe::class;
self::$list[self::STONE_AXE] = StoneAxe::class;
self::$list[self::DIAMOND_SWORD] = DiamondSword::class;
self::$list[self::DIAMOND_SHOVEL] = DiamondShovel::class;
self::$list[self::DIAMOND_PICKAXE] = DiamondPickaxe::class;
self::$list[self::DIAMOND_AXE] = DiamondAxe::class;
self::$list[self::STICK] = Stick::class;
self::$list[self::BOWL] = Bowl::class;
self::$list[self::MUSHROOM_STEW] = MushroomStew::class;
self::$list[self::GOLDEN_SWORD] = GoldSword::class;
self::$list[self::GOLDEN_SHOVEL] = GoldShovel::class;
self::$list[self::GOLDEN_PICKAXE] = GoldPickaxe::class;
self::$list[self::GOLDEN_AXE] = GoldAxe::class;
self::$list[self::STRING] = StringItem::class;
self::$list[self::FEATHER] = Feather::class;
self::$list[self::GUNPOWDER] = Gunpowder::class;
self::$list[self::WOODEN_HOE] = WoodenHoe::class;
self::$list[self::STONE_HOE] = StoneHoe::class;
self::$list[self::IRON_HOE] = IronHoe::class;
self::$list[self::DIAMOND_HOE] = DiamondHoe::class;
self::$list[self::GOLDEN_HOE] = GoldHoe::class;
self::$list[self::WHEAT_SEEDS] = WheatSeeds::class;
self::$list[self::WHEAT] = Wheat::class;
self::$list[self::BREAD] = Bread::class;
self::$list[self::LEATHER_CAP] = LeatherCap::class;
self::$list[self::LEATHER_TUNIC] = LeatherTunic::class;
self::$list[self::LEATHER_PANTS] = LeatherPants::class;
self::$list[self::LEATHER_BOOTS] = LeatherBoots::class;
self::$list[self::CHAINMAIL_HELMET] = ChainHelmet::class;
self::$list[self::CHAINMAIL_CHESTPLATE] = ChainChestplate::class;
self::$list[self::CHAINMAIL_LEGGINGS] = ChainLeggings::class;
self::$list[self::CHAINMAIL_BOOTS] = ChainBoots::class;
self::$list[self::IRON_HELMET] = IronHelmet::class;
self::$list[self::IRON_CHESTPLATE] = IronChestplate::class;
self::$list[self::IRON_LEGGINGS] = IronLeggings::class;
self::$list[self::IRON_BOOTS] = IronBoots::class;
self::$list[self::DIAMOND_HELMET] = DiamondHelmet::class;
self::$list[self::DIAMOND_CHESTPLATE] = DiamondChestplate::class;
self::$list[self::DIAMOND_LEGGINGS] = DiamondLeggings::class;
self::$list[self::DIAMOND_BOOTS] = DiamondBoots::class;
self::$list[self::GOLDEN_HELMET] = GoldHelmet::class;
self::$list[self::GOLDEN_CHESTPLATE] = GoldChestplate::class;
self::$list[self::GOLDEN_LEGGINGS] = GoldLeggings::class;
self::$list[self::GOLDEN_BOOTS] = GoldBoots::class;
self::$list[self::FLINT] = Flint::class;
self::$list[self::RAW_PORKCHOP] = RawPorkchop::class;
self::$list[self::COOKED_PORKCHOP] = CookedPorkchop::class;
self::$list[self::PAINTING] = Painting::class;
self::$list[self::GOLDEN_APPLE] = GoldenApple::class;
self::$list[self::SIGN] = Sign::class;
self::$list[self::WOODEN_DOOR] = WoodenDoor::class;
self::$list[self::BUCKET] = Bucket::class;
self::$list[self::MINECART] = Minecart::class;
self::$list[self::IRON_DOOR] = IronDoor::class;
self::$list[self::REDSTONE] = Redstone::class;
self::$list[self::SNOWBALL] = Snowball::class;
self::$list[self::BOAT] = Boat::class;
self::$list[self::LEATHER] = Leather::class;
self::$list[self::BRICK] = Brick::class;
self::$list[self::CLAY] = Clay::class;
self::$list[self::SUGARCANE] = Sugarcane::class;
self::$list[self::PAPER] = Paper::class;
self::$list[self::BOOK] = Book::class;
self::$list[self::SLIMEBALL] = Slimeball::class;
self::$list[self::EGG] = Egg::class;
self::$list[self::COMPASS] = Compass::class;
self::$list[self::FISHING_ROD] = FishingRod::class;
self::$list[self::CLOCK] = Clock::class;
self::$list[self::GLOWSTONE_DUST] = GlowstoneDust::class;
self::$list[self::RAW_FISH] = Fish::class;
self::$list[self::COOKED_FISH] = CookedFish::class;
self::$list[self::DYE] = Dye::class;
self::$list[self::BONE] = Bone::class;
self::$list[self::SUGAR] = Sugar::class;
self::$list[self::CAKE] = Cake::class;
self::$list[self::BED] = Bed::class;
self::$list[self::COOKIE] = Cookie::class;
self::$list[self::SHEARS] = Shears::class;
self::$list[self::MELON] = Melon::class;
self::$list[self::PUMPKIN_SEEDS] = PumpkinSeeds::class;
self::$list[self::MELON_SEEDS] = MelonSeeds::class;
self::$list[self::RAW_BEEF] = RawBeef::class;
self::$list[self::STEAK] = Steak::class;
self::$list[self::RAW_CHICKEN] = RawChicken::class;
self::$list[self::COOKED_CHICKEN] = CookedChicken::class;
self::$list[self::GOLD_NUGGET] = GoldNugget::class;
self::$list[self::NETHER_WART] = NetherWart::class;
self::$list[self::POTION] = Potion::class;
self::$list[self::GLASS_BOTTLE] = GlassBottle::class;
self::$list[self::SPIDER_EYE] = SpiderEye::class;
self::$list[self::FERMENTED_SPIDER_EYE] = FermentedSpiderEye::class;
self::$list[self::BLAZE_POWDER] = BlazePowder::class;
self::$list[self::MAGMA_CREAM] = MagmaCream::class;
self::$list[self::BREWING_STAND] = BrewingStand::class;
self::$list[self::GLISTERING_MELON] = GlisteringMelon::class;
self::$list[self::SPAWN_EGG] = SpawnEgg::class;
self::$list[self::EMERALD] = Emerald::class;
self::$list[self::ITEM_FRAME] = ItemFrame::class;
self::$list[self::FLOWER_POT] = FlowerPot::class;
self::$list[self::CARROT] = Carrot::class;
self::$list[self::POTATO] = Potato::class;
self::$list[self::BAKED_POTATO] = BakedPotato::class;
self::$list[self::GOLDEN_CARROT] = GoldenCarrot::class;
self::$list[self::SKULL] = Skull::class;
self::$list[self::NETHER_STAR] = NetherStar::class;
self::$list[self::PUMPKIN_PIE] = PumpkinPie::class;
self::$list[self::NETHER_BRICK] = NetherBrick::class;
self::$list[self::NETHER_QUARTZ] = NetherQuartz::class;
self::$list[self::PRISMARINE_SHARD] = PrismarineShard::class;
self::$list[self::COOKED_RABBIT] = CookedRabbit::class;
self::$list[self::PRISMARINE_CRYSTALS] = PrismarineCrystals::class;
self::$list[self::BEETROOT] = Beetroot::class;
self::$list[self::BEETROOT_SEEDS] = BeetrootSeeds::class;
self::$list[self::BEETROOT_SOUP] = BeetrootSoup::class;
self::$list[self::ENCHANTED_GOLDEN_APPLE] = GoldenAppleEnchanted::class;
}
self::initCreativeItems();
public static function get(int $id, int $meta = 0, int $count = 1, $tags = "") : Item{
return ItemFactory::get($id, $meta, $count, $tags);
}
/**
* @param string $str
* @param bool $multiple
*
* @return Item[]|Item
*/
public static function fromString(string $str, bool $multiple = false){
return ItemFactory::fromString($str, $multiple);
}
/** @var Item[] */
private static $creative = [];
private static function initCreativeItems(){
public static function initCreativeItems(){
self::clearCreativeItems();
$creativeItems = new Config(Server::getInstance()->getFilePath() . "src/pocketmine/resources/creativeitems.json", Config::JSON, []);
@ -316,67 +166,20 @@ class Item implements ItemIds, \JsonSerializable{
return -1;
}
/**
* Returns an instance of the Item with the specified id, meta, count and NBT.
*
* @param int $id
* @param int $meta
* @param int $count
* @param CompoundTag|string $tags
*
* @return Item
*/
public static function get(int $id, int $meta = 0, int $count = 1, $tags = "") : Item{
try{
if($id < 256){
return (new ItemBlock(BlockFactory::get($id, $meta), $meta, $count))->setCompoundTag($tags);
}else{
$class = self::$list[$id];
if($class === null){
return (new Item($id, $meta, $count))->setCompoundTag($tags);
}else{
return (new $class($meta, $count))->setCompoundTag($tags);
}
}
}catch(\RuntimeException $e){
return (new Item($id, $meta, $count))->setCompoundTag($tags);
}
}
/**
* @param string $str
* @param bool $multiple
*
* @return Item[]|Item
*/
public static function fromString(string $str, bool $multiple = false){
if($multiple === true){
$blocks = [];
foreach(explode(",", $str) as $b){
$blocks[] = self::fromString($b, false);
}
return $blocks;
}else{
$b = explode(":", str_replace([" ", "minecraft:"], ["_", ""], trim($str)));
if(!isset($b[1])){
$meta = 0;
}else{
$meta = $b[1] & 0xFFFF;
}
if(defined(Item::class . "::" . strtoupper($b[0]))){
$item = self::get(constant(Item::class . "::" . strtoupper($b[0])), $meta);
if($item->getId() === self::AIR and strtoupper($b[0]) !== "AIR"){
$item = self::get($b[0] & 0xFFFF, $meta);
}
}else{
$item = self::get($b[0] & 0xFFFF, $meta);
}
return $item;
}
}
/** @var Block|null */
protected $block;
/** @var int */
protected $id;
/** @var int */
protected $meta;
/** @var string */
private $tags = "";
/** @var CompoundTag|null */
private $cachedNBT = null;
/** @var int */
public $count;
/** @var string */
protected $name;
/**
* @param int $id
@ -1061,7 +864,7 @@ class Item implements ItemIds, \JsonSerializable{
* @return Item
*/
final public static function jsonDeserialize(array $data) : Item{
return Item::get(
return ItemFactory::get(
(int) $data["id"],
(int) $data["damage"],
(int) $data["count"],
@ -1105,16 +908,16 @@ class Item implements ItemIds, \JsonSerializable{
*/
public static function nbtDeserialize(CompoundTag $tag) : Item{
if(!isset($tag->id) or !isset($tag->Count)){
return Item::get(0);
return ItemFactory::get(0);
}
$count = Binary::unsignByte($tag->Count->getValue());
$meta = isset($tag->Damage) ? $tag->Damage->getValue() : 0;
if($tag->id instanceof ShortTag){
$item = Item::get($tag->id->getValue(), $meta, $count);
$item = ItemFactory::get($tag->id->getValue(), $meta, $count);
}elseif($tag->id instanceof StringTag){ //PC item save format
$item = Item::fromString($tag->id->getValue());
$item = ItemFactory::fromString($tag->id->getValue());
$item->setDamage($meta);
$item->setCount($count);
}else{

View File

@ -0,0 +1,285 @@
<?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;
use pocketmine\block\BlockFactory;
use pocketmine\nbt\tag\CompoundTag;
/**
* Manages Item instance creation and registration
*/
class ItemFactory{
/** @var \SplFixedArray */
public static $list = null;
public static function init(){
if(self::$list === null){
self::$list = new \SplFixedArray(65536);
self::registerItem(new IronShovel());
self::registerItem(new IronPickaxe());
self::registerItem(new IronAxe());
self::registerItem(new FlintSteel());
self::registerItem(new Apple());
self::registerItem(new Bow());
self::registerItem(new Arrow());
self::registerItem(new Coal());
self::registerItem(new Diamond());
self::registerItem(new IronIngot());
self::registerItem(new GoldIngot());
self::registerItem(new IronSword());
self::registerItem(new WoodenSword());
self::registerItem(new WoodenShovel());
self::registerItem(new WoodenPickaxe());
self::registerItem(new WoodenAxe());
self::registerItem(new StoneSword());
self::registerItem(new StoneShovel());
self::registerItem(new StonePickaxe());
self::registerItem(new StoneAxe());
self::registerItem(new DiamondSword());
self::registerItem(new DiamondShovel());
self::registerItem(new DiamondPickaxe());
self::registerItem(new DiamondAxe());
self::registerItem(new Stick());
self::registerItem(new Bowl());
self::registerItem(new MushroomStew());
self::registerItem(new GoldSword());
self::registerItem(new GoldShovel());
self::registerItem(new GoldPickaxe());
self::registerItem(new GoldAxe());
self::registerItem(new StringItem());
self::registerItem(new Feather());
self::registerItem(new Gunpowder());
self::registerItem(new WoodenHoe());
self::registerItem(new StoneHoe());
self::registerItem(new IronHoe());
self::registerItem(new DiamondHoe());
self::registerItem(new GoldHoe());
self::registerItem(new WheatSeeds());
self::registerItem(new Wheat());
self::registerItem(new Bread());
self::registerItem(new LeatherCap());
self::registerItem(new LeatherTunic());
self::registerItem(new LeatherPants());
self::registerItem(new LeatherBoots());
self::registerItem(new ChainHelmet());
self::registerItem(new ChainChestplate());
self::registerItem(new ChainLeggings());
self::registerItem(new ChainBoots());
self::registerItem(new IronHelmet());
self::registerItem(new IronChestplate());
self::registerItem(new IronLeggings());
self::registerItem(new IronBoots());
self::registerItem(new DiamondHelmet());
self::registerItem(new DiamondChestplate());
self::registerItem(new DiamondLeggings());
self::registerItem(new DiamondBoots());
self::registerItem(new GoldHelmet());
self::registerItem(new GoldChestplate());
self::registerItem(new GoldLeggings());
self::registerItem(new GoldBoots());
self::registerItem(new Flint());
self::registerItem(new RawPorkchop());
self::registerItem(new CookedPorkchop());
self::registerItem(new Painting());
self::registerItem(new GoldenApple());
self::registerItem(new Sign());
self::registerItem(new WoodenDoor());
self::registerItem(new Bucket());
self::registerItem(new Minecart());
self::registerItem(new IronDoor());
self::registerItem(new Redstone());
self::registerItem(new Snowball());
self::registerItem(new Boat());
self::registerItem(new Leather());
self::registerItem(new Brick());
self::registerItem(new Clay());
self::registerItem(new Sugarcane());
self::registerItem(new Paper());
self::registerItem(new Book());
self::registerItem(new Slimeball());
self::registerItem(new Egg());
self::registerItem(new Compass());
self::registerItem(new FishingRod());
self::registerItem(new Clock());
self::registerItem(new GlowstoneDust());
self::registerItem(new Fish());
self::registerItem(new CookedFish());
self::registerItem(new Dye());
self::registerItem(new Bone());
self::registerItem(new Sugar());
self::registerItem(new Cake());
self::registerItem(new Bed());
self::registerItem(new Cookie());
self::registerItem(new Shears());
self::registerItem(new Melon());
self::registerItem(new PumpkinSeeds());
self::registerItem(new MelonSeeds());
self::registerItem(new RawBeef());
self::registerItem(new Steak());
self::registerItem(new RawChicken());
self::registerItem(new CookedChicken());
self::registerItem(new GoldNugget());
self::registerItem(new NetherWart());
self::registerItem(new Potion());
self::registerItem(new GlassBottle());
self::registerItem(new SpiderEye());
self::registerItem(new FermentedSpiderEye());
self::registerItem(new BlazePowder());
self::registerItem(new MagmaCream());
self::registerItem(new BrewingStand());
self::registerItem(new GlisteringMelon());
self::registerItem(new SpawnEgg());
self::registerItem(new Emerald());
self::registerItem(new ItemFrame());
self::registerItem(new FlowerPot());
self::registerItem(new Carrot());
self::registerItem(new Potato());
self::registerItem(new BakedPotato());
self::registerItem(new GoldenCarrot());
self::registerItem(new Skull());
self::registerItem(new NetherStar());
self::registerItem(new PumpkinPie());
self::registerItem(new NetherBrick());
self::registerItem(new NetherQuartz());
self::registerItem(new PrismarineShard());
self::registerItem(new CookedRabbit());
self::registerItem(new PrismarineCrystals());
self::registerItem(new Beetroot());
self::registerItem(new BeetrootSeeds());
self::registerItem(new BeetrootSoup());
self::registerItem(new GoldenAppleEnchanted());
}
Item::initCreativeItems();
}
/**
* Registers an item type into the index. Plugins may use this method to register new item types or override existing
* ones.
*
* NOTE: If you are registering a new item type, you will need to add it to the creative inventory yourself - it
* will not automatically appear there.
*
* @param Item $item
* @param bool $override
*
* @throws \RuntimeException if something attempted to override an already-registered item without specifying the
* $override parameter.
*/
public static function registerItem(Item $item, bool $override = false){
$id = $item->getId();
if(!$override and self::$list[$id] !== null){
throw new \RuntimeException("Trying to overwrite an already registered item");
}
self::$list[$id] = clone $item;
}
/**
* Returns an instance of the Item with the specified id, meta, count and NBT.
*
* @param int $id
* @param int $meta
* @param int $count
* @param CompoundTag|string $tags
*
* @return Item
*/
public static function get(int $id, int $meta = 0, int $count = 1, $tags = "") : Item{
try{
if($id < 256){
return (new ItemBlock(BlockFactory::get($id, $meta), $meta, $count))->setCompoundTag($tags);
}else{
/** @var Item|null $item */
$item = self::$list[$id];
if($item === null){
return (new Item($id, $meta, $count))->setCompoundTag($tags);
}else{
$item = clone $item;
$item->setDamage($meta);
$item->setCount($count);
$item->setCompoundTag($tags);
return $item;
}
}
}catch(\RuntimeException $e){
return (new Item($id, $meta, $count))->setCompoundTag($tags);
}
}
/**
* @param string $str
* @param bool $multiple
*
* @return Item[]|Item
*/
public static function fromString(string $str, bool $multiple = false){
if($multiple === true){
$blocks = [];
foreach(explode(",", $str) as $b){
$blocks[] = self::fromString($b, false);
}
return $blocks;
}else{
$b = explode(":", str_replace([" ", "minecraft:"], ["_", ""], trim($str)));
if(!isset($b[1])){
$meta = 0;
}else{
$meta = $b[1] & 0xFFFF;
}
if(defined(Item::class . "::" . strtoupper($b[0]))){
$item = self::get(constant(Item::class . "::" . strtoupper($b[0])), $meta);
if($item->getId() === Item::AIR and strtoupper($b[0]) !== "AIR"){
$item = self::get($b[0] & 0xFFFF, $meta);
}
}else{
$item = self::get($b[0] & 0xFFFF, $meta);
}
return $item;
}
}
}

View File

@ -41,6 +41,6 @@ class MushroomStew extends Food{
}
public function getResidue(){
return Item::get(Item::BOWL);
return ItemFactory::get(Item::BOWL);
}
}

View File

@ -33,6 +33,7 @@ use pocketmine\event\entity\EntityDamageByEntityEvent;
use pocketmine\event\entity\EntityDamageEvent;
use pocketmine\event\entity\EntityExplodeEvent;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\particle\HugeExplodeSeedParticle;
use pocketmine\math\AxisAlignedBB;
use pocketmine\math\Math;
@ -192,7 +193,7 @@ class Explosion{
}
$air = Item::get(Item::AIR);
$air = ItemFactory::get(Item::AIR);
foreach($this->affectedBlocks as $block){
if($block instanceof TNT){

View File

@ -66,6 +66,7 @@ use pocketmine\event\player\PlayerInteractEvent;
use pocketmine\event\Timings;
use pocketmine\inventory\InventoryHolder;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\format\Chunk;
use pocketmine\level\format\io\BaseLevelProvider;
use pocketmine\level\format\io\LevelProvider;
@ -1585,7 +1586,7 @@ class Level implements ChunkManager, Metadatable{
$target = $this->getBlock($vector);
if($item === null){
$item = Item::get(Item::AIR, 0, 0);
$item = ItemFactory::get(Item::AIR, 0, 0);
}
if($player !== null){
@ -1607,7 +1608,7 @@ class Level implements ChunkManager, Metadatable{
if($tag instanceof ListTag){
foreach($tag as $v){
if($v instanceof StringTag){
$entry = Item::fromString($v->getValue());
$entry = ItemFactory::fromString($v->getValue());
if($entry->getId() > 0 and $entry->getBlock() !== null and $entry->getBlock()->getId() === $target->getId()){
$canBreak = true;
break;
@ -1685,7 +1686,7 @@ class Level implements ChunkManager, Metadatable{
if($item !== null){
$item->useOn($target);
if($item->isTool() and $item->getDamage() >= $item->getMaxDurability()){
$item = Item::get(Item::AIR, 0, 0);
$item = ItemFactory::get(Item::AIR, 0, 0);
}
}
@ -1745,7 +1746,7 @@ class Level implements ChunkManager, Metadatable{
if($tag instanceof ListTag){
foreach($tag as $v){
if($v instanceof StringTag){
$entry = Item::fromString($v->getValue());
$entry = ItemFactory::fromString($v->getValue());
if($entry->getId() > 0 and $entry->getBlock() !== null and $entry->getBlock()->getId() === $target->getId()){
$canPlace = true;
break;
@ -1766,7 +1767,7 @@ class Level implements ChunkManager, Metadatable{
if(!$player->isSneaking() and $item->onActivate($this, $player, $block, $target, $face, $facePos)){
if($item->getCount() <= 0){
$item = Item::get(Item::AIR, 0, 0);
$item = ItemFactory::get(Item::AIR, 0, 0);
return true;
}
@ -1842,7 +1843,7 @@ class Level implements ChunkManager, Metadatable{
$item->setCount($item->getCount() - 1);
if($item->getCount() <= 0){
$item = Item::get(Item::AIR, 0, 0);
$item = ItemFactory::get(Item::AIR, 0, 0);
}
return true;

View File

@ -25,7 +25,7 @@ namespace pocketmine\level\generator;
use pocketmine\block\Block;
use pocketmine\block\BlockFactory;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\ChunkManager;
use pocketmine\level\format\Chunk;
use pocketmine\level\generator\object\OreType;
@ -84,7 +84,7 @@ class Flat extends Generator{
preg_match_all('#^(([0-9]*x|)([0-9]{1,3})(|:[0-9]{0,2}))$#m', str_replace(",", "\n", $layers), $matches);
$y = 0;
foreach($matches[3] as $i => $b){
$b = Item::fromString($b . $matches[4][$i]);
$b = ItemFactory::fromString($b . $matches[4][$i]);
$cnt = $matches[2][$i] === "" ? 1 : (int) $matches[2][$i];
for($cY = $y, $y += $cnt; $cY < $y; ++$cY){
$result[$cY] = [$b->getId(), $b->getDamage()];

View File

@ -27,7 +27,7 @@ namespace pocketmine\network\mcpe\protocol;
use pocketmine\entity\Attribute;
use pocketmine\entity\Entity;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\network\mcpe\NetworkSession;
use pocketmine\utils\BinaryStream;
use pocketmine\utils\Utils;
@ -209,7 +209,7 @@ abstract class DataPacket extends BinaryStream{
break;
case Entity::DATA_TYPE_SLOT:
//TODO: change this implementation (use objects)
$this->putSlot(Item::get($d[1][0], $d[1][2], $d[1][1])); //ID, damage, count
$this->putSlot(ItemFactory::get($d[1][0], $d[1][2], $d[1][1])); //ID, damage, count
break;
case Entity::DATA_TYPE_POS:
//TODO: change this implementation (use objects)

View File

@ -27,6 +27,7 @@ use pocketmine\inventory\ChestInventory;
use pocketmine\inventory\DoubleChestInventory;
use pocketmine\inventory\InventoryHolder;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\Level;
use pocketmine\math\Vector3;
use pocketmine\nbt\NBT;
@ -113,7 +114,7 @@ class Chest extends Spawnable implements InventoryHolder, Container, Nameable{
public function getItem(int $index) : Item{
$i = $this->getSlotIndex($index);
if($i < 0){
return Item::get(Item::AIR, 0, 0);
return ItemFactory::get(Item::AIR, 0, 0);
}else{
return Item::nbtDeserialize($this->namedtag->Items[$i]);
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\tile;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\Level;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\nbt\tag\IntTag;
@ -65,7 +66,7 @@ class FlowerPot extends Spawnable{
}
public function getItem() : Item{
return Item::get($this->namedtag->item->getValue(), $this->namedtag->mData->getValue(), 1);
return ItemFactory::get($this->namedtag->item->getValue(), $this->namedtag->mData->getValue(), 1);
}
public function setItem(Item $item){
@ -75,7 +76,7 @@ class FlowerPot extends Spawnable{
}
public function removeItem(){
$this->setItem(Item::get(Item::AIR));
$this->setItem(ItemFactory::get(Item::AIR));
}
public function isEmpty() : bool{

View File

@ -31,6 +31,7 @@ use pocketmine\inventory\FurnaceInventory;
use pocketmine\inventory\FurnaceRecipe;
use pocketmine\inventory\InventoryHolder;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\Level;
use pocketmine\nbt\NBT;
use pocketmine\nbt\tag\CompoundTag;
@ -141,7 +142,7 @@ class Furnace extends Spawnable implements InventoryHolder, Container, Nameable{
public function getItem(int $index) : Item{
$i = $this->getSlotIndex($index);
if($i < 0){
return Item::get(Item::AIR, 0, 0);
return ItemFactory::get(Item::AIR, 0, 0);
}else{
return Item::nbtDeserialize($this->namedtag->Items[$i]);
}
@ -198,7 +199,7 @@ class Furnace extends Spawnable implements InventoryHolder, Container, Nameable{
if($this->namedtag->BurnTime->getValue() > 0 and $ev->isBurning()){
$fuel->setCount($fuel->getCount() - 1);
if($fuel->getCount() === 0){
$fuel = Item::get(Item::AIR, 0, 0);
$fuel = ItemFactory::get(Item::AIR, 0, 0);
}
$this->inventory->setFuel($fuel);
}
@ -230,7 +231,7 @@ class Furnace extends Spawnable implements InventoryHolder, Container, Nameable{
if($smelt instanceof FurnaceRecipe and $canSmelt){
$this->namedtag->CookTime->setValue($this->namedtag->CookTime->getValue() + 1);
if($this->namedtag->CookTime->getValue() >= 200){ //10 seconds
$product = Item::get($smelt->getResult()->getId(), $smelt->getResult()->getDamage(), $product->getCount() + 1);
$product = ItemFactory::get($smelt->getResult()->getId(), $smelt->getResult()->getDamage(), $product->getCount() + 1);
$this->server->getPluginManager()->callEvent($ev = new FurnaceSmeltEvent($this, $raw, $product));
@ -238,7 +239,7 @@ class Furnace extends Spawnable implements InventoryHolder, Container, Nameable{
$this->inventory->setResult($ev->getResult());
$raw->setCount($raw->getCount() - 1);
if($raw->getCount() === 0){
$raw = Item::get(Item::AIR, 0, 0);
$raw = ItemFactory::get(Item::AIR, 0, 0);
}
$this->inventory->setSmelting($raw);
}

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace pocketmine\tile;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\Level;
use pocketmine\nbt\tag\ByteTag;
use pocketmine\nbt\tag\CompoundTag;
@ -51,7 +52,7 @@ class ItemFrame extends Spawnable{
if(isset($this->namedtag->Item)){
return Item::nbtDeserialize($this->namedtag->Item);
}else{
return Item::get(Item::AIR);
return ItemFactory::get(Item::AIR);
}
}

View File

@ -26,6 +26,7 @@ namespace pocketmine\utils;
#include <rules/DataPacket.h>
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
class BinaryStream{
@ -248,7 +249,7 @@ class BinaryStream{
public function getSlot() : Item{
$id = $this->getVarInt();
if($id <= 0){
return Item::get(0, 0, 0);
return ItemFactory::get(0, 0, 0);
}
$auxValue = $this->getVarInt();
@ -281,7 +282,7 @@ class BinaryStream{
}
}
return Item::get($id, $data, $cnt, $nbt);
return ItemFactory::get($id, $data, $cnt, $nbt);
}

@ -1 +1 @@
Subproject commit 5867bf4d03af74a2f667ae1c867200487f275f0f
Subproject commit d4f3d38e42b6962b85fcd72dcf52a3e2650005a6