Better skin colors. Better game message translation

This commit is contained in:
Learath 2020-06-14 20:32:14 +03:00
parent 1514a6df85
commit 9e2434c65d
9 changed files with 134 additions and 55 deletions

View file

@ -40,6 +40,10 @@ def output_map(name, map):
print("inline int {0}(int a) {{ if(a < 0 || a >= {1}) return -1; return gs_{0}[a]; }}".format(name, len(map)))
def main():
guard = "GAME_GENERATED_PROTOCOLGLUE"
print("#ifndef " + guard)
print("#define " + guard)
msgs = get_msgs()
msgs7 = get_msgs_7()
@ -51,5 +55,7 @@ def main():
output_map("Obj_SixToSeven", generate_map(objs, objs7))
output_map("Obj_SevenToSix", generate_map(objs7, objs))
print("#endif //" + guard)
if __name__ == "__main__":
main()

View file

@ -115,6 +115,21 @@ if gen_network_header:
for l in create_enum_table(["NETMSG_INVALID"]+[o.enum_name for o in network.Messages], "NUM_NETMSGTYPES"): print(l)
print("")
print("""
template<class...>
using void_t = void;
template<typename T, typename = void>
struct is_sixup {
constexpr static bool value = false;
};
template<typename T>
struct is_sixup<T, void_t<typename T::is_sixup>> {
constexpr static bool value = true;
};
""")
for item in network.Objects + network.Messages:
for line in item.emit_declaration():
print(line)

View file

@ -268,6 +268,7 @@ class NetMessage(NetObject):
return lines
def emit_declaration(self):
extra = []
extra += ["\tusing is_sixup = char;"]
extra += ["\tint MsgID() const { return %s; }" % self.enum_name]
extra += ["\t"]
extra += ["\tbool Pack(CMsgPacker *pPacker)"]

View file

@ -136,6 +136,20 @@ public:
else
return color4_base::Pack(Alpha);
}
unsigned Pack7()
{
if(m_Lit)
{
float Darkest = 61.0f/255.0f;
ColorHSLA Dark = *this;
Dark.l = (l - Darkest)/(1 - Darkest);
Dark.m_Lit = false;
return Dark.Pack7();
}
else
return color4_base::Pack(false);
}
};
class ColorHSVA : public color4_base<ColorHSVA>

View file

@ -11,7 +11,8 @@ class CMsgPacker : public CPacker
public:
int m_MsgID;
bool m_System;
CMsgPacker(int Type, bool System=false) : m_MsgID(Type), m_System(System)
bool m_NoTranslate;
CMsgPacker(int Type, bool System = false, bool NoTranslate = false) : m_MsgID(Type), m_System(System), m_NoTranslate(NoTranslate)
{
Reset();
}

View file

