1
0

Window, Chest, Furnace and Pawn are not using cPackets at all

git-svn-id: http://mc-server.googlecode.com/svn/trunk@762 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
madmaxoft@gmail.com 2012-08-19 21:14:45 +00:00
parent 427e582d5f
commit 674fe1e955
17 changed files with 208 additions and 85 deletions

View File

@ -3,7 +3,6 @@
#include "cBlockEntity.h"
#include "cWindowOwner.h"
#include "packets/cPacket_BlockAction.h"

View File

@ -1883,6 +1883,38 @@ void cChunk::BroadcastDestroyEntity(const cEntity & a_Entity, const cClientHandl
void cChunk::BroadcastEntityStatus(const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude)
{
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
{
if (*itr == a_Exclude)
{
continue;
}
(*itr)->SendEntityStatus(a_Entity, a_Status);
} // for itr - LoadedByClient[]
}
void cChunk::BroadcastMetadata(const cPawn & a_Pawn, const cClientHandle * a_Exclude)
{
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr )
{
if (*itr == a_Exclude)
{
continue;
}
(*itr)->SendMetadata(a_Pawn);
} // for itr - LoadedByClient[]
}
void cChunk::PositionToWorldPosition(int a_ChunkX, int a_ChunkY, int a_ChunkZ, int & a_X, int & a_Y, int & a_Z)
{
a_Y = a_ChunkY;

View File

@ -41,6 +41,7 @@ class cChunkMap;
class cChestEntity;
class cFurnaceEntity;
class cBlockArea;
class cPawn;
typedef std::list<cClientHandle *> cClientHandleList;
typedef cItemCallback<cEntity> cEntityCallback;
@ -182,7 +183,9 @@ public:
void BroadcastEntLook (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
void BroadcastEntHeadLook (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
void BroadcastBlockAction (int a_BlockX, int a_BlockY, int a_BlockZ, char a_Byte1, char a_Byte2, 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 BroadcastEntityStatus (const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude = NULL);
void BroadcastMetadata (const cPawn & a_Pawn, const cClientHandle * a_Exclude = NULL);
void PositionToWorldPosition(int a_ChunkX, int a_ChunkY, int a_ChunkZ, int & a_X, int & a_Y, int & a_Z);
Vector3i PositionToWorldPosition( const Vector3i & a_InChunkPos ) { return PositionToWorldPosition( a_InChunkPos.x, a_InChunkPos.y, a_InChunkPos.z ); }

View File

@ -402,6 +402,39 @@ void cChunkMap::BroadcastDestroyEntity(const cEntity & a_Entity, const cClientHa
void cChunkMap::BroadcastEntityStatus(const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude)
{
cCSLock Lock(m_CSLayers);
cChunkPtr Chunk = GetChunkNoGen(a_Entity.GetChunkX(), a_Entity.GetChunkY(), a_Entity.GetChunkZ());
if (Chunk == NULL)
{
return;
}
// It's perfectly legal to broadcast packets even to invalid chunks!
Chunk->BroadcastEntityStatus(a_Entity, a_Status, a_Exclude);
}
void cChunkMap::BroadcastMetadata(const cPawn & a_Pawn, const cClientHandle * a_Exclude)
{
cCSLock Lock(m_CSLayers);
cChunkPtr Chunk = GetChunkNoGen(a_Pawn.GetChunkX(), a_Pawn.GetChunkY(), a_Pawn.GetChunkZ());
if (Chunk == NULL)
{
return;
}
// It's perfectly legal to broadcast packets even to invalid chunks!
Chunk->BroadcastMetadata(a_Pawn, a_Exclude);
}
void cChunkMap::UseBlockEntity(cPlayer * a_Player, int a_BlockX, int a_BlockY, int a_BlockZ)
{
// a_Player rclked block entity at the coords specified, handle it

View File

@ -20,6 +20,7 @@ class cPacket;
class cPlayer;
class cChestEntity;
class cFurnaceEntity;
class cPawn;
typedef std::list<cClientHandle *> cClientHandleList;
typedef cChunk * cChunkPtr;
@ -70,6 +71,10 @@ public:
void BroadcastDestroyEntity(const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
void BroadcastEntityStatus(const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude = NULL);
void BroadcastMetadata(const cPawn & a_Pawn, const cClientHandle * a_Exclude = NULL);
/// a_Player rclked block entity at the coords specified, handle it
void UseBlockEntity(cPlayer * a_Player, int a_X, int a_Y, int a_Z);

View File

@ -41,6 +41,7 @@
#include "packets/cPacket_13.h"
#include "packets/cPacket_ArmAnim.h"
#include "packets/cPacket_BlockAction.h"
#include "packets/cPacket_BlockChange.h"
#include "packets/cPacket_BlockDig.h"
#include "packets/cPacket_BlockPlace.h"
@ -50,8 +51,10 @@
#include "packets/cPacket_Disconnect.h"
#include "packets/cPacket_EntityEquipment.h"
#include "packets/cPacket_EntityLook.h"
#include "packets/cPacket_EntityStatus.h"
#include "packets/cPacket_Flying.h"
#include "packets/cPacket_Handshake.h"
#include "packets/cPacket_InventoryProgressBar.h"
#include "packets/cPacket_InventorySlot.h"
#include "packets/cPacket_ItemSwitch.h"
#include "packets/cPacket_KeepAlive.h"
@ -1779,6 +1782,42 @@ void cClientHandle::SendPlayerMoveLook(void)
void cClientHandle::SendEntityStatus(const cEntity & a_Entity, char a_Status)
{
cPacket_EntityStatus es;
es.m_Status = a_Status;
es.m_UniqueID = a_Entity.GetUniqueID();
Send(es);
}
void cClientHandle::SendMetadata(const cPawn & a_Pawn)
{
cPacket_Metadata md(a_Pawn.GetMetaData(), a_Pawn.GetUniqueID());
Send(md);
}
void cClientHandle::SendInventoryProgress(char a_WindowID, short a_ProgressBar, short a_Value)
{
cPacket_InventoryProgressBar Progress;
Progress.m_WindowID = a_WindowID;
Progress.m_ProgressBar = a_ProgressBar;
Progress.m_Value = a_Value;
Progress.m_WindowID = a_WindowID;
Send(Progress);
}
void cClientHandle::CheckIfWorldDownloaded(void)
{
if (m_State != csDownloadingWorld)

View File

@ -32,6 +32,7 @@ class cPlayer;
class cRedstone;
class cInventory;
class cWindow;
class cPawn;
@ -103,6 +104,9 @@ public:
void SendGameMode(char a_GameMode);
void SendDestroyEntity(const cEntity & a_Entity);
void SendPlayerMoveLook(void);
void SendEntityStatus(const cEntity & a_Entity, char a_Status);
void SendMetadata(const cPawn & a_Entity);
void SendInventoryProgress(char a_WindowID, short a_Progressbar, short a_Value);
const AString & GetUsername(void) const; //tolua_export

View File

@ -11,8 +11,6 @@
#include "cReferenceManager.h"
#include "cClientHandle.h"
#include "packets/cPacket_DestroyEntity.h"
@ -115,11 +113,7 @@ void cEntity::MoveToCorrectChunk(bool a_bIgnoreOldChunk)
{
return;
}
if (m_Destroy == NULL)
{
m_Destroy = new cPacket_DestroyEntity(m_Entity);
}
a_Client->Send(*m_Destroy);
a_Client->SendDestroyEntity(*m_Entity);
}
virtual void Added(cClientHandle * a_Client) override
@ -134,14 +128,12 @@ void cEntity::MoveToCorrectChunk(bool a_bIgnoreOldChunk)
}
}
cPacket * m_Destroy;
cPacket * m_Spawn;
bool m_IgnoreOldChunk;
cEntity * m_Entity;
public:
cMover(cEntity * a_Entity, bool a_IgnoreOldChunk) :
m_Destroy(NULL),
m_Spawn(NULL),
m_IgnoreOldChunk(a_IgnoreOldChunk),
m_Entity(a_Entity)
@ -150,7 +142,6 @@ void cEntity::MoveToCorrectChunk(bool a_bIgnoreOldChunk)
~cMover()
{
delete m_Spawn;
delete m_Destroy;
}
} Mover(this, a_bIgnoreOldChunk);
@ -177,7 +168,7 @@ void cEntity::Destroy()
RemoveFromChunk();
}
m_World->BroadcastToChunk(m_ChunkX, m_ChunkY, m_ChunkZ, cPacket_DestroyEntity(this));
m_World->BroadcastDestroyEntity(*this);
m_bDestroyed = true;

View File

@ -48,25 +48,37 @@ class cPacket;
// tolua_begin
class cEntity
{
public:
enum
{
ENTITY_STATUS_HURT = 2,
ENTITY_STATUS_DEAD = 3,
ENTITY_STATUS_WOLF_TAMING = 6,
ENTITY_STATUS_WOLF_TAMED = 7,
ENTITY_STATUS_WOLF_SHAKING = 8,
ENTITY_STATUS_EATING_ACCEPTED = 9,
ENTITY_STATUS_SHEEP_EATING = 10,
} ;
cEntity(const double & a_X, const double & a_Y, const double & a_Z);
virtual ~cEntity();
class cEntity //tolua_export
{ //tolua_export
public: //tolua_export
cEntity(const double & a_X, const double & a_Y, const double & a_Z); //tolua_export
virtual ~cEntity(); //tolua_export
virtual void Initialize( cWorld* a_World );
virtual void Initialize( cWorld* a_World ); //tolua_export
enum eEntityType
{
eEntityType_Entity,
eEntityType_Player,
eEntityType_Pickup
};
enum eEntityType //tolua_export
{ //tolua_export
eEntityType_Entity, //tolua_export
eEntityType_Player, //tolua_export
eEntityType_Pickup //tolua_export
}; //tolua_export
virtual unsigned int GetEntityType() { return m_EntityType; } //tolua_export
virtual bool IsA( const char* a_EntityType ); //tolua_export
virtual const char* GetClass(); //tolua_export
virtual unsigned int GetEntityType() { return m_EntityType; }
virtual bool IsA( const char* a_EntityType );
virtual const char* GetClass();
// tolua_end
cWorld * GetWorld(void) const { return m_World; } //tolua_export

View File

@ -12,9 +12,6 @@
#include "cServer.h"
#include "cPickup.h"
#include "cRoot.h"
#include "packets/cPacket_InventoryProgressBar.h"
#include <json/json.h>
@ -146,13 +143,10 @@ bool cFurnaceEntity::Tick( float a_Dt )
cWindow * Window = GetWindow();
if (Window != NULL)
{
cPacket_InventoryProgressBar Progress;
Progress.m_ProgressBar = 0;
Progress.m_WindowID = (char)Window->GetWindowID();
Progress.m_Value = (short)( m_TimeCooked * (180.f / m_CookTime) );
if (Progress.m_Value > 180) Progress.m_Value = 180;
if (Progress.m_Value < 0) Progress.m_Value = 0;
Window->Broadcast(Progress);
short Value = (short)( m_TimeCooked * (180.f / m_CookTime));
if (Value > 180) Value = 180;
if (Value < 0) Value = 0;
Window->BroadcastInventoryProgress(0, Value);
}
}
}
@ -171,21 +165,14 @@ bool cFurnaceEntity::Tick( float a_Dt )
}
if (Window != NULL)
{
cPacket_InventoryProgressBar Progress;
Progress.m_WindowID = (char)Window->GetWindowID();
Progress.m_ProgressBar = 1;
short Value = 0;
if (m_BurnTime > 0.f)
{
Progress.m_Value = 250 - (short)( m_TimeBurned * (250.f / m_BurnTime) );
if (Progress.m_Value > 250) Progress.m_Value = 250;
if (Progress.m_Value < 0) Progress.m_Value = 0;
Value = 250 - (short)( m_TimeBurned * (250.f / m_BurnTime));
if (Value > 250) Value = 250;
if (Value < 0) Value = 0;
}
else
{
Progress.m_Value = 0;
}
Window->Broadcast(Progress);
Window->BroadcastInventoryProgress(1, Value);
}
return ((m_CookingItem != NULL) || (m_TimeBurned < m_BurnTime)) && (m_BurnTime > 0.0); // Keep on ticking, if there's more to cook, or if it's cooking
}

View File

@ -9,13 +9,8 @@
#include "cPluginManager.h"
#include "Vector3d.h"
#include "BlockID.h"
#include "Defines.h"
#include "packets/cPacket_TeleportEntity.h"
#include "packets/cPacket_EntityStatus.h"
#include "packets/cPacket_Metadata.h"
@ -62,27 +57,34 @@ void cPawn::Heal( int a_Health )
void cPawn::TakeDamage( int a_Damage, cEntity* a_Instigator )
void cPawn::TakeDamage(int a_Damage, cEntity * a_Instigator)
{
TakeDamageInfo TDI;
TDI.Damage = a_Damage;
TDI.Instigator = a_Instigator;
cRoot::Get()->GetPluginManager()->CallHook( cPluginManager::E_PLUGIN_TAKE_DAMAGE, 2, this, &TDI );
cRoot::Get()->GetPluginManager()->CallHook( cPluginManager::E_PLUGIN_TAKE_DAMAGE, 2, this, &TDI);
if( TDI.Damage == 0 ) return;
if( m_Health <= 0 ) return; // Can't take damage if already dead
if (TDI.Damage == 0)
{
return;
}
if (m_Health <= 0)
{
// Can't take damage if already dead
return;
}
m_Health -= (short)TDI.Damage;
if( m_Health < 0 ) m_Health = 0;
if (m_Health < 0)
{
m_Health = 0;
}
cPacket_EntityStatus Status;
Status.m_UniqueID = GetUniqueID();
Status.m_Status = cPacket_EntityStatus::STATUS_TAKEDAMAGE;
m_World->BroadcastToChunk(m_ChunkX, m_ChunkY, m_ChunkZ, Status);
m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_HURT);
if (m_Health <= 0)
{
KilledBy( TDI.Instigator );
KilledBy(TDI.Instigator);
}
}
@ -90,7 +92,7 @@ void cPawn::TakeDamage( int a_Damage, cEntity* a_Instigator )
void cPawn::KilledBy( cEntity* a_Killer )
void cPawn::KilledBy(cEntity * a_Killer)
{
m_Health = 0;
@ -99,19 +101,16 @@ void cPawn::KilledBy( cEntity* a_Killer )
return; // Give plugins a chance to 'unkill' the pawn.
}
cPacket_EntityStatus Status;
Status.m_UniqueID = GetUniqueID();
Status.m_Status = cPacket_EntityStatus::STATUS_DIE;
m_World->BroadcastToChunk(m_ChunkX, m_ChunkY, m_ChunkZ, Status);
m_World->BroadcastEntityStatus(*this, ENTITY_STATUS_DEAD);
}
void cPawn::TeleportToEntity( cEntity* a_Entity )
void cPawn::TeleportToEntity(cEntity * a_Entity)
{
TeleportTo( a_Entity->GetPosX(), a_Entity->GetPosY(), a_Entity->GetPosZ() );
TeleportTo(a_Entity->GetPosX(), a_Entity->GetPosY(), a_Entity->GetPosZ());
}
@ -148,8 +147,7 @@ void cPawn::SetMetaData(MetaData a_MetaData)
{
//Broadcast new status to clients in the chunk
m_MetaData = a_MetaData;
cPacket_Metadata md(a_MetaData, GetUniqueID());
m_World->BroadcastToChunk(m_ChunkX, m_ChunkY, m_ChunkZ, md);
m_World->BroadcastMetadata(*this);
}

