Split cMap::UpdateClient
This commit is contained in:
parent
f201f4f176
commit
8bf5d116fe
136
src/Map.cpp
136
src/Map.cpp
@ -278,28 +278,35 @@ void cMap::UpdateDecorators(void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cMap::UpdateClient(cPlayer * a_Player)
|
void cMap::AddPlayer(cPlayer * a_Player, cClientHandle * a_Handle, Int64 a_WorldAge)
|
||||||
{
|
{
|
||||||
ASSERT(a_Player != NULL);
|
cMapClient MapClient;
|
||||||
cClientHandle * Handle = a_Player->GetClientHandle();
|
|
||||||
|
|
||||||
if (Handle == NULL)
|
MapClient.m_LastUpdate = a_WorldAge;
|
||||||
{
|
MapClient.m_SendInfo = true;
|
||||||
return;
|
MapClient.m_Handle = a_Handle;
|
||||||
}
|
|
||||||
|
|
||||||
Int64 WorldAge = a_Player->GetWorld()->GetWorldAge();
|
m_Clients.push_back(MapClient);
|
||||||
|
|
||||||
// Remove invalid clients
|
cMapDecorator PlayerDecorator(this, a_Player);
|
||||||
|
|
||||||
|
m_Decorators.push_back(PlayerDecorator);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cMap::RemoveInactiveClients(Int64 a_WorldAge)
|
||||||
|
{
|
||||||
for (cMapClientList::iterator it = m_Clients.begin(); it != m_Clients.end();)
|
for (cMapClientList::iterator it = m_Clients.begin(); it != m_Clients.end();)
|
||||||
{
|
{
|
||||||
// Check if client is active
|
if (it->m_LastUpdate < a_WorldAge)
|
||||||
if (it->m_LastUpdate < WorldAge - 5)
|
|
||||||
{
|
{
|
||||||
// Remove associated decorators
|
// Remove associated decorators
|
||||||
for (cMapDecoratorList::iterator it2 = m_Decorators.begin(); it2 != m_Decorators.end();)
|
for (cMapDecoratorList::iterator it2 = m_Decorators.begin(); it2 != m_Decorators.end();)
|
||||||
{
|
{
|
||||||
if (it2->GetPlayer()->GetClientHandle() == Handle)
|
if (it2->GetPlayer()->GetClientHandle() == it->m_Handle)
|
||||||
{
|
{
|
||||||
// Erase decorator
|
// Erase decorator
|
||||||
cMapDecoratorList::iterator temp = it2;
|
cMapDecoratorList::iterator temp = it2;
|
||||||
@ -322,6 +329,66 @@ void cMap::UpdateClient(cPlayer * a_Player)
|
|||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cMap::StreamNext(cMapClient & a_Client)
|
||||||
|
{
|
||||||
|
cClientHandle * Handle = a_Client.m_Handle;
|
||||||
|
|
||||||
|
if (a_Client.m_SendInfo)
|
||||||
|
{
|
||||||
|
Handle->SendMapInfo(m_ID, m_Scale);
|
||||||
|
|
||||||
|
a_Client.m_SendInfo = false;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
++a_Client.m_NextDecoratorUpdate;
|
||||||
|
|
||||||
|
if (a_Client.m_NextDecoratorUpdate >= 4)
|
||||||
|
{
|
||||||
|
// TODO 2014-02-19 xdot
|
||||||
|
// This is dangerous as the player object may have been destroyed before the decorator is erased from the list
|
||||||
|
UpdateDecorators();
|
||||||
|
|
||||||
|
Handle->SendMapDecorators(m_ID, m_Decorators);
|
||||||
|
|
||||||
|
a_Client.m_NextDecoratorUpdate = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
++a_Client.m_DataUpdate;
|
||||||
|
|
||||||
|
unsigned int Y = (a_Client.m_DataUpdate * 11) % m_Width;
|
||||||
|
|
||||||
|
const Byte * Colors = &m_Data[Y * m_Height];
|
||||||
|
|
||||||
|
Handle->SendMapColumn(m_ID, Y, 0, Colors, m_Height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cMap::UpdateClient(cPlayer * a_Player)
|
||||||
|
{
|
||||||
|
ASSERT(a_Player != NULL);
|
||||||
|
cClientHandle * Handle = a_Player->GetClientHandle();
|
||||||
|
|
||||||
|
if (Handle == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Int64 WorldAge = a_Player->GetWorld()->GetWorldAge();
|
||||||
|
|
||||||
|
RemoveInactiveClients(WorldAge - 5);
|
||||||
|
|
||||||
// Linear search for client state
|
// Linear search for client state
|
||||||
for (cMapClientList::iterator it = m_Clients.begin(); it != m_Clients.end(); ++it)
|
for (cMapClientList::iterator it = m_Clients.begin(); it != m_Clients.end(); ++it)
|
||||||
@ -330,55 +397,14 @@ void cMap::UpdateClient(cPlayer * a_Player)
|
|||||||
{
|
{
|
||||||
it->m_LastUpdate = WorldAge;
|
it->m_LastUpdate = WorldAge;
|
||||||
|
|
||||||
if (it->m_SendInfo)
|
StreamNext(*it);
|
||||||
{
|
|
||||||
Handle->SendMapInfo(m_ID, m_Scale);
|
|
||||||
|
|
||||||
it->m_SendInfo = false;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
++it->m_NextDecoratorUpdate;
|
|
||||||
|
|
||||||
if (it->m_NextDecoratorUpdate >= 4)
|
|
||||||
{
|
|
||||||
// TODO 2014-02-19 xdot
|
|
||||||
// This is dangerous as the player object may have been destroyed before the decorator is erased from the list
|
|
||||||
UpdateDecorators();
|
|
||||||
|
|
||||||
Handle->SendMapDecorators(m_ID, m_Decorators);
|
|
||||||
|
|
||||||
it->m_NextDecoratorUpdate = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
++it->m_DataUpdate;
|
|
||||||
|
|
||||||
unsigned int Y = (it->m_DataUpdate * 11) % m_Width;
|
|
||||||
|
|
||||||
const Byte * Colors = &m_Data[Y * m_Height];
|
|
||||||
|
|
||||||
Handle->SendMapColumn(m_ID, Y, 0, Colors, m_Height);
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// New player, construct a new client state
|
// New player, construct a new client state
|
||||||
cMapClient MapClient;
|
AddPlayer(a_Player, Handle, WorldAge);
|
||||||
|
|
||||||
MapClient.m_LastUpdate = WorldAge;
|
|
||||||
MapClient.m_SendInfo = true;
|
|
||||||
MapClient.m_Handle = a_Player->GetClientHandle();
|
|
||||||
|
|
||||||
m_Clients.push_back(MapClient);
|
|
||||||
|
|
||||||
// Insert new decorator
|
|
||||||
cMapDecorator PlayerDecorator(this, a_Player);
|
|
||||||
|
|
||||||
m_Decorators.push_back(PlayerDecorator);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
61
src/Map.h
61
src/Map.h
@ -105,29 +105,6 @@ public:
|
|||||||
|
|
||||||
typedef std::vector<ColorID> cColorList;
|
typedef std::vector<ColorID> cColorList;
|
||||||
|
|
||||||
/** Encapsulates the state of a map client.
|
|
||||||
*
|
|
||||||
* In order to enhance performace, maps are streamed column-by-column to each client.
|
|
||||||
* This structure stores the state of the stream.
|
|
||||||
*/
|
|
||||||
struct cMapClient
|
|
||||||
{
|
|
||||||
cClientHandle * m_Handle;
|
|
||||||
|
|
||||||
/** Whether the map scale was modified and needs to be resent. */
|
|
||||||
bool m_SendInfo;
|
|
||||||
|
|
||||||
/** Ticks since last decorator update. */
|
|
||||||
unsigned int m_NextDecoratorUpdate;
|
|
||||||
|
|
||||||
/** Number of pixel data updates. */
|
|
||||||
Int64 m_DataUpdate;
|
|
||||||
|
|
||||||
Int64 m_LastUpdate;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef std::list<cMapClient> cMapClientList;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -185,6 +162,32 @@ public:
|
|||||||
// tolua_end
|
// tolua_end
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/** Encapsulates the state of a map client.
|
||||||
|
*
|
||||||
|
* In order to enhance performace, maps are streamed column-by-column to each client.
|
||||||
|
* This structure stores the state of the stream.
|
||||||
|
*/
|
||||||
|
struct cMapClient
|
||||||
|
{
|
||||||
|
cClientHandle * m_Handle;
|
||||||
|
|
||||||
|
/** Whether the map scale was modified and needs to be resent. */
|
||||||
|
bool m_SendInfo;
|
||||||
|
|
||||||
|
/** Ticks since last decorator update. */
|
||||||
|
unsigned int m_NextDecoratorUpdate;
|
||||||
|
|
||||||
|
/** Number of pixel data updates. */
|
||||||
|
Int64 m_DataUpdate;
|
||||||
|
|
||||||
|
Int64 m_LastUpdate;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::list<cMapClient> cMapClientList;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/** Update the associated decorators. */
|
/** Update the associated decorators. */
|
||||||
@ -193,6 +196,15 @@ private:
|
|||||||
/** Update the specified pixel. */
|
/** Update the specified pixel. */
|
||||||
bool UpdatePixel(unsigned int a_X, unsigned int a_Z);
|
bool UpdatePixel(unsigned int a_X, unsigned int a_Z);
|
||||||
|
|
||||||
|
/** Add a new map client. */
|
||||||
|
void AddPlayer(cPlayer * a_Player, cClientHandle * a_Handle, Int64 a_WorldAge);
|
||||||
|
|
||||||
|
/** Remove inactive or invalid clients. */
|
||||||
|
void RemoveInactiveClients(Int64 a_WorldAge);
|
||||||
|
|
||||||
|
/** Send next update packet to the specified client. */
|
||||||
|
void StreamNext(cMapClient & a_Client);
|
||||||
|
|
||||||
unsigned int m_ID;
|
unsigned int m_ID;
|
||||||
|
|
||||||
unsigned int m_Width;
|
unsigned int m_Width;
|
||||||
@ -218,3 +230,6 @@ private:
|
|||||||
friend class cMapSerializer;
|
friend class cMapSerializer;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user