commit
f72c747b50
@ -2152,7 +2152,9 @@ end
|
|||||||
DoWithDropSpenserAt = { Params = "X, Y, Z, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is a dropper or a dispenser at the specified coords, calls the CallbackFunction with the {{cDropSpenserEntity}} parameter representing the dropper or dispenser. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cDropSpenserEntity|DropSpenserEntity}}, [CallbackData])</pre> Note that this can be used to access both dispensers and droppers in a similar way. The function returns false if there is neither dispenser nor dropper, or if there is, it returns the bool value that the callback has returned." },
|
DoWithDropSpenserAt = { Params = "X, Y, Z, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is a dropper or a dispenser at the specified coords, calls the CallbackFunction with the {{cDropSpenserEntity}} parameter representing the dropper or dispenser. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cDropSpenserEntity|DropSpenserEntity}}, [CallbackData])</pre> Note that this can be used to access both dispensers and droppers in a similar way. The function returns false if there is neither dispenser nor dropper, or if there is, it returns the bool value that the callback has returned." },
|
||||||
DoWithDropperAt = { Params = "X, Y, Z, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is a dropper at the specified coords, calls the CallbackFunction with the {{cDropperEntity}} parameter representing the dropper. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cDropperEntity|DropperEntity}}, [CallbackData])</pre> The function returns false if there is no dropper, or if there is, it returns the bool value that the callback has returned." },
|
DoWithDropperAt = { Params = "X, Y, Z, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is a dropper at the specified coords, calls the CallbackFunction with the {{cDropperEntity}} parameter representing the dropper. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cDropperEntity|DropperEntity}}, [CallbackData])</pre> The function returns false if there is no dropper, or if there is, it returns the bool value that the callback has returned." },
|
||||||
DoWithEntityByID = { Params = "EntityID, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If an entity with the specified ID exists, calls the callback with the {{cEntity}} parameter representing the entity. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cEntity|Entity}}, [CallbackData])</pre> The function returns false if the entity was not found, and it returns the same bool value that the callback has returned if the entity was found." },
|
DoWithEntityByID = { Params = "EntityID, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If an entity with the specified ID exists, calls the callback with the {{cEntity}} parameter representing the entity. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cEntity|Entity}}, [CallbackData])</pre> The function returns false if the entity was not found, and it returns the same bool value that the callback has returned if the entity was found." },
|
||||||
|
DoWithFlowerPotAt = { Params = "X, Y, Z, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is a flower pot at the specified coords, calls the CallbackFunction with the {{cFlowerPotEntity}} parameter representing the flower pot. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cFlowerPotEntity|FlowerPotEntity}}, [CallbackData])</pre> The function returns false if there is no flower pot, or if there is, it returns the bool value that the callback has returned." },
|
||||||
DoWithFurnaceAt = { Params = "X, Y, Z, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is a furnace at the specified coords, calls the CallbackFunction with the {{cFurnaceEntity}} parameter representing the furnace. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cFurnaceEntity|FurnaceEntity}}, [CallbackData])</pre> The function returns false if there is no furnace, or if there is, it returns the bool value that the callback has returned." },
|
DoWithFurnaceAt = { Params = "X, Y, Z, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is a furnace at the specified coords, calls the CallbackFunction with the {{cFurnaceEntity}} parameter representing the furnace. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cFurnaceEntity|FurnaceEntity}}, [CallbackData])</pre> The function returns false if there is no furnace, or if there is, it returns the bool value that the callback has returned." },
|
||||||
|
DoWithMobHeadAt = { Params = "X, Y, Z, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is a mob head at the specified coords, calls the CallbackFunction with the {{cMobHeadEntity}} parameter representing the furnace. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cMobHeadEntity|MobHeadEntity}}, [CallbackData])</pre> The function returns false if there is no mob head, or if there is, it returns the bool value that the callback has returned." },
|
||||||
DoWithNoteBlockAt = { Params = "BlockX, BlockY, BlockZ, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is a note block at the specified coords, calls the CallbackFunction with the {{cNoteEntity}} parameter representing the note block. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cNoteEntity|NoteEntity}}, [CallbackData])</pre> The function returns false if there is no note block, or if there is, it returns the bool value that the callback has returned." },
|
DoWithNoteBlockAt = { Params = "BlockX, BlockY, BlockZ, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is a note block at the specified coords, calls the CallbackFunction with the {{cNoteEntity}} parameter representing the note block. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cNoteEntity|NoteEntity}}, [CallbackData])</pre> The function returns false if there is no note block, or if there is, it returns the bool value that the callback has returned." },
|
||||||
DoWithPlayer = { Params = "PlayerName, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is a player of the specified name (exact match), calls the CallbackFunction with the {{cPlayer}} parameter representing the player. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cPlayer|Player}}, [CallbackData])</pre> The function returns false if the player was not found, or whatever bool value the callback returned if the player was found." },
|
DoWithPlayer = { Params = "PlayerName, CallbackFunction, [CallbackData]", Return = "bool", Notes = "If there is a player of the specified name (exact match), calls the CallbackFunction with the {{cPlayer}} parameter representing the player. The CallbackFunction has the following signature: <pre class=\"prettyprint lang-lua\">function Callback({{cPlayer|Player}}, [CallbackData])</pre> The function returns false if the player was not found, or whatever bool value the callback returned if the player was found." },
|
||||||
FastSetBlock =
|
FastSetBlock =
|
||||||
|
@ -238,6 +238,20 @@ World:ForEachChestInChunk(Player:GetChunkX(), Player:GetChunkZ(),
|
|||||||
},
|
},
|
||||||
Inherits = "cBlockEntity";
|
Inherits = "cBlockEntity";
|
||||||
}, -- cSignEntity
|
}, -- cSignEntity
|
||||||
|
|
||||||
|
cFlowerPotEntity =
|
||||||
|
{
|
||||||
|
Desc = [[
|
||||||
|
This class represents a flower pot entity in the world.
|
||||||
|
]],
|
||||||
|
Functions =
|
||||||
|
{
|
||||||
|
IsItemInPot = { Params = "", Return = "bool", Notes = "Is a flower in the pot?" },
|
||||||
|
GetItem = { Params = "", Return = "{{cItem|Item}}", Notes = "Returns the item in the flower pot." },
|
||||||
|
SetItem = { Params = "{{cItem|Item}}", Return = "", Notes = "Set the item in the flower pot" },
|
||||||
|
},
|
||||||
|
Inherits = "cBlockEntity";
|
||||||
|
}, -- cFlowerPotEntity
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -58,6 +58,8 @@ $cfile "../BlockEntities/HopperEntity.h"
|
|||||||
$cfile "../BlockEntities/JukeboxEntity.h"
|
$cfile "../BlockEntities/JukeboxEntity.h"
|
||||||
$cfile "../BlockEntities/NoteEntity.h"
|
$cfile "../BlockEntities/NoteEntity.h"
|
||||||
$cfile "../BlockEntities/SignEntity.h"
|
$cfile "../BlockEntities/SignEntity.h"
|
||||||
|
$cfile "../BlockEntities/MobHeadEntity.h"
|
||||||
|
$cfile "../BlockEntities/FlowerPotEntity.h"
|
||||||
$cfile "../WebAdmin.h"
|
$cfile "../WebAdmin.h"
|
||||||
$cfile "../Root.h"
|
$cfile "../Root.h"
|
||||||
$cfile "../Vector3f.h"
|
$cfile "../Vector3f.h"
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include "../BlockEntities/HopperEntity.h"
|
#include "../BlockEntities/HopperEntity.h"
|
||||||
#include "../BlockEntities/NoteEntity.h"
|
#include "../BlockEntities/NoteEntity.h"
|
||||||
#include "../BlockEntities/MobHeadEntity.h"
|
#include "../BlockEntities/MobHeadEntity.h"
|
||||||
|
#include "../BlockEntities/FlowerPotEntity.h"
|
||||||
#include "md5/md5.h"
|
#include "md5/md5.h"
|
||||||
#include "../LineBlockTracer.h"
|
#include "../LineBlockTracer.h"
|
||||||
#include "../WorldStorage/SchematicFileSerializer.h"
|
#include "../WorldStorage/SchematicFileSerializer.h"
|
||||||
@ -2880,7 +2881,8 @@ void ManualBindings::Bind(lua_State * tolua_S)
|
|||||||
tolua_function(tolua_S, "DoWithFurnaceAt", tolua_DoWithXYZ<cWorld, cFurnaceEntity, &cWorld::DoWithFurnaceAt>);
|
tolua_function(tolua_S, "DoWithFurnaceAt", tolua_DoWithXYZ<cWorld, cFurnaceEntity, &cWorld::DoWithFurnaceAt>);
|
||||||
tolua_function(tolua_S, "DoWithNoteBlockAt", tolua_DoWithXYZ<cWorld, cNoteEntity, &cWorld::DoWithNoteBlockAt>);
|
tolua_function(tolua_S, "DoWithNoteBlockAt", tolua_DoWithXYZ<cWorld, cNoteEntity, &cWorld::DoWithNoteBlockAt>);
|
||||||
tolua_function(tolua_S, "DoWithCommandBlockAt", tolua_DoWithXYZ<cWorld, cCommandBlockEntity, &cWorld::DoWithCommandBlockAt>);
|
tolua_function(tolua_S, "DoWithCommandBlockAt", tolua_DoWithXYZ<cWorld, cCommandBlockEntity, &cWorld::DoWithCommandBlockAt>);
|
||||||
tolua_function(tolua_S, "DoWithMobHeadBlockAt", tolua_DoWithXYZ<cWorld, cMobHeadEntity, &cWorld::DoWithMobHeadBlockAt>);
|
tolua_function(tolua_S, "DoWithMobHeadAt", tolua_DoWithXYZ<cWorld, cMobHeadEntity, &cWorld::DoWithMobHeadAt>);
|
||||||
|
tolua_function(tolua_S, "DoWithFlowerPotAt", tolua_DoWithXYZ<cWorld, cFlowerPotEntity, &cWorld::DoWithFlowerPotAt>);
|
||||||
tolua_function(tolua_S, "DoWithPlayer", tolua_DoWith< cWorld, cPlayer, &cWorld::DoWithPlayer>);
|
tolua_function(tolua_S, "DoWithPlayer", tolua_DoWith< cWorld, cPlayer, &cWorld::DoWithPlayer>);
|
||||||
tolua_function(tolua_S, "FindAndDoWithPlayer", tolua_DoWith< cWorld, cPlayer, &cWorld::FindAndDoWithPlayer>);
|
tolua_function(tolua_S, "FindAndDoWithPlayer", tolua_DoWith< cWorld, cPlayer, &cWorld::FindAndDoWithPlayer>);
|
||||||
tolua_function(tolua_S, "ForEachBlockEntityInChunk", tolua_ForEachInChunk<cWorld, cBlockEntity, &cWorld::ForEachBlockEntityInChunk>);
|
tolua_function(tolua_S, "ForEachBlockEntityInChunk", tolua_ForEachInChunk<cWorld, cBlockEntity, &cWorld::ForEachBlockEntityInChunk>);
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "DispenserEntity.h"
|
#include "DispenserEntity.h"
|
||||||
#include "DropperEntity.h"
|
#include "DropperEntity.h"
|
||||||
#include "EnderChestEntity.h"
|
#include "EnderChestEntity.h"
|
||||||
|
#include "FlowerPotEntity.h"
|
||||||
#include "FurnaceEntity.h"
|
#include "FurnaceEntity.h"
|
||||||
#include "HopperEntity.h"
|
#include "HopperEntity.h"
|
||||||
#include "JukeboxEntity.h"
|
#include "JukeboxEntity.h"
|
||||||
@ -30,6 +31,7 @@ cBlockEntity * cBlockEntity::CreateByBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE
|
|||||||
case E_BLOCK_DISPENSER: return new cDispenserEntity (a_BlockX, a_BlockY, a_BlockZ, a_World);
|
case E_BLOCK_DISPENSER: return new cDispenserEntity (a_BlockX, a_BlockY, a_BlockZ, a_World);
|
||||||
case E_BLOCK_DROPPER: return new cDropperEntity (a_BlockX, a_BlockY, a_BlockZ, a_World);
|
case E_BLOCK_DROPPER: return new cDropperEntity (a_BlockX, a_BlockY, a_BlockZ, a_World);
|
||||||
case E_BLOCK_ENDER_CHEST: return new cEnderChestEntity (a_BlockX, a_BlockY, a_BlockZ, a_World);
|
case E_BLOCK_ENDER_CHEST: return new cEnderChestEntity (a_BlockX, a_BlockY, a_BlockZ, a_World);
|
||||||
|
case E_BLOCK_FLOWER_POT: return new cFlowerPotEntity (a_BlockX, a_BlockY, a_BlockZ, a_World);
|
||||||
case E_BLOCK_HEAD: return new cMobHeadEntity (a_BlockX, a_BlockY, a_BlockZ, a_World);
|
case E_BLOCK_HEAD: return new cMobHeadEntity (a_BlockX, a_BlockY, a_BlockZ, a_World);
|
||||||
case E_BLOCK_LIT_FURNACE: return new cFurnaceEntity (a_BlockX, a_BlockY, a_BlockZ, a_BlockType, a_BlockMeta, a_World);
|
case E_BLOCK_LIT_FURNACE: return new cFurnaceEntity (a_BlockX, a_BlockY, a_BlockZ, a_BlockType, a_BlockMeta, a_World);
|
||||||
case E_BLOCK_FURNACE: return new cFurnaceEntity (a_BlockX, a_BlockY, a_BlockZ, a_BlockType, a_BlockMeta, a_World);
|
case E_BLOCK_FURNACE: return new cFurnaceEntity (a_BlockX, a_BlockY, a_BlockZ, a_BlockType, a_BlockMeta, a_World);
|
||||||
|
134
src/BlockEntities/FlowerPotEntity.cpp
Normal file
134
src/BlockEntities/FlowerPotEntity.cpp
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
|
||||||
|
// FlowerPotEntity.cpp
|
||||||
|
|
||||||
|
// Implements the cFlowerPotEntity class representing a single sign in the world
|
||||||
|
|
||||||
|
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
|
||||||
|
#include "json/json.h"
|
||||||
|
#include "FlowerPotEntity.h"
|
||||||
|
#include "../Entities/Player.h"
|
||||||
|
#include "../Item.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cFlowerPotEntity::cFlowerPotEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World) :
|
||||||
|
super(E_BLOCK_FLOWER_POT, a_BlockX, a_BlockY, a_BlockZ, a_World)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// It don't do anything when 'used'
|
||||||
|
void cFlowerPotEntity::UsedBy(cPlayer * a_Player)
|
||||||
|
{
|
||||||
|
if (IsItemInPot())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cItem SelectedItem = a_Player->GetInventory().GetEquippedItem();
|
||||||
|
if (IsFlower(SelectedItem.m_ItemType, SelectedItem.m_ItemDamage))
|
||||||
|
{
|
||||||
|
m_Item = SelectedItem.CopyOne();
|
||||||
|
if (!a_Player->IsGameModeCreative())
|
||||||
|
{
|
||||||
|
a_Player->GetInventory().RemoveOneEquippedItem();
|
||||||
|
}
|
||||||
|
m_World->BroadcastBlockEntity(m_PosX, m_PosY, m_PosZ, a_Player->GetClientHandle());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cFlowerPotEntity::SendTo(cClientHandle & a_Client)
|
||||||
|
{
|
||||||
|
a_Client.SendUpdateBlockEntity(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cFlowerPotEntity::Destroy(void)
|
||||||
|
{
|
||||||
|
// Drop the contents as pickups:
|
||||||
|
if (!m_Item.IsEmpty())
|
||||||
|
{
|
||||||
|
ASSERT(m_World != NULL);
|
||||||
|
cItems Pickups;
|
||||||
|
Pickups.Add(m_Item);
|
||||||
|
m_World->SpawnItemPickups(Pickups, m_PosX + 0.5, m_PosY + 0.5, m_PosZ + 0.5);
|
||||||
|
|
||||||
|
m_Item.Empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cFlowerPotEntity::LoadFromJson(const Json::Value & a_Value)
|
||||||
|
{
|
||||||
|
m_PosX = a_Value.get("x", 0).asInt();
|
||||||
|
m_PosY = a_Value.get("y", 0).asInt();
|
||||||
|
m_PosZ = a_Value.get("z", 0).asInt();
|
||||||
|
|
||||||
|
m_Item = cItem();
|
||||||
|
m_Item.FromJson(a_Value.get("Item", 0));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cFlowerPotEntity::SaveToJson(Json::Value & a_Value)
|
||||||
|
{
|
||||||
|
a_Value["x"] = m_PosX;
|
||||||
|
a_Value["y"] = m_PosY;
|
||||||
|
a_Value["z"] = m_PosZ;
|
||||||
|
|
||||||
|
Json::Value Item;
|
||||||
|
m_Item.GetJson(Item);
|
||||||
|
a_Value["Item"] = Item;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cFlowerPotEntity::IsFlower(short m_ItemType, short m_ItemData)
|
||||||
|
{
|
||||||
|
switch (m_ItemType)
|
||||||
|
{
|
||||||
|
case E_BLOCK_DANDELION:
|
||||||
|
case E_BLOCK_FLOWER:
|
||||||
|
case E_BLOCK_CACTUS:
|
||||||
|
case E_BLOCK_BROWN_MUSHROOM:
|
||||||
|
case E_BLOCK_RED_MUSHROOM:
|
||||||
|
case E_BLOCK_SAPLING:
|
||||||
|
case E_BLOCK_DEAD_BUSH:
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case E_BLOCK_TALL_GRASS:
|
||||||
|
{
|
||||||
|
return (m_ItemData == (short) 2);
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
74
src/BlockEntities/FlowerPotEntity.h
Normal file
74
src/BlockEntities/FlowerPotEntity.h
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
// FlowerPotEntity.h
|
||||||
|
|
||||||
|
// Declares the cFlowerPotEntity class representing a single sign in the world
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "BlockEntity.h"
|
||||||
|
|
||||||
|
class cItem;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace Json
|
||||||
|
{
|
||||||
|
class Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// tolua_begin
|
||||||
|
|
||||||
|
class cFlowerPotEntity :
|
||||||
|
public cBlockEntity
|
||||||
|
{
|
||||||
|
typedef cBlockEntity super;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
|
/** Creates a new flowerpot entity at the specified block coords. a_World may be NULL */
|
||||||
|
cFlowerPotEntity(int a_BlocX, int a_BlockY, int a_BlockZ, cWorld * a_World);
|
||||||
|
|
||||||
|
bool LoadFromJson( const Json::Value& a_Value );
|
||||||
|
virtual void SaveToJson(Json::Value& a_Value ) override;
|
||||||
|
|
||||||
|
virtual void Destroy(void) override;
|
||||||
|
|
||||||
|
// tolua_begin
|
||||||
|
|
||||||
|
/** Is a flower in the pot? */
|
||||||
|
bool IsItemInPot(void) { return !m_Item.IsEmpty(); }
|
||||||
|
|
||||||
|
/** Get the item in the flower pot */
|
||||||
|
cItem GetItem(void) const { return m_Item; }
|
||||||
|
|
||||||
|
/** Set the item in the flower pot */
|
||||||
|
void SetItem(const cItem a_Item) { m_Item = a_Item; }
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
|
virtual void UsedBy(cPlayer * a_Player) override;
|
||||||
|
virtual void SendTo(cClientHandle & a_Client) override;
|
||||||
|
|
||||||
|
static bool IsFlower(short m_ItemType, short m_ItemData);
|
||||||
|
|
||||||
|
static const char * GetClassStatic(void) { return "cFlowerPotEntity"; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
cItem m_Item;
|
||||||
|
} ; // tolua_export
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -2,101 +2,24 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "BlockHandler.h"
|
#include "BlockHandler.h"
|
||||||
|
#include "BlockEntity.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class cBlockFlowerPotHandler :
|
class cBlockFlowerPotHandler :
|
||||||
public cBlockHandler
|
public cBlockEntityHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
cBlockFlowerPotHandler(BLOCKTYPE a_BlockType) :
|
cBlockFlowerPotHandler(BLOCKTYPE a_BlockType) :
|
||||||
cBlockHandler(a_BlockType)
|
cBlockEntityHandler(a_BlockType)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
|
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
|
||||||
{
|
{
|
||||||
a_Pickups.push_back(cItem(E_ITEM_FLOWER_POT, 1, 0));
|
a_Pickups.push_back(cItem(E_ITEM_FLOWER_POT, 1, 0));
|
||||||
if (a_BlockMeta == 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
cItem Plant;
|
|
||||||
switch (a_BlockMeta)
|
|
||||||
{
|
|
||||||
case 1: Plant = cItem(E_BLOCK_RED_ROSE, 1, 0); break;
|
|
||||||
case 2: Plant = cItem(E_BLOCK_YELLOW_FLOWER, 1, 0); break;
|
|
||||||
case 3: Plant = cItem(E_BLOCK_SAPLING, 1, E_META_SAPLING_APPLE); break;
|
|
||||||
case 4: Plant = cItem(E_BLOCK_SAPLING, 1, E_META_SAPLING_CONIFER); break;
|
|
||||||
case 5: Plant = cItem(E_BLOCK_SAPLING, 1, E_META_SAPLING_BIRCH); break;
|
|
||||||
case 6: Plant = cItem(E_BLOCK_SAPLING, 1, E_META_SAPLING_JUNGLE); break;
|
|
||||||
case 7: Plant = cItem(E_BLOCK_RED_MUSHROOM, 1, 0); break;
|
|
||||||
case 8: Plant = cItem(E_BLOCK_BROWN_MUSHROOM, 1, 0); break;
|
|
||||||
case 9: Plant = cItem(E_BLOCK_CACTUS, 1, 0); break;
|
|
||||||
case 10: Plant = cItem(E_BLOCK_DEAD_BUSH, 1, 0); break;
|
|
||||||
case 11: Plant = cItem(E_BLOCK_TALL_GRASS, 1, E_META_TALL_GRASS_FERN); break;
|
|
||||||
default: return;
|
|
||||||
}
|
|
||||||
a_Pickups.push_back(Plant);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void OnUse(cWorld * a_World, cWorldInterface * a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ)
|
|
||||||
{
|
|
||||||
NIBBLETYPE Meta = a_World->GetBlockMeta( a_BlockX, a_BlockY, a_BlockZ );
|
|
||||||
if (Meta != 0)
|
|
||||||
{
|
|
||||||
// Already filled
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (a_Player->GetEquippedItem().m_ItemType)
|
|
||||||
{
|
|
||||||
case E_BLOCK_RED_ROSE: Meta = 1; break;
|
|
||||||
case E_BLOCK_YELLOW_FLOWER: Meta = 2; break;
|
|
||||||
case E_BLOCK_SAPLING:
|
|
||||||
{
|
|
||||||
switch (a_Player->GetEquippedItem().m_ItemDamage)
|
|
||||||
{
|
|
||||||
case E_META_SAPLING_APPLE: Meta = 3; break;
|
|
||||||
case E_META_SAPLING_CONIFER: Meta = 4; break;
|
|
||||||
case E_META_SAPLING_BIRCH: Meta = 5; break;
|
|
||||||
case E_META_SAPLING_JUNGLE: Meta = 6; break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case E_BLOCK_RED_MUSHROOM: Meta = 7; break;
|
|
||||||
case E_BLOCK_BROWN_MUSHROOM: Meta = 8; break;
|
|
||||||
case E_BLOCK_CACTUS: Meta = 9; break;
|
|
||||||
case E_BLOCK_DEAD_BUSH: Meta = 10; break;
|
|
||||||
case E_BLOCK_TALL_GRASS:
|
|
||||||
{
|
|
||||||
if (a_Player->GetEquippedItem().m_ItemDamage == E_META_TALL_GRASS_FERN)
|
|
||||||
{
|
|
||||||
Meta = 11;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (a_Player->GetGameMode() != gmCreative)
|
|
||||||
{
|
|
||||||
a_Player->GetInventory().RemoveOneEquippedItem();
|
|
||||||
}
|
|
||||||
a_World->SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, Meta);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
virtual bool IsUseable(void) override
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ public:
|
|||||||
BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta
|
BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta
|
||||||
) override
|
) override
|
||||||
{
|
{
|
||||||
class cCallback : public cMobHeadBlockCallback
|
class cCallback : public cMobHeadCallback
|
||||||
{
|
{
|
||||||
cPlayer * m_Player;
|
cPlayer * m_Player;
|
||||||
NIBBLETYPE m_OldBlockMeta;
|
NIBBLETYPE m_OldBlockMeta;
|
||||||
@ -45,6 +45,7 @@ public:
|
|||||||
|
|
||||||
a_MobHeadEntity->SetType(static_cast<eMobHeadType>(m_OldBlockMeta));
|
a_MobHeadEntity->SetType(static_cast<eMobHeadType>(m_OldBlockMeta));
|
||||||
a_MobHeadEntity->SetRotation(static_cast<eMobHeadRotation>(Rotation));
|
a_MobHeadEntity->SetRotation(static_cast<eMobHeadRotation>(Rotation));
|
||||||
|
a_MobHeadEntity->GetWorld()->BroadcastBlockEntity(a_MobHeadEntity->GetPosX(), a_MobHeadEntity->GetPosY(), a_MobHeadEntity->GetPosZ(), m_Player->GetClientHandle());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,7 +60,7 @@ public:
|
|||||||
|
|
||||||
a_BlockMeta = a_BlockFace;
|
a_BlockMeta = a_BlockFace;
|
||||||
cWorld * World = (cWorld *) &a_WorldInterface;
|
cWorld * World = (cWorld *) &a_WorldInterface;
|
||||||
World->DoWithMobHeadBlockAt(a_BlockX, a_BlockY, a_BlockZ, Callback);
|
World->DoWithMobHeadAt(a_BlockX, a_BlockY, a_BlockZ, Callback);
|
||||||
a_ChunkInterface.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, a_BlockMeta);
|
a_ChunkInterface.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, a_BlockMeta);
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
@ -40,6 +40,7 @@ if (NOT MSVC)
|
|||||||
BlockEntities/NoteEntity.h
|
BlockEntities/NoteEntity.h
|
||||||
BlockEntities/SignEntity.h
|
BlockEntities/SignEntity.h
|
||||||
BlockEntities/MobHeadEntity.h
|
BlockEntities/MobHeadEntity.h
|
||||||
|
BlockEntities/FlowerPotEntity.h
|
||||||
BlockID.h
|
BlockID.h
|
||||||
BoundingBox.h
|
BoundingBox.h
|
||||||
ChatColor.h
|
ChatColor.h
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "BlockEntities/NoteEntity.h"
|
#include "BlockEntities/NoteEntity.h"
|
||||||
#include "BlockEntities/SignEntity.h"
|
#include "BlockEntities/SignEntity.h"
|
||||||
#include "BlockEntities/MobHeadEntity.h"
|
#include "BlockEntities/MobHeadEntity.h"
|
||||||
|
#include "BlockEntities/FlowerPotEntity.h"
|
||||||
#include "Entities/Pickup.h"
|
#include "Entities/Pickup.h"
|
||||||
#include "Item.h"
|
#include "Item.h"
|
||||||
#include "Noise.h"
|
#include "Noise.h"
|
||||||
@ -1311,6 +1312,7 @@ void cChunk::CreateBlockEntities(void)
|
|||||||
case E_BLOCK_HEAD:
|
case E_BLOCK_HEAD:
|
||||||
case E_BLOCK_NOTE_BLOCK:
|
case E_BLOCK_NOTE_BLOCK:
|
||||||
case E_BLOCK_JUKEBOX:
|
case E_BLOCK_JUKEBOX:
|
||||||
|
case E_BLOCK_FLOWER_POT:
|
||||||
{
|
{
|
||||||
if (!HasBlockEntityAt(x + m_PosX * Width, y + m_PosY * Height, z + m_PosZ * Width))
|
if (!HasBlockEntityAt(x + m_PosX * Width, y + m_PosY * Height, z + m_PosZ * Width))
|
||||||
{
|
{
|
||||||
@ -1440,6 +1442,7 @@ void cChunk::SetBlock(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType,
|
|||||||
case E_BLOCK_HEAD:
|
case E_BLOCK_HEAD:
|
||||||
case E_BLOCK_NOTE_BLOCK:
|
case E_BLOCK_NOTE_BLOCK:
|
||||||
case E_BLOCK_JUKEBOX:
|
case E_BLOCK_JUKEBOX:
|
||||||
|
case E_BLOCK_FLOWER_POT:
|
||||||
{
|
{
|
||||||
AddBlockEntity(cBlockEntity::CreateByBlockType(a_BlockType, a_BlockMeta, WorldPos.x, WorldPos.y, WorldPos.z, m_World));
|
AddBlockEntity(cBlockEntity::CreateByBlockType(a_BlockType, a_BlockMeta, WorldPos.x, WorldPos.y, WorldPos.z, m_World));
|
||||||
break;
|
break;
|
||||||
@ -2337,7 +2340,7 @@ bool cChunk::DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cCom
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cChunk::DoWithMobHeadBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadBlockCallback & a_Callback)
|
bool cChunk::DoWithMobHeadAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadCallback & a_Callback)
|
||||||
{
|
{
|
||||||
// The blockentity list is locked by the parent chunkmap's CS
|
// The blockentity list is locked by the parent chunkmap's CS
|
||||||
for (cBlockEntityList::iterator itr = m_BlockEntities.begin(), itr2 = itr; itr != m_BlockEntities.end(); itr = itr2)
|
for (cBlockEntityList::iterator itr = m_BlockEntities.begin(), itr2 = itr; itr != m_BlockEntities.end(); itr = itr2)
|
||||||
@ -2369,6 +2372,38 @@ bool cChunk::DoWithMobHeadBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMob
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cChunk::DoWithFlowerPotAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFlowerPotCallback & a_Callback)
|
||||||
|
{
|
||||||
|
// The blockentity list is locked by the parent chunkmap's CS
|
||||||
|
for (cBlockEntityList::iterator itr = m_BlockEntities.begin(), itr2 = itr; itr != m_BlockEntities.end(); itr = itr2)
|
||||||
|
{
|
||||||
|
++itr2;
|
||||||
|
if (((*itr)->GetPosX() != a_BlockX) || ((*itr)->GetPosY() != a_BlockY) || ((*itr)->GetPosZ() != a_BlockZ))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ((*itr)->GetBlockType() != E_BLOCK_FLOWER_POT)
|
||||||
|
{
|
||||||
|
// There is a block entity here, but of different type. No other block entity can be here, so we can safely bail out
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The correct block entity is here,
|
||||||
|
if (a_Callback.Item((cFlowerPotEntity *)*itr))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} // for itr - m_BlockEntitites[]
|
||||||
|
|
||||||
|
// Not found:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cChunk::GetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4)
|
bool cChunk::GetSignLines(int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4)
|
||||||
{
|
{
|
||||||
// The blockentity list is locked by the parent chunkmap's CS
|
// The blockentity list is locked by the parent chunkmap's CS
|
||||||
|
11
src/Chunk.h
11
src/Chunk.h
@ -32,6 +32,7 @@ class cDispenserEntity;
|
|||||||
class cFurnaceEntity;
|
class cFurnaceEntity;
|
||||||
class cNoteEntity;
|
class cNoteEntity;
|
||||||
class cMobHeadEntity;
|
class cMobHeadEntity;
|
||||||
|
class cFlowerPotEntity;
|
||||||
class cBlockArea;
|
class cBlockArea;
|
||||||
class cPawn;
|
class cPawn;
|
||||||
class cPickup;
|
class cPickup;
|
||||||
@ -48,7 +49,8 @@ typedef cItemCallback<cDispenserEntity> cDispenserCallback;
|
|||||||
typedef cItemCallback<cFurnaceEntity> cFurnaceCallback;
|
typedef cItemCallback<cFurnaceEntity> cFurnaceCallback;
|
||||||
typedef cItemCallback<cNoteEntity> cNoteBlockCallback;
|
typedef cItemCallback<cNoteEntity> cNoteBlockCallback;
|
||||||
typedef cItemCallback<cCommandBlockEntity> cCommandBlockCallback;
|
typedef cItemCallback<cCommandBlockEntity> cCommandBlockCallback;
|
||||||
typedef cItemCallback<cMobHeadEntity> cMobHeadBlockCallback;
|
typedef cItemCallback<cMobHeadEntity> cMobHeadCallback;
|
||||||
|
typedef cItemCallback<cFlowerPotEntity> cFlowerPotCallback;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -253,8 +255,11 @@ public:
|
|||||||
/** Calls the callback for the command block at the specified coords; returns false if there's no command block at those coords or callback returns true, returns true if found */
|
/** Calls the callback for the command block at the specified coords; returns false if there's no command block at those coords or callback returns true, returns true if found */
|
||||||
bool DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cCommandBlockCallback & a_Callback);
|
bool DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cCommandBlockCallback & a_Callback);
|
||||||
|
|
||||||
/** Calls the callback for the mob head block at the specified coords; returns false if there's no mob header block at those coords or callback returns true, returns true if found */
|
/** Calls the callback for the mob head block at the specified coords; returns false if there's no mob head block at those coords or callback returns true, returns true if found */
|
||||||
bool DoWithMobHeadBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadBlockCallback & a_Callback);
|
bool DoWithMobHeadAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadCallback & a_Callback);
|
||||||
|
|
||||||
|
/** Calls the callback for the flower pot at the specified coords; returns false if there's no flower pot at those coords or callback returns true, returns true if found */
|
||||||
|
bool DoWithFlowerPotAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFlowerPotCallback & a_Callback);
|
||||||
|
|
||||||
/** Retrieves the test on the sign at the specified coords; returns false if there's no sign at those coords, true if found */
|
/** Retrieves the test on the sign at the specified coords; returns false if there's no sign at those coords, true if found */
|
||||||
bool GetSignLines (int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4); // Lua-accessible
|
bool GetSignLines (int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4); // Lua-accessible
|
||||||
|
@ -2182,7 +2182,7 @@ bool cChunkMap::DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, c
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cChunkMap::DoWithMobHeadBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadBlockCallback & a_Callback)
|
bool cChunkMap::DoWithMobHeadAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadCallback & a_Callback)
|
||||||
{
|
{
|
||||||
int ChunkX, ChunkZ;
|
int ChunkX, ChunkZ;
|
||||||
int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ;
|
int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ;
|
||||||
@ -2193,7 +2193,25 @@ bool cChunkMap::DoWithMobHeadBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, c
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return Chunk->DoWithMobHeadBlockAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
|
return Chunk->DoWithMobHeadAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cChunkMap::DoWithFlowerPotAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFlowerPotCallback & a_Callback)
|
||||||
|
{
|
||||||
|
int ChunkX, ChunkZ;
|
||||||
|
int BlockX = a_BlockX, BlockY = a_BlockY, BlockZ = a_BlockZ;
|
||||||
|
cChunkDef::AbsoluteToRelative(BlockX, BlockY, BlockZ, ChunkX, ChunkZ);
|
||||||
|
cCSLock Lock(m_CSLayers);
|
||||||
|
cChunkPtr Chunk = GetChunkNoGen(ChunkX, ZERO_CHUNK_Y, ChunkZ);
|
||||||
|
if ((Chunk == NULL) && !Chunk->IsValid())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return Chunk->DoWithFlowerPotAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ class cFurnaceEntity;
|
|||||||
class cNoteEntity;
|
class cNoteEntity;
|
||||||
class cCommandBlockEntity;
|
class cCommandBlockEntity;
|
||||||
class cMobHeadEntity;
|
class cMobHeadEntity;
|
||||||
|
class cFlowerPotEntity;
|
||||||
class cPawn;
|
class cPawn;
|
||||||
class cPickup;
|
class cPickup;
|
||||||
class cChunkDataSerializer;
|
class cChunkDataSerializer;
|
||||||
@ -41,10 +42,11 @@ typedef cItemCallback<cChestEntity> cChestCallback;
|
|||||||
typedef cItemCallback<cDispenserEntity> cDispenserCallback;
|
typedef cItemCallback<cDispenserEntity> cDispenserCallback;
|
||||||
typedef cItemCallback<cDropperEntity> cDropperCallback;
|
typedef cItemCallback<cDropperEntity> cDropperCallback;
|
||||||
typedef cItemCallback<cDropSpenserEntity> cDropSpenserCallback;
|
typedef cItemCallback<cDropSpenserEntity> cDropSpenserCallback;
|
||||||
|
typedef cItemCallback<cFlowerPotEntity> cFlowerPotCallback;
|
||||||
typedef cItemCallback<cFurnaceEntity> cFurnaceCallback;
|
typedef cItemCallback<cFurnaceEntity> cFurnaceCallback;
|
||||||
typedef cItemCallback<cNoteEntity> cNoteBlockCallback;
|
typedef cItemCallback<cNoteEntity> cNoteBlockCallback;
|
||||||
typedef cItemCallback<cCommandBlockEntity> cCommandBlockCallback;
|
typedef cItemCallback<cCommandBlockEntity> cCommandBlockCallback;
|
||||||
typedef cItemCallback<cMobHeadEntity> cMobHeadBlockCallback;
|
typedef cItemCallback<cMobHeadEntity> cMobHeadCallback;
|
||||||
typedef cItemCallback<cChunk> cChunkCallback;
|
typedef cItemCallback<cChunk> cChunkCallback;
|
||||||
|
|
||||||
|
|
||||||
@ -257,7 +259,10 @@ public:
|
|||||||
bool DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cCommandBlockCallback & a_Callback); // Lua-accessible
|
bool DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cCommandBlockCallback & a_Callback); // Lua-accessible
|
||||||
|
|
||||||
/** Calls the callback for the mob head block at the specified coords; returns false if there's no mob head block at those coords or callback returns true, returns true if found */
|
/** Calls the callback for the mob head block at the specified coords; returns false if there's no mob head block at those coords or callback returns true, returns true if found */
|
||||||
bool DoWithMobHeadBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadBlockCallback & a_Callback); // Lua-accessible
|
bool DoWithMobHeadAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadCallback & a_Callback); // Lua-accessible
|
||||||
|
|
||||||
|
/** Calls the callback for the flower pot at the specified coords; returns false if there's no flower pot at those coords or callback returns true, returns true if found */
|
||||||
|
bool DoWithFlowerPotAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFlowerPotCallback & a_Callback); // Lua-accessible
|
||||||
|
|
||||||
/** Retrieves the test on the sign at the specified coords; returns false if there's no sign at those coords, true if found */
|
/** Retrieves the test on the sign at the specified coords; returns false if there's no sign at those coords, true if found */
|
||||||
bool GetSignLines (int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4); // Lua-accessible
|
bool GetSignLines (int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4); // Lua-accessible
|
||||||
|
@ -29,6 +29,7 @@ Implements the 1.7.x protocol classes:
|
|||||||
#include "../UI/Window.h"
|
#include "../UI/Window.h"
|
||||||
#include "../BlockEntities/CommandBlockEntity.h"
|
#include "../BlockEntities/CommandBlockEntity.h"
|
||||||
#include "../BlockEntities/MobHeadEntity.h"
|
#include "../BlockEntities/MobHeadEntity.h"
|
||||||
|
#include "../BlockEntities/FlowerPotEntity.h"
|
||||||
#include "../CompositeChat.h"
|
#include "../CompositeChat.h"
|
||||||
|
|
||||||
|
|
||||||
@ -1115,6 +1116,7 @@ void cProtocol172::SendUpdateBlockEntity(cBlockEntity & a_BlockEntity)
|
|||||||
case E_BLOCK_MOB_SPAWNER: Action = 1; break; // Update mob spawner spinny mob thing
|
case E_BLOCK_MOB_SPAWNER: Action = 1; break; // Update mob spawner spinny mob thing
|
||||||
case E_BLOCK_COMMAND_BLOCK: Action = 2; break; // Update command block text
|
case E_BLOCK_COMMAND_BLOCK: Action = 2; break; // Update command block text
|
||||||
case E_BLOCK_HEAD: Action = 4; break; // Update Mobhead entity
|
case E_BLOCK_HEAD: Action = 4; break; // Update Mobhead entity
|
||||||
|
case E_BLOCK_FLOWER_POT: Action = 5; break; // Update flower pot
|
||||||
default: ASSERT(!"Unhandled or unimplemented BlockEntity update request!"); break;
|
default: ASSERT(!"Unhandled or unimplemented BlockEntity update request!"); break;
|
||||||
}
|
}
|
||||||
Pkt.WriteByte(Action);
|
Pkt.WriteByte(Action);
|
||||||
@ -2355,6 +2357,18 @@ void cProtocol172::cPacketizer::WriteBlockEntity(const cBlockEntity & a_BlockEnt
|
|||||||
Writer.AddString("id", "Skull"); // "Tile Entity ID" - MC wiki; vanilla server always seems to send this though
|
Writer.AddString("id", "Skull"); // "Tile Entity ID" - MC wiki; vanilla server always seems to send this though
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case E_BLOCK_FLOWER_POT:
|
||||||
|
{
|
||||||
|
cFlowerPotEntity & FlowerPotEntity = (cFlowerPotEntity &)a_BlockEntity;
|
||||||
|
|
||||||
|
Writer.AddInt("x", FlowerPotEntity.GetPosX());
|
||||||
|
Writer.AddInt("y", FlowerPotEntity.GetPosY());
|
||||||
|
Writer.AddInt("z", FlowerPotEntity.GetPosZ());
|
||||||
|
Writer.AddInt("Item", (Int32) FlowerPotEntity.GetItem().m_ItemType);
|
||||||
|
Writer.AddInt("Data", (Int32) FlowerPotEntity.GetItem().m_ItemDamage);
|
||||||
|
Writer.AddString("id", "FlowerPot"); // "Tile Entity ID" - MC wiki; vanilla server always seems to send this though
|
||||||
|
break;
|
||||||
|
}
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1198,9 +1198,18 @@ bool cWorld::DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cCom
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cWorld::DoWithMobHeadBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadBlockCallback & a_Callback)
|
bool cWorld::DoWithMobHeadAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadCallback & a_Callback)
|
||||||
{
|
{
|
||||||
return m_ChunkMap->DoWithMobHeadBlockAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
|
return m_ChunkMap->DoWithMobHeadAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cWorld::DoWithFlowerPotAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFlowerPotCallback & a_Callback)
|
||||||
|
{
|
||||||
|
return m_ChunkMap->DoWithFlowerPotAt(a_BlockX, a_BlockY, a_BlockZ, a_Callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ class cWorldGenerator; // The generator that actually generates the chunks for
|
|||||||
class cChunkGenerator; // The thread responsible for generating chunks
|
class cChunkGenerator; // The thread responsible for generating chunks
|
||||||
class cChestEntity;
|
class cChestEntity;
|
||||||
class cDispenserEntity;
|
class cDispenserEntity;
|
||||||
|
class cFlowerPotEntity;
|
||||||
class cFurnaceEntity;
|
class cFurnaceEntity;
|
||||||
class cNoteEntity;
|
class cNoteEntity;
|
||||||
class cMobHeadEntity;
|
class cMobHeadEntity;
|
||||||
@ -60,7 +61,8 @@ typedef cItemCallback<cDispenserEntity> cDispenserCallback;
|
|||||||
typedef cItemCallback<cFurnaceEntity> cFurnaceCallback;
|
typedef cItemCallback<cFurnaceEntity> cFurnaceCallback;
|
||||||
typedef cItemCallback<cNoteEntity> cNoteBlockCallback;
|
typedef cItemCallback<cNoteEntity> cNoteBlockCallback;
|
||||||
typedef cItemCallback<cCommandBlockEntity> cCommandBlockCallback;
|
typedef cItemCallback<cCommandBlockEntity> cCommandBlockCallback;
|
||||||
typedef cItemCallback<cMobHeadEntity> cMobHeadBlockCallback;
|
typedef cItemCallback<cMobHeadEntity> cMobHeadCallback;
|
||||||
|
typedef cItemCallback<cFlowerPotEntity> cFlowerPotCallback;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -533,7 +535,10 @@ public:
|
|||||||
bool DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cCommandBlockCallback & a_Callback); // Exported in ManualBindings.cpp
|
bool DoWithCommandBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cCommandBlockCallback & a_Callback); // Exported in ManualBindings.cpp
|
||||||
|
|
||||||
/** Calls the callback for the mob head block at the specified coords; returns false if there's no mob head block at those coords or callback returns true, returns true if found */
|
/** Calls the callback for the mob head block at the specified coords; returns false if there's no mob head block at those coords or callback returns true, returns true if found */
|
||||||
bool DoWithMobHeadBlockAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadBlockCallback & a_Callback); // Exported in ManualBindings.cpp
|
bool DoWithMobHeadAt(int a_BlockX, int a_BlockY, int a_BlockZ, cMobHeadCallback & a_Callback); // Exported in ManualBindings.cpp
|
||||||
|
|
||||||
|
/** Calls the callback for the flower pot at the specified coords; returns false if there's no flower pot at those coords or callback returns true, returns true if found */
|
||||||
|
bool DoWithFlowerPotAt(int a_BlockX, int a_BlockY, int a_BlockZ, cFlowerPotCallback & a_Callback); // Exported in ManualBindings.cpp
|
||||||
|
|
||||||
/** Retrieves the test on the sign at the specified coords; returns false if there's no sign at those coords, true if found */
|
/** Retrieves the test on the sign at the specified coords; returns false if there's no sign at those coords, true if found */
|
||||||
bool GetSignLines (int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4); // Exported in ManualBindings.cpp
|
bool GetSignLines (int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4); // Exported in ManualBindings.cpp
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "../BlockEntities/NoteEntity.h"
|
#include "../BlockEntities/NoteEntity.h"
|
||||||
#include "../BlockEntities/SignEntity.h"
|
#include "../BlockEntities/SignEntity.h"
|
||||||
#include "../BlockEntities/MobHeadEntity.h"
|
#include "../BlockEntities/MobHeadEntity.h"
|
||||||
|
#include "../BlockEntities/FlowerPotEntity.h"
|
||||||
|
|
||||||
#include "../Entities/Entity.h"
|
#include "../Entities/Entity.h"
|
||||||
#include "../Entities/FallingBlock.h"
|
#include "../Entities/FallingBlock.h"
|
||||||
@ -275,6 +276,19 @@ void cNBTChunkSerializer::AddMobHeadEntity(cMobHeadEntity * a_MobHead)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cNBTChunkSerializer::AddFlowerPotEntity(cFlowerPotEntity * a_FlowerPot)
|
||||||
|
{
|
||||||
|
m_Writer.BeginCompound("");
|
||||||
|
AddBasicTileEntity(a_FlowerPot, "FlowerPot");
|
||||||
|
m_Writer.AddInt ("Item", (Int32) a_FlowerPot->GetItem().m_ItemType);
|
||||||
|
m_Writer.AddInt ("Data", (Int32) a_FlowerPot->GetItem().m_ItemDamage);
|
||||||
|
m_Writer.EndCompound();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cNBTChunkSerializer::AddBasicEntity(cEntity * a_Entity, const AString & a_ClassName)
|
void cNBTChunkSerializer::AddBasicEntity(cEntity * a_Entity, const AString & a_ClassName)
|
||||||
{
|
{
|
||||||
m_Writer.AddString("id", a_ClassName);
|
m_Writer.AddString("id", a_ClassName);
|
||||||
@ -687,6 +701,7 @@ void cNBTChunkSerializer::BlockEntity(cBlockEntity * a_Entity)
|
|||||||
case E_BLOCK_CHEST: AddChestEntity ((cChestEntity *) a_Entity); break;
|
case E_BLOCK_CHEST: AddChestEntity ((cChestEntity *) a_Entity); break;
|
||||||
case E_BLOCK_DISPENSER: AddDispenserEntity ((cDispenserEntity *) a_Entity); break;
|
case E_BLOCK_DISPENSER: AddDispenserEntity ((cDispenserEntity *) a_Entity); break;
|
||||||
case E_BLOCK_DROPPER: AddDropperEntity ((cDropperEntity *) a_Entity); break;
|
case E_BLOCK_DROPPER: AddDropperEntity ((cDropperEntity *) a_Entity); break;
|
||||||
|
case E_BLOCK_FLOWER_POT: AddFlowerPotEntity ((cFlowerPotEntity *) a_Entity); break;
|
||||||
case E_BLOCK_FURNACE: AddFurnaceEntity ((cFurnaceEntity *) a_Entity); break;
|
case E_BLOCK_FURNACE: AddFurnaceEntity ((cFurnaceEntity *) a_Entity); break;
|
||||||
case E_BLOCK_HOPPER: AddHopperEntity ((cHopperEntity *) a_Entity); break;
|
case E_BLOCK_HOPPER: AddHopperEntity ((cHopperEntity *) a_Entity); break;
|
||||||
case E_BLOCK_SIGN_POST:
|
case E_BLOCK_SIGN_POST:
|
||||||
|
@ -30,6 +30,7 @@ class cJukeboxEntity;
|
|||||||
class cNoteEntity;
|
class cNoteEntity;
|
||||||
class cSignEntity;
|
class cSignEntity;
|
||||||
class cMobHeadEntity;
|
class cMobHeadEntity;
|
||||||
|
class cFlowerPotEntity;
|
||||||
class cFallingBlock;
|
class cFallingBlock;
|
||||||
class cMinecart;
|
class cMinecart;
|
||||||
class cMinecartWithChest;
|
class cMinecartWithChest;
|
||||||
@ -96,6 +97,7 @@ protected:
|
|||||||
void AddSignEntity (cSignEntity * a_Sign);
|
void AddSignEntity (cSignEntity * a_Sign);
|
||||||
void AddMobHeadEntity (cMobHeadEntity * a_MobHead);
|
void AddMobHeadEntity (cMobHeadEntity * a_MobHead);
|
||||||
void AddCommandBlockEntity(cCommandBlockEntity * a_CmdBlock);
|
void AddCommandBlockEntity(cCommandBlockEntity * a_CmdBlock);
|
||||||
|
void AddFlowerPotEntity(cFlowerPotEntity * a_FlowerPot);
|
||||||
|
|
||||||
// Entities:
|
// Entities:
|
||||||
void AddBasicEntity (cEntity * a_Entity, const AString & a_ClassName);
|
void AddBasicEntity (cEntity * a_Entity, const AString & a_ClassName);
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include "../BlockEntities/NoteEntity.h"
|
#include "../BlockEntities/NoteEntity.h"
|
||||||
#include "../BlockEntities/SignEntity.h"
|
#include "../BlockEntities/SignEntity.h"
|
||||||
#include "../BlockEntities/MobHeadEntity.h"
|
#include "../BlockEntities/MobHeadEntity.h"
|
||||||
|
#include "../BlockEntities/FlowerPotEntity.h"
|
||||||
|
|
||||||
|
|
||||||
#include "../Mobs/Monster.h"
|
#include "../Mobs/Monster.h"
|
||||||
@ -578,6 +579,10 @@ void cWSSAnvil::LoadBlockEntitiesFromNBT(cBlockEntityList & a_BlockEntities, con
|
|||||||
{
|
{
|
||||||
LoadDropperFromNBT(a_BlockEntities, a_NBT, Child);
|
LoadDropperFromNBT(a_BlockEntities, a_NBT, Child);
|
||||||
}
|
}
|
||||||
|
else if (strncmp(a_NBT.GetData(sID), "FlowerPot", a_NBT.GetDataLength(sID)) == 0)
|
||||||
|
{
|
||||||
|
LoadFlowerPotFromNBT(a_BlockEntities, a_NBT, Child);
|
||||||
|
}
|
||||||
else if (strncmp(a_NBT.GetData(sID), "Furnace", a_NBT.GetDataLength(sID)) == 0)
|
else if (strncmp(a_NBT.GetData(sID), "Furnace", a_NBT.GetDataLength(sID)) == 0)
|
||||||
{
|
{
|
||||||
LoadFurnaceFromNBT(a_BlockEntities, a_NBT, Child, a_BlockTypes, a_BlockMetas);
|
LoadFurnaceFromNBT(a_BlockEntities, a_NBT, Child, a_BlockTypes, a_BlockMetas);
|
||||||
@ -760,6 +765,37 @@ void cWSSAnvil::LoadDropperFromNBT(cBlockEntityList & a_BlockEntities, const cPa
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cWSSAnvil::LoadFlowerPotFromNBT(cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx)
|
||||||
|
{
|
||||||
|
ASSERT(a_NBT.GetType(a_TagIdx) == TAG_Compound);
|
||||||
|
int x, y, z;
|
||||||
|
if (!GetBlockEntityNBTPos(a_NBT, a_TagIdx, x, y, z))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::auto_ptr<cFlowerPotEntity> FlowerPot(new cFlowerPotEntity(x, y, z, m_World));
|
||||||
|
short ItemType = 0, ItemData = 0;
|
||||||
|
|
||||||
|
int currentLine = a_NBT.FindChildByName(a_TagIdx, "Item");
|
||||||
|
if (currentLine >= 0)
|
||||||
|
{
|
||||||
|
ItemType = (short) a_NBT.GetInt(currentLine);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentLine = a_NBT.FindChildByName(a_TagIdx, "Data");
|
||||||
|
if (currentLine >= 0)
|
||||||
|
{
|
||||||
|
ItemData = (short) a_NBT.GetInt(currentLine);
|
||||||
|
}
|
||||||
|
|
||||||
|
FlowerPot->SetItem(cItem(ItemType, 1, ItemData));
|
||||||
|
a_BlockEntities.push_back(FlowerPot.release());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cWSSAnvil::LoadFurnaceFromNBT(cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE * a_BlockTypes, NIBBLETYPE * a_BlockMetas)
|
void cWSSAnvil::LoadFurnaceFromNBT(cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE * a_BlockTypes, NIBBLETYPE * a_BlockMetas)
|
||||||
{
|
{
|
||||||
ASSERT(a_NBT.GetType(a_TagIdx) == TAG_Compound);
|
ASSERT(a_NBT.GetType(a_TagIdx) == TAG_Compound);
|
||||||
|
@ -135,6 +135,7 @@ protected:
|
|||||||
void LoadChestFromNBT (cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx);
|
void LoadChestFromNBT (cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
void LoadDispenserFromNBT (cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx);
|
void LoadDispenserFromNBT (cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
void LoadDropperFromNBT (cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx);
|
void LoadDropperFromNBT (cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
|
void LoadFlowerPotFromNBT (cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
void LoadFurnaceFromNBT (cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE * a_BlockTypes, NIBBLETYPE * a_BlockMetas);
|
void LoadFurnaceFromNBT (cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx, BLOCKTYPE * a_BlockTypes, NIBBLETYPE * a_BlockMetas);
|
||||||
void LoadHopperFromNBT (cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx);
|
void LoadHopperFromNBT (cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
void LoadJukeboxFromNBT (cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx);
|
void LoadJukeboxFromNBT (cBlockEntityList & a_BlockEntities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
|
@ -12,8 +12,10 @@
|
|||||||
#include "../BlockEntities/ChestEntity.h"
|
#include "../BlockEntities/ChestEntity.h"
|
||||||
#include "../BlockEntities/CommandBlockEntity.h"
|
#include "../BlockEntities/CommandBlockEntity.h"
|
||||||
#include "../BlockEntities/DispenserEntity.h"
|
#include "../BlockEntities/DispenserEntity.h"
|
||||||
|
#include "../BlockEntities/FlowerPotEntity.h"
|
||||||
#include "../BlockEntities/FurnaceEntity.h"
|
#include "../BlockEntities/FurnaceEntity.h"
|
||||||
#include "../BlockEntities/JukeboxEntity.h"
|
#include "../BlockEntities/JukeboxEntity.h"
|
||||||
|
#include "../BlockEntities/MobHeadEntity.h"
|
||||||
#include "../BlockEntities/NoteEntity.h"
|
#include "../BlockEntities/NoteEntity.h"
|
||||||
#include "../BlockEntities/SignEntity.h"
|
#include "../BlockEntities/SignEntity.h"
|
||||||
|
|
||||||
@ -75,12 +77,14 @@ void cJsonChunkSerializer::BlockEntity(cBlockEntity * a_BlockEntity)
|
|||||||
case E_BLOCK_CHEST: SaveInto = "Chests"; break;
|
case E_BLOCK_CHEST: SaveInto = "Chests"; break;
|
||||||
case E_BLOCK_DISPENSER: SaveInto = "Dispensers"; break;
|
case E_BLOCK_DISPENSER: SaveInto = "Dispensers"; break;
|
||||||
case E_BLOCK_DROPPER: SaveInto = "Droppers"; break;
|
case E_BLOCK_DROPPER: SaveInto = "Droppers"; break;
|
||||||
|
case E_BLOCK_FLOWER_POT: SaveInto = "FlowerPots"; break;
|
||||||
case E_BLOCK_FURNACE: SaveInto = "Furnaces"; break;
|
case E_BLOCK_FURNACE: SaveInto = "Furnaces"; break;
|
||||||
case E_BLOCK_SIGN_POST: SaveInto = "Signs"; break;
|
case E_BLOCK_SIGN_POST: SaveInto = "Signs"; break;
|
||||||
case E_BLOCK_WALLSIGN: SaveInto = "Signs"; break;
|
case E_BLOCK_WALLSIGN: SaveInto = "Signs"; break;
|
||||||
case E_BLOCK_NOTE_BLOCK: SaveInto = "Notes"; break;
|
case E_BLOCK_NOTE_BLOCK: SaveInto = "Notes"; break;
|
||||||
case E_BLOCK_JUKEBOX: SaveInto = "Jukeboxes"; break;
|
case E_BLOCK_JUKEBOX: SaveInto = "Jukeboxes"; break;
|
||||||
case E_BLOCK_COMMAND_BLOCK: SaveInto = "CommandBlocks"; break;
|
case E_BLOCK_COMMAND_BLOCK: SaveInto = "CommandBlocks"; break;
|
||||||
|
case E_BLOCK_HEAD: SaveInto = "MobHeads"; break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
@ -298,6 +302,21 @@ void cWSSCompact::LoadEntitiesFromJson(Json::Value & a_Value, cEntityList & a_En
|
|||||||
}
|
}
|
||||||
} // for itr - AllDispensers[]
|
} // for itr - AllDispensers[]
|
||||||
|
|
||||||
|
// Load Flowerpots:
|
||||||
|
Json::Value AllFlowerPots = a_Value.get("FlowerPots", Json::nullValue);
|
||||||
|
for (Json::Value::iterator itr = AllFlowerPots.begin(); itr != AllFlowerPots.end(); ++itr)
|
||||||
|
{
|
||||||
|
std::auto_ptr<cFlowerPotEntity> FlowerPotEntity(new cFlowerPotEntity(0, 0, 0, a_World));
|
||||||
|
if (!FlowerPotEntity->LoadFromJson(*itr))
|
||||||
|
{
|
||||||
|
LOGWARNING("ERROR READING FLOWERPOT FROM JSON!" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
a_BlockEntities.push_back(FlowerPotEntity.release());
|
||||||
|
}
|
||||||
|
} // for itr - AllFlowerPots[]
|
||||||
|
|
||||||
// Load furnaces:
|
// Load furnaces:
|
||||||
Json::Value AllFurnaces = a_Value.get("Furnaces", Json::nullValue);
|
Json::Value AllFurnaces = a_Value.get("Furnaces", Json::nullValue);
|
||||||
for (Json::Value::iterator itr = AllFurnaces.begin(); itr != AllFurnaces.end(); ++itr)
|
for (Json::Value::iterator itr = AllFurnaces.begin(); itr != AllFurnaces.end(); ++itr)
|
||||||
@ -373,6 +392,21 @@ void cWSSCompact::LoadEntitiesFromJson(Json::Value & a_Value, cEntityList & a_En
|
|||||||
a_BlockEntities.push_back(CommandBlockEntity.release());
|
a_BlockEntities.push_back(CommandBlockEntity.release());
|
||||||
}
|
}
|
||||||
} // for itr - AllCommandBlocks[]
|
} // for itr - AllCommandBlocks[]
|
||||||
|
|
||||||
|
// Load mob heads:
|
||||||
|
Json::Value AllMobHeads = a_Value.get("MobHeads", Json::nullValue);
|
||||||
|
for (Json::Value::iterator itr = AllMobHeads.begin(); itr != AllMobHeads.end(); ++itr)
|
||||||
|
{
|
||||||
|
std::auto_ptr<cMobHeadEntity> MobHeadEntity(new cMobHeadEntity(0, 0, 0, a_World));
|
||||||
|
if (!MobHeadEntity->LoadFromJson(*itr))
|
||||||
|
{
|
||||||
|
LOGWARNING("ERROR READING MOB HEAD FROM JSON!" );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
a_BlockEntities.push_back(MobHeadEntity.release());
|
||||||
|
}
|
||||||
|
} // for itr - AllMobHeads[]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user