Unified the doxy-comment format.
This commit is contained in:
parent
41d7119a38
commit
6e4122e551
@ -3,6 +3,10 @@
|
|||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
class cAllocationPool
|
class cAllocationPool
|
||||||
{
|
{
|
||||||
@ -12,34 +16,39 @@ public:
|
|||||||
public:
|
public:
|
||||||
virtual ~cStarvationCallbacks() {}
|
virtual ~cStarvationCallbacks() {}
|
||||||
|
|
||||||
/** Is called when the reserve buffer starts to be used **/
|
/** Is called when the reserve buffer starts to be used */
|
||||||
virtual void OnStartUsingReserve() = 0;
|
virtual void OnStartUsingReserve() = 0;
|
||||||
|
|
||||||
/** Is called once the reserve buffer has returned to normal size **/
|
/** Is called once the reserve buffer has returned to normal size */
|
||||||
virtual void OnEndUsingReserve() = 0;
|
virtual void OnEndUsingReserve() = 0;
|
||||||
|
|
||||||
/** Is called when the allocation pool is unable to allocate memory. Will be repeatedly
|
/** Is called when the allocation pool is unable to allocate memory. Will be repeatedly
|
||||||
called if it does not free sufficient memory **/
|
called if it does not free sufficient memory */
|
||||||
virtual void OnOutOfReserve() = 0;
|
virtual void OnOutOfReserve() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual ~cAllocationPool() {}
|
virtual ~cAllocationPool() {}
|
||||||
|
|
||||||
/** Allocates a pointer to T **/
|
/** Allocates a pointer to T */
|
||||||
virtual T * Allocate() = 0;
|
virtual T * Allocate() = 0;
|
||||||
|
|
||||||
/** Frees the pointer passed in a_ptr, invalidating it **/
|
/** Frees the pointer passed in a_ptr, invalidating it */
|
||||||
virtual void Free(T * a_ptr) = 0;
|
virtual void Free(T * a_ptr) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Allocates memory storing unused elements in a linked list. Keeps at least NumElementsInReserve
|
|
||||||
elements in the list unless malloc fails so that the program has a reserve to handle OOM.**/
|
|
||||||
template <class T, size_t NumElementsInReserve>
|
|
||||||
class cListAllocationPool : public cAllocationPool<T>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
cListAllocationPool(std::unique_ptr<typename cAllocationPool<T>::cStarvationCallbacks> a_Callbacks) :
|
|
||||||
|
|
||||||
|
|
||||||
|
/** Allocates memory storing unused elements in a linked list. Keeps at least NumElementsInReserve
|
||||||
|
elements in the list unless malloc fails so that the program has a reserve to handle OOM. */
|
||||||
|
template <class T, size_t NumElementsInReserve>
|
||||||
|
class cListAllocationPool:
|
||||||
|
public cAllocationPool<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
cListAllocationPool(std::unique_ptr<typename cAllocationPool<T>::cStarvationCallbacks> a_Callbacks):
|
||||||
m_Callbacks(std::move(a_Callbacks))
|
m_Callbacks(std::move(a_Callbacks))
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < NumElementsInReserve; i++)
|
for (size_t i = 0; i < NumElementsInReserve; i++)
|
||||||
@ -54,6 +63,7 @@ class cListAllocationPool : public cAllocationPool<T>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual ~cListAllocationPool()
|
virtual ~cListAllocationPool()
|
||||||
{
|
{
|
||||||
while (!m_FreeList.empty())
|
while (!m_FreeList.empty())
|
||||||
@ -63,6 +73,7 @@ class cListAllocationPool : public cAllocationPool<T>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual T * Allocate() override
|
virtual T * Allocate() override
|
||||||
{
|
{
|
||||||
if (m_FreeList.size() <= NumElementsInReserve)
|
if (m_FreeList.size() <= NumElementsInReserve)
|
||||||
@ -88,6 +99,8 @@ class cListAllocationPool : public cAllocationPool<T>
|
|||||||
m_FreeList.pop_front();
|
m_FreeList.pop_front();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
virtual void Free(T * a_ptr) override
|
virtual void Free(T * a_ptr) override
|
||||||
{
|
{
|
||||||
if (a_ptr == nullptr)
|
if (a_ptr == nullptr)
|
||||||
@ -103,7 +116,7 @@ class cListAllocationPool : public cAllocationPool<T>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::list<void *> m_FreeList;
|
std::list<void *> m_FreeList;
|
||||||
std::unique_ptr<typename cAllocationPool<T>::cStarvationCallbacks> m_Callbacks;
|
std::unique_ptr<typename cAllocationPool<T>::cStarvationCallbacks> m_Callbacks;
|
||||||
};
|
};
|
||||||
|
@ -31,8 +31,7 @@ To overcome this, this object overloads the Destroy functions, which doesn't let
|
|||||||
delete the window, but rather leaves it dangling, with only Lua having the reference to it.
|
delete the window, but rather leaves it dangling, with only Lua having the reference to it.
|
||||||
Additionally, to forbid Lua from deleting this object while it is used by players, the manual bindings for
|
Additionally, to forbid Lua from deleting this object while it is used by players, the manual bindings for
|
||||||
cPlayer:OpenWindow check if the window is of this class, and if so, make a global Lua reference for this object.
|
cPlayer:OpenWindow check if the window is of this class, and if so, make a global Lua reference for this object.
|
||||||
This reference needs to be unreferenced in the Destroy() function.
|
This reference needs to be unreferenced in the Destroy() function. */
|
||||||
*/
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
class cLuaWindow :
|
class cLuaWindow :
|
||||||
public cWindow
|
public cWindow
|
||||||
@ -43,44 +42,43 @@ class cLuaWindow :
|
|||||||
typedef cWindow super;
|
typedef cWindow super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Create a window of the specified type, with a slot grid of a_SlotsX * a_SlotsY size
|
/** Create a window of the specified type, with a slot grid of a_SlotsX * a_SlotsY size */
|
||||||
cLuaWindow(cWindow::WindowType a_WindowType, int a_SlotsX, int a_SlotsY, const AString & a_Title);
|
cLuaWindow(cWindow::WindowType a_WindowType, int a_SlotsX, int a_SlotsY, const AString & a_Title);
|
||||||
|
|
||||||
virtual ~cLuaWindow();
|
virtual ~cLuaWindow();
|
||||||
|
|
||||||
/// Returns the internal representation of the contents that are manipulated by Lua
|
/** Returns the internal representation of the contents that are manipulated by Lua */
|
||||||
cItemGrid & GetContents(void) { return m_Contents; }
|
cItemGrid & GetContents(void) { return m_Contents; }
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
/** Sets the plugin reference and the internal Lua object reference index
|
/** Sets the plugin reference and the internal Lua object reference index
|
||||||
used for preventing Lua's GC to collect this class while the window is open
|
used for preventing Lua's GC to collect this class while the window is open. */
|
||||||
*/
|
|
||||||
void SetLuaRef(cPluginLua * a_Plugin, int a_LuaRef);
|
void SetLuaRef(cPluginLua * a_Plugin, int a_LuaRef);
|
||||||
|
|
||||||
/// Returns true if SetLuaRef() has been called
|
/** Returns true if SetLuaRef() has been called */
|
||||||
bool IsLuaReferenced(void) const;
|
bool IsLuaReferenced(void) const;
|
||||||
|
|
||||||
/// Sets the callback function (Lua reference) to call when the window is about to close
|
/** Sets the callback function (Lua reference) to call when the window is about to close */
|
||||||
void SetOnClosing(cPluginLua * a_Plugin, int a_FnRef);
|
void SetOnClosing(cPluginLua * a_Plugin, int a_FnRef);
|
||||||
|
|
||||||
/// Sets the callback function (Lua reference) to call when a slot is changed
|
/** Sets the callback function (Lua reference) to call when a slot is changed */
|
||||||
void SetOnSlotChanged(cPluginLua * a_Plugin, int a_FnRef);
|
void SetOnSlotChanged(cPluginLua * a_Plugin, int a_FnRef);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// Contents of the non-inventory part
|
/** Contents of the non-inventory part */
|
||||||
cItemGrid m_Contents;
|
cItemGrid m_Contents;
|
||||||
|
|
||||||
/// The plugin that has opened the window and owns the m_LuaRef
|
/** The plugin that has opened the window and owns the m_LuaRef */
|
||||||
cPluginLua * m_Plugin;
|
cPluginLua * m_Plugin;
|
||||||
|
|
||||||
/// The Lua object reference, used for keeping the object alive as long as any player has the window open
|
/** The Lua object reference, used for keeping the object alive as long as any player has the window open */
|
||||||
int m_LuaRef;
|
int m_LuaRef;
|
||||||
|
|
||||||
/// The Lua reference for the callback to call when the window is closing for any player
|
/** The Lua reference for the callback to call when the window is closing for any player */
|
||||||
int m_OnClosingFnRef;
|
int m_OnClosingFnRef;
|
||||||
|
|
||||||
/// The Lua reference for the callback to call when a slot has changed
|
/** The Lua reference for the callback to call when a slot has changed */
|
||||||
int m_OnSlotChangedFnRef;
|
int m_OnSlotChangedFnRef;
|
||||||
|
|
||||||
// cWindow overrides:
|
// cWindow overrides:
|
||||||
|
@ -1945,7 +1945,7 @@ tolua_lerror:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Provides interface between a Lua table of callbacks and the cBlockTracer::cCallbacks
|
/** Provides interface between a Lua table of callbacks and the cBlockTracer::cCallbacks */
|
||||||
class cLuaBlockTracerCallbacks :
|
class cLuaBlockTracerCallbacks :
|
||||||
public cBlockTracer::cCallbacks
|
public cBlockTracer::cCallbacks
|
||||||
{
|
{
|
||||||
|
@ -42,7 +42,7 @@ public:
|
|||||||
// Called each tick
|
// Called each tick
|
||||||
virtual void Tick(float a_Dt) = 0;
|
virtual void Tick(float a_Dt) = 0;
|
||||||
|
|
||||||
/** Calls the specified hook with the params given. Returns the bool that the hook callback returns.*/
|
/** Calls the specified hook with the params given. Returns the bool that the hook callback returns. */
|
||||||
virtual bool OnBlockSpread (cWorld & a_World, int a_BlockX, int a_BlockY, int a_BlockZ, eSpreadSource a_Source) = 0;
|
virtual bool OnBlockSpread (cWorld & a_World, int a_BlockX, int a_BlockY, int a_BlockZ, eSpreadSource a_Source) = 0;
|
||||||
virtual bool OnBlockToPickups (cWorld & a_World, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, cItems & a_Pickups) = 0;
|
virtual bool OnBlockToPickups (cWorld & a_World, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, cItems & a_Pickups) = 0;
|
||||||
virtual bool OnChat (cPlayer & a_Player, AString & a_Message) = 0;
|
virtual bool OnChat (cPlayer & a_Player, AString & a_Message) = 0;
|
||||||
|
@ -151,7 +151,7 @@ extern bool IsBiomeVeryCold(EMCSBiome a_Biome);
|
|||||||
Doesn't report Very Cold biomes, use IsBiomeVeryCold() for those. */
|
Doesn't report Very Cold biomes, use IsBiomeVeryCold() for those. */
|
||||||
extern bool IsBiomeCold(EMCSBiome a_Biome);
|
extern bool IsBiomeCold(EMCSBiome a_Biome);
|
||||||
|
|
||||||
/** Returns the height when a biome when a biome starts snowing.*/
|
/** Returns the height when a biome when a biome starts snowing. */
|
||||||
extern int GetSnowStartHeight(EMCSBiome a_Biome);
|
extern int GetSnowStartHeight(EMCSBiome a_Biome);
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
@ -26,8 +26,8 @@
|
|||||||
|
|
||||||
typedef void (CombinatorFunc)(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta);
|
typedef void (CombinatorFunc)(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta);
|
||||||
|
|
||||||
// This wild construct allows us to pass a function argument and still have it inlined by the compiler :)
|
/** Merges two blocktypes and blockmetas of the specified sizes and offsets using the specified combinator function
|
||||||
/// Merges two blocktypes and blockmetas of the specified sizes and offsets using the specified combinator function
|
This wild construct allows us to pass a function argument and still have it inlined by the compiler. */
|
||||||
template <bool MetasValid, CombinatorFunc Combinator>
|
template <bool MetasValid, CombinatorFunc Combinator>
|
||||||
void InternalMergeBlocks(
|
void InternalMergeBlocks(
|
||||||
BLOCKTYPE * a_DstTypes, const BLOCKTYPE * a_SrcTypes,
|
BLOCKTYPE * a_DstTypes, const BLOCKTYPE * a_SrcTypes,
|
||||||
@ -73,7 +73,7 @@ void InternalMergeBlocks(
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Combinator used for cBlockArea::msOverwrite merging
|
/** Combinator used for cBlockArea::msOverwrite merging */
|
||||||
template <bool MetaValid>
|
template <bool MetaValid>
|
||||||
void MergeCombinatorOverwrite(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
void MergeCombinatorOverwrite(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
||||||
{
|
{
|
||||||
@ -88,7 +88,7 @@ void MergeCombinatorOverwrite(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLE
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Combinator used for cBlockArea::msFillAir merging
|
/** Combinator used for cBlockArea::msFillAir merging */
|
||||||
template <bool MetaValid>
|
template <bool MetaValid>
|
||||||
void MergeCombinatorFillAir(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
void MergeCombinatorFillAir(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
||||||
{
|
{
|
||||||
@ -107,7 +107,7 @@ void MergeCombinatorFillAir(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETY
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Combinator used for cBlockArea::msImprint merging
|
/** Combinator used for cBlockArea::msImprint merging */
|
||||||
template <bool MetaValid>
|
template <bool MetaValid>
|
||||||
void MergeCombinatorImprint(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
void MergeCombinatorImprint(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
||||||
{
|
{
|
||||||
@ -126,7 +126,7 @@ void MergeCombinatorImprint(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETY
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Combinator used for cBlockArea::msLake merging
|
/** Combinator used for cBlockArea::msLake merging */
|
||||||
template <bool MetaValid>
|
template <bool MetaValid>
|
||||||
void MergeCombinatorLake(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
void MergeCombinatorLake(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
||||||
{
|
{
|
||||||
|
@ -63,9 +63,9 @@ public:
|
|||||||
m_World = a_World;
|
m_World = a_World;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a new block entity for the specified block type
|
/** Creates a new block entity for the specified block type
|
||||||
/// If a_World is valid, then the entity is created bound to that world
|
If a_World is valid, then the entity is created bound to that world
|
||||||
/// Returns nullptr for unknown block types
|
Returns nullptr for unknown block types. */
|
||||||
static cBlockEntity * CreateByBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World = nullptr);
|
static cBlockEntity * CreateByBlockType(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World = nullptr);
|
||||||
|
|
||||||
static const char * GetClassStatic(void) // Needed for ManualBindings's ForEach templates
|
static const char * GetClassStatic(void) // Needed for ManualBindings's ForEach templates
|
||||||
@ -102,15 +102,14 @@ public:
|
|||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
/// Called when a player uses this entity; should open the UI window
|
/** Called when a player uses this entity; should open the UI window */
|
||||||
virtual void UsedBy( cPlayer * a_Player) = 0;
|
virtual void UsedBy( cPlayer * a_Player) = 0;
|
||||||
|
|
||||||
/** Sends the packet defining the block entity to the client specified.
|
/** Sends the packet defining the block entity to the client specified.
|
||||||
To send to all eligible clients, use cWorld::BroadcastBlockEntity()
|
To send to all eligible clients, use cWorld::BroadcastBlockEntity() */
|
||||||
*/
|
|
||||||
virtual void SendTo(cClientHandle & a_Client) = 0;
|
virtual void SendTo(cClientHandle & a_Client) = 0;
|
||||||
|
|
||||||
/// Ticks the entity; returns true if the chunk should be marked as dirty as a result of this ticking. By default does nothing.
|
/** Ticks the entity; returns true if the chunk should be marked as dirty as a result of this ticking. By default does nothing. */
|
||||||
virtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
|
virtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
|
||||||
{
|
{
|
||||||
UNUSED(a_Dt);
|
UNUSED(a_Dt);
|
||||||
@ -118,10 +117,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// Position in absolute block coordinates
|
/** Position in absolute block coordinates */
|
||||||
int m_PosX, m_PosY, m_PosZ;
|
int m_PosX, m_PosY, m_PosZ;
|
||||||
|
|
||||||
/// Position relative to the chunk, used to speed up ticking
|
/** Position relative to the chunk, used to speed up ticking */
|
||||||
int m_RelX, m_RelZ;
|
int m_RelX, m_RelZ;
|
||||||
|
|
||||||
BLOCKTYPE m_BlockType;
|
BLOCKTYPE m_BlockType;
|
||||||
|
@ -64,12 +64,12 @@ public:
|
|||||||
void SetSlot(int a_SlotNum, const cItem & a_Item) { m_Contents.SetSlot(a_SlotNum, a_Item); }
|
void SetSlot(int a_SlotNum, const cItem & a_Item) { m_Contents.SetSlot(a_SlotNum, a_Item); }
|
||||||
void SetSlot(int a_X, int a_Y, const cItem & a_Item) { m_Contents.SetSlot(a_X, a_Y, a_Item); }
|
void SetSlot(int a_X, int a_Y, const cItem & a_Item) { m_Contents.SetSlot(a_X, a_Y, a_Item); }
|
||||||
|
|
||||||
/// Returns the ItemGrid used for storing the contents
|
/** Returns the ItemGrid used for storing the contents */
|
||||||
cItemGrid & GetContents(void) { return m_Contents; }
|
cItemGrid & GetContents(void) { return m_Contents; }
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
/// Const version of the GetContents() function for C++ type-safety
|
/** Const version of the GetContents() function for C++ type-safety */
|
||||||
const cItemGrid & GetContents(void) const { return m_Contents; }
|
const cItemGrid & GetContents(void) const { return m_Contents; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -30,7 +30,7 @@ public:
|
|||||||
|
|
||||||
BLOCKENTITY_PROTODEF(cCommandBlockEntity)
|
BLOCKENTITY_PROTODEF(cCommandBlockEntity)
|
||||||
|
|
||||||
/// Creates a new empty command block entity
|
/** Creates a new empty command block entity */
|
||||||
cCommandBlockEntity(int a_X, int a_Y, int a_Z, cWorld * a_World);
|
cCommandBlockEntity(int a_X, int a_Y, int a_Z, cWorld * a_World);
|
||||||
|
|
||||||
virtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
|
virtual bool Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
|
||||||
@ -43,29 +43,29 @@ public:
|
|||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
/// Sets the internal redstone power flag to "on" or "off", depending on the parameter. Calls Activate() if appropriate
|
/** Sets the internal redstone power flag to "on" or "off", depending on the parameter. Calls Activate() if appropriate */
|
||||||
virtual void SetRedstonePower(bool a_IsPowered) override;
|
virtual void SetRedstonePower(bool a_IsPowered) override;
|
||||||
|
|
||||||
/// Sets the command block to execute a command in the next tick
|
/** Sets the command block to execute a command in the next tick */
|
||||||
void Activate(void);
|
void Activate(void);
|
||||||
|
|
||||||
/// Sets the command
|
/** Sets the command */
|
||||||
void SetCommand(const AString & a_Cmd);
|
void SetCommand(const AString & a_Cmd);
|
||||||
|
|
||||||
/// Retrieves stored command
|
/** Retrieves stored command */
|
||||||
const AString & GetCommand(void) const;
|
const AString & GetCommand(void) const;
|
||||||
|
|
||||||
/// Retrieves the last line of output generated by the command block
|
/** Retrieves the last line of output generated by the command block */
|
||||||
const AString & GetLastOutput(void) const;
|
const AString & GetLastOutput(void) const;
|
||||||
|
|
||||||
/// Retrieves the result (signal strength) of the last operation
|
/** Retrieves the result (signal strength) of the last operation */
|
||||||
NIBBLETYPE GetResult(void) const;
|
NIBBLETYPE GetResult(void) const;
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/// Executes the associated command
|
/** Executes the associated command */
|
||||||
void Execute();
|
void Execute();
|
||||||
|
|
||||||
bool m_ShouldExecute;
|
bool m_ShouldExecute;
|
||||||
|
@ -53,28 +53,28 @@ public:
|
|||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
/// Modifies the block coords to match the dropspenser direction given (where the dropspensed pickups should materialize)
|
/** Modifies the block coords to match the dropspenser direction given (where the dropspensed pickups should materialize) */
|
||||||
void AddDropSpenserDir(int & a_BlockX, int & a_BlockY, int & a_BlockZ, NIBBLETYPE a_Direction);
|
void AddDropSpenserDir(int & a_BlockX, int & a_BlockY, int & a_BlockZ, NIBBLETYPE a_Direction);
|
||||||
|
|
||||||
/// Sets the dropspenser to dropspense an item in the next tick
|
/** Sets the dropspenser to dropspense an item in the next tick */
|
||||||
void Activate(void);
|
void Activate(void);
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
/// Sets the internal redstone power flag to "on" or "off", depending on the parameter. Calls Activate() if appropriate
|
/** Sets the internal redstone power flag to "on" or "off", depending on the parameter. Calls Activate() if appropriate */
|
||||||
virtual void SetRedstonePower(bool a_IsPowered) override;
|
virtual void SetRedstonePower(bool a_IsPowered) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool m_ShouldDropSpense; ///< If true, the dropspenser will dropspense an item in the next tick
|
bool m_ShouldDropSpense; ///< If true, the dropspenser will dropspense an item in the next tick
|
||||||
bool m_IsPowered; ///< Set to true when the dropspenser receives redstone power.
|
bool m_IsPowered; ///< Set to true when the dropspenser receives redstone power.
|
||||||
|
|
||||||
/// Does the actual work on dropspensing an item. Chooses the slot, calls DropSpenseFromSlot() and handles smoke / sound effects
|
/** Does the actual work on dropspensing an item. Chooses the slot, calls DropSpenseFromSlot() and handles smoke / sound effects */
|
||||||
void DropSpense(cChunk & a_Chunk);
|
void DropSpense(cChunk & a_Chunk);
|
||||||
|
|
||||||
/// Override this function to provide the specific behavior for item dropspensing (drop / shoot / pour / ...)
|
/** Override this function to provide the specific behavior for item dropspensing (drop / shoot / pour / ...) */
|
||||||
virtual void DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum) = 0;
|
virtual void DropSpenseFromSlot(cChunk & a_Chunk, int a_SlotNum) = 0;
|
||||||
|
|
||||||
/// Helper function, drops one item from the specified slot (like a dropper)
|
/** Helper function, drops one item from the specified slot (like a dropper) */
|
||||||
void DropFromSlot(cChunk & a_Chunk, int a_SlotNum);
|
void DropFromSlot(cChunk & a_Chunk, int a_SlotNum);
|
||||||
} ; // tolua_export
|
} ; // tolua_export
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ public:
|
|||||||
|
|
||||||
BLOCKENTITY_PROTODEF(cDropperEntity)
|
BLOCKENTITY_PROTODEF(cDropperEntity)
|
||||||
|
|
||||||
/// Constructor used for normal operation
|
/** Constructor used for normal operation */
|
||||||
cDropperEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World);
|
cDropperEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -36,8 +36,7 @@ protected:
|
|||||||
|
|
||||||
/** Takes an item from slot a_SlotNum and puts it into the container in front of the dropper.
|
/** Takes an item from slot a_SlotNum and puts it into the container in front of the dropper.
|
||||||
Called when there's a container directly in front of the dropper,
|
Called when there's a container directly in front of the dropper,
|
||||||
so the dropper should store items there, rather than dropping.
|
so the dropper should store items there, rather than dropping. */
|
||||||
*/
|
|
||||||
void PutIntoContainer(cChunk & a_Chunk, int a_SlotNum, BLOCKTYPE a_ContainerBlock, int a_ContainerX, int a_ContainerY, int a_ContainerZ);
|
void PutIntoContainer(cChunk & a_Chunk, int a_SlotNum, BLOCKTYPE a_ContainerBlock, int a_ContainerX, int a_ContainerY, int a_ContainerZ);
|
||||||
} ; // tolua_export
|
} ; // tolua_export
|
||||||
|
|
||||||
|
@ -28,9 +28,6 @@ cHopperEntity::cHopperEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld *
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Returns the block coords of the block receiving the output items, based on the meta
|
|
||||||
Returns false if unattached
|
|
||||||
*/
|
|
||||||
bool cHopperEntity::GetOutputBlockPos(NIBBLETYPE a_BlockMeta, int & a_OutputX, int & a_OutputY, int & a_OutputZ)
|
bool cHopperEntity::GetOutputBlockPos(NIBBLETYPE a_BlockMeta, int & a_OutputX, int & a_OutputY, int & a_OutputZ)
|
||||||
{
|
{
|
||||||
a_OutputX = m_PosX;
|
a_OutputX = m_PosX;
|
||||||
@ -115,7 +112,6 @@ void cHopperEntity::UsedBy(cPlayer * a_Player)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Opens a new window UI for this hopper
|
|
||||||
void cHopperEntity::OpenNewWindow(void)
|
void cHopperEntity::OpenNewWindow(void)
|
||||||
{
|
{
|
||||||
OpenWindow(new cHopperWindow(m_PosX, m_PosY, m_PosZ, this));
|
OpenWindow(new cHopperWindow(m_PosX, m_PosY, m_PosZ, this));
|
||||||
@ -125,7 +121,6 @@ void cHopperEntity::OpenNewWindow(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Moves items from the container above it into this hopper. Returns true if the contents have changed.
|
|
||||||
bool cHopperEntity::MoveItemsIn(cChunk & a_Chunk, Int64 a_CurrentTick)
|
bool cHopperEntity::MoveItemsIn(cChunk & a_Chunk, Int64 a_CurrentTick)
|
||||||
{
|
{
|
||||||
if (m_PosY >= cChunkDef::Height)
|
if (m_PosY >= cChunkDef::Height)
|
||||||
@ -180,7 +175,6 @@ bool cHopperEntity::MoveItemsIn(cChunk & a_Chunk, Int64 a_CurrentTick)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Moves pickups from above this hopper into it. Returns true if the contents have changed.
|
|
||||||
bool cHopperEntity::MovePickupsIn(cChunk & a_Chunk, Int64 a_CurrentTick)
|
bool cHopperEntity::MovePickupsIn(cChunk & a_Chunk, Int64 a_CurrentTick)
|
||||||
{
|
{
|
||||||
UNUSED(a_CurrentTick);
|
UNUSED(a_CurrentTick);
|
||||||
@ -273,7 +267,6 @@ bool cHopperEntity::MovePickupsIn(cChunk & a_Chunk, Int64 a_CurrentTick)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Moves items out from this hopper into the destination. Returns true if the contents have changed.
|
|
||||||
bool cHopperEntity::MoveItemsOut(cChunk & a_Chunk, Int64 a_CurrentTick)
|
bool cHopperEntity::MoveItemsOut(cChunk & a_Chunk, Int64 a_CurrentTick)
|
||||||
{
|
{
|
||||||
if (a_CurrentTick - m_LastMoveItemsOutTick < TICKS_PER_TRANSFER)
|
if (a_CurrentTick - m_LastMoveItemsOutTick < TICKS_PER_TRANSFER)
|
||||||
@ -352,7 +345,6 @@ bool cHopperEntity::MoveItemsOut(cChunk & a_Chunk, Int64 a_CurrentTick)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Moves items from a chest (dblchest) above the hopper into this hopper. Returns true if contents have changed.
|
|
||||||
bool cHopperEntity::MoveItemsFromChest(cChunk & a_Chunk)
|
bool cHopperEntity::MoveItemsFromChest(cChunk & a_Chunk)
|
||||||
{
|
{
|
||||||
cChestEntity * MainChest = static_cast<cChestEntity *>(a_Chunk.GetBlockEntity(m_PosX, m_PosY + 1, m_PosZ));
|
cChestEntity * MainChest = static_cast<cChestEntity *>(a_Chunk.GetBlockEntity(m_PosX, m_PosY + 1, m_PosZ));
|
||||||
@ -419,7 +411,6 @@ bool cHopperEntity::MoveItemsFromChest(cChunk & a_Chunk)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Moves items from a furnace above the hopper into this hopper. Returns true if contents have changed.
|
|
||||||
bool cHopperEntity::MoveItemsFromFurnace(cChunk & a_Chunk)
|
bool cHopperEntity::MoveItemsFromFurnace(cChunk & a_Chunk)
|
||||||
{
|
{
|
||||||
cFurnaceEntity * Furnace = static_cast<cFurnaceEntity *>(a_Chunk.GetBlockEntity(m_PosX, m_PosY + 1, m_PosZ));
|
cFurnaceEntity * Furnace = static_cast<cFurnaceEntity *>(a_Chunk.GetBlockEntity(m_PosX, m_PosY + 1, m_PosZ));
|
||||||
@ -479,7 +470,6 @@ bool cHopperEntity::MoveItemsFromGrid(cBlockEntityWithItems & a_Entity)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Moves one piece of the specified a_Entity's slot itemstack into this hopper. Returns true if contents have changed. Doesn't change the itemstack.
|
|
||||||
bool cHopperEntity::MoveItemsFromSlot(cBlockEntityWithItems & a_Entity, int a_SlotNum)
|
bool cHopperEntity::MoveItemsFromSlot(cBlockEntityWithItems & a_Entity, int a_SlotNum)
|
||||||
{
|
{
|
||||||
cItem One(a_Entity.GetSlot(a_SlotNum).CopyOne());
|
cItem One(a_Entity.GetSlot(a_SlotNum).CopyOne());
|
||||||
@ -521,7 +511,6 @@ bool cHopperEntity::MoveItemsFromSlot(cBlockEntityWithItems & a_Entity, int a_Sl
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Moves items to the chest at the specified coords. Returns true if contents have changed
|
|
||||||
bool cHopperEntity::MoveItemsToChest(cChunk & a_Chunk, int a_BlockX, int a_BlockY, int a_BlockZ)
|
bool cHopperEntity::MoveItemsToChest(cChunk & a_Chunk, int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||||
{
|
{
|
||||||
// Try the chest directly connected to the hopper:
|
// Try the chest directly connected to the hopper:
|
||||||
@ -589,7 +578,6 @@ bool cHopperEntity::MoveItemsToChest(cChunk & a_Chunk, int a_BlockX, int a_Block
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Moves items to the furnace at the specified coords. Returns true if contents have changed
|
|
||||||
bool cHopperEntity::MoveItemsToFurnace(cChunk & a_Chunk, int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_HopperMeta)
|
bool cHopperEntity::MoveItemsToFurnace(cChunk & a_Chunk, int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_HopperMeta)
|
||||||
{
|
{
|
||||||
cFurnaceEntity * Furnace = static_cast<cFurnaceEntity *>(a_Chunk.GetBlockEntity(a_BlockX, a_BlockY, a_BlockZ));
|
cFurnaceEntity * Furnace = static_cast<cFurnaceEntity *>(a_Chunk.GetBlockEntity(a_BlockX, a_BlockY, a_BlockZ));
|
||||||
@ -674,3 +662,7 @@ bool cHopperEntity::MoveItemsToSlot(cBlockEntityWithItems & a_Entity, int a_DstS
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,13 +33,12 @@ public:
|
|||||||
|
|
||||||
BLOCKENTITY_PROTODEF(cHopperEntity)
|
BLOCKENTITY_PROTODEF(cHopperEntity)
|
||||||
|
|
||||||
/// Constructor used for normal operation
|
/** Constructor used for normal operation */
|
||||||
cHopperEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World);
|
cHopperEntity(int a_BlockX, int a_BlockY, int a_BlockZ, cWorld * a_World);
|
||||||
|
|
||||||
/** Returns the block coords of the block receiving the output items, based on the meta
|
/** Returns the block coords of the block receiving the output items, based on the meta
|
||||||
Returns false if unattached.
|
Returns false if unattached.
|
||||||
Exported in ManualBindings.cpp
|
Exported in ManualBindings.cpp. */
|
||||||
*/
|
|
||||||
bool GetOutputBlockPos(NIBBLETYPE a_BlockMeta, int & a_OutputX, int & a_OutputY, int & a_OutputZ);
|
bool GetOutputBlockPos(NIBBLETYPE a_BlockMeta, int & a_OutputX, int & a_OutputY, int & a_OutputZ);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -52,40 +51,40 @@ protected:
|
|||||||
virtual void SendTo(cClientHandle & a_Client) override;
|
virtual void SendTo(cClientHandle & a_Client) override;
|
||||||
virtual void UsedBy(cPlayer * a_Player) override;
|
virtual void UsedBy(cPlayer * a_Player) override;
|
||||||
|
|
||||||
/// Opens a new chest window for this chest. Scans for neighbors to open a double chest window, if appropriate.
|
/** Opens a new chest window for this chest. Scans for neighbors to open a double chest window, if appropriate. */
|
||||||
void OpenNewWindow(void);
|
void OpenNewWindow(void);
|
||||||
|
|
||||||
/// Moves items from the container above it into this hopper. Returns true if the contents have changed.
|
/** Moves items from the container above it into this hopper. Returns true if the contents have changed. */
|
||||||
bool MoveItemsIn(cChunk & a_Chunk, Int64 a_CurrentTick);
|
bool MoveItemsIn(cChunk & a_Chunk, Int64 a_CurrentTick);
|
||||||
|
|
||||||
/// Moves pickups from above this hopper into it. Returns true if the contents have changed.
|
/** Moves pickups from above this hopper into it. Returns true if the contents have changed. */
|
||||||
bool MovePickupsIn(cChunk & a_Chunk, Int64 a_CurrentTick);
|
bool MovePickupsIn(cChunk & a_Chunk, Int64 a_CurrentTick);
|
||||||
|
|
||||||
/// Moves items out from this hopper into the destination. Returns true if the contents have changed.
|
/** Moves items out from this hopper into the destination. Returns true if the contents have changed. */
|
||||||
bool MoveItemsOut(cChunk & a_Chunk, Int64 a_CurrentTick);
|
bool MoveItemsOut(cChunk & a_Chunk, Int64 a_CurrentTick);
|
||||||
|
|
||||||
/// Moves items from a chest (dblchest) above the hopper into this hopper. Returns true if contents have changed.
|
/** Moves items from a chest (dblchest) above the hopper into this hopper. Returns true if contents have changed. */
|
||||||
bool MoveItemsFromChest(cChunk & a_Chunk);
|
bool MoveItemsFromChest(cChunk & a_Chunk);
|
||||||
|
|
||||||
/// Moves items from a furnace above the hopper into this hopper. Returns true if contents have changed.
|
/** Moves items from a furnace above the hopper into this hopper. Returns true if contents have changed. */
|
||||||
bool MoveItemsFromFurnace(cChunk & a_Chunk);
|
bool MoveItemsFromFurnace(cChunk & a_Chunk);
|
||||||
|
|
||||||
/// Moves items from the specified a_Entity's Contents into this hopper. Returns true if contents have changed.
|
/** Moves items from the specified a_Entity's Contents into this hopper. Returns true if contents have changed. */
|
||||||
bool MoveItemsFromGrid(cBlockEntityWithItems & a_Entity);
|
bool MoveItemsFromGrid(cBlockEntityWithItems & a_Entity);
|
||||||
|
|
||||||
/// Moves one piece from the specified itemstack into this hopper. Returns true if contents have changed. Doesn't change the itemstack.
|
/** Moves one piece from the specified itemstack into this hopper. Returns true if contents have changed. Doesn't change the itemstack. */
|
||||||
bool MoveItemsFromSlot(cBlockEntityWithItems & a_Entity, int a_SrcSlotNum);
|
bool MoveItemsFromSlot(cBlockEntityWithItems & a_Entity, int a_SrcSlotNum);
|
||||||
|
|
||||||
/// Moves items to the chest at the specified coords. Returns true if contents have changed
|
/** Moves items to the chest at the specified coords. Returns true if contents have changed */
|
||||||
bool MoveItemsToChest(cChunk & a_Chunk, int a_BlockX, int a_BlockY, int a_BlockZ);
|
bool MoveItemsToChest(cChunk & a_Chunk, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||||
|
|
||||||
/// Moves items to the furnace at the specified coords. Returns true if contents have changed
|
/** Moves items to the furnace at the specified coords. Returns true if contents have changed */
|
||||||
bool MoveItemsToFurnace(cChunk & a_Chunk, int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_HopperMeta);
|
bool MoveItemsToFurnace(cChunk & a_Chunk, int a_BlockX, int a_BlockY, int a_BlockZ, NIBBLETYPE a_HopperMeta);
|
||||||
|
|
||||||
/// Moves items to the specified ItemGrid. Returns true if contents have changed
|
/** Moves items to the specified ItemGrid. Returns true if contents have changed */
|
||||||
bool MoveItemsToGrid(cBlockEntityWithItems & a_Entity);
|
bool MoveItemsToGrid(cBlockEntityWithItems & a_Entity);
|
||||||
|
|
||||||
/// Moves one piece to the specified entity's contents' slot. Returns true if contents have changed.
|
/** Moves one piece to the specified entity's contents' slot. Returns true if contents have changed. */
|
||||||
bool MoveItemsToSlot(cBlockEntityWithItems & a_Entity, int a_DstSlotNum);
|
bool MoveItemsToSlot(cBlockEntityWithItems & a_Entity, int a_DstSlotNum);
|
||||||
} ; // tolua_export
|
} ; // tolua_export
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ public:
|
|||||||
|
|
||||||
BLOCKENTITY_PROTODEF(cNoteEntity)
|
BLOCKENTITY_PROTODEF(cNoteEntity)
|
||||||
|
|
||||||
/// Creates a new note entity. a_World may be nullptr
|
/** Creates a new note entity. a_World may be nullptr */
|
||||||
cNoteEntity(int a_X, int a_Y, int a_Z, cWorld * a_World);
|
cNoteEntity(int a_X, int a_Y, int a_Z, cWorld * a_World);
|
||||||
virtual ~cNoteEntity() {}
|
virtual ~cNoteEntity() {}
|
||||||
|
|
||||||
|
@ -27,18 +27,18 @@ public:
|
|||||||
|
|
||||||
BLOCKENTITY_PROTODEF(cSignEntity)
|
BLOCKENTITY_PROTODEF(cSignEntity)
|
||||||
|
|
||||||
/// Creates a new empty sign entity at the specified block coords and block type (wall or standing). a_World may be nullptr
|
/** Creates a new empty sign entity at the specified block coords and block type (wall or standing). a_World may be nullptr */
|
||||||
cSignEntity(BLOCKTYPE a_BlockType, int a_X, int a_Y, int a_Z, cWorld * a_World);
|
cSignEntity(BLOCKTYPE a_BlockType, int a_X, int a_Y, int a_Z, cWorld * a_World);
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
/// Sets all the sign's lines
|
/** Sets all the sign's lines */
|
||||||
void SetLines(const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4);
|
void SetLines(const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4);
|
||||||
|
|
||||||
/// Sets individual line (zero-based index)
|
/** Sets individual line (zero-based index) */
|
||||||
void SetLine(int a_Index, const AString & a_Line);
|
void SetLine(int a_Index, const AString & a_Line);
|
||||||
|
|
||||||
/// Retrieves individual line (zero-based index)
|
/** Retrieves individual line (zero-based index) */
|
||||||
AString GetLine(int a_Index) const;
|
AString GetLine(int a_Index) const;
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
@ -364,7 +364,7 @@ AString DimensionToString(eDimension a_Dimension)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Translates damage type constant to a string representation (built-in).
|
/** Translates damage type constant to a string representation (built-in) */
|
||||||
AString DamageTypeToString(eDamageType a_DamageType)
|
AString DamageTypeToString(eDamageType a_DamageType)
|
||||||
{
|
{
|
||||||
// Make sure to keep this alpha-sorted.
|
// Make sure to keep this alpha-sorted.
|
||||||
@ -399,7 +399,8 @@ AString DamageTypeToString(eDamageType a_DamageType)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Translates a damage type string to damage type. Takes either a number or a damage type alias (built-in). Returns -1 on failure
|
/** Translates a damage type string to damage type. Takes either a number or a damage type alias (built-in).
|
||||||
|
Returns -1 on failure. */
|
||||||
eDamageType StringToDamageType(const AString & a_DamageTypeString)
|
eDamageType StringToDamageType(const AString & a_DamageTypeString)
|
||||||
{
|
{
|
||||||
// First try decoding as a number:
|
// First try decoding as a number:
|
||||||
|
@ -982,7 +982,7 @@ enum
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Dimension of a world
|
/** Dimension of a world */
|
||||||
enum eDimension
|
enum eDimension
|
||||||
{
|
{
|
||||||
dimNether = -1,
|
dimNether = -1,
|
||||||
@ -995,7 +995,7 @@ enum eDimension
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Damage type, used in the TakeDamageInfo structure and related functions
|
/** Damage type, used in the TakeDamageInfo structure and related functions */
|
||||||
enum eDamageType
|
enum eDamageType
|
||||||
{
|
{
|
||||||
// Canonical names for the types (as documented in the plugin wiki):
|
// Canonical names for the types (as documented in the plugin wiki):
|
||||||
@ -1099,36 +1099,35 @@ class cIniFile;
|
|||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
/// Translates a blocktype string into blocktype. Takes either a number or an items.ini alias as input. Returns -1 on failure.
|
/** Translates a blocktype string into blocktype. Takes either a number or an items.ini alias as input. Returns -1 on failure. */
|
||||||
extern int BlockStringToType(const AString & a_BlockTypeString);
|
extern int BlockStringToType(const AString & a_BlockTypeString);
|
||||||
|
|
||||||
/// Translates an itemtype string into an item. Takes either a number, number^number, number:number or an items.ini alias as input. Returns true if successful.
|
/** Translates an itemtype string into an item. Takes either a number, number^number, number:number or an items.ini alias as input. Returns true if successful. */
|
||||||
extern bool StringToItem(const AString & a_ItemTypeString, cItem & a_Item);
|
extern bool StringToItem(const AString & a_ItemTypeString, cItem & a_Item);
|
||||||
|
|
||||||
/// Translates a full item into a string. If the ItemType is not recognized, the ItemType number is output into the string.
|
/** Translates a full item into a string. If the ItemType is not recognized, the ItemType number is output into the string. */
|
||||||
extern AString ItemToString(const cItem & a_Item);
|
extern AString ItemToString(const cItem & a_Item);
|
||||||
|
|
||||||
/// Translates itemtype into a string. If the type is not recognized, the itemtype number is output into the string.
|
/** Translates itemtype into a string. If the type is not recognized, the itemtype number is output into the string. */
|
||||||
extern AString ItemTypeToString(short a_ItemType);
|
extern AString ItemTypeToString(short a_ItemType);
|
||||||
|
|
||||||
/// Translates a full item into a fully-specified string (including meta and count). If the ItemType is not recognized, the ItemType number is output into the string.
|
/** Translates a full item into a fully-specified string (including meta and count). If the ItemType is not recognized, the ItemType number is output into the string. */
|
||||||
extern AString ItemToFullString(const cItem & a_Item);
|
extern AString ItemToFullString(const cItem & a_Item);
|
||||||
|
|
||||||
/// Translates a dimension string to dimension enum. Takes either a number or a dimension alias (built-in). Returns dimOverworld on failure
|
/** Translates a dimension string to dimension enum. Takes either a number or a dimension alias (built-in). Returns dimOverworld on failure */
|
||||||
extern eDimension StringToDimension(const AString & a_DimensionString);
|
extern eDimension StringToDimension(const AString & a_DimensionString);
|
||||||
|
|
||||||
/** Translates a dimension enum to dimension string.
|
/** Translates a dimension enum to dimension string.
|
||||||
Takes an eDimension enum value and returns "Overworld" on failure
|
Takes an eDimension enum value and returns "Overworld" on failure. */
|
||||||
*/
|
|
||||||
extern AString DimensionToString(eDimension a_Dimension);
|
extern AString DimensionToString(eDimension a_Dimension);
|
||||||
|
|
||||||
/// Translates damage type constant to a string representation (built-in).
|
/** Translates damage type constant to a string representation (built-in). */
|
||||||
extern AString DamageTypeToString(eDamageType a_DamageType);
|
extern AString DamageTypeToString(eDamageType a_DamageType);
|
||||||
|
|
||||||
/// Translates a damage type string to damage type. Takes either a number or a damage type alias (built-in). Returns -1 on failure
|
/** Translates a damage type string to damage type. Takes either a number or a damage type alias (built-in). Returns -1 on failure */
|
||||||
extern eDamageType StringToDamageType(const AString & a_DamageString);
|
extern eDamageType StringToDamageType(const AString & a_DamageString);
|
||||||
|
|
||||||
/// Returns a cItem representing the item described in an IniFile's value; if the value doesn't exist, creates it with the provided default.
|
/** Returns a cItem representing the item described in an IniFile's value; if the value doesn't exist, creates it with the provided default. */
|
||||||
extern cItem GetIniItemSet(cIniFile & a_IniFile, const char * a_Section, const char * a_Key, const char * a_Default);
|
extern cItem GetIniItemSet(cIniFile & a_IniFile, const char * a_Section, const char * a_Key, const char * a_Default);
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
@ -88,7 +88,7 @@ public:
|
|||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
/// Creates the BlockTracer parent with the specified callbacks
|
/** Creates the BlockTracer parent with the specified callbacks */
|
||||||
cBlockTracer(cWorld & a_World, cCallbacks & a_Callbacks) :
|
cBlockTracer(cWorld & a_World, cCallbacks & a_Callbacks) :
|
||||||
m_World(&a_World),
|
m_World(&a_World),
|
||||||
m_Callbacks(&a_Callbacks)
|
m_Callbacks(&a_Callbacks)
|
||||||
@ -96,7 +96,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Sets new world, returns the old one. Note that both need to be valid
|
/** Sets new world, returns the old one. Note that both need to be valid */
|
||||||
cWorld & SetWorld(cWorld & a_World)
|
cWorld & SetWorld(cWorld & a_World)
|
||||||
{
|
{
|
||||||
cWorld & Old = *m_World;
|
cWorld & Old = *m_World;
|
||||||
@ -105,7 +105,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Sets new callbacks, returns the old ones. Note that both need to be valid
|
/** Sets new callbacks, returns the old ones. Note that both need to be valid */
|
||||||
cCallbacks & SetCallbacks(cCallbacks & a_NewCallbacks)
|
cCallbacks & SetCallbacks(cCallbacks & a_NewCallbacks)
|
||||||
{
|
{
|
||||||
cCallbacks & Old = *m_Callbacks;
|
cCallbacks & Old = *m_Callbacks;
|
||||||
@ -114,10 +114,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// The world upon which to operate
|
/** The world upon which to operate */
|
||||||
cWorld * m_World;
|
cWorld * m_World;
|
||||||
|
|
||||||
/// The callback to use for reporting
|
/** The callback to use for reporting */
|
||||||
cCallbacks * m_Callbacks;
|
cCallbacks * m_Callbacks;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -26,15 +26,14 @@ public:
|
|||||||
|
|
||||||
virtual ~cBlockHandler() {}
|
virtual ~cBlockHandler() {}
|
||||||
|
|
||||||
/// Called when the block gets ticked either by a random tick or by a queued tick.
|
/** Called when the block gets ticked either by a random tick or by a queued tick.
|
||||||
/// Note that the coords are chunk-relative!
|
Note that the coords are chunk-relative! */
|
||||||
virtual void OnUpdate(cChunkInterface & cChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cChunk & a_Chunk, int a_RelX, int a_RelY, int a_RelZ);
|
virtual void OnUpdate(cChunkInterface & cChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cChunk & a_Chunk, int a_RelX, int a_RelY, int a_RelZ);
|
||||||
|
|
||||||
/** Called before a block is placed into a world.
|
/** Called before a block is placed into a world.
|
||||||
The handler should return true to allow placement, false to refuse.
|
The handler should return true to allow placement, false to refuse.
|
||||||
Also, the handler should set a_BlockType and a_BlockMeta to correct values for the newly placed block.
|
Also, the handler should set a_BlockType and a_BlockMeta to correct values for the newly placed block.
|
||||||
Called by cItemHandler::GetPlacementBlockTypeMeta() if the item is a block
|
Called by cItemHandler::GetPlacementBlockTypeMeta() if the item is a block */
|
||||||
*/
|
|
||||||
virtual bool GetPlacementBlockTypeMeta(
|
virtual bool GetPlacementBlockTypeMeta(
|
||||||
cChunkInterface & a_ChunkInterface, cPlayer * a_Player,
|
cChunkInterface & a_ChunkInterface, cPlayer * a_Player,
|
||||||
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace,
|
int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace,
|
||||||
@ -50,10 +49,10 @@ public:
|
|||||||
cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, const sSetBlock & a_BlockChange
|
cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, const sSetBlock & a_BlockChange
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Called before the player has destroyed a block
|
/** Called before the player has destroyed a block */
|
||||||
virtual void OnDestroyedByPlayer(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ);
|
virtual void OnDestroyedByPlayer(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||||
|
|
||||||
/// Called before a block gets destroyed / replaced with air
|
/** Called before a block gets destroyed / replaced with air */
|
||||||
virtual void OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ);
|
virtual void OnDestroyed(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||||
|
|
||||||
/** Called when a direct neighbor of this block has been changed (The position is the block's own position, not the changing neighbor's position)
|
/** Called when a direct neighbor of this block has been changed (The position is the block's own position, not the changing neighbor's position)
|
||||||
@ -71,13 +70,13 @@ public:
|
|||||||
/** Called when the player starts digging the block. */
|
/** Called when the player starts digging the block. */
|
||||||
virtual void OnDigging(cChunkInterface & cChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) {}
|
virtual void OnDigging(cChunkInterface & cChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ) {}
|
||||||
|
|
||||||
/// Called if the user right clicks the block and the block is useable
|
/** Called if the user right clicks the block and the block is useable */
|
||||||
virtual void OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) {}
|
virtual void OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) {}
|
||||||
|
|
||||||
/** Called when a right click to this block is cancelled */
|
/** Called when a right click to this block is cancelled */
|
||||||
virtual void OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) {}
|
virtual void OnCancelRightClick(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace) {}
|
||||||
|
|
||||||
/// <summary>Called when the item is mined to convert it into pickups. Pickups may specify multiple items. Appends items to a_Pickups, preserves its original contents</summary>
|
/** Called when the item is mined to convert it into pickups. Pickups may specify multiple items. Appends items to a_Pickups, preserves its original contents */
|
||||||
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta);
|
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta);
|
||||||
|
|
||||||
/** Handles the dropping, but not destruction, of a block based on what ConvertTo(Verbatim)Pickups() returns, including the spawning of pickups and alertion of plugins
|
/** Handles the dropping, but not destruction, of a block based on what ConvertTo(Verbatim)Pickups() returns, including the spawning of pickups and alertion of plugins
|
||||||
@ -87,7 +86,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual void DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, bool a_CanDrop = true);
|
virtual void DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_BlockPluginInterface, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, bool a_CanDrop = true);
|
||||||
|
|
||||||
/// Checks if the block can stay at the specified relative coords in the chunk
|
/** Checks if the block can stay at the specified relative coords in the chunk */
|
||||||
virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk);
|
virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk);
|
||||||
|
|
||||||
/** Checks if the block can be placed at this point.
|
/** Checks if the block can be placed at this point.
|
||||||
@ -130,24 +129,24 @@ public:
|
|||||||
/** Returns the base colour ID of the block, as will be represented on a map, as per documentation: http://minecraft.gamepedia.com/Map_item_format */
|
/** Returns the base colour ID of the block, as will be represented on a map, as per documentation: http://minecraft.gamepedia.com/Map_item_format */
|
||||||
virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta);
|
virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta);
|
||||||
|
|
||||||
/// <summary>Rotates a given block meta counter-clockwise. Default: no change</summary>
|
/** Rotates a given block meta counter-clockwise. Default: no change
|
||||||
/// <returns>Block meta following rotation</returns>
|
Returns block meta following rotation */
|
||||||
virtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) { return a_Meta; }
|
virtual NIBBLETYPE MetaRotateCCW(NIBBLETYPE a_Meta) { return a_Meta; }
|
||||||
|
|
||||||
/// <summary>Rotates a given block meta clockwise. Default: no change</summary>
|
/** Rotates a given block meta clockwise. Default: no change
|
||||||
/// <returns>Block meta following rotation</returns>
|
Returns block meta following rotation */
|
||||||
virtual NIBBLETYPE MetaRotateCW(NIBBLETYPE a_Meta) { return a_Meta; }
|
virtual NIBBLETYPE MetaRotateCW(NIBBLETYPE a_Meta) { return a_Meta; }
|
||||||
|
|
||||||
/// <summary>Mirros a given block meta around the XY plane. Default: no change</summary>
|
/** Mirrors a given block meta around the XY plane. Default: no change
|
||||||
/// <returns>Block meta following mirroring</returns>
|
Returns block meta following rotation */
|
||||||
virtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta) { return a_Meta; }
|
virtual NIBBLETYPE MetaMirrorXY(NIBBLETYPE a_Meta) { return a_Meta; }
|
||||||
|
|
||||||
/// <summary>Mirros a given block meta around the XZ plane. Default: no change</summary>
|
/** Mirros a given block meta around the XZ plane. Default: no change
|
||||||
/// <returns>Block meta following mirroring</returns>
|
Returns block meta following rotation */
|
||||||
virtual NIBBLETYPE MetaMirrorXZ(NIBBLETYPE a_Meta) { return a_Meta; }
|
virtual NIBBLETYPE MetaMirrorXZ(NIBBLETYPE a_Meta) { return a_Meta; }
|
||||||
|
|
||||||
/// <summary>Mirros a given block meta around the YZ plane. Default: no change</summary>
|
/** Mirros a given block meta around the YZ plane. Default: no change
|
||||||
/// <returns>Block meta following mirroring</returns>
|
Returns block meta following rotation */
|
||||||
virtual NIBBLETYPE MetaMirrorYZ(NIBBLETYPE a_Meta) { return a_Meta; }
|
virtual NIBBLETYPE MetaMirrorYZ(NIBBLETYPE a_Meta) { return a_Meta; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -90,13 +90,13 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/// Returns true if the piston (specified by blocktype) is a sticky piston
|
/** Returns true if the piston (specified by blocktype) is a sticky piston */
|
||||||
static inline bool IsSticky(BLOCKTYPE a_BlockType) { return (a_BlockType == E_BLOCK_STICKY_PISTON); }
|
static inline bool IsSticky(BLOCKTYPE a_BlockType) { return (a_BlockType == E_BLOCK_STICKY_PISTON); }
|
||||||
|
|
||||||
/// Returns true if the piston (with the specified meta) is extended
|
/** Returns true if the piston (with the specified meta) is extended */
|
||||||
static inline bool IsExtended(NIBBLETYPE a_PistonMeta) { return ((a_PistonMeta & 0x8) != 0x0); }
|
static inline bool IsExtended(NIBBLETYPE a_PistonMeta) { return ((a_PistonMeta & 0x8) != 0x0); }
|
||||||
|
|
||||||
/// Returns true if the specified block can be pushed by a piston (and left intact)
|
/** Returns true if the specified block can be pushed by a piston (and left intact) */
|
||||||
static inline bool CanPush(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
|
static inline bool CanPush(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
|
||||||
{
|
{
|
||||||
switch (a_BlockType)
|
switch (a_BlockType)
|
||||||
@ -141,7 +141,7 @@ private:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns true if the specified block can be pulled by a sticky piston
|
/** Returns true if the specified block can be pulled by a sticky piston */
|
||||||
static inline bool CanPull(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
|
static inline bool CanPull(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
|
||||||
{
|
{
|
||||||
if (cBlockInfo::IsPistonBreakable(a_BlockType))
|
if (cBlockInfo::IsPistonBreakable(a_BlockType))
|
||||||
@ -152,7 +152,7 @@ private:
|
|||||||
return CanPush(a_BlockType, a_BlockMeta);
|
return CanPush(a_BlockType, a_BlockMeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns how many blocks the piston has to push (where the first free space is); < 0 when unpushable
|
/** Returns how many blocks the piston has to push (where the first free space is); < 0 when unpushable */
|
||||||
static int FirstPassthroughBlock(int a_PistonX, int a_PistonY, int a_PistonZ, NIBBLETYPE a_PistonMeta, cWorld * a_World);
|
static int FirstPassthroughBlock(int a_PistonX, int a_PistonY, int a_PistonZ, NIBBLETYPE a_PistonMeta, cWorld * a_World);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -20,8 +20,7 @@
|
|||||||
/** Represents two sets of coords, minimum and maximum for each direction.
|
/** Represents two sets of coords, minimum and maximum for each direction.
|
||||||
All the coords within those limits (inclusive the edges) are considered "inside" the box.
|
All the coords within those limits (inclusive the edges) are considered "inside" the box.
|
||||||
For intersection purposes, though, if the intersection is "sharp" in any coord (i. e. zero volume),
|
For intersection purposes, though, if the intersection is "sharp" in any coord (i. e. zero volume),
|
||||||
the boxes are considered non-intersecting.
|
the boxes are considered non-intersecting. */
|
||||||
*/
|
|
||||||
class cBoundingBox
|
class cBoundingBox
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -30,54 +29,52 @@ public:
|
|||||||
cBoundingBox(const Vector3d & a_Pos, double a_Radius, double a_Height);
|
cBoundingBox(const Vector3d & a_Pos, double a_Radius, double a_Height);
|
||||||
cBoundingBox(const cBoundingBox & a_Orig);
|
cBoundingBox(const cBoundingBox & a_Orig);
|
||||||
|
|
||||||
/// Moves the entire boundingbox by the specified offset
|
/** Moves the entire boundingbox by the specified offset */
|
||||||
void Move(double a_OffX, double a_OffY, double a_OffZ);
|
void Move(double a_OffX, double a_OffY, double a_OffZ);
|
||||||
|
|
||||||
/// Moves the entire boundingbox by the specified offset
|
/** Moves the entire boundingbox by the specified offset */
|
||||||
void Move(const Vector3d & a_Off);
|
void Move(const Vector3d & a_Off);
|
||||||
|
|
||||||
/// Expands the bounding box by the specified amount in each direction (so the box becomes larger by 2 * Expand in each direction)
|
/** Expands the bounding box by the specified amount in each direction (so the box becomes larger by 2 * Expand in each direction) */
|
||||||
void Expand(double a_ExpandX, double a_ExpandY, double a_ExpandZ);
|
void Expand(double a_ExpandX, double a_ExpandY, double a_ExpandZ);
|
||||||
|
|
||||||
/// Returns true if the two bounding boxes intersect
|
/** Returns true if the two bounding boxes intersect */
|
||||||
bool DoesIntersect(const cBoundingBox & a_Other);
|
bool DoesIntersect(const cBoundingBox & a_Other);
|
||||||
|
|
||||||
/// Returns the union of the two bounding boxes
|
/** Returns the union of the two bounding boxes */
|
||||||
cBoundingBox Union(const cBoundingBox & a_Other);
|
cBoundingBox Union(const cBoundingBox & a_Other);
|
||||||
|
|
||||||
/// Returns true if the point is inside the bounding box
|
/** Returns true if the point is inside the bounding box */
|
||||||
bool IsInside(const Vector3d & a_Point);
|
bool IsInside(const Vector3d & a_Point);
|
||||||
|
|
||||||
/// Returns true if the point is inside the bounding box
|
/** Returns true if the point is inside the bounding box */
|
||||||
bool IsInside(double a_X, double a_Y, double a_Z);
|
bool IsInside(double a_X, double a_Y, double a_Z);
|
||||||
|
|
||||||
/// Returns true if a_Other is inside this bounding box
|
/** Returns true if a_Other is inside this bounding box */
|
||||||
bool IsInside(cBoundingBox & a_Other);
|
bool IsInside(cBoundingBox & a_Other);
|
||||||
|
|
||||||
/// Returns true if a boundingbox specified by a_Min and a_Max is inside this bounding box
|
/** Returns true if a boundingbox specified by a_Min and a_Max is inside this bounding box */
|
||||||
bool IsInside(const Vector3d & a_Min, const Vector3d & a_Max);
|
bool IsInside(const Vector3d & a_Min, const Vector3d & a_Max);
|
||||||
|
|
||||||
/// Returns true if the specified point is inside the bounding box specified by its min / max corners
|
/** Returns true if the specified point is inside the bounding box specified by its min / max corners */
|
||||||
static bool IsInside(const Vector3d & a_Min, const Vector3d & a_Max, const Vector3d & a_Point);
|
static bool IsInside(const Vector3d & a_Min, const Vector3d & a_Max, const Vector3d & a_Point);
|
||||||
|
|
||||||
/// Returns true if the specified point is inside the bounding box specified by its min / max corners
|
/** Returns true if the specified point is inside the bounding box specified by its min / max corners */
|
||||||
static bool IsInside(const Vector3d & a_Min, const Vector3d & a_Max, double a_X, double a_Y, double a_Z);
|
static bool IsInside(const Vector3d & a_Min, const Vector3d & a_Max, double a_X, double a_Y, double a_Z);
|
||||||
|
|
||||||
/** Returns true if this bounding box is intersected by the line specified by its two points
|
/** Returns true if this bounding box is intersected by the line specified by its two points
|
||||||
Also calculates the distance along the line in which the intersection occurs (0 .. 1)
|
Also calculates the distance along the line in which the intersection occurs (0 .. 1)
|
||||||
Only forward collisions (a_LineCoeff >= 0) are returned.
|
Only forward collisions (a_LineCoeff >= 0) are returned. */
|
||||||
*/
|
|
||||||
bool CalcLineIntersection(const Vector3d & a_Line1, const Vector3d & a_Line2, double & a_LineCoeff, eBlockFace & a_Face);
|
bool CalcLineIntersection(const Vector3d & a_Line1, const Vector3d & a_Line2, double & a_LineCoeff, eBlockFace & a_Face);
|
||||||
|
|
||||||
/** Returns true if the specified bounding box is intersected by the line specified by its two points
|
/** Returns true if the specified bounding box is intersected by the line specified by its two points
|
||||||
Also calculates the distance along the line in which the intersection occurs (0 .. 1) and the face hit (BLOCK_FACE_ constants)
|
Also calculates the distance along the line in which the intersection occurs (0 .. 1) and the face hit (BLOCK_FACE_ constants)
|
||||||
Only forward collisions (a_LineCoeff >= 0) are returned.
|
Only forward collisions (a_LineCoeff >= 0) are returned. */
|
||||||
*/
|
|
||||||
static bool CalcLineIntersection(const Vector3d & a_Min, const Vector3d & a_Max, const Vector3d & a_Line1, const Vector3d & a_Line2, double & a_LineCoeff, eBlockFace & a_Face);
|
static bool CalcLineIntersection(const Vector3d & a_Min, const Vector3d & a_Max, const Vector3d & a_Line1, const Vector3d & a_Line2, double & a_LineCoeff, eBlockFace & a_Face);
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
/// Calculates the intersection of the two bounding boxes; returns true if nonempty
|
/** Calculates the intersection of the two bounding boxes; returns true if nonempty */
|
||||||
bool Intersect(const cBoundingBox & a_Other, cBoundingBox & a_Intersection);
|
bool Intersect(const cBoundingBox & a_Other, cBoundingBox & a_Intersection);
|
||||||
|
|
||||||
double GetMinX(void) const { return m_Min.x; }
|
double GetMinX(void) const { return m_Min.x; }
|
||||||
|
@ -262,7 +262,6 @@ size_t cByteBuffer::GetFreeSpace(void) const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Returns the number of bytes that are currently in the ringbuffer. Note GetReadableBytes()
|
|
||||||
size_t cByteBuffer::GetUsedSpace(void) const
|
size_t cByteBuffer::GetUsedSpace(void) const
|
||||||
{
|
{
|
||||||
CHECK_THREAD
|
CHECK_THREAD
|
||||||
@ -276,7 +275,6 @@ size_t cByteBuffer::GetUsedSpace(void) const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Returns the number of bytes that are currently available for reading (may be less than UsedSpace due to some data having been read already)
|
|
||||||
size_t cByteBuffer::GetReadableSpace(void) const
|
size_t cByteBuffer::GetReadableSpace(void) const
|
||||||
{
|
{
|
||||||
CHECK_THREAD
|
CHECK_THREAD
|
||||||
|
@ -127,6 +127,18 @@ local g_ViolationPatterns =
|
|||||||
-- Check that all "//"-style comments have at least one spaces after:
|
-- Check that all "//"-style comments have at least one spaces after:
|
||||||
{"%s//[^%s/*<]", "Needs a space after a \"//\"-style comment"},
|
{"%s//[^%s/*<]", "Needs a space after a \"//\"-style comment"},
|
||||||
|
|
||||||
|
-- Check that doxy-comments are used only in the double-asterisk form:
|
||||||
|
{"/// ", "Use doxycomments in the form /** Comment */"},
|
||||||
|
|
||||||
|
-- Check that /* */ comments have whitespace around the insides:
|
||||||
|
{"%*%*/", "Wrong comment termination, use */"},
|
||||||
|
{"/%*[^%s*/\"]", "Needs a space after /*"}, -- Need to take care of the special "//*/" comment ends
|
||||||
|
{"/%*%*[^%s*<]", "Needs a space after /**"},
|
||||||
|
{"[^%s/*]%*/", "Needs a space before */"},
|
||||||
|
|
||||||
|
-- Check against MS XML doxycomments:
|
||||||
|
{"/%*%* <", "Remove the MS XML markers from comment"},
|
||||||
|
|
||||||
-- Check that all commas have spaces after them and not in front of them:
|
-- Check that all commas have spaces after them and not in front of them:
|
||||||
{" ,", "Extra space before a \",\""},
|
{" ,", "Extra space before a \",\""},
|
||||||
{",[^%s\"%%\']", "Needs a space after a \",\""}, -- Report all except >> "," << needed for splitting and >>,%s<< needed for formatting
|
{",[^%s\"%%\']", "Needs a space after a \",\""}, -- Report all except >> "," << needed for splitting and >>,%s<< needed for formatting
|
||||||
|
@ -442,7 +442,6 @@ void cChunk::WriteBlockArea(cBlockArea & a_Area, int a_MinBlockX, int a_MinBlock
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Returns true if there is a block entity at the coords specified
|
|
||||||
bool cChunk::HasBlockEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ)
|
bool cChunk::HasBlockEntityAt(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||||
{
|
{
|
||||||
for (cBlockEntityList::iterator itr = m_BlockEntities.begin(); itr != m_BlockEntities.end(); ++itr)
|
for (cBlockEntityList::iterator itr = m_BlockEntities.begin(); itr != m_BlockEntities.end(); ++itr)
|
||||||
|
@ -17,8 +17,7 @@
|
|||||||
|
|
||||||
/** Interface class used for getting data out of a chunk using the GetAllData() function.
|
/** Interface class used for getting data out of a chunk using the GetAllData() function.
|
||||||
Implementation must use the pointers immediately and NOT store any of them for later use
|
Implementation must use the pointers immediately and NOT store any of them for later use
|
||||||
The virtual methods are called in the same order as they're declared here.
|
The virtual methods are called in the same order as they're declared here. */
|
||||||
*/
|
|
||||||
class cChunkDataCallback abstract
|
class cChunkDataCallback abstract
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -27,26 +26,25 @@ public:
|
|||||||
|
|
||||||
/** Called before any other callbacks to inform of the current coords
|
/** Called before any other callbacks to inform of the current coords
|
||||||
(only in processes where multiple chunks can be processed, such as cWorld::ForEachChunkInRect()).
|
(only in processes where multiple chunks can be processed, such as cWorld::ForEachChunkInRect()).
|
||||||
If false is returned, the chunk is skipped.
|
If false is returned, the chunk is skipped. */
|
||||||
*/
|
|
||||||
virtual bool Coords(int a_ChunkX, int a_ChunkZ) { UNUSED(a_ChunkX); UNUSED(a_ChunkZ); return true; }
|
virtual bool Coords(int a_ChunkX, int a_ChunkZ) { UNUSED(a_ChunkX); UNUSED(a_ChunkZ); return true; }
|
||||||
|
|
||||||
/// Called once to provide heightmap data
|
/** Called once to provide heightmap data */
|
||||||
virtual void HeightMap(const cChunkDef::HeightMap * a_HeightMap) { UNUSED(a_HeightMap); }
|
virtual void HeightMap(const cChunkDef::HeightMap * a_HeightMap) { UNUSED(a_HeightMap); }
|
||||||
|
|
||||||
/// Called once to provide biome data
|
/** Called once to provide biome data */
|
||||||
virtual void BiomeData(const cChunkDef::BiomeMap * a_BiomeMap) { UNUSED(a_BiomeMap); }
|
virtual void BiomeData(const cChunkDef::BiomeMap * a_BiomeMap) { UNUSED(a_BiomeMap); }
|
||||||
|
|
||||||
/// Called once to let know if the chunk lighting is valid. Return value is ignored
|
/** Called once to let know if the chunk lighting is valid. Return value is ignored */
|
||||||
virtual void LightIsValid(bool a_IsLightValid) { UNUSED(a_IsLightValid); }
|
virtual void LightIsValid(bool a_IsLightValid) { UNUSED(a_IsLightValid); }
|
||||||
|
|
||||||
/// Called once to export block info
|
/** Called once to export block info */
|
||||||
virtual void ChunkData(const cChunkData & a_Buffer) { UNUSED(a_Buffer); }
|
virtual void ChunkData(const cChunkData & a_Buffer) { UNUSED(a_Buffer); }
|
||||||
|
|
||||||
/// Called for each entity in the chunk
|
/** Called for each entity in the chunk */
|
||||||
virtual void Entity(cEntity * a_Entity) { UNUSED(a_Entity); }
|
virtual void Entity(cEntity * a_Entity) { UNUSED(a_Entity); }
|
||||||
|
|
||||||
/// Called for each blockentity in the chunk
|
/** Called for each blockentity in the chunk */
|
||||||
virtual void BlockEntity(cBlockEntity * a_Entity) { UNUSED(a_Entity); }
|
virtual void BlockEntity(cBlockEntity * a_Entity) { UNUSED(a_Entity); }
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
@ -54,8 +52,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** A simple implementation of the cChunkDataCallback interface that collects all block data into a buffer
|
/** A simple implementation of the cChunkDataCallback interface that collects all block data into a buffer */
|
||||||
*/
|
|
||||||
class cChunkDataCollector :
|
class cChunkDataCollector :
|
||||||
public cChunkDataCallback
|
public cChunkDataCallback
|
||||||
{
|
{
|
||||||
@ -75,8 +72,7 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** A simple implementation of the cChunkDataCallback interface that collects all block data into a single buffer
|
/** A simple implementation of the cChunkDataCallback interface that collects all block data into a single buffer */
|
||||||
*/
|
|
||||||
class cChunkDataArrayCollector :
|
class cChunkDataArrayCollector :
|
||||||
public cChunkDataCallback
|
public cChunkDataCallback
|
||||||
{
|
{
|
||||||
|
@ -39,13 +39,13 @@ typedef std::list<cBlockEntity *> cBlockEntityList;
|
|||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
/// The datatype used by blockdata
|
/** The datatype used by blockdata */
|
||||||
typedef unsigned char BLOCKTYPE;
|
typedef unsigned char BLOCKTYPE;
|
||||||
|
|
||||||
/// The datatype used by nibbledata (meta, light, skylight)
|
/** The datatype used by nibbledata (meta, light, skylight) */
|
||||||
typedef unsigned char NIBBLETYPE;
|
typedef unsigned char NIBBLETYPE;
|
||||||
|
|
||||||
/// The type used by the heightmap
|
/** The type used by the heightmap */
|
||||||
typedef unsigned char HEIGHTTYPE;
|
typedef unsigned char HEIGHTTYPE;
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
@ -53,7 +53,7 @@ typedef unsigned char HEIGHTTYPE;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Constants used throughout the code, useful typedefs and utility functions
|
/** Constants used throughout the code, useful typedefs and utility functions */
|
||||||
class cChunkDef
|
class cChunkDef
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -61,22 +61,22 @@ public:
|
|||||||
static const int Width = 16;
|
static const int Width = 16;
|
||||||
static const int Height = 256;
|
static const int Height = 256;
|
||||||
static const int NumBlocks = Width * Height * Width;
|
static const int NumBlocks = Width * Height * Width;
|
||||||
/// If the data is collected into a single buffer, how large it needs to be:
|
|
||||||
|
/** If the data is collected into a single buffer, how large it needs to be: */
|
||||||
static const int BlockDataSize = cChunkDef::NumBlocks * 2 + (cChunkDef::NumBlocks / 2); // 2.5 * numblocks
|
static const int BlockDataSize = cChunkDef::NumBlocks * 2 + (cChunkDef::NumBlocks / 2); // 2.5 * numblocks
|
||||||
|
|
||||||
/// The type used for any heightmap operations and storage; idx = x + Width * z; Height points to the highest non-air block in the column
|
/** The type used for any heightmap operations and storage; idx = x + Width * z; Height points to the highest non-air block in the column */
|
||||||
typedef HEIGHTTYPE HeightMap[Width * Width];
|
typedef HEIGHTTYPE HeightMap[Width * Width];
|
||||||
|
|
||||||
/** The type used for any biomemap operations and storage inside MCServer,
|
/** The type used for any biomemap operations and storage inside MCServer,
|
||||||
using MCServer biomes (need not correspond to client representation!)
|
using MCServer biomes (need not correspond to client representation!)
|
||||||
idx = x + Width * z // Need to verify this with the protocol spec, currently unknown!
|
idx = x + Width * z */
|
||||||
*/
|
|
||||||
typedef EMCSBiome BiomeMap[Width * Width];
|
typedef EMCSBiome BiomeMap[Width * Width];
|
||||||
|
|
||||||
/// The type used for block type operations and storage, AXIS_ORDER ordering
|
/** The type used for block type operations and storage, AXIS_ORDER ordering */
|
||||||
typedef BLOCKTYPE BlockTypes[NumBlocks];
|
typedef BLOCKTYPE BlockTypes[NumBlocks];
|
||||||
|
|
||||||
/// The type used for block data in nibble format, AXIS_ORDER ordering
|
/** The type used for block data in nibble format, AXIS_ORDER ordering */
|
||||||
typedef NIBBLETYPE BlockNibbles[NumBlocks / 2];
|
typedef NIBBLETYPE BlockNibbles[NumBlocks / 2];
|
||||||
|
|
||||||
/** The storage wrapper used for compressed blockdata residing in RAMz */
|
/** The storage wrapper used for compressed blockdata residing in RAMz */
|
||||||
@ -86,7 +86,7 @@ public:
|
|||||||
typedef std::vector<NIBBLETYPE> COMPRESSED_NIBBLETYPE;
|
typedef std::vector<NIBBLETYPE> COMPRESSED_NIBBLETYPE;
|
||||||
|
|
||||||
|
|
||||||
/// Converts absolute block coords into relative (chunk + block) coords:
|
/** Converts absolute block coords into relative (chunk + block) coords: */
|
||||||
inline static void AbsoluteToRelative(/* in-out */ int & a_X, int & a_Y, int & a_Z, /* out */ int & a_ChunkX, int & a_ChunkZ)
|
inline static void AbsoluteToRelative(/* in-out */ int & a_X, int & a_Y, int & a_Z, /* out */ int & a_ChunkX, int & a_ChunkZ)
|
||||||
{
|
{
|
||||||
UNUSED(a_Y);
|
UNUSED(a_Y);
|
||||||
@ -116,7 +116,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Converts absolute block coords to chunk coords:
|
/** Converts absolute block coords to chunk coords: */
|
||||||
inline static void BlockToChunk(int a_X, int a_Z, int & a_ChunkX, int & a_ChunkZ)
|
inline static void BlockToChunk(int a_X, int a_Z, int & a_ChunkX, int & a_ChunkZ)
|
||||||
{
|
{
|
||||||
a_ChunkX = a_X / Width;
|
a_ChunkX = a_X / Width;
|
||||||
@ -345,18 +345,17 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
/** Interface class used for comparing clients of two chunks.
|
/** Interface class used for comparing clients of two chunks.
|
||||||
Used primarily for entity moving while both chunks are locked.
|
Used primarily for entity moving while both chunks are locked. */
|
||||||
*/
|
|
||||||
class cClientDiffCallback
|
class cClientDiffCallback
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual ~cClientDiffCallback() {}
|
virtual ~cClientDiffCallback() {}
|
||||||
|
|
||||||
/// Called for clients that are in Chunk1 and not in Chunk2,
|
/** Called for clients that are in Chunk1 and not in Chunk2, */
|
||||||
virtual void Removed(cClientHandle * a_Client) = 0;
|
virtual void Removed(cClientHandle * a_Client) = 0;
|
||||||
|
|
||||||
/// Called for clients that are in Chunk2 and not in Chunk1.
|
/** Called for clients that are in Chunk2 and not in Chunk1. */
|
||||||
virtual void Added(cClientHandle * a_Client) = 0;
|
virtual void Added(cClientHandle * a_Client) = 0;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
@ -418,6 +417,10 @@ public:
|
|||||||
typedef std::list<cChunkCoords> cChunkCoordsList;
|
typedef std::list<cChunkCoords> cChunkCoordsList;
|
||||||
typedef std::vector<cChunkCoords> cChunkCoordsVector;
|
typedef std::vector<cChunkCoords> cChunkCoordsVector;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** A simple hash function for chunk coords, we assume that chunk coords won't use more than 16 bits, so the hash is almost an identity.
|
/** A simple hash function for chunk coords, we assume that chunk coords won't use more than 16 bits, so the hash is almost an identity.
|
||||||
Used for std::unordered_map<cChunkCoords, ...> */
|
Used for std::unordered_map<cChunkCoords, ...> */
|
||||||
class cChunkCoordsHash
|
class cChunkCoordsHash
|
||||||
@ -489,7 +492,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Generic template that can store any kind of data together with a triplet of 3 coords*/
|
/** Generic template that can store any kind of data together with a triplet of 3 coords */
|
||||||
template <typename X> class cCoordWithData
|
template <typename X> class cCoordWithData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -817,7 +817,6 @@ void cChunkMap::WakeUpSimulators(int a_BlockX, int a_BlockY, int a_BlockZ)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Wakes up the simulators for the specified area of blocks
|
|
||||||
void cChunkMap::WakeUpSimulatorsInArea(int a_MinBlockX, int a_MaxBlockX, int a_MinBlockY, int a_MaxBlockY, int a_MinBlockZ, int a_MaxBlockZ)
|
void cChunkMap::WakeUpSimulatorsInArea(int a_MinBlockX, int a_MaxBlockX, int a_MinBlockY, int a_MaxBlockY, int a_MinBlockZ, int a_MaxBlockZ)
|
||||||
{
|
{
|
||||||
// Limit the Y coords:
|
// Limit the Y coords:
|
||||||
|
@ -103,7 +103,7 @@ public:
|
|||||||
/** Calls the callback for the chunk specified, with ChunkMapCS locked; returns false if the chunk doesn't exist, otherwise returns the same value as the callback */
|
/** Calls the callback for the chunk specified, with ChunkMapCS locked; returns false if the chunk doesn't exist, otherwise returns the same value as the callback */
|
||||||
bool DoWithChunk(int a_ChunkX, int a_ChunkZ, cChunkCallback & a_Callback);
|
bool DoWithChunk(int a_ChunkX, int a_ChunkZ, cChunkCallback & a_Callback);
|
||||||
|
|
||||||
/** Calls the callback for the chunk at the block position specified, with ChunkMapCS locked; returns false if the chunk doesn't exist, otherwise returns the same value as the callback **/
|
/** Calls the callback for the chunk at the block position specified, with ChunkMapCS locked; returns false if the chunk doesn't exist, otherwise returns the same value as the callback */
|
||||||
bool DoWithChunkAt(Vector3i a_BlockPos, std::function<bool(cChunk &)> a_Callback);
|
bool DoWithChunkAt(Vector3i a_BlockPos, std::function<bool(cChunk &)> a_Callback);
|
||||||
|
|
||||||
/** Wakes up simulators for the specified block */
|
/** Wakes up simulators for the specified block */
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
// cNotifyChunkSender:
|
// cNotifyChunkSender:
|
||||||
|
|
||||||
|
|
||||||
/// Callback that can be used to notify chunk sender upon another chunkcoord notification
|
/** Callback that can be used to notify chunk sender upon another chunkcoord notification */
|
||||||
class cNotifyChunkSender :
|
class cNotifyChunkSender :
|
||||||
public cChunkCoordCallback
|
public cChunkCoordCallback
|
||||||
{
|
{
|
||||||
@ -43,12 +43,23 @@ class cNotifyChunkSender :
|
|||||||
cChunkSender & m_ChunkSender;
|
cChunkSender & m_ChunkSender;
|
||||||
|
|
||||||
cWorld & m_World;
|
cWorld & m_World;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
cNotifyChunkSender(cChunkSender & a_ChunkSender, cWorld & a_World) : m_ChunkSender(a_ChunkSender), m_World(a_World) {}
|
cNotifyChunkSender(cChunkSender & a_ChunkSender, cWorld & a_World):
|
||||||
|
m_ChunkSender(a_ChunkSender),
|
||||||
|
m_World(a_World)
|
||||||
|
{
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// cChunkSender:
|
||||||
|
|
||||||
cChunkSender::cChunkSender(cWorld & a_World) :
|
cChunkSender::cChunkSender(cWorld & a_World) :
|
||||||
super("ChunkSender"),
|
super("ChunkSender"),
|
||||||
m_World(a_World)
|
m_World(a_World)
|
||||||
|
@ -72,11 +72,11 @@ public:
|
|||||||
|
|
||||||
void Stop(void);
|
void Stop(void);
|
||||||
|
|
||||||
/// Queues a chunk to be sent to a specific client
|
/** Queues a chunk to be sent to a specific client */
|
||||||
void QueueSendChunkTo(int a_ChunkX, int a_ChunkZ, eChunkPriority a_Priority, cClientHandle * a_Client);
|
void QueueSendChunkTo(int a_ChunkX, int a_ChunkZ, eChunkPriority a_Priority, cClientHandle * a_Client);
|
||||||
void QueueSendChunkTo(int a_ChunkX, int a_ChunkZ, eChunkPriority a_Priority, std::list<cClientHandle *> a_Client);
|
void QueueSendChunkTo(int a_ChunkX, int a_ChunkZ, eChunkPriority a_Priority, std::list<cClientHandle *> a_Client);
|
||||||
|
|
||||||
/// Removes the a_Client from all waiting chunk send operations
|
/** Removes the a_Client from all waiting chunk send operations */
|
||||||
void RemoveClient(cClientHandle * a_Client);
|
void RemoveClient(cClientHandle * a_Client);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -98,7 +98,7 @@ protected:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Used for sending chunks to specific clients
|
/** Used for sending chunks to specific clients */
|
||||||
struct sSendChunk
|
struct sSendChunk
|
||||||
{
|
{
|
||||||
cChunkCoords m_Chunk;
|
cChunkCoords m_Chunk;
|
||||||
@ -134,7 +134,7 @@ protected:
|
|||||||
virtual void Entity (cEntity * a_Entity) override;
|
virtual void Entity (cEntity * a_Entity) override;
|
||||||
virtual void BlockEntity (cBlockEntity * a_Entity) override;
|
virtual void BlockEntity (cBlockEntity * a_Entity) override;
|
||||||
|
|
||||||
/// Sends the specified chunk to a_Client, or to all chunk clients if a_Client == nullptr
|
/** Sends the specified chunk to all the specified clients */
|
||||||
void SendChunk(int a_ChunkX, int a_ChunkZ, std::unordered_set<cClientHandle *> a_Clients);
|
void SendChunk(int a_ChunkX, int a_ChunkZ, std::unordered_set<cClientHandle *> a_Clients);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -56,8 +56,7 @@ public:
|
|||||||
All the contained chunks are queued for loading / generating. */
|
All the contained chunks are queued for loading / generating. */
|
||||||
void Enable (cChunkMap & a_ChunkMap);
|
void Enable (cChunkMap & a_ChunkMap);
|
||||||
|
|
||||||
/** Disables the ChunkStay, the chunks are released and the ChunkStay
|
/** Disables the ChunkStay, the chunks are released and the ChunkStay object can be edited with Add() and Remove() again */
|
||||||
object can be edited with Add() and Remove() again*/
|
|
||||||
virtual void Disable(void);
|
virtual void Disable(void);
|
||||||
|
|
||||||
/** Returns all the chunks that should be kept */
|
/** Returns all the chunks that should be kept */
|
||||||
|
@ -108,7 +108,7 @@ public: // tolua_export
|
|||||||
If the string given is not a valid UUID, returns false. */
|
If the string given is not a valid UUID, returns false. */
|
||||||
static bool IsUUIDOnline(const AString & a_UUID); // tolua_export
|
static bool IsUUIDOnline(const AString & a_UUID); // tolua_export
|
||||||
|
|
||||||
/** Formats the type of message with the proper color and prefix for sending to the client. **/
|
/** Formats the type of message with the proper color and prefix for sending to the client. */
|
||||||
static AString FormatMessageType(bool ShouldAppendChatPrefixes, eMessageType a_ChatPrefix, const AString & a_AdditionalData);
|
static AString FormatMessageType(bool ShouldAppendChatPrefixes, eMessageType a_ChatPrefix, const AString & a_AdditionalData);
|
||||||
|
|
||||||
static AString FormatChatPrefix(bool ShouldAppendChatPrefixes, AString a_ChatPrefixS, AString m_Color1, AString m_Color2);
|
static AString FormatChatPrefix(bool ShouldAppendChatPrefixes, AString a_ChatPrefixS, AString m_Color1, AString m_Color2);
|
||||||
|
@ -9,20 +9,19 @@
|
|||||||
|
|
||||||
/** Interface for a callback that receives command output
|
/** Interface for a callback that receives command output
|
||||||
The Out() function is called for any output the command has produced.
|
The Out() function is called for any output the command has produced.
|
||||||
Descendants override that function to provide specific processing of the output.
|
Descendants override that function to provide specific processing of the output. */
|
||||||
*/
|
|
||||||
class cCommandOutputCallback
|
class cCommandOutputCallback
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~cCommandOutputCallback() {} // Force a virtual destructor in subclasses
|
virtual ~cCommandOutputCallback() {} // Force a virtual destructor in subclasses
|
||||||
|
|
||||||
/// Syntax sugar function, calls Out() with Printf()-ed parameters; appends a newline"
|
/** Syntax sugar function, calls Out() with Printf()-ed parameters; appends a newline" */
|
||||||
void Out(const char * a_Fmt, ...) FORMATSTRING(2, 3);
|
void Out(const char * a_Fmt, ...) FORMATSTRING(2, 3);
|
||||||
|
|
||||||
/// Called when the command wants to output anything; may be called multiple times
|
/** Called when the command wants to output anything; may be called multiple times */
|
||||||
virtual void Out(const AString & a_Text) = 0;
|
virtual void Out(const AString & a_Text) = 0;
|
||||||
|
|
||||||
/// Called when the command processing has been finished
|
/** Called when the command processing has been finished */
|
||||||
virtual void Finished(void) {}
|
virtual void Finished(void) {}
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
@ -30,7 +29,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Class that discards all command output
|
/** Class that discards all command output */
|
||||||
class cNullCommandOutputCallback :
|
class cNullCommandOutputCallback :
|
||||||
public cCommandOutputCallback
|
public cCommandOutputCallback
|
||||||
{
|
{
|
||||||
@ -70,7 +69,7 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Sends all command output to a log, line by line, when the command finishes processing
|
/** Sends all command output to a log, line by line, when the command finishes processing */
|
||||||
class cLogCommandOutputCallback :
|
class cLogCommandOutputCallback :
|
||||||
public cStringAccumCommandOutputCallback
|
public cStringAccumCommandOutputCallback
|
||||||
{
|
{
|
||||||
@ -83,7 +82,7 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Sends all command output to a log, line by line; deletes self when command finishes processing
|
/** Sends all command output to a log, line by line; deletes self when command finishes processing */
|
||||||
class cLogCommandDeleteSelfOutputCallback :
|
class cLogCommandDeleteSelfOutputCallback :
|
||||||
public cLogCommandOutputCallback
|
public cLogCommandOutputCallback
|
||||||
{
|
{
|
||||||
|
@ -37,17 +37,17 @@ public:
|
|||||||
void SetItem (int x, int y, const cItem & a_Item);
|
void SetItem (int x, int y, const cItem & a_Item);
|
||||||
void Clear (void);
|
void Clear (void);
|
||||||
|
|
||||||
/// Removes items in a_Grid from m_Items[] (used by cCraftingRecipe::ConsumeIngredients())
|
/** Removes items in a_Grid from m_Items[] (used by cCraftingRecipe::ConsumeIngredients()) */
|
||||||
void ConsumeGrid(const cCraftingGrid & a_Grid);
|
void ConsumeGrid(const cCraftingGrid & a_Grid);
|
||||||
|
|
||||||
/// Dumps the entire crafting grid using LOGD()
|
/** Dumps the entire crafting grid using LOGD() */
|
||||||
void Dump(void);
|
void Dump(void);
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
cItem * GetItems(void) const {return m_Items; }
|
cItem * GetItems(void) const {return m_Items; }
|
||||||
|
|
||||||
/// Copies internal contents into the item array specified. Assumes that the array has the same dimensions as self
|
/** Copies internal contents into the item array specified. Assumes that the array has the same dimensions as self */
|
||||||
void CopyToItems(cItem * a_Items) const;
|
void CopyToItems(cItem * a_Items) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -88,10 +88,10 @@ public:
|
|||||||
m_Ingredients.SetItem(x, y, a_Item);
|
m_Ingredients.SetItem(x, y, a_Item);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Consumes ingredients from the crafting grid specified
|
/** Consumes ingredients from the crafting grid specified */
|
||||||
void ConsumeIngredients(cCraftingGrid & a_CraftingGrid);
|
void ConsumeIngredients(cCraftingGrid & a_CraftingGrid);
|
||||||
|
|
||||||
/// Dumps the entire recipe using LOGD()
|
/** Dumps the entire recipe using LOGD() */
|
||||||
void Dump(void);
|
void Dump(void);
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
@ -114,7 +114,7 @@ public:
|
|||||||
cCraftingRecipes(void);
|
cCraftingRecipes(void);
|
||||||
~cCraftingRecipes();
|
~cCraftingRecipes();
|
||||||
|
|
||||||
/// Returns the recipe for current crafting grid. Doesn't modify the grid. Clears a_Recipe if no recipe found.
|
/** Returns the recipe for current crafting grid. Doesn't modify the grid. Clears a_Recipe if no recipe found. */
|
||||||
void GetRecipe(cPlayer & a_Player, cCraftingGrid & a_CraftingGrid, cCraftingRecipe & a_Recipe);
|
void GetRecipe(cPlayer & a_Player, cCraftingGrid & a_CraftingGrid, cCraftingRecipe & a_Recipe);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -127,8 +127,7 @@ protected:
|
|||||||
typedef std::vector<cRecipeSlot> cRecipeSlots;
|
typedef std::vector<cRecipeSlot> cRecipeSlots;
|
||||||
|
|
||||||
/** A single recipe, stored. Each recipe is normalized right after parsing (NormalizeIngredients())
|
/** A single recipe, stored. Each recipe is normalized right after parsing (NormalizeIngredients())
|
||||||
A normalized recipe starts at (0, 0)
|
A normalized recipe starts at (0, 0) */
|
||||||
*/
|
|
||||||
struct cRecipe
|
struct cRecipe
|
||||||
{
|
{
|
||||||
cRecipeSlots m_Ingredients;
|
cRecipeSlots m_Ingredients;
|
||||||
@ -145,31 +144,31 @@ protected:
|
|||||||
void LoadRecipes(void);
|
void LoadRecipes(void);
|
||||||
void ClearRecipes(void);
|
void ClearRecipes(void);
|
||||||
|
|
||||||
/// Parses the recipe line and adds it into m_Recipes. a_LineNum is used for diagnostic warnings only
|
/** Parses the recipe line and adds it into m_Recipes. a_LineNum is used for diagnostic warnings only */
|
||||||
void AddRecipeLine(int a_LineNum, const AString & a_RecipeLine);
|
void AddRecipeLine(int a_LineNum, const AString & a_RecipeLine);
|
||||||
|
|
||||||
/// Parses an item string in the format "<ItemType>[^<Damage>]", returns true if successful.
|
/** Parses an item string in the format "<ItemType>[^<Damage>]", returns true if successful. */
|
||||||
bool ParseItem(const AString & a_String, cItem & a_Item);
|
bool ParseItem(const AString & a_String, cItem & a_Item);
|
||||||
|
|
||||||
/// Parses one ingredient and adds it to the specified recipe. Returns true if successful.
|
/** Parses one ingredient and adds it to the specified recipe. Returns true if successful. */
|
||||||
bool ParseIngredient(const AString & a_String, cRecipe * a_Recipe);
|
bool ParseIngredient(const AString & a_String, cRecipe * a_Recipe);
|
||||||
|
|
||||||
/// Moves the recipe to top-left corner, sets its MinWidth / MinHeight
|
/** Moves the recipe to top-left corner, sets its MinWidth / MinHeight */
|
||||||
void NormalizeIngredients(cRecipe * a_Recipe);
|
void NormalizeIngredients(cRecipe * a_Recipe);
|
||||||
|
|
||||||
/// Finds a recipe matching the crafting grid. Returns a newly allocated recipe (with all its coords set) or nullptr if not found. Caller must delete return value!
|
/** Finds a recipe matching the crafting grid. Returns a newly allocated recipe (with all its coords set) or nullptr if not found. Caller must delete return value! */
|
||||||
cRecipe * FindRecipe(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight);
|
cRecipe * FindRecipe(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight);
|
||||||
|
|
||||||
/// Same as FindRecipe, but the grid is guaranteed to be of minimal dimensions needed
|
/** Same as FindRecipe, but the grid is guaranteed to be of minimal dimensions needed */
|
||||||
cRecipe * FindRecipeCropped(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight, int a_GridStride);
|
cRecipe * FindRecipeCropped(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight, int a_GridStride);
|
||||||
|
|
||||||
/// Checks if the grid matches the specified recipe, offset by the specified offsets. Returns a matched cRecipe * if so, or nullptr if not matching. Caller must delete the return value!
|
/** Checks if the grid matches the specified recipe, offset by the specified offsets. Returns a matched cRecipe * if so, or nullptr if not matching. Caller must delete the return value! */
|
||||||
cRecipe * MatchRecipe(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight, int a_GridStride, const cRecipe * a_Recipe, int a_OffsetX, int a_OffsetY);
|
cRecipe * MatchRecipe(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight, int a_GridStride, const cRecipe * a_Recipe, int a_OffsetX, int a_OffsetY);
|
||||||
|
|
||||||
/** Searches for anything firework related, and does the data setting if appropriate */
|
/** Searches for anything firework related, and does the data setting if appropriate */
|
||||||
void HandleFireworks(const cItem * a_CraftingGrid, cCraftingRecipes::cRecipe * a_Recipe, int a_GridStride, int a_OffsetX, int a_OffsetY);
|
void HandleFireworks(const cItem * a_CraftingGrid, cCraftingRecipes::cRecipe * a_Recipe, int a_GridStride, int a_OffsetX, int a_OffsetY);
|
||||||
|
|
||||||
/// Searches for anything dye related for leather, calculates the appropriate color value, and sets the resulting value.
|
/** Searches for anything dye related for leather, calculates the appropriate color value, and sets the resulting value. */
|
||||||
void HandleDyedLeather(const cItem * a_CraftingGrid, cCraftingRecipes::cRecipe * a_Recipe, int a_GridStride, int a_GridWidth, int a_GridHeight);
|
void HandleDyedLeather(const cItem * a_CraftingGrid, cCraftingRecipes::cRecipe * a_Recipe, int a_GridStride, int a_GridWidth, int a_GridHeight);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Returns true if the two specified intervals have a non-empty union
|
/** Returns true if the two specified intervals have a non-empty union */
|
||||||
static bool DoIntervalsIntersect(int a_Min1, int a_Max1, int a_Min2, int a_Max2)
|
static bool DoIntervalsIntersect(int a_Min1, int a_Max1, int a_Min2, int a_Max2)
|
||||||
{
|
{
|
||||||
return (
|
return (
|
||||||
|
@ -34,32 +34,32 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
struct sWorldAge
|
struct sWorldAge
|
||||||
{
|
{
|
||||||
/// Last m_WorldAge that has been detected in this world
|
/** Last m_WorldAge that has been detected in this world */
|
||||||
Int64 m_Age;
|
Int64 m_Age;
|
||||||
|
|
||||||
/// Number of cycles for which the age has been the same
|
/** Number of cycles for which the age has been the same */
|
||||||
int m_NumCyclesSame;
|
int m_NumCyclesSame;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
/// Maps world name -> sWorldAge
|
/** Maps world name -> sWorldAge */
|
||||||
typedef std::map<AString, sWorldAge> WorldAges;
|
typedef std::map<AString, sWorldAge> WorldAges;
|
||||||
|
|
||||||
WorldAges m_WorldAges;
|
WorldAges m_WorldAges;
|
||||||
|
|
||||||
/// Number of secods for which the ages must be the same for the detection to trigger
|
/** Number of secods for which the ages must be the same for the detection to trigger */
|
||||||
int m_IntervalSec;
|
int m_IntervalSec;
|
||||||
|
|
||||||
|
|
||||||
// cIsThread overrides:
|
// cIsThread overrides:
|
||||||
virtual void Execute(void) override;
|
virtual void Execute(void) override;
|
||||||
|
|
||||||
/// Sets the initial world age
|
/** Sets the initial world age */
|
||||||
void SetWorldAge(const AString & a_WorldName, Int64 a_Age);
|
void SetWorldAge(const AString & a_WorldName, Int64 a_Age);
|
||||||
|
|
||||||
/// Checks if the world's age has changed, updates the world's stats; calls DeadlockDetected() if deadlock detected
|
/** Checks if the world's age has changed, updates the world's stats; calls DeadlockDetected() if deadlock detected */
|
||||||
void CheckWorldAge(const AString & a_WorldName, Int64 a_Age);
|
void CheckWorldAge(const AString & a_WorldName, Int64 a_Age);
|
||||||
|
|
||||||
/// Called when a deadlock is detected. Aborts the server.
|
/** Called when a deadlock is detected. Aborts the server. */
|
||||||
NORETURN void DeadlockDetected(void);
|
NORETURN void DeadlockDetected(void);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// List of slot numbers, used for inventory-painting
|
/** List of slot numbers, used for inventory-painting */
|
||||||
typedef std::vector<int> cSlotNums;
|
typedef std::vector<int> cSlotNums;
|
||||||
|
|
||||||
|
|
||||||
@ -18,7 +18,7 @@ typedef std::vector<int> cSlotNums;
|
|||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
/// Experience Orb setup
|
/** Experience Orb setup */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
// Open to suggestion on naming convention here :)
|
// Open to suggestion on naming convention here :)
|
||||||
@ -57,7 +57,7 @@ enum eBlockFace
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// PlayerDigging status constants
|
/** PlayerDigging status constants */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
DIG_STATUS_STARTED = 0,
|
DIG_STATUS_STARTED = 0,
|
||||||
@ -72,7 +72,7 @@ enum
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Individual actions sent in the WindowClick packet
|
/** Individual actions sent in the WindowClick packet */
|
||||||
enum eClickAction
|
enum eClickAction
|
||||||
{
|
{
|
||||||
// Sorted by occurrence in the 1.5 protocol
|
// Sorted by occurrence in the 1.5 protocol
|
||||||
|
@ -1603,7 +1603,6 @@ void cEntity::HandleAir(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Called when the entity starts burning
|
|
||||||
void cEntity::OnStartedBurning(void)
|
void cEntity::OnStartedBurning(void)
|
||||||
{
|
{
|
||||||
// Broadcast the change:
|
// Broadcast the change:
|
||||||
@ -1614,7 +1613,6 @@ void cEntity::OnStartedBurning(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Called when the entity finishes burning
|
|
||||||
void cEntity::OnFinishedBurning(void)
|
void cEntity::OnFinishedBurning(void)
|
||||||
{
|
{
|
||||||
// Broadcast the change:
|
// Broadcast the change:
|
||||||
@ -1625,7 +1623,6 @@ void cEntity::OnFinishedBurning(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Sets the maximum value for the health
|
|
||||||
void cEntity::SetMaxHealth(int a_MaxHealth)
|
void cEntity::SetMaxHealth(int a_MaxHealth)
|
||||||
{
|
{
|
||||||
m_MaxHealth = a_MaxHealth;
|
m_MaxHealth = a_MaxHealth;
|
||||||
@ -1638,7 +1635,6 @@ void cEntity::SetMaxHealth(int a_MaxHealth)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Sets whether the entity is fireproof
|
|
||||||
void cEntity::SetIsFireproof(bool a_IsFireproof)
|
void cEntity::SetIsFireproof(bool a_IsFireproof)
|
||||||
{
|
{
|
||||||
m_IsFireproof = a_IsFireproof;
|
m_IsFireproof = a_IsFireproof;
|
||||||
@ -1648,7 +1644,6 @@ void cEntity::SetIsFireproof(bool a_IsFireproof)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Puts the entity on fire for the specified amount of ticks
|
|
||||||
void cEntity::StartBurning(int a_TicksLeftBurning)
|
void cEntity::StartBurning(int a_TicksLeftBurning)
|
||||||
{
|
{
|
||||||
if (m_TicksLeftBurning > 0)
|
if (m_TicksLeftBurning > 0)
|
||||||
@ -1666,7 +1661,6 @@ void cEntity::StartBurning(int a_TicksLeftBurning)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Stops the entity from burning, resets all burning timers
|
|
||||||
void cEntity::StopBurning(void)
|
void cEntity::StopBurning(void)
|
||||||
{
|
{
|
||||||
bool HasBeenBurning = (m_TicksLeftBurning > 0);
|
bool HasBeenBurning = (m_TicksLeftBurning > 0);
|
||||||
|
@ -173,7 +173,7 @@ public:
|
|||||||
bool IsItemFrame (void) const { return (m_EntityType == etItemFrame); }
|
bool IsItemFrame (void) const { return (m_EntityType == etItemFrame); }
|
||||||
bool IsPainting (void) const { return (m_EntityType == etPainting); }
|
bool IsPainting (void) const { return (m_EntityType == etPainting); }
|
||||||
|
|
||||||
/// Returns true if the entity is of the specified class or a subclass (cPawn's IsA("cEntity") returns true)
|
/** Returns true if the entity is of the specified class or a subclass (cPawn's IsA("cEntity") returns true) */
|
||||||
virtual bool IsA(const char * a_ClassName) const;
|
virtual bool IsA(const char * a_ClassName) const;
|
||||||
|
|
||||||
/** Returns the class name of this class */
|
/** Returns the class name of this class */
|
||||||
@ -255,16 +255,16 @@ public:
|
|||||||
inline UInt32 GetUniqueID(void) const { return m_UniqueID; }
|
inline UInt32 GetUniqueID(void) const { return m_UniqueID; }
|
||||||
inline bool IsDestroyed(void) const { return !m_IsInitialized; }
|
inline bool IsDestroyed(void) const { return !m_IsInitialized; }
|
||||||
|
|
||||||
/// Schedules the entity for destroying; if a_ShouldBroadcast is set to true, broadcasts the DestroyEntity packet
|
/** Schedules the entity for destroying; if a_ShouldBroadcast is set to true, broadcasts the DestroyEntity packet */
|
||||||
void Destroy(bool a_ShouldBroadcast = true);
|
void Destroy(bool a_ShouldBroadcast = true);
|
||||||
|
|
||||||
/// Makes this pawn take damage from an attack by a_Attacker. Damage values are calculated automatically and DoTakeDamage() called
|
/** Makes this pawn take damage from an attack by a_Attacker. Damage values are calculated automatically and DoTakeDamage() called */
|
||||||
void TakeDamage(cEntity & a_Attacker);
|
void TakeDamage(cEntity & a_Attacker);
|
||||||
|
|
||||||
/// Makes this entity take the specified damage. The final damage is calculated using current armor, then DoTakeDamage() called
|
/** Makes this entity take the specified damage. The final damage is calculated using current armor, then DoTakeDamage() called */
|
||||||
void TakeDamage(eDamageType a_DamageType, cEntity * a_Attacker, int a_RawDamage, double a_KnockbackAmount);
|
void TakeDamage(eDamageType a_DamageType, cEntity * a_Attacker, int a_RawDamage, double a_KnockbackAmount);
|
||||||
|
|
||||||
/// Makes this entity take the specified damage. The values are packed into a TDI, knockback calculated, then sent through DoTakeDamage()
|
/** Makes this entity take the specified damage. The values are packed into a TDI, knockback calculated, then sent through DoTakeDamage() */
|
||||||
void TakeDamage(eDamageType a_DamageType, cEntity * a_Attacker, int a_RawDamage, int a_FinalDamage, double a_KnockbackAmount);
|
void TakeDamage(eDamageType a_DamageType, cEntity * a_Attacker, int a_RawDamage, int a_FinalDamage, double a_KnockbackAmount);
|
||||||
|
|
||||||
float GetGravity(void) const { return m_Gravity; }
|
float GetGravity(void) const { return m_Gravity; }
|
||||||
@ -275,10 +275,10 @@ public:
|
|||||||
|
|
||||||
void SetAirDrag(float a_AirDrag) { m_AirDrag = a_AirDrag; }
|
void SetAirDrag(float a_AirDrag) { m_AirDrag = a_AirDrag; }
|
||||||
|
|
||||||
/// Sets the rotation to match the speed vector (entity goes "face-forward")
|
/** Sets the rotation to match the speed vector (entity goes "face-forward") */
|
||||||
void SetYawFromSpeed(void);
|
void SetYawFromSpeed(void);
|
||||||
|
|
||||||
/// Sets the pitch to match the speed vector (entity gies "face-forward")
|
/** Sets the pitch to match the speed vector (entity gies "face-forward") */
|
||||||
void SetPitchFromSpeed(void);
|
void SetPitchFromSpeed(void);
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
@ -290,56 +290,56 @@ public:
|
|||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
/// Returns the hitpoints that this pawn can deal to a_Receiver using its equipped items
|
/** Returns the hitpoints that this pawn can deal to a_Receiver using its equipped items */
|
||||||
virtual int GetRawDamageAgainst(const cEntity & a_Receiver);
|
virtual int GetRawDamageAgainst(const cEntity & a_Receiver);
|
||||||
|
|
||||||
/** Returns whether armor will protect against the passed damage type **/
|
/** Returns whether armor will protect against the passed damage type */
|
||||||
virtual bool ArmorCoversAgainst(eDamageType a_DamageType);
|
virtual bool ArmorCoversAgainst(eDamageType a_DamageType);
|
||||||
|
|
||||||
/// Returns the hitpoints out of a_RawDamage that the currently equipped armor would cover
|
/** Returns the hitpoints out of a_RawDamage that the currently equipped armor would cover */
|
||||||
virtual int GetArmorCoverAgainst(const cEntity * a_Attacker, eDamageType a_DamageType, int a_RawDamage);
|
virtual int GetArmorCoverAgainst(const cEntity * a_Attacker, eDamageType a_DamageType, int a_RawDamage);
|
||||||
|
|
||||||
/// Returns the knockback amount that the currently equipped items would cause to a_Receiver on a hit
|
/** Returns the knockback amount that the currently equipped items would cause to a_Receiver on a hit */
|
||||||
virtual double GetKnockbackAmountAgainst(const cEntity & a_Receiver);
|
virtual double GetKnockbackAmountAgainst(const cEntity & a_Receiver);
|
||||||
|
|
||||||
/// Returns the curently equipped weapon; empty item if none
|
/** Returns the curently equipped weapon; empty item if none */
|
||||||
virtual cItem GetEquippedWeapon(void) const { return cItem(); }
|
virtual cItem GetEquippedWeapon(void) const { return cItem(); }
|
||||||
|
|
||||||
/// Returns the currently equipped helmet; empty item if none
|
/** Returns the currently equipped helmet; empty item if none */
|
||||||
virtual cItem GetEquippedHelmet(void) const { return cItem(); }
|
virtual cItem GetEquippedHelmet(void) const { return cItem(); }
|
||||||
|
|
||||||
/// Returns the currently equipped chestplate; empty item if none
|
/** Returns the currently equipped chestplate; empty item if none */
|
||||||
virtual cItem GetEquippedChestplate(void) const { return cItem(); }
|
virtual cItem GetEquippedChestplate(void) const { return cItem(); }
|
||||||
|
|
||||||
/// Returns the currently equipped leggings; empty item if none
|
/** Returns the currently equipped leggings; empty item if none */
|
||||||
virtual cItem GetEquippedLeggings(void) const { return cItem(); }
|
virtual cItem GetEquippedLeggings(void) const { return cItem(); }
|
||||||
|
|
||||||
/// Returns the currently equipped boots; empty item if none
|
/** Returns the currently equipped boots; empty item if none */
|
||||||
virtual cItem GetEquippedBoots(void) const { return cItem(); }
|
virtual cItem GetEquippedBoots(void) const { return cItem(); }
|
||||||
|
|
||||||
/// Called when the health drops below zero. a_Killer may be nullptr (environmental damage)
|
/** Called when the health drops below zero. a_Killer may be nullptr (environmental damage) */
|
||||||
virtual void KilledBy(TakeDamageInfo & a_TDI);
|
virtual void KilledBy(TakeDamageInfo & a_TDI);
|
||||||
|
|
||||||
/// Called when the entity kills another entity
|
/** Called when the entity kills another entity */
|
||||||
virtual void Killed(cEntity * a_Victim) {}
|
virtual void Killed(cEntity * a_Victim) {}
|
||||||
|
|
||||||
/// Heals the specified amount of HPs
|
/** Heals the specified amount of HPs */
|
||||||
virtual void Heal(int a_HitPoints);
|
virtual void Heal(int a_HitPoints);
|
||||||
|
|
||||||
/// Returns the health of this entity
|
/** Returns the health of this entity */
|
||||||
int GetHealth(void) const { return m_Health; }
|
int GetHealth(void) const { return m_Health; }
|
||||||
|
|
||||||
/// Sets the health of this entity; doesn't broadcast any hurt animation
|
/** Sets the health of this entity; doesn't broadcast any hurt animation */
|
||||||
void SetHealth(int a_Health);
|
void SetHealth(int a_Health);
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk);
|
virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk);
|
||||||
|
|
||||||
/// Handles the physics of the entity - updates position based on speed, updates speed based on environment
|
/** Handles the physics of the entity - updates position based on speed, updates speed based on environment */
|
||||||
virtual void HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk);
|
virtual void HandlePhysics(std::chrono::milliseconds a_Dt, cChunk & a_Chunk);
|
||||||
|
|
||||||
/// Updates the state related to this entity being on fire
|
/** Updates the state related to this entity being on fire */
|
||||||
virtual void TickBurning(cChunk & a_Chunk);
|
virtual void TickBurning(cChunk & a_Chunk);
|
||||||
|
|
||||||
/** Detects the time for application of cacti damage */
|
/** Detects the time for application of cacti damage */
|
||||||
@ -380,8 +380,7 @@ public:
|
|||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
/** Descendants override this function to send a command to the specified client to spawn the entity on the client.
|
/** Descendants override this function to send a command to the specified client to spawn the entity on the client.
|
||||||
To spawn on all eligible clients, use cChunkMap::BroadcastSpawnEntity()
|
To spawn on all eligible clients, use cChunkMap::BroadcastSpawnEntity() */
|
||||||
*/
|
|
||||||
virtual void SpawnOn(cClientHandle & a_Client) = 0;
|
virtual void SpawnOn(cClientHandle & a_Client) = 0;
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
@ -413,22 +412,22 @@ public:
|
|||||||
/** Sets the world the entity will be leaving */
|
/** Sets the world the entity will be leaving */
|
||||||
void SetWorldTravellingFrom(cWorld * a_World) { m_WorldTravellingFrom = a_World; }
|
void SetWorldTravellingFrom(cWorld * a_World) { m_WorldTravellingFrom = a_World; }
|
||||||
|
|
||||||
/// Updates clients of changes in the entity.
|
/** Updates clients of changes in the entity. */
|
||||||
virtual void BroadcastMovementUpdate(const cClientHandle * a_Exclude = nullptr);
|
virtual void BroadcastMovementUpdate(const cClientHandle * a_Exclude = nullptr);
|
||||||
|
|
||||||
/// Attaches to the specified entity; detaches from any previous one first
|
/** Attaches to the specified entity; detaches from any previous one first */
|
||||||
void AttachTo(cEntity * a_AttachTo);
|
void AttachTo(cEntity * a_AttachTo);
|
||||||
|
|
||||||
/// Detaches from the currently attached entity, if any
|
/** Detaches from the currently attached entity, if any */
|
||||||
virtual void Detach(void);
|
virtual void Detach(void);
|
||||||
|
|
||||||
/// Makes sure head yaw is not over the specified range.
|
/** Makes sure head yaw is not over the specified range. */
|
||||||
void WrapHeadYaw();
|
void WrapHeadYaw();
|
||||||
|
|
||||||
/// Makes sure rotation is not over the specified range.
|
/** Makes sure rotation is not over the specified range. */
|
||||||
void WrapRotation();
|
void WrapRotation();
|
||||||
|
|
||||||
/// Makes speed is not over 20. Max speed is 20 blocks / second
|
/** Makes speed is not over 20. Max speed is 20 blocks / second */
|
||||||
void WrapSpeed();
|
void WrapSpeed();
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
@ -443,8 +442,10 @@ public:
|
|||||||
|
|
||||||
/** Returns whether the player is swimming or not */
|
/** Returns whether the player is swimming or not */
|
||||||
virtual bool IsSwimming(void) const{ return m_IsSwimming; }
|
virtual bool IsSwimming(void) const{ return m_IsSwimming; }
|
||||||
|
|
||||||
/** Return whether the player is under water or not */
|
/** Return whether the player is under water or not */
|
||||||
virtual bool IsSubmerged(void) const{ return m_IsSubmerged; }
|
virtual bool IsSubmerged(void) const{ return m_IsSubmerged; }
|
||||||
|
|
||||||
/** Gets remaining air of a monster */
|
/** Gets remaining air of a monster */
|
||||||
int GetAirLevel(void) const { return m_AirLevel; }
|
int GetAirLevel(void) const { return m_AirLevel; }
|
||||||
|
|
||||||
@ -462,10 +463,10 @@ public:
|
|||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
/// Called when the specified player right-clicks this entity
|
/** Called when the specified player right-clicks this entity */
|
||||||
virtual void OnRightClicked(cPlayer & a_Player) {}
|
virtual void OnRightClicked(cPlayer & a_Player) {}
|
||||||
|
|
||||||
/// Returns the list of drops for this pawn when it is killed. May check a_Killer for special handling (sword of looting etc.). Called from KilledBy().
|
/** Returns the list of drops for this pawn when it is killed. May check a_Killer for special handling (sword of looting etc.). Called from KilledBy(). */
|
||||||
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr)
|
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr)
|
||||||
{
|
{
|
||||||
UNUSED(a_Drops);
|
UNUSED(a_Drops);
|
||||||
@ -476,6 +477,17 @@ public:
|
|||||||
void SetWorld(cWorld * a_World) { m_World = a_World; }
|
void SetWorld(cWorld * a_World) { m_World = a_World; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
/** Structure storing the portal delay timer and cooldown boolean */
|
||||||
|
struct sPortalCooldownData
|
||||||
|
{
|
||||||
|
/** Ticks since entry of portal, used to delay teleportation */
|
||||||
|
unsigned short m_TicksDelayed;
|
||||||
|
|
||||||
|
/** Whether the entity has just exited the portal, and should therefore not be teleported again.
|
||||||
|
This prevents teleportation loops, and is reset when the entity has moved out of the portal. */
|
||||||
|
bool m_ShouldPreventTeleportation;
|
||||||
|
};
|
||||||
|
|
||||||
static cCriticalSection m_CSCount;
|
static cCriticalSection m_CSCount;
|
||||||
static UInt32 m_EntityCount;
|
static UInt32 m_EntityCount;
|
||||||
|
|
||||||
@ -490,10 +502,10 @@ protected:
|
|||||||
int m_Health;
|
int m_Health;
|
||||||
int m_MaxHealth;
|
int m_MaxHealth;
|
||||||
|
|
||||||
/// The entity to which this entity is attached (vehicle), nullptr if none
|
/** The entity to which this entity is attached (vehicle), nullptr if none */
|
||||||
cEntity * m_AttachedTo;
|
cEntity * m_AttachedTo;
|
||||||
|
|
||||||
/// The entity which is attached to this entity (rider), nullptr if none
|
/** The entity which is attached to this entity (rider), nullptr if none */
|
||||||
cEntity * m_Attachee;
|
cEntity * m_Attachee;
|
||||||
|
|
||||||
/** Stores whether head yaw has been set manually */
|
/** Stores whether head yaw has been set manually */
|
||||||
@ -526,10 +538,9 @@ protected:
|
|||||||
/** True when entity is initialised (Initialize()) and false when destroyed pending deletion (Destroy()) */
|
/** True when entity is initialised (Initialize()) and false when destroyed pending deletion (Destroy()) */
|
||||||
bool m_IsInitialized;
|
bool m_IsInitialized;
|
||||||
|
|
||||||
/** World entity is travelling from
|
/** World entity is travelling from (such as when using portals).
|
||||||
Set to a valid world pointer by MoveToWorld; reset to nullptr when the entity is removed from the old world
|
Set to a valid world pointer by MoveToWorld; reset to nullptr when the entity is removed from the old world.
|
||||||
Can't be a simple boolean as context switches between worlds may leave the new chunk processing (and therefore immediately removing) the entity before the old chunk could remove it
|
Can't be a simple boolean as context switches between worlds may leave the new chunk processing (and therefore immediately removing) the entity before the old chunk could remove it. */
|
||||||
*/
|
|
||||||
cWorld * m_WorldTravellingFrom;
|
cWorld * m_WorldTravellingFrom;
|
||||||
|
|
||||||
eEntityType m_EntityType;
|
eEntityType m_EntityType;
|
||||||
@ -560,6 +571,20 @@ protected:
|
|||||||
/** Time, in ticks, since the last damage dealt by the void. Reset to zero when moving out of the void. */
|
/** Time, in ticks, since the last damage dealt by the void. Reset to zero when moving out of the void. */
|
||||||
int m_TicksSinceLastVoidDamage;
|
int m_TicksSinceLastVoidDamage;
|
||||||
|
|
||||||
|
/** If an entity is currently swimming in or submerged under water */
|
||||||
|
bool m_IsSwimming, m_IsSubmerged;
|
||||||
|
|
||||||
|
/** Air level of a mobile */
|
||||||
|
int m_AirLevel;
|
||||||
|
int m_AirTickTimer;
|
||||||
|
|
||||||
|
/** Portal delay timer and cooldown boolean data */
|
||||||
|
sPortalCooldownData m_PortalCooldownData;
|
||||||
|
|
||||||
|
/** The number of ticks this entity has been alive for */
|
||||||
|
long int m_TicksAlive;
|
||||||
|
|
||||||
|
|
||||||
/** Does the actual speed-setting. The default implementation just sets the member variable value;
|
/** Does the actual speed-setting. The default implementation just sets the member variable value;
|
||||||
overrides can provide further processing, such as forcing players to move at the given speed. */
|
overrides can provide further processing, such as forcing players to move at the given speed. */
|
||||||
virtual void DoSetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ);
|
virtual void DoSetSpeed(double a_SpeedX, double a_SpeedY, double a_SpeedZ);
|
||||||
@ -568,8 +593,7 @@ protected:
|
|||||||
|
|
||||||
/** Applies friction to an entity
|
/** Applies friction to an entity
|
||||||
@param a_Speed The speed vector to apply changes to
|
@param a_Speed The speed vector to apply changes to
|
||||||
@param a_SlowdownMultiplier The factor to reduce the speed by
|
@param a_SlowdownMultiplier The factor to reduce the speed by */
|
||||||
*/
|
|
||||||
static void ApplyFriction(Vector3d & a_Speed, double a_SlowdownMultiplier, float a_Dt);
|
static void ApplyFriction(Vector3d & a_Speed, double a_SlowdownMultiplier, float a_Dt);
|
||||||
|
|
||||||
/** Called in each tick to handle air-related processing i.e. drowning */
|
/** Called in each tick to handle air-related processing i.e. drowning */
|
||||||
@ -578,31 +602,6 @@ protected:
|
|||||||
/** Called once per tick to set IsSwimming and IsSubmerged */
|
/** Called once per tick to set IsSwimming and IsSubmerged */
|
||||||
virtual void SetSwimState(cChunk & a_Chunk);
|
virtual void SetSwimState(cChunk & a_Chunk);
|
||||||
|
|
||||||
/** If an entity is currently swimming in or submerged under water */
|
|
||||||
bool m_IsSwimming, m_IsSubmerged;
|
|
||||||
|
|
||||||
/** Air level of a mobile */
|
|
||||||
int m_AirLevel;
|
|
||||||
int m_AirTickTimer;
|
|
||||||
|
|
||||||
/** Structure storing the portal delay timer and cooldown boolean */
|
|
||||||
struct sPortalCooldownData
|
|
||||||
{
|
|
||||||
/** Ticks since entry of portal, used to delay teleportation */
|
|
||||||
unsigned short m_TicksDelayed;
|
|
||||||
|
|
||||||
/** Whether the entity has just exited the portal, and should therefore not be teleported again
|
|
||||||
This prevents teleportation loops, and is reset when the entity has moved out of the portal
|
|
||||||
*/
|
|
||||||
bool m_ShouldPreventTeleportation;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Portal delay timer and cooldown boolean data */
|
|
||||||
sPortalCooldownData m_PortalCooldownData;
|
|
||||||
|
|
||||||
/** The number of ticks this entity has been alive for */
|
|
||||||
long int m_TicksAlive;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** Measured in degrees, [-180, +180) */
|
/** Measured in degrees, [-180, +180) */
|
||||||
double m_HeadYaw;
|
double m_HeadYaw;
|
||||||
|
@ -22,7 +22,7 @@ class cFallingBlock :
|
|||||||
public:
|
public:
|
||||||
CLASS_PROTODEF(cFallingBlock)
|
CLASS_PROTODEF(cFallingBlock)
|
||||||
|
|
||||||
/// Creates a new falling block. a_BlockPosition is expected in world coords
|
/** Creates a new falling block. a_BlockPosition is expected in world coords */
|
||||||
cFallingBlock(const Vector3i & a_BlockPosition, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
|
cFallingBlock(const Vector3i & a_BlockPosition, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
|
||||||
|
|
||||||
BLOCKTYPE GetBlockType(void) const { return m_BlockType; }
|
BLOCKTYPE GetBlockType(void) const { return m_BlockType; }
|
||||||
|
@ -54,10 +54,10 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the nearest entity that was hit, after the enumeration has been completed
|
/** Returns the nearest entity that was hit, after the enumeration has been completed */
|
||||||
cEntity * GetHitEntity(void) const { return m_HitEntity; }
|
cEntity * GetHitEntity(void) const { return m_HitEntity; }
|
||||||
|
|
||||||
/// Returns true if the callback has encountered a true hit
|
/** Returns true if the callback has encountered a true hit */
|
||||||
bool HasHit(void) const { return (m_MinCoeff < 1); }
|
bool HasHit(void) const { return (m_MinCoeff < 1); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Converts an angle in radians into a byte representation used by the network protocol
|
/** Converts an angle in radians into a byte representation used by the network protocol */
|
||||||
#define ANGLE_TO_PROTO(X) static_cast<Byte>(X * 255 / 360)
|
#define ANGLE_TO_PROTO(X) static_cast<Byte>(X * 255 / 360)
|
||||||
|
|
||||||
|
|
||||||
@ -190,13 +190,13 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the nearest entity that was hit, after the enumeration has been completed
|
/** Returns the nearest entity that was hit, after the enumeration has been completed */
|
||||||
cEntity * GetHitEntity(void) const { return m_HitEntity; }
|
cEntity * GetHitEntity(void) const { return m_HitEntity; }
|
||||||
|
|
||||||
/// Returns the line coeff where the hit was encountered, after the enumeration has been completed
|
/** Returns the line coeff where the hit was encountered, after the enumeration has been completed */
|
||||||
double GetMinCoeff(void) const { return m_MinCoeff; }
|
double GetMinCoeff(void) const { return m_MinCoeff; }
|
||||||
|
|
||||||
/// Returns true if the callback has encountered a true hit
|
/** Returns true if the callback has encountered a true hit */
|
||||||
bool HasHit(void) const { return (m_MinCoeff < 1); }
|
bool HasHit(void) const { return (m_MinCoeff < 1); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -8,9 +8,13 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Converts an angle in radians into a byte representation used by the network protocol
|
/** Converts an angle in radians into a byte representation used by the network protocol */
|
||||||
#define ANGLE_TO_PROTO(X) static_cast<Byte>(X * 255 / 360)
|
#define ANGLE_TO_PROTO(X) static_cast<Byte>(X * 255 / 360)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// cSplashPotionEntityCallback:
|
// cSplashPotionEntityCallback:
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// A simple cache that stores N most recently generated chunks' biomes; N being settable upon creation
|
/** A simple cache that stores N most recently generated chunks' biomes; N being settable upon creation */
|
||||||
class cBioGenCache :
|
class cBioGenCache :
|
||||||
public cBiomeGen
|
public cBiomeGen
|
||||||
{
|
{
|
||||||
@ -112,7 +112,7 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Base class for generators that use a list of available biomes. This class takes care of the list.
|
/** Base class for generators that use a list of available biomes. This class takes care of the list. */
|
||||||
class cBiomeGenList :
|
class cBiomeGenList :
|
||||||
public cBiomeGen
|
public cBiomeGen
|
||||||
{
|
{
|
||||||
@ -124,7 +124,7 @@ protected:
|
|||||||
EMCSBiomes m_Biomes;
|
EMCSBiomes m_Biomes;
|
||||||
int m_BiomesCount; // Pulled out of m_Biomes for faster access
|
int m_BiomesCount; // Pulled out of m_Biomes for faster access
|
||||||
|
|
||||||
/// Parses the INI file setting string into m_Biomes.
|
/** Parses the INI file setting string into m_Biomes. */
|
||||||
void InitializeBiomes(const AString & a_Biomes);
|
void InitializeBiomes(const AString & a_Biomes);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
@ -188,20 +188,20 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// Noise used for the distortion
|
/** Noise used for the distortion */
|
||||||
cNoise m_Noise;
|
cNoise m_Noise;
|
||||||
|
|
||||||
/// The underlying Voronoi map of the biomes
|
/** The underlying Voronoi map of the biomes */
|
||||||
cVoronoiMap m_Voronoi;
|
cVoronoiMap m_Voronoi;
|
||||||
|
|
||||||
/// Size of the Voronoi cells, also used for distortion amplitude
|
/** Size of the Voronoi cells, also used for distortion amplitude */
|
||||||
int m_CellSize;
|
int m_CellSize;
|
||||||
|
|
||||||
// cBiomeGen overrides:
|
// cBiomeGen overrides:
|
||||||
virtual void GenBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap) override;
|
virtual void GenBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap) override;
|
||||||
virtual void InitializeBiomeGen(cIniFile & a_IniFile) override;
|
virtual void InitializeBiomeGen(cIniFile & a_IniFile) override;
|
||||||
|
|
||||||
/// Distorts the coords using a Perlin-like noise
|
/** Distorts the coords using a Perlin-like noise */
|
||||||
void Distort(int a_BlockX, int a_BlockZ, int & a_DistortedX, int & a_DistortedZ);
|
void Distort(int a_BlockX, int a_BlockZ, int & a_DistortedX, int & a_DistortedZ);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
@ -241,30 +241,27 @@ protected:
|
|||||||
virtual void InitializeBiomeGen(cIniFile & a_IniFile) override;
|
virtual void InitializeBiomeGen(cIniFile & a_IniFile) override;
|
||||||
|
|
||||||
/** Step 1: Decides between ocean, land and mushroom, using a DistVoronoi with special conditions and post-processing for mushroom islands
|
/** Step 1: Decides between ocean, land and mushroom, using a DistVoronoi with special conditions and post-processing for mushroom islands
|
||||||
Sets biomes to biOcean, -1 (i.e. land), biMushroomIsland or biMushroomShore
|
Sets biomes to biOcean, -1 (i.e. land), biMushroomIsland or biMushroomShore. */
|
||||||
*/
|
|
||||||
void DecideOceanLandMushroom(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap);
|
void DecideOceanLandMushroom(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap);
|
||||||
|
|
||||||
/** Step 2: Add rivers to the land
|
/** Step 2: Add rivers to the land
|
||||||
Flips some "-1" biomes into biRiver
|
Flips some "-1" biomes into biRiver. */
|
||||||
*/
|
|
||||||
void AddRivers(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap);
|
void AddRivers(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap);
|
||||||
|
|
||||||
/** Step 3: Decide land biomes using a temperature / humidity map; freeze ocean / river in low temperatures.
|
/** Step 3: Decide land biomes using a temperature / humidity map; freeze ocean / river in low temperatures.
|
||||||
Flips all remaining "-1" biomes into land biomes. Also flips some biOcean and biRiver into biFrozenOcean, biFrozenRiver, based on temp map.
|
Flips all remaining "-1" biomes into land biomes. Also flips some biOcean and biRiver into biFrozenOcean, biFrozenRiver, based on temp map. */
|
||||||
*/
|
|
||||||
void ApplyTemperatureHumidity(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap);
|
void ApplyTemperatureHumidity(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap);
|
||||||
|
|
||||||
/// Distorts the coords using a Perlin-like noise, with a specified cell-size
|
/** Distorts the coords using a Perlin-like noise, with a specified cell-size */
|
||||||
void Distort(int a_BlockX, int a_BlockZ, int & a_DistortedX, int & a_DistortedZ, int a_CellSize);
|
void Distort(int a_BlockX, int a_BlockZ, int & a_DistortedX, int & a_DistortedZ, int a_CellSize);
|
||||||
|
|
||||||
/// Builds two Perlin-noise maps, one for temperature, the other for humidity. Trims both into [0..255] range
|
/** Builds two Perlin-noise maps, one for temperature, the other for humidity. Trims both into [0..255] range */
|
||||||
void BuildTemperatureHumidityMaps(int a_ChunkX, int a_ChunkZ, IntMap & a_TemperatureMap, IntMap & a_HumidityMap);
|
void BuildTemperatureHumidityMaps(int a_ChunkX, int a_ChunkZ, IntMap & a_TemperatureMap, IntMap & a_HumidityMap);
|
||||||
|
|
||||||
/// Flips all remaining "-1" biomes into land biomes using the two maps
|
/** Flips all remaining "-1" biomes into land biomes using the two maps */
|
||||||
void DecideLandBiomes(cChunkDef::BiomeMap & a_BiomeMap, const IntMap & a_TemperatureMap, const IntMap & a_HumidityMap);
|
void DecideLandBiomes(cChunkDef::BiomeMap & a_BiomeMap, const IntMap & a_TemperatureMap, const IntMap & a_HumidityMap);
|
||||||
|
|
||||||
/// Flips biOcean and biRiver into biFrozenOcean and biFrozenRiver if the temperature is too low
|
/** Flips biOcean and biRiver into biFrozenOcean and biFrozenRiver if the temperature is too low */
|
||||||
void FreezeWaterBiomes(cChunkDef::BiomeMap & a_BiomeMap, const IntMap & a_TemperatureMap);
|
void FreezeWaterBiomes(cChunkDef::BiomeMap & a_BiomeMap, const IntMap & a_TemperatureMap);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
@ -281,10 +278,10 @@ public:
|
|||||||
cBioGenTwoLevel(int a_Seed);
|
cBioGenTwoLevel(int a_Seed);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// The Voronoi map that decides the groups of biomes
|
/** The Voronoi map that decides the groups of biomes */
|
||||||
cVoronoiMap m_VoronoiLarge;
|
cVoronoiMap m_VoronoiLarge;
|
||||||
|
|
||||||
/// The Voronoi map that decides biomes inside individual biome groups
|
/** The Voronoi map that decides biomes inside individual biome groups */
|
||||||
cVoronoiMap m_VoronoiSmall;
|
cVoronoiMap m_VoronoiSmall;
|
||||||
|
|
||||||
// The noises used for the distortion:
|
// The noises used for the distortion:
|
||||||
@ -308,9 +305,9 @@ protected:
|
|||||||
virtual void GenBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap) override;
|
virtual void GenBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap) override;
|
||||||
virtual void InitializeBiomeGen(cIniFile & a_IniFile) override;
|
virtual void InitializeBiomeGen(cIniFile & a_IniFile) override;
|
||||||
|
|
||||||
/// Selects biome from the specified biome group, based on the specified index.
|
/** Selects biome from the specified biome group, based on the specified index.
|
||||||
/// Note that both params may overflow
|
Note that both params may overflow
|
||||||
/// a_DistLevel is either 0 or 1; zero when it is at the edge of the small Voronoi cell, 1 near the center
|
a_DistLevel is either 0 or 1; zero when it is at the edge of the small Voronoi cell, 1 near the center */
|
||||||
EMCSBiome SelectBiome(int a_BiomeGroup, size_t a_BiomeIdx, int a_DistLevel);
|
EMCSBiome SelectBiome(int a_BiomeGroup, size_t a_BiomeIdx, int a_DistLevel);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ typedef std::vector<cCaveDefPoint> cCaveDefPoints;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// A single non-branching tunnel of a WormNestCave
|
/** A single non-branching tunnel of a WormNestCave */
|
||||||
class cCaveTunnel
|
class cCaveTunnel
|
||||||
{
|
{
|
||||||
// The bounding box, including the radii around defpoints:
|
// The bounding box, including the radii around defpoints:
|
||||||
@ -72,19 +72,19 @@ class cCaveTunnel
|
|||||||
int m_MinBlockY, m_MaxBlockY;
|
int m_MinBlockY, m_MaxBlockY;
|
||||||
int m_MinBlockZ, m_MaxBlockZ;
|
int m_MinBlockZ, m_MaxBlockZ;
|
||||||
|
|
||||||
/// Generates the shaping defpoints for the ravine, based on the ravine block coords and noise
|
/** Generates the shaping defpoints for the cave, based on the cave block coords and noise */
|
||||||
void Randomize(cNoise & a_Noise);
|
void Randomize(cNoise & a_Noise);
|
||||||
|
|
||||||
/// Refines (adds and smooths) defpoints from a_Src into a_Dst; returns false if no refinement possible (segments too short)
|
/** Refines (adds and smooths) defpoints from a_Src into a_Dst; returns false if no refinement possible (segments too short) */
|
||||||
bool RefineDefPoints(const cCaveDefPoints & a_Src, cCaveDefPoints & a_Dst);
|
bool RefineDefPoints(const cCaveDefPoints & a_Src, cCaveDefPoints & a_Dst);
|
||||||
|
|
||||||
/// Does rounds of smoothing, two passes of RefineDefPoints(), as long as they return true
|
/** Does rounds of smoothing, two passes of RefineDefPoints(), as long as they return true */
|
||||||
void Smooth(void);
|
void Smooth(void);
|
||||||
|
|
||||||
/// Linearly interpolates the points so that the maximum distance between two neighbors is max 1 block
|
/** Linearly interpolates the points so that the maximum distance between two neighbors is max 1 block */
|
||||||
void FinishLinear(void);
|
void FinishLinear(void);
|
||||||
|
|
||||||
/// Calculates the bounding box of the points present
|
/** Calculates the bounding box of the points present */
|
||||||
void CalcBoundingBox(void);
|
void CalcBoundingBox(void);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -96,7 +96,7 @@ public:
|
|||||||
cNoise & a_Noise
|
cNoise & a_Noise
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Carves the tunnel into the chunk specified
|
/** Carves the tunnel into the chunk specified */
|
||||||
void ProcessChunk(
|
void ProcessChunk(
|
||||||
int a_ChunkX, int a_ChunkZ,
|
int a_ChunkX, int a_ChunkZ,
|
||||||
cChunkDef::BlockTypes & a_BlockTypes,
|
cChunkDef::BlockTypes & a_BlockTypes,
|
||||||
@ -115,7 +115,7 @@ typedef std::vector<cCaveTunnel *> cCaveTunnels;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// A collection of connected tunnels, possibly branching.
|
/** A collection of connected tunnels, possibly branching. */
|
||||||
class cStructGenWormNestCaves::cCaveSystem :
|
class cStructGenWormNestCaves::cCaveSystem :
|
||||||
public cGridStructGen::cStructure
|
public cGridStructGen::cStructure
|
||||||
{
|
{
|
||||||
@ -135,13 +135,13 @@ protected:
|
|||||||
|
|
||||||
void Clear(void);
|
void Clear(void);
|
||||||
|
|
||||||
/// Generates a_Segment successive tunnels, with possible branches. Generates the same output for the same [x, y, z, a_Segments]
|
/** Generates a_Segment successive tunnels, with possible branches. Generates the same output for the same [x, y, z, a_Segments] */
|
||||||
void GenerateTunnelsFromPoint(
|
void GenerateTunnelsFromPoint(
|
||||||
int a_OriginX, int a_OriginY, int a_OriginZ,
|
int a_OriginX, int a_OriginY, int a_OriginZ,
|
||||||
cNoise & a_Noise, int a_Segments
|
cNoise & a_Noise, int a_Segments
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Returns a radius based on the location provided.
|
/** Returns a radius based on the location provided. */
|
||||||
int GetRadius(cNoise & a_Noise, int a_OriginX, int a_OriginY, int a_OriginZ);
|
int GetRadius(cNoise & a_Noise, int a_OriginX, int a_OriginY, int a_OriginZ);
|
||||||
|
|
||||||
// cGridStructGen::cStructure overrides:
|
// cGridStructGen::cStructure overrides:
|
||||||
|
@ -12,10 +12,10 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// If the generation queue size exceeds this number, a warning will be output
|
/** If the generation queue size exceeds this number, a warning will be output */
|
||||||
const unsigned int QUEUE_WARNING_LIMIT = 1000;
|
const unsigned int QUEUE_WARNING_LIMIT = 1000;
|
||||||
|
|
||||||
/// If the generation queue size exceeds this number, chunks with no clients will be skipped
|
/** If the generation queue size exceeds this number, chunks with no clients will be skipped */
|
||||||
const unsigned int QUEUE_SKIP_LIMIT = 500;
|
const unsigned int QUEUE_SKIP_LIMIT = 500;
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,16 +46,16 @@ public:
|
|||||||
cGenerator(cChunkGenerator & a_ChunkGenerator);
|
cGenerator(cChunkGenerator & a_ChunkGenerator);
|
||||||
virtual ~cGenerator() {} // Force a virtual destructor
|
virtual ~cGenerator() {} // Force a virtual destructor
|
||||||
|
|
||||||
/// Called to initialize the generator on server startup.
|
/** Called to initialize the generator on server startup. */
|
||||||
virtual void Initialize(cIniFile & a_IniFile);
|
virtual void Initialize(cIniFile & a_IniFile);
|
||||||
|
|
||||||
/// Generates the biomes for the specified chunk (directly, not in a separate thread). Used by the world loader if biomes failed loading.
|
/** Generates the biomes for the specified chunk (directly, not in a separate thread). Used by the world loader if biomes failed loading. */
|
||||||
virtual void GenerateBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap) = 0;
|
virtual void GenerateBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap) = 0;
|
||||||
|
|
||||||
/// Returns the biome at the specified coords. Used by ChunkMap if an invalid chunk is queried for biome. Default implementation uses GenerateBiomes().
|
/** Returns the biome at the specified coords. Used by ChunkMap if an invalid chunk is queried for biome. Default implementation uses GenerateBiomes(). */
|
||||||
virtual EMCSBiome GetBiomeAt(int a_BlockX, int a_BlockZ);
|
virtual EMCSBiome GetBiomeAt(int a_BlockX, int a_BlockZ);
|
||||||
|
|
||||||
/// Called in a separate thread to do the actual chunk generation. Generator should generate into a_ChunkDesc.
|
/** Called in a separate thread to do the actual chunk generation. Generator should generate into a_ChunkDesc. */
|
||||||
virtual void DoGenerate(int a_ChunkX, int a_ChunkZ, cChunkDesc & a_ChunkDesc) = 0;
|
virtual void DoGenerate(int a_ChunkX, int a_ChunkZ, cChunkDesc & a_ChunkDesc) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -71,13 +71,11 @@ public:
|
|||||||
virtual ~cPluginInterface() {}
|
virtual ~cPluginInterface() {}
|
||||||
|
|
||||||
/** Called when the chunk is about to be generated.
|
/** Called when the chunk is about to be generated.
|
||||||
The generator may be partly or fully overriden by the implementation
|
The generator may be partly or fully overriden by the implementation. */
|
||||||
*/
|
|
||||||
virtual void CallHookChunkGenerating(cChunkDesc & a_ChunkDesc) = 0;
|
virtual void CallHookChunkGenerating(cChunkDesc & a_ChunkDesc) = 0;
|
||||||
|
|
||||||
/** Called after the chunk is generated, before it is handed to the chunk sink.
|
/** Called after the chunk is generated, before it is handed to the chunk sink.
|
||||||
a_ChunkDesc contains the generated chunk data. Implementation may modify this data.
|
a_ChunkDesc contains the generated chunk data. Implementation may modify this data. */
|
||||||
*/
|
|
||||||
virtual void CallHookChunkGenerated(cChunkDesc & a_ChunkDesc) = 0;
|
virtual void CallHookChunkGenerated(cChunkDesc & a_ChunkDesc) = 0;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
@ -92,19 +90,16 @@ public:
|
|||||||
/** Called after the chunk has been generated
|
/** Called after the chunk has been generated
|
||||||
The interface may store the chunk, send it over network, whatever.
|
The interface may store the chunk, send it over network, whatever.
|
||||||
The chunk is not expected to be modified, but the generator will survive if the implementation
|
The chunk is not expected to be modified, but the generator will survive if the implementation
|
||||||
changes the data within. All changes are ignored, though.
|
changes the data within. All changes are ignored, though. */
|
||||||
*/
|
|
||||||
virtual void OnChunkGenerated(cChunkDesc & a_ChunkDesc) = 0;
|
virtual void OnChunkGenerated(cChunkDesc & a_ChunkDesc) = 0;
|
||||||
|
|
||||||
/** Called just before the chunk generation is started,
|
/** Called just before the chunk generation is started,
|
||||||
to verify that it hasn't been generated in the meantime.
|
to verify that it hasn't been generated in the meantime.
|
||||||
If this callback returns true, the chunk is not generated.
|
If this callback returns true, the chunk is not generated. */
|
||||||
*/
|
|
||||||
virtual bool IsChunkValid(int a_ChunkX, int a_ChunkZ) = 0;
|
virtual bool IsChunkValid(int a_ChunkX, int a_ChunkZ) = 0;
|
||||||
|
|
||||||
/** Called when the generator is overloaded to skip chunks that are no longer needed.
|
/** Called when the generator is overloaded to skip chunks that are no longer needed.
|
||||||
If this callback returns false, the chunk is not generated.
|
If this callback returns false, the chunk is not generated. */
|
||||||
*/
|
|
||||||
virtual bool HasChunkAnyClients(int a_ChunkX, int a_ChunkZ) = 0;
|
virtual bool HasChunkAnyClients(int a_ChunkX, int a_ChunkZ) = 0;
|
||||||
|
|
||||||
/** Called to check whether the specified chunk is in the queued state.
|
/** Called to check whether the specified chunk is in the queued state.
|
||||||
@ -126,7 +121,7 @@ public:
|
|||||||
If the generator becomes overloaded and skips this chunk, the callback is still called. */
|
If the generator becomes overloaded and skips this chunk, the callback is still called. */
|
||||||
void QueueGenerateChunk(int a_ChunkX, int a_ChunkZ, bool a_ForceGenerate, cChunkCoordCallback * a_Callback = nullptr);
|
void QueueGenerateChunk(int a_ChunkX, int a_ChunkZ, bool a_ForceGenerate, cChunkCoordCallback * a_Callback = nullptr);
|
||||||
|
|
||||||
/// Generates the biomes for the specified chunk (directly, not in a separate thread). Used by the world loader if biomes failed loading.
|
/** Generates the biomes for the specified chunk (directly, not in a separate thread). Used by the world loader if biomes failed loading. */
|
||||||
void GenerateBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap);
|
void GenerateBiomes(int a_ChunkX, int a_ChunkZ, cChunkDef::BiomeMap & a_BiomeMap);
|
||||||
|
|
||||||
void WaitForQueueEmpty(void);
|
void WaitForQueueEmpty(void);
|
||||||
@ -151,7 +146,7 @@ private:
|
|||||||
/** Force the regeneration of an already existing chunk */
|
/** Force the regeneration of an already existing chunk */
|
||||||
bool m_ForceGenerate;
|
bool m_ForceGenerate;
|
||||||
|
|
||||||
/** Callback to call after generating.*/
|
/** Callback to call after generating. */
|
||||||
cChunkCoordCallback * m_Callback;
|
cChunkCoordCallback * m_Callback;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
/** Decodes the position index along the room walls into a proper 2D position for a chest.
|
/** Decodes the position index along the room walls into a proper 2D position for a chest.
|
||||||
The Y coord of the returned vector specifies the chest's meta value*/
|
The Y coord of the returned vector specifies the chest's meta value. */
|
||||||
Vector3i DecodeChestCoords(int a_PosIdx, int a_SizeX, int a_SizeZ)
|
Vector3i DecodeChestCoords(int a_PosIdx, int a_SizeX, int a_SizeZ)
|
||||||
{
|
{
|
||||||
if (a_PosIdx < a_SizeX)
|
if (a_PosIdx < a_SizeX)
|
||||||
|
@ -77,7 +77,6 @@ void cEndGen::InitializeCompoGen(cIniFile & a_IniFile)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Unless the LastChunk coords are equal to coords given, prepares the internal state (noise array)
|
|
||||||
void cEndGen::PrepareState(int a_ChunkX, int a_ChunkZ)
|
void cEndGen::PrepareState(int a_ChunkX, int a_ChunkZ)
|
||||||
{
|
{
|
||||||
ASSERT(!IsChunkOutsideRange(a_ChunkX, a_ChunkZ)); // Should be filtered before calling this function
|
ASSERT(!IsChunkOutsideRange(a_ChunkX, a_ChunkZ)); // Should be filtered before calling this function
|
||||||
@ -97,7 +96,6 @@ void cEndGen::PrepareState(int a_ChunkX, int a_ChunkZ)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Generates the m_NoiseArray array for the current chunk
|
|
||||||
void cEndGen::GenerateNoiseArray(void)
|
void cEndGen::GenerateNoiseArray(void)
|
||||||
{
|
{
|
||||||
NOISE_DATATYPE NoiseData[DIM_X * DIM_Y * DIM_Z]; // [x + DIM_X * z + DIM_X * DIM_Z * y]
|
NOISE_DATATYPE NoiseData[DIM_X * DIM_Y * DIM_Z]; // [x + DIM_X * z + DIM_X * DIM_Z * y]
|
||||||
@ -140,7 +138,6 @@ void cEndGen::GenerateNoiseArray(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Returns true if the chunk is outside of the island's dimensions
|
|
||||||
bool cEndGen::IsChunkOutsideRange(int a_ChunkX, int a_ChunkZ)
|
bool cEndGen::IsChunkOutsideRange(int a_ChunkX, int a_ChunkZ)
|
||||||
{
|
{
|
||||||
return (
|
return (
|
||||||
|
@ -25,10 +25,10 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/// Seed for the noise
|
/** Seed for the noise */
|
||||||
int m_Seed;
|
int m_Seed;
|
||||||
|
|
||||||
/// The Perlin noise used for generating
|
/** The Perlin noise used for generating */
|
||||||
cPerlinNoise m_Perlin;
|
cPerlinNoise m_Perlin;
|
||||||
|
|
||||||
// XYZ size of the "island", in blocks:
|
// XYZ size of the "island", in blocks:
|
||||||
@ -50,18 +50,21 @@ protected:
|
|||||||
int m_LastChunkZ;
|
int m_LastChunkZ;
|
||||||
NOISE_DATATYPE m_NoiseArray[17 * 17 * 257]; // x + 17 * z + 17 * 17 * y
|
NOISE_DATATYPE m_NoiseArray[17 * 17 * 257]; // x + 17 * z + 17 * 17 * y
|
||||||
|
|
||||||
/// Unless the LastChunk coords are equal to coords given, prepares the internal state (noise array)
|
|
||||||
|
/** Unless the LastChunk coords are equal to coords given, prepares the internal state (noise array) */
|
||||||
void PrepareState(int a_ChunkX, int a_ChunkZ);
|
void PrepareState(int a_ChunkX, int a_ChunkZ);
|
||||||
|
|
||||||
/// Generates the m_NoiseArray array for the current chunk
|
/** Generates the m_NoiseArray array for the current chunk */
|
||||||
void GenerateNoiseArray(void);
|
void GenerateNoiseArray(void);
|
||||||
|
|
||||||
/// Returns true if the chunk is outside of the island's dimensions
|
/** Returns true if the chunk is outside of the island's dimensions */
|
||||||
bool IsChunkOutsideRange(int a_ChunkX, int a_ChunkZ);
|
bool IsChunkOutsideRange(int a_ChunkX, int a_ChunkZ);
|
||||||
|
|
||||||
|
|
||||||
// cTerrainShapeGen overrides:
|
// cTerrainShapeGen overrides:
|
||||||
virtual void GenShape(int a_ChunkX, int a_ChunkZ, cChunkDesc::Shape & a_Shape) override;
|
virtual void GenShape(int a_ChunkX, int a_ChunkZ, cChunkDesc::Shape & a_Shape) override;
|
||||||
|
|
||||||
|
|
||||||
// cTerrainCompositionGen overrides:
|
// cTerrainCompositionGen overrides:
|
||||||
virtual void ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape) override;
|
virtual void ComposeTerrain(cChunkDesc & a_ChunkDesc, const cChunkDesc::Shape & a_Shape) override;
|
||||||
virtual void InitializeCompoGen(cIniFile & a_IniFile) override;
|
virtual void InitializeCompoGen(cIniFile & a_IniFile) override;
|
||||||
|
@ -192,7 +192,7 @@ protected:
|
|||||||
cNoise m_Noise;
|
cNoise m_Noise;
|
||||||
int m_Seed;
|
int m_Seed;
|
||||||
|
|
||||||
/// Tries to place sugarcane at the coords specified, returns true if successful
|
/** Tries to place sugarcane at the coords specified, returns true if successful */
|
||||||
bool TryAddSugarcane(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ);
|
bool TryAddSugarcane(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ);
|
||||||
|
|
||||||
// Returns true is the specified biome is a desert or its variant
|
// Returns true is the specified biome is a desert or its variant
|
||||||
@ -209,8 +209,7 @@ protected:
|
|||||||
/** This class adds a single top block in random positions in the specified biome on top of specified allowed blocks.
|
/** This class adds a single top block in random positions in the specified biome on top of specified allowed blocks.
|
||||||
Used for:
|
Used for:
|
||||||
- Lilypads finisher
|
- Lilypads finisher
|
||||||
- DeadBushes finisher
|
- DeadBushes finisher */
|
||||||
*/
|
|
||||||
class cFinishGenSingleTopBlock :
|
class cFinishGenSingleTopBlock :
|
||||||
public cFinishGen
|
public cFinishGen
|
||||||
{
|
{
|
||||||
@ -258,17 +257,20 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
cNoise m_Noise;
|
cNoise m_Noise;
|
||||||
BLOCKTYPE m_BlockType;
|
BLOCKTYPE m_BlockType;
|
||||||
int m_Amount; ///< Relative amount of blocks to try adding. 1 = one block per 256 biome columns.
|
|
||||||
|
/** Relative amount of blocks to try adding. 1 = one block per 256 biome columns. */
|
||||||
|
int m_Amount;
|
||||||
|
|
||||||
|
|
||||||
int GetNumToGen(const cChunkDef::BiomeMap & a_BiomeMap);
|
int GetNumToGen(const cChunkDef::BiomeMap & a_BiomeMap);
|
||||||
|
|
||||||
// Returns true if the given biome is a biome that is allowed.
|
/** Returns true if the given biome is a biome that is allowed. */
|
||||||
inline bool IsAllowedBiome(EMCSBiome a_Biome)
|
inline bool IsAllowedBiome(EMCSBiome a_Biome)
|
||||||
{
|
{
|
||||||
return m_IsBiomeAllowed[a_Biome];
|
return m_IsBiomeAllowed[a_Biome];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns true if the given blocktype may be below m_BlockType
|
/** Returns true if the given blocktype may be below m_BlockType */
|
||||||
inline bool IsAllowedBlockBelow(BLOCKTYPE a_BlockBelow)
|
inline bool IsAllowedBlockBelow(BLOCKTYPE a_BlockBelow)
|
||||||
{
|
{
|
||||||
return m_IsAllowedBelow[a_BlockBelow];
|
return m_IsAllowedBelow[a_BlockBelow];
|
||||||
@ -316,7 +318,7 @@ protected:
|
|||||||
bool m_PreSimulateWater;
|
bool m_PreSimulateWater;
|
||||||
bool m_PreSimulateLava;
|
bool m_PreSimulateLava;
|
||||||
|
|
||||||
// Drops hanging sand and gravel down to the ground, recalculates heightmap
|
/** Drops hanging sand and gravel down to the ground, recalculates heightmap */
|
||||||
void CollapseSandGravel(
|
void CollapseSandGravel(
|
||||||
cChunkDef::BlockTypes & a_BlockTypes, // Block types to read and change
|
cChunkDef::BlockTypes & a_BlockTypes, // Block types to read and change
|
||||||
cChunkDef::HeightMap & a_HeightMap // Height map to update by the current data
|
cChunkDef::HeightMap & a_HeightMap // Height map to update by the current data
|
||||||
@ -324,8 +326,7 @@ protected:
|
|||||||
|
|
||||||
/** For each fluid block:
|
/** For each fluid block:
|
||||||
- if all surroundings are of the same fluid, makes it stationary; otherwise makes it flowing (excl. top)
|
- if all surroundings are of the same fluid, makes it stationary; otherwise makes it flowing (excl. top)
|
||||||
- all fluid on the chunk's edge is made flowing
|
- all fluid on the chunk's edge is made flowing */
|
||||||
*/
|
|
||||||
void StationarizeFluid(
|
void StationarizeFluid(
|
||||||
cChunkDef::BlockTypes & a_BlockTypes, // Block types to read and change
|
cChunkDef::BlockTypes & a_BlockTypes, // Block types to read and change
|
||||||
cChunkDef::HeightMap & a_HeightMap, // Height map to read
|
cChunkDef::HeightMap & a_HeightMap, // Height map to read
|
||||||
|
@ -390,7 +390,7 @@ void cHeiGenMountains::InitializeHeightGen(cIniFile & a_IniFile)
|
|||||||
|
|
||||||
const cHeiGenBiomal::sGenParam cHeiGenBiomal::m_GenParam[256] =
|
const cHeiGenBiomal::sGenParam cHeiGenBiomal::m_GenParam[256] =
|
||||||
{
|
{
|
||||||
/* Fast-changing | Middle-changing | Slow-changing |*/
|
/* Fast-changing | Middle-changing | Slow-changing | */
|
||||||
/* Biome | Freq1 | Amp1 | Freq2 | Amp2 | Freq3 | Amp3 | BaseHeight */
|
/* Biome | Freq1 | Amp1 | Freq2 | Amp2 | Freq3 | Amp3 | BaseHeight */
|
||||||
/* biOcean */ { 0.1f, 2.0f, 0.05f, 10.0f, 0.01f, 8.0f, 50},
|
/* biOcean */ { 0.1f, 2.0f, 0.05f, 10.0f, 0.01f, 8.0f, 50},
|
||||||
/* biPlains */ { 0.1f, 1.0f, 0.05f, 1.5f, 0.01f, 4.0f, 68},
|
/* biPlains */ { 0.1f, 1.0f, 0.05f, 1.5f, 0.01f, 4.0f, 68},
|
||||||
|
@ -67,18 +67,17 @@ public:
|
|||||||
|
|
||||||
virtual ~cMineShaft() {}
|
virtual ~cMineShaft() {}
|
||||||
|
|
||||||
/// Returns true if this mineshaft intersects the specified cuboid
|
/** Returns true if this mineshaft intersects the specified cuboid */
|
||||||
bool DoesIntersect(const cCuboid & a_Other)
|
bool DoesIntersect(const cCuboid & a_Other)
|
||||||
{
|
{
|
||||||
return m_BoundingBox.DoesIntersect(a_Other);
|
return m_BoundingBox.DoesIntersect(a_Other);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** If recursion level is not too large, appends more branches to the parent system,
|
/** If recursion level is not too large, appends more branches to the parent system,
|
||||||
using exit points specific to this class.
|
using exit points specific to this class. */
|
||||||
*/
|
|
||||||
virtual void AppendBranches(int a_RecursionLevel, cNoise & a_Noise) = 0;
|
virtual void AppendBranches(int a_RecursionLevel, cNoise & a_Noise) = 0;
|
||||||
|
|
||||||
/// Imprints this shape into the specified chunk's data
|
/** Imprints this shape into the specified chunk's data */
|
||||||
virtual void ProcessChunk(cChunkDesc & a_ChunkDesc) = 0;
|
virtual void ProcessChunk(cChunkDesc & a_ChunkDesc) = 0;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
@ -141,16 +140,16 @@ protected:
|
|||||||
virtual void AppendBranches(int a_RecursionLevel, cNoise & a_Noise) override;
|
virtual void AppendBranches(int a_RecursionLevel, cNoise & a_Noise) override;
|
||||||
virtual void ProcessChunk(cChunkDesc & a_ChunkDesc) override;
|
virtual void ProcessChunk(cChunkDesc & a_ChunkDesc) override;
|
||||||
|
|
||||||
/// Places a chest, if the corridor has one
|
/** Places a chest, if the corridor has one */
|
||||||
void PlaceChest(cChunkDesc & a_ChunkDesc);
|
void PlaceChest(cChunkDesc & a_ChunkDesc);
|
||||||
|
|
||||||
/// If this corridor has tracks, places them randomly
|
/** If this corridor has tracks, places them randomly */
|
||||||
void PlaceTracks(cChunkDesc & a_ChunkDesc);
|
void PlaceTracks(cChunkDesc & a_ChunkDesc);
|
||||||
|
|
||||||
/// If this corridor has a spawner, places the spawner
|
/** If this corridor has a spawner, places the spawner */
|
||||||
void PlaceSpawner(cChunkDesc & a_ChunkDesc);
|
void PlaceSpawner(cChunkDesc & a_ChunkDesc);
|
||||||
|
|
||||||
/// Randomly places torches around the central beam block
|
/** Randomly places torches around the central beam block */
|
||||||
void PlaceTorches(cChunkDesc & a_ChunkDesc);
|
void PlaceTorches(cChunkDesc & a_ChunkDesc);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -58,13 +58,13 @@ protected:
|
|||||||
NOISE_DATATYPE m_FrequencyZ;
|
NOISE_DATATYPE m_FrequencyZ;
|
||||||
NOISE_DATATYPE m_AirThreshold;
|
NOISE_DATATYPE m_AirThreshold;
|
||||||
|
|
||||||
/// Generates the 3D noise array used for terrain generation; a_Noise is of ChunkData-size
|
/** Generates the 3D noise array used for terrain generation; a_Noise is of ChunkData-size */
|
||||||
void GenerateNoiseArray(int a_ChunkX, int a_ChunkZ, NOISE_DATATYPE * a_Noise);
|
void GenerateNoiseArray(int a_ChunkX, int a_ChunkZ, NOISE_DATATYPE * a_Noise);
|
||||||
|
|
||||||
/// Updates heightmap based on the chunk's contents
|
/** Updates heightmap based on the chunk's contents */
|
||||||
void UpdateHeightmap(cChunkDesc & a_ChunkDesc);
|
void UpdateHeightmap(cChunkDesc & a_ChunkDesc);
|
||||||
|
|
||||||
/// Composes terrain - adds dirt, grass and sand
|
/** Composes terrain - adds dirt, grass and sand */
|
||||||
void ComposeTerrain(cChunkDesc & a_ChunkDesc);
|
void ComposeTerrain(cChunkDesc & a_ChunkDesc);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ protected:
|
|||||||
/** The noise used for generating random numbers */
|
/** The noise used for generating random numbers */
|
||||||
cNoise m_Noise;
|
cNoise m_Noise;
|
||||||
|
|
||||||
/** Maximum depth of the generator tree*/
|
/** Maximum depth of the generator tree */
|
||||||
int m_MaxDepth;
|
int m_MaxDepth;
|
||||||
|
|
||||||
/** Maximum size, in X / Z blocks, of the structure (radius from the origin) */
|
/** Maximum size, in X / Z blocks, of the structure (radius from the origin) */
|
||||||
|
@ -64,7 +64,7 @@ public:
|
|||||||
cRavine(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ, int a_Size, cNoise & a_Noise);
|
cRavine(int a_GridX, int a_GridZ, int a_OriginX, int a_OriginZ, int a_Size, cNoise & a_Noise);
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
/// Exports itself as a SVG line definition
|
/** Exports itself as a SVG line definition */
|
||||||
AString ExportAsSVG(int a_Color, int a_OffsetX = 0, int a_OffsetZ = 0) const;
|
AString ExportAsSVG(int a_Color, int a_OffsetX = 0, int a_OffsetZ = 0) const;
|
||||||
#endif // _DEBUG
|
#endif // _DEBUG
|
||||||
|
|
||||||
|
@ -95,7 +95,7 @@ static const sCoordsArr BigOs[] =
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Pushes a specified layer of blocks of the same type around (x, h, z) into a_Blocks
|
/** Pushes a specified layer of blocks of the same type around (x, h, z) into a_Blocks */
|
||||||
inline void PushCoordBlocks(int a_BlockX, int a_Height, int a_BlockZ, sSetBlockVector & a_Blocks, const sCoords * a_Coords, size_t a_NumCoords, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta)
|
inline void PushCoordBlocks(int a_BlockX, int a_Height, int a_BlockZ, sSetBlockVector & a_Blocks, const sCoords * a_Coords, size_t a_NumCoords, BLOCKTYPE a_BlockType, NIBBLETYPE a_Meta)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < a_NumCoords; i++)
|
for (size_t i = 0; i < a_NumCoords; i++)
|
||||||
|
@ -52,61 +52,61 @@ class cWorld;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Generates an image of a tree at the specified coords (lowest trunk block) in the specified biome
|
/** Generates an image of a tree at the specified coords (lowest trunk block) in the specified biome */
|
||||||
void GetTreeImageByBiome(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, EMCSBiome a_Biome, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetTreeImageByBiome(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, EMCSBiome a_Biome, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Generates an image of a random apple tree
|
/** Generates an image of a random apple tree */
|
||||||
void GetAppleTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetAppleTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Generates an image of a small (nonbranching) apple tree
|
/** Generates an image of a small (nonbranching) apple tree */
|
||||||
void GetSmallAppleTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetSmallAppleTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Generates an image of a large (branching) apple tree
|
/** Generates an image of a large (branching) apple tree */
|
||||||
void GetLargeAppleTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetLargeAppleTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Generates a branch for a large apple tree
|
/** Generates a branch for a large apple tree */
|
||||||
void GetLargeAppleTreeBranch(int a_BlockX, int a_BlockY, int a_BlockZ, int a_BranchLength, Vector3d a_StartDirection, Vector3d a_Direction, int a_TreeHeight, cNoise & a_Noise, sSetBlockVector & a_LogBlocks);
|
void GetLargeAppleTreeBranch(int a_BlockX, int a_BlockY, int a_BlockZ, int a_BranchLength, Vector3d a_StartDirection, Vector3d a_Direction, int a_TreeHeight, cNoise & a_Noise, sSetBlockVector & a_LogBlocks);
|
||||||
|
|
||||||
/// Returns the meta for a log from the given direction
|
/** Returns the meta for a log from the given direction */
|
||||||
NIBBLETYPE GetLogMetaFromDirection(NIBBLETYPE a_BlockMeta, Vector3d a_Direction);
|
NIBBLETYPE GetLogMetaFromDirection(NIBBLETYPE a_BlockMeta, Vector3d a_Direction);
|
||||||
|
|
||||||
/// Generates an image of a random birch tree
|
/** Generates an image of a random birch tree */
|
||||||
void GetBirchTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetBirchTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Generates an image of a random acacia tree
|
/** Generates an image of a random acacia tree */
|
||||||
void GetAcaciaTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetAcaciaTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Generates an image of a random darkoak tree
|
/** Generates an image of a random darkoak tree */
|
||||||
void GetDarkoakTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetDarkoakTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Generates an image of a random large birch tree
|
/** Generates an image of a random large birch tree */
|
||||||
void GetTallBirchTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetTallBirchTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Generates an image of a random conifer tree
|
/** Generates an image of a random conifer tree */
|
||||||
void GetConiferTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetConiferTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Generates an image of a random spruce (short conifer, two layers of leaves)
|
/** Generates an image of a random spruce (short conifer, two layers of leaves) */
|
||||||
void GetSpruceTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetSpruceTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Generates an image of a random pine (tall conifer, little leaves at top)
|
/** Generates an image of a random pine (tall conifer, little leaves at top) */
|
||||||
void GetPineTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetPineTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Generates an image of a random swampland tree
|
/** Generates an image of a random swampland tree */
|
||||||
void GetSwampTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetSwampTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Generates an image of a random apple bush (for jungles)
|
/** Generates an image of a random apple bush (for jungles) */
|
||||||
void GetAppleBushImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetAppleBushImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Generates an image of a random jungle tree
|
/** Generates an image of a random jungle tree */
|
||||||
void GetJungleTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks, bool a_Large);
|
void GetJungleTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks, bool a_Large);
|
||||||
|
|
||||||
/// Generates an image of a large jungle tree (2x2 trunk)
|
/** Generates an image of a large jungle tree (2x2 trunk) */
|
||||||
void GetLargeJungleTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetLargeJungleTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Generates an image of a small jungle tree (1x1 trunk)
|
/** Generates an image of a small jungle tree (1x1 trunk) */
|
||||||
void GetSmallJungleTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
void GetSmallJungleTreeImage(int a_BlockX, int a_BlockY, int a_BlockZ, cNoise & a_Noise, int a_Seq, sSetBlockVector & a_LogBlocks, sSetBlockVector & a_OtherBlocks);
|
||||||
|
|
||||||
/// Moves the x and z coordinants to the north-west corner of a 2x2 of saplings. Returns true if a 2x2 was found, otherwise it returns false
|
/** Moves the x and z coordinants to the north-west corner of a 2x2 of saplings. Returns true if a 2x2 was found, otherwise it returns false */
|
||||||
bool GetLargeTreeAdjustment(cWorld & a_World, int & a_X, int & a_Y, int & a_Z, NIBBLETYPE a_Meta);
|
bool GetLargeTreeAdjustment(cWorld & a_World, int & a_X, int & a_Y, int & a_Z, NIBBLETYPE a_Meta);
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ protected:
|
|||||||
/** The noise used for generating random numbers */
|
/** The noise used for generating random numbers */
|
||||||
cNoise m_Noise;
|
cNoise m_Noise;
|
||||||
|
|
||||||
/** Maximum depth of the generator tree*/
|
/** Maximum depth of the generator tree */
|
||||||
int m_MaxDepth;
|
int m_MaxDepth;
|
||||||
|
|
||||||
/** Maximum size, in X / Z blocks, of the structure (radius from the origin) */
|
/** Maximum size, in X / Z blocks, of the structure (radius from the origin) */
|
||||||
|
@ -48,7 +48,7 @@ protected:
|
|||||||
/** The noise used for generating random numbers */
|
/** The noise used for generating random numbers */
|
||||||
cNoise m_Noise;
|
cNoise m_Noise;
|
||||||
|
|
||||||
/** Maximum depth of the generator tree*/
|
/** Maximum depth of the generator tree */
|
||||||
int m_MaxDepth;
|
int m_MaxDepth;
|
||||||
|
|
||||||
/** Maximum size, in X / Z blocks, of the village (radius from the origin) */
|
/** Maximum size, in X / Z blocks, of the village (radius from the origin) */
|
||||||
|
@ -329,15 +329,15 @@ void inline LOG(const char * a_Format, ...)
|
|||||||
|
|
||||||
// Common definitions:
|
// Common definitions:
|
||||||
|
|
||||||
/// Evaluates to the number of elements in an array (compile-time!)
|
/** Evaluates to the number of elements in an array (compile-time!) */
|
||||||
#define ARRAYCOUNT(X) (sizeof(X) / sizeof(*(X)))
|
#define ARRAYCOUNT(X) (sizeof(X) / sizeof(*(X)))
|
||||||
|
|
||||||
/// Allows arithmetic expressions like "32 KiB" (but consider using parenthesis around it, "(32 KiB)")
|
/** Allows arithmetic expressions like "32 KiB" (but consider using parenthesis around it, "(32 KiB)") */
|
||||||
#define KiB * 1024
|
#define KiB * 1024
|
||||||
#define MiB * 1024 * 1024
|
#define MiB * 1024 * 1024
|
||||||
|
|
||||||
/// Faster than (int)floorf((float)x / (float)div)
|
/** Faster than (int)floorf((float)x / (float)div) */
|
||||||
#define FAST_FLOOR_DIV( x, div) (((x) - (((x) < 0) ? ((div) - 1) : 0)) / (div))
|
#define FAST_FLOOR_DIV(x, div) (((x) - (((x) < 0) ? ((div) - 1) : 0)) / (div))
|
||||||
|
|
||||||
// Own version of assert() that writes failed assertions to the log for review
|
// Own version of assert() that writes failed assertions to the log for review
|
||||||
#ifdef TEST_GLOBALS
|
#ifdef TEST_GLOBALS
|
||||||
|
@ -39,68 +39,67 @@ public:
|
|||||||
// Force a virtual destructor in descendants:
|
// Force a virtual destructor in descendants:
|
||||||
virtual ~cCallbacks() {}
|
virtual ~cCallbacks() {}
|
||||||
|
|
||||||
/// Called when a new file part is encountered in the form data
|
/** Called when a new file part is encountered in the form data */
|
||||||
virtual void OnFileStart(cHTTPFormParser & a_Parser, const AString & a_FileName) = 0;
|
virtual void OnFileStart(cHTTPFormParser & a_Parser, const AString & a_FileName) = 0;
|
||||||
|
|
||||||
/// Called when more file data has come for the current file in the form data
|
/** Called when more file data has come for the current file in the form data */
|
||||||
virtual void OnFileData(cHTTPFormParser & a_Parser, const char * a_Data, size_t a_Size) = 0;
|
virtual void OnFileData(cHTTPFormParser & a_Parser, const char * a_Data, size_t a_Size) = 0;
|
||||||
|
|
||||||
/// Called when the current file part has ended in the form data
|
/** Called when the current file part has ended in the form data */
|
||||||
virtual void OnFileEnd(cHTTPFormParser & a_Parser) = 0;
|
virtual void OnFileEnd(cHTTPFormParser & a_Parser) = 0;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
/// Creates a parser that is tied to a request and notifies of various events using a callback mechanism
|
/** Creates a parser that is tied to a request and notifies of various events using a callback mechanism */
|
||||||
cHTTPFormParser(cHTTPRequest & a_Request, cCallbacks & a_Callbacks);
|
cHTTPFormParser(cHTTPRequest & a_Request, cCallbacks & a_Callbacks);
|
||||||
|
|
||||||
/// Creates a parser with the specified content type that reads data from a string
|
/** Creates a parser with the specified content type that reads data from a string */
|
||||||
cHTTPFormParser(eKind a_Kind, const char * a_Data, size_t a_Size, cCallbacks & a_Callbacks);
|
cHTTPFormParser(eKind a_Kind, const char * a_Data, size_t a_Size, cCallbacks & a_Callbacks);
|
||||||
|
|
||||||
/// Adds more data into the parser, as the request body is received
|
/** Adds more data into the parser, as the request body is received */
|
||||||
void Parse(const char * a_Data, size_t a_Size);
|
void Parse(const char * a_Data, size_t a_Size);
|
||||||
|
|
||||||
/** Notifies that there's no more data incoming and the parser should finish its parsing.
|
/** Notifies that there's no more data incoming and the parser should finish its parsing.
|
||||||
Returns true if parsing successful
|
Returns true if parsing successful. */
|
||||||
*/
|
|
||||||
bool Finish(void);
|
bool Finish(void);
|
||||||
|
|
||||||
/// Returns true if the headers suggest the request has form data parseable by this class
|
/** Returns true if the headers suggest the request has form data parseable by this class */
|
||||||
static bool HasFormData(const cHTTPRequest & a_Request);
|
static bool HasFormData(const cHTTPRequest & a_Request);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/// The callbacks to call for incoming file data
|
/** The callbacks to call for incoming file data */
|
||||||
cCallbacks & m_Callbacks;
|
cCallbacks & m_Callbacks;
|
||||||
|
|
||||||
/// The kind of the parser (decided in the constructor, used in Parse()
|
/** The kind of the parser (decided in the constructor, used in Parse() */
|
||||||
eKind m_Kind;
|
eKind m_Kind;
|
||||||
|
|
||||||
/// Buffer for the incoming data until it's parsed
|
/** Buffer for the incoming data until it's parsed */
|
||||||
AString m_IncomingData;
|
AString m_IncomingData;
|
||||||
|
|
||||||
/// True if the information received so far is a valid form; set to false on first problem. Further parsing is skipped when false.
|
/** True if the information received so far is a valid form; set to false on first problem. Further parsing is skipped when false. */
|
||||||
bool m_IsValid;
|
bool m_IsValid;
|
||||||
|
|
||||||
/// The parser for the multipart data, if used
|
/** The parser for the multipart data, if used */
|
||||||
std::unique_ptr<cMultipartParser> m_MultipartParser;
|
std::unique_ptr<cMultipartParser> m_MultipartParser;
|
||||||
|
|
||||||
/// Name of the currently parsed part in multipart data
|
/** Name of the currently parsed part in multipart data */
|
||||||
AString m_CurrentPartName;
|
AString m_CurrentPartName;
|
||||||
|
|
||||||
/// True if the currently parsed part in multipart data is a file
|
/** True if the currently parsed part in multipart data is a file */
|
||||||
bool m_IsCurrentPartFile;
|
bool m_IsCurrentPartFile;
|
||||||
|
|
||||||
/// Filename of the current parsed part in multipart data (for file uploads)
|
/** Filename of the current parsed part in multipart data (for file uploads) */
|
||||||
AString m_CurrentPartFileName;
|
AString m_CurrentPartFileName;
|
||||||
|
|
||||||
/// Set to true after m_Callbacks.OnFileStart() has been called, reset to false on PartEnd
|
/** Set to true after m_Callbacks.OnFileStart() has been called, reset to false on PartEnd */
|
||||||
bool m_FileHasBeenAnnounced;
|
bool m_FileHasBeenAnnounced;
|
||||||
|
|
||||||
|
|
||||||
/// Sets up the object for parsing a fpkMultipart request
|
/** Sets up the object for parsing a fpkMultipart request */
|
||||||
void BeginMultipart(const cHTTPRequest & a_Request);
|
void BeginMultipart(const cHTTPRequest & a_Request);
|
||||||
|
|
||||||
/// Parses m_IncomingData as form-urlencoded data (fpkURL or fpkFormUrlEncoded kinds)
|
/** Parses m_IncomingData as form-urlencoded data (fpkURL or fpkFormUrlEncoded kinds) */
|
||||||
void ParseFormUrlEncoded(void);
|
void ParseFormUrlEncoded(void);
|
||||||
|
|
||||||
// cMultipartParser::cCallbacks overrides:
|
// cMultipartParser::cCallbacks overrides:
|
||||||
|
@ -17,22 +17,22 @@ class cNameValueParser :
|
|||||||
public std::map<AString, AString>
|
public std::map<AString, AString>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/// Creates an empty parser
|
/** Creates an empty parser */
|
||||||
cNameValueParser(bool a_AllowsKeyOnly = true);
|
cNameValueParser(bool a_AllowsKeyOnly = true);
|
||||||
|
|
||||||
/// Creates an empty parser, then parses the data given. Doesn't call Finish(), so more data can be parsed later
|
/** Creates an empty parser, then parses the data given. Doesn't call Finish(), so more data can be parsed later */
|
||||||
cNameValueParser(const char * a_Data, size_t a_Size, bool a_AllowsKeyOnly = true);
|
cNameValueParser(const char * a_Data, size_t a_Size, bool a_AllowsKeyOnly = true);
|
||||||
|
|
||||||
/// Parses the data given
|
/** Parses the data given */
|
||||||
void Parse(const char * a_Data, size_t a_Size);
|
void Parse(const char * a_Data, size_t a_Size);
|
||||||
|
|
||||||
/// Notifies the parser that no more data will be coming. Returns true if the parser state is valid
|
/** Notifies the parser that no more data will be coming. Returns true if the parser state is valid */
|
||||||
bool Finish(void);
|
bool Finish(void);
|
||||||
|
|
||||||
/// Returns true if the data parsed so far was valid
|
/** Returns true if the data parsed so far was valid */
|
||||||
bool IsValid(void) const { return (m_State != psInvalid); }
|
bool IsValid(void) const { return (m_State != psInvalid); }
|
||||||
|
|
||||||
/// Returns true if the parser expects no more data
|
/** Returns true if the parser expects no more data */
|
||||||
bool IsFinished(void) const { return ((m_State == psInvalid) || (m_State == psFinished)); }
|
bool IsFinished(void) const { return ((m_State == psInvalid) || (m_State == psFinished)); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -50,16 +50,16 @@ protected:
|
|||||||
psFinished, ///< The parser has already been instructed to finish and doesn't expect any more data
|
psFinished, ///< The parser has already been instructed to finish and doesn't expect any more data
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
/// The current state of the parser
|
/** The current state of the parser */
|
||||||
eState m_State;
|
eState m_State;
|
||||||
|
|
||||||
/// If true, the parser will accept keys without an equal sign and the value
|
/** If true, the parser will accept keys without an equal sign and the value */
|
||||||
bool m_AllowsKeyOnly;
|
bool m_AllowsKeyOnly;
|
||||||
|
|
||||||
/// Buffer for the current Key
|
/** Buffer for the current Key */
|
||||||
AString m_CurrentKey;
|
AString m_CurrentKey;
|
||||||
|
|
||||||
/// Buffer for the current Value;
|
/** Buffer for the current Value; */
|
||||||
AString m_CurrentValue;
|
AString m_CurrentValue;
|
||||||
|
|
||||||
|
|
||||||
|
@ -48,25 +48,25 @@ private:
|
|||||||
std::vector<AString> names;
|
std::vector<AString> names;
|
||||||
std::vector<AString> comments;
|
std::vector<AString> comments;
|
||||||
|
|
||||||
/// If the object is case-insensitive, returns s as lowercase; otherwise returns s as-is
|
/** If the object is case-insensitive, returns s as lowercase; otherwise returns s as-is */
|
||||||
AString CheckCase(const AString & s) const;
|
AString CheckCase(const AString & s) const;
|
||||||
|
|
||||||
/// Removes the UTF-8 BOMs (Byte order makers), if present.
|
/** Removes the UTF-8 BOMs (Byte order makers), if present. */
|
||||||
void RemoveBom(AString & a_line) const;
|
void RemoveBom(AString & a_line) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/// Creates a new instance with no data
|
/** Creates a new instance with no data */
|
||||||
cIniFile(void);
|
cIniFile(void);
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
virtual ~cIniFile() = default;
|
virtual ~cIniFile() = default;
|
||||||
|
|
||||||
virtual std::vector<std::pair<AString, AString>> GetValues(AString a_keyName) override;
|
virtual std::vector<std::pair<AString, AString>> GetValues(AString a_keyName) override;
|
||||||
|
|
||||||
virtual bool KeyExists(const AString a_keyName) const override;
|
virtual bool KeyExists(const AString a_keyName) const override;
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
// Sets whether or not keynames and valuenames should be case sensitive.
|
// Sets whether or not keynames and valuenames should be case sensitive.
|
||||||
// The default is case insensitive.
|
// The default is case insensitive.
|
||||||
@ -76,31 +76,30 @@ public:
|
|||||||
/** Reads the contents of the specified ini file
|
/** Reads the contents of the specified ini file
|
||||||
If the file doesn't exist and a_AllowExampleRedirect is true, tries to read <basename>.example.ini, and
|
If the file doesn't exist and a_AllowExampleRedirect is true, tries to read <basename>.example.ini, and
|
||||||
writes its contents as <basename>.ini, if successful.
|
writes its contents as <basename>.ini, if successful.
|
||||||
Returns true if successful, false otherwise.
|
Returns true if successful, false otherwise. */
|
||||||
*/
|
|
||||||
bool ReadFile(const AString & a_FileName, bool a_AllowExampleRedirect = true);
|
bool ReadFile(const AString & a_FileName, bool a_AllowExampleRedirect = true);
|
||||||
|
|
||||||
/// Writes data stored in class to the specified ini file
|
/** Writes data stored in class to the specified ini file */
|
||||||
bool WriteFile(const AString & a_FileName) const;
|
bool WriteFile(const AString & a_FileName) const;
|
||||||
|
|
||||||
virtual bool Flush() override { return WriteFile(m_Filename); }
|
virtual bool Flush() override { return WriteFile(m_Filename); }
|
||||||
|
|
||||||
/// Deletes all stored ini data (but doesn't touch the file)
|
/** Deletes all stored ini data (but doesn't touch the file) */
|
||||||
void Clear(void);
|
void Clear(void);
|
||||||
|
|
||||||
/** Returns true iff the specified value exists. */
|
/** Returns true iff the specified value exists. */
|
||||||
bool HasValue(const AString & a_KeyName, const AString & a_ValueName) const override;
|
bool HasValue(const AString & a_KeyName, const AString & a_ValueName) const override;
|
||||||
|
|
||||||
/// Returns index of specified key, or noID if not found
|
/** Returns index of specified key, or noID if not found */
|
||||||
int FindKey(const AString & keyname) const;
|
int FindKey(const AString & keyname) const;
|
||||||
|
|
||||||
/// Returns index of specified value, in the specified key, or noID if not found
|
/** Returns index of specified value, in the specified key, or noID if not found */
|
||||||
int FindValue(const int keyID, const AString & valuename) const;
|
int FindValue(const int keyID, const AString & valuename) const;
|
||||||
|
|
||||||
/// Returns number of keys currently in the ini
|
/** Returns number of keys currently in the ini */
|
||||||
int GetNumKeys(void) const { return static_cast<int>(keys.size()); }
|
int GetNumKeys(void) const { return static_cast<int>(keys.size()); }
|
||||||
|
|
||||||
/// Add a key name
|
/** Add a key name */
|
||||||
int AddKeyName(const AString & keyname) override;
|
int AddKeyName(const AString & keyname) override;
|
||||||
|
|
||||||
// Returns key names by index.
|
// Returns key names by index.
|
||||||
@ -172,19 +171,19 @@ public:
|
|||||||
// Header comment functions.
|
// Header comment functions.
|
||||||
// Header comments are those comments before the first key.
|
// Header comments are those comments before the first key.
|
||||||
|
|
||||||
/// Returns the number of header comments
|
/** Returns the number of header comments */
|
||||||
int GetNumHeaderComments(void) {return static_cast<int>(comments.size());}
|
int GetNumHeaderComments(void) {return static_cast<int>(comments.size());}
|
||||||
|
|
||||||
/// Adds a header comment
|
/** Adds a header comment */
|
||||||
void AddHeaderComment(const AString & comment);
|
void AddHeaderComment(const AString & comment);
|
||||||
|
|
||||||
/// Returns a header comment, or empty string if out of range
|
/** Returns a header comment, or empty string if out of range */
|
||||||
AString GetHeaderComment(const int commentID) const;
|
AString GetHeaderComment(const int commentID) const;
|
||||||
|
|
||||||
/// Deletes a header comment. Returns true if successful
|
/** Deletes a header comment. Returns true if successful */
|
||||||
bool DeleteHeaderComment(int commentID);
|
bool DeleteHeaderComment(int commentID);
|
||||||
|
|
||||||
/// Deletes all header comments
|
/** Deletes all header comments */
|
||||||
void DeleteHeaderComments(void) {comments.clear();}
|
void DeleteHeaderComments(void) {comments.clear();}
|
||||||
|
|
||||||
|
|
||||||
@ -194,19 +193,19 @@ public:
|
|||||||
// these comments will be moved to the top of the key definition when
|
// these comments will be moved to the top of the key definition when
|
||||||
// the CIniFile::WriteFile() is called.
|
// the CIniFile::WriteFile() is called.
|
||||||
|
|
||||||
/// Get number of key comments
|
/** Get number of key comments */
|
||||||
int GetNumKeyComments(const int keyID) const;
|
int GetNumKeyComments(const int keyID) const;
|
||||||
|
|
||||||
/// Get number of key comments
|
/** Get number of key comments */
|
||||||
int GetNumKeyComments(const AString & keyname) const;
|
int GetNumKeyComments(const AString & keyname) const;
|
||||||
|
|
||||||
/// Add a key comment
|
/** Add a key comment */
|
||||||
bool AddKeyComment(const int keyID, const AString & comment);
|
bool AddKeyComment(const int keyID, const AString & comment);
|
||||||
|
|
||||||
/// Add a key comment
|
/** Add a key comment */
|
||||||
bool AddKeyComment(const AString & keyname, const AString & comment) override;
|
bool AddKeyComment(const AString & keyname, const AString & comment) override;
|
||||||
|
|
||||||
/// Return a key comment
|
/** Return a key comment */
|
||||||
AString GetKeyComment(const int keyID, const int commentID) const;
|
AString GetKeyComment(const int keyID, const int commentID) const;
|
||||||
AString GetKeyComment(const AString & keyname, const int commentID) const override;
|
AString GetKeyComment(const AString & keyname, const int commentID) const override;
|
||||||
|
|
||||||
|
@ -111,7 +111,6 @@ char cItem::GetMaxStackSize(void) const
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Returns the cItemHandler responsible for this item type
|
|
||||||
cItemHandler * cItem::GetHandler(void) const
|
cItemHandler * cItem::GetHandler(void) const
|
||||||
{
|
{
|
||||||
return ItemHandler(m_ItemType);
|
return ItemHandler(m_ItemType);
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Chunk data callback that takes the chunk data and puts them into cLightingThread's m_BlockTypes[] / m_HeightMap[]:
|
/** Chunk data callback that takes the chunk data and puts them into cLightingThread's m_BlockTypes[] / m_HeightMap[]: */
|
||||||
class cReader :
|
class cReader :
|
||||||
public cChunkDataCallback
|
public cChunkDataCallback
|
||||||
{
|
{
|
||||||
|
@ -35,46 +35,47 @@ class cLineBlockTracer :
|
|||||||
public:
|
public:
|
||||||
cLineBlockTracer(cWorld & a_World, cCallbacks & a_Callbacks);
|
cLineBlockTracer(cWorld & a_World, cCallbacks & a_Callbacks);
|
||||||
|
|
||||||
/// Traces one line between Start and End; returns true if the entire line was traced (until OnNoMoreHits())
|
/** Traces one line between Start and End; returns true if the entire line was traced (until OnNoMoreHits()) */
|
||||||
bool Trace(double a_StartX, double a_StartY, double a_StartZ, double a_EndX, double a_EndY, double a_EndZ);
|
bool Trace(double a_StartX, double a_StartY, double a_StartZ, double a_EndX, double a_EndY, double a_EndZ);
|
||||||
|
|
||||||
// Utility functions for simple one-line usage:
|
// Utility functions for simple one-line usage:
|
||||||
/// Traces one line between Start and End; returns true if the entire line was traced (until OnNoMoreHits())
|
|
||||||
|
/** Traces one line between Start and End; returns true if the entire line was traced (until OnNoMoreHits()) */
|
||||||
static bool Trace(cWorld & a_World, cCallbacks & a_Callbacks, double a_StartX, double a_StartY, double a_StartZ, double a_EndX, double a_EndY, double a_EndZ);
|
static bool Trace(cWorld & a_World, cCallbacks & a_Callbacks, double a_StartX, double a_StartY, double a_StartZ, double a_EndX, double a_EndY, double a_EndZ);
|
||||||
|
|
||||||
/// Traces one line between Start and End; returns true if the entire line was traced (until OnNoMoreHits())
|
/** Traces one line between Start and End; returns true if the entire line was traced (until OnNoMoreHits()) */
|
||||||
static bool Trace(cWorld & a_World, cCallbacks & a_Callbacks, const Vector3d & a_Start, const Vector3d & a_End);
|
static bool Trace(cWorld & a_World, cCallbacks & a_Callbacks, const Vector3d & a_Start, const Vector3d & a_End);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// The start point of the trace
|
/** The start point of the trace */
|
||||||
double m_StartX, m_StartY, m_StartZ;
|
double m_StartX, m_StartY, m_StartZ;
|
||||||
|
|
||||||
// The end point of the trace
|
/** The end point of the trace */
|
||||||
double m_EndX, m_EndY, m_EndZ;
|
double m_EndX, m_EndY, m_EndZ;
|
||||||
|
|
||||||
// The difference in coords, End - Start
|
/** The difference in coords, End - Start */
|
||||||
double m_DiffX, m_DiffY, m_DiffZ;
|
double m_DiffX, m_DiffY, m_DiffZ;
|
||||||
|
|
||||||
// The increment at which the block coords are going from Start to End; either +1 or -1
|
/** The increment at which the block coords are going from Start to End; either +1 or -1 */
|
||||||
int m_DirX, m_DirY, m_DirZ;
|
int m_DirX, m_DirY, m_DirZ;
|
||||||
|
|
||||||
// The current block
|
/** The current block */
|
||||||
int m_CurrentX, m_CurrentY, m_CurrentZ;
|
int m_CurrentX, m_CurrentY, m_CurrentZ;
|
||||||
|
|
||||||
// The face through which the current block has been entered
|
/** The face through which the current block has been entered */
|
||||||
char m_CurrentFace;
|
char m_CurrentFace;
|
||||||
|
|
||||||
|
|
||||||
/// Adjusts the start point above the world to just at the world's top
|
/** Adjusts the start point above the world to just at the world's top */
|
||||||
void FixStartAboveWorld(void);
|
void FixStartAboveWorld(void);
|
||||||
|
|
||||||
/// Adjusts the start point below the world to just at the world's bottom
|
/** Adjusts the start point below the world to just at the world's bottom */
|
||||||
void FixStartBelowWorld(void);
|
void FixStartBelowWorld(void);
|
||||||
|
|
||||||
/// Calculates the XZ coords of an intersection with the specified Yconst plane; assumes that such an intersection exists
|
/** Calculates the XZ coords of an intersection with the specified Yconst plane; assumes that such an intersection exists */
|
||||||
void CalcXZIntersection(double a_Y, double & a_IntersectX, double & a_IntersectZ);
|
void CalcXZIntersection(double a_Y, double & a_IntersectX, double & a_IntersectZ);
|
||||||
|
|
||||||
/// Moves m_Current to the next block on the line; returns false if no move is possible (reached the end)
|
/** Moves m_Current to the next block on the line; returns false if no move is possible (reached the end) */
|
||||||
bool MoveToNextBlock(void);
|
bool MoveToNextBlock(void);
|
||||||
|
|
||||||
// cChunkCallback overrides:
|
// cChunkCallback overrides:
|
||||||
|
@ -151,7 +151,6 @@ void LinearInterpolate2DArray(
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Puts linearly interpolated values from one array into another array. 3D version
|
|
||||||
void LinearInterpolate3DArray(
|
void LinearInterpolate3DArray(
|
||||||
float * a_Src,
|
float * a_Src,
|
||||||
int a_SrcSizeX, int a_SrcSizeY, int a_SrcSizeZ,
|
int a_SrcSizeX, int a_SrcSizeY, int a_SrcSizeZ,
|
||||||
|
@ -23,7 +23,7 @@ const int MAX_INTERPOL_SIZEZ = 256; ///< Maximum Z-size of the interpolated arr
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Puts linearly interpolated values from one array into another array. 1D version
|
/** Puts linearly interpolated values from one array into another array. 1D version */
|
||||||
void LinearInterpolate1DArray(
|
void LinearInterpolate1DArray(
|
||||||
float * a_Src, ///< Src array
|
float * a_Src, ///< Src array
|
||||||
int a_SrcSizeX, ///< Count of the src array
|
int a_SrcSizeX, ///< Count of the src array
|
||||||
@ -35,7 +35,7 @@ void LinearInterpolate1DArray(
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Puts linearly interpolated values from one array into another array. 2D version
|
/** Puts linearly interpolated values from one array into another array. 2D version */
|
||||||
void LinearInterpolate2DArray(
|
void LinearInterpolate2DArray(
|
||||||
float * a_Src, ///< Src array, [x + a_SrcSizeX * y]
|
float * a_Src, ///< Src array, [x + a_SrcSizeX * y]
|
||||||
int a_SrcSizeX, int a_SrcSizeY, ///< Count of the src array, in each direction
|
int a_SrcSizeX, int a_SrcSizeY, ///< Count of the src array, in each direction
|
||||||
@ -47,7 +47,7 @@ void LinearInterpolate2DArray(
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Puts linearly interpolated values from one array into another array. 3D version
|
/** Puts linearly interpolated values from one array into another array. 3D version */
|
||||||
void LinearInterpolate3DArray(
|
void LinearInterpolate3DArray(
|
||||||
float * a_Src, ///< Src array, [x + a_SrcSizeX * y + a_SrcSizeX * a_SrcSizeY * z]
|
float * a_Src, ///< Src array, [x + a_SrcSizeX * y + a_SrcSizeX * a_SrcSizeY * z]
|
||||||
int a_SrcSizeX, int a_SrcSizeY, int a_SrcSizeZ, ///< Count of the src array, in each direction
|
int a_SrcSizeX, int a_SrcSizeY, int a_SrcSizeZ, ///< Count of the src array, in each direction
|
||||||
|
@ -25,20 +25,20 @@ as side effect 2 : it also know the caps for mobs number and can compare census
|
|||||||
class cMobCensus
|
class cMobCensus
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/// Returns the nested proximity counter
|
/** Returns the nested proximity counter */
|
||||||
cMobProximityCounter & GetProximityCounter(void);
|
cMobProximityCounter & GetProximityCounter(void);
|
||||||
|
|
||||||
// collect an elligible Chunk for Mob Spawning
|
// collect an elligible Chunk for Mob Spawning
|
||||||
// MG TODO : code the correct rule (not loaded chunk but short distant from players)
|
// MG TODO : code the correct rule (not loaded chunk but short distant from players)
|
||||||
void CollectSpawnableChunk(cChunk & a_Chunk);
|
void CollectSpawnableChunk(cChunk & a_Chunk);
|
||||||
|
|
||||||
/// Collect a mob - its distance to player, its family ...
|
/** Collect a mob - its distance to player, its family ... */
|
||||||
void CollectMob(cMonster & a_Monster, cChunk & a_Chunk, double a_Distance);
|
void CollectMob(cMonster & a_Monster, cChunk & a_Chunk, double a_Distance);
|
||||||
|
|
||||||
/// Returns true if the family is capped (i.e. there are more mobs of this family than max)
|
/** Returns true if the family is capped (i.e. there are more mobs of this family than max) */
|
||||||
bool IsCapped(cMonster::eFamily a_MobFamily);
|
bool IsCapped(cMonster::eFamily a_MobFamily);
|
||||||
|
|
||||||
/// log the results of census to server console
|
/** log the results of census to server console */
|
||||||
void Logd(void);
|
void Logd(void);
|
||||||
|
|
||||||
protected :
|
protected :
|
||||||
@ -47,10 +47,10 @@ protected :
|
|||||||
|
|
||||||
std::set<cChunk *> m_EligibleForSpawnChunks;
|
std::set<cChunk *> m_EligibleForSpawnChunks;
|
||||||
|
|
||||||
/// Returns the number of chunks that are elligible for spawning (for now, the loaded, valid chunks)
|
/** Returns the number of chunks that are elligible for spawning (for now, the loaded, valid chunks) */
|
||||||
int GetNumChunks();
|
int GetNumChunks();
|
||||||
|
|
||||||
/// Returns the cap multiplier value of the given monster family
|
/** Returns the cap multiplier value of the given monster family */
|
||||||
static int GetCapMultiplier(cMonster::eFamily a_MobFamily);
|
static int GetCapMultiplier(cMonster::eFamily a_MobFamily);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -25,24 +25,23 @@ but it also has dynamic part depending on the world.ini settings.
|
|||||||
class cMobSpawner
|
class cMobSpawner
|
||||||
{
|
{
|
||||||
public :
|
public :
|
||||||
// constructor
|
/** Constructor
|
||||||
// a_MobFamily is the Family of mobs that this spawner will spawn
|
a_MobFamily is the Family of mobs that this spawner will spawn
|
||||||
// a_AllowedTypes is the set of types allowed for mobs it will spawn. Empty set
|
a_AllowedTypes is the set of types allowed for mobs it will spawn. Empty set would result in no spawn at all
|
||||||
// would result in no spawn at all
|
Allowed mobs thah are not of the right Family will not be include (no warning). */
|
||||||
// Allowed mobs thah are not of the right Family will not be include (no warning)
|
|
||||||
cMobSpawner(cMonster::eFamily MobFamily, const std::set<eMonsterType> & a_AllowedTypes);
|
cMobSpawner(cMonster::eFamily MobFamily, const std::set<eMonsterType> & a_AllowedTypes);
|
||||||
|
|
||||||
/// Check if specified block can be a Pack center for this spawner
|
/** Check if specified block can be a Pack center for this spawner */
|
||||||
bool CheckPackCenter(BLOCKTYPE a_BlockType);
|
bool CheckPackCenter(BLOCKTYPE a_BlockType);
|
||||||
|
|
||||||
// Try to create a monster here
|
/** Try to create a monster here
|
||||||
// if this is the first of a Pack : determine the type of monster
|
If this is the first of a Pack, determine the type of monster
|
||||||
// BlockType & BlockMeta are used to decide what kind of Mob can Spawn here
|
a_Biome, BlockType & BlockMeta are used to decide what kind of Mob can Spawn here
|
||||||
// MaxPackSize is set to the maximal size for a pack this type of mob
|
a_MaxPackSize is set to the maximal size for a pack this type of mob */
|
||||||
cMonster * TryToSpawnHere(cChunk * a_Chunk, int A_RelX, int a_RelY, int a_RelZ, EMCSBiome a_Biome, int & a_MaxPackSize);
|
cMonster * TryToSpawnHere(cChunk * a_Chunk, int A_RelX, int a_RelY, int a_RelZ, EMCSBiome a_Biome, int & a_MaxPackSize);
|
||||||
|
|
||||||
// mark the beginning of a new Pack
|
/** Mark the beginning of a new Pack.
|
||||||
// all mobs of the same Pack are the same type
|
All mobs of the same Pack are the same type */
|
||||||
void NewPack(void);
|
void NewPack(void);
|
||||||
|
|
||||||
// return true if there is at least one allowed type
|
// return true if there is at least one allowed type
|
||||||
@ -55,11 +54,11 @@ public :
|
|||||||
static bool CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, eMonsterType a_MobType, EMCSBiome a_Biome);
|
static bool CanSpawnHere(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ, eMonsterType a_MobType, EMCSBiome a_Biome);
|
||||||
|
|
||||||
protected :
|
protected :
|
||||||
// return a random type that can spawn on specified biome.
|
/** Returns a random type that can spawn in the specified biome.
|
||||||
// returns E_ENTITY_TYPE_DONOTUSE if none is possible
|
Returns mtInvalidType if none is possible. */
|
||||||
eMonsterType ChooseMobType(EMCSBiome a_Biome);
|
eMonsterType ChooseMobType(EMCSBiome a_Biome);
|
||||||
|
|
||||||
// add toAdd inside toAddIn, if toAdd is in m_AllowedTypes
|
/** Adds toAdd into toAddIn, if toAdd is in m_AllowedTypes */
|
||||||
void addIfAllowed(eMonsterType toAdd, std::set<eMonsterType> & toAddIn);
|
void addIfAllowed(eMonsterType toAdd, std::set<eMonsterType> & toAddIn);
|
||||||
|
|
||||||
cMonster::eFamily m_MonsterFamily;
|
cMonster::eFamily m_MonsterFamily;
|
||||||
|
@ -12,7 +12,7 @@ class cMagmaCube :
|
|||||||
typedef cAggressiveMonster super;
|
typedef cAggressiveMonster super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Creates a MagmaCube of the specified size; size is 1 .. 3, with 1 being the smallest
|
/** Creates a MagmaCube of the specified size; with 1 being the smallest */
|
||||||
cMagmaCube(int a_Size);
|
cMagmaCube(int a_Size);
|
||||||
|
|
||||||
CLASS_PROTODEF(cMagmaCube)
|
CLASS_PROTODEF(cMagmaCube)
|
||||||
@ -26,7 +26,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/// Size of the MagmaCube, 1, 2 and 4, with 1 being the smallest
|
/** Size of the MagmaCube, with 1 being the smallest */
|
||||||
int m_Size;
|
int m_Size;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ public:
|
|||||||
virtual void CheckEventSeePlayer(void);
|
virtual void CheckEventSeePlayer(void);
|
||||||
virtual void EventSeePlayer(cEntity * a_Player);
|
virtual void EventSeePlayer(cEntity * a_Player);
|
||||||
|
|
||||||
/// Reads the monster configuration for the specified monster name and assigns it to this object.
|
/** Reads the monster configuration for the specified monster name and assigns it to this object. */
|
||||||
void GetMonsterConfig(const AString & a_Name);
|
void GetMonsterConfig(const AString & a_Name);
|
||||||
|
|
||||||
/** Returns whether this mob is undead (skeleton, zombie, etc.) */
|
/** Returns whether this mob is undead (skeleton, zombie, etc.) */
|
||||||
@ -105,7 +105,7 @@ public:
|
|||||||
void SetDropChanceBoots(float a_DropChanceBoots) { m_DropChanceBoots = a_DropChanceBoots; }
|
void SetDropChanceBoots(float a_DropChanceBoots) { m_DropChanceBoots = a_DropChanceBoots; }
|
||||||
void SetCanPickUpLoot(bool a_CanPickUpLoot) { m_CanPickUpLoot = a_CanPickUpLoot; }
|
void SetCanPickUpLoot(bool a_CanPickUpLoot) { m_CanPickUpLoot = a_CanPickUpLoot; }
|
||||||
|
|
||||||
/// Sets whether the mob burns in daylight. Only evaluated at next burn-decision tick
|
/** Sets whether the mob burns in daylight. Only evaluated at next burn-decision tick */
|
||||||
void SetBurnsInDaylight(bool a_BurnsInDaylight) { m_BurnsInDaylight = a_BurnsInDaylight; }
|
void SetBurnsInDaylight(bool a_BurnsInDaylight) { m_BurnsInDaylight = a_BurnsInDaylight; }
|
||||||
|
|
||||||
double GetRelativeWalkSpeed(void) const { return m_RelativeWalkSpeed; } // tolua_export
|
double GetRelativeWalkSpeed(void) const { return m_RelativeWalkSpeed; } // tolua_export
|
||||||
@ -278,19 +278,19 @@ protected:
|
|||||||
|
|
||||||
char m_Age;
|
char m_Age;
|
||||||
|
|
||||||
/** Adds a random number of a_Item between a_Min and a_Max to itemdrops a_Drops*/
|
/** Adds a random number of a_Item between a_Min and a_Max to itemdrops a_Drops */
|
||||||
void AddRandomDropItem(cItems & a_Drops, unsigned int a_Min, unsigned int a_Max, short a_Item, short a_ItemHealth = 0);
|
void AddRandomDropItem(cItems & a_Drops, unsigned int a_Min, unsigned int a_Max, short a_Item, short a_ItemHealth = 0);
|
||||||
|
|
||||||
/** Adds a item a_Item with the chance of a_Chance (in percent) to itemdrops a_Drops*/
|
/** Adds a item a_Item with the chance of a_Chance (in percent) to itemdrops a_Drops */
|
||||||
void AddRandomUncommonDropItem(cItems & a_Drops, float a_Chance, short a_Item, short a_ItemHealth = 0);
|
void AddRandomUncommonDropItem(cItems & a_Drops, float a_Chance, short a_Item, short a_ItemHealth = 0);
|
||||||
|
|
||||||
/** Adds one rare item out of the list of rare items a_Items modified by the looting level a_LootingLevel(I-III or custom) to the itemdrop a_Drops*/
|
/** Adds one rare item out of the list of rare items a_Items modified by the looting level a_LootingLevel(I-III or custom) to the itemdrop a_Drops */
|
||||||
void AddRandomRareDropItem(cItems & a_Drops, cItems & a_Items, unsigned int a_LootingLevel);
|
void AddRandomRareDropItem(cItems & a_Drops, cItems & a_Items, unsigned int a_LootingLevel);
|
||||||
|
|
||||||
/** Adds armor that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if piccked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop*/
|
/** Adds armor that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if picked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop */
|
||||||
void AddRandomArmorDropItem(cItems & a_Drops, unsigned int a_LootingLevel);
|
void AddRandomArmorDropItem(cItems & a_Drops, unsigned int a_LootingLevel);
|
||||||
|
|
||||||
/** Adds weapon that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if piccked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop*/
|
/** Adds weapon that is equipped with the chance saved in m_DropChance[...] (this will be greter than 1 if picked up or 0.085 + (0.01 per LootingLevel) if born with) to the drop */
|
||||||
void AddRandomWeaponDropItem(cItems & a_Drops, unsigned int a_LootingLevel);
|
void AddRandomWeaponDropItem(cItems & a_Drops, unsigned int a_LootingLevel);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/// This identifies individual monster type, as well as their network type-ID
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
/** Identifies individual monster type, as well as their network type-ID. */
|
||||||
enum eMonsterType
|
enum eMonsterType
|
||||||
{
|
{
|
||||||
mtInvalidType = -1,
|
mtInvalidType = -1,
|
||||||
|
@ -17,8 +17,9 @@ public:
|
|||||||
|
|
||||||
virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
|
virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
|
||||||
|
|
||||||
/// When hit by someone, run away
|
/** When hit by someone, run away */
|
||||||
virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;
|
virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;
|
||||||
|
|
||||||
/** Returns the item that the animal of this class follows when a player holds it in hand
|
/** Returns the item that the animal of this class follows when a player holds it in hand
|
||||||
Return an empty item not to follow (default). */
|
Return an empty item not to follow (default). */
|
||||||
virtual const cItem GetFollowedItem(void) const { return cItem(); }
|
virtual const cItem GetFollowedItem(void) const { return cItem(); }
|
||||||
|
@ -387,7 +387,8 @@ void cPath::ProcessIfWalkable(const Vector3i & a_Location, cPathCell * a_Parent,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*y =-1;
|
/*
|
||||||
|
y = -1;
|
||||||
for (x = 0; x < m_BoundingBoxWidth; ++x)
|
for (x = 0; x < m_BoundingBoxWidth; ++x)
|
||||||
{
|
{
|
||||||
for (z = 0; z < m_BoundingBoxWidth; ++z)
|
for (z = 0; z < m_BoundingBoxWidth; ++z)
|
||||||
@ -398,7 +399,8 @@ void cPath::ProcessIfWalkable(const Vector3i & a_Location, cPathCell * a_Parent,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ProcessCell(cell, a_Parent, a_Cost);*/
|
ProcessCell(cell, a_Parent, a_Cost);
|
||||||
|
*/
|
||||||
|
|
||||||
// Make sure there's at least 1 piece of solid below us.
|
// Make sure there's at least 1 piece of solid below us.
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ public:
|
|||||||
/** Performs part of the path calculation and returns the appropriate status.
|
/** Performs part of the path calculation and returns the appropriate status.
|
||||||
If NEARBY_FOUND is returned, it means that the destination is not reachable, but a nearby destination
|
If NEARBY_FOUND is returned, it means that the destination is not reachable, but a nearby destination
|
||||||
is reachable. If the user likes the alternative destination, they can call AcceptNearbyPath to treat the path as found,
|
is reachable. If the user likes the alternative destination, they can call AcceptNearbyPath to treat the path as found,
|
||||||
and to make consequent calls to step return PATH_FOUND*/
|
and to make consequent calls to step return PATH_FOUND */
|
||||||
ePathFinderStatus Step(cChunk & a_Chunk);
|
ePathFinderStatus Step(cChunk & a_Chunk);
|
||||||
|
|
||||||
/** Called after the PathFinder's step returns NEARBY_FOUND.
|
/** Called after the PathFinder's step returns NEARBY_FOUND.
|
||||||
@ -87,7 +87,8 @@ public:
|
|||||||
the PathFinder found a path to. */
|
the PathFinder found a path to. */
|
||||||
Vector3i AcceptNearbyPath();
|
Vector3i AcceptNearbyPath();
|
||||||
|
|
||||||
/* Point retrieval functions, inlined for performance. */
|
// Point retrieval functions, inlined for performance:
|
||||||
|
|
||||||
/** Returns the next point in the path. */
|
/** Returns the next point in the path. */
|
||||||
inline Vector3d GetNextPoint()
|
inline Vector3d GetNextPoint()
|
||||||
{
|
{
|
||||||
@ -95,17 +96,23 @@ public:
|
|||||||
Vector3i Point = m_PathPoints[m_PathPoints.size() - 1 - (++m_CurrentPoint)];
|
Vector3i Point = m_PathPoints[m_PathPoints.size() - 1 - (++m_CurrentPoint)];
|
||||||
return Vector3d(Point.x + m_HalfWidth, Point.y, Point.z + m_HalfWidth);
|
return Vector3d(Point.x + m_HalfWidth, Point.y, Point.z + m_HalfWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Checks whether this is the last point or not. Never call getnextPoint when this is true. */
|
/** Checks whether this is the last point or not. Never call getnextPoint when this is true. */
|
||||||
inline bool IsLastPoint()
|
inline bool IsLastPoint()
|
||||||
{
|
{
|
||||||
ASSERT(m_Status == ePathFinderStatus::PATH_FOUND);
|
ASSERT(m_Status == ePathFinderStatus::PATH_FOUND);
|
||||||
return (m_CurrentPoint == m_PathPoints.size() - 1);
|
return (m_CurrentPoint == m_PathPoints.size() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool IsFirstPoint()
|
inline bool IsFirstPoint()
|
||||||
{
|
{
|
||||||
ASSERT(m_Status == ePathFinderStatus::PATH_FOUND);
|
ASSERT(m_Status == ePathFinderStatus::PATH_FOUND);
|
||||||
return (m_CurrentPoint == 0);
|
return (m_CurrentPoint == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Get the point at a_index. Remark: Internally, the indexes are reversed. */
|
/** Get the point at a_index. Remark: Internally, the indexes are reversed. */
|
||||||
inline Vector3d GetPoint(size_t a_index)
|
inline Vector3d GetPoint(size_t a_index)
|
||||||
{
|
{
|
||||||
@ -114,6 +121,8 @@ public:
|
|||||||
Vector3i Point = m_PathPoints[m_PathPoints.size() - 1 - a_index];
|
Vector3i Point = m_PathPoints[m_PathPoints.size() - 1 - a_index];
|
||||||
return Vector3d(Point.x + m_HalfWidth, Point.y, Point.z + m_HalfWidth);
|
return Vector3d(Point.x + m_HalfWidth, Point.y, Point.z + m_HalfWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Returns the total number of points this path has. */
|
/** Returns the total number of points this path has. */
|
||||||
inline size_t GetPointCount()
|
inline size_t GetPointCount()
|
||||||
{
|
{
|
||||||
|
@ -103,7 +103,8 @@ void cVillager::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
|
|||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Farmer functions.
|
// Farmer functions:
|
||||||
|
|
||||||
void cVillager::HandleFarmerPrepareFarmCrops()
|
void cVillager::HandleFarmerPrepareFarmCrops()
|
||||||
{
|
{
|
||||||
if (!m_World->VillagersShouldHarvestCrops())
|
if (!m_World->VillagersShouldHarvestCrops())
|
||||||
@ -112,15 +113,16 @@ void cVillager::HandleFarmerPrepareFarmCrops()
|
|||||||
}
|
}
|
||||||
|
|
||||||
cBlockArea Surrounding;
|
cBlockArea Surrounding;
|
||||||
/// Read a 11x7x11 area.
|
|
||||||
|
// Read a 11x7x11 area:
|
||||||
Surrounding.Read(
|
Surrounding.Read(
|
||||||
m_World,
|
m_World,
|
||||||
static_cast<int>(GetPosX()) - 5,
|
FloorC(GetPosX()) - 5,
|
||||||
static_cast<int>(GetPosX()) + 6,
|
FloorC(GetPosX()) + 6,
|
||||||
static_cast<int>(GetPosY()) - 3,
|
FloorC(GetPosY()) - 3,
|
||||||
static_cast<int>(GetPosY()) + 4,
|
FloorC(GetPosY()) + 4,
|
||||||
static_cast<int>(GetPosZ()) - 5,
|
FloorC(GetPosZ()) - 5,
|
||||||
static_cast<int>(GetPosZ()) + 6
|
FloorC(GetPosZ()) + 6
|
||||||
);
|
);
|
||||||
|
|
||||||
for (int I = 0; I < 5; I++)
|
for (int I = 0; I < 5; I++)
|
||||||
|
@ -34,17 +34,17 @@ public:
|
|||||||
virtual void Tick (std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
|
virtual void Tick (std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
|
||||||
|
|
||||||
// cVillager functions
|
// cVillager functions
|
||||||
/** return true if the given blocktype are: crops, potatoes or carrots.*/
|
/** return true if the given blocktype are: crops, potatoes or carrots. */
|
||||||
bool IsBlockFarmable(BLOCKTYPE a_BlockType);
|
bool IsBlockFarmable(BLOCKTYPE a_BlockType);
|
||||||
|
|
||||||
// Farmer functions
|
// Farmer functions
|
||||||
/** Searches in a 11x7x11 area for crops. If it found some it will navigate to them.*/
|
/** Searches in a 11x7x11 area for crops. If it found some it will navigate to them. */
|
||||||
void HandleFarmerPrepareFarmCrops();
|
void HandleFarmerPrepareFarmCrops();
|
||||||
|
|
||||||
/** Looks if the farmer has reached it's destination, and if it's still crops and the destination is closer then 2 blocks it will harvest them.*/
|
/** Looks if the farmer has reached it's destination, and if it's still crops and the destination is closer then 2 blocks it will harvest them. */
|
||||||
void HandleFarmerTryHarvestCrops();
|
void HandleFarmerTryHarvestCrops();
|
||||||
|
|
||||||
/** Replaces the crops he harvested.*/
|
/** Replaces the crops he harvested. */
|
||||||
void HandleFarmerPlaceCrops();
|
void HandleFarmerPlaceCrops();
|
||||||
|
|
||||||
// Get and set functions.
|
// Get and set functions.
|
||||||
|
@ -204,16 +204,16 @@ public:
|
|||||||
const NOISE_DATATYPE * a_FracY ///< Pointer to the attay that stores the Y fractional values
|
const NOISE_DATATYPE * a_FracY ///< Pointer to the attay that stores the Y fractional values
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Uses current m_WorkRnds[] to generate part of the array
|
/** Uses current m_WorkRnds[] to generate part of the array */
|
||||||
void Generate(
|
void Generate(
|
||||||
int a_FromX, int a_ToX,
|
int a_FromX, int a_ToX,
|
||||||
int a_FromY, int a_ToY
|
int a_FromY, int a_ToY
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Initializes m_WorkRnds[] with the specified Floor values
|
/** Initializes m_WorkRnds[] with the specified Floor values */
|
||||||
void InitWorkRnds(int a_FloorX, int a_FloorY);
|
void InitWorkRnds(int a_FloorX, int a_FloorY);
|
||||||
|
|
||||||
/// Updates m_WorkRnds[] for the new Floor values.
|
/** Updates m_WorkRnds[] for the new Floor values. */
|
||||||
void Move(int a_NewFloorX, int a_NewFloorY);
|
void Move(int a_NewFloorX, int a_NewFloorY);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -356,17 +356,17 @@ public:
|
|||||||
const NOISE_DATATYPE * a_FracZ ///< Pointer to the array that stores the Z fractional values
|
const NOISE_DATATYPE * a_FracZ ///< Pointer to the array that stores the Z fractional values
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Uses current m_WorkRnds[] to generate part of the array
|
/** Uses current m_WorkRnds[] to generate part of the array */
|
||||||
void Generate(
|
void Generate(
|
||||||
int a_FromX, int a_ToX,
|
int a_FromX, int a_ToX,
|
||||||
int a_FromY, int a_ToY,
|
int a_FromY, int a_ToY,
|
||||||
int a_FromZ, int a_ToZ
|
int a_FromZ, int a_ToZ
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Initializes m_WorkRnds[] with the specified Floor values
|
/** Initializes m_WorkRnds[] with the specified Floor values */
|
||||||
void InitWorkRnds(int a_FloorX, int a_FloorY, int a_FloorZ);
|
void InitWorkRnds(int a_FloorX, int a_FloorY, int a_FloorZ);
|
||||||
|
|
||||||
/// Updates m_WorkRnds[] for the new Floor values.
|
/** Updates m_WorkRnds[] for the new Floor values. */
|
||||||
void Move(int a_NewFloorX, int a_NewFloorY, int a_NewFloorZ);
|
void Move(int a_NewFloorX, int a_NewFloorY, int a_NewFloorZ);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -37,7 +37,7 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// RAII for cCriticalSection - locks the CS on creation, unlocks on destruction
|
/** RAII for cCriticalSection - locks the CS on creation, unlocks on destruction */
|
||||||
class cCSLock
|
class cCSLock
|
||||||
{
|
{
|
||||||
cCriticalSection * m_CS;
|
cCriticalSection * m_CS;
|
||||||
@ -64,7 +64,7 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Temporary RAII unlock for a cCSLock. Useful for unlock-wait-relock scenarios
|
/** Temporary RAII unlock for a cCSLock. Useful for unlock-wait-relock scenarios */
|
||||||
class cCSUnlock
|
class cCSUnlock
|
||||||
{
|
{
|
||||||
cCSLock & m_Lock;
|
cCSLock & m_Lock;
|
||||||
|
@ -27,16 +27,16 @@ public:
|
|||||||
cGZipFile(void);
|
cGZipFile(void);
|
||||||
~cGZipFile();
|
~cGZipFile();
|
||||||
|
|
||||||
/// Opens the file. Returns true if successful. Fails if a file has already been opened through this object.
|
/** Opens the file. Returns true if successful. Fails if a file has already been opened through this object. */
|
||||||
bool Open(const AString & a_FileName, eMode a_Mode);
|
bool Open(const AString & a_FileName, eMode a_Mode);
|
||||||
|
|
||||||
/// Closes the file, flushing all buffers. This object may be then reused for a different file and / or mode
|
/** Closes the file, flushing all buffers. This object may be then reused for a different file and / or mode */
|
||||||
void Close(void);
|
void Close(void);
|
||||||
|
|
||||||
/// Reads the rest of the file and decompresses it into a_Contents. Returns the number of decompressed bytes, <0 for error
|
/** Reads the rest of the file and decompresses it into a_Contents. Returns the number of decompressed bytes, <0 for error */
|
||||||
int ReadRestOfFile(AString & a_Contents);
|
int ReadRestOfFile(AString & a_Contents);
|
||||||
|
|
||||||
/// Writes a_Contents into file, compressing it along the way. Returns true if successful. Multiple writes are supported.
|
/** Writes a_Contents into file, compressing it along the way. Returns true if successful. Multiple writes are supported. */
|
||||||
bool Write(const AString & a_Contents) { return Write(a_Contents.data(), static_cast<int>(a_Contents.size())); }
|
bool Write(const AString & a_Contents) { return Write(a_Contents.data(), static_cast<int>(a_Contents.size())); }
|
||||||
|
|
||||||
bool Write(const char * a_Data, int a_Size);
|
bool Write(const char * a_Data, int a_Size);
|
||||||
|
@ -16,19 +16,18 @@ To create a queue of type T, instantiate a cQueue<T> object. You can also
|
|||||||
modify the behavior of the queue when deleting items and when adding items
|
modify the behavior of the queue when deleting items and when adding items
|
||||||
that are already in the queue by providing a second parameter, a class that
|
that are already in the queue by providing a second parameter, a class that
|
||||||
implements the functions Delete() and Combine(). An example is given in
|
implements the functions Delete() and Combine(). An example is given in
|
||||||
cQueueFuncs and is used as the default behavior.
|
cQueueFuncs and is used as the default behavior. */
|
||||||
*/
|
|
||||||
|
|
||||||
/// This empty struct allows for the callback functions to be inlined
|
/** This empty struct allows for the callback functions to be inlined */
|
||||||
template <class T>
|
template <class T>
|
||||||
struct cQueueFuncs
|
struct cQueueFuncs
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/// Called when an Item is deleted from the queue without being returned
|
/** Called when an Item is deleted from the queue without being returned */
|
||||||
static void Delete(T) {}
|
static void Delete(T) {}
|
||||||
|
|
||||||
/// Called when an Item is inserted with EnqueueItemIfNotPresent and there is another equal value already inserted
|
/** Called when an Item is inserted with EnqueueItemIfNotPresent and there is another equal value already inserted */
|
||||||
static void Combine(T & a_existing, const T & a_new)
|
static void Combine(T & a_existing, const T & a_new)
|
||||||
{
|
{
|
||||||
UNUSED(a_existing);
|
UNUSED(a_existing);
|
||||||
@ -54,7 +53,7 @@ public:
|
|||||||
~cQueue() {}
|
~cQueue() {}
|
||||||
|
|
||||||
|
|
||||||
/// Enqueues an item to the queue, may block if other threads are accessing the queue.
|
/** Enqueues an item to the queue, may block if other threads are accessing the queue. */
|
||||||
void EnqueueItem(ItemType a_Item)
|
void EnqueueItem(ItemType a_Item)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CS);
|
cCSLock Lock(m_CS);
|
||||||
@ -63,7 +62,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Enqueues an item in the queue if not already present (as determined by operator ==). Blocks other threads from accessing the queue.
|
/** Enqueues an item in the queue if not already present (as determined by operator ==). Blocks other threads from accessing the queue. */
|
||||||
void EnqueueItemIfNotPresent(ItemType a_Item)
|
void EnqueueItemIfNotPresent(ItemType a_Item)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CS);
|
cCSLock Lock(m_CS);
|
||||||
@ -81,8 +80,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Dequeues an item from the queue if any are present.
|
/** Dequeues an item from the queue if any are present.
|
||||||
/// Returns true if successful. Value of item is undefined if dequeuing was unsuccessful.
|
Returns true if successful. Value of item is undefined if dequeuing was unsuccessful. */
|
||||||
bool TryDequeueItem(ItemType & item)
|
bool TryDequeueItem(ItemType & item)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CS);
|
cCSLock Lock(m_CS);
|
||||||
@ -97,7 +96,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Dequeues an item from the queue, blocking until an item is available.
|
/** Dequeues an item from the queue, blocking until an item is available. */
|
||||||
ItemType DequeueItem(void)
|
ItemType DequeueItem(void)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CS);
|
cCSLock Lock(m_CS);
|
||||||
@ -113,7 +112,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Blocks until the queue is empty.
|
/** Blocks until the queue is empty. */
|
||||||
void BlockTillEmpty(void)
|
void BlockTillEmpty(void)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CS);
|
cCSLock Lock(m_CS);
|
||||||
@ -125,7 +124,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Removes all Items from the Queue, calling Delete on each of them.
|
/** Removes all Items from the Queue, calling Delete on each of them. */
|
||||||
void Clear(void)
|
void Clear(void)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CS);
|
cCSLock Lock(m_CS);
|
||||||
@ -137,8 +136,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Returns the size at time of being called.
|
/** Returns the size at time of being called.
|
||||||
/// Do not use to determine whether to call DequeueItem(), use TryDequeueItem() instead
|
Do not use to determine whether to call DequeueItem(), use TryDequeueItem() instead */
|
||||||
size_t Size(void)
|
size_t Size(void)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CS);
|
cCSLock Lock(m_CS);
|
||||||
@ -146,8 +145,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Removes the item from the queue. If there are multiple such items, only the first one is removed.
|
/** Removes the item from the queue. If there are multiple such items, only the first one is removed.
|
||||||
/// Returns true if the item has been removed, false if no such item found.
|
Returns true if the item has been removed, false if no such item found. */
|
||||||
bool Remove(ItemType a_Item)
|
bool Remove(ItemType a_Item)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CS);
|
cCSLock Lock(m_CS);
|
||||||
@ -187,16 +186,16 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// The contents of the queue
|
/** The contents of the queue */
|
||||||
QueueType m_Contents;
|
QueueType m_Contents;
|
||||||
|
|
||||||
/// Mutex that protects access to the queue contents
|
/** Mutex that protects access to the queue contents */
|
||||||
cCriticalSection m_CS;
|
cCriticalSection m_CS;
|
||||||
|
|
||||||
/// Event that is signalled when an item is added
|
/** Event that is signalled when an item is added */
|
||||||
cEvent m_evtAdded;
|
cEvent m_evtAdded;
|
||||||
|
|
||||||
/// Event that is signalled when an item is removed (both dequeued or erased)
|
/** Event that is signalled when an item is removed (both dequeued or erased) */
|
||||||
cEvent m_evtRemoved;
|
cEvent m_evtRemoved;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -48,16 +48,16 @@ public:
|
|||||||
|
|
||||||
cProbabDistrib(int a_MaxValue);
|
cProbabDistrib(int a_MaxValue);
|
||||||
|
|
||||||
/// Sets the distribution curve using an array of [value, probability] points, linearly interpolated. a_Points must not be empty.
|
/** Sets the distribution curve using an array of [value, probability] points, linearly interpolated. a_Points must not be empty. */
|
||||||
void SetPoints(const cPoints & a_Points);
|
void SetPoints(const cPoints & a_Points);
|
||||||
|
|
||||||
/// Sets the distribution curve using a definition string; returns true on successful parse
|
/** Sets the distribution curve using a definition string; returns true on successful parse */
|
||||||
bool SetDefString(const AString & a_DefString);
|
bool SetDefString(const AString & a_DefString);
|
||||||
|
|
||||||
/// Gets a random value from a_Rand, shapes it into the distribution curve and returns the value.
|
/** Gets a random value from a_Rand, shapes it into the distribution curve and returns the value. */
|
||||||
int Random(MTRand & a_Rand) const;
|
int Random(MTRand & a_Rand) const;
|
||||||
|
|
||||||
/// Maps value in range [0, m_Sum] into the range [0, m_MaxValue] using the stored probability
|
/** Maps value in range [0, m_Sum] into the range [0, m_MaxValue] using the stored probability */
|
||||||
int MapValue(int a_OrigValue) const;
|
int MapValue(int a_OrigValue) const;
|
||||||
|
|
||||||
int GetSum(void) const { return m_Sum; }
|
int GetSum(void) const { return m_Sum; }
|
||||||
@ -65,8 +65,12 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
|
|
||||||
int m_MaxValue;
|
int m_MaxValue;
|
||||||
cPoints m_Cumulative; ///< Cumulative probability of the values, sorted, for fast bsearch lookup
|
|
||||||
int m_Sum; ///< Sum of all the probabilities across all values in the domain; -1 if not set
|
/** Cumulative probability of the values, sorted, for fast bsearch lookup */
|
||||||
|
cPoints m_Cumulative;
|
||||||
|
|
||||||
|
/** Sum of all the probabilities across all values in the domain; -1 if not set */
|
||||||
|
int m_Sum;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ public:
|
|||||||
|
|
||||||
virtual ~cProtocol() {}
|
virtual ~cProtocol() {}
|
||||||
|
|
||||||
/// Called when client sends some data
|
/** Called when client sends some data */
|
||||||
virtual void DataReceived(const char * a_Data, size_t a_Size) = 0;
|
virtual void DataReceived(const char * a_Data, size_t a_Size) = 0;
|
||||||
|
|
||||||
// Sending stuff to clients (alphabetically sorted):
|
// Sending stuff to clients (alphabetically sorted):
|
||||||
@ -150,7 +150,7 @@ public:
|
|||||||
virtual void SendWindowOpen (const cWindow & a_Window) = 0;
|
virtual void SendWindowOpen (const cWindow & a_Window) = 0;
|
||||||
virtual void SendWindowProperty (const cWindow & a_Window, short a_Property, short a_Value) = 0;
|
virtual void SendWindowProperty (const cWindow & a_Window, short a_Property, short a_Value) = 0;
|
||||||
|
|
||||||
/// Returns the ServerID used for authentication through session.minecraft.net
|
/** Returns the ServerID used for authentication through session.minecraft.net */
|
||||||
virtual AString GetAuthServerID(void) = 0;
|
virtual AString GetAuthServerID(void) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -41,13 +41,13 @@ public:
|
|||||||
cProtocolRecognizer(cClientHandle * a_Client);
|
cProtocolRecognizer(cClientHandle * a_Client);
|
||||||
virtual ~cProtocolRecognizer();
|
virtual ~cProtocolRecognizer();
|
||||||
|
|
||||||
/// Translates protocol version number into protocol version text: 49 -> "1.4.4"
|
/** Translates protocol version number into protocol version text: 49 -> "1.4.4" */
|
||||||
static AString GetVersionTextFromInt(int a_ProtocolVersion);
|
static AString GetVersionTextFromInt(int a_ProtocolVersion);
|
||||||
|
|
||||||
/// Called when client sends some data:
|
/** Called when client sends some data: */
|
||||||
virtual void DataReceived(const char * a_Data, size_t a_Size) override;
|
virtual void DataReceived(const char * a_Data, size_t a_Size) override;
|
||||||
|
|
||||||
/// Sending stuff to clients (alphabetically sorted):
|
/** Sending stuff to clients (alphabetically sorted): */
|
||||||
virtual void SendAttachEntity (const cEntity & a_Entity, const cEntity * a_Vehicle) override;
|
virtual void SendAttachEntity (const cEntity & a_Entity, const cEntity * a_Vehicle) override;
|
||||||
virtual void SendBlockAction (int a_BlockX, int a_BlockY, int a_BlockZ, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType) override;
|
virtual void SendBlockAction (int a_BlockX, int a_BlockY, int a_BlockZ, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType) override;
|
||||||
virtual void SendBlockBreakAnim (UInt32 a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage) override;
|
virtual void SendBlockBreakAnim (UInt32 a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage) override;
|
||||||
@ -140,15 +140,19 @@ public:
|
|||||||
virtual void SendData(const char * a_Data, size_t a_Size) override;
|
virtual void SendData(const char * a_Data, size_t a_Size) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
cProtocol * m_Protocol; ///< The recognized protocol
|
/** The recognized protocol */
|
||||||
cByteBuffer m_Buffer; ///< Buffer for the incoming data until we recognize the protocol
|
cProtocol * m_Protocol;
|
||||||
|
|
||||||
/// Tries to recognize protocol based on m_Buffer contents; returns true if recognized
|
/** Buffer for the incoming data until we recognize the protocol */
|
||||||
|
cByteBuffer m_Buffer;
|
||||||
|
|
||||||
|
|
||||||
|
/** Tries to recognize protocol based on m_Buffer contents; returns true if recognized */
|
||||||
bool TryRecognizeProtocol(void);
|
bool TryRecognizeProtocol(void);
|
||||||
|
|
||||||
/** Tries to recognize a protocol in the lengthed family (1.7+), based on m_Buffer; returns true if recognized.
|
/** Tries to recognize a protocol in the lengthed family (1.7+), based on m_Buffer; returns true if recognized.
|
||||||
The packet length and type have already been read, type is 0
|
The packet length and type have already been read, type is 0
|
||||||
The number of bytes remaining in the packet is passed as a_PacketLengthRemaining. **/
|
The number of bytes remaining in the packet is passed as a_PacketLengthRemaining. */
|
||||||
bool TryRecognizeLengthedProtocol(UInt32 a_PacketLengthRemaining);
|
bool TryRecognizeLengthedProtocol(UInt32 a_PacketLengthRemaining);
|
||||||
|
|
||||||
/** Sends a single packet contained within the cPacketizer class.
|
/** Sends a single packet contained within the cPacketizer class.
|
||||||
|
@ -336,7 +336,6 @@ void cRCONServer::cConnection::UIntToBuffer(UInt32 a_Value, char * a_Buffer)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Sends a RCON packet back to the client
|
|
||||||
void cRCONServer::cConnection::SendResponse(UInt32 a_RequestID, UInt32 a_PacketType, UInt32 a_PayloadLength, const char * a_Payload)
|
void cRCONServer::cConnection::SendResponse(UInt32 a_RequestID, UInt32 a_PacketType, UInt32 a_PayloadLength, const char * a_Payload)
|
||||||
{
|
{
|
||||||
ASSERT((a_PayloadLength == 0) || (a_Payload != nullptr)); // Either zero data to send, or a valid payload ptr
|
ASSERT((a_PayloadLength == 0) || (a_Payload != nullptr)); // Either zero data to send, or a valid payload ptr
|
||||||
|
40
src/Root.h
40
src/Root.h
@ -78,10 +78,10 @@ public:
|
|||||||
}
|
}
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
/// Calls the callback for each world; returns true if the callback didn't abort (return true)
|
/** Calls the callback for each world; returns true if the callback didn't abort (return true) */
|
||||||
bool ForEachWorld(cWorldListCallback & a_Callback); // >> Exported in ManualBindings <<
|
bool ForEachWorld(cWorldListCallback & a_Callback); // >> Exported in ManualBindings <<
|
||||||
|
|
||||||
/// Writes chunkstats, for each world and totals, to the output callback
|
/** Writes chunkstats, for each world and totals, to the output callback */
|
||||||
void LogChunkStats(cCommandOutputCallback & a_Output);
|
void LogChunkStats(cCommandOutputCallback & a_Output);
|
||||||
|
|
||||||
cMonsterConfig * GetMonsterConfig(void) { return m_MonsterConfig; }
|
cMonsterConfig * GetMonsterConfig(void) { return m_MonsterConfig; }
|
||||||
@ -89,7 +89,7 @@ public:
|
|||||||
cCraftingRecipes * GetCraftingRecipes(void) { return m_CraftingRecipes; } // tolua_export
|
cCraftingRecipes * GetCraftingRecipes(void) { return m_CraftingRecipes; } // tolua_export
|
||||||
cFurnaceRecipe * GetFurnaceRecipe (void) { return m_FurnaceRecipe; } // Exported in ManualBindings.cpp with quite a different signature
|
cFurnaceRecipe * GetFurnaceRecipe (void) { return m_FurnaceRecipe; } // Exported in ManualBindings.cpp with quite a different signature
|
||||||
|
|
||||||
/// Returns the number of ticks for how long the item would fuel a furnace. Returns zero if not a fuel
|
/** Returns the number of ticks for how long the item would fuel a furnace. Returns zero if not a fuel */
|
||||||
static int GetFurnaceFuelBurnTime(const cItem & a_Fuel); // tolua_export
|
static int GetFurnaceFuelBurnTime(const cItem & a_Fuel); // tolua_export
|
||||||
|
|
||||||
/** The current time where the startup of the server has been completed */
|
/** The current time where the startup of the server has been completed */
|
||||||
@ -115,28 +115,28 @@ public:
|
|||||||
*/
|
*/
|
||||||
void QueueExecuteConsoleCommand(const AString & a_Cmd); // tolua_export
|
void QueueExecuteConsoleCommand(const AString & a_Cmd); // tolua_export
|
||||||
|
|
||||||
/// Executes a console command through the cServer class; does special handling for "stop" and "restart".
|
/** Executes a console command through the cServer class; does special handling for "stop" and "restart". */
|
||||||
void ExecuteConsoleCommand(const AString & a_Cmd, cCommandOutputCallback & a_Output);
|
void ExecuteConsoleCommand(const AString & a_Cmd, cCommandOutputCallback & a_Output);
|
||||||
|
|
||||||
/// Kicks the user, no matter in what world they are. Used from cAuthenticator
|
/** Kicks the user, no matter in what world they are. Used from cAuthenticator */
|
||||||
void KickUser(int a_ClientID, const AString & a_Reason);
|
void KickUser(int a_ClientID, const AString & a_Reason);
|
||||||
|
|
||||||
/// Called by cAuthenticator to auth the specified user
|
/** Called by cAuthenticator to auth the specified user */
|
||||||
void AuthenticateUser(int a_ClientID, const AString & a_Name, const AString & a_UUID, const Json::Value & a_Properties);
|
void AuthenticateUser(int a_ClientID, const AString & a_Name, const AString & a_UUID, const Json::Value & a_Properties);
|
||||||
|
|
||||||
/// Executes commands queued in the command queue
|
/** Executes commands queued in the command queue */
|
||||||
void TickCommands(void);
|
void TickCommands(void);
|
||||||
|
|
||||||
/// Returns the number of chunks loaded
|
/** Returns the number of chunks loaded */
|
||||||
int GetTotalChunkCount(void); // tolua_export
|
int GetTotalChunkCount(void); // tolua_export
|
||||||
|
|
||||||
/// Saves all chunks in all worlds
|
/** Saves all chunks in all worlds */
|
||||||
void SaveAllChunks(void); // tolua_export
|
void SaveAllChunks(void); // tolua_export
|
||||||
|
|
||||||
/// Calls the callback for each player in all worlds
|
/** Calls the callback for each player in all worlds */
|
||||||
bool ForEachPlayer(cPlayerListCallback & a_Callback); // >> EXPORTED IN MANUALBINDINGS <<
|
bool ForEachPlayer(cPlayerListCallback & a_Callback); // >> EXPORTED IN MANUALBINDINGS <<
|
||||||
|
|
||||||
/// Finds a player from a partial or complete player name and calls the callback - case-insensitive
|
/** Finds a player from a partial or complete player name and calls the callback - case-insensitive */
|
||||||
bool FindAndDoWithPlayer(const AString & a_PlayerName, cPlayerListCallback & a_Callback); // >> EXPORTED IN MANUALBINDINGS <<
|
bool FindAndDoWithPlayer(const AString & a_PlayerName, cPlayerListCallback & a_Callback); // >> EXPORTED IN MANUALBINDINGS <<
|
||||||
|
|
||||||
/** Finds the player over his uuid and calls the callback */
|
/** Finds the player over his uuid and calls the callback */
|
||||||
@ -153,7 +153,7 @@ public:
|
|||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
|
|
||||||
/// Sends a chat message to all connected clients (in all worlds)
|
/** Sends a chat message to all connected clients (in all worlds) */
|
||||||
void BroadcastChat (const AString & a_Message, eMessageType a_ChatPrefix = mtCustom);
|
void BroadcastChat (const AString & a_Message, eMessageType a_ChatPrefix = mtCustom);
|
||||||
void BroadcastChat (const cCompositeChat & a_Message);
|
void BroadcastChat (const cCompositeChat & a_Message);
|
||||||
void BroadcastChatDeath (const AString & a_Message) { BroadcastChat(a_Message, mtDeath); }
|
void BroadcastChatDeath (const AString & a_Message) { BroadcastChat(a_Message, mtDeath); }
|
||||||
@ -165,13 +165,13 @@ public:
|
|||||||
void BroadcastChatSuccess(const AString & a_Message) { BroadcastChat(a_Message, mtSuccess); }
|
void BroadcastChatSuccess(const AString & a_Message) { BroadcastChat(a_Message, mtSuccess); }
|
||||||
void BroadcastChatWarning(const AString & a_Message) { BroadcastChat(a_Message, mtWarning); }
|
void BroadcastChatWarning(const AString & a_Message) { BroadcastChat(a_Message, mtWarning); }
|
||||||
|
|
||||||
/// Returns the textual description of the protocol version: 49 -> "1.4.4". Provided specifically for Lua API
|
/** Returns the textual description of the protocol version: 49 -> "1.4.4". Provided specifically for Lua API */
|
||||||
static AString GetProtocolVersionTextFromInt(int a_ProtocolVersionNum);
|
static AString GetProtocolVersionTextFromInt(int a_ProtocolVersionNum);
|
||||||
|
|
||||||
/// Returns the amount of virtual RAM used, in KiB. Returns a negative number on error
|
/** Returns the amount of virtual RAM used, in KiB. Returns a negative number on error */
|
||||||
static int GetVirtualRAMUsage(void);
|
static int GetVirtualRAMUsage(void);
|
||||||
|
|
||||||
/// Returns the amount of virtual RAM used, in KiB. Returns a negative number on error
|
/** Returns the amount of virtual RAM used, in KiB. Returns a negative number on error */
|
||||||
static int GetPhysicalRAMUsage(void);
|
static int GetPhysicalRAMUsage(void);
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
@ -220,19 +220,19 @@ private:
|
|||||||
|
|
||||||
void LoadGlobalSettings();
|
void LoadGlobalSettings();
|
||||||
|
|
||||||
/// Loads the worlds from settings.ini, creates the worldmap
|
/** Loads the worlds from settings.ini, creates the worldmap */
|
||||||
void LoadWorlds(cSettingsRepositoryInterface & a_Settings);
|
void LoadWorlds(cSettingsRepositoryInterface & a_Settings);
|
||||||
|
|
||||||
/// Starts each world's life
|
/** Starts each world's life */
|
||||||
void StartWorlds(void);
|
void StartWorlds(void);
|
||||||
|
|
||||||
/// Stops each world's threads, so that it's safe to unload them
|
/** Stops each world's threads, so that it's safe to unload them */
|
||||||
void StopWorlds(void);
|
void StopWorlds(void);
|
||||||
|
|
||||||
/// Unloads all worlds from memory
|
/** Unloads all worlds from memory */
|
||||||
void UnloadWorlds(void);
|
void UnloadWorlds(void);
|
||||||
|
|
||||||
/// Does the actual work of executing a command
|
/** Does the actual work of executing a command */
|
||||||
void DoExecuteConsoleCommand(const AString & a_Cmd);
|
void DoExecuteConsoleCommand(const AString & a_Cmd);
|
||||||
|
|
||||||
static cRoot * s_Root;
|
static cRoot * s_Root;
|
||||||
|
@ -33,10 +33,10 @@ extern "C"
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// For the "dumpmem" server command:
|
/** Enable the memory leak finder - needed for the "dumpmem" server command:
|
||||||
/// Synchronize this with main.cpp - the leak finder needs initialization before it can be used to dump memory
|
Synchronize this with main.cpp - the leak finder needs initialization before it can be used to dump memory
|
||||||
// _X 2014_02_20: Disabled for canon repo, it makes the debug version too slow in MSVC2013
|
_X 2014_02_20: Disabled for canon repo, it makes the debug version too slow in MSVC2013
|
||||||
// and we haven't had a memory leak for over a year anyway.
|
and we haven't had a memory leak for over a year anyway. */
|
||||||
// #define ENABLE_LEAK_FINDER
|
// #define ENABLE_LEAK_FINDER
|
||||||
|
|
||||||
#if defined(_MSC_VER) && defined(_DEBUG) && defined(ENABLE_LEAK_FINDER)
|
#if defined(_MSC_VER) && defined(_DEBUG) && defined(ENABLE_LEAK_FINDER)
|
||||||
|
@ -18,29 +18,29 @@ public:
|
|||||||
/** Returns true iff the specified value exists. */
|
/** Returns true iff the specified value exists. */
|
||||||
virtual bool HasValue(const AString & a_KeyName, const AString & a_ValueName) const = 0;
|
virtual bool HasValue(const AString & a_KeyName, const AString & a_ValueName) const = 0;
|
||||||
|
|
||||||
/** Add a key name. Return value is not required to mean anything **/
|
/** Add a key name. Return value is not required to mean anything */
|
||||||
virtual int AddKeyName(const AString & keyname) = 0;
|
virtual int AddKeyName(const AString & keyname) = 0;
|
||||||
|
|
||||||
/** Add a key comment, will always fail if the repository does not support comments **/
|
/** Add a key comment, will always fail if the repository does not support comments */
|
||||||
virtual bool AddKeyComment(const AString & keyname, const AString & comment) = 0;
|
virtual bool AddKeyComment(const AString & keyname, const AString & comment) = 0;
|
||||||
|
|
||||||
/** Return a key comment, returns "" for repositories that do not return comments **/
|
/** Return a key comment, returns "" for repositories that do not return comments */
|
||||||
virtual AString GetKeyComment(const AString & keyname, const int commentID) const = 0;
|
virtual AString GetKeyComment(const AString & keyname, const int commentID) const = 0;
|
||||||
|
|
||||||
/** Delete a key comment, will always fail if the repository does not support comments **/
|
/** Delete a key comment, will always fail if the repository does not support comments */
|
||||||
virtual bool DeleteKeyComment(const AString & keyname, const int commentID) = 0;
|
virtual bool DeleteKeyComment(const AString & keyname, const int commentID) = 0;
|
||||||
|
|
||||||
/** Adds a new value to the specified key.
|
/** Adds a new value to the specified key.
|
||||||
If a value of the same name already exists, creates another one **/
|
If a value of the same name already exists, creates another one */
|
||||||
virtual void AddValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value) = 0;
|
virtual void AddValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value) = 0;
|
||||||
|
|
||||||
/** returns a vector containing a name, value pair for each value under the key **/
|
/** returns a vector containing a name, value pair for each value under the key */
|
||||||
virtual std::vector<std::pair<AString, AString>> GetValues(AString a_keyName) = 0;
|
virtual std::vector<std::pair<AString, AString>> GetValues(AString a_keyName) = 0;
|
||||||
|
|
||||||
/** Get the value at the specified key and value, returns defValue on failure **/
|
/** Get the value at the specified key and value, returns defValue on failure */
|
||||||
virtual AString GetValue (const AString & keyname, const AString & valuename, const AString & defValue = "") const = 0;
|
virtual AString GetValue (const AString & keyname, const AString & valuename, const AString & defValue = "") const = 0;
|
||||||
|
|
||||||
/** Gets the value; if not found, write the default to the repository **/
|
/** Gets the value; if not found, write the default to the repository */
|
||||||
virtual AString GetValueSet (const AString & keyname, const AString & valuename, const AString & defValue = "") = 0;
|
virtual AString GetValueSet (const AString & keyname, const AString & valuename, const AString & defValue = "") = 0;
|
||||||
virtual int GetValueSetI(const AString & keyname, const AString & valuename, const int defValue = 0) = 0;
|
virtual int GetValueSetI(const AString & keyname, const AString & valuename, const int defValue = 0) = 0;
|
||||||
virtual Int64 GetValueSetI(const AString & keyname, const AString & valuename, const Int64 defValue = 0) = 0;
|
virtual Int64 GetValueSetI(const AString & keyname, const AString & valuename, const Int64 defValue = 0) = 0;
|
||||||
@ -48,14 +48,14 @@ public:
|
|||||||
|
|
||||||
/** Overwrites the value of the key, value pair
|
/** Overwrites the value of the key, value pair
|
||||||
Specify the optional parameter as false if you do not want the value created if it doesn't exist.
|
Specify the optional parameter as false if you do not want the value created if it doesn't exist.
|
||||||
Returns true if value set, false otherwise. **/
|
Returns true if value set, false otherwise. */
|
||||||
virtual bool SetValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value, const bool a_CreateIfNotExists = true) = 0;
|
virtual bool SetValue (const AString & a_KeyName, const AString & a_ValueName, const AString & a_Value, const bool a_CreateIfNotExists = true) = 0;
|
||||||
virtual bool SetValueI(const AString & a_KeyName, const AString & a_ValueName, const int a_Value, const bool a_CreateIfNotExists = true) = 0;
|
virtual bool SetValueI(const AString & a_KeyName, const AString & a_ValueName, const int a_Value, const bool a_CreateIfNotExists = true) = 0;
|
||||||
|
|
||||||
/** Deletes the specified key, value pair **/
|
/** Deletes the specified key, value pair */
|
||||||
virtual bool DeleteValue(const AString & keyname, const AString & valuename) = 0;
|
virtual bool DeleteValue(const AString & keyname, const AString & valuename) = 0;
|
||||||
|
|
||||||
|
|
||||||
/** Writes the changes to the backing store, if the repository has one **/
|
/** Writes the changes to the backing store, if the repository has one */
|
||||||
virtual bool Flush() = 0;
|
virtual bool Flush() = 0;
|
||||||
};
|
};
|
||||||
|
@ -22,10 +22,10 @@ public:
|
|||||||
class cSlot
|
class cSlot
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/// Returns true if the specified block is stored
|
/** Returns true if the specified block is stored */
|
||||||
bool HasBlock(int a_RelX, int a_RelY, int a_RelZ);
|
bool HasBlock(int a_RelX, int a_RelY, int a_RelZ);
|
||||||
|
|
||||||
/// Adds the specified block unless already present; returns true if added, false if the block was already present
|
/** Adds the specified block unless already present; returns true if added, false if the block was already present */
|
||||||
bool Add(int a_RelX, int a_RelY, int a_RelZ);
|
bool Add(int a_RelX, int a_RelY, int a_RelZ);
|
||||||
|
|
||||||
/** Array of block containers, each item stores blocks for one Z coord
|
/** Array of block containers, each item stores blocks for one Z coord
|
||||||
@ -37,7 +37,7 @@ public:
|
|||||||
cDelayedFluidSimulatorChunkData(int a_TickDelay);
|
cDelayedFluidSimulatorChunkData(int a_TickDelay);
|
||||||
virtual ~cDelayedFluidSimulatorChunkData();
|
virtual ~cDelayedFluidSimulatorChunkData();
|
||||||
|
|
||||||
/// Slots, one for each delay tick, each containing the blocks to simulate
|
/** Slots, one for each delay tick, each containing the blocks to simulate */
|
||||||
cSlot * m_Slots;
|
cSlot * m_Slots;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
@ -67,13 +67,11 @@ protected:
|
|||||||
|
|
||||||
int m_TotalBlocks; // Statistics only: the total number of blocks currently queued
|
int m_TotalBlocks; // Statistics only: the total number of blocks currently queued
|
||||||
|
|
||||||
/*
|
/* Slots:
|
||||||
Slots:
|
|
||||||
| 0 | 1 | ... | m_AddSlotNum | m_SimSlotNum | ... | m_TickDelay - 1 |
|
| 0 | 1 | ... | m_AddSlotNum | m_SimSlotNum | ... | m_TickDelay - 1 |
|
||||||
| adding blocks here ^ | ^ simulating here
|
| adding blocks here ^ | ^ simulating here */
|
||||||
*/
|
|
||||||
|
|
||||||
/// Called from SimulateChunk() to simulate each block in one slot of blocks. Descendants override this method to provide custom simulation.
|
/** Called from SimulateChunk() to simulate each block in one slot of blocks. Descendants override this method to provide custom simulation. */
|
||||||
virtual void SimulateBlock(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ) = 0;
|
virtual void SimulateBlock(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ) = 0;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -31,35 +31,34 @@ public:
|
|||||||
static bool DoesBurnForever(BLOCKTYPE a_BlockType);
|
static bool DoesBurnForever(BLOCKTYPE a_BlockType);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// Time (in msec) that a fire block takes to burn with a fuel block into the next step
|
/** Time (in msec) that a fire block takes to burn with a fuel block into the next step */
|
||||||
unsigned m_BurnStepTimeFuel;
|
unsigned m_BurnStepTimeFuel;
|
||||||
|
|
||||||
/// Time (in msec) that a fire block takes to burn without a fuel block into the next step
|
/** Time (in msec) that a fire block takes to burn without a fuel block into the next step */
|
||||||
unsigned m_BurnStepTimeNonfuel;
|
unsigned m_BurnStepTimeNonfuel;
|
||||||
|
|
||||||
/// Chance [0..100000] of an adjacent fuel to catch fire on each tick
|
/** Chance [0..100000] of an adjacent fuel to catch fire on each tick */
|
||||||
int m_Flammability;
|
int m_Flammability;
|
||||||
|
|
||||||
/// Chance [0..100000] of a fuel burning out being replaced by a new fire block instead of an air block
|
/** Chance [0..100000] of a fuel burning out being replaced by a new fire block instead of an air block */
|
||||||
int m_ReplaceFuelChance;
|
int m_ReplaceFuelChance;
|
||||||
|
|
||||||
|
|
||||||
virtual void AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk) override;
|
virtual void AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk) override;
|
||||||
|
|
||||||
/// Returns the time [msec] after which the specified fire block is stepped again; based on surrounding fuels
|
/** Returns the time [msec] after which the specified fire block is stepped again; based on surrounding fuels */
|
||||||
int GetBurnStepTime(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ);
|
int GetBurnStepTime(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ);
|
||||||
|
|
||||||
/// Tries to spread fire to a neighborhood of the specified block
|
/** Tries to spread fire to a neighborhood of the specified block */
|
||||||
void TrySpreadFire(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ);
|
void TrySpreadFire(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ);
|
||||||
|
|
||||||
/// Removes all burnable blocks neighboring the specified block
|
/** Removes all burnable blocks neighboring the specified block */
|
||||||
void RemoveFuelNeighbors(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ);
|
void RemoveFuelNeighbors(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ);
|
||||||
|
|
||||||
/** Returns true if a fire can be started in the specified block,
|
/** Returns true if a fire can be started in the specified block,
|
||||||
that is, it is an air block and has fuel next to it.
|
that is, it is an air block and has fuel next to it.
|
||||||
Note that a_NearChunk may be a chunk neighbor to the block specified!
|
Note that a_NearChunk may be a chunk neighbor to the block specified!
|
||||||
The coords are relative to a_NearChunk but not necessarily in it.
|
The coords are relative to a_NearChunk but not necessarily in it. */
|
||||||
*/
|
|
||||||
bool CanStartFireInBlock(cChunk * a_NearChunk, int a_RelX, int a_RelY, int a_RelZ);
|
bool CanStartFireInBlock(cChunk * a_NearChunk, int a_RelX, int a_RelY, int a_RelZ);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
@ -67,7 +66,7 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Stores individual fire blocks in the chunk; the int data is used as the time [msec] the fire takes to step to another stage (blockmeta++)
|
/** Stores individual fire blocks in the chunk; the int data is used as the time [msec] the fire takes to step to another stage (blockmeta++) */
|
||||||
typedef cCoordWithIntList cFireSimulatorChunkData;
|
typedef cCoordWithIntList cFireSimulatorChunkData;
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,8 +24,7 @@ enum Direction
|
|||||||
|
|
||||||
|
|
||||||
/** This is a base class for all fluid simulator data classes.
|
/** This is a base class for all fluid simulator data classes.
|
||||||
Needed so that cChunk can properly delete instances of fluid simulator data, no matter what simulator it's using
|
Needed so that cChunk can properly delete instances of fluid simulator data, no matter what simulator it's using. */
|
||||||
*/
|
|
||||||
class cFluidSimulatorData
|
class cFluidSimulatorData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -47,10 +46,10 @@ public:
|
|||||||
// cSimulator overrides:
|
// cSimulator overrides:
|
||||||
virtual bool IsAllowedBlock(BLOCKTYPE a_BlockType) override;
|
virtual bool IsAllowedBlock(BLOCKTYPE a_BlockType) override;
|
||||||
|
|
||||||
/// Gets the flowing direction. If a_Over is true also the block over the current block affects the direction (standard)
|
/** Gets the flowing direction. If a_Over is true also the block over the current block affects the direction (standard) */
|
||||||
virtual Direction GetFlowingDirection(int a_X, int a_Y, int a_Z, bool a_Over = true);
|
virtual Direction GetFlowingDirection(int a_X, int a_Y, int a_Z, bool a_Over = true);
|
||||||
|
|
||||||
/// Creates a ChunkData object for the simulator to use. The simulator returns the correct object type.
|
/** Creates a ChunkData object for the simulator to use. The simulator returns the correct object type. */
|
||||||
virtual cFluidSimulatorData * CreateChunkData(void) { return nullptr; }
|
virtual cFluidSimulatorData * CreateChunkData(void) { return nullptr; }
|
||||||
|
|
||||||
bool IsFluidBlock (BLOCKTYPE a_BlockType) const { return (a_BlockType == m_FluidBlock); }
|
bool IsFluidBlock (BLOCKTYPE a_BlockType) const { return (a_BlockType == m_FluidBlock); }
|
||||||
@ -62,7 +61,7 @@ public:
|
|||||||
bool IsSolidBlock (BLOCKTYPE a_BlockType);
|
bool IsSolidBlock (BLOCKTYPE a_BlockType);
|
||||||
bool IsPassableForFluid(BLOCKTYPE a_BlockType);
|
bool IsPassableForFluid(BLOCKTYPE a_BlockType);
|
||||||
|
|
||||||
/// Returns true if a_Meta1 is a higher fluid than a_Meta2. Takes source blocks into account.
|
/** Returns true if a_Meta1 is a higher fluid than a_Meta2. Takes source blocks into account. */
|
||||||
bool IsHigherMeta(NIBBLETYPE a_Meta1, NIBBLETYPE a_Meta2);
|
bool IsHigherMeta(NIBBLETYPE a_Meta1, NIBBLETYPE a_Meta2);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -71,12 +71,11 @@ private:
|
|||||||
bool ShouldPowerOn; // What happens when the delay time is fulfilled?
|
bool ShouldPowerOn; // What happens when the delay time is fulfilled?
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Per-chunk data for the simulator, specified individual chunks to simulate */
|
||||||
class cIncrementalRedstoneSimulatorChunkData :
|
class cIncrementalRedstoneSimulatorChunkData :
|
||||||
public cRedstoneSimulatorChunkData
|
public cRedstoneSimulatorChunkData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/// Per-chunk data for the simulator, specified individual chunks to simulate
|
|
||||||
|
|
||||||
/** test */
|
/** test */
|
||||||
std::unordered_map<Vector3i, std::pair<BLOCKTYPE, bool>, VectorHasher<int>> m_ChunkData;
|
std::unordered_map<Vector3i, std::pair<BLOCKTYPE, bool>, VectorHasher<int>> m_ChunkData;
|
||||||
std::vector<sPoweredBlocks> m_PoweredBlocks;
|
std::vector<sPoweredBlocks> m_PoweredBlocks;
|
||||||
@ -241,7 +240,7 @@ private:
|
|||||||
The only diffence between this and a normal AreCoordsPowered is that this function checks for a wire powering another wire */
|
The only diffence between this and a normal AreCoordsPowered is that this function checks for a wire powering another wire */
|
||||||
static unsigned char IsWirePowered(Vector3i a_RelBlockPosition, cChunk * a_Chunk);
|
static unsigned char IsWirePowered(Vector3i a_RelBlockPosition, cChunk * a_Chunk);
|
||||||
|
|
||||||
/** Handles delayed updates to repeaters **/
|
/** Handles delayed updates to repeaters */
|
||||||
void HandleRedstoneRepeaterDelays(void);
|
void HandleRedstoneRepeaterDelays(void);
|
||||||
|
|
||||||
/** Returns if lever metadata marks it as emitting power */
|
/** Returns if lever metadata marks it as emitting power */
|
||||||
|
@ -3,13 +3,25 @@
|
|||||||
|
|
||||||
#include "Simulator.h"
|
#include "Simulator.h"
|
||||||
|
|
||||||
/// Per-chunk data for the simulator, specified individual chunks to simulate; Data is not used
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// fwd:
|
||||||
|
class cChunk;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** Per-chunk data for the simulator, specified individual chunks to simulate; Data is not used */
|
||||||
typedef cCoordWithIntList cSandSimulatorChunkData;
|
typedef cCoordWithIntList cSandSimulatorChunkData;
|
||||||
|
|
||||||
#include "Chunk.h"
|
|
||||||
|
|
||||||
|
|
||||||
/// Despite the class name, this simulator takes care of all blocks that fall when suspended in the air.
|
|
||||||
|
|
||||||
|
/** Despite the class name, this simulator takes care of all blocks that fall when suspended in the air. */
|
||||||
class cSandSimulator :
|
class cSandSimulator :
|
||||||
public cSimulator
|
public cSimulator
|
||||||
{
|
{
|
||||||
@ -21,23 +33,22 @@ public:
|
|||||||
virtual void SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk) override;
|
virtual void SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk) override;
|
||||||
virtual bool IsAllowedBlock(BLOCKTYPE a_BlockType) override;
|
virtual bool IsAllowedBlock(BLOCKTYPE a_BlockType) override;
|
||||||
|
|
||||||
/// Returns true if a falling-able block can start falling through the specified block type
|
/** Returns true if a falling-able block can start falling through the specified block type */
|
||||||
static bool CanStartFallingThrough(BLOCKTYPE a_BlockType);
|
static bool CanStartFallingThrough(BLOCKTYPE a_BlockType);
|
||||||
|
|
||||||
/// Returns true if an already-falling block can pass through the specified block type (e. g. torch)
|
/** Returns true if an already-falling block can pass through the specified block type (e. g. torch) */
|
||||||
static bool CanContinueFallThrough(BLOCKTYPE a_BlockType);
|
static bool CanContinueFallThrough(BLOCKTYPE a_BlockType);
|
||||||
|
|
||||||
/// Returns true if the falling block rematerializing will replace the specified block type (e. g. tall grass)
|
/** Returns true if the falling block rematerializing will replace the specified block type (e. g. tall grass) */
|
||||||
static bool IsReplacedOnRematerialization(BLOCKTYPE a_BlockType);
|
static bool IsReplacedOnRematerialization(BLOCKTYPE a_BlockType);
|
||||||
|
|
||||||
/// Returns true if the specified block breaks falling blocks while they fall through it (e. g. halfslabs)
|
/** Returns true if the specified block breaks falling blocks while they fall through it (e. g. halfslabs) */
|
||||||
static bool DoesBreakFallingThrough(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
|
static bool DoesBreakFallingThrough(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
|
||||||
|
|
||||||
/** Called when a block finishes falling at the specified coords, either by insta-fall,
|
/** Called when a block finishes falling at the specified coords, either by insta-fall,
|
||||||
or through cFallingBlock entity.
|
or through cFallingBlock entity.
|
||||||
It either rematerializes the block (a_FallingBlockType) at the specified coords, or creates a pickup,
|
It either rematerializes the block (a_FallingBlockType) at the specified coords, or creates a pickup,
|
||||||
based on the block currently present in the world at the dest specified coords
|
based on the block currently present in the world at the dest specified coords. */
|
||||||
*/
|
|
||||||
static void FinishFalling(
|
static void FinishFalling(
|
||||||
cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ,
|
cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ,
|
||||||
BLOCKTYPE a_FallingBlockType, NIBBLETYPE a_FallingBlockMeta
|
BLOCKTYPE a_FallingBlockType, NIBBLETYPE a_FallingBlockMeta
|
||||||
@ -50,7 +61,7 @@ protected:
|
|||||||
|
|
||||||
virtual void AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk) override;
|
virtual void AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk) override;
|
||||||
|
|
||||||
/// Performs the instant fall of the block - removes it from top, Finishes it at the bottom
|
/** Performs the instant fall of the block - removes it from top, Finishes it at the bottom */
|
||||||
void DoInstantFall(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ);
|
void DoInstantFall(cChunk * a_Chunk, int a_RelX, int a_RelY, int a_RelZ);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -20,10 +20,10 @@ public:
|
|||||||
|
|
||||||
virtual ~cSimulator() {}
|
virtual ~cSimulator() {}
|
||||||
|
|
||||||
/// Called in each tick, a_Dt is the time passed since the last tick, in msec
|
/** Called in each tick, a_Dt is the time passed since the last tick, in msec */
|
||||||
virtual void Simulate(float a_Dt) = 0;
|
virtual void Simulate(float a_Dt) = 0;
|
||||||
|
|
||||||
/// Called in each tick for each chunk, a_Dt is the time passed since the last tick, in msec; direct access to chunk data available
|
/** Called in each tick for each chunk, a_Dt is the time passed since the last tick, in msec; direct access to chunk data available */
|
||||||
virtual void SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk)
|
virtual void SimulateChunk(std::chrono::milliseconds a_Dt, int a_ChunkX, int a_ChunkZ, cChunk * a_Chunk)
|
||||||
{
|
{
|
||||||
UNUSED(a_Dt);
|
UNUSED(a_Dt);
|
||||||
@ -32,7 +32,7 @@ public:
|
|||||||
UNUSED(a_Chunk);
|
UNUSED(a_Chunk);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Called when a block changes
|
/** Called when a block changes */
|
||||||
virtual void WakeUp(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk);
|
virtual void WakeUp(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk);
|
||||||
|
|
||||||
virtual bool IsAllowedBlock(BLOCKTYPE a_BlockType) = 0;
|
virtual bool IsAllowedBlock(BLOCKTYPE a_BlockType) = 0;
|
||||||
@ -40,7 +40,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
friend class cChunk; // Calls AddBlock() in its WakeUpSimulators() function, to speed things up
|
friend class cChunk; // Calls AddBlock() in its WakeUpSimulators() function, to speed things up
|
||||||
|
|
||||||
/// Called to simulate a new block
|
/** Called to simulate a new block */
|
||||||
virtual void AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk) = 0;
|
virtual void AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk) = 0;
|
||||||
|
|
||||||
cWorld & m_World;
|
cWorld & m_World;
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Compresses a_Data into a_Compressed; returns Z_XXX error constants same as zlib's compress2()
|
|
||||||
int CompressString(const char * a_Data, size_t a_Length, AString & a_Compressed, int a_Factor)
|
int CompressString(const char * a_Data, size_t a_Length, AString & a_Compressed, int a_Factor)
|
||||||
{
|
{
|
||||||
uLongf CompressedSize = compressBound(static_cast<uLong>(a_Length));
|
uLongf CompressedSize = compressBound(static_cast<uLong>(a_Length));
|
||||||
@ -32,7 +31,6 @@ int CompressString(const char * a_Data, size_t a_Length, AString & a_Compressed,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Uncompresses a_Data into a_Decompressed; returns Z_XXX error constants same as zlib's uncompress()
|
|
||||||
int UncompressString(const char * a_Data, size_t a_Length, AString & a_Uncompressed, size_t a_UncompressedSize)
|
int UncompressString(const char * a_Data, size_t a_Length, AString & a_Uncompressed, size_t a_UncompressedSize)
|
||||||
{
|
{
|
||||||
// HACK: We're assuming that AString returns its internal buffer in its data() call and we're overwriting that buffer!
|
// HACK: We're assuming that AString returns its internal buffer in its data() call and we're overwriting that buffer!
|
||||||
|
@ -9,16 +9,16 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Compresses a_Data into a_Compressed using ZLIB; returns Z_XXX error constants same as zlib's compress2()
|
/** Compresses a_Data into a_Compressed using ZLIB; returns Z_XXX error constants same as zlib's compress2() */
|
||||||
extern int CompressString(const char * a_Data, size_t a_Length, AString & a_Compressed, int a_Factor);
|
extern int CompressString(const char * a_Data, size_t a_Length, AString & a_Compressed, int a_Factor);
|
||||||
|
|
||||||
/// Uncompresses a_Data into a_Uncompressed; returns Z_XXX error constants same as zlib's decompress()
|
/** Uncompresses a_Data into a_Uncompressed; returns Z_XXX error constants same as zlib's decompress() */
|
||||||
extern int UncompressString(const char * a_Data, size_t a_Length, AString & a_Uncompressed, size_t a_UncompressedSize);
|
extern int UncompressString(const char * a_Data, size_t a_Length, AString & a_Uncompressed, size_t a_UncompressedSize);
|
||||||
|
|
||||||
/// Compresses a_Data into a_Compressed using GZIP; returns Z_OK for success or Z_XXX error constants same as zlib
|
/** Compresses a_Data into a_Compressed using GZIP; returns Z_OK for success or Z_XXX error constants same as zlib */
|
||||||
extern int CompressStringGZIP(const char * a_Data, size_t a_Length, AString & a_Compressed);
|
extern int CompressStringGZIP(const char * a_Data, size_t a_Length, AString & a_Compressed);
|
||||||
|
|
||||||
/// Uncompresses a_Data into a_Uncompressed using GZIP; returns Z_OK for success or Z_XXX error constants same as zlib
|
/** Uncompresses a_Data into a_Uncompressed using GZIP; returns Z_OK for success or Z_XXX error constants same as zlib */
|
||||||
extern int UncompressStringGZIP(const char * a_Data, size_t a_Length, AString & a_Uncompressed);
|
extern int UncompressStringGZIP(const char * a_Data, size_t a_Length, AString & a_Uncompressed);
|
||||||
|
|
||||||
/** Uncompresses a_Data into a_Uncompressed using Inflate; returns Z_OK for success or Z_XXX error constants same as zlib */
|
/** Uncompresses a_Data into a_Uncompressed using Inflate; returns Z_OK for success or Z_XXX error constants same as zlib */
|
||||||
|
@ -782,7 +782,7 @@ AString ReplaceAllCharOccurrences(const AString & a_String, char a_From, char a_
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// Converts one Hex character in a Base64 encoding into the data value
|
/** Converts one Hex character in a Base64 encoding into the data value */
|
||||||
static inline int UnBase64(char c)
|
static inline int UnBase64(char c)
|
||||||
{
|
{
|
||||||
if ((c >='A') && (c <= 'Z'))
|
if ((c >='A') && (c <= 'Z'))
|
||||||
|
@ -94,25 +94,25 @@ extern AString EscapeString(const AString & a_Message); // tolua_export
|
|||||||
/** Removes all control codes used by MC for colors and styles. */
|
/** Removes all control codes used by MC for colors and styles. */
|
||||||
extern AString StripColorCodes(const AString & a_Message); // tolua_export
|
extern AString StripColorCodes(const AString & a_Message); // tolua_export
|
||||||
|
|
||||||
/// URL-Decodes the given string, replacing all "%HH" into the correct characters. Invalid % sequences are left intact
|
/** URL-Decodes the given string, replacing all "%HH" into the correct characters. Invalid % sequences are left intact */
|
||||||
extern AString URLDecode(const AString & a_String); // Cannot export to Lua automatically - would generated an extra return value
|
extern AString URLDecode(const AString & a_String); // Cannot export to Lua automatically - would generated an extra return value
|
||||||
|
|
||||||
/// Replaces all occurrences of char a_From inside a_String with char a_To.
|
/** Replaces all occurrences of char a_From inside a_String with char a_To. */
|
||||||
extern AString ReplaceAllCharOccurrences(const AString & a_String, char a_From, char a_To); // Needn't export to Lua, since Lua doesn't have chars anyway
|
extern AString ReplaceAllCharOccurrences(const AString & a_String, char a_From, char a_To); // Needn't export to Lua, since Lua doesn't have chars anyway
|
||||||
|
|
||||||
/// Decodes a Base64-encoded string into the raw data
|
/** Decodes a Base64-encoded string into the raw data */
|
||||||
extern AString Base64Decode(const AString & a_Base64String); // Exported manually due to embedded NULs and extra parameter
|
extern AString Base64Decode(const AString & a_Base64String); // Exported manually due to embedded NULs and extra parameter
|
||||||
|
|
||||||
/// Encodes a string into Base64
|
/** Encodes a string into Base64 */
|
||||||
extern AString Base64Encode(const AString & a_Input); // Exported manually due to embedded NULs and extra parameter
|
extern AString Base64Encode(const AString & a_Input); // Exported manually due to embedded NULs and extra parameter
|
||||||
|
|
||||||
/// Reads two bytes from the specified memory location and interprets them as BigEndian short
|
/** Reads two bytes from the specified memory location and interprets them as BigEndian short */
|
||||||
extern short GetBEShort(const char * a_Mem);
|
extern short GetBEShort(const char * a_Mem);
|
||||||
|
|
||||||
/// Reads four bytes from the specified memory location and interprets them as BigEndian int
|
/** Reads four bytes from the specified memory location and interprets them as BigEndian int */
|
||||||
extern int GetBEInt(const char * a_Mem);
|
extern int GetBEInt(const char * a_Mem);
|
||||||
|
|
||||||
/// Writes four bytes to the specified memory location so that they interpret as BigEndian int
|
/** Writes four bytes to the specified memory location so that they interpret as BigEndian int */
|
||||||
extern void SetBEInt(char * a_Mem, Int32 a_Value);
|
extern void SetBEInt(char * a_Mem, Int32 a_Value);
|
||||||
|
|
||||||
/** Splits a string that has embedded \0 characters, on those characters.
|
/** Splits a string that has embedded \0 characters, on those characters.
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user