From 75b7b038573f1fecbfa875dbd3e40d490bcd3fcb Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Fri, 7 Aug 2015 16:27:30 +0200 Subject: [PATCH] Added support for more NBT data, renaming inventories, fixed tags not being saved, added support for tags in /give --- src/pocketmine/Player.php | 7 ++-- src/pocketmine/block/BurningFurnace.php | 5 +++ src/pocketmine/block/Chest.php | 5 +++ src/pocketmine/block/EnchantingTable.php | 5 +++ .../command/defaults/GiveCommand.php | 23 ++++++++++ .../level/particle/AngryVillagerParticle.php | 2 +- .../level/particle/BubbleParticle.php | 2 +- .../level/particle/CriticalParticle.php | 2 +- .../level/particle/DustParticle.php | 2 +- .../level/particle/EnchantParticle.php | 2 +- .../particle/EnchantmentTableParticle.php | 2 +- .../level/particle/EntityFlameParticle.php | 2 +- .../level/particle/ExplodeParticle.php | 2 +- .../level/particle/FlameParticle.php | 2 +- .../level/particle/FloatingTextParticle.php | 5 +++ .../level/particle/HappyVillagerParticle.php | 2 +- .../level/particle/HeartParticle.php | 2 +- .../level/particle/HugeExplodeParticle.php | 2 +- src/pocketmine/level/particle/InkParticle.php | 2 +- .../level/particle/InstantEnchantParticle.php | 2 +- .../level/particle/ItemBreakParticle.php | 2 +- .../level/particle/LargeExplodeParticle.php | 2 +- .../level/particle/LavaDripParticle.php | 2 +- .../level/particle/LavaParticle.php | 2 +- src/pocketmine/level/particle/Particle.php | 33 +++++++++++++++ .../level/particle/PortalParticle.php | 2 +- .../level/particle/RainSplashParticle.php | 2 +- .../level/particle/RedstoneParticle.php | 2 +- .../level/particle/SmokeParticle.php | 2 +- .../level/particle/SplashParticle.php | 2 +- .../level/particle/SporeParticle.php | 2 +- .../level/particle/TerrainParticle.php | 2 +- .../level/particle/WaterDripParticle.php | 2 +- .../level/particle/WaterParticle.php | 2 +- src/pocketmine/nbt/NBT.php | 27 ++++++------ .../network/protocol/CraftingDataPacket.php | 8 +++- src/pocketmine/network/protocol/Info.php | 2 +- .../network/protocol/TextPacket.php | 2 +- src/pocketmine/tile/Chest.php | 29 +++++++++++-- src/pocketmine/tile/EnchantTable.php | 28 ++++++++++++- src/pocketmine/tile/Furnace.php | 20 ++++++++- src/pocketmine/tile/Nameable.php | 42 +++++++++++++++++++ 42 files changed, 244 insertions(+), 51 deletions(-) create mode 100644 src/pocketmine/tile/Nameable.php diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 8d7b8e5e7..2803fa432 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -2481,7 +2481,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade if($slot->getId() === Item::MUSHROOM_STEW or $slot->getId() === Item::BEETROOT_SOUP){ $this->inventory->addItem(Item::get(Item::BOWL, 0, 1)); }elseif($slot->getId() === Item::RAW_FISH and $slot->getDamage() === 3){ //Pufferfish - //$this->addEffect(Effect::getEffect(Effect::HUNGER)->setAmplifier(2)->setDuration(15 * 20)); + $this->addEffect(Effect::getEffect(Effect::HUNGER)->setAmplifier(2)->setDuration(15 * 20)); $this->addEffect(Effect::getEffect(Effect::NAUSEA)->setAmplifier(1)->setDuration(15 * 20)); $this->addEffect(Effect::getEffect(Effect::POISON)->setAmplifier(3)->setDuration(60 * 20)); } @@ -2888,10 +2888,11 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $this->dataPacket($pk->setChannel(Network::CHANNEL_TEXT)); } - public function sendPopup($message){ + public function sendPopup($message, $subtitle = ""){ $pk = new TextPacket(); $pk->type = TextPacket::TYPE_POPUP; - $pk->message = $message; + $pk->source = $message; + $pk->message = $subtitle; $this->dataPacket($pk->setChannel(Network::CHANNEL_TEXT)); } diff --git a/src/pocketmine/block/BurningFurnace.php b/src/pocketmine/block/BurningFurnace.php index 416c44005..c0d794252 100644 --- a/src/pocketmine/block/BurningFurnace.php +++ b/src/pocketmine/block/BurningFurnace.php @@ -77,6 +77,11 @@ class BurningFurnace extends Solid{ new Int("z", $this->z) ]); $nbt->Items->setTagType(NBT::TAG_Compound); + + if($item->hasCustomName()){ + $nbt->CustomName = new String("CustomName", $item->getCustomName()); + } + Tile::createTile("Furnace", $this->getLevel()->getChunk($this->x >> 4, $this->z >> 4), $nbt); return true; diff --git a/src/pocketmine/block/Chest.php b/src/pocketmine/block/Chest.php index 4c2a7cf32..11e8c4db3 100644 --- a/src/pocketmine/block/Chest.php +++ b/src/pocketmine/block/Chest.php @@ -104,6 +104,11 @@ class Chest extends Transparent{ new Int("z", $this->z) ]); $nbt->Items->setTagType(NBT::TAG_Compound); + + if($item->hasCustomName()){ + $nbt->CustomName = new String("CustomName", $item->getCustomName()); + } + $tile = Tile::createTile("Chest", $this->getLevel()->getChunk($this->x >> 4, $this->z >> 4), $nbt); if($chest instanceof TileChest and $tile instanceof TileChest){ diff --git a/src/pocketmine/block/EnchantingTable.php b/src/pocketmine/block/EnchantingTable.php index b9ede2372..8b1d7f712 100644 --- a/src/pocketmine/block/EnchantingTable.php +++ b/src/pocketmine/block/EnchantingTable.php @@ -47,6 +47,11 @@ class EnchantingTable extends Transparent{ new Int("y", $this->y), new Int("z", $this->z) ]); + + if($item->hasCustomName()){ + $nbt->CustomName = new String("CustomName", $item->getCustomName()); + } + Tile::createTile(Tile::ENCHANT_TABLE, $this->getLevel()->getChunk($this->x >> 4, $this->z >> 4), $nbt); return true; diff --git a/src/pocketmine/command/defaults/GiveCommand.php b/src/pocketmine/command/defaults/GiveCommand.php index a07d7889c..665965576 100644 --- a/src/pocketmine/command/defaults/GiveCommand.php +++ b/src/pocketmine/command/defaults/GiveCommand.php @@ -25,6 +25,8 @@ use pocketmine\command\Command; use pocketmine\command\CommandSender; use pocketmine\event\TranslationContainer; use pocketmine\item\Item; +use pocketmine\nbt\NBT; +use pocketmine\nbt\tag\Compound; use pocketmine\Player; use pocketmine\utils\TextFormat; @@ -59,6 +61,27 @@ class GiveCommand extends VanillaCommand{ $item->setCount((int) $args[2]); } + if(isset($args[3])){ + $data = implode(" ", array_slice($args, 3)); + $data = preg_replace("/([A-Za-z0-9_]+[ ]*):/", '"$1":', $data); + $tags = @json_decode($data, true); + if(!is_array($tags)){ + $sender->sendMessage(new TranslationContainer("commands.give.tagError", [json_last_error_msg()])); + return true; + } + + $nbt = new NBT(); + $nbt->setArray($tags); + $tag = $nbt->getData(); + + if(!($tag instanceof Compound)){ + $sender->sendMessage(new TranslationContainer("commands.give.tagError", ["Invalid tag conversion"])); + return true; + } + + $item->setNamedTag($tag); + } + if($player instanceof Player){ if($item->getId() === 0){ $sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.give.item.notFound", [$args[1]])); diff --git a/src/pocketmine/level/particle/AngryVillagerParticle.php b/src/pocketmine/level/particle/AngryVillagerParticle.php index 9722b40fa..e33a28c4d 100644 --- a/src/pocketmine/level/particle/AngryVillagerParticle.php +++ b/src/pocketmine/level/particle/AngryVillagerParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class AngryVillagerParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 29); + parent::__construct($pos, Particle::TYPE_VILLAGER_ANGRY); } } diff --git a/src/pocketmine/level/particle/BubbleParticle.php b/src/pocketmine/level/particle/BubbleParticle.php index ad3e06c2e..8262e7d9b 100644 --- a/src/pocketmine/level/particle/BubbleParticle.php +++ b/src/pocketmine/level/particle/BubbleParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class BubbleParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 1); + parent::__construct($pos, Particle::TYPE_BUBBLE); } } diff --git a/src/pocketmine/level/particle/CriticalParticle.php b/src/pocketmine/level/particle/CriticalParticle.php index 8e43114ac..9b6640687 100644 --- a/src/pocketmine/level/particle/CriticalParticle.php +++ b/src/pocketmine/level/particle/CriticalParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class CriticalParticle extends GenericParticle{ public function __construct(Vector3 $pos, $scale = 2){ - parent::__construct($pos, 2, $scale); + parent::__construct($pos, Particle::TYPE_CRITICAL, $scale); } } diff --git a/src/pocketmine/level/particle/DustParticle.php b/src/pocketmine/level/particle/DustParticle.php index e3de30907..0f0ad4e3b 100644 --- a/src/pocketmine/level/particle/DustParticle.php +++ b/src/pocketmine/level/particle/DustParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class DustParticle extends GenericParticle{ public function __construct(Vector3 $pos, $r, $g, $b, $a = 255){ - parent::__construct($pos, 22, (($a & 0xff) << 24) | (($r & 0xff) << 16) | (($g & 0xff) << 8) | ($b & 0xff)); + parent::__construct($pos, Particle::TYPE_DUST, (($a & 0xff) << 24) | (($r & 0xff) << 16) | (($g & 0xff) << 8) | ($b & 0xff)); } } diff --git a/src/pocketmine/level/particle/EnchantParticle.php b/src/pocketmine/level/particle/EnchantParticle.php index a5c82daf2..643f071bc 100644 --- a/src/pocketmine/level/particle/EnchantParticle.php +++ b/src/pocketmine/level/particle/EnchantParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class EnchantParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 23); + parent::__construct($pos, Particle::TYPE_MOB_SPELL); } } diff --git a/src/pocketmine/level/particle/EnchantmentTableParticle.php b/src/pocketmine/level/particle/EnchantmentTableParticle.php index 3872fded9..06910db87 100644 --- a/src/pocketmine/level/particle/EnchantmentTableParticle.php +++ b/src/pocketmine/level/particle/EnchantmentTableParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class EnchantmentTableParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 31); + parent::__construct($pos, Particle::TYPE_ENCHANTMENT_TABLE); } } diff --git a/src/pocketmine/level/particle/EntityFlameParticle.php b/src/pocketmine/level/particle/EntityFlameParticle.php index 283f8b4e2..c2ba5835f 100644 --- a/src/pocketmine/level/particle/EntityFlameParticle.php +++ b/src/pocketmine/level/particle/EntityFlameParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class EntityFlameParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 13); + parent::__construct($pos, Particle::TYPE_MOB_FLAME); } } diff --git a/src/pocketmine/level/particle/ExplodeParticle.php b/src/pocketmine/level/particle/ExplodeParticle.php index 0504697f9..f8f122842 100644 --- a/src/pocketmine/level/particle/ExplodeParticle.php +++ b/src/pocketmine/level/particle/ExplodeParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class ExplodeParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 4); + parent::__construct($pos, Particle::TYPE_EXPLODE); } } diff --git a/src/pocketmine/level/particle/FlameParticle.php b/src/pocketmine/level/particle/FlameParticle.php index 400ef7092..0daf31d00 100644 --- a/src/pocketmine/level/particle/FlameParticle.php +++ b/src/pocketmine/level/particle/FlameParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class FlameParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 5); + parent::__construct($pos, Particle::TYPE_FLAME); } } diff --git a/src/pocketmine/level/particle/FloatingTextParticle.php b/src/pocketmine/level/particle/FloatingTextParticle.php index c25fea661..e58ea87ac 100644 --- a/src/pocketmine/level/particle/FloatingTextParticle.php +++ b/src/pocketmine/level/particle/FloatingTextParticle.php @@ -35,6 +35,11 @@ class FloatingTextParticle extends Particle{ protected $entityId; protected $invisible = false; + /** + * @param Vector3 $pos + * @param int $text + * @param string $title + */ public function __construct(Vector3 $pos, $text, $title = ""){ parent::__construct($pos->x, $pos->y, $pos->z); $this->text = $text; diff --git a/src/pocketmine/level/particle/HappyVillagerParticle.php b/src/pocketmine/level/particle/HappyVillagerParticle.php index 035ace6b2..14ef5234e 100644 --- a/src/pocketmine/level/particle/HappyVillagerParticle.php +++ b/src/pocketmine/level/particle/HappyVillagerParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class HappyVillagerParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 30); + parent::__construct($pos, Particle::TYPE_VILLAGER_HAPPY); } } diff --git a/src/pocketmine/level/particle/HeartParticle.php b/src/pocketmine/level/particle/HeartParticle.php index dd3bbe3e6..8696ba5e7 100644 --- a/src/pocketmine/level/particle/HeartParticle.php +++ b/src/pocketmine/level/particle/HeartParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class HeartParticle extends GenericParticle{ public function __construct(Vector3 $pos, $scale = 0){ - parent::__construct($pos, 14, $scale); + parent::__construct($pos, Particle::TYPE_HEART, $scale); } } diff --git a/src/pocketmine/level/particle/HugeExplodeParticle.php b/src/pocketmine/level/particle/HugeExplodeParticle.php index 790cb632d..e27895002 100644 --- a/src/pocketmine/level/particle/HugeExplodeParticle.php +++ b/src/pocketmine/level/particle/HugeExplodeParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class HugeExplodeParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 12); + parent::__construct($pos, Particle::TYPE_HUGE_EXPLODE); } } diff --git a/src/pocketmine/level/particle/InkParticle.php b/src/pocketmine/level/particle/InkParticle.php index ad5291c5c..71a05a746 100644 --- a/src/pocketmine/level/particle/InkParticle.php +++ b/src/pocketmine/level/particle/InkParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class InkParticle extends GenericParticle{ public function __construct(Vector3 $pos, $scale = 0){ - parent::__construct($pos, 26, $scale); + parent::__construct($pos, Particle::TYPE_INK, $scale); } } diff --git a/src/pocketmine/level/particle/InstantEnchantParticle.php b/src/pocketmine/level/particle/InstantEnchantParticle.php index 38bddc453..0a6099d7e 100644 --- a/src/pocketmine/level/particle/InstantEnchantParticle.php +++ b/src/pocketmine/level/particle/InstantEnchantParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class InstantEnchantParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 25); + parent::__construct($pos, Particle::TYPE_MOB_SPELL_INSTANTANEOUS); } } diff --git a/src/pocketmine/level/particle/ItemBreakParticle.php b/src/pocketmine/level/particle/ItemBreakParticle.php index 4314c896c..394f90a32 100644 --- a/src/pocketmine/level/particle/ItemBreakParticle.php +++ b/src/pocketmine/level/particle/ItemBreakParticle.php @@ -26,6 +26,6 @@ use pocketmine\item\Item; class ItemBreakParticle extends GenericParticle{ public function __construct(Vector3 $pos, Item $item){ - parent::__construct($pos, 9, ($item->getId() << 16) | $item->getDamage()); + parent::__construct($pos, Particle::TYPE_ITEM_BREAK, ($item->getId() << 16) | $item->getDamage()); } } diff --git a/src/pocketmine/level/particle/LargeExplodeParticle.php b/src/pocketmine/level/particle/LargeExplodeParticle.php index 8cae65a06..27bf263cd 100644 --- a/src/pocketmine/level/particle/LargeExplodeParticle.php +++ b/src/pocketmine/level/particle/LargeExplodeParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class LargeExplodeParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 11); + parent::__construct($pos, Particle::TYPE_LARGE_EXPLODE); } } diff --git a/src/pocketmine/level/particle/LavaDripParticle.php b/src/pocketmine/level/particle/LavaDripParticle.php index c0b557632..657d86bce 100644 --- a/src/pocketmine/level/particle/LavaDripParticle.php +++ b/src/pocketmine/level/particle/LavaDripParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class LavaDripParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 21); + parent::__construct($pos, Particle::TYPE_DRIP_LAVA); } } diff --git a/src/pocketmine/level/particle/LavaParticle.php b/src/pocketmine/level/particle/LavaParticle.php index d5e2b0c47..8809c02ab 100644 --- a/src/pocketmine/level/particle/LavaParticle.php +++ b/src/pocketmine/level/particle/LavaParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class LavaParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 6); + parent::__construct($pos, Particle::TYPE_LAVA); } } diff --git a/src/pocketmine/level/particle/Particle.php b/src/pocketmine/level/particle/Particle.php index 82323b08a..2adf99250 100644 --- a/src/pocketmine/level/particle/Particle.php +++ b/src/pocketmine/level/particle/Particle.php @@ -25,6 +25,39 @@ use pocketmine\math\Vector3; use pocketmine\network\protocol\DataPacket; abstract class Particle extends Vector3{ + + const TYPE_BUBBLE = 1; + const TYPE_CRITICAL = 2; + const TYPE_SMOKE = 3; + const TYPE_EXPLODE = 4; + const TYPE_WHITE_SMOKE = 5; + const TYPE_FLAME = 6; + const TYPE_LAVA = 7; + const TYPE_LARGE_SMOKE = 8; + const TYPE_REDSTONE = 9; + const TYPE_ITEM_BREAK = 10; + const TYPE_SNOWBALL_POOF = 11; + const TYPE_LARGE_EXPLODE = 12; + const TYPE_HUGE_EXPLODE = 13; + const TYPE_MOB_FLAME = 14; + const TYPE_HEART = 15; + const TYPE_TERRAIN = 16; + const TYPE_TOWN_AURA = 17; + const TYPE_PORTAL = 18; + const TYPE_WATER_SPLASH = 19; + const TYPE_WATER_WAKE = 20; + const TYPE_DRIP_WATER = 21; + const TYPE_DRIP_LAVA = 22; + const TYPE_DUST = 23; + const TYPE_MOB_SPELL = 24; + const TYPE_MOB_SPELL_AMBIENT = 25; + const TYPE_MOB_SPELL_INSTANTANEOUS = 26; + const TYPE_INK = 27; + const TYPE_SLIME = 28; + const TYPE_RAIN_SPLASH = 29; + const TYPE_VILLAGER_ANGRY = 30; + const TYPE_VILLAGER_HAPPY = 31; + const TYPE_ENCHANTMENT_TABLE = 32; /** * @return DataPacket|DataPacket[] diff --git a/src/pocketmine/level/particle/PortalParticle.php b/src/pocketmine/level/particle/PortalParticle.php index 95ce3b16d..216307ddf 100644 --- a/src/pocketmine/level/particle/PortalParticle.php +++ b/src/pocketmine/level/particle/PortalParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class PortalParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 17); + parent::__construct($pos, Particle::TYPE_PORTAL); } } diff --git a/src/pocketmine/level/particle/RainSplashParticle.php b/src/pocketmine/level/particle/RainSplashParticle.php index 75ad4dba5..26a9fefcb 100644 --- a/src/pocketmine/level/particle/RainSplashParticle.php +++ b/src/pocketmine/level/particle/RainSplashParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class RainSplashParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 28); + parent::__construct($pos, Particle::TYPE_RAIN_SPLASH); } } diff --git a/src/pocketmine/level/particle/RedstoneParticle.php b/src/pocketmine/level/particle/RedstoneParticle.php index c976da531..ca343b8b2 100644 --- a/src/pocketmine/level/particle/RedstoneParticle.php +++ b/src/pocketmine/level/particle/RedstoneParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class RedstoneParticle extends GenericParticle{ public function __construct(Vector3 $pos, $lifetime = 1){ - parent::__construct($pos, 8, $lifetime); + parent::__construct($pos, Particle::TYPE_REDSTONE, $lifetime); } } diff --git a/src/pocketmine/level/particle/SmokeParticle.php b/src/pocketmine/level/particle/SmokeParticle.php index b21f66090..b58cc56b5 100644 --- a/src/pocketmine/level/particle/SmokeParticle.php +++ b/src/pocketmine/level/particle/SmokeParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class SmokeParticle extends GenericParticle{ public function __construct(Vector3 $pos, $scale = 0){ - parent::__construct($pos, 3, (int) $scale); + parent::__construct($pos, Particle::TYPE_SMOKE, (int) $scale); } } diff --git a/src/pocketmine/level/particle/SplashParticle.php b/src/pocketmine/level/particle/SplashParticle.php index 62da9de07..84c1928ad 100644 --- a/src/pocketmine/level/particle/SplashParticle.php +++ b/src/pocketmine/level/particle/SplashParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class SplashParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 18); + parent::__construct($pos, Particle::TYPE_WATER_SPLASH); } } diff --git a/src/pocketmine/level/particle/SporeParticle.php b/src/pocketmine/level/particle/SporeParticle.php index 92e923973..a2156d631 100644 --- a/src/pocketmine/level/particle/SporeParticle.php +++ b/src/pocketmine/level/particle/SporeParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class SporeParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 16); + parent::__construct($pos, Particle::TYPE_TOWN_AURA); } } diff --git a/src/pocketmine/level/particle/TerrainParticle.php b/src/pocketmine/level/particle/TerrainParticle.php index abe8f1105..7230bb7f7 100644 --- a/src/pocketmine/level/particle/TerrainParticle.php +++ b/src/pocketmine/level/particle/TerrainParticle.php @@ -26,6 +26,6 @@ use pocketmine\math\Vector3; class TerrainParticle extends GenericParticle{ public function __construct(Vector3 $pos, Block $b){ - parent::__construct($pos, 15, ($b->getDamage() << 8) | $b->getId()); + parent::__construct($pos, Particle::TYPE_TERRAIN, ($b->getDamage() << 8) | $b->getId()); } } diff --git a/src/pocketmine/level/particle/WaterDripParticle.php b/src/pocketmine/level/particle/WaterDripParticle.php index 2ae566217..ad99c10d2 100644 --- a/src/pocketmine/level/particle/WaterDripParticle.php +++ b/src/pocketmine/level/particle/WaterDripParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class WaterDripParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 20); + parent::__construct($pos, Particle::TYPE_DRIP_WATER); } } diff --git a/src/pocketmine/level/particle/WaterParticle.php b/src/pocketmine/level/particle/WaterParticle.php index 8a5682232..cfd1dee87 100644 --- a/src/pocketmine/level/particle/WaterParticle.php +++ b/src/pocketmine/level/particle/WaterParticle.php @@ -25,6 +25,6 @@ use pocketmine\math\Vector3; class WaterParticle extends GenericParticle{ public function __construct(Vector3 $pos){ - parent::__construct($pos, 19); + parent::__construct($pos, Particle::TYPE_WATER_WAKE); } } diff --git a/src/pocketmine/nbt/NBT.php b/src/pocketmine/nbt/NBT.php index 99e25d700..c2c92a685 100644 --- a/src/pocketmine/nbt/NBT.php +++ b/src/pocketmine/nbt/NBT.php @@ -100,17 +100,18 @@ class NBT{ } /** - * @param Compound $item + * @param Compound $tag * @return Item */ - public static function getItemHelper(Compound $item){ - if(!isset($item->id) or !isset($item->Damage) or !isset($item->Count)){ + public static function getItemHelper(Compound $tag){ + if(!isset($tag->id) or !isset($tag->Damage) or !isset($tag->Count)){ return Item::get(0); } - $item = Item::get($item->id->getValue(), $item->Damage->getValue(), $item->Count->getValue()); - if(isset($item->tag)){ - $item->setNamedTag($item->tag); + $item = Item::get($tag->id->getValue(), $tag->Damage->getValue(), $tag->Count->getValue()); + + if(isset($tag->tag) and $tag->tag instanceof Compound){ + $item->setNamedTag($tag->tag); } return $item; @@ -162,6 +163,8 @@ class NBT{ */ public function write(){ $this->offset = 0; + $this->buffer = ""; + if($this->data instanceof Compound){ $this->writeTag($this->data); @@ -306,22 +309,22 @@ class NBT{ public function getArray(){ $data = []; - $this->toArray($data, $this->data); + self::toArray($data, $this->data); } - private function toArray(array &$data, Tag $tag){ + private static function toArray(array &$data, Tag $tag){ /** @var Compound[]|Enum[]|IntArray[] $tag */ foreach($tag as $key => $value){ if($value instanceof Compound or $value instanceof Enum or $value instanceof IntArray){ $data[$key] = []; - $this->toArray($data[$key], $value); + self::toArray($data[$key], $value); }else{ $data[$key] = $value->getValue(); } } } - private function fromArray(Tag $tag, array $data, $byteArray = false){ + private static function fromArray(Tag $tag, array $data, $byteArray = false){ foreach($data as $key => $value){ if(is_array($value)){ $isNumeric = true; @@ -335,7 +338,7 @@ class NBT{ } } $tag{$key} = $isNumeric ? ($isIntArray ? new IntArray($key, []) : new Enum($key, [])) : new Compound($key, []); - $this->fromArray($tag->{$key}, $value); + self::fromArray($tag->{$key}, $value); }elseif(is_int($value)){ $tag{$key} = new Int($key, $value); }elseif(is_float($value)){ @@ -354,7 +357,7 @@ class NBT{ public function setArray(array $data, $byteArray = false){ $this->data = new Compound("", []); - $this->fromArray($this->data, $data, $byteArray); + self::fromArray($this->data, $data, $byteArray); } /** diff --git a/src/pocketmine/network/protocol/CraftingDataPacket.php b/src/pocketmine/network/protocol/CraftingDataPacket.php index 64c65270f..f84c580bf 100644 --- a/src/pocketmine/network/protocol/CraftingDataPacket.php +++ b/src/pocketmine/network/protocol/CraftingDataPacket.php @@ -100,9 +100,15 @@ class CraftingDataPacket extends DataPacket{ } } - private static function writeEnchant(){ + private static function writeEnchant($slot, $enchantmentId, $enchantmentLevel, $cost, $name, BinaryStream $stream){ //TODO + $stream->putInt($slot); + $stream->putInt($enchantmentId); + $stream->putInt($enchantmentLevel); + $stream->putInt($cost); + $stream->putString($name); + return CraftingDataPacket::ENTRY_ENCHANT; } diff --git a/src/pocketmine/network/protocol/Info.php b/src/pocketmine/network/protocol/Info.php index 79b2127b6..81a97b487 100644 --- a/src/pocketmine/network/protocol/Info.php +++ b/src/pocketmine/network/protocol/Info.php @@ -30,7 +30,7 @@ interface Info{ /** * Actual Minecraft: PE protocol version */ - const CURRENT_PROTOCOL = 32; + const CURRENT_PROTOCOL = 33; const LOGIN_PACKET = 0x87; const PLAY_STATUS_PACKET = 0x88; diff --git a/src/pocketmine/network/protocol/TextPacket.php b/src/pocketmine/network/protocol/TextPacket.php index fcd994717..1e0797263 100644 --- a/src/pocketmine/network/protocol/TextPacket.php +++ b/src/pocketmine/network/protocol/TextPacket.php @@ -41,10 +41,10 @@ class TextPacket extends DataPacket{ public function decode(){ $this->type = $this->getByte(); switch($this->type){ + case self::TYPE_POPUP: case self::TYPE_CHAT: $this->source = $this->getString(); case self::TYPE_RAW: - case self::TYPE_POPUP: case self::TYPE_TIP: $this->message = $this->getString(); break; diff --git a/src/pocketmine/tile/Chest.php b/src/pocketmine/tile/Chest.php index bec83b719..9edab04a8 100644 --- a/src/pocketmine/tile/Chest.php +++ b/src/pocketmine/tile/Chest.php @@ -35,7 +35,7 @@ use pocketmine\nbt\tag\Int; use pocketmine\nbt\tag\Short; use pocketmine\nbt\tag\String; -class Chest extends Spawnable implements InventoryHolder, Container{ +class Chest extends Spawnable implements InventoryHolder, Container, Nameable{ /** @var ChestInventory */ protected $inventory; @@ -182,6 +182,23 @@ class Chest extends Spawnable implements InventoryHolder, Container{ } } + public function getName(){ + return isset($this->namedtag->CustomName) ? $this->namedtag->CustomName->getValue() : "Chest"; + } + + public function hasName(){ + return isset($this->namedtag->CustomName); + } + + public function setName($str){ + if($str === ""){ + unset($this->namedtag->CustomName); + return; + } + + $this->namedtag->CustomName = new String("CustomName", $str); + } + public function isPaired(){ if(!isset($this->namedtag->pairx) or !isset($this->namedtag->pairz)){ return false; @@ -248,7 +265,7 @@ class Chest extends Spawnable implements InventoryHolder, Container{ public function getSpawnCompound(){ if($this->isPaired()){ - return new Compound("", [ + $c = new Compound("", [ new String("id", Tile::CHEST), new Int("x", (int) $this->x), new Int("y", (int) $this->y), @@ -257,12 +274,18 @@ class Chest extends Spawnable implements InventoryHolder, Container{ new Int("pairz", (int) $this->namedtag["pairz"]) ]); }else{ - return new Compound("", [ + $c = new Compound("", [ new String("id", Tile::CHEST), new Int("x", (int) $this->x), new Int("y", (int) $this->y), new Int("z", (int) $this->z) ]); } + + if($this->hasName()){ + $c->CustomName = $this->namedtag->CustomName; + } + + return $c; } } diff --git a/src/pocketmine/tile/EnchantTable.php b/src/pocketmine/tile/EnchantTable.php index 1a9fa9cc5..09e3cfc48 100644 --- a/src/pocketmine/tile/EnchantTable.php +++ b/src/pocketmine/tile/EnchantTable.php @@ -25,14 +25,38 @@ use pocketmine\nbt\tag\Compound; use pocketmine\nbt\tag\Int; use pocketmine\nbt\tag\String; -class EnchantTable extends Spawnable{ +class EnchantTable extends Spawnable implements Nameable{ + + + public function getName(){ + return isset($this->namedtag->CustomName) ? $this->namedtag->CustomName->getValue() : "Chest"; + } + + public function hasName(){ + return isset($this->namedtag->CustomName); + } + + public function setName($str){ + if($str === ""){ + unset($this->namedtag->CustomName); + return; + } + + $this->namedtag->CustomName = new String("CustomName", $str); + } public function getSpawnCompound(){ - return new Compound("", [ + $c = new Compound("", [ new String("id", Tile::ENCHANT_TABLE), new Int("x", (int) $this->x), new Int("y", (int) $this->y), new Int("z", (int) $this->z) ]); + + if($this->hasName()){ + $c->CustomName = $this->namedtag->CustomName; + } + + return $c; } } diff --git a/src/pocketmine/tile/Furnace.php b/src/pocketmine/tile/Furnace.php index 3f6abab74..3dca094de 100644 --- a/src/pocketmine/tile/Furnace.php +++ b/src/pocketmine/tile/Furnace.php @@ -34,10 +34,11 @@ use pocketmine\nbt\tag\Byte; use pocketmine\nbt\tag\Compound; use pocketmine\nbt\tag\Enum; use pocketmine\nbt\tag\Short; +use pocketmine\nbt\tag\String; use pocketmine\network\Network; use pocketmine\network\protocol\ContainerSetDataPacket; -class Furnace extends Tile implements InventoryHolder, Container{ +class Furnace extends Tile implements InventoryHolder, Container, Nameable{ /** @var FurnaceInventory */ protected $inventory; @@ -69,6 +70,23 @@ class Furnace extends Tile implements InventoryHolder, Container{ } } + public function getName(){ + return isset($this->namedtag->CustomName) ? $this->namedtag->CustomName->getValue() : "Chest"; + } + + public function hasName(){ + return isset($this->namedtag->CustomName); + } + + public function setName($str){ + if($str === ""){ + unset($this->namedtag->CustomName); + return; + } + + $this->namedtag->CustomName = new String("CustomName", $str); + } + public function close(){ if($this->closed === false){ foreach($this->getInventory()->getViewers() as $player){ diff --git a/src/pocketmine/tile/Nameable.php b/src/pocketmine/tile/Nameable.php new file mode 100644 index 000000000..77fc29e54 --- /dev/null +++ b/src/pocketmine/tile/Nameable.php @@ -0,0 +1,42 @@ +