View File

@ -38,7 +38,7 @@ public:
enum MetaData {NORMAL, BURNING, CROUCHED, RIDING, SPRINTING, EATING, BLOCKING};
virtual void SetMetaData(MetaData a_MetaData);
virtual MetaData GetMetaData() { return m_MetaData; }
virtual MetaData GetMetaData(void) const { return m_MetaData; }
virtual void InStateBurning(float a_Dt);

View File

@ -360,12 +360,12 @@ void cWindow::BroadcastWholeWindow(void)
void cWindow::Broadcast(const cPacket & a_Packet)
void cWindow::BroadcastInventoryProgress(short a_Progressbar, short a_Value)
{
cCSLock Lock(m_CS);
for (cPlayerList::iterator itr = m_OpenedBy.begin(); itr != m_OpenedBy.end(); ++itr)
{
(*itr)->GetClientHandle()->Send(a_Packet);
(*itr)->GetClientHandle()->SendInventoryProgress(m_WindowID, a_Progressbar, a_Value);
} // for itr - m_OpenedBy[]
}

View File

@ -14,7 +14,6 @@ class cPlayer;
class cItem;
class cWindowOwner;
class cClientHandle;
class cPacket; // TODO: remove this
typedef std::list<cPlayer *> cPlayerList;
@ -76,7 +75,7 @@ public:
void SendWholeWindow(cClientHandle * a_Client);
void BroadcastWholeWindow(void);
void Broadcast(const cPacket & a_Packet);
void BroadcastInventoryProgress(short a_Progressbar, short a_Value);
const AString & GetWindowTitle() const { return m_WindowTitle; }
void SetWindowTitle( const std::string & a_WindowTitle ) { m_WindowTitle = a_WindowTitle; }

