summaryrefslogtreecommitdiffstats
path: root/source/BlockEntities
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--source/BlockEntities/ChestEntity.cpp172
-rw-r--r--source/BlockEntities/FurnaceEntity.cpp479
-rw-r--r--source/BlockEntities/JukeboxEntity.cpp125
-rw-r--r--source/BlockEntities/NoteEntity.cpp154
-rw-r--r--source/BlockEntities/SignEntity.cpp115
-rw-r--r--src/BlockEntities/BlockEntity.cpp (renamed from source/BlockEntities/BlockEntity.cpp)0
-rw-r--r--src/BlockEntities/BlockEntity.h (renamed from source/BlockEntities/BlockEntity.h)0
-rw-r--r--src/BlockEntities/BlockEntityWithItems.h (renamed from source/BlockEntities/BlockEntityWithItems.h)0
-rw-r--r--src/BlockEntities/ChestEntity.h (renamed from source/BlockEntities/ChestEntity.h)0
-rw-r--r--src/BlockEntities/DispenserEntity.cpp (renamed from source/BlockEntities/DispenserEntity.cpp)0
-rw-r--r--src/BlockEntities/DispenserEntity.h (renamed from source/BlockEntities/DispenserEntity.h)0
-rw-r--r--src/BlockEntities/DropSpenserEntity.cpp (renamed from source/BlockEntities/DropSpenserEntity.cpp)0
-rw-r--r--src/BlockEntities/DropSpenserEntity.h (renamed from source/BlockEntities/DropSpenserEntity.h)0
-rw-r--r--src/BlockEntities/DropperEntity.cpp (renamed from source/BlockEntities/DropperEntity.cpp)0
-rw-r--r--src/BlockEntities/DropperEntity.h (renamed from source/BlockEntities/DropperEntity.h)0
-rw-r--r--src/BlockEntities/FurnaceEntity.h (renamed from source/BlockEntities/FurnaceEntity.h)0
-rw-r--r--src/BlockEntities/HopperEntity.cpp (renamed from source/BlockEntities/HopperEntity.cpp)0
-rw-r--r--src/BlockEntities/HopperEntity.h (renamed from source/BlockEntities/HopperEntity.h)0
-rw-r--r--src/BlockEntities/JukeboxEntity.h (renamed from source/BlockEntities/JukeboxEntity.h)0
-rw-r--r--src/BlockEntities/NoteEntity.h (renamed from source/BlockEntities/NoteEntity.h)0
-rw-r--r--src/BlockEntities/SignEntity.h (renamed from source/BlockEntities/SignEntity.h)0
21 files changed, 0 insertions, 1045 deletions
diff --git a/source/BlockEntities/ChestEntity.cpp b/source/BlockEntities/ChestEntity.cpp
deleted file mode 100644
index ca2626bc9..000000000
--- a/source/BlockEntities/ChestEntity.cpp
+++ /dev/null
@@ -1,172 +0,0 @@
-
-#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
-
-#include "ChestEntity.h"
-#include "../Item.h"
-#include "../Entities/Player.h"
-#include "../UI/Window.h"
-#include <json/json.h>
-
-
-
-
-
-cChestEntity::cChestEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World) :
- super(E_BLOCK_CHEST, a_BlockX, a_BlockY, a_BlockZ, ContentsWidth, ContentsHeight, a_World)
-{
- cBlockEntityWindowOwner::SetBlockEntity(this);
-}
-
-
-
-
-
-cChestEntity::~cChestEntity()
-{
- cWindow * Window = GetWindow();
- if (Window != NULL)
- {
- Window->OwnerDestroyed();
- }
-}
-
-
-
-
-
-bool cChestEntity::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();
-
- Json::Value AllSlots = a_Value.get("Slots", 0);
- int SlotIdx = 0;
- for (Json::Value::iterator itr = AllSlots.begin(); itr != AllSlots.end(); ++itr)
- {
- cItem Item;
- Item.FromJson(*itr);
- SetSlot(SlotIdx, Item);
- SlotIdx++;
- }
- return true;
-}
-
-
-
-
-
-void cChestEntity::SaveToJson(Json::Value & a_Value)
-{
- a_Value["x"] = m_PosX;
- a_Value["y"] = m_PosY;
- a_Value["z"] = m_PosZ;
-
- Json::Value AllSlots;
- for (int i = m_Contents.GetNumSlots() - 1; i >= 0; i--)
- {
- Json::Value Slot;
- m_Contents.GetSlot(i).GetJson(Slot);
- AllSlots.append(Slot);
- }
- a_Value["Slots"] = AllSlots;
-}
-
-
-
-
-
-void cChestEntity::SendTo(cClientHandle & a_Client)
-{
- // The chest entity doesn't need anything sent to the client when it's created / gets in the viewdistance
- // All the actual handling is in the cWindow UI code that gets called when the chest is rclked
-
- UNUSED(a_Client);
-}
-
-
-
-
-
-void cChestEntity::UsedBy(cPlayer * a_Player)
-{
- // If the window is not created, open it anew:
- cWindow * Window = GetWindow();
- if (Window == NULL)
- {
- OpenNewWindow();
- Window = GetWindow();
- }
-
- // Open the window for the player:
- if (Window != NULL)
- {
- if (a_Player->GetWindow() != Window)
- {
- a_Player->OpenWindow(Window);
- }
- }
-
- // This is rather a hack
- // Instead of marking the chunk as dirty upon chest contents change, we mark it dirty now
- // We cannot properly detect contents change, but such a change doesn't happen without a player opening the chest first.
- // The few false positives aren't much to worry about
- int ChunkX, ChunkZ;
- cChunkDef::BlockToChunk(m_PosX, m_PosZ, ChunkX, ChunkZ);
- m_World->MarkChunkDirty(ChunkX, ChunkZ);
-}
-
-
-
-
-
-void cChestEntity::OpenNewWindow(void)
-{
- // Callback for opening together with neighbor chest:
- class cOpenDouble :
- public cChestCallback
- {
- cChestEntity * m_ThisChest;
- public:
- cOpenDouble(cChestEntity * a_ThisChest) :
- m_ThisChest(a_ThisChest)
- {
- }
-
- virtual bool Item(cChestEntity * a_Chest) override
- {
- // The primary chest should eb the one with lesser X or Z coord:
- cChestEntity * Primary = a_Chest;
- cChestEntity * Secondary = m_ThisChest;
- if (
- (Primary->GetPosX() > Secondary->GetPosX()) ||
- (Primary->GetPosZ() > Secondary->GetPosZ())
- )
- {
- std::swap(Primary, Secondary);
- }
- m_ThisChest->OpenWindow(new cChestWindow(Primary, Secondary));
- return false;
- }
- } ;
-
- // Scan neighbors for adjacent chests:
- cOpenDouble OpenDbl(this);
- if (
- m_World->DoWithChestAt(m_PosX - 1, m_PosY, m_PosZ, OpenDbl) ||
- m_World->DoWithChestAt(m_PosX + 1, m_PosY, m_PosZ, OpenDbl) ||
- m_World->DoWithChestAt(m_PosX , m_PosY, m_PosZ - 1, OpenDbl) ||
- m_World->DoWithChestAt(m_PosX , m_PosY, m_PosZ + 1, OpenDbl)
- )
- {
- // The double-chest window has been opened in the callback
- return;
- }
-
- // There is no chest neighbor, open a single-chest window:
- OpenWindow(new cChestWindow(this));
-}
-
-
-
-
diff --git a/source/BlockEntities/FurnaceEntity.cpp b/source/BlockEntities/FurnaceEntity.cpp
deleted file mode 100644
index ec5ebe8b9..000000000
--- a/source/BlockEntities/FurnaceEntity.cpp
+++ /dev/null
@@ -1,479 +0,0 @@
-
-#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
-
-#include "FurnaceEntity.h"
-#include "../UI/Window.h"
-#include "../Entities/Player.h"
-#include "../Root.h"
-#include "../Chunk.h"
-#include <json/json.h>
-
-
-
-
-
-
-enum
-{
- PROGRESSBAR_SMELTING = 0,
- PROGRESSBAR_FUEL = 1,
-} ;
-
-
-
-
-
-cFurnaceEntity::cFurnaceEntity(int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, cWorld * a_World) :
- super(E_BLOCK_FURNACE, a_BlockX, a_BlockY, a_BlockZ, ContentsWidth, ContentsHeight, a_World),
- m_BlockType(a_BlockType),
- m_BlockMeta(a_BlockMeta),
- m_CurrentRecipe(NULL),
- m_IsCooking((a_World->GetBlock(a_BlockX, a_BlockY, a_BlockZ) == E_BLOCK_LIT_FURNACE)),
- m_NeedCookTime(0),
- m_TimeCooked(0),
- m_FuelBurnTime(0),
- m_TimeBurned(0),
- m_LastProgressFuel(0),
- m_LastProgressCook(0)
-{
- cBlockEntityWindowOwner::SetBlockEntity(this);
- m_Contents.AddListener(*this);
-}
-
-
-
-
-
-cFurnaceEntity::~cFurnaceEntity()
-{
- // Tell window its owner is destroyed
- cWindow * Window = GetWindow();
- if (Window != NULL)
- {
- Window->OwnerDestroyed();
- }
-}
-
-
-
-
-
-void cFurnaceEntity::UsedBy(cPlayer * a_Player)
-{
- if (GetWindow() == NULL)
- {
- OpenWindow(new cFurnaceWindow(m_PosX, m_PosY, m_PosZ, this));
- }
- cWindow * Window = GetWindow();
- if (Window != NULL)
- {
- if (a_Player->GetWindow() != Window)
- {
- a_Player->OpenWindow(Window);
- BroadcastProgress(PROGRESSBAR_FUEL, m_LastProgressFuel);
- BroadcastProgress(PROGRESSBAR_SMELTING, m_LastProgressCook);
- }
- }
-}
-
-
-
-
-
-/// Restarts cooking. Used after the furnace is loaded from storage to set up the internal variables so that cooking continues, if it was active. Returns true if cooking.
-bool cFurnaceEntity::ContinueCooking(void)
-{
- UpdateInput();
- UpdateFuel();
- return m_IsCooking;
-}
-
-
-
-
-
-bool cFurnaceEntity::Tick(float a_Dt, cChunk & a_Chunk)
-{
- if (m_FuelBurnTime <= 0)
- {
- // No fuel is burning, reset progressbars and bail out
- if ((m_LastProgressCook > 0) || (m_LastProgressFuel > 0))
- {
- UpdateProgressBars();
- }
- return false;
- }
-
- if (m_IsCooking)
- {
- m_TimeCooked++;
- if (m_TimeCooked >= m_NeedCookTime)
- {
- // Finished smelting one item
- FinishOne(a_Chunk);
- }
- }
-
- m_TimeBurned++;
- if (m_TimeBurned >= m_FuelBurnTime)
- {
- // The current fuel has been exhausted, use another one, if possible
- BurnNewFuel();
- }
-
- UpdateProgressBars();
-
- return true;
-}
-
-
-
-
-
-bool cFurnaceEntity::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();
-
- Json::Value AllSlots = a_Value.get("Slots", 0);
- int SlotIdx = 0;
- for (Json::Value::iterator itr = AllSlots.begin(); itr != AllSlots.end(); ++itr)
- {
- cItem Item;
- Item.FromJson(*itr);
- SetSlot(SlotIdx, Item);
- SlotIdx++;
- }
-
- m_NeedCookTime = (int)(a_Value.get("CookTime", 0).asDouble() / 50);
- m_TimeCooked = (int)(a_Value.get("TimeCooked", 0).asDouble() / 50);
- m_FuelBurnTime = (int)(a_Value.get("BurnTime", 0).asDouble() / 50);
- m_TimeBurned = (int)(a_Value.get("TimeBurned", 0).asDouble() / 50);
-
- return true;
-}
-
-
-
-
-
-void cFurnaceEntity::SaveToJson( Json::Value& a_Value )
-{
- a_Value["x"] = m_PosX;
- a_Value["y"] = m_PosY;
- a_Value["z"] = m_PosZ;
-
- Json::Value AllSlots;
- int NumSlots = m_Contents.GetNumSlots();
- for (int i = 0; i < NumSlots; i++)
- {
- Json::Value Slot;
- m_Contents.GetSlot(i).GetJson(Slot);
- AllSlots.append(Slot);
- }
- a_Value["Slots"] = AllSlots;
-
- a_Value["CookTime"] = m_NeedCookTime * 50;
- a_Value["TimeCooked"] = m_TimeCooked * 50;
- a_Value["BurnTime"] = m_FuelBurnTime * 50;
- a_Value["TimeBurned"] = m_TimeBurned * 50;
-}
-
-
-
-
-
-void cFurnaceEntity::SendTo(cClientHandle & a_Client)
-{
- // Nothing needs to be sent
- UNUSED(a_Client);
-}
-
-
-
-
-
-void cFurnaceEntity::BroadcastProgress(int a_ProgressbarID, short a_Value)
-{
- cWindow * Window = GetWindow();
- if (Window != NULL)
- {
- Window->BroadcastProgress(a_ProgressbarID, a_Value);
- }
-}
-
-
-
-
-
-/// One item finished cooking
-void cFurnaceEntity::FinishOne(cChunk & a_Chunk)
-{
- m_TimeCooked = 0;
-
- if (m_Contents.GetSlot(fsOutput).IsEmpty())
- {
- m_Contents.SetSlot(fsOutput, *m_CurrentRecipe->Out);
- }
- else
- {
- m_Contents.ChangeSlotCount(fsOutput, m_CurrentRecipe->Out->m_ItemCount);
- }
- m_Contents.ChangeSlotCount(fsInput, -m_CurrentRecipe->In->m_ItemCount);
-
- UpdateIsCooking();
-}
-
-
-
-
-
-void cFurnaceEntity::BurnNewFuel(void)
-{
- cFurnaceRecipe * FR = cRoot::Get()->GetFurnaceRecipe();
- int NewTime = FR->GetBurnTime(m_Contents.GetSlot(fsFuel));
- if (NewTime == 0)
- {
- // The item in the fuel slot is not suitable
- m_FuelBurnTime = 0;
- m_TimeBurned = 0;
- SetIsCooking(false);
- return;
- }
-
- // Is the input and output ready for cooking?
- if (!CanCookInputToOutput())
- {
- return;
- }
-
- // Burn one new fuel:
- m_FuelBurnTime = NewTime;
- m_TimeBurned = 0;
- SetIsCooking(true);
- if (m_Contents.GetSlot(fsFuel).m_ItemType == E_ITEM_LAVA_BUCKET)
- {
- m_Contents.SetSlot(fsFuel, cItem(E_ITEM_BUCKET));
- }
- else
- {
- m_Contents.ChangeSlotCount(fsFuel, -1);
- }
-}
-
-
-
-
-
-void cFurnaceEntity::OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum)
-{
- super::OnSlotChanged(a_ItemGrid, a_SlotNum);
-
- if (m_World == NULL)
- {
- // The furnace isn't initialized yet, do no processing
- return;
- }
-
- ASSERT(a_ItemGrid == &m_Contents);
- switch (a_SlotNum)
- {
- case fsInput:
- {
- UpdateInput();
- break;
- }
-
- case fsFuel:
- {
- UpdateFuel();
- break;
- }
-
- case fsOutput:
- {
- UpdateOutput();
- break;
- }
- }
-}
-
-
-
-
-
-
-/// Updates the current recipe, based on the current input
-void cFurnaceEntity::UpdateInput(void)
-{
- if (!m_Contents.GetSlot(fsInput).IsStackableWith(m_LastInput))
- {
- // The input is different from what we had before, reset the cooking time
- m_TimeCooked = 0;
- }
- m_LastInput = m_Contents.GetSlot(fsInput);
-
- cFurnaceRecipe * FR = cRoot::Get()->GetFurnaceRecipe();
- m_CurrentRecipe = FR->GetRecipeFrom(m_Contents.GetSlot(fsInput));
- if (!CanCookInputToOutput())
- {
- // This input cannot be cooked
- m_NeedCookTime = 0;
- SetIsCooking(false);
- }
- else
- {
- m_NeedCookTime = m_CurrentRecipe->CookTime;
- SetIsCooking(true);
-
- // Start burning new fuel if there's no flame now:
- if (GetFuelBurnTimeLeft() <= 0)
- {
- BurnNewFuel();
- }
- }
-}
-
-
-
-
-
-/// Called when the fuel slot changes or when the fuel is spent, burns another piece of fuel if appropriate
-void cFurnaceEntity::UpdateFuel(void)
-{
- if (m_FuelBurnTime > m_TimeBurned)
- {
- // The current fuel is still burning, don't modify anything:
- return;
- }
-
- // The current fuel is spent, try to burn some more:
- BurnNewFuel();
-}
-
-
-
-
-
-/// Called when the output slot changes; starts burning if space became available
-void cFurnaceEntity::UpdateOutput(void)
-{
- if (!CanCookInputToOutput())
- {
- // Cannot cook anymore:
- m_TimeCooked = 0;
- m_NeedCookTime = 0;
- SetIsCooking(false);
- return;
- }
-
- // No need to burn new fuel, the Tick() function will take care of that
-
- // Can cook, start cooking if not already underway:
- m_NeedCookTime = m_CurrentRecipe->CookTime;
- SetIsCooking(m_FuelBurnTime > 0);
-}
-
-
-
-
-
-/// Updates the m_IsCooking, based on the input slot, output slot and m_FuelBurnTime / m_TimeBurned
-void cFurnaceEntity::UpdateIsCooking(void)
-{
- if (
- !CanCookInputToOutput() || // Cannot cook this
- (m_FuelBurnTime <= 0) || // No fuel
- (m_TimeBurned >= m_FuelBurnTime) // Fuel burnt out
- )
- {
- // Reset everything
- SetIsCooking(false);
- m_TimeCooked = 0;
- m_NeedCookTime = 0;
- return;
- }
-
- SetIsCooking(true);
-}
-
-
-
-
-
-/// Returns true if the input can be cooked into output and the item counts allow for another cooking operation
-bool cFurnaceEntity::CanCookInputToOutput(void) const
-{
- if (m_CurrentRecipe == NULL)
- {
- // This input cannot be cooked
- return false;
- }
-
- if (m_Contents.GetSlot(fsOutput).IsEmpty())
- {
- // The output is empty, can cook
- return true;
- }
-
- if (!m_Contents.GetSlot(fsOutput).IsStackableWith(*m_CurrentRecipe->Out))
- {
- // The output slot is blocked with something that cannot be stacked with the recipe's output
- return false;
- }
-
- if (m_Contents.GetSlot(fsOutput).IsFullStack())
- {
- // Cannot add any more items to the output slot
- return false;
- }
-
- return true;
-}
-
-
-
-
-
-/// Broadcasts progressbar updates, if needed
-void cFurnaceEntity::UpdateProgressBars(void)
-{
- // In order to preserve bandwidth, an update is sent only every 10th tick
- // That's why the comparisons use the division by eight
-
- int CurFuel = (m_FuelBurnTime > 0) ? (200 - 200 * m_TimeBurned / m_FuelBurnTime) : 0;
- if ((CurFuel / 8) != (m_LastProgressFuel / 8))
- {
- BroadcastProgress(PROGRESSBAR_FUEL, CurFuel);
- m_LastProgressFuel = CurFuel;
- }
-
- int CurCook = (m_NeedCookTime > 0) ? (200 * m_TimeCooked / m_NeedCookTime) : 0;
- if ((CurCook / 8) != (m_LastProgressCook / 8))
- {
- BroadcastProgress(PROGRESSBAR_SMELTING, CurCook);
- m_LastProgressCook = CurCook;
- }
-}
-
-
-
-
-
-void cFurnaceEntity::SetIsCooking(bool a_IsCooking)
-{
- if (a_IsCooking == m_IsCooking)
- {
- return;
- }
-
- m_IsCooking = a_IsCooking;
-
- // Light or extinguish the furnace:
- m_World->FastSetBlock(m_PosX, m_PosY, m_PosZ, m_IsCooking ? E_BLOCK_LIT_FURNACE : E_BLOCK_FURNACE, m_BlockMeta);
-}
-
-
-
-
diff --git a/source/BlockEntities/JukeboxEntity.cpp b/source/BlockEntities/JukeboxEntity.cpp
deleted file mode 100644
index aca376dd3..000000000
--- a/source/BlockEntities/JukeboxEntity.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-
-#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
-
-#include "JukeboxEntity.h"
-#include "../World.h"
-#include <json/json.h>
-
-
-
-
-
-cJukeboxEntity::cJukeboxEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World) :
- super(E_BLOCK_JUKEBOX, a_BlockX, a_BlockY, a_BlockZ, a_World),
- m_Record(0)
-{
-}
-
-
-
-
-
-cJukeboxEntity::~cJukeboxEntity()
-{
- EjectRecord();
-}
-
-
-
-
-
-void cJukeboxEntity::UsedBy(cPlayer * a_Player)
-{
- if (m_Record == 0)
- {
- const cItem & HeldItem = a_Player->GetEquippedItem();
- if (HeldItem.m_ItemType >= 2256 && HeldItem.m_ItemType <= 2267)
- {
- m_Record = HeldItem.m_ItemType;
- a_Player->GetInventory().RemoveOneEquippedItem();
- PlayRecord();
- }
- }
- else
- {
- EjectRecord();
- }
-}
-
-
-
-
-
-void cJukeboxEntity::PlayRecord(void)
-{
- m_World->BroadcastSoundParticleEffect(1005, m_PosX, m_PosY, m_PosZ, m_Record);
-}
-
-
-
-
-
-void cJukeboxEntity::EjectRecord(void)
-{
- if ((m_Record < E_ITEM_FIRST_DISC) || (m_Record > E_ITEM_LAST_DISC))
- {
- // There's no record here
- return;
- }
-
- cItems Drops;
- Drops.push_back(cItem(m_Record, 1, 0));
- m_World->SpawnItemPickups(Drops, m_PosX + 0.5, m_PosY + 1, m_PosZ + 0.5, 8);
- m_World->BroadcastSoundParticleEffect(1005, m_PosX, m_PosY, m_PosZ, 0);
- m_Record = 0;
-}
-
-
-
-
-
-int cJukeboxEntity::GetRecord(void)
-{
- return m_Record;
-}
-
-
-
-
-
-void cJukeboxEntity::SetRecord(int a_Record)
-{
- m_Record = a_Record;
-}
-
-
-
-
-
-bool cJukeboxEntity::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_Record = a_Value.get("Record", 0).asInt();
-
- return true;
-}
-
-
-
-
-
-void cJukeboxEntity::SaveToJson(Json::Value & a_Value)
-{
- a_Value["x"] = m_PosX;
- a_Value["y"] = m_PosY;
- a_Value["z"] = m_PosZ;
-
- a_Value["Record"] = m_Record;
-}
-
-
-
-
diff --git a/source/BlockEntities/NoteEntity.cpp b/source/BlockEntities/NoteEntity.cpp
deleted file mode 100644
index 1b0620299..000000000
--- a/source/BlockEntities/NoteEntity.cpp
+++ /dev/null
@@ -1,154 +0,0 @@
-
-#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
-
-#include "NoteEntity.h"
-#include "../World.h"
-#include <json/json.h>
-
-
-
-
-
-cNoteEntity::cNoteEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World) :
- super(E_BLOCK_NOTE_BLOCK, a_BlockX, a_BlockY, a_BlockZ, a_World),
- m_Pitch(0)
-{
-}
-
-
-
-
-
-void cNoteEntity::UsedBy(cPlayer * a_Player)
-{
- IncrementPitch();
- MakeSound();
-}
-
-
-
-
-
-void cNoteEntity::MakeSound(void)
-{
- char instrument;
- AString sampleName;
-
- switch (m_World->GetBlock(m_PosX, m_PosY - 1, m_PosZ))
- {
- case E_BLOCK_PLANKS:
- case E_BLOCK_LOG:
- case E_BLOCK_NOTE_BLOCK:
- {
- // TODO: add other wood-based blocks if needed
- instrument = E_INST_DOUBLE_BASS;
- sampleName = "note.db";
- break;
- }
-
- case E_BLOCK_SAND:
- case E_BLOCK_GRAVEL:
- case E_BLOCK_SOULSAND:
- {
- instrument = E_INST_SNARE_DRUM;
- sampleName = "note.snare";
- break;
- }
-
- case E_BLOCK_GLASS:
- case E_BLOCK_GLASS_PANE:
- case E_BLOCK_GLOWSTONE:
- {
- instrument = E_INST_CLICKS;
- sampleName = "note.hat";
- break;
- }
-
- case E_BLOCK_STONE:
- case E_BLOCK_STONE_BRICKS:
- case E_BLOCK_COBBLESTONE:
- case E_BLOCK_OBSIDIAN:
- case E_BLOCK_NETHERRACK:
- case E_BLOCK_BRICK:
- case E_BLOCK_NETHER_BRICK:
- {
- // TODO: add other stone-based blocks if needed
- instrument = E_INST_BASS_DRUM;
- sampleName = "note.bassattack";
- break;
- }
-
- default:
- {
- instrument = E_INST_HARP_PIANO;
- sampleName = "note.harp";
- break;
- }
- }
-
- m_World->BroadcastBlockAction(m_PosX, m_PosY, m_PosZ, instrument, m_Pitch, E_BLOCK_NOTE_BLOCK);
-
- // TODO: instead of calculating the power function over and over, make a precalculated table - there's only 24 pitches after all
- float calcPitch = pow(2.0f, ((float)m_Pitch - 12.0f) / 12.0f);
- m_World->BroadcastSoundEffect(sampleName, m_PosX * 8, m_PosY * 8, m_PosZ * 8, 3.0f, calcPitch);
-}
-
-
-
-
-
-char cNoteEntity::GetPitch(void)
-{
- return m_Pitch;
-}
-
-
-
-
-
-void cNoteEntity::SetPitch(char a_Pitch)
-{
- m_Pitch = a_Pitch % 25;
-}
-
-
-
-
-
-void cNoteEntity::IncrementPitch(void)
-{
- SetPitch(m_Pitch + 1);
-}
-
-
-
-
-
-bool cNoteEntity::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_Pitch = (char)a_Value.get("p", 0).asInt();
-
- return true;
-}
-
-
-
-
-
-void cNoteEntity::SaveToJson(Json::Value & a_Value)
-{
- a_Value["x"] = m_PosX;
- a_Value["y"] = m_PosY;
- a_Value["z"] = m_PosZ;
-
- a_Value["p"] = m_Pitch;
-}
-
-
-
-
diff --git a/source/BlockEntities/SignEntity.cpp b/source/BlockEntities/SignEntity.cpp
deleted file mode 100644
index 81f6f6d77..000000000
--- a/source/BlockEntities/SignEntity.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-
-// SignEntity.cpp
-
-// Implements the cSignEntity 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 "SignEntity.h"
-#include "../Entities/Player.h"
-
-
-
-
-
-cSignEntity::cSignEntity(BLOCKTYPE a_BlockType, int a_X, int a_Y, int a_Z, cWorld * a_World) :
- super(a_BlockType, a_X, a_Y, a_Z, a_World)
-{
-}
-
-
-
-
-
-// It don't do anything when 'used'
-void cSignEntity::UsedBy(cPlayer * a_Player)
-{
- UNUSED(a_Player);
-}
-
-
-
-
-
-void cSignEntity::SetLines(const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4)
-{
- m_Line[0] = a_Line1;
- m_Line[1] = a_Line2;
- m_Line[2] = a_Line3;
- m_Line[3] = a_Line4;
-}
-
-
-
-
-
-void cSignEntity::SetLine(int a_Index, const AString & a_Line)
-{
- if ((a_Index < 0) || (a_Index >= ARRAYCOUNT(m_Line)))
- {
- LOGWARNING("%s: setting a non-existent line %d (value \"%s\"", __FUNCTION__, a_Index, a_Line.c_str());
- return;
- }
- m_Line[a_Index] = a_Line;
-}
-
-
-
-
-
-AString cSignEntity::GetLine(int a_Index) const
-{
- if ((a_Index < 0) || (a_Index >= ARRAYCOUNT(m_Line)))
- {
- LOGWARNING("%s: requesting a non-existent line %d", __FUNCTION__, a_Index);
- return "";
- }
- return m_Line[a_Index];
-}
-
-
-
-
-
-void cSignEntity::SendTo(cClientHandle & a_Client)
-{
- a_Client.SendUpdateSign(m_PosX, m_PosY, m_PosZ, m_Line[0], m_Line[1], m_Line[2], m_Line[3]);
-}
-
-
-
-
-
-bool cSignEntity::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_Line[0] = a_Value.get("Line1", "").asString();
- m_Line[1] = a_Value.get("Line2", "").asString();
- m_Line[2] = a_Value.get("Line3", "").asString();
- m_Line[3] = a_Value.get("Line4", "").asString();
-
- return true;
-}
-
-
-
-
-
-void cSignEntity::SaveToJson(Json::Value & a_Value)
-{
- a_Value["x"] = m_PosX;
- a_Value["y"] = m_PosY;
- a_Value["z"] = m_PosZ;
-
- a_Value["Line1"] = m_Line[0];
- a_Value["Line2"] = m_Line[1];
- a_Value["Line3"] = m_Line[2];
- a_Value["Line4"] = m_Line[3];
-}
-
-
-
-
diff --git a/source/BlockEntities/BlockEntity.cpp b/src/BlockEntities/BlockEntity.cpp
index 41a488717..41a488717 100644
--- a/source/BlockEntities/BlockEntity.cpp
+++ b/src/BlockEntities/BlockEntity.cpp
diff --git a/source/BlockEntities/BlockEntity.h b/src/BlockEntities/BlockEntity.h
index 0d358b556..0d358b556 100644
--- a/source/BlockEntities/BlockEntity.h
+++ b/src/BlockEntities/BlockEntity.h
diff --git a/source/BlockEntities/BlockEntityWithItems.h b/src/BlockEntities/BlockEntityWithItems.h
index 0846ae17e..0846ae17e 100644
--- a/source/BlockEntities/BlockEntityWithItems.h
+++ b/src/BlockEntities/BlockEntityWithItems.h
diff --git a/source/BlockEntities/ChestEntity.h b/src/BlockEntities/ChestEntity.h
index 4f2c21e91..4f2c21e91 100644
--- a/source/BlockEntities/ChestEntity.h
+++ b/src/BlockEntities/ChestEntity.h
diff --git a/source/BlockEntities/DispenserEntity.cpp b/src/BlockEntities/DispenserEntity.cpp
index 374f3d6e3..374f3d6e3 100644
--- a/source/BlockEntities/DispenserEntity.cpp
+++ b/src/BlockEntities/DispenserEntity.cpp
diff --git a/source/BlockEntities/DispenserEntity.h b/src/BlockEntities/DispenserEntity.h
index fdfe4e5b4..fdfe4e5b4 100644
--- a/source/BlockEntities/DispenserEntity.h
+++ b/src/BlockEntities/DispenserEntity.h
diff --git a/source/BlockEntities/DropSpenserEntity.cpp b/src/BlockEntities/DropSpenserEntity.cpp
index 823ed598f..823ed598f 100644
--- a/source/BlockEntities/DropSpenserEntity.cpp
+++ b/src/BlockEntities/DropSpenserEntity.cpp
diff --git a/source/BlockEntities/DropSpenserEntity.h b/src/BlockEntities/DropSpenserEntity.h
index 0e9039915..0e9039915 100644
--- a/source/BlockEntities/DropSpenserEntity.h
+++ b/src/BlockEntities/DropSpenserEntity.h
diff --git a/source/BlockEntities/DropperEntity.cpp b/src/BlockEntities/DropperEntity.cpp
index 5d4a8ad97..5d4a8ad97 100644
--- a/source/BlockEntities/DropperEntity.cpp
+++ b/src/BlockEntities/DropperEntity.cpp
diff --git a/source/BlockEntities/DropperEntity.h b/src/BlockEntities/DropperEntity.h
index 8e07bc6f8..8e07bc6f8 100644
--- a/source/BlockEntities/DropperEntity.h
+++ b/src/BlockEntities/DropperEntity.h
diff --git a/source/BlockEntities/FurnaceEntity.h b/src/BlockEntities/FurnaceEntity.h
index 9464fd175..9464fd175 100644
--- a/source/BlockEntities/FurnaceEntity.h
+++ b/src/BlockEntities/FurnaceEntity.h
diff --git a/source/BlockEntities/HopperEntity.cpp b/src/BlockEntities/HopperEntity.cpp
index 41849b1b3..41849b1b3 100644
--- a/source/BlockEntities/HopperEntity.cpp
+++ b/src/BlockEntities/HopperEntity.cpp
diff --git a/source/BlockEntities/HopperEntity.h b/src/BlockEntities/HopperEntity.h
index 3eaa05b7c..3eaa05b7c 100644
--- a/source/BlockEntities/HopperEntity.h
+++ b/src/BlockEntities/HopperEntity.h
diff --git a/source/BlockEntities/JukeboxEntity.h b/src/BlockEntities/JukeboxEntity.h
index fcafdc479..fcafdc479 100644
--- a/source/BlockEntities/JukeboxEntity.h
+++ b/src/BlockEntities/JukeboxEntity.h
diff --git a/source/BlockEntities/NoteEntity.h b/src/BlockEntities/NoteEntity.h
index e2d088f44..e2d088f44 100644
--- a/source/BlockEntities/NoteEntity.h
+++ b/src/BlockEntities/NoteEntity.h
diff --git a/source/BlockEntities/SignEntity.h b/src/BlockEntities/SignEntity.h
index d998ff1e8..d998ff1e8 100644
--- a/source/BlockEntities/SignEntity.h
+++ b/src/BlockEntities/SignEntity.h