Add HOOK_BLOCK_SPREAD
This commit is contained in:
parent
7089c5e267
commit
c4a8336e84
@ -46,6 +46,7 @@ public:
|
||||
* On all these functions, return true if you want to override default behavior and not call other plugins on that callback.
|
||||
* You can also return false, so default behavior is used.
|
||||
**/
|
||||
virtual bool OnBlockSpread (cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ) = 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 OnChunkAvailable (cWorld * a_World, int a_ChunkX, int a_ChunkZ) = 0;
|
||||
|
@ -195,6 +195,26 @@ void cPluginLua::Tick(float a_Dt)
|
||||
|
||||
|
||||
|
||||
bool cPluginLua::OnBlockSpread(cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
{
|
||||
cCSLock Lock(m_CriticalSection);
|
||||
bool res = false;
|
||||
cLuaRefs & Refs = m_HookMap[cPluginManager::HOOK_BLOCK_SPREAD];
|
||||
for (cLuaRefs::iterator itr = Refs.begin(), end = Refs.end(); itr != end; ++itr)
|
||||
{
|
||||
m_LuaState.Call((int)(**itr), a_World, a_BlockX, a_BlockY, a_BlockZ, cLuaState::Return, res);
|
||||
if (res)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
bool cPluginLua::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)
|
||||
{
|
||||
cCSLock Lock(m_CriticalSection);
|
||||
@ -1430,6 +1450,7 @@ const char * cPluginLua::GetHookFnName(int a_HookType)
|
||||
{
|
||||
switch (a_HookType)
|
||||
{
|
||||
case cPluginManager::HOOK_BLOCK_SPREAD: return "OnBlockSpread";
|
||||
case cPluginManager::HOOK_BLOCK_TO_PICKUPS: return "OnBlockToPickups";
|
||||
case cPluginManager::HOOK_CHAT: return "OnChat";
|
||||
case cPluginManager::HOOK_CHUNK_AVAILABLE: return "OnChunkAvailable";
|
||||
|
@ -69,6 +69,7 @@ public:
|
||||
|
||||
virtual void Tick(float a_Dt) override;
|
||||
|
||||
virtual bool OnBlockSpread (cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
||||
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) override;
|
||||
virtual bool OnChat (cPlayer * a_Player, AString & a_Message) override;
|
||||
virtual bool OnChunkAvailable (cWorld * a_World, int a_ChunkX, int a_ChunkZ) override;
|
||||
|
@ -205,6 +205,27 @@ void cPluginManager::Tick(float a_Dt)
|
||||
|
||||
|
||||
|
||||
bool cPluginManager::CallHookBlockSpread(cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
{
|
||||
HookMap::iterator Plugins = m_Hooks.find(HOOK_BLOCK_SPREAD);
|
||||
if (Plugins == m_Hooks.end())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
for (PluginList::iterator itr = Plugins->second.begin(); itr != Plugins->second.end(); ++itr)
|
||||
{
|
||||
if ((*itr)->OnBlockSpread(a_World, a_BlockX, a_BlockY, a_BlockZ))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
bool cPluginManager::CallHookBlockToPickups(
|
||||
cWorld * a_World, cEntity * a_Digger,
|
||||
int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,
|
||||
|
@ -58,6 +58,7 @@ public: // tolua_export
|
||||
// tolua_begin
|
||||
enum PluginHook
|
||||
{
|
||||
HOOK_BLOCK_SPREAD,
|
||||
HOOK_BLOCK_TO_PICKUPS,
|
||||
HOOK_CHAT,
|
||||
HOOK_CHUNK_AVAILABLE,
|
||||
@ -154,6 +155,7 @@ public: // tolua_export
|
||||
unsigned int GetNumPlugins() const; // tolua_export
|
||||
|
||||
// Calls for individual hooks. Each returns false if the action is to continue or true if the plugin wants to abort
|
||||
bool CallHookBlockSpread (cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||
bool CallHookBlockToPickups (cWorld * a_World, cEntity * a_Digger, int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, cItems & a_Pickups);
|
||||
bool CallHookChat (cPlayer * a_Player, AString & a_Message);
|
||||
bool CallHookChunkAvailable (cWorld * a_World, int a_ChunkX, int a_ChunkZ);
|
||||
|
@ -6,6 +6,8 @@
|
||||
#include "../BlockID.h"
|
||||
#include "../Defines.h"
|
||||
#include "../Chunk.h"
|
||||
#include "Root.h"
|
||||
#include "PluginManager.h"
|
||||
|
||||
|
||||
|
||||
@ -315,9 +317,15 @@ void cFireSimulator::TrySpreadFire(cChunk * a_Chunk, int a_RelX, int a_RelY, int
|
||||
*/
|
||||
if (CanStartFireInBlock(a_Chunk, x, y, z))
|
||||
{
|
||||
FLOG("FS: Starting new fire at {%d, %d, %d}.",
|
||||
x + a_Chunk->GetPosX() * cChunkDef::Width, y, z + a_Chunk->GetPosZ() * cChunkDef::Width
|
||||
);
|
||||
int a_PosX = x + a_Chunk->GetPosX() * cChunkDef::Width;
|
||||
int a_PosZ = z + a_Chunk->GetPosZ() * cChunkDef::Width;
|
||||
|
||||
if (cRoot::Get()->GetPluginManager()->CallHookBlockSpread(&m_World, a_PosX, y, a_PosZ))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
FLOG("FS: Starting new fire at {%d, %d, %d}.", a_PosX, y, a_PosZ);
|
||||
a_Chunk->UnboundedRelSetBlock(x, y, z, E_BLOCK_FIRE, 0);
|
||||
}
|
||||
} // for y
|
||||
|
Loading…
Reference in New Issue
Block a user