Merge pull request #1790 from joshi07/master
Added OnTeleportEntity hook for plugins.
This commit is contained in:
commit
78120db487
@ -23,6 +23,7 @@ function Initialize(Plugin)
|
|||||||
cPluginManager.AddHook(cPluginManager.HOOK_COLLECTING_PICKUP, OnCollectingPickup);
|
cPluginManager.AddHook(cPluginManager.HOOK_COLLECTING_PICKUP, OnCollectingPickup);
|
||||||
cPluginManager.AddHook(cPluginManager.HOOK_CRAFTING_NO_RECIPE, OnCraftingNoRecipe);
|
cPluginManager.AddHook(cPluginManager.HOOK_CRAFTING_NO_RECIPE, OnCraftingNoRecipe);
|
||||||
cPluginManager.AddHook(cPluginManager.HOOK_DISCONNECT, OnDisconnect);
|
cPluginManager.AddHook(cPluginManager.HOOK_DISCONNECT, OnDisconnect);
|
||||||
|
cPluginManager.AddHook(cPluginManager.HOOK_ENTITY_TELEPORT, OnEntityTeleport);
|
||||||
cPluginManager.AddHook(cPluginManager.HOOK_EXECUTE_COMMAND, OnExecuteCommand);
|
cPluginManager.AddHook(cPluginManager.HOOK_EXECUTE_COMMAND, OnExecuteCommand);
|
||||||
cPluginManager.AddHook(cPluginManager.HOOK_HANDSHAKE, OnHandshake);
|
cPluginManager.AddHook(cPluginManager.HOOK_HANDSHAKE, OnHandshake);
|
||||||
cPluginManager.AddHook(cPluginManager.HOOK_KILLING, OnKilling);
|
cPluginManager.AddHook(cPluginManager.HOOK_KILLING, OnKilling);
|
||||||
@ -179,6 +180,22 @@ end
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function OnEntityTeleport(arg1,arg2,arg3)
|
||||||
|
if arg1.IsPlayer() then
|
||||||
|
-- if it's a player, get his name
|
||||||
|
LOG("OnEntityTeleport: Player: " .. arg1.GetName());
|
||||||
|
else
|
||||||
|
-- if it's a entity, get its type
|
||||||
|
LOG("OnEntityTeleport: EntityType: " .. arg1.GetEntityType());
|
||||||
|
end
|
||||||
|
LOG("OldPos: " .. arg2.x .. " / " .. arg2.y .. " / " .. arg2.z);
|
||||||
|
LOG("NewPos: " .. arg3.x .. " / " .. arg3.y .. " / " .. arg3.z);
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function OnExecuteCommand(...)
|
function OnExecuteCommand(...)
|
||||||
LogHook("OnExecuteCommand", unpack(arg));
|
LogHook("OnExecuteCommand", unpack(arg));
|
||||||
|
|
||||||
|
@ -57,6 +57,7 @@ public:
|
|||||||
virtual bool OnCraftingNoRecipe (cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe) = 0;
|
virtual bool OnCraftingNoRecipe (cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe) = 0;
|
||||||
virtual bool OnDisconnect (cClientHandle & a_Client, const AString & a_Reason) = 0;
|
virtual bool OnDisconnect (cClientHandle & a_Client, const AString & a_Reason) = 0;
|
||||||
virtual bool OnEntityAddEffect (cEntity & a_Entity, int a_EffectType, int a_EffectDurationTicks, int a_EffectIntensity, double a_DistanceModifier) = 0;
|
virtual bool OnEntityAddEffect (cEntity & a_Entity, int a_EffectType, int a_EffectDurationTicks, int a_EffectIntensity, double a_DistanceModifier) = 0;
|
||||||
|
virtual bool OnEntityTeleport (cEntity & a_Entity, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition) = 0;
|
||||||
virtual bool OnExecuteCommand (cPlayer * a_Player, const AStringVector & a_Split) = 0;
|
virtual bool OnExecuteCommand (cPlayer * a_Player, const AStringVector & a_Split) = 0;
|
||||||
virtual bool OnExploded (cWorld & a_World, double a_ExplosionSize, bool a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData) = 0;
|
virtual bool OnExploded (cWorld & a_World, double a_ExplosionSize, bool a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData) = 0;
|
||||||
virtual bool OnExploding (cWorld & a_World, double & a_ExplosionSize, bool & a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData) = 0;
|
virtual bool OnExploding (cWorld & a_World, double & a_ExplosionSize, bool & a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData) = 0;
|
||||||
|
@ -857,6 +857,26 @@ bool cPluginLua::OnPlayerMoving(cPlayer & a_Player, const Vector3d & a_OldPositi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cPluginLua::OnEntityTeleport(cEntity & a_Entity, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition)
|
||||||
|
{
|
||||||
|
cCSLock Lock(m_CriticalSection);
|
||||||
|
bool res = false;
|
||||||
|
cLuaRefs & Refs = m_HookMap[cPluginManager::HOOK_ENTITY_TELEPORT];
|
||||||
|
for (cLuaRefs::iterator itr = Refs.begin(), end = Refs.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
m_LuaState.Call((int)(**itr), &a_Entity, a_OldPosition, a_NewPosition, cLuaState::Return, res);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cPluginLua::OnPlayerPlacedBlock(cPlayer & a_Player, const sSetBlock & a_BlockChange)
|
bool cPluginLua::OnPlayerPlacedBlock(cPlayer & a_Player, const sSetBlock & a_BlockChange)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CriticalSection);
|
cCSLock Lock(m_CriticalSection);
|
||||||
@ -1577,6 +1597,7 @@ const char * cPluginLua::GetHookFnName(int a_HookType)
|
|||||||
case cPluginManager::HOOK_DISCONNECT: return "OnDisconnect";
|
case cPluginManager::HOOK_DISCONNECT: return "OnDisconnect";
|
||||||
case cPluginManager::HOOK_PLAYER_ANIMATION: return "OnPlayerAnimation";
|
case cPluginManager::HOOK_PLAYER_ANIMATION: return "OnPlayerAnimation";
|
||||||
case cPluginManager::HOOK_ENTITY_ADD_EFFECT: return "OnEntityAddEffect";
|
case cPluginManager::HOOK_ENTITY_ADD_EFFECT: return "OnEntityAddEffect";
|
||||||
|
case cPluginManager::HOOK_ENTITY_TELEPORT: return "OnEntityTeleport";
|
||||||
case cPluginManager::HOOK_EXECUTE_COMMAND: return "OnExecuteCommand";
|
case cPluginManager::HOOK_EXECUTE_COMMAND: return "OnExecuteCommand";
|
||||||
case cPluginManager::HOOK_HANDSHAKE: return "OnHandshake";
|
case cPluginManager::HOOK_HANDSHAKE: return "OnHandshake";
|
||||||
case cPluginManager::HOOK_KILLING: return "OnKilling";
|
case cPluginManager::HOOK_KILLING: return "OnKilling";
|
||||||
|
@ -106,6 +106,7 @@ public:
|
|||||||
virtual bool OnPlayerRightClickingEntity(cPlayer & a_Player, cEntity & a_Entity) override;
|
virtual bool OnPlayerRightClickingEntity(cPlayer & a_Player, cEntity & a_Entity) override;
|
||||||
virtual bool OnPlayerShooting (cPlayer & a_Player) override;
|
virtual bool OnPlayerShooting (cPlayer & a_Player) override;
|
||||||
virtual bool OnPlayerSpawned (cPlayer & a_Player) override;
|
virtual bool OnPlayerSpawned (cPlayer & a_Player) override;
|
||||||
|
virtual bool OnEntityTeleport (cEntity & a_Entity, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition) override;
|
||||||
virtual bool OnPlayerTossingItem (cPlayer & a_Player) override;
|
virtual bool OnPlayerTossingItem (cPlayer & a_Player) override;
|
||||||
virtual bool OnPlayerUsedBlock (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;
|
virtual bool OnPlayerUsedBlock (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;
|
||||||
virtual bool OnPlayerUsedItem (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) override;
|
virtual bool OnPlayerUsedItem (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) override;
|
||||||
|
@ -505,6 +505,24 @@ bool cPluginManager::CallHookEntityAddEffect(cEntity & a_Entity, int a_EffectTyp
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cPluginManager::CallHookEntityTeleport(cEntity & a_Entity, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition)
|
||||||
|
{
|
||||||
|
FIND_HOOK(HOOK_ENTITY_TELEPORT);
|
||||||
|
VERIFY_HOOK;
|
||||||
|
|
||||||
|
for (PluginList::iterator itr = Plugins->second.begin(); itr != Plugins->second.end(); ++itr)
|
||||||
|
{
|
||||||
|
if ((*itr)->OnEntityTeleport(a_Entity, a_OldPosition, a_NewPosition))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cPluginManager::CallHookExecuteCommand(cPlayer * a_Player, const AStringVector & a_Split)
|
bool cPluginManager::CallHookExecuteCommand(cPlayer * a_Player, const AStringVector & a_Split)
|
||||||
{
|
{
|
||||||
FIND_HOOK(HOOK_EXECUTE_COMMAND);
|
FIND_HOOK(HOOK_EXECUTE_COMMAND);
|
||||||
|
@ -109,6 +109,7 @@ public:
|
|||||||
HOOK_PLAYER_RIGHT_CLICKING_ENTITY,
|
HOOK_PLAYER_RIGHT_CLICKING_ENTITY,
|
||||||
HOOK_PLAYER_SHOOTING,
|
HOOK_PLAYER_SHOOTING,
|
||||||
HOOK_PLAYER_SPAWNED,
|
HOOK_PLAYER_SPAWNED,
|
||||||
|
HOOK_ENTITY_TELEPORT,
|
||||||
HOOK_PLAYER_TOSSING_ITEM,
|
HOOK_PLAYER_TOSSING_ITEM,
|
||||||
HOOK_PLAYER_USED_BLOCK,
|
HOOK_PLAYER_USED_BLOCK,
|
||||||
HOOK_PLAYER_USED_ITEM,
|
HOOK_PLAYER_USED_ITEM,
|
||||||
@ -190,6 +191,7 @@ public:
|
|||||||
bool CallHookCraftingNoRecipe (cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe);
|
bool CallHookCraftingNoRecipe (cPlayer & a_Player, cCraftingGrid & a_Grid, cCraftingRecipe & a_Recipe);
|
||||||
bool CallHookDisconnect (cClientHandle & a_Client, const AString & a_Reason);
|
bool CallHookDisconnect (cClientHandle & a_Client, const AString & a_Reason);
|
||||||
bool CallHookEntityAddEffect (cEntity & a_Entity, int a_EffectType, int a_EffectDurationTicks, int a_EffectIntensity, double a_DistanceModifier);
|
bool CallHookEntityAddEffect (cEntity & a_Entity, int a_EffectType, int a_EffectDurationTicks, int a_EffectIntensity, double a_DistanceModifier);
|
||||||
|
bool CallHookEntityTeleport (cEntity & a_Entity, const Vector3d & a_OldPosition, const Vector3d & a_NewPosition);
|
||||||
bool CallHookExecuteCommand (cPlayer * a_Player, const AStringVector & a_Split); // If a_Player == nullptr, it is a console cmd
|
bool CallHookExecuteCommand (cPlayer * a_Player, const AStringVector & a_Split); // If a_Player == nullptr, it is a console cmd
|
||||||
bool CallHookExploded (cWorld & a_World, double a_ExplosionSize, bool a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData);
|
bool CallHookExploded (cWorld & a_World, double a_ExplosionSize, bool a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData);
|
||||||
bool CallHookExploding (cWorld & a_World, double & a_ExplosionSize, bool & a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData);
|
bool CallHookExploding (cWorld & a_World, double & a_ExplosionSize, bool & a_CanCauseFire, double a_X, double a_Y, double a_Z, eExplosionSource a_Source, void * a_SourceData);
|
||||||
|
@ -1632,8 +1632,12 @@ void cEntity::TeleportToEntity(cEntity & a_Entity)
|
|||||||
|
|
||||||
void cEntity::TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ)
|
void cEntity::TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ)
|
||||||
{
|
{
|
||||||
|
// ask the plugins to allow teleport to the new position.
|
||||||
|
if (!cRoot::Get()->GetPluginManager()->CallHookEntityTeleport(*this, m_LastPos, Vector3d(a_PosX, a_PosY, a_PosZ)))
|
||||||
|
{
|
||||||
SetPosition(a_PosX, a_PosY, a_PosZ);
|
SetPosition(a_PosX, a_PosY, a_PosZ);
|
||||||
m_World->BroadcastTeleportEntity(*this);
|
m_World->BroadcastTeleportEntity(*this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -232,7 +232,7 @@ void cPlayer::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool CanMove = true;
|
bool CanMove = true;
|
||||||
if (!GetPosition().EqualsEps(m_LastPos, 0.01)) // Non negligible change in position from last tick?
|
if (!GetPosition().EqualsEps(m_LastPos, 0.02)) // Non negligible change in position from last tick? 0.02 tp prevent continous calling while floating sometimes.
|
||||||
{
|
{
|
||||||
// Apply food exhaustion from movement:
|
// Apply food exhaustion from movement:
|
||||||
ApplyFoodExhaustionFromMovement();
|
ApplyFoodExhaustionFromMovement();
|
||||||
@ -396,6 +396,7 @@ int cPlayer::DeltaExperience(int a_Xp_delta)
|
|||||||
// Make sure they didn't subtract too much
|
// Make sure they didn't subtract too much
|
||||||
m_CurrentXp = std::max(m_CurrentXp, 0);
|
m_CurrentXp = std::max(m_CurrentXp, 0);
|
||||||
|
|
||||||
|
|
||||||
// Update total for score calculation
|
// Update total for score calculation
|
||||||
if (a_Xp_delta > 0)
|
if (a_Xp_delta > 0)
|
||||||
{
|
{
|
||||||
@ -1274,6 +1275,9 @@ unsigned int cPlayer::AwardAchievement(const eStatistic a_Ach)
|
|||||||
|
|
||||||
void cPlayer::TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ)
|
void cPlayer::TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ)
|
||||||
{
|
{
|
||||||
|
// ask plugins to allow teleport to the new position.
|
||||||
|
if (!cRoot::Get()->GetPluginManager()->CallHookEntityTeleport(*this, m_LastPos, Vector3d(a_PosX, a_PosY, a_PosZ)))
|
||||||
|
{
|
||||||
SetPosition(a_PosX, a_PosY, a_PosZ);
|
SetPosition(a_PosX, a_PosY, a_PosZ);
|
||||||
m_LastGroundHeight = static_cast<float>(a_PosY);
|
m_LastGroundHeight = static_cast<float>(a_PosY);
|
||||||
m_LastJumpHeight = static_cast<float>(a_PosY);
|
m_LastJumpHeight = static_cast<float>(a_PosY);
|
||||||
@ -1281,6 +1285,7 @@ void cPlayer::TeleportToCoords(double a_PosX, double a_PosY, double a_PosZ)
|
|||||||
|
|
||||||
m_World->BroadcastTeleportEntity(*this, GetClientHandle());
|
m_World->BroadcastTeleportEntity(*this, GetClientHandle());
|
||||||
m_ClientHandle->SendPlayerMoveLook();
|
m_ClientHandle->SendPlayerMoveLook();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user