Merge pull request #1398 from mc-server/1.8-Protocol
1.8 Protocol Update
This commit is contained in:
commit
5f823fd18d
@ -6,8 +6,9 @@ return
|
|||||||
DefaultFnName = "OnSpawningEntity", -- also used as pagename
|
DefaultFnName = "OnSpawningEntity", -- also used as pagename
|
||||||
Desc = [[
|
Desc = [[
|
||||||
This hook is called before the server spawns an {{cEntity|entity}}. The plugin can either modify the
|
This hook is called before the server spawns an {{cEntity|entity}}. The plugin can either modify the
|
||||||
entity before it is spawned, or disable the spawning altogether. If the entity spawning is a
|
entity before it is spawned, or disable the spawning altogether. You can't disable the spawning if the
|
||||||
monster, the {{OnSpawningMonster|HOOK_SPAWNING_MONSTER}} hook is called before this hook.</p>
|
entity is a player. If the entity spawning is a monster, the {{OnSpawningMonster|HOOK_SPAWNING_MONSTER}}
|
||||||
|
hook is called before this hook.</p>
|
||||||
<p>
|
<p>
|
||||||
See also the {{OnSpawnedEntity|HOOK_SPAWNED_ENTITY}} hook for a similar hook called after the
|
See also the {{OnSpawnedEntity|HOOK_SPAWNED_ENTITY}} hook for a similar hook called after the
|
||||||
entity is spawned.
|
entity is spawned.
|
||||||
|
@ -267,7 +267,7 @@ size_t cByteBuffer::GetReadableSpace(void) const
|
|||||||
}
|
}
|
||||||
// Single readable space partition:
|
// Single readable space partition:
|
||||||
ASSERT(m_WritePos >= m_ReadPos);
|
ASSERT(m_WritePos >= m_ReadPos);
|
||||||
return m_WritePos - m_ReadPos ;
|
return m_WritePos - m_ReadPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -489,6 +489,27 @@ bool cByteBuffer::ReadLEInt(int & a_Value)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::ReadPosition(int & a_BlockX, int & a_BlockY, int & a_BlockZ)
|
||||||
|
{
|
||||||
|
Int64 Value;
|
||||||
|
if (!ReadBEInt64(Value))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
UInt32 BlockXRaw = (Value >> 38) & 0x3ffffff;
|
||||||
|
UInt32 BlockYRaw = (Value >> 26) & 0xfff;
|
||||||
|
UInt32 BlockZRaw = (Value & 0x3ffffff);
|
||||||
|
a_BlockX = ((BlockXRaw & 0x2000000) == 0) ? BlockXRaw : (~(BlockXRaw & 0x1ffffff)) + 1;
|
||||||
|
a_BlockY = ((BlockYRaw & 0x800) == 0) ? BlockYRaw : (~(BlockXRaw & 0x7ff)) + 1;
|
||||||
|
a_BlockZ = ((BlockZRaw & 0x2000000) == 0) ? BlockZRaw : (~(BlockZRaw & 0x1ffffff)) + 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cByteBuffer::WriteChar(char a_Value)
|
bool cByteBuffer::WriteChar(char a_Value)
|
||||||
{
|
{
|
||||||
CHECK_THREAD;
|
CHECK_THREAD;
|
||||||
@ -661,6 +682,15 @@ bool cByteBuffer::WriteLEInt(int a_Value)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cByteBuffer::WritePosition(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||||
|
{
|
||||||
|
return WriteBEInt64(((Int64)a_BlockX & 0x3FFFFFF) << 38 | ((Int64)a_BlockY & 0xFFF) << 26 | ((Int64)a_BlockZ & 0x3FFFFFF));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cByteBuffer::ReadBuf(void * a_Buffer, size_t a_Count)
|
bool cByteBuffer::ReadBuf(void * a_Buffer, size_t a_Count)
|
||||||
{
|
{
|
||||||
CHECK_THREAD;
|
CHECK_THREAD;
|
||||||
|
@ -64,6 +64,7 @@ public:
|
|||||||
bool ReadVarInt (UInt32 & a_Value);
|
bool ReadVarInt (UInt32 & a_Value);
|
||||||
bool ReadVarUTF8String (AString & a_Value); // string length as VarInt, then string as UTF-8
|
bool ReadVarUTF8String (AString & a_Value); // string length as VarInt, then string as UTF-8
|
||||||
bool ReadLEInt (int & a_Value);
|
bool ReadLEInt (int & a_Value);
|
||||||
|
bool ReadPosition (int & a_BlockX, int & a_BlockY, int & a_BlockZ);
|
||||||
|
|
||||||
/** Reads VarInt, assigns it to anything that can be assigned from an UInt32 (unsigned short, char, Byte, double, ...) */
|
/** Reads VarInt, assigns it to anything that can be assigned from an UInt32 (unsigned short, char, Byte, double, ...) */
|
||||||
template <typename T> bool ReadVarInt(T & a_Value)
|
template <typename T> bool ReadVarInt(T & a_Value)
|
||||||
@ -90,6 +91,7 @@ public:
|
|||||||
bool WriteVarInt (UInt32 a_Value);
|
bool WriteVarInt (UInt32 a_Value);
|
||||||
bool WriteVarUTF8String (const AString & a_Value); // string length as VarInt, then string as UTF-8
|
bool WriteVarUTF8String (const AString & a_Value); // string length as VarInt, then string as UTF-8
|
||||||
bool WriteLEInt (int a_Value);
|
bool WriteLEInt (int a_Value);
|
||||||
|
bool WritePosition (int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||||
|
|
||||||
/** Reads a_Count bytes into a_Buffer; returns true if successful */
|
/** Reads a_Count bytes into a_Buffer; returns true if successful */
|
||||||
bool ReadBuf(void * a_Buffer, size_t a_Count);
|
bool ReadBuf(void * a_Buffer, size_t a_Count);
|
||||||
|
@ -3043,7 +3043,7 @@ void cChunk::BroadcastEntityAnimation(const cEntity & a_Entity, char a_Animation
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cChunk::BroadcastParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount, cClientHandle * a_Exclude)
|
void cChunk::BroadcastParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount, cClientHandle * a_Exclude)
|
||||||
{
|
{
|
||||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||||
{
|
{
|
||||||
@ -3051,7 +3051,7 @@ void cChunk::BroadcastParticleEffect(const AString & a_ParticleName, float a_Src
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
(*itr)->SendParticleEffect(a_ParticleName, a_SrcX, a_SrcY, a_SrcZ, a_OffsetX, a_OffsetY, a_OffsetZ, a_ParticleData, a_ParticleAmmount);
|
(*itr)->SendParticleEffect(a_ParticleName, a_SrcX, a_SrcY, a_SrcZ, a_OffsetX, a_OffsetY, a_OffsetZ, a_ParticleData, a_ParticleAmount);
|
||||||
} // for itr - LoadedByClient[]
|
} // for itr - LoadedByClient[]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,7 +326,7 @@ public:
|
|||||||
void BroadcastEntityStatus (const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityStatus (const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastEntityVelocity (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityVelocity (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastEntityAnimation (const cEntity & a_Entity, char a_Animation, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityAnimation (const cEntity & a_Entity, char a_Animation, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount, cClientHandle * a_Exclude = NULL);
|
void BroadcastParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount, cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID, const cClientHandle * a_Exclude = NULL);
|
void BroadcastRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch, const cClientHandle * a_Exclude = NULL);
|
void BroadcastSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data, const cClientHandle * a_Exclude = NULL);
|
void BroadcastSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data, const cClientHandle * a_Exclude = NULL);
|
||||||
|
@ -617,7 +617,7 @@ void cChunkMap::BroadcastEntityAnimation(const cEntity & a_Entity, char a_Animat
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cChunkMap::BroadcastParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount, cClientHandle * a_Exclude)
|
void cChunkMap::BroadcastParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount, cClientHandle * a_Exclude)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CSLayers);
|
cCSLock Lock(m_CSLayers);
|
||||||
int ChunkX, ChunkZ;
|
int ChunkX, ChunkZ;
|
||||||
@ -629,7 +629,7 @@ void cChunkMap::BroadcastParticleEffect(const AString & a_ParticleName, float a_
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// It's perfectly legal to broadcast packets even to invalid chunks!
|
// It's perfectly legal to broadcast packets even to invalid chunks!
|
||||||
Chunk->BroadcastParticleEffect(a_ParticleName, a_SrcX, a_SrcY, a_SrcZ, a_OffsetX, a_OffsetY, a_OffsetZ, a_ParticleData, a_ParticleAmmount, a_Exclude);
|
Chunk->BroadcastParticleEffect(a_ParticleName, a_SrcX, a_SrcY, a_SrcZ, a_OffsetX, a_OffsetY, a_OffsetZ, a_ParticleData, a_ParticleAmount, a_Exclude);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ public:
|
|||||||
void BroadcastEntityStatus(const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityStatus(const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastEntityVelocity(const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityVelocity(const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastEntityAnimation(const cEntity & a_Entity, char a_Animation, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityAnimation(const cEntity & a_Entity, char a_Animation, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount, cClientHandle * a_Exclude = NULL);
|
void BroadcastParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount, cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID, const cClientHandle * a_Exclude = NULL);
|
void BroadcastRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastSoundEffect(const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch, const cClientHandle * a_Exclude = NULL);
|
void BroadcastSoundEffect(const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data, const cClientHandle * a_Exclude = NULL);
|
void BroadcastSoundParticleEffect(int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data, const cClientHandle * a_Exclude = NULL);
|
||||||
|
@ -127,7 +127,7 @@ cClientHandle::~cClientHandle()
|
|||||||
if (!m_Username.empty() && (World != NULL))
|
if (!m_Username.empty() && (World != NULL))
|
||||||
{
|
{
|
||||||
// Send the Offline PlayerList packet:
|
// Send the Offline PlayerList packet:
|
||||||
World->BroadcastPlayerListItem(*m_Player, false, this);
|
World->BroadcastPlayerListRemovePlayer(*m_Player, this);
|
||||||
}
|
}
|
||||||
if (World != NULL)
|
if (World != NULL)
|
||||||
{
|
{
|
||||||
@ -371,6 +371,11 @@ void cClientHandle::Authenticate(const AString & a_Name, const AString & a_UUID,
|
|||||||
// Send experience
|
// Send experience
|
||||||
m_Player->SendExperience();
|
m_Player->SendExperience();
|
||||||
|
|
||||||
|
// Send player list items
|
||||||
|
SendPlayerListAddPlayer(*m_Player);
|
||||||
|
World->BroadcastPlayerListAddPlayer(*m_Player);
|
||||||
|
World->SendPlayerList(m_Player);
|
||||||
|
|
||||||
m_Player->Initialize(*World);
|
m_Player->Initialize(*World);
|
||||||
m_State = csAuthenticated;
|
m_State = csAuthenticated;
|
||||||
|
|
||||||
@ -1206,50 +1211,61 @@ void cClientHandle::FinishDigAnimation()
|
|||||||
|
|
||||||
void cClientHandle::HandleRightClick(int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, const cItem & a_HeldItem)
|
void cClientHandle::HandleRightClick(int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, const cItem & a_HeldItem)
|
||||||
{
|
{
|
||||||
|
// TODO: Rewrite this function
|
||||||
|
|
||||||
LOGD("HandleRightClick: {%d, %d, %d}, face %d, HeldItem: %s",
|
LOGD("HandleRightClick: {%d, %d, %d}, face %d, HeldItem: %s",
|
||||||
a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, ItemToFullString(a_HeldItem).c_str()
|
a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, ItemToFullString(a_HeldItem).c_str()
|
||||||
);
|
);
|
||||||
|
|
||||||
cWorld * World = m_Player->GetWorld();
|
cWorld * World = m_Player->GetWorld();
|
||||||
|
bool AreRealCoords = (Vector3d(a_BlockX, a_BlockY, a_BlockZ) - m_Player->GetPosition()).Length() <= 5;
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(a_BlockFace != BLOCK_FACE_NONE) && // The client is interacting with a specific block
|
(a_BlockFace != BLOCK_FACE_NONE) && // The client is interacting with a specific block
|
||||||
(
|
IsValidBlock(a_HeldItem.m_ItemType) &&
|
||||||
(Diff(m_Player->GetPosX(), (double)a_BlockX) > 6) || // The block is too far away
|
!AreRealCoords
|
||||||
(Diff(m_Player->GetPosY(), (double)a_BlockY) > 6) ||
|
|
||||||
(Diff(m_Player->GetPosZ(), (double)a_BlockZ) > 6)
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);
|
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);
|
||||||
World->SendBlockTo(a_BlockX, a_BlockY, a_BlockZ, m_Player);
|
if ((a_BlockX != -1) && (a_BlockY >= 0) && (a_BlockZ != -1))
|
||||||
if (a_BlockY < cChunkDef::Height - 1)
|
|
||||||
{
|
{
|
||||||
World->SendBlockTo(a_BlockX, a_BlockY + 1, a_BlockZ, m_Player); // 2 block high things
|
World->SendBlockTo(a_BlockX, a_BlockY, a_BlockZ, m_Player);
|
||||||
}
|
if (a_BlockY < cChunkDef::Height - 1)
|
||||||
if (a_BlockY > 0)
|
{
|
||||||
{
|
World->SendBlockTo(a_BlockX, a_BlockY + 1, a_BlockZ, m_Player); // 2 block high things
|
||||||
World->SendBlockTo(a_BlockX, a_BlockY - 1, a_BlockZ, m_Player); // 2 block high things
|
}
|
||||||
|
if (a_BlockY > 0)
|
||||||
|
{
|
||||||
|
World->SendBlockTo(a_BlockX, a_BlockY - 1, a_BlockZ, m_Player); // 2 block high things
|
||||||
|
}
|
||||||
}
|
}
|
||||||
m_Player->GetInventory().SendEquippedSlot();
|
m_Player->GetInventory().SendEquippedSlot();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!AreRealCoords)
|
||||||
|
{
|
||||||
|
a_BlockFace = BLOCK_FACE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
cPluginManager * PlgMgr = cRoot::Get()->GetPluginManager();
|
cPluginManager * PlgMgr = cRoot::Get()->GetPluginManager();
|
||||||
if (PlgMgr->CallHookPlayerRightClick(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ))
|
if (PlgMgr->CallHookPlayerRightClick(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ))
|
||||||
{
|
{
|
||||||
// A plugin doesn't agree with the action, replace the block on the client and quit:
|
// A plugin doesn't agree with the action, replace the block on the client and quit:
|
||||||
cChunkInterface ChunkInterface(World->GetChunkMap());
|
if (AreRealCoords)
|
||||||
BLOCKTYPE BlockType = World->GetBlock(a_BlockX, a_BlockY, a_BlockZ);
|
|
||||||
cBlockHandler * BlockHandler = cBlockInfo::GetHandler(BlockType);
|
|
||||||
BlockHandler->OnCancelRightClick(ChunkInterface, *World, m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);
|
|
||||||
|
|
||||||
if (a_BlockFace != BLOCK_FACE_NONE)
|
|
||||||
{
|
{
|
||||||
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);
|
cChunkInterface ChunkInterface(World->GetChunkMap());
|
||||||
World->SendBlockTo(a_BlockX, a_BlockY, a_BlockZ, m_Player);
|
BLOCKTYPE BlockType = World->GetBlock(a_BlockX, a_BlockY, a_BlockZ);
|
||||||
World->SendBlockTo(a_BlockX, a_BlockY + 1, a_BlockZ, m_Player); // 2 block high things
|
cBlockHandler * BlockHandler = cBlockInfo::GetHandler(BlockType);
|
||||||
m_Player->GetInventory().SendEquippedSlot();
|
BlockHandler->OnCancelRightClick(ChunkInterface, *World, m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);
|
||||||
|
|
||||||
|
if (a_BlockFace != BLOCK_FACE_NONE)
|
||||||
|
{
|
||||||
|
AddFaceDirection(a_BlockX, a_BlockY, a_BlockZ, a_BlockFace);
|
||||||
|
World->SendBlockTo(a_BlockX, a_BlockY, a_BlockZ, m_Player);
|
||||||
|
World->SendBlockTo(a_BlockX, a_BlockY + 1, a_BlockZ, m_Player); // 2 block high things
|
||||||
|
m_Player->GetInventory().SendEquippedSlot();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1282,22 +1298,25 @@ void cClientHandle::HandleRightClick(int a_BlockX, int a_BlockY, int a_BlockZ, e
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BLOCKTYPE BlockType;
|
if (AreRealCoords)
|
||||||
NIBBLETYPE BlockMeta;
|
|
||||||
World->GetBlockTypeMeta(a_BlockX, a_BlockY, a_BlockZ, BlockType, BlockMeta);
|
|
||||||
cBlockHandler * BlockHandler = cBlockInfo::GetHandler(BlockType);
|
|
||||||
|
|
||||||
if (BlockHandler->IsUseable() && !m_Player->IsCrouched())
|
|
||||||
{
|
{
|
||||||
if (PlgMgr->CallHookPlayerUsingBlock(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, BlockType, BlockMeta))
|
BLOCKTYPE BlockType;
|
||||||
|
NIBBLETYPE BlockMeta;
|
||||||
|
World->GetBlockTypeMeta(a_BlockX, a_BlockY, a_BlockZ, BlockType, BlockMeta);
|
||||||
|
cBlockHandler * BlockHandler = cBlockInfo::GetHandler(BlockType);
|
||||||
|
|
||||||
|
if (BlockHandler->IsUseable() && !m_Player->IsCrouched())
|
||||||
{
|
{
|
||||||
// A plugin doesn't agree with using the block, abort
|
if (PlgMgr->CallHookPlayerUsingBlock(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, BlockType, BlockMeta))
|
||||||
|
{
|
||||||
|
// A plugin doesn't agree with using the block, abort
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cChunkInterface ChunkInterface(World->GetChunkMap());
|
||||||
|
BlockHandler->OnUse(ChunkInterface, *World, m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ);
|
||||||
|
PlgMgr->CallHookPlayerUsedBlock(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, BlockType, BlockMeta);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cChunkInterface ChunkInterface(World->GetChunkMap());
|
|
||||||
BlockHandler->OnUse(ChunkInterface, *World, m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ);
|
|
||||||
PlgMgr->CallHookPlayerUsedBlock(*m_Player, a_BlockX, a_BlockY, a_BlockZ, a_BlockFace, a_CursorX, a_CursorY, a_CursorZ, BlockType, BlockMeta);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
short EquippedDamage = Equipped.m_ItemDamage;
|
short EquippedDamage = Equipped.m_ItemDamage;
|
||||||
@ -2326,18 +2345,18 @@ void cClientHandle::SendInventorySlot(char a_WindowID, short a_SlotNum, const cI
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cClientHandle::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length)
|
void cClientHandle::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length, unsigned int m_Scale)
|
||||||
{
|
{
|
||||||
m_Protocol->SendMapColumn(a_ID, a_X, a_Y, a_Colors, a_Length);
|
m_Protocol->SendMapColumn(a_ID, a_X, a_Y, a_Colors, a_Length, m_Scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cClientHandle::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decorators)
|
void cClientHandle::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decorators, unsigned int m_Scale)
|
||||||
{
|
{
|
||||||
m_Protocol->SendMapDecorators(a_ID, a_Decorators);
|
m_Protocol->SendMapDecorators(a_ID, a_Decorators, m_Scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2353,9 +2372,9 @@ void cClientHandle::SendMapInfo(int a_ID, unsigned int a_Scale)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cClientHandle::SendParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount)
|
void cClientHandle::SendParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount)
|
||||||
{
|
{
|
||||||
m_Protocol->SendParticleEffect(a_ParticleName, a_SrcX, a_SrcY, a_SrcZ, a_OffsetX, a_OffsetY, a_OffsetZ, a_ParticleData, a_ParticleAmmount);
|
m_Protocol->SendParticleEffect(a_ParticleName, a_SrcX, a_SrcY, a_SrcZ, a_OffsetX, a_OffsetY, a_OffsetZ, a_ParticleData, a_ParticleAmount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2397,9 +2416,45 @@ void cClientHandle::SendPlayerAbilities()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cClientHandle::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline)
|
void cClientHandle::SendPlayerListAddPlayer(const cPlayer & a_Player)
|
||||||
{
|
{
|
||||||
m_Protocol->SendPlayerListItem(a_Player, a_IsOnline);
|
m_Protocol->SendPlayerListAddPlayer(a_Player);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cClientHandle::SendPlayerListRemovePlayer(const cPlayer & a_Player)
|
||||||
|
{
|
||||||
|
m_Protocol->SendPlayerListRemovePlayer(a_Player);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cClientHandle::SendPlayerListUpdateGameMode(const cPlayer & a_Player)
|
||||||
|
{
|
||||||
|
m_Protocol->SendPlayerListUpdateGameMode(a_Player);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cClientHandle::SendPlayerListUpdatePing(const cPlayer & a_Player)
|
||||||
|
{
|
||||||
|
m_Protocol->SendPlayerListUpdatePing(a_Player);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cClientHandle::SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_OldListName)
|
||||||
|
{
|
||||||
|
m_Protocol->SendPlayerListUpdateDisplayName(a_Player, a_OldListName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -134,73 +134,77 @@ public:
|
|||||||
|
|
||||||
// The following functions send the various packets:
|
// The following functions send the various packets:
|
||||||
// (Please keep these alpha-sorted)
|
// (Please keep these alpha-sorted)
|
||||||
void SendAttachEntity (const cEntity & a_Entity, const cEntity * a_Vehicle);
|
void SendAttachEntity (const cEntity & a_Entity, const cEntity * a_Vehicle);
|
||||||
void SendBlockAction (int a_BlockX, int a_BlockY, int a_BlockZ, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType);
|
void SendBlockAction (int a_BlockX, int a_BlockY, int a_BlockZ, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType);
|
||||||
void SendBlockBreakAnim (int a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage);
|
void SendBlockBreakAnim (int a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage);
|
||||||
void SendBlockChange (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta); // tolua_export
|
void SendBlockChange (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta); // tolua_export
|
||||||
void SendBlockChanges (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes);
|
void SendBlockChanges (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes);
|
||||||
void SendChat (const AString & a_Message, eMessageType a_ChatPrefix, const AString & a_AdditionalData = "");
|
void SendChat (const AString & a_Message, eMessageType a_ChatPrefix, const AString & a_AdditionalData = "");
|
||||||
void SendChat (const cCompositeChat & a_Message);
|
void SendChat (const cCompositeChat & a_Message);
|
||||||
void SendChunkData (int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer);
|
void SendChunkData (int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer);
|
||||||
void SendCollectEntity (const cEntity & a_Entity, const cPlayer & a_Player);
|
void SendCollectEntity (const cEntity & a_Entity, const cPlayer & a_Player);
|
||||||
void SendDestroyEntity (const cEntity & a_Entity);
|
void SendDestroyEntity (const cEntity & a_Entity);
|
||||||
void SendDisconnect (const AString & a_Reason);
|
void SendDisconnect (const AString & a_Reason);
|
||||||
void SendEditSign (int a_BlockX, int a_BlockY, int a_BlockZ);
|
void SendEditSign (int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||||
void SendEntityEffect (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration);
|
void SendEntityEffect (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration);
|
||||||
void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item);
|
void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item);
|
||||||
void SendEntityHeadLook (const cEntity & a_Entity);
|
void SendEntityHeadLook (const cEntity & a_Entity);
|
||||||
void SendEntityLook (const cEntity & a_Entity);
|
void SendEntityLook (const cEntity & a_Entity);
|
||||||
void SendEntityMetadata (const cEntity & a_Entity);
|
void SendEntityMetadata (const cEntity & a_Entity);
|
||||||
void SendEntityProperties (const cEntity & a_Entity);
|
void SendEntityProperties (const cEntity & a_Entity);
|
||||||
void SendEntityRelMove (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ);
|
void SendEntityRelMove (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ);
|
||||||
void SendEntityRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ);
|
void SendEntityRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ);
|
||||||
void SendEntityStatus (const cEntity & a_Entity, char a_Status);
|
void SendEntityStatus (const cEntity & a_Entity, char a_Status);
|
||||||
void SendEntityVelocity (const cEntity & a_Entity);
|
void SendEntityVelocity (const cEntity & a_Entity);
|
||||||
void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion);
|
void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion);
|
||||||
void SendGameMode (eGameMode a_GameMode);
|
void SendGameMode (eGameMode a_GameMode);
|
||||||
void SendHealth (void);
|
void SendHealth (void);
|
||||||
void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item);
|
void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item);
|
||||||
void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length);
|
void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length, unsigned int m_Scale);
|
||||||
void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators);
|
void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators, unsigned int m_Scale);
|
||||||
void SendMapInfo (int a_ID, unsigned int a_Scale);
|
void SendMapInfo (int a_ID, unsigned int a_Scale);
|
||||||
void SendPaintingSpawn (const cPainting & a_Painting);
|
void SendPaintingSpawn (const cPainting & a_Painting);
|
||||||
void SendPickupSpawn (const cPickup & a_Pickup);
|
void SendPickupSpawn (const cPickup & a_Pickup);
|
||||||
void SendEntityAnimation (const cEntity & a_Entity, char a_Animation); // tolua_export
|
void SendEntityAnimation (const cEntity & a_Entity, char a_Animation); // tolua_export
|
||||||
void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount);
|
void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount);
|
||||||
void SendPlayerAbilities (void);
|
void SendPlayerAbilities (void);
|
||||||
void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline);
|
void SendPlayerListAddPlayer (const cPlayer & a_Player);
|
||||||
void SendPlayerMaxSpeed (void); ///< Informs the client of the maximum player speed (1.6.1+)
|
void SendPlayerListRemovePlayer (const cPlayer & a_Player);
|
||||||
void SendPlayerMoveLook (void);
|
void SendPlayerListUpdateGameMode (const cPlayer & a_Player);
|
||||||
void SendPlayerPosition (void);
|
void SendPlayerListUpdatePing (const cPlayer & a_Player);
|
||||||
void SendPlayerSpawn (const cPlayer & a_Player);
|
void SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_OldListName);
|
||||||
void SendPluginMessage (const AString & a_Channel, const AString & a_Message); // Exported in ManualBindings.cpp
|
void SendPlayerMaxSpeed (void); ///< Informs the client of the maximum player speed (1.6.1+)
|
||||||
void SendRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID);
|
void SendPlayerMoveLook (void);
|
||||||
void SendRespawn (eDimension a_Dimension, bool a_ShouldIgnoreDimensionChecks = false);
|
void SendPlayerPosition (void);
|
||||||
void SendExperience (void);
|
void SendPlayerSpawn (const cPlayer & a_Player);
|
||||||
void SendExperienceOrb (const cExpOrb & a_ExpOrb);
|
void SendPluginMessage (const AString & a_Channel, const AString & a_Message); // Exported in ManualBindings.cpp
|
||||||
void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode);
|
void SendRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID);
|
||||||
void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode);
|
void SendRespawn (eDimension a_Dimension, bool a_ShouldIgnoreDimensionChecks = false);
|
||||||
void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display);
|
void SendExperience (void);
|
||||||
void SendSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch); // tolua_export
|
void SendExperienceOrb (const cExpOrb & a_ExpOrb);
|
||||||
void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data);
|
void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode);
|
||||||
void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock);
|
void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode);
|
||||||
void SendSpawnMob (const cMonster & a_Mob);
|
void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display);
|
||||||
void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch);
|
void SendSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch); // tolua_export
|
||||||
void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType, char a_VehicleSubType = 0);
|
void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data);
|
||||||
void SendStatistics (const cStatManager & a_Manager);
|
void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock);
|
||||||
void SendTabCompletionResults(const AStringVector & a_Results);
|
void SendSpawnMob (const cMonster & a_Mob);
|
||||||
void SendTeleportEntity (const cEntity & a_Entity);
|
void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch);
|
||||||
void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ);
|
void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType, char a_VehicleSubType = 0);
|
||||||
void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay, bool a_DoDaylightCycle); // tolua_export
|
void SendStatistics (const cStatManager & a_Manager);
|
||||||
void SendUnloadChunk (int a_ChunkX, int a_ChunkZ);
|
void SendTabCompletionResults (const AStringVector & a_Results);
|
||||||
void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity);
|
void SendTeleportEntity (const cEntity & a_Entity);
|
||||||
void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4);
|
void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||||
void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ);
|
void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay, bool a_DoDaylightCycle); // tolua_export
|
||||||
void SendWeather (eWeather a_Weather);
|
void SendUnloadChunk (int a_ChunkX, int a_ChunkZ);
|
||||||
void SendWholeInventory (const cWindow & a_Window);
|
void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity);
|
||||||
void SendWindowClose (const cWindow & a_Window);
|
void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4);
|
||||||
void SendWindowOpen (const cWindow & a_Window);
|
void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ);
|
||||||
void SendWindowProperty (const cWindow & a_Window, int a_Property, int a_Value);
|
void SendWeather (eWeather a_Weather);
|
||||||
|
void SendWholeInventory (const cWindow & a_Window);
|
||||||
|
void SendWindowClose (const cWindow & a_Window);
|
||||||
|
void SendWindowOpen (const cWindow & a_Window);
|
||||||
|
void SendWindowProperty (const cWindow & a_Window, int a_Property, int a_Value);
|
||||||
|
|
||||||
// tolua_begin
|
// tolua_begin
|
||||||
const AString & GetUsername(void) const;
|
const AString & GetUsername(void) const;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
#include "CompositeChat.h"
|
#include "CompositeChat.h"
|
||||||
|
#include "ClientHandle.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -399,6 +400,183 @@ void cCompositeChat::AddStyle(AString & a_Style, const AString & a_AddStyle)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
AString cCompositeChat::CreateJsonString(bool a_ShouldUseChatPrefixes) const
|
||||||
|
{
|
||||||
|
Json::Value msg;
|
||||||
|
msg["text"] = cClientHandle::FormatMessageType(a_ShouldUseChatPrefixes, GetMessageType(), GetAdditionalMessageTypeData()); // The client crashes without this field being present
|
||||||
|
const cCompositeChat::cParts & Parts = GetParts();
|
||||||
|
for (cCompositeChat::cParts::const_iterator itr = Parts.begin(), end = Parts.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
Json::Value Part;
|
||||||
|
switch ((*itr)->m_PartType)
|
||||||
|
{
|
||||||
|
case cCompositeChat::ptText:
|
||||||
|
{
|
||||||
|
Part["text"] = (*itr)->m_Text;
|
||||||
|
AddChatPartStyle(Part, (*itr)->m_Style);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case cCompositeChat::ptClientTranslated:
|
||||||
|
{
|
||||||
|
const cCompositeChat::cClientTranslatedPart & p = (const cCompositeChat::cClientTranslatedPart &)**itr;
|
||||||
|
Part["translate"] = p.m_Text;
|
||||||
|
Json::Value With;
|
||||||
|
for (AStringVector::const_iterator itrW = p.m_Parameters.begin(), endW = p.m_Parameters.end(); itrW != endW; ++itr)
|
||||||
|
{
|
||||||
|
With.append(*itrW);
|
||||||
|
}
|
||||||
|
if (!p.m_Parameters.empty())
|
||||||
|
{
|
||||||
|
Part["with"] = With;
|
||||||
|
}
|
||||||
|
AddChatPartStyle(Part, p.m_Style);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case cCompositeChat::ptUrl:
|
||||||
|
{
|
||||||
|
const cCompositeChat::cUrlPart & p = (const cCompositeChat::cUrlPart &)**itr;
|
||||||
|
Part["text"] = p.m_Text;
|
||||||
|
Json::Value Url;
|
||||||
|
Url["action"] = "open_url";
|
||||||
|
Url["value"] = p.m_Url;
|
||||||
|
Part["clickEvent"] = Url;
|
||||||
|
AddChatPartStyle(Part, p.m_Style);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case cCompositeChat::ptSuggestCommand:
|
||||||
|
case cCompositeChat::ptRunCommand:
|
||||||
|
{
|
||||||
|
const cCompositeChat::cCommandPart & p = (const cCompositeChat::cCommandPart &)**itr;
|
||||||
|
Part["text"] = p.m_Text;
|
||||||
|
Json::Value Cmd;
|
||||||
|
Cmd["action"] = (p.m_PartType == cCompositeChat::ptRunCommand) ? "run_command" : "suggest_command";
|
||||||
|
Cmd["value"] = p.m_Command;
|
||||||
|
Part["clickEvent"] = Cmd;
|
||||||
|
AddChatPartStyle(Part, p.m_Style);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case cCompositeChat::ptShowAchievement:
|
||||||
|
{
|
||||||
|
const cCompositeChat::cShowAchievementPart & p = (const cCompositeChat::cShowAchievementPart &)**itr;
|
||||||
|
Part["translate"] = "chat.type.achievement";
|
||||||
|
|
||||||
|
Json::Value Ach;
|
||||||
|
Ach["action"] = "show_achievement";
|
||||||
|
Ach["value"] = p.m_Text;
|
||||||
|
|
||||||
|
Json::Value AchColourAndName;
|
||||||
|
AchColourAndName["color"] = "green";
|
||||||
|
AchColourAndName["translate"] = p.m_Text;
|
||||||
|
AchColourAndName["hoverEvent"] = Ach;
|
||||||
|
|
||||||
|
Json::Value Extra;
|
||||||
|
Extra.append(AchColourAndName);
|
||||||
|
|
||||||
|
Json::Value Name;
|
||||||
|
Name["text"] = p.m_PlayerName;
|
||||||
|
|
||||||
|
Json::Value With;
|
||||||
|
With.append(Name);
|
||||||
|
With.append(Extra);
|
||||||
|
|
||||||
|
Part["with"] = With;
|
||||||
|
AddChatPartStyle(Part, p.m_Style);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msg["extra"].append(Part);
|
||||||
|
} // for itr - Parts[]
|
||||||
|
|
||||||
|
return msg.toStyledString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cCompositeChat::AddChatPartStyle(Json::Value & a_Value, const AString & a_PartStyle) const
|
||||||
|
{
|
||||||
|
size_t len = a_PartStyle.length();
|
||||||
|
for (size_t i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
switch (a_PartStyle[i])
|
||||||
|
{
|
||||||
|
case 'b':
|
||||||
|
{
|
||||||
|
// bold
|
||||||
|
a_Value["bold"] = Json::Value(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'i':
|
||||||
|
{
|
||||||
|
// italic
|
||||||
|
a_Value["italic"] = Json::Value(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'u':
|
||||||
|
{
|
||||||
|
// Underlined
|
||||||
|
a_Value["underlined"] = Json::Value(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 's':
|
||||||
|
{
|
||||||
|
// strikethrough
|
||||||
|
a_Value["strikethrough"] = Json::Value(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'o':
|
||||||
|
{
|
||||||
|
// obfuscated
|
||||||
|
a_Value["obfuscated"] = Json::Value(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case '@':
|
||||||
|
{
|
||||||
|
// Color, specified by the next char:
|
||||||
|
i++;
|
||||||
|
if (i >= len)
|
||||||
|
{
|
||||||
|
// String too short, didn't contain a color
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (a_PartStyle[i])
|
||||||
|
{
|
||||||
|
case '0': a_Value["color"] = Json::Value("black"); break;
|
||||||
|
case '1': a_Value["color"] = Json::Value("dark_blue"); break;
|
||||||
|
case '2': a_Value["color"] = Json::Value("dark_green"); break;
|
||||||
|
case '3': a_Value["color"] = Json::Value("dark_aqua"); break;
|
||||||
|
case '4': a_Value["color"] = Json::Value("dark_red"); break;
|
||||||
|
case '5': a_Value["color"] = Json::Value("dark_purple"); break;
|
||||||
|
case '6': a_Value["color"] = Json::Value("gold"); break;
|
||||||
|
case '7': a_Value["color"] = Json::Value("gray"); break;
|
||||||
|
case '8': a_Value["color"] = Json::Value("dark_gray"); break;
|
||||||
|
case '9': a_Value["color"] = Json::Value("blue"); break;
|
||||||
|
case 'a': a_Value["color"] = Json::Value("green"); break;
|
||||||
|
case 'b': a_Value["color"] = Json::Value("aqua"); break;
|
||||||
|
case 'c': a_Value["color"] = Json::Value("red"); break;
|
||||||
|
case 'd': a_Value["color"] = Json::Value("light_purple"); break;
|
||||||
|
case 'e': a_Value["color"] = Json::Value("yellow"); break;
|
||||||
|
case 'f': a_Value["color"] = Json::Value("white"); break;
|
||||||
|
} // switch (color)
|
||||||
|
} // case '@'
|
||||||
|
} // switch (Style[i])
|
||||||
|
} // for i - a_PartStyle[]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// cCompositeChat::cBasePart:
|
// cCompositeChat::cBasePart:
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
// Declares the cCompositeChat class used to wrap a chat message with multiple parts (text, url, cmd)
|
// Declares the cCompositeChat class used to wrap a chat message with multiple parts (text, url, cmd)
|
||||||
|
|
||||||
#include "Defines.h"
|
#include "Defines.h"
|
||||||
|
#include "json/json.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -190,6 +191,8 @@ public:
|
|||||||
and for console-logging. */
|
and for console-logging. */
|
||||||
AString ExtractText(void) const;
|
AString ExtractText(void) const;
|
||||||
|
|
||||||
|
AString CreateJsonString(bool a_ShouldUseChatPrefixes = true) const;
|
||||||
|
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
const cParts & GetParts(void) const { return m_Parts; }
|
const cParts & GetParts(void) const { return m_Parts; }
|
||||||
@ -198,6 +201,9 @@ public:
|
|||||||
Used by the logging bindings when logging a cCompositeChat object. */
|
Used by the logging bindings when logging a cCompositeChat object. */
|
||||||
static cLogger::eLogLevel MessageTypeToLogLevel(eMessageType a_MessageType);
|
static cLogger::eLogLevel MessageTypeToLogLevel(eMessageType a_MessageType);
|
||||||
|
|
||||||
|
/** Adds the chat part's style (represented by the part's stylestring) into the Json object. */
|
||||||
|
void AddChatPartStyle(Json::Value & a_Value, const AString & a_PartStyle) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/** All the parts that */
|
/** All the parts that */
|
||||||
cParts m_Parts;
|
cParts m_Parts;
|
||||||
|
@ -135,7 +135,7 @@ const char * cEntity::GetParentClass(void) const
|
|||||||
|
|
||||||
bool cEntity::Initialize(cWorld & a_World)
|
bool cEntity::Initialize(cWorld & a_World)
|
||||||
{
|
{
|
||||||
if (cPluginManager::Get()->CallHookSpawningEntity(a_World, *this))
|
if (cPluginManager::Get()->CallHookSpawningEntity(a_World, *this) && !IsPlayer())
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ void cItemFrame::OnRightClicked(cPlayer & a_Player)
|
|||||||
{
|
{
|
||||||
// Item not empty, rotate, clipping values to zero to three inclusive
|
// Item not empty, rotate, clipping values to zero to three inclusive
|
||||||
m_Rotation++;
|
m_Rotation++;
|
||||||
if (m_Rotation >= 4)
|
if (m_Rotation >= 8)
|
||||||
{
|
{
|
||||||
m_Rotation = 0;
|
m_Rotation = 0;
|
||||||
}
|
}
|
||||||
|
@ -266,7 +266,7 @@ void cPlayer::Tick(float a_Dt, cChunk & a_Chunk)
|
|||||||
cTimer t1;
|
cTimer t1;
|
||||||
if (m_LastPlayerListTime + PLAYER_LIST_TIME_MS <= t1.GetNowTime())
|
if (m_LastPlayerListTime + PLAYER_LIST_TIME_MS <= t1.GetNowTime())
|
||||||
{
|
{
|
||||||
m_World->SendPlayerList(this);
|
m_World->BroadcastPlayerListUpdatePing(*this);
|
||||||
m_LastPlayerListTime = t1.GetNowTime();
|
m_LastPlayerListTime = t1.GetNowTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1176,6 +1176,8 @@ void cPlayer::SetGameMode(eGameMode a_GameMode)
|
|||||||
SetFlying(false);
|
SetFlying(false);
|
||||||
SetCanFly(false);
|
SetCanFly(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_World->BroadcastPlayerListUpdateGameMode(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,4 +47,3 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -432,7 +432,7 @@ void cMap::StreamNext(cMapClient & a_Client)
|
|||||||
// This is dangerous as the player object may have been destroyed before the decorator is erased from the list
|
// This is dangerous as the player object may have been destroyed before the decorator is erased from the list
|
||||||
UpdateDecorators();
|
UpdateDecorators();
|
||||||
|
|
||||||
Handle->SendMapDecorators(m_ID, m_Decorators);
|
Handle->SendMapDecorators(m_ID, m_Decorators, m_Scale);
|
||||||
|
|
||||||
a_Client.m_NextDecoratorUpdate = 0;
|
a_Client.m_NextDecoratorUpdate = 0;
|
||||||
}
|
}
|
||||||
@ -444,7 +444,7 @@ void cMap::StreamNext(cMapClient & a_Client)
|
|||||||
|
|
||||||
const Byte * Colors = &m_Data[Y * m_Height];
|
const Byte * Colors = &m_Data[Y * m_Height];
|
||||||
|
|
||||||
Handle->SendMapColumn(m_ID, Y, 0, Colors, m_Height);
|
Handle->SendMapColumn(m_ID, Y, 0, Colors, m_Height, m_Scale);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -595,10 +595,10 @@ void cMap::SendTo(cClientHandle & a_Client)
|
|||||||
{
|
{
|
||||||
const Byte* Colors = &m_Data[i * m_Height];
|
const Byte* Colors = &m_Data[i * m_Height];
|
||||||
|
|
||||||
a_Client.SendMapColumn(m_ID, i, 0, Colors, m_Height);
|
a_Client.SendMapColumn(m_ID, i, 0, Colors, m_Height, m_Scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
a_Client.SendMapDecorators(m_ID, m_Decorators);
|
a_Client.SendMapDecorators(m_ID, m_Decorators, m_Scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ SET (SRCS
|
|||||||
Protocol15x.cpp
|
Protocol15x.cpp
|
||||||
Protocol16x.cpp
|
Protocol16x.cpp
|
||||||
Protocol17x.cpp
|
Protocol17x.cpp
|
||||||
|
Protocol18x.cpp
|
||||||
ProtocolRecognizer.cpp)
|
ProtocolRecognizer.cpp)
|
||||||
|
|
||||||
SET (HDRS
|
SET (HDRS
|
||||||
@ -27,6 +28,7 @@ SET (HDRS
|
|||||||
Protocol15x.h
|
Protocol15x.h
|
||||||
Protocol16x.h
|
Protocol16x.h
|
||||||
Protocol17x.h
|
Protocol17x.h
|
||||||
|
Protocol18x.h
|
||||||
ProtocolRecognizer.h)
|
ProtocolRecognizer.h)
|
||||||
|
|
||||||
if(NOT MSVC)
|
if(NOT MSVC)
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
#include "ChunkDataSerializer.h"
|
#include "ChunkDataSerializer.h"
|
||||||
#include "zlib/zlib.h"
|
#include "zlib/zlib.h"
|
||||||
|
#include "ByteBuffer.h"
|
||||||
|
#include "Protocol18x.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -30,7 +32,7 @@ cChunkDataSerializer::cChunkDataSerializer(
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
const AString & cChunkDataSerializer::Serialize(int a_Version)
|
const AString & cChunkDataSerializer::Serialize(int a_Version, int a_ChunkX, int a_ChunkZ)
|
||||||
{
|
{
|
||||||
Serializations::const_iterator itr = m_Serializations.find(a_Version);
|
Serializations::const_iterator itr = m_Serializations.find(a_Version);
|
||||||
if (itr != m_Serializations.end())
|
if (itr != m_Serializations.end())
|
||||||
@ -43,6 +45,7 @@ const AString & cChunkDataSerializer::Serialize(int a_Version)
|
|||||||
{
|
{
|
||||||
case RELEASE_1_2_5: Serialize29(data); break;
|
case RELEASE_1_2_5: Serialize29(data); break;
|
||||||
case RELEASE_1_3_2: Serialize39(data); break;
|
case RELEASE_1_3_2: Serialize39(data); break;
|
||||||
|
case RELEASE_1_8_0: Serialize47(data, a_ChunkX, a_ChunkZ); break;
|
||||||
// TODO: Other protocol versions may serialize the data differently; implement here
|
// TODO: Other protocol versions may serialize the data differently; implement here
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -52,7 +55,10 @@ const AString & cChunkDataSerializer::Serialize(int a_Version)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_Serializations[a_Version] = data;
|
if (!data.empty())
|
||||||
|
{
|
||||||
|
m_Serializations[a_Version] = data;
|
||||||
|
}
|
||||||
return m_Serializations[a_Version];
|
return m_Serializations[a_Version];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,3 +180,72 @@ void cChunkDataSerializer::Serialize39(AString & a_Data)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cChunkDataSerializer::Serialize47(AString & a_Data, int a_ChunkX, int a_ChunkZ)
|
||||||
|
{
|
||||||
|
// This function returns the fully compressed packet (including packet size), not the raw packet!
|
||||||
|
|
||||||
|
// Create the packet:
|
||||||
|
cByteBuffer Packet(512 KiB);
|
||||||
|
Packet.WriteVarInt(0x21); // Packet id (Chunk Data packet)
|
||||||
|
Packet.WriteBEInt(a_ChunkX);
|
||||||
|
Packet.WriteBEInt(a_ChunkZ);
|
||||||
|
Packet.WriteBool(true); // "Ground-up continuous", or rather, "biome data present" flag
|
||||||
|
Packet.WriteBEShort((short) 0xffff); // We're aways sending the full chunk with no additional data, so the bitmap is 0xffff
|
||||||
|
|
||||||
|
// Write the chunk size:
|
||||||
|
const int BiomeDataSize = cChunkDef::Width * cChunkDef::Width;
|
||||||
|
UInt32 ChunkSize = (
|
||||||
|
(cChunkDef::NumBlocks * 2) + // Block meta + type
|
||||||
|
sizeof(m_BlockLight) + // Block light
|
||||||
|
sizeof(m_BlockSkyLight) + // Block sky light
|
||||||
|
BiomeDataSize // Biome data
|
||||||
|
);
|
||||||
|
Packet.WriteVarInt(ChunkSize);
|
||||||
|
|
||||||
|
// Write the block types to the packet:
|
||||||
|
for (size_t Index = 0; Index < cChunkDef::NumBlocks; Index++)
|
||||||
|
{
|
||||||
|
BLOCKTYPE BlockType = m_BlockTypes[Index] & 0xFF;
|
||||||
|
NIBBLETYPE BlockMeta = m_BlockMetas[Index / 2] >> ((Index & 1) * 4) & 0x0f;
|
||||||
|
Packet.WriteByte((unsigned char)(BlockType << 4) | BlockMeta);
|
||||||
|
Packet.WriteByte((unsigned char)(BlockType >> 4));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write the rest:
|
||||||
|
Packet.WriteBuf(m_BlockLight, sizeof(m_BlockLight));
|
||||||
|
Packet.WriteBuf(m_BlockSkyLight, sizeof(m_BlockSkyLight));
|
||||||
|
Packet.WriteBuf(m_BiomeData, BiomeDataSize);
|
||||||
|
|
||||||
|
AString PacketData;
|
||||||
|
Packet.ReadAll(PacketData);
|
||||||
|
Packet.CommitRead();
|
||||||
|
|
||||||
|
cByteBuffer Buffer(20);
|
||||||
|
if (PacketData.size() >= 256)
|
||||||
|
{
|
||||||
|
if (!cProtocol180::CompressPacket(PacketData, a_Data))
|
||||||
|
{
|
||||||
|
ASSERT(!"Packet compression failed.");
|
||||||
|
a_Data.clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AString PostData;
|
||||||
|
Buffer.WriteVarInt((UInt32)Packet.GetUsedSpace() + 1);
|
||||||
|
Buffer.WriteVarInt(0);
|
||||||
|
Buffer.ReadAll(PostData);
|
||||||
|
Buffer.CommitRead();
|
||||||
|
|
||||||
|
a_Data.clear();
|
||||||
|
a_Data.reserve(PostData.size() + PacketData.size());
|
||||||
|
a_Data.append(PostData.data(), PostData.size());
|
||||||
|
a_Data.append(PacketData.data(), PacketData.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,13 +23,15 @@ protected:
|
|||||||
Serializations m_Serializations;
|
Serializations m_Serializations;
|
||||||
|
|
||||||
void Serialize29(AString & a_Data); // Release 1.2.4 and 1.2.5
|
void Serialize29(AString & a_Data); // Release 1.2.4 and 1.2.5
|
||||||
void Serialize39(AString & a_Data); // Release 1.3.1 and 1.3.2
|
void Serialize39(AString & a_Data); // Release 1.3.1 to 1.7.10
|
||||||
|
void Serialize47(AString & a_Data, int a_ChunkX, int a_ChunkZ); // Release 1.8
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
RELEASE_1_2_5 = 29,
|
RELEASE_1_2_5 = 29,
|
||||||
RELEASE_1_3_2 = 39,
|
RELEASE_1_3_2 = 39,
|
||||||
|
RELEASE_1_8_0 = 47,
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
cChunkDataSerializer(
|
cChunkDataSerializer(
|
||||||
@ -40,7 +42,7 @@ public:
|
|||||||
const unsigned char * a_BiomeData
|
const unsigned char * a_BiomeData
|
||||||
);
|
);
|
||||||
|
|
||||||
const AString & Serialize(int a_Version); // Returns one of the internal m_Serializations[]
|
const AString & Serialize(int a_Version, int a_ChunkX, int a_ChunkZ); // Returns one of the internal m_Serializations[]
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
@ -50,82 +50,87 @@ public:
|
|||||||
m_Client(a_Client)
|
m_Client(a_Client)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
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):
|
||||||
virtual void SendAttachEntity (const cEntity & a_Entity, const cEntity * a_Vehicle) = 0;
|
virtual void SendAttachEntity (const cEntity & a_Entity, const cEntity * a_Vehicle) = 0;
|
||||||
virtual void SendBlockAction (int a_BlockX, int a_BlockY, int a_BlockZ, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType) = 0;
|
virtual void SendBlockAction (int a_BlockX, int a_BlockY, int a_BlockZ, char a_Byte1, char a_Byte2, BLOCKTYPE a_BlockType) = 0;
|
||||||
virtual void SendBlockBreakAnim (int a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage) = 0;
|
virtual void SendBlockBreakAnim (int a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage) = 0;
|
||||||
virtual void SendBlockChange (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;
|
virtual void SendBlockChange (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;
|
||||||
virtual void SendBlockChanges (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes) = 0;
|
virtual void SendBlockChanges (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes) = 0;
|
||||||
virtual void SendChat (const AString & a_Message) = 0;
|
virtual void SendChat (const AString & a_Message) = 0;
|
||||||
virtual void SendChat (const cCompositeChat & a_Message) = 0;
|
virtual void SendChat (const cCompositeChat & a_Message) = 0;
|
||||||
virtual void SendChunkData (int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer) = 0;
|
virtual void SendChunkData (int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer) = 0;
|
||||||
virtual void SendCollectEntity (const cEntity & a_Entity, const cPlayer & a_Player) = 0;
|
virtual void SendCollectEntity (const cEntity & a_Entity, const cPlayer & a_Player) = 0;
|
||||||
virtual void SendDestroyEntity (const cEntity & a_Entity) = 0;
|
virtual void SendDestroyEntity (const cEntity & a_Entity) = 0;
|
||||||
virtual void SendDisconnect (const AString & a_Reason) = 0;
|
virtual void SendDisconnect (const AString & a_Reason) = 0;
|
||||||
virtual void SendEditSign (int a_BlockX, int a_BlockY, int a_BlockZ) = 0; ///< Request the client to open up the sign editor for the sign (1.6+)
|
virtual void SendEditSign (int a_BlockX, int a_BlockY, int a_BlockZ) = 0; ///< Request the client to open up the sign editor for the sign (1.6+)
|
||||||
virtual void SendEntityEffect (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration) = 0;
|
virtual void SendEntityEffect (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration) = 0;
|
||||||
virtual void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) = 0;
|
virtual void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) = 0;
|
||||||
virtual void SendEntityHeadLook (const cEntity & a_Entity) = 0;
|
virtual void SendEntityHeadLook (const cEntity & a_Entity) = 0;
|
||||||
virtual void SendEntityLook (const cEntity & a_Entity) = 0;
|
virtual void SendEntityLook (const cEntity & a_Entity) = 0;
|
||||||
virtual void SendEntityMetadata (const cEntity & a_Entity) = 0;
|
virtual void SendEntityMetadata (const cEntity & a_Entity) = 0;
|
||||||
virtual void SendEntityProperties (const cEntity & a_Entity) = 0;
|
virtual void SendEntityProperties (const cEntity & a_Entity) = 0;
|
||||||
virtual void SendEntityRelMove (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) = 0;
|
virtual void SendEntityRelMove (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) = 0;
|
||||||
virtual void SendEntityRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) = 0;
|
virtual void SendEntityRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) = 0;
|
||||||
virtual void SendEntityStatus (const cEntity & a_Entity, char a_Status) = 0;
|
virtual void SendEntityStatus (const cEntity & a_Entity, char a_Status) = 0;
|
||||||
virtual void SendEntityVelocity (const cEntity & a_Entity) = 0;
|
virtual void SendEntityVelocity (const cEntity & a_Entity) = 0;
|
||||||
virtual void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion) = 0;
|
virtual void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion) = 0;
|
||||||
virtual void SendGameMode (eGameMode a_GameMode) = 0;
|
virtual void SendGameMode (eGameMode a_GameMode) = 0;
|
||||||
virtual void SendHealth (void) = 0;
|
virtual void SendHealth (void) = 0;
|
||||||
virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) = 0;
|
virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) = 0;
|
||||||
virtual void SendKeepAlive (int a_PingID) = 0;
|
virtual void SendKeepAlive (int a_PingID) = 0;
|
||||||
virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) = 0;
|
virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) = 0;
|
||||||
virtual void SendLoginSuccess (void) = 0;
|
virtual void SendLoginSuccess (void) = 0;
|
||||||
virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) = 0;
|
virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length, unsigned int m_Scale) = 0;
|
||||||
virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators) = 0;
|
virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators, unsigned int m_Scale) = 0;
|
||||||
virtual void SendMapInfo (int a_ID, unsigned int a_Scale) = 0;
|
virtual void SendMapInfo (int a_ID, unsigned int a_Scale) = 0;
|
||||||
virtual void SendPaintingSpawn (const cPainting & a_Painting) = 0;
|
virtual void SendPaintingSpawn (const cPainting & a_Painting) = 0;
|
||||||
virtual void SendPickupSpawn (const cPickup & a_Pickup) = 0;
|
virtual void SendPickupSpawn (const cPickup & a_Pickup) = 0;
|
||||||
virtual void SendPlayerAbilities (void) = 0;
|
virtual void SendPlayerAbilities (void) = 0;
|
||||||
virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) = 0;
|
virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) = 0;
|
||||||
virtual void SendParticleEffect (const AString & a_SoundName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount) = 0;
|
virtual void SendParticleEffect (const AString & a_SoundName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount) = 0;
|
||||||
virtual void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline) = 0;
|
virtual void SendPlayerListAddPlayer (const cPlayer & a_Player) = 0;
|
||||||
virtual void SendPlayerMaxSpeed (void) = 0; ///< Informs the client of the maximum player speed (1.6.1+)
|
virtual void SendPlayerListRemovePlayer (const cPlayer & a_Player) = 0;
|
||||||
virtual void SendPlayerMoveLook (void) = 0;
|
virtual void SendPlayerListUpdateGameMode (const cPlayer & a_Player) = 0;
|
||||||
virtual void SendPlayerPosition (void) = 0;
|
virtual void SendPlayerListUpdatePing (const cPlayer & a_Player) = 0;
|
||||||
virtual void SendPlayerSpawn (const cPlayer & a_Player) = 0;
|
virtual void SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_OldListName) = 0;
|
||||||
virtual void SendPluginMessage (const AString & a_Channel, const AString & a_Message) = 0;
|
virtual void SendPlayerMaxSpeed (void) = 0; ///< Informs the client of the maximum player speed (1.6.1+)
|
||||||
virtual void SendRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID) = 0;
|
virtual void SendPlayerMoveLook (void) = 0;
|
||||||
virtual void SendRespawn (eDimension a_Dimension, bool a_ShouldIgnoreDimensionChecks) = 0;
|
virtual void SendPlayerPosition (void) = 0;
|
||||||
virtual void SendExperience (void) = 0;
|
virtual void SendPlayerSpawn (const cPlayer & a_Player) = 0;
|
||||||
virtual void SendExperienceOrb (const cExpOrb & a_ExpOrb) = 0;
|
virtual void SendPluginMessage (const AString & a_Channel, const AString & a_Message) = 0;
|
||||||
virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) = 0;
|
virtual void SendRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID) = 0;
|
||||||
virtual void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) = 0;
|
virtual void SendRespawn (eDimension a_Dimension, bool a_ShouldIgnoreDimensionChecks) = 0;
|
||||||
virtual void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) = 0;
|
virtual void SendExperience (void) = 0;
|
||||||
virtual void SendSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch) = 0;
|
virtual void SendExperienceOrb (const cExpOrb & a_ExpOrb) = 0;
|
||||||
virtual void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) = 0;
|
virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) = 0;
|
||||||
virtual void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock) = 0;
|
virtual void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) = 0;
|
||||||
virtual void SendSpawnMob (const cMonster & a_Mob) = 0;
|
virtual void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) = 0;
|
||||||
virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch) = 0;
|
virtual void SendSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch) = 0;
|
||||||
virtual void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType, char a_VehicleSubType) = 0;
|
virtual void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) = 0;
|
||||||
virtual void SendStatistics (const cStatManager & a_Manager) = 0;
|
virtual void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock) = 0;
|
||||||
virtual void SendTabCompletionResults(const AStringVector & a_Results) = 0;
|
virtual void SendSpawnMob (const cMonster & a_Mob) = 0;
|
||||||
virtual void SendTeleportEntity (const cEntity & a_Entity) = 0;
|
virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch) = 0;
|
||||||
virtual void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ) = 0;
|
virtual void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType, char a_VehicleSubType) = 0;
|
||||||
virtual void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay, bool a_DoDaylightCycle) = 0;
|
virtual void SendStatistics (const cStatManager & a_Manager) = 0;
|
||||||
virtual void SendUnloadChunk (int a_ChunkX, int a_ChunkZ) = 0;
|
virtual void SendTabCompletionResults (const AStringVector & a_Results) = 0;
|
||||||
virtual void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity) = 0;
|
virtual void SendTeleportEntity (const cEntity & a_Entity) = 0;
|
||||||
virtual void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) = 0;
|
virtual void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ) = 0;
|
||||||
virtual void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) = 0;
|
virtual void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay, bool a_DoDaylightCycle) = 0;
|
||||||
virtual void SendWeather (eWeather a_Weather) = 0;
|
virtual void SendUnloadChunk (int a_ChunkX, int a_ChunkZ) = 0;
|
||||||
virtual void SendWholeInventory (const cWindow & a_Window) = 0;
|
virtual void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity) = 0;
|
||||||
virtual void SendWindowClose (const cWindow & a_Window) = 0;
|
virtual void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) = 0;
|
||||||
virtual void SendWindowOpen (const cWindow & a_Window) = 0;
|
virtual void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) = 0;
|
||||||
virtual void SendWindowProperty (const cWindow & a_Window, int a_Property, int a_Value) = 0;
|
virtual void SendWeather (eWeather a_Weather) = 0;
|
||||||
|
virtual void SendWholeInventory (const cWindow & a_Window) = 0;
|
||||||
|
virtual void SendWindowClose (const cWindow & a_Window) = 0;
|
||||||
|
virtual void SendWindowOpen (const cWindow & a_Window) = 0;
|
||||||
|
virtual void SendWindowProperty (const cWindow & a_Window, int a_Property, int 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;
|
||||||
|
@ -262,7 +262,7 @@ void cProtocol125::SendChunkData(int a_ChunkX, int a_ChunkZ, cChunkDataSerialize
|
|||||||
SendPreChunk(a_ChunkX, a_ChunkZ, true);
|
SendPreChunk(a_ChunkX, a_ChunkZ, true);
|
||||||
|
|
||||||
// Send the chunk data:
|
// Send the chunk data:
|
||||||
AString Serialized = a_Serializer.Serialize(cChunkDataSerializer::RELEASE_1_2_5);
|
AString Serialized = a_Serializer.Serialize(cChunkDataSerializer::RELEASE_1_2_5, a_ChunkX, a_ChunkZ);
|
||||||
WriteByte(PACKET_MAP_CHUNK);
|
WriteByte(PACKET_MAP_CHUNK);
|
||||||
WriteInt (a_ChunkX);
|
WriteInt (a_ChunkX);
|
||||||
WriteInt (a_ChunkZ);
|
WriteInt (a_ChunkZ);
|
||||||
@ -608,7 +608,7 @@ void cProtocol125::SendLoginSuccess(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocol125::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length)
|
void cProtocol125::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length, unsigned int m_Scale)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CSPacket);
|
cCSLock Lock(m_CSPacket);
|
||||||
|
|
||||||
@ -630,7 +630,7 @@ void cProtocol125::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colo
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocol125::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decorators)
|
void cProtocol125::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decorators, unsigned int m_Scale)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CSPacket);
|
cCSLock Lock(m_CSPacket);
|
||||||
|
|
||||||
@ -700,7 +700,7 @@ void cProtocol125::SendEntityAnimation(const cEntity & a_Entity, char a_Animatio
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocol125::SendParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount)
|
void cProtocol125::SendParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount)
|
||||||
{
|
{
|
||||||
// Not supported by this protocol version
|
// Not supported by this protocol version
|
||||||
}
|
}
|
||||||
@ -719,21 +719,13 @@ void cProtocol125::SendPaintingSpawn(const cPainting & a_Painting)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocol125::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline)
|
void cProtocol125::SendPlayerListAddPlayer(const cPlayer & a_Player)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CSPacket);
|
cCSLock Lock(m_CSPacket);
|
||||||
AString PlayerName(a_Player.GetColor());
|
WriteByte (PACKET_PLAYER_LIST_ITEM);
|
||||||
PlayerName.append(a_Player.GetName());
|
WriteString(a_Player.GetName());
|
||||||
if (PlayerName.length() > 14)
|
WriteBool (true);
|
||||||
{
|
WriteShort (a_Player.GetClientHandle()->GetPing());
|
||||||
PlayerName.erase(14);
|
|
||||||
}
|
|
||||||
PlayerName += cChatColor::White;
|
|
||||||
|
|
||||||
WriteByte ((unsigned char)PACKET_PLAYER_LIST_ITEM);
|
|
||||||
WriteString(PlayerName);
|
|
||||||
WriteBool (a_IsOnline);
|
|
||||||
WriteShort (a_IsOnline ? a_Player.GetClientHandle()->GetPing() : 0);
|
|
||||||
Flush();
|
Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -741,6 +733,65 @@ void cProtocol125::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cProtocol125::SendPlayerListRemovePlayer(const cPlayer & a_Player)
|
||||||
|
{
|
||||||
|
cCSLock Lock(m_CSPacket);
|
||||||
|
WriteByte (PACKET_PLAYER_LIST_ITEM);
|
||||||
|
WriteString(a_Player.GetName());
|
||||||
|
WriteBool (false);
|
||||||
|
WriteShort (0);
|
||||||
|
Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cProtocol125::SendPlayerListUpdateGameMode(const cPlayer & a_Player)
|
||||||
|
{
|
||||||
|
// Not implemented in this protocol version
|
||||||
|
UNUSED(a_Player);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cProtocol125::SendPlayerListUpdatePing(const cPlayer & a_Player)
|
||||||
|
{
|
||||||
|
// It is a simple add player packet in this protocol.
|
||||||
|
SendPlayerListAddPlayer(a_Player);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cProtocol125::SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_OldListName)
|
||||||
|
{
|
||||||
|
if (a_OldListName == a_Player.GetName())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cCSLock Lock(m_CSPacket);
|
||||||
|
|
||||||
|
// Remove the old name from the tablist:
|
||||||
|
{
|
||||||
|
WriteByte (PACKET_PLAYER_LIST_ITEM);
|
||||||
|
WriteString(a_OldListName);
|
||||||
|
WriteBool (false);
|
||||||
|
WriteShort (0);
|
||||||
|
Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
SendPlayerListAddPlayer(a_Player);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocol125::SendPlayerMaxSpeed(void)
|
void cProtocol125::SendPlayerMaxSpeed(void)
|
||||||
{
|
{
|
||||||
// Not supported by this protocol version
|
// Not supported by this protocol version
|
||||||
|
@ -28,76 +28,80 @@ public:
|
|||||||
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 (int a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage) override;
|
virtual void SendBlockBreakAnim (int a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage) override;
|
||||||
virtual void SendBlockChange (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;
|
virtual void SendBlockChange (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;
|
||||||
virtual void SendBlockChanges (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes) override;
|
virtual void SendBlockChanges (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes) override;
|
||||||
virtual void SendChat (const AString & a_Message) override;
|
virtual void SendChat (const AString & a_Message) override;
|
||||||
virtual void SendChat (const cCompositeChat & a_Message) override;
|
virtual void SendChat (const cCompositeChat & a_Message) override;
|
||||||
virtual void SendChunkData (int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer) override;
|
virtual void SendChunkData (int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer) override;
|
||||||
virtual void SendCollectEntity (const cEntity & a_Entity, const cPlayer & a_Player) override;
|
virtual void SendCollectEntity (const cEntity & a_Entity, const cPlayer & a_Player) override;
|
||||||
virtual void SendDestroyEntity (const cEntity & a_Entity) override;
|
virtual void SendDestroyEntity (const cEntity & a_Entity) override;
|
||||||
virtual void SendDisconnect (const AString & a_Reason) override;
|
virtual void SendDisconnect (const AString & a_Reason) override;
|
||||||
virtual void SendEditSign (int a_BlockX, int a_BlockY, int a_BlockZ) override; ///< Request the client to open up the sign editor for the sign (1.6+)
|
virtual void SendEditSign (int a_BlockX, int a_BlockY, int a_BlockZ) override; ///< Request the client to open up the sign editor for the sign (1.6+)
|
||||||
virtual void SendEntityEffect (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration) override;
|
virtual void SendEntityEffect (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration) override;
|
||||||
virtual void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) override;
|
virtual void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) override;
|
||||||
virtual void SendEntityHeadLook (const cEntity & a_Entity) override;
|
virtual void SendEntityHeadLook (const cEntity & a_Entity) override;
|
||||||
virtual void SendEntityLook (const cEntity & a_Entity) override;
|
virtual void SendEntityLook (const cEntity & a_Entity) override;
|
||||||
virtual void SendEntityMetadata (const cEntity & a_Entity) override;
|
virtual void SendEntityMetadata (const cEntity & a_Entity) override;
|
||||||
virtual void SendEntityProperties (const cEntity & a_Entity) override;
|
virtual void SendEntityProperties (const cEntity & a_Entity) override;
|
||||||
virtual void SendEntityRelMove (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
|
virtual void SendEntityRelMove (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
|
||||||
virtual void SendEntityRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
|
virtual void SendEntityRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
|
||||||
virtual void SendEntityStatus (const cEntity & a_Entity, char a_Status) override;
|
virtual void SendEntityStatus (const cEntity & a_Entity, char a_Status) override;
|
||||||
virtual void SendEntityVelocity (const cEntity & a_Entity) override;
|
virtual void SendEntityVelocity (const cEntity & a_Entity) override;
|
||||||
virtual void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion) override;
|
virtual void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion) override;
|
||||||
virtual void SendGameMode (eGameMode a_GameMode) override;
|
virtual void SendGameMode (eGameMode a_GameMode) override;
|
||||||
virtual void SendHealth (void) override;
|
virtual void SendHealth (void) override;
|
||||||
virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) override;
|
virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) override;
|
||||||
virtual void SendKeepAlive (int a_PingID) override;
|
virtual void SendKeepAlive (int a_PingID) override;
|
||||||
virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) override;
|
virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) override;
|
||||||
virtual void SendLoginSuccess (void) override;
|
virtual void SendLoginSuccess (void) override;
|
||||||
virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) override;
|
virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length, unsigned int m_Scale) override;
|
||||||
virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators) override;
|
virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators, unsigned int m_Scale) override;
|
||||||
virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override;
|
virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override;
|
||||||
virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount) override;
|
virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount) override;
|
||||||
virtual void SendPaintingSpawn (const cPainting & a_Painting) override;
|
virtual void SendPaintingSpawn (const cPainting & a_Painting) override;
|
||||||
virtual void SendPickupSpawn (const cPickup & a_Pickup) override;
|
virtual void SendPickupSpawn (const cPickup & a_Pickup) override;
|
||||||
virtual void SendPlayerAbilities (void) override {} // This protocol doesn't support such message
|
virtual void SendPlayerAbilities (void) override {} // This protocol doesn't support such message
|
||||||
virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override;
|
virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override;
|
||||||
virtual void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline) override;
|
virtual void SendPlayerListAddPlayer (const cPlayer & a_Player) override;
|
||||||
virtual void SendPlayerMaxSpeed (void) override;
|
virtual void SendPlayerListRemovePlayer (const cPlayer & a_Player) override;
|
||||||
virtual void SendPlayerMoveLook (void) override;
|
virtual void SendPlayerListUpdateGameMode (const cPlayer & a_Player) override;
|
||||||
virtual void SendPlayerPosition (void) override;
|
virtual void SendPlayerListUpdatePing (const cPlayer & a_Player) override;
|
||||||
virtual void SendPlayerSpawn (const cPlayer & a_Player) override;
|
virtual void SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_OldListName) override;
|
||||||
virtual void SendPluginMessage (const AString & a_Channel, const AString & a_Message) override;
|
virtual void SendPlayerMaxSpeed (void) override;
|
||||||
virtual void SendRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID) override;
|
virtual void SendPlayerMoveLook (void) override;
|
||||||
virtual void SendRespawn (eDimension a_Dimension, bool a_ShouldIgnoreDimensionChecks) override;
|
virtual void SendPlayerPosition (void) override;
|
||||||
virtual void SendExperience (void) override;
|
virtual void SendPlayerSpawn (const cPlayer & a_Player) override;
|
||||||
virtual void SendExperienceOrb (const cExpOrb & a_ExpOrb) override;
|
virtual void SendPluginMessage (const AString & a_Channel, const AString & a_Message) override;
|
||||||
virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override;
|
virtual void SendRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID) override;
|
||||||
virtual void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) override {} // This protocol doesn't support such message
|
virtual void SendRespawn (eDimension a_Dimension, bool a_ShouldIgnoreDimensionChecks) override;
|
||||||
virtual void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) override {} // This protocol doesn't support such message
|
virtual void SendExperience (void) override;
|
||||||
virtual void SendSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch) override;
|
virtual void SendExperienceOrb (const cExpOrb & a_ExpOrb) override;
|
||||||
virtual void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) override;
|
virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override;
|
||||||
virtual void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock) override;
|
virtual void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) override {} // This protocol doesn't support such message
|
||||||
virtual void SendSpawnMob (const cMonster & a_Mob) override;
|
virtual void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) override {} // This protocol doesn't support such message
|
||||||
virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch) override;
|
virtual void SendSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch) override;
|
||||||
virtual void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType, char a_VehicleSubType) override;
|
virtual void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) override;
|
||||||
virtual void SendStatistics (const cStatManager & a_Manager) override;
|
virtual void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock) override;
|
||||||
virtual void SendTabCompletionResults(const AStringVector & a_Results) override;
|
virtual void SendSpawnMob (const cMonster & a_Mob) override;
|
||||||
virtual void SendTeleportEntity (const cEntity & a_Entity) override;
|
virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch) override;
|
||||||
virtual void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
virtual void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType, char a_VehicleSubType) override;
|
||||||
virtual void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay, bool a_DoDaylightCycle) override;
|
virtual void SendStatistics (const cStatManager & a_Manager) override;
|
||||||
virtual void SendUnloadChunk (int a_ChunkX, int a_ChunkZ) override;
|
virtual void SendTabCompletionResults (const AStringVector & a_Results) override;
|
||||||
virtual void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity) override {}
|
virtual void SendTeleportEntity (const cEntity & a_Entity) override;
|
||||||
virtual void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) override;
|
virtual void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
||||||
virtual void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
virtual void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay, bool a_DoDaylightCycle) override;
|
||||||
virtual void SendWeather (eWeather a_Weather) override;
|
virtual void SendUnloadChunk (int a_ChunkX, int a_ChunkZ) override;
|
||||||
virtual void SendWholeInventory (const cWindow & a_Window) override;
|
virtual void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity) override {}
|
||||||
virtual void SendWindowClose (const cWindow & a_Window) override;
|
virtual void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) override;
|
||||||
virtual void SendWindowOpen (const cWindow & a_Window) override;
|
virtual void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
||||||
virtual void SendWindowProperty (const cWindow & a_Window, int a_Property, int a_Value) override;
|
virtual void SendWeather (eWeather a_Weather) override;
|
||||||
|
virtual void SendWholeInventory (const cWindow & a_Window) override;
|
||||||
|
virtual void SendWindowClose (const cWindow & a_Window) override;
|
||||||
|
virtual void SendWindowOpen (const cWindow & a_Window) override;
|
||||||
|
virtual void SendWindowProperty (const cWindow & a_Window, int a_Property, int a_Value) override;
|
||||||
|
|
||||||
virtual AString GetAuthServerID(void) override;
|
virtual AString GetAuthServerID(void) override;
|
||||||
|
|
||||||
|
@ -176,7 +176,7 @@ void cProtocol132::SendChunkData(int a_ChunkX, int a_ChunkZ, cChunkDataSerialize
|
|||||||
// Pre-chunk not used in 1.3.2. Finally.
|
// Pre-chunk not used in 1.3.2. Finally.
|
||||||
|
|
||||||
// Send the chunk data:
|
// Send the chunk data:
|
||||||
AString Serialized = a_Serializer.Serialize(cChunkDataSerializer::RELEASE_1_3_2);
|
AString Serialized = a_Serializer.Serialize(cChunkDataSerializer::RELEASE_1_3_2, a_ChunkX, a_ChunkZ);
|
||||||
WriteByte(PACKET_CHUNK_DATA);
|
WriteByte(PACKET_CHUNK_DATA);
|
||||||
WriteInt (a_ChunkX);
|
WriteInt (a_ChunkX);
|
||||||
WriteInt (a_ChunkZ);
|
WriteInt (a_ChunkZ);
|
||||||
|
@ -132,12 +132,6 @@ void cProtocol142::SendSoundParticleEffect(int a_EffectID, int a_SrcX, int a_Src
|
|||||||
|
|
||||||
void cProtocol142::SendTimeUpdate(Int64 a_WorldAge, Int64 a_TimeOfDay, bool a_DoDaylightCycle)
|
void cProtocol142::SendTimeUpdate(Int64 a_WorldAge, Int64 a_TimeOfDay, bool a_DoDaylightCycle)
|
||||||
{
|
{
|
||||||
if (!a_DoDaylightCycle)
|
|
||||||
{
|
|
||||||
// When writing a "-" before the number the client ignores it but it will stop the client-side time expiration.
|
|
||||||
a_TimeOfDay = std::min(-a_TimeOfDay, -1LL);
|
|
||||||
}
|
|
||||||
|
|
||||||
cCSLock Lock(m_CSPacket);
|
cCSLock Lock(m_CSPacket);
|
||||||
WriteByte (PACKET_UPDATE_TIME);
|
WriteByte (PACKET_UPDATE_TIME);
|
||||||
WriteInt64(a_WorldAge);
|
WriteInt64(a_WorldAge);
|
||||||
|
@ -80,7 +80,7 @@ void cProtocol150::SendWindowOpen(const cWindow & a_Window)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocol150::SendParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount)
|
void cProtocol150::SendParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CSPacket);
|
cCSLock Lock(m_CSPacket);
|
||||||
WriteByte(PACKET_PARTICLE_EFFECT);
|
WriteByte(PACKET_PARTICLE_EFFECT);
|
||||||
@ -92,7 +92,7 @@ void cProtocol150::SendParticleEffect(const AString & a_ParticleName, float a_Sr
|
|||||||
WriteFloat(a_OffsetY);
|
WriteFloat(a_OffsetY);
|
||||||
WriteFloat(a_OffsetZ);
|
WriteFloat(a_OffsetZ);
|
||||||
WriteFloat(a_ParticleData);
|
WriteFloat(a_ParticleData);
|
||||||
WriteInt(a_ParticleAmmount);
|
WriteInt(a_ParticleAmount);
|
||||||
Flush();
|
Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ public:
|
|||||||
cProtocol150(cClientHandle * a_Client);
|
cProtocol150(cClientHandle * a_Client);
|
||||||
|
|
||||||
virtual void SendWindowOpen (const cWindow & a_Window) override;
|
virtual void SendWindowOpen (const cWindow & a_Window) override;
|
||||||
virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount) override;
|
virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount) override;
|
||||||
virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override;
|
virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override;
|
||||||
virtual void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) override;
|
virtual void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) override;
|
||||||
virtual void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) override;
|
virtual void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) override;
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
|
|
||||||
// Protocol17x.cpp
|
// Protocol17x.cpp
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Implements the 1.7.x protocol classes:
|
Implements the 1.7.x protocol classes:
|
||||||
- cProtocol172
|
- cProtocol172
|
||||||
- release 1.7.2 protocol (#4)
|
- release 1.7.2 protocol (#4)
|
||||||
(others may be added later in the future for the 1.7 release series)
|
- cProtocol176
|
||||||
|
- release 1.7.6 protocol (#5)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
@ -251,100 +253,12 @@ void cProtocol172::SendChat(const cCompositeChat & a_Message)
|
|||||||
{
|
{
|
||||||
ASSERT(m_State == 3); // In game mode?
|
ASSERT(m_State == 3); // In game mode?
|
||||||
|
|
||||||
// Compose the complete Json string to send:
|
|
||||||
Json::Value msg;
|
|
||||||
cWorld * World = m_Client->GetPlayer()->GetWorld();
|
cWorld * World = m_Client->GetPlayer()->GetWorld();
|
||||||
msg["text"] = cClientHandle::FormatMessageType((World == NULL) ? false : World->ShouldUseChatPrefixes(), a_Message.GetMessageType(), a_Message.GetAdditionalMessageTypeData()); // The client crashes without this field being present
|
bool ShouldUseChatPrefixes = (World == NULL) ? false : World->ShouldUseChatPrefixes();
|
||||||
const cCompositeChat::cParts & Parts = a_Message.GetParts();
|
|
||||||
for (cCompositeChat::cParts::const_iterator itr = Parts.begin(), end = Parts.end(); itr != end; ++itr)
|
|
||||||
{
|
|
||||||
Json::Value Part;
|
|
||||||
switch ((*itr)->m_PartType)
|
|
||||||
{
|
|
||||||
case cCompositeChat::ptText:
|
|
||||||
{
|
|
||||||
Part["text"] = (*itr)->m_Text;
|
|
||||||
AddChatPartStyle(Part, (*itr)->m_Style);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case cCompositeChat::ptClientTranslated:
|
|
||||||
{
|
|
||||||
const cCompositeChat::cClientTranslatedPart & p = (const cCompositeChat::cClientTranslatedPart &)**itr;
|
|
||||||
Part["translate"] = p.m_Text;
|
|
||||||
Json::Value With;
|
|
||||||
for (AStringVector::const_iterator itrW = p.m_Parameters.begin(), endW = p.m_Parameters.end(); itrW != endW; ++itr)
|
|
||||||
{
|
|
||||||
With.append(*itrW);
|
|
||||||
}
|
|
||||||
if (!p.m_Parameters.empty())
|
|
||||||
{
|
|
||||||
Part["with"] = With;
|
|
||||||
}
|
|
||||||
AddChatPartStyle(Part, p.m_Style);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case cCompositeChat::ptUrl:
|
|
||||||
{
|
|
||||||
const cCompositeChat::cUrlPart & p = (const cCompositeChat::cUrlPart &)**itr;
|
|
||||||
Part["text"] = p.m_Text;
|
|
||||||
Json::Value Url;
|
|
||||||
Url["action"] = "open_url";
|
|
||||||
Url["value"] = p.m_Url;
|
|
||||||
Part["clickEvent"] = Url;
|
|
||||||
AddChatPartStyle(Part, p.m_Style);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case cCompositeChat::ptSuggestCommand:
|
|
||||||
case cCompositeChat::ptRunCommand:
|
|
||||||
{
|
|
||||||
const cCompositeChat::cCommandPart & p = (const cCompositeChat::cCommandPart &)**itr;
|
|
||||||
Part["text"] = p.m_Text;
|
|
||||||
Json::Value Cmd;
|
|
||||||
Cmd["action"] = (p.m_PartType == cCompositeChat::ptRunCommand) ? "run_command" : "suggest_command";
|
|
||||||
Cmd["value"] = p.m_Command;
|
|
||||||
Part["clickEvent"] = Cmd;
|
|
||||||
AddChatPartStyle(Part, p.m_Style);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case cCompositeChat::ptShowAchievement:
|
|
||||||
{
|
|
||||||
const cCompositeChat::cShowAchievementPart & p = (const cCompositeChat::cShowAchievementPart &)**itr;
|
|
||||||
Part["translate"] = "chat.type.achievement";
|
|
||||||
|
|
||||||
Json::Value Ach;
|
|
||||||
Ach["action"] = "show_achievement";
|
|
||||||
Ach["value"] = p.m_Text;
|
|
||||||
|
|
||||||
Json::Value AchColourAndName;
|
|
||||||
AchColourAndName["color"] = "green";
|
|
||||||
AchColourAndName["translate"] = p.m_Text;
|
|
||||||
AchColourAndName["hoverEvent"] = Ach;
|
|
||||||
|
|
||||||
Json::Value Extra;
|
|
||||||
Extra.append(AchColourAndName);
|
|
||||||
|
|
||||||
Json::Value Name;
|
|
||||||
Name["text"] = p.m_PlayerName;
|
|
||||||
|
|
||||||
Json::Value With;
|
|
||||||
With.append(Name);
|
|
||||||
With.append(Extra);
|
|
||||||
|
|
||||||
Part["with"] = With;
|
|
||||||
AddChatPartStyle(Part, p.m_Style);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
msg["extra"].append(Part);
|
|
||||||
} // for itr - Parts[]
|
|
||||||
|
|
||||||
// Send the message to the client:
|
// Send the message to the client:
|
||||||
cPacketizer Pkt(*this, 0x02);
|
cPacketizer Pkt(*this, 0x02);
|
||||||
Pkt.WriteString(msg.toStyledString());
|
Pkt.WriteString(a_Message.CreateJsonString(ShouldUseChatPrefixes));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -357,7 +271,7 @@ void cProtocol172::SendChunkData(int a_ChunkX, int a_ChunkZ, cChunkDataSerialize
|
|||||||
|
|
||||||
// Serialize first, before creating the Packetizer (the packetizer locks a CS)
|
// Serialize first, before creating the Packetizer (the packetizer locks a CS)
|
||||||
// This contains the flags and bitmasks, too
|
// This contains the flags and bitmasks, too
|
||||||
const AString & ChunkData = a_Serializer.Serialize(cChunkDataSerializer::RELEASE_1_3_2);
|
const AString & ChunkData = a_Serializer.Serialize(cChunkDataSerializer::RELEASE_1_3_2, a_ChunkX, a_ChunkZ);
|
||||||
|
|
||||||
cPacketizer Pkt(*this, 0x21); // Chunk Data packet
|
cPacketizer Pkt(*this, 0x21); // Chunk Data packet
|
||||||
Pkt.WriteInt(a_ChunkX);
|
Pkt.WriteInt(a_ChunkX);
|
||||||
@ -726,7 +640,7 @@ void cProtocol172::SendPaintingSpawn(const cPainting & a_Painting)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocol172::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length)
|
void cProtocol172::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length, unsigned int m_Scale)
|
||||||
{
|
{
|
||||||
ASSERT(m_State == 3); // In game mode?
|
ASSERT(m_State == 3); // In game mode?
|
||||||
|
|
||||||
@ -748,7 +662,7 @@ void cProtocol172::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colo
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocol172::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decorators)
|
void cProtocol172::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decorators, unsigned int m_Scale)
|
||||||
{
|
{
|
||||||
ASSERT(m_State == 3); // In game mode?
|
ASSERT(m_State == 3); // In game mode?
|
||||||
|
|
||||||
@ -786,7 +700,6 @@ void cProtocol172::SendMapInfo(int a_ID, unsigned int a_Scale)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocol172::SendPickupSpawn(const cPickup & a_Pickup)
|
void cProtocol172::SendPickupSpawn(const cPickup & a_Pickup)
|
||||||
{
|
{
|
||||||
ASSERT(m_State == 3); // In game mode?
|
ASSERT(m_State == 3); // In game mode?
|
||||||
@ -857,7 +770,7 @@ void cProtocol172::SendEntityAnimation(const cEntity & a_Entity, char a_Animatio
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocol172::SendParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount)
|
void cProtocol172::SendParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount)
|
||||||
{
|
{
|
||||||
ASSERT(m_State == 3); // In game mode?
|
ASSERT(m_State == 3); // In game mode?
|
||||||
|
|
||||||
@ -870,21 +783,78 @@ void cProtocol172::SendParticleEffect(const AString & a_ParticleName, float a_Sr
|
|||||||
Pkt.WriteFloat(a_OffsetY);
|
Pkt.WriteFloat(a_OffsetY);
|
||||||
Pkt.WriteFloat(a_OffsetZ);
|
Pkt.WriteFloat(a_OffsetZ);
|
||||||
Pkt.WriteFloat(a_ParticleData);
|
Pkt.WriteFloat(a_ParticleData);
|
||||||
Pkt.WriteInt(a_ParticleAmmount);
|
Pkt.WriteInt(a_ParticleAmount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocol172::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline)
|
void cProtocol172::SendPlayerListAddPlayer(const cPlayer & a_Player)
|
||||||
{
|
{
|
||||||
ASSERT(m_State == 3); // In game mode?
|
ASSERT(m_State == 3); // In game mode?
|
||||||
|
|
||||||
cPacketizer Pkt(*this, 0x38); // Playerlist Item packet
|
cPacketizer Pkt(*this, 0x38); // Playerlist Item packet
|
||||||
Pkt.WriteString(a_Player.GetName());
|
Pkt.WriteString(a_Player.GetName());
|
||||||
Pkt.WriteBool(a_IsOnline);
|
Pkt.WriteBool(true);
|
||||||
Pkt.WriteShort(a_IsOnline ? a_Player.GetClientHandle()->GetPing() : 0);
|
Pkt.WriteShort(a_Player.GetClientHandle()->GetPing());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cProtocol172::SendPlayerListRemovePlayer(const cPlayer & a_Player)
|
||||||
|
{
|
||||||
|
ASSERT(m_State == 3); // In game mode?
|
||||||
|
|
||||||
|
cPacketizer Pkt(*this, 0x38);
|
||||||
|
Pkt.WriteString(a_Player.GetName());
|
||||||
|
Pkt.WriteBool(false);
|
||||||
|
Pkt.WriteShort(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cProtocol172::SendPlayerListUpdateGameMode(const cPlayer & a_Player)
|
||||||
|
{
|
||||||
|
// Not implemented in this protocol version
|
||||||
|
UNUSED(a_Player);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cProtocol172::SendPlayerListUpdatePing(const cPlayer & a_Player)
|
||||||
|
{
|
||||||
|
// It is a simple add player packet in this protocol.
|
||||||
|
SendPlayerListAddPlayer(a_Player);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cProtocol172::SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_OldListName)
|
||||||
|
{
|
||||||
|
ASSERT(m_State == 3); // In game mode?
|
||||||
|
if (a_OldListName == a_Player.GetName())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the old name from the tablist:
|
||||||
|
{
|
||||||
|
cPacketizer Pkt(*this, 0x38);
|
||||||
|
Pkt.WriteString(a_OldListName);
|
||||||
|
Pkt.WriteBool(false);
|
||||||
|
Pkt.WriteShort(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
SendPlayerListAddPlayer(a_Player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1936,7 +1906,7 @@ void cProtocol172::HandlePacketClientSettings(cByteBuffer & a_ByteBuffer)
|
|||||||
HANDLE_READ(a_ByteBuffer, ReadByte, Byte, ShowCape);
|
HANDLE_READ(a_ByteBuffer, ReadByte, Byte, ShowCape);
|
||||||
|
|
||||||
m_Client->SetLocale(Locale);
|
m_Client->SetLocale(Locale);
|
||||||
// TODO: handle in m_Client
|
// TODO: Do anything with the other values.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2290,7 +2260,6 @@ void cProtocol172::SendData(const char * a_Data, size_t a_Size)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cProtocol172::ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item)
|
bool cProtocol172::ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item)
|
||||||
{
|
{
|
||||||
HANDLE_PACKET_READ(a_ByteBuffer, ReadBEShort, short, ItemType);
|
HANDLE_PACKET_READ(a_ByteBuffer, ReadBEShort, short, ItemType);
|
||||||
@ -2435,85 +2404,6 @@ void cProtocol172::StartEncryption(const Byte * a_Key)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocol172::AddChatPartStyle(Json::Value & a_Value, const AString & a_PartStyle)
|
|
||||||
{
|
|
||||||
size_t len = a_PartStyle.length();
|
|
||||||
for (size_t i = 0; i < len; i++)
|
|
||||||
{
|
|
||||||
switch (a_PartStyle[i])
|
|
||||||
{
|
|
||||||
case 'b':
|
|
||||||
{
|
|
||||||
// bold
|
|
||||||
a_Value["bold"] = Json::Value(true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'i':
|
|
||||||
{
|
|
||||||
// italic
|
|
||||||
a_Value["italic"] = Json::Value(true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'u':
|
|
||||||
{
|
|
||||||
// Underlined
|
|
||||||
a_Value["underlined"] = Json::Value(true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 's':
|
|
||||||
{
|
|
||||||
// strikethrough
|
|
||||||
a_Value["strikethrough"] = Json::Value(true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'o':
|
|
||||||
{
|
|
||||||
// obfuscated
|
|
||||||
a_Value["obfuscated"] = Json::Value(true);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case '@':
|
|
||||||
{
|
|
||||||
// Color, specified by the next char:
|
|
||||||
i++;
|
|
||||||
if (i >= len)
|
|
||||||
{
|
|
||||||
// String too short, didn't contain a color
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
switch (a_PartStyle[i])
|
|
||||||
{
|
|
||||||
case '0': a_Value["color"] = Json::Value("black"); break;
|
|
||||||
case '1': a_Value["color"] = Json::Value("dark_blue"); break;
|
|
||||||
case '2': a_Value["color"] = Json::Value("dark_green"); break;
|
|
||||||
case '3': a_Value["color"] = Json::Value("dark_aqua"); break;
|
|
||||||
case '4': a_Value["color"] = Json::Value("dark_red"); break;
|
|
||||||
case '5': a_Value["color"] = Json::Value("dark_purple"); break;
|
|
||||||
case '6': a_Value["color"] = Json::Value("gold"); break;
|
|
||||||
case '7': a_Value["color"] = Json::Value("gray"); break;
|
|
||||||
case '8': a_Value["color"] = Json::Value("dark_gray"); break;
|
|
||||||
case '9': a_Value["color"] = Json::Value("blue"); break;
|
|
||||||
case 'a': a_Value["color"] = Json::Value("green"); break;
|
|
||||||
case 'b': a_Value["color"] = Json::Value("aqua"); break;
|
|
||||||
case 'c': a_Value["color"] = Json::Value("red"); break;
|
|
||||||
case 'd': a_Value["color"] = Json::Value("light_purple"); break;
|
|
||||||
case 'e': a_Value["color"] = Json::Value("yellow"); break;
|
|
||||||
case 'f': a_Value["color"] = Json::Value("white"); break;
|
|
||||||
} // switch (color)
|
|
||||||
} // case '@'
|
|
||||||
} // switch (Style[i])
|
|
||||||
} // for i - a_PartStyle[]
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// cProtocol172::cPacketizer:
|
// cProtocol172::cPacketizer:
|
||||||
|
|
||||||
@ -2523,6 +2413,7 @@ cProtocol172::cPacketizer::~cPacketizer()
|
|||||||
|
|
||||||
// Send the packet length
|
// Send the packet length
|
||||||
UInt32 PacketLen = (UInt32)m_Out.GetUsedSpace();
|
UInt32 PacketLen = (UInt32)m_Out.GetUsedSpace();
|
||||||
|
|
||||||
m_Protocol.m_OutPacketLenBuffer.WriteVarInt(PacketLen);
|
m_Protocol.m_OutPacketLenBuffer.WriteVarInt(PacketLen);
|
||||||
m_Protocol.m_OutPacketLenBuffer.ReadAll(DataToSend);
|
m_Protocol.m_OutPacketLenBuffer.ReadAll(DataToSend);
|
||||||
m_Protocol.SendData(DataToSend.data(), DataToSend.size());
|
m_Protocol.SendData(DataToSend.data(), DataToSend.size());
|
||||||
@ -2617,6 +2508,7 @@ void cProtocol172::cPacketizer::WriteItem(const cItem & a_Item)
|
|||||||
cFireworkItem::WriteToNBTCompound(a_Item.m_FireworkItem, Writer, (ENUM_ITEM_ID)a_Item.m_ItemType);
|
cFireworkItem::WriteToNBTCompound(a_Item.m_FireworkItem, Writer, (ENUM_ITEM_ID)a_Item.m_ItemType);
|
||||||
}
|
}
|
||||||
Writer.Finish();
|
Writer.Finish();
|
||||||
|
|
||||||
AString Compressed;
|
AString Compressed;
|
||||||
CompressStringGZIP(Writer.GetResult().data(), Writer.GetResult().size(), Compressed);
|
CompressStringGZIP(Writer.GetResult().data(), Writer.GetResult().size(), Compressed);
|
||||||
WriteShort((short)Compressed.size());
|
WriteShort((short)Compressed.size());
|
||||||
@ -2626,6 +2518,7 @@ void cProtocol172::cPacketizer::WriteItem(const cItem & a_Item)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocol172::cPacketizer::WriteBlockEntity(const cBlockEntity & a_BlockEntity)
|
void cProtocol172::cPacketizer::WriteBlockEntity(const cBlockEntity & a_BlockEntity)
|
||||||
{
|
{
|
||||||
cFastNBTWriter Writer;
|
cFastNBTWriter Writer;
|
||||||
@ -2837,7 +2730,7 @@ void cProtocol172::cPacketizer::WriteEntityMetadata(const cEntity & a_Entity)
|
|||||||
WriteByte(0xA2);
|
WriteByte(0xA2);
|
||||||
WriteItem(Frame.GetItem());
|
WriteItem(Frame.GetItem());
|
||||||
WriteByte(0x3);
|
WriteByte(0x3);
|
||||||
WriteByte(Frame.GetRotation());
|
WriteByte(Frame.GetRotation() / 2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: break;
|
default: break;
|
||||||
|
@ -5,7 +5,8 @@
|
|||||||
Declares the 1.7.x protocol classes:
|
Declares the 1.7.x protocol classes:
|
||||||
- cProtocol172
|
- cProtocol172
|
||||||
- release 1.7.2 protocol (#4)
|
- release 1.7.2 protocol (#4)
|
||||||
(others may be added later in the future for the 1.7 release series)
|
- cProtocol176
|
||||||
|
- release 1.7.6 protocol (#5)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@ -60,76 +61,80 @@ public:
|
|||||||
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 (int a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage) override;
|
virtual void SendBlockBreakAnim (int a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage) override;
|
||||||
virtual void SendBlockChange (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;
|
virtual void SendBlockChange (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;
|
||||||
virtual void SendBlockChanges (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes) override;
|
virtual void SendBlockChanges (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes) override;
|
||||||
virtual void SendChat (const AString & a_Message) override;
|
virtual void SendChat (const AString & a_Message) override;
|
||||||
virtual void SendChat (const cCompositeChat & a_Message) override;
|
virtual void SendChat (const cCompositeChat & a_Message) override;
|
||||||
virtual void SendChunkData (int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer) override;
|
virtual void SendChunkData (int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer) override;
|
||||||
virtual void SendCollectEntity (const cEntity & a_Entity, const cPlayer & a_Player) override;
|
virtual void SendCollectEntity (const cEntity & a_Entity, const cPlayer & a_Player) override;
|
||||||
virtual void SendDestroyEntity (const cEntity & a_Entity) override;
|
virtual void SendDestroyEntity (const cEntity & a_Entity) override;
|
||||||
virtual void SendDisconnect (const AString & a_Reason) override;
|
virtual void SendDisconnect (const AString & a_Reason) override;
|
||||||
virtual void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) override;
|
virtual void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) override;
|
||||||
virtual void SendEditSign (int a_BlockX, int a_BlockY, int a_BlockZ) override; ///< Request the client to open up the sign editor for the sign (1.6+)
|
virtual void SendEditSign (int a_BlockX, int a_BlockY, int a_BlockZ) override; ///< Request the client to open up the sign editor for the sign (1.6+)
|
||||||
virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override;
|
virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override;
|
||||||
virtual void SendEntityEffect (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration) override;
|
virtual void SendEntityEffect (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration) override;
|
||||||
virtual void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) override;
|
virtual void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) override;
|
||||||
virtual void SendEntityHeadLook (const cEntity & a_Entity) override;
|
virtual void SendEntityHeadLook (const cEntity & a_Entity) override;
|
||||||
virtual void SendEntityLook (const cEntity & a_Entity) override;
|
virtual void SendEntityLook (const cEntity & a_Entity) override;
|
||||||
virtual void SendEntityMetadata (const cEntity & a_Entity) override;
|
virtual void SendEntityMetadata (const cEntity & a_Entity) override;
|
||||||
virtual void SendEntityProperties (const cEntity & a_Entity) override;
|
virtual void SendEntityProperties (const cEntity & a_Entity) override;
|
||||||
virtual void SendEntityRelMove (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
|
virtual void SendEntityRelMove (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
|
||||||
virtual void SendEntityRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
|
virtual void SendEntityRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
|
||||||
virtual void SendEntityStatus (const cEntity & a_Entity, char a_Status) override;
|
virtual void SendEntityStatus (const cEntity & a_Entity, char a_Status) override;
|
||||||
virtual void SendEntityVelocity (const cEntity & a_Entity) override;
|
virtual void SendEntityVelocity (const cEntity & a_Entity) override;
|
||||||
virtual void SendExperience (void) override;
|
virtual void SendExperience (void) override;
|
||||||
virtual void SendExperienceOrb (const cExpOrb & a_ExpOrb) override;
|
virtual void SendExperienceOrb (const cExpOrb & a_ExpOrb) override;
|
||||||
virtual void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion) override;
|
virtual void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion) override;
|
||||||
virtual void SendGameMode (eGameMode a_GameMode) override;
|
virtual void SendGameMode (eGameMode a_GameMode) override;
|
||||||
virtual void SendHealth (void) override;
|
virtual void SendHealth (void) override;
|
||||||
virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) override;
|
virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) override;
|
||||||
virtual void SendKeepAlive (int a_PingID) override;
|
virtual void SendKeepAlive (int a_PingID) override;
|
||||||
virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) override;
|
virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) override;
|
||||||
virtual void SendLoginSuccess (void) override;
|
virtual void SendLoginSuccess (void) override;
|
||||||
virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) override;
|
virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length, unsigned int m_Scale) override;
|
||||||
virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators) override;
|
virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators, unsigned int m_Scale) override;
|
||||||
virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override;
|
virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override;
|
||||||
virtual void SendPaintingSpawn (const cPainting & a_Painting) override;
|
virtual void SendPaintingSpawn (const cPainting & a_Painting) override;
|
||||||
virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount) override;
|
virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount) override;
|
||||||
virtual void SendPickupSpawn (const cPickup & a_Pickup) override;
|
virtual void SendPickupSpawn (const cPickup & a_Pickup) override;
|
||||||
virtual void SendPlayerAbilities (void) override;
|
virtual void SendPlayerAbilities (void) override;
|
||||||
virtual void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline) override;
|
virtual void SendPlayerListAddPlayer (const cPlayer & a_Player) override;
|
||||||
virtual void SendPlayerMaxSpeed (void) override;
|
virtual void SendPlayerListRemovePlayer (const cPlayer & a_Player) override;
|
||||||
virtual void SendPlayerMoveLook (void) override;
|
virtual void SendPlayerListUpdateGameMode (const cPlayer & a_Player) override;
|
||||||
virtual void SendPlayerPosition (void) override;
|
virtual void SendPlayerListUpdatePing (const cPlayer & a_Player) override;
|
||||||
virtual void SendPlayerSpawn (const cPlayer & a_Player) override;
|
virtual void SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_OldListName) override;
|
||||||
virtual void SendPluginMessage (const AString & a_Channel, const AString & a_Message) override;
|
virtual void SendPlayerMaxSpeed (void) override;
|
||||||
virtual void SendRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID) override;
|
virtual void SendPlayerMoveLook (void) override;
|
||||||
virtual void SendRespawn (eDimension a_Dimension, bool a_ShouldIgnoreDimensionChecks) override;
|
virtual void SendPlayerPosition (void) override;
|
||||||
virtual void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) override;
|
virtual void SendPlayerSpawn (const cPlayer & a_Player) override;
|
||||||
virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override;
|
virtual void SendPluginMessage (const AString & a_Channel, const AString & a_Message) override;
|
||||||
virtual void SendSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch) override;
|
virtual void SendRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID) override;
|
||||||
virtual void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) override;
|
virtual void SendRespawn (eDimension a_Dimension, bool a_ShouldIgnoreDimensionChecks) override;
|
||||||
virtual void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock) override;
|
virtual void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) override;
|
||||||
virtual void SendSpawnMob (const cMonster & a_Mob) override;
|
virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override;
|
||||||
virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch) override;
|
virtual void SendSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch) override;
|
||||||
virtual void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType, char a_VehicleSubType) override;
|
virtual void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) override;
|
||||||
virtual void SendStatistics (const cStatManager & a_Manager) override;
|
virtual void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock) override;
|
||||||
virtual void SendTabCompletionResults(const AStringVector & a_Results) override;
|
virtual void SendSpawnMob (const cMonster & a_Mob) override;
|
||||||
virtual void SendTeleportEntity (const cEntity & a_Entity) override;
|
virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch) override;
|
||||||
virtual void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
virtual void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType, char a_VehicleSubType) override;
|
||||||
virtual void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay, bool a_DoDaylightCycle) override;
|
virtual void SendStatistics (const cStatManager & a_Manager) override;
|
||||||
virtual void SendUnloadChunk (int a_ChunkX, int a_ChunkZ) override;
|
virtual void SendTabCompletionResults (const AStringVector & a_Results) override;
|
||||||
virtual void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity) override;
|
virtual void SendTeleportEntity (const cEntity & a_Entity) override;
|
||||||
virtual void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) override;
|
virtual void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
||||||
virtual void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
virtual void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay, bool a_DoDaylightCycle) override;
|
||||||
virtual void SendWeather (eWeather a_Weather) override;
|
virtual void SendUnloadChunk (int a_ChunkX, int a_ChunkZ) override;
|
||||||
virtual void SendWholeInventory (const cWindow & a_Window) override;
|
virtual void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity) override;
|
||||||
virtual void SendWindowClose (const cWindow & a_Window) override;
|
virtual void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) override;
|
||||||
virtual void SendWindowOpen (const cWindow & a_Window) override;
|
virtual void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
||||||
virtual void SendWindowProperty (const cWindow & a_Window, int a_Property, int a_Value) override;
|
virtual void SendWeather (eWeather a_Weather) override;
|
||||||
|
virtual void SendWholeInventory (const cWindow & a_Window) override;
|
||||||
|
virtual void SendWindowClose (const cWindow & a_Window) override;
|
||||||
|
virtual void SendWindowOpen (const cWindow & a_Window) override;
|
||||||
|
virtual void SendWindowProperty (const cWindow & a_Window, int a_Property, int a_Value) override;
|
||||||
|
|
||||||
virtual AString GetAuthServerID(void) override { return m_AuthServerID; }
|
virtual AString GetAuthServerID(void) override { return m_AuthServerID; }
|
||||||
|
|
||||||
@ -258,12 +263,12 @@ protected:
|
|||||||
bool HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType);
|
bool HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType);
|
||||||
|
|
||||||
// Packet handlers while in the Status state (m_State == 1):
|
// Packet handlers while in the Status state (m_State == 1):
|
||||||
void HandlePacketStatusPing (cByteBuffer & a_ByteBuffer);
|
void HandlePacketStatusPing(cByteBuffer & a_ByteBuffer);
|
||||||
virtual void HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer);
|
virtual void HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer);
|
||||||
|
|
||||||
// Packet handlers while in the Login state (m_State == 2):
|
// Packet handlers while in the Login state (m_State == 2):
|
||||||
void HandlePacketLoginEncryptionResponse(cByteBuffer & a_ByteBuffer);
|
void HandlePacketLoginEncryptionResponse(cByteBuffer & a_ByteBuffer);
|
||||||
void HandlePacketLoginStart (cByteBuffer & a_ByteBuffer);
|
void HandlePacketLoginStart(cByteBuffer & a_ByteBuffer);
|
||||||
|
|
||||||
// Packet handlers while in the Game state (m_State == 3):
|
// Packet handlers while in the Game state (m_State == 3):
|
||||||
void HandlePacketAnimation (cByteBuffer & a_ByteBuffer);
|
void HandlePacketAnimation (cByteBuffer & a_ByteBuffer);
|
||||||
@ -300,15 +305,13 @@ protected:
|
|||||||
void SendCompass(const cWorld & a_World);
|
void SendCompass(const cWorld & a_World);
|
||||||
|
|
||||||
/** Reads an item out of the received data, sets a_Item to the values read. Returns false if not enough received data */
|
/** Reads an item out of the received data, sets a_Item to the values read. Returns false if not enough received data */
|
||||||
bool ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item);
|
virtual bool ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item);
|
||||||
|
|
||||||
/** Parses item metadata as read by ReadItem(), into the item enchantments. */
|
/** Parses item metadata as read by ReadItem(), into the item enchantments. */
|
||||||
void ParseItemMetadata(cItem & a_Item, const AString & a_Metadata);
|
void ParseItemMetadata(cItem & a_Item, const AString & a_Metadata);
|
||||||
|
|
||||||
void StartEncryption(const Byte * a_Key);
|
void StartEncryption(const Byte * a_Key);
|
||||||
|
|
||||||
/** Adds the chat part's style (represented by the part's stylestring) into the Json object. */
|
|
||||||
void AddChatPartStyle(Json::Value & a_Value, const AString & a_PartStyle);
|
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
3235
src/Protocol/Protocol18x.cpp
Normal file
3235
src/Protocol/Protocol18x.cpp
Normal file
File diff suppressed because it is too large
Load Diff
335
src/Protocol/Protocol18x.h
Normal file
335
src/Protocol/Protocol18x.h
Normal file
@ -0,0 +1,335 @@
|
|||||||
|
|
||||||
|
// Protocol18x.h
|
||||||
|
|
||||||
|
/*
|
||||||
|
Declares the 1.8.x protocol classes:
|
||||||
|
- cProtocol180
|
||||||
|
- release 1.8.0 protocol (#47)
|
||||||
|
(others may be added later in the future for the 1.8 release series)
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Protocol.h"
|
||||||
|
#include "../ByteBuffer.h"
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable:4127)
|
||||||
|
#pragma warning(disable:4244)
|
||||||
|
#pragma warning(disable:4231)
|
||||||
|
#pragma warning(disable:4189)
|
||||||
|
#pragma warning(disable:4702)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "PolarSSL++/AesCfb128Decryptor.h"
|
||||||
|
#include "PolarSSL++/AesCfb128Encryptor.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// fwd:
|
||||||
|
namespace Json
|
||||||
|
{
|
||||||
|
class Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cProtocol180 :
|
||||||
|
public cProtocol
|
||||||
|
{
|
||||||
|
typedef cProtocol super;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
cProtocol180(cClientHandle * a_Client, const AString & a_ServerAddress, UInt16 a_ServerPort, UInt32 a_State);
|
||||||
|
|
||||||
|
/** Called when client sends some data: */
|
||||||
|
virtual void DataReceived(const char * a_Data, size_t a_Size) override;
|
||||||
|
|
||||||
|
/** Sending stuff to clients (alphabetically sorted): */
|
||||||
|
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 SendBlockBreakAnim (int a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage) override;
|
||||||
|
virtual void SendBlockChange (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;
|
||||||
|
virtual void SendBlockChanges (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes) override;
|
||||||
|
virtual void SendChat (const AString & a_Message) override;
|
||||||
|
virtual void SendChat (const cCompositeChat & a_Message) override;
|
||||||
|
virtual void SendChunkData (int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer) override;
|
||||||
|
virtual void SendCollectEntity (const cEntity & a_Entity, const cPlayer & a_Player) override;
|
||||||
|
virtual void SendDestroyEntity (const cEntity & a_Entity) override;
|
||||||
|
virtual void SendDisconnect (const AString & a_Reason) override;
|
||||||
|
virtual void SendEditSign (int a_BlockX, int a_BlockY, int a_BlockZ) override; ///< Request the client to open up the sign editor for the sign (1.6+)
|
||||||
|
virtual void SendEntityEffect (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration) override;
|
||||||
|
virtual void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) override;
|
||||||
|
virtual void SendEntityHeadLook (const cEntity & a_Entity) override;
|
||||||
|
virtual void SendEntityLook (const cEntity & a_Entity) override;
|
||||||
|
virtual void SendEntityMetadata (const cEntity & a_Entity) override;
|
||||||
|
virtual void SendEntityProperties (const cEntity & a_Entity) override;
|
||||||
|
virtual void SendEntityRelMove (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
|
||||||
|
virtual void SendEntityRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
|
||||||
|
virtual void SendEntityStatus (const cEntity & a_Entity, char a_Status) override;
|
||||||
|
virtual void SendEntityVelocity (const cEntity & a_Entity) override;
|
||||||
|
virtual void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion) override;
|
||||||
|
virtual void SendGameMode (eGameMode a_GameMode) override;
|
||||||
|
virtual void SendHealth (void) override;
|
||||||
|
virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) override;
|
||||||
|
virtual void SendKeepAlive (int a_PingID) override;
|
||||||
|
virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) override;
|
||||||
|
virtual void SendLoginSuccess (void) override;
|
||||||
|
virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length, unsigned int m_Scale) override;
|
||||||
|
virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators, unsigned int m_Scale) override;
|
||||||
|
virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override;
|
||||||
|
virtual void SendPaintingSpawn (const cPainting & a_Painting) override;
|
||||||
|
virtual void SendPickupSpawn (const cPickup & a_Pickup) override;
|
||||||
|
virtual void SendPlayerAbilities (void) override;
|
||||||
|
virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override;
|
||||||
|
virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount) override;
|
||||||
|
virtual void SendPlayerListAddPlayer (const cPlayer & a_Player) override;
|
||||||
|
virtual void SendPlayerListRemovePlayer (const cPlayer & a_Player) override;
|
||||||
|
virtual void SendPlayerListUpdateGameMode (const cPlayer & a_Player) override;
|
||||||
|
virtual void SendPlayerListUpdatePing (const cPlayer & a_Player) override;
|
||||||
|
virtual void SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_OldListName) override;
|
||||||
|
virtual void SendPlayerMaxSpeed (void) override;
|
||||||
|
virtual void SendPlayerMoveLook (void) override;
|
||||||
|
virtual void SendPlayerPosition (void) override;
|
||||||
|
virtual void SendPlayerSpawn (const cPlayer & a_Player) override;
|
||||||
|
virtual void SendPluginMessage (const AString & a_Channel, const AString & a_Message) override;
|
||||||
|
virtual void SendRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID) override;
|
||||||
|
virtual void SendRespawn (eDimension a_Dimension, bool a_ShouldIgnoreDimensionChecks) override;
|
||||||
|
virtual void SendSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch) override;
|
||||||
|
virtual void SendExperience (void) override;
|
||||||
|
virtual void SendExperienceOrb (const cExpOrb & a_ExpOrb) override;
|
||||||
|
virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override;
|
||||||
|
virtual void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) override;
|
||||||
|
virtual void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) override;
|
||||||
|
virtual void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) override;
|
||||||
|
virtual void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock) override;
|
||||||
|
virtual void SendSpawnMob (const cMonster & a_Mob) override;
|
||||||
|
virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch) override;
|
||||||
|
virtual void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType, char a_VehicleSubType) override;
|
||||||
|
virtual void SendStatistics (const cStatManager & a_Manager) override;
|
||||||
|
virtual void SendTabCompletionResults (const AStringVector & a_Results) override;
|
||||||
|
virtual void SendTeleportEntity (const cEntity & a_Entity) override;
|
||||||
|
virtual void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
||||||
|
virtual void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay, bool a_DoDaylightCycle) override;
|
||||||
|
virtual void SendUnloadChunk (int a_ChunkX, int a_ChunkZ) override;
|
||||||
|
virtual void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity) override;
|
||||||
|
virtual void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) override;
|
||||||
|
virtual void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
||||||
|
virtual void SendWeather (eWeather a_Weather) override;
|
||||||
|
virtual void SendWholeInventory (const cWindow & a_Window) override;
|
||||||
|
virtual void SendWindowClose (const cWindow & a_Window) override;
|
||||||
|
virtual void SendWindowOpen (const cWindow & a_Window) override;
|
||||||
|
virtual void SendWindowProperty (const cWindow & a_Window, int a_Property, int a_Value) override;
|
||||||
|
|
||||||
|
virtual AString GetAuthServerID(void) override { return m_AuthServerID; }
|
||||||
|
|
||||||
|
/** Compress the packet. a_Packet must be without packet length.
|
||||||
|
a_Compressed will be set to the compressed packet includes packet length and data length.
|
||||||
|
If compression fails, the function returns false. */
|
||||||
|
static bool CompressPacket(const AString & a_Packet, AString & a_Compressed);
|
||||||
|
|
||||||
|
/** The 1.8 protocol use a particle id instead of a string. This function converts the name to the id. If the name is incorrect, it returns 0. */
|
||||||
|
static int GetParticleID(const AString & a_ParticleName);
|
||||||
|
|
||||||
|
/** Minecraft 1.8 use other locations to spawn the item frame. This function converts the 1.7 positions to 1.8 positions. */
|
||||||
|
static void FixItemFramePositions(int a_ObjectData, double & a_PosX, double & a_PosZ, double & a_Yaw);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/** Composes individual packets in the protocol's m_OutPacketBuffer; sends them upon being destructed */
|
||||||
|
class cPacketizer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cPacketizer(cProtocol180 & a_Protocol, UInt32 a_PacketType) :
|
||||||
|
m_Protocol(a_Protocol),
|
||||||
|
m_Out(a_Protocol.m_OutPacketBuffer),
|
||||||
|
m_Lock(a_Protocol.m_CSPacket)
|
||||||
|
{
|
||||||
|
m_Out.WriteVarInt(a_PacketType);
|
||||||
|
}
|
||||||
|
|
||||||
|
~cPacketizer();
|
||||||
|
|
||||||
|
void WriteBool(bool a_Value)
|
||||||
|
{
|
||||||
|
m_Out.WriteBool(a_Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteByte(Byte a_Value)
|
||||||
|
{
|
||||||
|
m_Out.WriteByte(a_Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteChar(char a_Value)
|
||||||
|
{
|
||||||
|
m_Out.WriteChar(a_Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteShort(short a_Value)
|
||||||
|
{
|
||||||
|
m_Out.WriteBEShort(a_Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteInt(int a_Value)
|
||||||
|
{
|
||||||
|
m_Out.WriteBEInt(a_Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteInt64(Int64 a_Value)
|
||||||
|
{
|
||||||
|
m_Out.WriteBEInt64(a_Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteFloat(float a_Value)
|
||||||
|
{
|
||||||
|
m_Out.WriteBEFloat(a_Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteDouble(double a_Value)
|
||||||
|
{
|
||||||
|
m_Out.WriteBEDouble(a_Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteVarInt(UInt32 a_Value)
|
||||||
|
{
|
||||||
|
m_Out.WriteVarInt(a_Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteString(const AString & a_Value)
|
||||||
|
{
|
||||||
|
m_Out.WriteVarUTF8String(a_Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WritePosition(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||||
|
{
|
||||||
|
m_Out.WritePosition(a_BlockX, a_BlockY, a_BlockZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteUUID(const AString & a_UUID);
|
||||||
|
|
||||||
|
void WriteBuf(const char * a_Data, size_t a_Size)
|
||||||
|
{
|
||||||
|
m_Out.Write(a_Data, a_Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteItem(const cItem & a_Item);
|
||||||
|
void WriteByteAngle(double a_Angle); // Writes the specified angle using a single byte
|
||||||
|
void WriteFPInt(double a_Value); // Writes the double value as a 27:5 fixed-point integer
|
||||||
|
void WriteEntityMetadata(const cEntity & a_Entity); // Writes the metadata for the specified entity, not including the terminating 0x7f
|
||||||
|
void WriteMobMetadata(const cMonster & a_Mob); // Writes the mob-specific metadata for the specified mob
|
||||||
|
void WriteEntityProperties(const cEntity & a_Entity); // Writes the entity properties for the specified entity, including the Count field
|
||||||
|
void WriteBlockEntity(const cBlockEntity & a_BlockEntity);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
cProtocol180 & m_Protocol;
|
||||||
|
cByteBuffer & m_Out;
|
||||||
|
cCSLock m_Lock;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
AString m_ServerAddress;
|
||||||
|
|
||||||
|
UInt16 m_ServerPort;
|
||||||
|
|
||||||
|
AString m_AuthServerID;
|
||||||
|
|
||||||
|
/** State of the protocol. 1 = status, 2 = login, 3 = game */
|
||||||
|
UInt32 m_State;
|
||||||
|
|
||||||
|
/** Buffer for the received data */
|
||||||
|
cByteBuffer m_ReceivedData;
|
||||||
|
|
||||||
|
/** Buffer for composing the outgoing packets, through cPacketizer */
|
||||||
|
cByteBuffer m_OutPacketBuffer;
|
||||||
|
|
||||||
|
/** Buffer for composing packet length (so that each cPacketizer instance doesn't allocate a new cPacketBuffer) */
|
||||||
|
cByteBuffer m_OutPacketLenBuffer;
|
||||||
|
|
||||||
|
bool m_IsEncrypted;
|
||||||
|
|
||||||
|
cAesCfb128Decryptor m_Decryptor;
|
||||||
|
cAesCfb128Encryptor m_Encryptor;
|
||||||
|
|
||||||
|
/** The logfile where the comm is logged, when g_ShouldLogComm is true */
|
||||||
|
cFile m_CommLogFile;
|
||||||
|
|
||||||
|
/** The dimension that was last sent to a player in a Respawn or Login packet.
|
||||||
|
Used to avoid Respawning into the same dimension, which confuses the client. */
|
||||||
|
eDimension m_LastSentDimension;
|
||||||
|
|
||||||
|
|
||||||
|
/** Adds the received (unencrypted) data to m_ReceivedData, parses complete packets */
|
||||||
|
void AddReceivedData(const char * a_Data, size_t a_Size);
|
||||||
|
|
||||||
|
/** Reads and handles the packet. The packet length and type have already been read.
|
||||||
|
Returns true if the packet was understood, false if it was an unknown packet
|
||||||
|
*/
|
||||||
|
bool HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType);
|
||||||
|
|
||||||
|
// Packet handlers while in the Status state (m_State == 1):
|
||||||
|
void HandlePacketStatusPing(cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer);
|
||||||
|
|
||||||
|
// Packet handlers while in the Login state (m_State == 2):
|
||||||
|
void HandlePacketLoginEncryptionResponse(cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketLoginStart(cByteBuffer & a_ByteBuffer);
|
||||||
|
|
||||||
|
// Packet handlers while in the Game state (m_State == 3):
|
||||||
|
void HandlePacketAnimation (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketBlockDig (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketBlockPlace (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketChatMessage (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketClientSettings (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketClientStatus (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketCreativeInventoryAction(cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketEntityAction (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketKeepAlive (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketPlayer (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketPlayerAbilities (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketPlayerLook (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketPlayerPos (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketPlayerPosLook (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketPluginMessage (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketSlotSelect (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketSteerVehicle (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketTabComplete (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketUpdateSign (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketUseEntity (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketEnchantItem (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketWindowClick (cByteBuffer & a_ByteBuffer);
|
||||||
|
void HandlePacketWindowClose (cByteBuffer & a_ByteBuffer);
|
||||||
|
|
||||||
|
|
||||||
|
/** Writes an entire packet into the output stream. a_Packet is expected to start with the packet type; data length is prepended here. */
|
||||||
|
void WritePacket(cByteBuffer & a_Packet);
|
||||||
|
|
||||||
|
/** Sends the data to the client, encrypting them if needed. */
|
||||||
|
virtual void SendData(const char * a_Data, size_t a_Size) override;
|
||||||
|
|
||||||
|
void SendCompass(const cWorld & a_World);
|
||||||
|
|
||||||
|
/** Reads an item out of the received data, sets a_Item to the values read. Returns false if not enough received data */
|
||||||
|
virtual bool ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_MetadataSize = 1);
|
||||||
|
|
||||||
|
/** Parses item metadata as read by ReadItem(), into the item enchantments. */
|
||||||
|
void ParseItemMetadata(cItem & a_Item, const AString & a_Metadata);
|
||||||
|
|
||||||
|
void StartEncryption(const Byte * a_Key);
|
||||||
|
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
|||||||
#include "Protocol15x.h"
|
#include "Protocol15x.h"
|
||||||
#include "Protocol16x.h"
|
#include "Protocol16x.h"
|
||||||
#include "Protocol17x.h"
|
#include "Protocol17x.h"
|
||||||
|
#include "Protocol18x.h"
|
||||||
#include "../ClientHandle.h"
|
#include "../ClientHandle.h"
|
||||||
#include "../Root.h"
|
#include "../Root.h"
|
||||||
#include "../Server.h"
|
#include "../Server.h"
|
||||||
@ -51,7 +52,7 @@ AString cProtocolRecognizer::GetVersionTextFromInt(int a_ProtocolVersion)
|
|||||||
{
|
{
|
||||||
case PROTO_VERSION_1_2_5: return "1.2.5";
|
case PROTO_VERSION_1_2_5: return "1.2.5";
|
||||||
case PROTO_VERSION_1_3_2: return "1.3.2";
|
case PROTO_VERSION_1_3_2: return "1.3.2";
|
||||||
case PROTO_VERSION_1_4_2: return "1.4.2";
|
// case PROTO_VERSION_1_4_2: return "1.4.2";
|
||||||
case PROTO_VERSION_1_4_4: return "1.4.4";
|
case PROTO_VERSION_1_4_4: return "1.4.4";
|
||||||
case PROTO_VERSION_1_4_6: return "1.4.6";
|
case PROTO_VERSION_1_4_6: return "1.4.6";
|
||||||
case PROTO_VERSION_1_5_0: return "1.5";
|
case PROTO_VERSION_1_5_0: return "1.5";
|
||||||
@ -62,6 +63,7 @@ AString cProtocolRecognizer::GetVersionTextFromInt(int a_ProtocolVersion)
|
|||||||
case PROTO_VERSION_1_6_4: return "1.6.4";
|
case PROTO_VERSION_1_6_4: return "1.6.4";
|
||||||
case PROTO_VERSION_1_7_2: return "1.7.2";
|
case PROTO_VERSION_1_7_2: return "1.7.2";
|
||||||
case PROTO_VERSION_1_7_6: return "1.7.6";
|
case PROTO_VERSION_1_7_6: return "1.7.6";
|
||||||
|
case PROTO_VERSION_1_8_0: return "1.8";
|
||||||
}
|
}
|
||||||
ASSERT(!"Unknown protocol version");
|
ASSERT(!"Unknown protocol version");
|
||||||
return Printf("Unknown protocol (%d)", a_ProtocolVersion);
|
return Printf("Unknown protocol (%d)", a_ProtocolVersion);
|
||||||
@ -409,20 +411,20 @@ void cProtocolRecognizer::SendLoginSuccess(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocolRecognizer::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length)
|
void cProtocolRecognizer::SendMapColumn(int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length, unsigned int m_Scale)
|
||||||
{
|
{
|
||||||
ASSERT(m_Protocol != NULL);
|
ASSERT(m_Protocol != NULL);
|
||||||
m_Protocol->SendMapColumn(a_ID, a_X, a_Y, a_Colors, a_Length);
|
m_Protocol->SendMapColumn(a_ID, a_X, a_Y, a_Colors, a_Length, m_Scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocolRecognizer::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decorators)
|
void cProtocolRecognizer::SendMapDecorators(int a_ID, const cMapDecoratorList & a_Decorators, unsigned int m_Scale)
|
||||||
{
|
{
|
||||||
ASSERT(m_Protocol != NULL);
|
ASSERT(m_Protocol != NULL);
|
||||||
m_Protocol->SendMapDecorators(a_ID, a_Decorators);
|
m_Protocol->SendMapDecorators(a_ID, a_Decorators, m_Scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -439,10 +441,10 @@ void cProtocolRecognizer::SendMapInfo(int a_ID, unsigned int a_Scale)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocolRecognizer::SendParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount)
|
void cProtocolRecognizer::SendParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount)
|
||||||
{
|
{
|
||||||
ASSERT(m_Protocol != NULL);
|
ASSERT(m_Protocol != NULL);
|
||||||
m_Protocol->SendParticleEffect(a_ParticleName, a_SrcX, a_SrcY, a_SrcZ, a_OffsetX, a_OffsetY, a_OffsetZ, a_ParticleData, a_ParticleAmmount);
|
m_Protocol->SendParticleEffect(a_ParticleName, a_SrcX, a_SrcY, a_SrcZ, a_OffsetX, a_OffsetY, a_OffsetZ, a_ParticleData, a_ParticleAmount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -487,10 +489,50 @@ void cProtocolRecognizer::SendEntityAnimation(const cEntity & a_Entity, char a_A
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cProtocolRecognizer::SendPlayerListItem(const cPlayer & a_Player, bool a_IsOnline)
|
void cProtocolRecognizer::SendPlayerListAddPlayer(const cPlayer & a_Player)
|
||||||
{
|
{
|
||||||
ASSERT(m_Protocol != NULL);
|
ASSERT(m_Protocol != NULL);
|
||||||
m_Protocol->SendPlayerListItem(a_Player, a_IsOnline);
|
m_Protocol->SendPlayerListAddPlayer(a_Player);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cProtocolRecognizer::SendPlayerListRemovePlayer(const cPlayer & a_Player)
|
||||||
|
{
|
||||||
|
ASSERT(m_Protocol != NULL);
|
||||||
|
m_Protocol->SendPlayerListRemovePlayer(a_Player);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cProtocolRecognizer::SendPlayerListUpdateGameMode(const cPlayer & a_Player)
|
||||||
|
{
|
||||||
|
ASSERT(m_Protocol != NULL);
|
||||||
|
m_Protocol->SendPlayerListUpdateGameMode(a_Player);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cProtocolRecognizer::SendPlayerListUpdatePing(const cPlayer & a_Player)
|
||||||
|
{
|
||||||
|
ASSERT(m_Protocol != NULL);
|
||||||
|
m_Protocol->SendPlayerListUpdatePing(a_Player);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cProtocolRecognizer::SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_OldListName)
|
||||||
|
{
|
||||||
|
ASSERT(m_Protocol != NULL);
|
||||||
|
m_Protocol->SendPlayerListUpdateDisplayName(a_Player, a_OldListName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1016,6 +1058,27 @@ bool cProtocolRecognizer::TryRecognizeLengthedProtocol(UInt32 a_PacketLengthRema
|
|||||||
m_Protocol = new cProtocol176(m_Client, ServerAddress, (UInt16)ServerPort, NextState);
|
m_Protocol = new cProtocol176(m_Client, ServerAddress, (UInt16)ServerPort, NextState);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
case PROTO_VERSION_1_8_0:
|
||||||
|
{
|
||||||
|
AString ServerAddress;
|
||||||
|
short ServerPort;
|
||||||
|
UInt32 NextState;
|
||||||
|
if (!m_Buffer.ReadVarUTF8String(ServerAddress))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!m_Buffer.ReadBEShort(ServerPort))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!m_Buffer.ReadVarInt(NextState))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
m_Buffer.CommitRead();
|
||||||
|
m_Protocol = new cProtocol180(m_Client, ServerAddress, (UInt16)ServerPort, NextState);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
LOGINFO("Client \"%s\" uses an unsupported protocol (lengthed, version %u)",
|
LOGINFO("Client \"%s\" uses an unsupported protocol (lengthed, version %u)",
|
||||||
m_Client->GetIPString().c_str(), ProtocolVersion
|
m_Client->GetIPString().c_str(), ProtocolVersion
|
||||||
|
@ -51,6 +51,7 @@ public:
|
|||||||
// These will be kept "under" the next / latest, because the next and latest are only needed for previous protocols
|
// These will be kept "under" the next / latest, because the next and latest are only needed for previous protocols
|
||||||
PROTO_VERSION_1_7_2 = 4,
|
PROTO_VERSION_1_7_2 = 4,
|
||||||
PROTO_VERSION_1_7_6 = 5,
|
PROTO_VERSION_1_7_6 = 5,
|
||||||
|
PROTO_VERSION_1_8_0 = 47,
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
cProtocolRecognizer(cClientHandle * a_Client);
|
cProtocolRecognizer(cClientHandle * a_Client);
|
||||||
@ -63,76 +64,80 @@ public:
|
|||||||
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 (int a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage) override;
|
virtual void SendBlockBreakAnim (int a_EntityID, int a_BlockX, int a_BlockY, int a_BlockZ, char a_Stage) override;
|
||||||
virtual void SendBlockChange (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;
|
virtual void SendBlockChange (int a_BlockX, int a_BlockY, int a_BlockZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;
|
||||||
virtual void SendBlockChanges (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes) override;
|
virtual void SendBlockChanges (int a_ChunkX, int a_ChunkZ, const sSetBlockVector & a_Changes) override;
|
||||||
virtual void SendChat (const AString & a_Message) override;
|
virtual void SendChat (const AString & a_Message) override;
|
||||||
virtual void SendChat (const cCompositeChat & a_Message) override;
|
virtual void SendChat (const cCompositeChat & a_Message) override;
|
||||||
virtual void SendChunkData (int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer) override;
|
virtual void SendChunkData (int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer) override;
|
||||||
virtual void SendCollectEntity (const cEntity & a_Entity, const cPlayer & a_Player) override;
|
virtual void SendCollectEntity (const cEntity & a_Entity, const cPlayer & a_Player) override;
|
||||||
virtual void SendDestroyEntity (const cEntity & a_Entity) override;
|
virtual void SendDestroyEntity (const cEntity & a_Entity) override;
|
||||||
virtual void SendDisconnect (const AString & a_Reason) override;
|
virtual void SendDisconnect (const AString & a_Reason) override;
|
||||||
virtual void SendEditSign (int a_BlockX, int a_BlockY, int a_BlockZ) override; ///< Request the client to open up the sign editor for the sign (1.6+)
|
virtual void SendEditSign (int a_BlockX, int a_BlockY, int a_BlockZ) override; ///< Request the client to open up the sign editor for the sign (1.6+)
|
||||||
virtual void SendEntityEffect (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration) override;
|
virtual void SendEntityEffect (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration) override;
|
||||||
virtual void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) override;
|
virtual void SendEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item) override;
|
||||||
virtual void SendEntityHeadLook (const cEntity & a_Entity) override;
|
virtual void SendEntityHeadLook (const cEntity & a_Entity) override;
|
||||||
virtual void SendEntityLook (const cEntity & a_Entity) override;
|
virtual void SendEntityLook (const cEntity & a_Entity) override;
|
||||||
virtual void SendEntityMetadata (const cEntity & a_Entity) override;
|
virtual void SendEntityMetadata (const cEntity & a_Entity) override;
|
||||||
virtual void SendEntityProperties (const cEntity & a_Entity) override;
|
virtual void SendEntityProperties (const cEntity & a_Entity) override;
|
||||||
virtual void SendEntityRelMove (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
|
virtual void SendEntityRelMove (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
|
||||||
virtual void SendEntityRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
|
virtual void SendEntityRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ) override;
|
||||||
virtual void SendEntityStatus (const cEntity & a_Entity, char a_Status) override;
|
virtual void SendEntityStatus (const cEntity & a_Entity, char a_Status) override;
|
||||||
virtual void SendEntityVelocity (const cEntity & a_Entity) override;
|
virtual void SendEntityVelocity (const cEntity & a_Entity) override;
|
||||||
virtual void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion) override;
|
virtual void SendExplosion (double a_BlockX, double a_BlockY, double a_BlockZ, float a_Radius, const cVector3iArray & a_BlocksAffected, const Vector3d & a_PlayerMotion) override;
|
||||||
virtual void SendGameMode (eGameMode a_GameMode) override;
|
virtual void SendGameMode (eGameMode a_GameMode) override;
|
||||||
virtual void SendHealth (void) override;
|
virtual void SendHealth (void) override;
|
||||||
virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) override;
|
virtual void SendInventorySlot (char a_WindowID, short a_SlotNum, const cItem & a_Item) override;
|
||||||
virtual void SendKeepAlive (int a_PingID) override;
|
virtual void SendKeepAlive (int a_PingID) override;
|
||||||
virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) override;
|
virtual void SendLogin (const cPlayer & a_Player, const cWorld & a_World) override;
|
||||||
virtual void SendLoginSuccess (void) override;
|
virtual void SendLoginSuccess (void) override;
|
||||||
virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length) override;
|
virtual void SendMapColumn (int a_ID, int a_X, int a_Y, const Byte * a_Colors, unsigned int a_Length, unsigned int m_Scale) override;
|
||||||
virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators) override;
|
virtual void SendMapDecorators (int a_ID, const cMapDecoratorList & a_Decorators, unsigned int m_Scale) override;
|
||||||
virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override;
|
virtual void SendMapInfo (int a_ID, unsigned int a_Scale) override;
|
||||||
virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount) override;
|
virtual void SendParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount) override;
|
||||||
virtual void SendPaintingSpawn (const cPainting & a_Painting) override;
|
virtual void SendPaintingSpawn (const cPainting & a_Painting) override;
|
||||||
virtual void SendPickupSpawn (const cPickup & a_Pickup) override;
|
virtual void SendPickupSpawn (const cPickup & a_Pickup) override;
|
||||||
virtual void SendPlayerAbilities (void) override;
|
virtual void SendPlayerAbilities (void) override;
|
||||||
virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override;
|
virtual void SendEntityAnimation (const cEntity & a_Entity, char a_Animation) override;
|
||||||
virtual void SendPlayerListItem (const cPlayer & a_Player, bool a_IsOnline) override;
|
virtual void SendPlayerListAddPlayer (const cPlayer & a_Player) override;
|
||||||
virtual void SendPlayerMaxSpeed (void) override;
|
virtual void SendPlayerListRemovePlayer (const cPlayer & a_Player) override;
|
||||||
virtual void SendPlayerMoveLook (void) override;
|
virtual void SendPlayerListUpdateGameMode (const cPlayer & a_Player) override;
|
||||||
virtual void SendPlayerPosition (void) override;
|
virtual void SendPlayerListUpdatePing (const cPlayer & a_Player) override;
|
||||||
virtual void SendPlayerSpawn (const cPlayer & a_Player) override;
|
virtual void SendPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_OldListName) override;
|
||||||
virtual void SendPluginMessage (const AString & a_Channel, const AString & a_Message) override;
|
virtual void SendPlayerMaxSpeed (void) override;
|
||||||
virtual void SendRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID) override;
|
virtual void SendPlayerMoveLook (void) override;
|
||||||
virtual void SendRespawn (eDimension a_Dimension, bool a_ShouldIgnoreDimensionChecks) override;
|
virtual void SendPlayerPosition (void) override;
|
||||||
virtual void SendExperience (void) override;
|
virtual void SendPlayerSpawn (const cPlayer & a_Player) override;
|
||||||
virtual void SendExperienceOrb (const cExpOrb & a_ExpOrb) override;
|
virtual void SendPluginMessage (const AString & a_Channel, const AString & a_Message) override;
|
||||||
virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override;
|
virtual void SendRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID) override;
|
||||||
virtual void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) override;
|
virtual void SendRespawn (eDimension a_Dimension, bool a_ShouldIgnoreDimensionChecks) override;
|
||||||
virtual void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) override;
|
virtual void SendExperience (void) override;
|
||||||
virtual void SendSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch) override;
|
virtual void SendExperienceOrb (const cExpOrb & a_ExpOrb) override;
|
||||||
virtual void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) override;
|
virtual void SendScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode) override;
|
||||||
virtual void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock) override;
|
virtual void SendScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode) override;
|
||||||
virtual void SendSpawnMob (const cMonster & a_Mob) override;
|
virtual void SendDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display) override;
|
||||||
virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch) override;
|
virtual void SendSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch) override;
|
||||||
virtual void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType, char a_VehicleSubType) override;
|
virtual void SendSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data) override;
|
||||||
virtual void SendStatistics (const cStatManager & a_Manager) override;
|
virtual void SendSpawnFallingBlock (const cFallingBlock & a_FallingBlock) override;
|
||||||
virtual void SendTabCompletionResults(const AStringVector & a_Results) override;
|
virtual void SendSpawnMob (const cMonster & a_Mob) override;
|
||||||
virtual void SendTeleportEntity (const cEntity & a_Entity) override;
|
virtual void SendSpawnObject (const cEntity & a_Entity, char a_ObjectType, int a_ObjectData, Byte a_Yaw, Byte a_Pitch) override;
|
||||||
virtual void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
virtual void SendSpawnVehicle (const cEntity & a_Vehicle, char a_VehicleType, char a_VehicleSubType) override;
|
||||||
virtual void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay, bool a_DoDaylightCycle) override;
|
virtual void SendStatistics (const cStatManager & a_Manager) override;
|
||||||
virtual void SendUnloadChunk (int a_ChunkX, int a_ChunkZ) override;
|
virtual void SendTabCompletionResults (const AStringVector & a_Results) override;
|
||||||
virtual void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity) override;
|
virtual void SendTeleportEntity (const cEntity & a_Entity) override;
|
||||||
virtual void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) override;
|
virtual void SendThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
||||||
virtual void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
virtual void SendTimeUpdate (Int64 a_WorldAge, Int64 a_TimeOfDay, bool a_DoDaylightCycle) override;
|
||||||
virtual void SendWeather (eWeather a_Weather) override;
|
virtual void SendUnloadChunk (int a_ChunkX, int a_ChunkZ) override;
|
||||||
virtual void SendWholeInventory (const cWindow & a_Window) override;
|
virtual void SendUpdateBlockEntity (cBlockEntity & a_BlockEntity) override;
|
||||||
virtual void SendWindowClose (const cWindow & a_Window) override;
|
virtual void SendUpdateSign (int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) override;
|
||||||
virtual void SendWindowOpen (const cWindow & a_Window) override;
|
virtual void SendUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
||||||
virtual void SendWindowProperty (const cWindow & a_Window, int a_Property, int a_Value) override;
|
virtual void SendWeather (eWeather a_Weather) override;
|
||||||
|
virtual void SendWholeInventory (const cWindow & a_Window) override;
|
||||||
|
virtual void SendWindowClose (const cWindow & a_Window) override;
|
||||||
|
virtual void SendWindowOpen (const cWindow & a_Window) override;
|
||||||
|
virtual void SendWindowProperty (const cWindow & a_Window, int a_Property, int a_Value) override;
|
||||||
|
|
||||||
virtual AString GetAuthServerID(void) override;
|
virtual AString GetAuthServerID(void) override;
|
||||||
|
|
||||||
|
@ -57,6 +57,34 @@ cWindow::~cWindow()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const AString cWindow::GetWindowTypeName(void) const
|
||||||
|
{
|
||||||
|
switch (m_WindowType)
|
||||||
|
{
|
||||||
|
case wtChest: return "minecraft:chest";
|
||||||
|
case wtWorkbench: return "minecraft:crafting_table";
|
||||||
|
case wtFurnace: return "minecraft:furnace";
|
||||||
|
case wtDropSpenser: return "minecraft:dispenser";
|
||||||
|
case wtEnchantment: return "minecraft:enchanting_table";
|
||||||
|
case wtBrewery: return "minecraft:brewing_stand";
|
||||||
|
case wtNPCTrade: return "minecraft:villager";
|
||||||
|
case wtBeacon: return "minecraft:beacon";
|
||||||
|
case wtAnvil: return "minecraft:anvil";
|
||||||
|
case wtHopper: return "minecraft:hopper";
|
||||||
|
case wtDropper: return "minecraft:dropper";
|
||||||
|
case wtAnimalChest: return "EntityHorse";
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
ASSERT(!"Unknown inventory type!");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int cWindow::GetNumSlots(void) const
|
int cWindow::GetNumSlots(void) const
|
||||||
{
|
{
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
@ -63,7 +63,7 @@ public:
|
|||||||
wtBeacon = 7,
|
wtBeacon = 7,
|
||||||
wtAnvil = 8,
|
wtAnvil = 8,
|
||||||
wtHopper = 9,
|
wtHopper = 9,
|
||||||
// Unknown: 10
|
wtDropper = 10,
|
||||||
wtAnimalChest = 11,
|
wtAnimalChest = 11,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -76,6 +76,7 @@ public:
|
|||||||
|
|
||||||
char GetWindowID(void) const { return m_WindowID; } // tolua_export
|
char GetWindowID(void) const { return m_WindowID; } // tolua_export
|
||||||
int GetWindowType(void) const { return m_WindowType; } // tolua_export
|
int GetWindowType(void) const { return m_WindowType; } // tolua_export
|
||||||
|
const AString GetWindowTypeName(void) const; // tolua_export
|
||||||
|
|
||||||
cWindowOwner * GetOwner(void) { return m_Owner; }
|
cWindowOwner * GetOwner(void) { return m_Owner; }
|
||||||
void SetOwner( cWindowOwner * a_Owner) { m_Owner = a_Owner; }
|
void SetOwner( cWindowOwner * a_Owner) { m_Owner = a_Owner; }
|
||||||
|
@ -2144,16 +2144,16 @@ void cWorld::BroadcastEntityAnimation(const cEntity & a_Entity, char a_Animation
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cWorld::BroadcastParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount, cClientHandle * a_Exclude)
|
void cWorld::BroadcastParticleEffect(const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount, cClientHandle * a_Exclude)
|
||||||
{
|
{
|
||||||
m_ChunkMap->BroadcastParticleEffect(a_ParticleName, a_SrcX, a_SrcY, a_SrcZ, a_OffsetX, a_OffsetY, a_OffsetZ, a_ParticleData, a_ParticleAmmount, a_Exclude);
|
m_ChunkMap->BroadcastParticleEffect(a_ParticleName, a_SrcX, a_SrcY, a_SrcZ, a_OffsetX, a_OffsetY, a_OffsetZ, a_ParticleData, a_ParticleAmount, a_Exclude);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cWorld::BroadcastPlayerListItem (const cPlayer & a_Player, bool a_IsOnline, const cClientHandle * a_Exclude)
|
void cWorld::BroadcastPlayerListAddPlayer(const cPlayer & a_Player, const cClientHandle * a_Exclude)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CSPlayers);
|
cCSLock Lock(m_CSPlayers);
|
||||||
for (cPlayerList::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
|
for (cPlayerList::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
|
||||||
@ -2163,7 +2163,79 @@ void cWorld::BroadcastPlayerListItem (const cPlayer & a_Player, bool a_IsOnline,
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ch->SendPlayerListItem(a_Player, a_IsOnline);
|
ch->SendPlayerListAddPlayer(a_Player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cWorld::BroadcastPlayerListRemovePlayer(const cPlayer & a_Player, const cClientHandle * a_Exclude)
|
||||||
|
{
|
||||||
|
cCSLock Lock(m_CSPlayers);
|
||||||
|
for (cPlayerList::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
|
||||||
|
{
|
||||||
|
cClientHandle * ch = (*itr)->GetClientHandle();
|
||||||
|
if ((ch == a_Exclude) || (ch == NULL) || !ch->IsLoggedIn() || ch->IsDestroyed())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ch->SendPlayerListRemovePlayer(a_Player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cWorld::BroadcastPlayerListUpdateGameMode(const cPlayer & a_Player, const cClientHandle * a_Exclude)
|
||||||
|
{
|
||||||
|
cCSLock Lock(m_CSPlayers);
|
||||||
|
for (cPlayerList::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
|
||||||
|
{
|
||||||
|
cClientHandle * ch = (*itr)->GetClientHandle();
|
||||||
|
if ((ch == a_Exclude) || (ch == NULL) || !ch->IsLoggedIn() || ch->IsDestroyed())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ch->SendPlayerListUpdateGameMode(a_Player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cWorld::BroadcastPlayerListUpdatePing(const cPlayer & a_Player, const cClientHandle * a_Exclude)
|
||||||
|
{
|
||||||
|
cCSLock Lock(m_CSPlayers);
|
||||||
|
for (cPlayerList::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
|
||||||
|
{
|
||||||
|
cClientHandle * ch = (*itr)->GetClientHandle();
|
||||||
|
if ((ch == a_Exclude) || (ch == NULL) || !ch->IsLoggedIn() || ch->IsDestroyed())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ch->SendPlayerListUpdatePing(a_Player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cWorld::BroadcastPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_OldListName, const cClientHandle * a_Exclude)
|
||||||
|
{
|
||||||
|
cCSLock Lock(m_CSPlayers);
|
||||||
|
for (cPlayerList::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
|
||||||
|
{
|
||||||
|
cClientHandle * ch = (*itr)->GetClientHandle();
|
||||||
|
if ((ch == a_Exclude) || (ch == NULL) || !ch->IsLoggedIn() || ch->IsDestroyed())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ch->SendPlayerListUpdateDisplayName(a_Player, a_OldListName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2686,7 +2758,7 @@ void cWorld::SendPlayerList(cPlayer * a_DestPlayer)
|
|||||||
cClientHandle * ch = (*itr)->GetClientHandle();
|
cClientHandle * ch = (*itr)->GetClientHandle();
|
||||||
if ((ch != NULL) && !ch->IsDestroyed())
|
if ((ch != NULL) && !ch->IsDestroyed())
|
||||||
{
|
{
|
||||||
a_DestPlayer->GetClientHandle()->SendPlayerListItem(*(*itr), true);
|
a_DestPlayer->GetClientHandle()->SendPlayerListAddPlayer(*(*itr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
58
src/World.h
58
src/World.h
@ -226,33 +226,37 @@ public:
|
|||||||
void BroadcastChat (const cCompositeChat & a_Message, const cClientHandle * a_Exclude = NULL);
|
void BroadcastChat (const cCompositeChat & a_Message, const cClientHandle * a_Exclude = NULL);
|
||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
void BroadcastChunkData (int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer, const cClientHandle * a_Exclude = NULL);
|
void BroadcastChunkData (int a_ChunkX, int a_ChunkZ, cChunkDataSerializer & a_Serializer, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastCollectEntity (const cEntity & a_Pickup, const cPlayer & a_Player, const cClientHandle * a_Exclude = NULL);
|
void BroadcastCollectEntity (const cEntity & a_Pickup, const cPlayer & a_Player, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastDestroyEntity (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
void BroadcastDestroyEntity (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastEntityEffect (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityEffect (const cEntity & a_Entity, int a_EffectID, int a_Amplifier, short a_Duration, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityEquipment (const cEntity & a_Entity, short a_SlotNum, const cItem & a_Item, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastEntityHeadLook (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityHeadLook (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastEntityLook (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityLook (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastEntityMetadata (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityMetadata (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastEntityRelMove (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityRelMove (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastEntityRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityRelMoveLook (const cEntity & a_Entity, char a_RelX, char a_RelY, char a_RelZ, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastEntityStatus (const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityStatus (const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastEntityVelocity (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
void BroadcastEntityVelocity (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
||||||
virtual void BroadcastEntityAnimation(const cEntity & a_Entity, char a_Animation, const cClientHandle * a_Exclude = NULL) override; // tolua_export
|
virtual void BroadcastEntityAnimation (const cEntity & a_Entity, char a_Animation, const cClientHandle * a_Exclude = NULL) override; // tolua_export
|
||||||
void BroadcastParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmmount, cClientHandle * a_Exclude = NULL); // tolua_export
|
void BroadcastParticleEffect (const AString & a_ParticleName, float a_SrcX, float a_SrcY, float a_SrcZ, float a_OffsetX, float a_OffsetY, float a_OffsetZ, float a_ParticleData, int a_ParticleAmount, cClientHandle * a_Exclude = NULL); // tolua_export
|
||||||
void BroadcastPlayerListItem (const cPlayer & a_Player, bool a_IsOnline, const cClientHandle * a_Exclude = NULL);
|
void BroadcastPlayerListAddPlayer (const cPlayer & a_Player, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID, const cClientHandle * a_Exclude = NULL);
|
void BroadcastPlayerListRemovePlayer (const cPlayer & a_Player, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode);
|
void BroadcastPlayerListUpdateGameMode (const cPlayer & a_Player, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode);
|
void BroadcastPlayerListUpdatePing (const cPlayer & a_Player, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display);
|
void BroadcastPlayerListUpdateDisplayName(const cPlayer & a_Player, const AString & a_OldListName, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch, const cClientHandle * a_Exclude = NULL); // tolua_export
|
void BroadcastRemoveEntityEffect (const cEntity & a_Entity, int a_EffectID, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data, const cClientHandle * a_Exclude = NULL); // tolua_export
|
void BroadcastScoreboardObjective (const AString & a_Name, const AString & a_DisplayName, Byte a_Mode);
|
||||||
void BroadcastSpawnEntity (cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
void BroadcastScoreUpdate (const AString & a_Objective, const AString & a_Player, cObjective::Score a_Score, Byte a_Mode);
|
||||||
void BroadcastTeleportEntity (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
void BroadcastDisplayObjective (const AString & a_Objective, cScoreboard::eDisplaySlot a_Display);
|
||||||
void BroadcastThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ, const cClientHandle * a_Exclude = NULL);
|
void BroadcastSoundEffect (const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch, const cClientHandle * a_Exclude = NULL); // tolua_export
|
||||||
void BroadcastTimeUpdate (const cClientHandle * a_Exclude = NULL);
|
void BroadcastSoundParticleEffect (int a_EffectID, int a_SrcX, int a_SrcY, int a_SrcZ, int a_Data, const cClientHandle * a_Exclude = NULL); // tolua_export
|
||||||
virtual void BroadcastUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
void BroadcastSpawnEntity (cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
||||||
void BroadcastWeather (eWeather a_Weather, const cClientHandle * a_Exclude = NULL);
|
void BroadcastTeleportEntity (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
|
||||||
|
void BroadcastThunderbolt (int a_BlockX, int a_BlockY, int a_BlockZ, const cClientHandle * a_Exclude = NULL);
|
||||||
|
void BroadcastTimeUpdate (const cClientHandle * a_Exclude = NULL);
|
||||||
|
virtual void BroadcastUseBed (const cEntity & a_Entity, int a_BlockX, int a_BlockY, int a_BlockZ) override;
|
||||||
|
void BroadcastWeather (eWeather a_Weather, const cClientHandle * a_Exclude = NULL);
|
||||||
|
|
||||||
virtual cBroadcastInterface & GetBroadcastManager(void) override
|
virtual cBroadcastInterface & GetBroadcastManager(void) override
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user