mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 10:08:18 +00:00
Do message translation differently
This commit is contained in:
parent
5000b248bb
commit
b0e5a37fa9
|
@ -367,6 +367,23 @@ CClient::CClient() : m_DemoPlayer(&m_SnapshotDelta)
|
|||
}
|
||||
|
||||
// ----- send functions -----
|
||||
static inline bool RepackMsg(const CMsgPacker *pMsg, CPacker &Packer)
|
||||
{
|
||||
Packer.Reset();
|
||||
if(pMsg->m_MsgID < OFFSET_UUID)
|
||||
{
|
||||
Packer.AddInt((pMsg->m_MsgID<<1)|(pMsg->m_System?1:0));
|
||||
}
|
||||
else
|
||||
{
|
||||
Packer.AddInt((0<<1)|(pMsg->m_System?1:0)); // NETMSG_EX, NETMSGTYPE_EX
|
||||
g_UuidManager.PackUuid(pMsg->m_MsgID, &Packer);
|
||||
}
|
||||
Packer.AddRaw(pMsg->Data(), pMsg->Size());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int CClient::SendMsg(CMsgPacker *pMsg, int Flags)
|
||||
{
|
||||
CNetChunk Packet;
|
||||
|
@ -374,10 +391,15 @@ int CClient::SendMsg(CMsgPacker *pMsg, int Flags)
|
|||
if(State() == IClient::STATE_OFFLINE)
|
||||
return 0;
|
||||
|
||||
// repack message (inefficient)
|
||||
CPacker Pack;
|
||||
if(RepackMsg(pMsg, Pack))
|
||||
return 0;
|
||||
|
||||
mem_zero(&Packet, sizeof(CNetChunk));
|
||||
Packet.m_ClientID = 0;
|
||||
Packet.m_pData = pMsg->Data();
|
||||
Packet.m_DataSize = pMsg->Size();
|
||||
Packet.m_pData = Pack.Data();
|
||||
Packet.m_DataSize = Pack.Size();
|
||||
|
||||
if(Flags&MSGFLAG_VITAL)
|
||||
Packet.m_Flags |= NETSENDFLAG_VITAL;
|
||||
|
@ -841,11 +863,15 @@ int CClient::SendMsgY(CMsgPacker *pMsg, int Flags, int NetClient)
|
|||
{
|
||||
CNetChunk Packet;
|
||||
|
||||
mem_zero(&Packet, sizeof(CNetChunk));
|
||||
// repack message (inefficient)
|
||||
CPacker Pack;
|
||||
if(RepackMsg(pMsg, Pack))
|
||||
return 0;
|
||||
|
||||
mem_zero(&Packet, sizeof(CNetChunk));
|
||||
Packet.m_ClientID = 0;
|
||||
Packet.m_pData = pMsg->Data();
|
||||
Packet.m_DataSize = pMsg->Size();
|
||||
Packet.m_pData = Pack.Data();
|
||||
Packet.m_DataSize = Pack.Size();
|
||||
|
||||
if(Flags&MSGFLAG_VITAL)
|
||||
Packet.m_Flags |= NETSENDFLAG_VITAL;
|
||||
|
|
|
@ -9,18 +9,11 @@
|
|||
class CMsgPacker : public CPacker
|
||||
{
|
||||
public:
|
||||
CMsgPacker(int Type, bool System=false)
|
||||
int m_MsgID;
|
||||
bool m_System;
|
||||
CMsgPacker(int Type, bool System=false) : m_MsgID(Type), m_System(System)
|
||||
{
|
||||
Reset();
|
||||
if(Type < OFFSET_UUID)
|
||||
{
|
||||
AddInt((Type<<1)|(System?1:0));
|
||||
}
|
||||
else
|
||||
{
|
||||
AddInt((0<<1)|(System?1:0)); // NETMSG_EX, NETMSGTYPE_EX
|
||||
g_UuidManager.PackUuid(Type, this);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -646,16 +646,77 @@ int CServer::DistinctClientCount()
|
|||
return ClientCount;
|
||||
}
|
||||
|
||||
static inline bool RepackMsg(const CMsgPacker *pMsg, CPacker &Packer, bool Sixup)
|
||||
{
|
||||
int MsgId = pMsg->m_MsgID;
|
||||
Packer.Reset();
|
||||
if(MsgId < OFFSET_UUID)
|
||||
{
|
||||
if(Sixup)
|
||||
{
|
||||
if(pMsg->m_System)
|
||||
{
|
||||
if(MsgId >= NETMSG_MAP_CHANGE && MsgId <= NETMSG_MAP_DATA)
|
||||
;
|
||||
else if(MsgId >= NETMSG_CON_READY && MsgId <= NETMSG_INPUTTIMING)
|
||||
MsgId += 1;
|
||||
else if(MsgId >= NETMSG_AUTH_CHALLANGE && MsgId <= NETMSG_AUTH_RESULT)
|
||||
MsgId += 4;
|
||||
else if(MsgId >= NETMSG_PING && MsgId <= NETMSG_ERROR)
|
||||
MsgId += 4;
|
||||
else if(MsgId > 24)
|
||||
MsgId -= 24;
|
||||
else
|
||||
{
|
||||
dbg_msg("net", "DROP send sys %d", MsgId);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(MsgId >= NETMSGTYPE_SV_MOTD && MsgId <= NETMSGTYPE_SV_CHAT)
|
||||
;
|
||||
else if(MsgId == NETMSGTYPE_SV_KILLMSG)
|
||||
MsgId += 1;
|
||||
else if(MsgId >= NETMSGTYPE_SV_TUNEPARAMS && MsgId <= NETMSGTYPE_SV_VOTESTATUS)
|
||||
;
|
||||
else if(MsgId > 24)
|
||||
MsgId -= 24;
|
||||
else
|
||||
{
|
||||
dbg_msg("net", "DROP send game %d", MsgId);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Packer.AddInt((MsgId<<1)|(pMsg->m_System?1:0));
|
||||
}
|
||||
else if(!Sixup)
|
||||
{
|
||||
Packer.AddInt((0<<1)|(pMsg->m_System?1:0)); // NETMSG_EX, NETMSGTYPE_EX
|
||||
g_UuidManager.PackUuid(MsgId, &Packer);
|
||||
}
|
||||
Packer.AddRaw(pMsg->Data(), pMsg->Size());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int CServer::SendMsg(CMsgPacker *pMsg, int Flags, int ClientID)
|
||||
{
|
||||
CNetChunk Packet;
|
||||
if(!pMsg)
|
||||
return -1;
|
||||
|
||||
// repack message (inefficient)
|
||||
CPacker Pack;
|
||||
if(RepackMsg(pMsg, Pack, m_aClients[ClientID].m_Sixup))
|
||||
return 0;
|
||||
|
||||
mem_zero(&Packet, sizeof(CNetChunk));
|
||||
Packet.m_ClientID = ClientID;
|
||||
Packet.m_pData = pMsg->Data();
|
||||
Packet.m_DataSize = pMsg->Size();
|
||||
Packet.m_pData = Pack.Data();
|
||||
Packet.m_DataSize = Pack.Size();
|
||||
|
||||
if(Flags&MSGFLAG_VITAL)
|
||||
Packet.m_Flags |= NETSENDFLAG_VITAL;
|
||||
|
@ -666,8 +727,8 @@ int CServer::SendMsg(CMsgPacker *pMsg, int Flags, int ClientID)
|
|||
if(!(Flags&MSGFLAG_NORECORD))
|
||||
{
|
||||
if(ClientID > -1)
|
||||
m_aDemoRecorder[ClientID].RecordMessage(pMsg->Data(), pMsg->Size());
|
||||
m_aDemoRecorder[MAX_CLIENTS].RecordMessage(pMsg->Data(), pMsg->Size());
|
||||
m_aDemoRecorder[ClientID].RecordMessage(Pack.Data(), Pack.Size());
|
||||
m_aDemoRecorder[MAX_CLIENTS].RecordMessage(Pack.Data(), Pack.Size());
|
||||
}
|
||||
|
||||
if(!(Flags&MSGFLAG_NOSEND))
|
||||
|
|
|
@ -77,49 +77,6 @@ static unsigned char MsgTypeFromSixup(unsigned char Byte)
|
|||
return (Msg<<1) | (Byte&1);
|
||||
}
|
||||
|
||||
static unsigned char MsgTypeToSixup(unsigned char Byte)
|
||||
{
|
||||
unsigned char Msg = Byte>>1;
|
||||
unsigned char Six;
|
||||
if (Byte&1)
|
||||
{
|
||||
if(Msg >= NETMSG_MAP_CHANGE && Msg <= NETMSG_MAP_DATA)
|
||||
Six = Msg;
|
||||
else if(Msg >= NETMSG_CON_READY && Msg <= NETMSG_INPUTTIMING)
|
||||
Six = Msg + 1;
|
||||
else if(Msg >= NETMSG_AUTH_CHALLANGE && Msg <= NETMSG_AUTH_RESULT)
|
||||
Six = Msg + 4;
|
||||
else if(Msg >= NETMSG_PING && Msg <= NETMSG_ERROR)
|
||||
Six = Msg + 4;
|
||||
else if(Msg > 24)
|
||||
Six = Msg - 24;
|
||||
else
|
||||
{
|
||||
dbg_msg("net", "DROP send sys %d", Msg);
|
||||
return 0;
|
||||
}
|
||||
//dbg_msg("net", "send sys %d -> %d", Msg, Six);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(Msg >= NETMSGTYPE_SV_MOTD && Msg <= NETMSGTYPE_SV_CHAT)
|
||||
Six = Msg;
|
||||
else if(Msg == NETMSGTYPE_SV_KILLMSG)
|
||||
Six = Msg + 1;
|
||||
else if(Msg >= NETMSGTYPE_SV_TUNEPARAMS && Msg <= NETMSGTYPE_SV_VOTESTATUS)
|
||||
Six = Msg;
|
||||
else if(Msg > 24)
|
||||
Six = Msg - 24;
|
||||
else
|
||||
{
|
||||
dbg_msg("net", "DROP send msg %d", Msg);
|
||||
return 0;
|
||||
}
|
||||
//dbg_msg("net", "send msg %d -> %d", Msg, Six);
|
||||
}
|
||||
return (Six<<1) | (Byte&1);
|
||||
}
|
||||
|
||||
static SECURITY_TOKEN ToSecurityToken(const unsigned char *pData)
|
||||
{
|
||||
return (int)pData[0] | (pData[1] << 8) | (pData[2] << 16) | (pData[3] << 24);
|
||||
|
@ -813,13 +770,6 @@ int CNetServer::Send(CNetChunk *pChunk)
|
|||
dbg_assert(pChunk->m_ClientID >= 0, "errornous client id");
|
||||
dbg_assert(pChunk->m_ClientID < MaxClients(), "errornous client id");
|
||||
|
||||
if(m_aSlots[pChunk->m_ClientID].m_Connection.m_Sixup)
|
||||
{
|
||||
unsigned int MsgType = MsgTypeToSixup(*(unsigned char*)pChunk->m_pData);
|
||||
if (MsgType == 0) return 0;
|
||||
*(unsigned char*)pChunk->m_pData = MsgType;
|
||||
}
|
||||
|
||||
if(pChunk->m_Flags&NETSENDFLAG_VITAL)
|
||||
Flags = NET_CHUNKFLAG_VITAL;
|
||||
|
||||
|
|
|
@ -1111,6 +1111,7 @@ void CGameContext::OnClientEnter(int ClientID)
|
|||
Server()->ExpireServerInfo();
|
||||
|
||||
// update client infos (others before local)
|
||||
dbg_msg("debug", "sending info");
|
||||
for(int i = 0; i < MAX_CLIENTS; ++i)
|
||||
{
|
||||
if(i == ClientID || !m_apPlayers[i] || !Server()->ClientIngame(i))
|
||||
|
|
Loading…
Reference in a new issue