Merge branch 'master' into GeneratingBenchmark2
Conflicts: src/Blocks/BlockTorch.h
This commit is contained in:
commit
0b0aa5554f
@ -23,6 +23,7 @@ Sxw1212
|
|||||||
Taugeshtu
|
Taugeshtu
|
||||||
tigerw (Tiger Wang)
|
tigerw (Tiger Wang)
|
||||||
tonibm19
|
tonibm19
|
||||||
|
UltraCoderRU
|
||||||
worktycho
|
worktycho
|
||||||
xoft
|
xoft
|
||||||
|
|
||||||
|
23
MCServer/Plugins/APIDump/Hooks/OnPlayerDestroyed.lua
Normal file
23
MCServer/Plugins/APIDump/Hooks/OnPlayerDestroyed.lua
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
return
|
||||||
|
{
|
||||||
|
HOOK_PLAYER_DESTROYED =
|
||||||
|
{
|
||||||
|
CalledWhen = "A player is about to get destroyed.",
|
||||||
|
DefaultFnName = "OnPlayerDestroyed", -- also used as pagename
|
||||||
|
Desc = [[
|
||||||
|
This function is called when a {{cPlayer|player}} is about to get destroyed. But the player isn't already destroyed.
|
||||||
|
]],
|
||||||
|
Params =
|
||||||
|
{
|
||||||
|
{ Name = "Player", Type = "{{cPlayer}}", Notes = "The destroyed player" },
|
||||||
|
},
|
||||||
|
Returns = [[
|
||||||
|
It's only for notification. Can't be returned.
|
||||||
|
]],
|
||||||
|
}, -- HOOK_PLAYER_DESTROYED
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -67,6 +67,7 @@ public:
|
|||||||
virtual bool OnPlayerAnimation (cPlayer & a_Player, int a_Animation) = 0;
|
virtual bool OnPlayerAnimation (cPlayer & a_Player, int a_Animation) = 0;
|
||||||
virtual bool OnPlayerBreakingBlock (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;
|
virtual bool OnPlayerBreakingBlock (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;
|
||||||
virtual bool OnPlayerBrokenBlock (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;
|
virtual bool OnPlayerBrokenBlock (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;
|
||||||
|
virtual bool OnPlayerDestroyed (cPlayer & a_Player) = 0;
|
||||||
virtual bool OnPlayerEating (cPlayer & a_Player) = 0;
|
virtual bool OnPlayerEating (cPlayer & a_Player) = 0;
|
||||||
virtual bool OnPlayerFished (cPlayer & a_Player, const cItems & a_Reward) = 0;
|
virtual bool OnPlayerFished (cPlayer & a_Player, const cItems & a_Reward) = 0;
|
||||||
virtual bool OnPlayerFishing (cPlayer & a_Player, cItems & a_Reward) = 0;
|
virtual bool OnPlayerFishing (cPlayer & a_Player, cItems & a_Reward) = 0;
|
||||||
|
@ -641,6 +641,26 @@ bool cPluginLua::OnPlayerBrokenBlock(cPlayer & a_Player, int a_BlockX, int a_Blo
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cPluginLua::OnPlayerDestroyed(cPlayer & a_Player)
|
||||||
|
{
|
||||||
|
cCSLock Lock(m_CriticalSection);
|
||||||
|
bool res = false;
|
||||||
|
cLuaRefs & Refs = m_HookMap[cPluginManager::HOOK_PLAYER_DESTROYED];
|
||||||
|
for (cLuaRefs::iterator itr = Refs.begin(), end = Refs.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
m_LuaState.Call((int)(**itr), &a_Player, cLuaState::Return, res);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cPluginLua::OnPlayerEating(cPlayer & a_Player)
|
bool cPluginLua::OnPlayerEating(cPlayer & a_Player)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CriticalSection);
|
cCSLock Lock(m_CriticalSection);
|
||||||
|
@ -64,6 +64,7 @@ public:
|
|||||||
virtual bool OnPlayerAnimation (cPlayer & a_Player, int a_Animation) override;
|
virtual bool OnPlayerAnimation (cPlayer & a_Player, int a_Animation) override;
|
||||||
virtual bool OnPlayerBreakingBlock (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;
|
virtual bool OnPlayerBreakingBlock (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;
|
||||||
virtual bool OnPlayerBrokenBlock (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;
|
virtual bool OnPlayerBrokenBlock (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;
|
||||||
|
virtual bool OnPlayerDestroyed (cPlayer & a_Player) override;
|
||||||
virtual bool OnPlayerEating (cPlayer & a_Player) override;
|
virtual bool OnPlayerEating (cPlayer & a_Player) override;
|
||||||
virtual bool OnPlayerFished (cPlayer & a_Player, const cItems & a_Reward) override;
|
virtual bool OnPlayerFished (cPlayer & a_Player, const cItems & a_Reward) override;
|
||||||
virtual bool OnPlayerFishing (cPlayer & a_Player, cItems & a_Reward) override;
|
virtual bool OnPlayerFishing (cPlayer & a_Player, cItems & a_Reward) override;
|
||||||
|
@ -673,6 +673,27 @@ bool cPluginManager::CallHookPlayerBrokenBlock(cPlayer & a_Player, int a_BlockX,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cPluginManager::CallHookPlayerDestroyed(cPlayer & a_Player)
|
||||||
|
{
|
||||||
|
HookMap::iterator Plugins = m_Hooks.find(HOOK_PLAYER_DESTROYED);
|
||||||
|
if (Plugins == m_Hooks.end())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (PluginList::iterator itr = Plugins->second.begin(); itr != Plugins->second.end(); ++itr)
|
||||||
|
{
|
||||||
|
if ((*itr)->OnPlayerDestroyed(a_Player))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cPluginManager::CallHookPlayerEating(cPlayer & a_Player)
|
bool cPluginManager::CallHookPlayerEating(cPlayer & a_Player)
|
||||||
{
|
{
|
||||||
HookMap::iterator Plugins = m_Hooks.find(HOOK_PLAYER_EATING);
|
HookMap::iterator Plugins = m_Hooks.find(HOOK_PLAYER_EATING);
|
||||||
|
@ -79,6 +79,7 @@ public: // tolua_export
|
|||||||
HOOK_LOGIN,
|
HOOK_LOGIN,
|
||||||
HOOK_PLAYER_BREAKING_BLOCK,
|
HOOK_PLAYER_BREAKING_BLOCK,
|
||||||
HOOK_PLAYER_BROKEN_BLOCK,
|
HOOK_PLAYER_BROKEN_BLOCK,
|
||||||
|
HOOK_PLAYER_DESTROYED,
|
||||||
HOOK_PLAYER_EATING,
|
HOOK_PLAYER_EATING,
|
||||||
HOOK_PLAYER_FISHED,
|
HOOK_PLAYER_FISHED,
|
||||||
HOOK_PLAYER_FISHING,
|
HOOK_PLAYER_FISHING,
|
||||||
@ -174,6 +175,7 @@ public: // tolua_export
|
|||||||
bool CallHookPlayerAnimation (cPlayer & a_Player, int a_Animation);
|
bool CallHookPlayerAnimation (cPlayer & a_Player, int a_Animation);
|
||||||
bool CallHookPlayerBreakingBlock (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
|
bool CallHookPlayerBreakingBlock (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
|
||||||
bool CallHookPlayerBrokenBlock (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
|
bool CallHookPlayerBrokenBlock (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
|
||||||
|
bool CallHookPlayerDestroyed (cPlayer & a_Player);
|
||||||
bool CallHookPlayerEating (cPlayer & a_Player);
|
bool CallHookPlayerEating (cPlayer & a_Player);
|
||||||
bool CallHookPlayerFished (cPlayer & a_Player, const cItems a_Reward);
|
bool CallHookPlayerFished (cPlayer & a_Player, const cItems a_Reward);
|
||||||
bool CallHookPlayerFishing (cPlayer & a_Player, cItems a_Reward);
|
bool CallHookPlayerFishing (cPlayer & a_Player, cItems a_Reward);
|
||||||
|
@ -38,9 +38,10 @@ public:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Not top or bottom faces, try to preserve whatever face was clicked
|
// Not top or bottom faces, try to preserve whatever face was clicked
|
||||||
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, true);
|
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, true); // Set to clicked block
|
||||||
if (!CanBePlacedOn(a_ChunkInterface.GetBlock(a_BlockX, a_BlockY, a_BlockZ), a_BlockFace))
|
if (!CanBePlacedOn(a_ChunkInterface.GetBlock(a_BlockX, a_BlockY, a_BlockZ), a_BlockFace))
|
||||||
{
|
{
|
||||||
|
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, false); // Reset to torch block
|
||||||
// Torch couldn't be placed on whatever face was clicked, last ditch resort - find another face
|
// Torch couldn't be placed on whatever face was clicked, last ditch resort - find another face
|
||||||
a_BlockFace = FindSuitableFace(a_ChunkInterface, a_BlockX, a_BlockY, a_BlockZ);
|
a_BlockFace = FindSuitableFace(a_ChunkInterface, a_BlockX, a_BlockY, a_BlockZ);
|
||||||
if (a_BlockFace == BLOCK_FACE_NONE)
|
if (a_BlockFace == BLOCK_FACE_NONE)
|
||||||
|
@ -130,6 +130,8 @@ cPlayer::cPlayer(cClientHandle* a_Client, const AString & a_PlayerName)
|
|||||||
|
|
||||||
cPlayer::~cPlayer(void)
|
cPlayer::~cPlayer(void)
|
||||||
{
|
{
|
||||||
|
cRoot::Get()->GetPluginManager()->CallHookPlayerDestroyed(*this);
|
||||||
|
|
||||||
LOGD("Deleting cPlayer \"%s\" at %p, ID %d", m_PlayerName.c_str(), this, GetUniqueID());
|
LOGD("Deleting cPlayer \"%s\" at %p, ID %d", m_PlayerName.c_str(), this, GetUniqueID());
|
||||||
|
|
||||||
// Notify the server that the player is being destroyed
|
// Notify the server that the player is being destroyed
|
||||||
|
@ -276,7 +276,7 @@ void cMonster::Tick(float a_Dt, cChunk & a_Chunk)
|
|||||||
{
|
{
|
||||||
Distance.y = 0;
|
Distance.y = 0;
|
||||||
Distance.Normalize();
|
Distance.Normalize();
|
||||||
Distance *= 3;
|
Distance *= 5;
|
||||||
SetSpeedX(Distance.x);
|
SetSpeedX(Distance.x);
|
||||||
SetSpeedZ(Distance.z);
|
SetSpeedZ(Distance.z);
|
||||||
|
|
||||||
|
@ -204,6 +204,7 @@ void cWolf::TickFollowPlayer()
|
|||||||
{
|
{
|
||||||
if (!IsSitting())
|
if (!IsSitting())
|
||||||
{
|
{
|
||||||
|
Callback.OwnerPos.y = FindFirstNonAirBlockPosition(Callback.OwnerPos.x, Callback.OwnerPos.z);
|
||||||
TeleportToCoords(Callback.OwnerPos.x, Callback.OwnerPos.y, Callback.OwnerPos.z);
|
TeleportToCoords(Callback.OwnerPos.x, Callback.OwnerPos.y, Callback.OwnerPos.z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -455,7 +455,9 @@ void cNBTChunkSerializer::AddMonsterEntity(cMonster * a_Monster)
|
|||||||
case cMonster::mtWolf:
|
case cMonster::mtWolf:
|
||||||
{
|
{
|
||||||
m_Writer.AddString("Owner", ((const cWolf *)a_Monster)->GetOwner());
|
m_Writer.AddString("Owner", ((const cWolf *)a_Monster)->GetOwner());
|
||||||
m_Writer.AddByte("Sitting", ((const cWolf *)a_Monster)->IsSitting());
|
m_Writer.AddByte("Sitting", (((const cWolf *)a_Monster)->IsSitting() ? 1 : 0));
|
||||||
|
m_Writer.AddByte("Angry", (((const cWolf *)a_Monster)->IsAngry() ? 1 : 0));
|
||||||
|
m_Writer.AddInt("CollarColor", ((const cWolf *)a_Monster)->GetCollarColor());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case cMonster::mtZombie:
|
case cMonster::mtZombie:
|
||||||
|
@ -1886,6 +1886,24 @@ void cWSSAnvil::LoadWolfFromNBT(cEntityList & a_Entities, const cParsedNBT & a_N
|
|||||||
Monster->SetIsTame(true);
|
Monster->SetIsTame(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
int SittingIdx = a_NBT.FindChildByName(a_TagIdx, "Sitting");
|
||||||
|
if (SittingIdx > 0)
|
||||||
|
{
|
||||||
|
bool Sitting = ((a_NBT.GetByte(SittingIdx) == 1) ? true : false);
|
||||||
|
Monster->SetIsSitting(Sitting);
|
||||||
|
}
|
||||||
|
int AngryIdx = a_NBT.FindChildByName(a_TagIdx, "Angry");
|
||||||
|
if (AngryIdx > 0)
|
||||||
|
{
|
||||||
|
bool Angry = ((a_NBT.GetByte(AngryIdx) == 1) ? true : false);
|
||||||
|
Monster->SetIsAngry(Angry);
|
||||||
|
}
|
||||||
|
int CollarColorIdx = a_NBT.FindChildByName(a_TagIdx, "CollarColor");
|
||||||
|
if (CollarColorIdx > 0)
|
||||||
|
{
|
||||||
|
int CollarColor = a_NBT.GetInt(CollarColorIdx);
|
||||||
|
Monster->SetCollarColor(CollarColor);
|
||||||
|
}
|
||||||
a_Entities.push_back(Monster.release());
|
a_Entities.push_back(Monster.release());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user