View File

@ -1372,6 +1372,24 @@ void cWorld::BroadcastDestroyEntity(const cEntity & a_Entity, const cClientHandl
void cWorld::BroadcastEntityStatus(const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude)
{
m_ChunkMap->BroadcastEntityStatus(a_Entity, a_Status, a_Exclude);
}
void cWorld::BroadcastMetadata(const cPawn & a_Pawn, const cClientHandle * a_Exclude)
{
m_ChunkMap->BroadcastMetadata(a_Pawn, a_Exclude);
}
void cWorld::MarkChunkDirty (int a_ChunkX, int a_ChunkY, int a_ChunkZ)
{
m_ChunkMap->MarkChunkDirty (a_ChunkX, a_ChunkY, a_ChunkZ);

View File

@ -88,6 +88,8 @@ public:
void BroadcastEntHeadLook (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
void BroadcastBlockAction (int a_BlockX, int a_BlockY, int a_BlockZ, char a_Byte1, char a_Byte2, const cClientHandle * a_Exclude = NULL);
void BroadcastDestroyEntity (const cEntity & a_Entity, const cClientHandle * a_Exclude = NULL);
void BroadcastEntityStatus (const cEntity & a_Entity, char a_Status, const cClientHandle * a_Exclude = NULL);
void BroadcastMetadata (const cPawn & a_Pawn, const cClientHandle * a_Exclude = NULL);
void MarkChunkDirty (int a_ChunkX, int a_ChunkY, int a_ChunkZ);
void MarkChunkSaving(int a_ChunkX, int a_ChunkY, int a_ChunkZ);

View File

@ -14,16 +14,17 @@ public:
: m_WindowID( 0 )
, m_ProgressBar( 0 )
, m_Value( 0 )
{ m_PacketID = E_INVENTORY_PROGRESS; }
virtual cPacket* Clone() const { return new cPacket_InventoryProgressBar(*this); }
{
m_PacketID = E_INVENTORY_PROGRESS;
}
virtual cPacket * Clone() const { return new cPacket_InventoryProgressBar(*this); }
virtual void Serialize(AString & a_Data) const override;
char m_WindowID;
char m_WindowID;
short m_ProgressBar;
short m_Value;
static const unsigned int c_Size = 1 + 1 + 2 + 2;
};