@ -10,6 +10,7 @@
#include "message.h"
#include <game/generated/protocol.h>
#include <game/generated/protocol7.h>
#include <game/generated/protocolglue.h>
#include <engine/shared/protocol.h>
struct CAntibotRoundData;
@ -118,7 +119,8 @@ public:
template<class T>
int SendPackMsgOne(T *pMsg, int Flags, int ClientID)
{
CMsgPacker Packer(pMsg->MsgID(), false);
CMsgPacker Packer(pMsg->MsgID(), false, protocol7::is_sixup<T>::value);
if(pMsg->Pack(&Packer))
return -1;
return SendMsg(&Packer, Flags, ClientID);

View file

@ -652,7 +652,7 @@ static inline bool RepackMsg(const CMsgPacker *pMsg, CPacker &Packer, bool Sixup
Packer.Reset();
if(MsgId < OFFSET_UUID)
{
if(Sixup)
if(Sixup && !pMsg->m_NoTranslate)
{
if(pMsg->m_System)
{
@ -674,19 +674,11 @@ static inline bool RepackMsg(const CMsgPacker *pMsg, CPacker &Packer, bool Sixup
}
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 < 0)
MsgId *= -1;
else
{
dbg_msg("net", "DROP send game %d", MsgId);
if(MsgId >= 0)
MsgId = Msg_SixToSeven(MsgId);
if(MsgId < 0)
return true;
}
}
}

View file

@ -1127,56 +1127,68 @@ void CGameContext::OnClientEnter(int ClientID)
if(Server()->IsSixup(i))
{
// new info for others
CMsgPacker NewClientInfoMsg(-protocol7::NETMSGTYPE_SV_CLIENTINFO); // NETMSGTYPE_SV_CLIENTINFO
NewClientInfoMsg.AddInt(ClientID);
NewClientInfoMsg.AddInt(0); // m_Local
NewClientInfoMsg.AddInt(pNewPlayer->GetTeam());
NewClientInfoMsg.AddString(Server()->ClientName(ClientID), -1);
NewClientInfoMsg.AddString(Server()->ClientClan(ClientID), -1);
NewClientInfoMsg.AddInt(Server()->ClientCountry(ClientID));
for(int p = 0; p < 6; p++) NewClientInfoMsg.AddString(pNewPlayer->m_TeeInfos.m_apSkinPartNames[p], -1);
for(int p = 0; p < 6; p++) NewClientInfoMsg.AddInt(pNewPlayer->m_TeeInfos.m_aUseCustomColors[p]);
for(int p = 0; p < 6; p++) NewClientInfoMsg.AddInt(pNewPlayer->m_TeeInfos.m_aSkinPartColors[p]);
NewClientInfoMsg.AddInt(0); // m_Silent
protocol7::CNetMsg_Sv_ClientInfo NewClientInfoMsg;
NewClientInfoMsg.m_ClientID = ClientID;
NewClientInfoMsg.m_Local = 0;
NewClientInfoMsg.m_Team = pNewPlayer->GetTeam();
NewClientInfoMsg.m_pName = Server()->ClientName(ClientID);
NewClientInfoMsg.m_pClan = Server()->ClientClan(ClientID);
NewClientInfoMsg.m_Country = Server()->ClientCountry(ClientID);
NewClientInfoMsg.m_Silent = false;
Server()->SendMsg(&NewClientInfoMsg, MSGFLAG_VITAL|MSGFLAG_NORECORD, i);
for(int p = 0; p < 6; p++)
{
NewClientInfoMsg.m_apSkinPartNames[p] = pNewPlayer->m_TeeInfos.m_apSkinPartNames[p];
NewClientInfoMsg.m_aUseCustomColors[p] = pNewPlayer->m_TeeInfos.m_aUseCustomColors[p];
NewClientInfoMsg.m_aSkinPartColors[p] = pNewPlayer->m_TeeInfos.m_aSkinPartColors[p];
}
Server()->SendPackMsgOne(&NewClientInfoMsg, MSGFLAG_VITAL|MSGFLAG_NORECORD, i);
}
if(Server()->IsSixup(ClientID))
{
// existing infos for new player
CMsgPacker ClientInfoMsg(-protocol7::NETMSGTYPE_SV_CLIENTINFO); // NETMSGTYPE_SV_CLIENTINFO
ClientInfoMsg.AddInt(i);
ClientInfoMsg.AddInt(0); // m_Local
ClientInfoMsg.AddInt(pPlayer->GetTeam());
ClientInfoMsg.AddString(Server()->ClientName(i), -1);
ClientInfoMsg.AddString(Server()->ClientClan(i), -1);
ClientInfoMsg.AddInt(Server()->ClientCountry(i));
for(int p = 0; p < 6; p++) ClientInfoMsg.AddString(pPlayer->m_TeeInfos.m_apSkinPartNames[p], -1);
for(int p = 0; p < 6; p++) ClientInfoMsg.AddInt(pPlayer->m_TeeInfos.m_aUseCustomColors[p]);
for(int p = 0; p < 6; p++) ClientInfoMsg.AddInt(pPlayer->m_TeeInfos.m_aSkinPartColors[p]);
ClientInfoMsg.AddInt(0); // m_Silent
protocol7::CNetMsg_Sv_ClientInfo ClientInfoMsg;
ClientInfoMsg.m_ClientID = i;
ClientInfoMsg.m_Local = 0;
ClientInfoMsg.m_Team = pPlayer->GetTeam();
ClientInfoMsg.m_pName = Server()->ClientName(i);
ClientInfoMsg.m_pClan = Server()->ClientClan(i);
ClientInfoMsg.m_Country = Server()->ClientCountry(i);
ClientInfoMsg.m_Silent = 0;
Server()->SendMsg(&ClientInfoMsg, MSGFLAG_VITAL|MSGFLAG_NORECORD, ClientID);
for(int p = 0; p < 6; p++)
{
ClientInfoMsg.m_apSkinPartNames[p] = pPlayer->m_TeeInfos.m_apSkinPartNames[p];
ClientInfoMsg.m_aUseCustomColors[p] = pPlayer->m_TeeInfos.m_aUseCustomColors[p];
ClientInfoMsg.m_aSkinPartColors[p] = pPlayer->m_TeeInfos.m_aSkinPartColors[p];
}
Server()->SendPackMsgOne(&ClientInfoMsg, MSGFLAG_VITAL|MSGFLAG_NORECORD, ClientID);
}
}
// local info
if(Server()->IsSixup(ClientID))
{
CMsgPacker SelfClientInfoMsg(-protocol7::NETMSGTYPE_SV_CLIENTINFO); // NETMSGTYPE_SV_CLIENTINFO
SelfClientInfoMsg.AddInt(ClientID);
SelfClientInfoMsg.AddInt(1); // m_Local
SelfClientInfoMsg.AddInt(pNewPlayer->GetTeam());
SelfClientInfoMsg.AddString(Server()->ClientName(ClientID), -1);
SelfClientInfoMsg.AddString(Server()->ClientClan(ClientID), -1);
SelfClientInfoMsg.AddInt(Server()->ClientCountry(ClientID));
for(int p = 0; p < 6; p++) SelfClientInfoMsg.AddString(pNewPlayer->m_TeeInfos.m_apSkinPartNames[p], -1);
for(int p = 0; p < 6; p++) SelfClientInfoMsg.AddInt(pNewPlayer->m_TeeInfos.m_aUseCustomColors[p]);
for(int p = 0; p < 6; p++) SelfClientInfoMsg.AddInt(pNewPlayer->m_TeeInfos.m_aSkinPartColors[p]);
SelfClientInfoMsg.AddInt(0); // m_Silent
protocol7::CNetMsg_Sv_ClientInfo SelfClientInfoMsg;
SelfClientInfoMsg.m_ClientID = ClientID;
SelfClientInfoMsg.m_Local = 1;
SelfClientInfoMsg.m_Team = pNewPlayer->GetTeam();
SelfClientInfoMsg.m_pName = Server()->ClientName(ClientID);
SelfClientInfoMsg.m_pClan = Server()->ClientClan(ClientID);
SelfClientInfoMsg.m_Country = Server()->ClientCountry(ClientID);
SelfClientInfoMsg.m_Silent = 0;
Server()->SendMsg(&SelfClientInfoMsg, MSGFLAG_VITAL|MSGFLAG_NORECORD, ClientID);
for(int p = 0; p < 6; p++)
{
SelfClientInfoMsg.m_apSkinPartNames[p] = pNewPlayer->m_TeeInfos.m_apSkinPartNames[p];
SelfClientInfoMsg.m_aUseCustomColors[p] = pNewPlayer->m_TeeInfos.m_aUseCustomColors[p];
SelfClientInfoMsg.m_aSkinPartColors[p] = pNewPlayer->m_TeeInfos.m_aSkinPartColors[p];
}
Server()->SendPackMsgOne(&SelfClientInfoMsg, MSGFLAG_VITAL|MSGFLAG_NORECORD, ClientID);
}
}
@ -1375,6 +1387,19 @@ void *CGameContext::PreProcessMsg(int *MsgID, CUnpacker *pUnpacker, int ClientID
Info.FromSixup();
pPlayer->m_TeeInfos = Info;
protocol7::CNetMsg_Sv_SkinChange Msg;
Msg.m_ClientID = ClientID;
for(int p = 0; p < 6; p++)
{
Msg.m_apSkinPartNames[p] = pMsg->m_apSkinPartNames[p];
Msg.m_aSkinPartColors[p] = pMsg->m_aSkinPartColors[p];
Msg.m_aUseCustomColors[p] = pMsg->m_aUseCustomColors[p];
}
for(int i = 0; i < MAX_CLIENTS; i++)
if(Server()->IsSixup(i))
Server()->SendPackMsgOne(&Msg, MSGFLAG_VITAL|MSGFLAG_NORECORD, i);
return 0;
}
else if(*MsgID == protocol7::NETMSGTYPE_CL_SETSPECTATORMODE)
@ -1945,6 +1970,25 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID)
pPlayer->m_TeeInfos.m_ColorFeet = pMsg->m_ColorFeet;
pPlayer->m_TeeInfos.ToSixup();
protocol7::CNetMsg_Sv_SkinChange SkinChangeMsg;
SkinChangeMsg.m_ClientID = ClientID;
for(int p = 0; p < 6; p++)
{
SkinChangeMsg.m_apSkinPartNames[p] = pPlayer->m_TeeInfos.m_apSkinPartNames[p];
SkinChangeMsg.m_aSkinPartColors[p] = pPlayer->m_TeeInfos.m_aSkinPartColors[p];
SkinChangeMsg.m_aUseCustomColors[p] = pPlayer->m_TeeInfos.m_aUseCustomColors[p];
}
//TODO: Common pattern send-to-sixup could be abstracted out
for(int i = 0; i < MAX_CLIENTS; i++)
{
if(Server()->IsSixup(i))
{
dbg_msg("debug", "sending to %d", i);
Server()->SendPackMsgOne(&SkinChangeMsg, MSGFLAG_VITAL, i);
}
}
Server()->ExpireServerInfo();
}
else if (MsgID == NETMSGTYPE_CL_EMOTICON && !m_World.m_Paused)

View file

@ -1,4 +1,5 @@
#include <base/system.h>
#include <base/color.h>
#include "teeinfo.h"
@ -73,16 +74,19 @@ void CTeeInfo::ToSixup()
if(m_UseCustomColor)
{
int ColorBody = ColorHSLA(m_ColorBody).Lighten().Pack7();
dbg_msg("color", "o=%d n=%d", m_ColorBody, ColorBody);
int ColorFeet = ColorHSLA(m_ColorFeet).Lighten().Pack7();
m_aUseCustomColors[0] = true;
m_aUseCustomColors[1] = true;
m_aUseCustomColors[2] = true;
m_aUseCustomColors[3] = true;
m_aUseCustomColors[4] = true;
m_aSkinPartColors[0] = m_ColorBody;
m_aSkinPartColors[0] = ColorBody;
m_aSkinPartColors[1] = 0x22FFFFFF;
m_aSkinPartColors[2] = m_ColorBody;
m_aSkinPartColors[3] = m_ColorBody;
m_aSkinPartColors[4] = m_ColorFeet;
m_aSkinPartColors[2] = ColorBody;
m_aSkinPartColors[3] = ColorBody;
m_aSkinPartColors[4] = ColorFeet;
}
}