Get /spec working

This commit is contained in:
Learath 2020-06-12 23:53:41 +03:00
parent e81c718180
commit 9dc1a0357a
3 changed files with 52 additions and 9 deletions

View file

@ -3248,9 +3248,10 @@ void CServer::SnapFreeID(int ID)
}
void *CServer::SnapNewItem(int Type, int ID, int Size)
{
if(!(Type >= 0 && Type <= 0xffff))
if(Type > 0xffff)
{
g_UuidManager.GetUuid(Type);
}

View file

@ -1377,6 +1377,18 @@ void *CGameContext::PreProcessMsg(int *MsgID, CUnpacker *pUnpacker, int ClientID
return 0;
}
else if(*MsgID == protocol7::NETMSGTYPE_CL_SETSPECTATORMODE)
{
protocol7::CNetMsg_Cl_SetSpectatorMode *pMsg7 = (protocol7::CNetMsg_Cl_SetSpectatorMode *)pRawMsg;
::CNetMsg_Cl_SetSpectatorMode *pMsg = (::CNetMsg_Cl_SetSpectatorMode *)s_aRawMsg;
if(pMsg7->m_SpecMode == protocol7::SPEC_FREEVIEW)
pMsg->m_SpectatorID = SPEC_FREEVIEW;
else if(pMsg7->m_SpecMode == protocol7::SPEC_PLAYER)
pMsg->m_SpectatorID = pMsg7->m_SpectatorID;
else
pMsg->m_SpectatorID = SPEC_FREEVIEW; // Probably not needed
}
*MsgID = Msg_SevenToSix(*MsgID);
@ -3503,7 +3515,7 @@ void CGameContext::WhisperID(int ClientID, int VictimID, const char *pMessage)
Msg.m_pMessage = pMessage;
Msg.m_TargetID = VictimID;
Server()->SendPackMsgOne(&Msg, MSGFLAG_VITAL, ClientID);
Server()->SendPackMsgOne(&Msg, MSGFLAG_VITAL|MSGFLAG_NORECORD, ClientID);
}
else if(GetClientVersion(ClientID) >= VERSION_DDNET_WHISPER)
{
@ -3530,7 +3542,7 @@ void CGameContext::WhisperID(int ClientID, int VictimID, const char *pMessage)
Msg.m_pMessage = pMessage;
Msg.m_TargetID = VictimID;
Server()->SendPackMsgOne(&Msg, MSGFLAG_VITAL, VictimID);
Server()->SendPackMsgOne(&Msg, MSGFLAG_VITAL|MSGFLAG_NORECORD, VictimID);
}
else if(GetClientVersion(VictimID) >= VERSION_DDNET_WHISPER)
{

View file

@ -355,13 +355,27 @@ void CPlayer::Snap(int SnappingClient)
if(m_ClientID == SnappingClient && (m_Team == TEAM_SPECTATORS || m_Paused))
{
CNetObj_SpectatorInfo *pSpectatorInfo = static_cast<CNetObj_SpectatorInfo *>(Server()->SnapNewItem(NETOBJTYPE_SPECTATORINFO, m_ClientID, sizeof(CNetObj_SpectatorInfo)));
if(!pSpectatorInfo)
return;
if(!Server()->IsSixup(SnappingClient))
{
CNetObj_SpectatorInfo *pSpectatorInfo = static_cast<CNetObj_SpectatorInfo *>(Server()->SnapNewItem(NETOBJTYPE_SPECTATORINFO, m_ClientID, sizeof(CNetObj_SpectatorInfo)));
if(!pSpectatorInfo)
return;
pSpectatorInfo->m_SpectatorID = m_SpectatorID;
pSpectatorInfo->m_X = m_ViewPos.x;
pSpectatorInfo->m_Y = m_ViewPos.y;
pSpectatorInfo->m_SpectatorID = m_SpectatorID;
pSpectatorInfo->m_X = m_ViewPos.x;
pSpectatorInfo->m_Y = m_ViewPos.y;
}
else
{
protocol7::CNetObj_SpectatorInfo *pSpectatorInfo = static_cast<protocol7::CNetObj_SpectatorInfo *>(Server()->SnapNewItem(NETOBJTYPE_SPECTATORINFO, m_ClientID, sizeof(protocol7::CNetObj_SpectatorInfo)));
if(!pSpectatorInfo)
return;
pSpectatorInfo->m_SpecMode = m_SpectatorID == SPEC_FREEVIEW ? protocol7::SPEC_FREEVIEW : protocol7::SPEC_PLAYER;
pSpectatorInfo->m_SpectatorID = m_SpectatorID;
pSpectatorInfo->m_X = m_ViewPos.x;
pSpectatorInfo->m_Y = m_ViewPos.y;
}
}
CNetObj_DDNetPlayer *pDDNetPlayer = static_cast<CNetObj_DDNetPlayer *>(Server()->SnapNewItem(NETOBJTYPE_DDNETPLAYER, id, sizeof(CNetObj_DDNetPlayer)));
@ -383,6 +397,9 @@ void CPlayer::FakeSnap()
if(GetClientVersion() >= VERSION_DDNET_OLD)
return;
if(Server()->IsSixup(m_ClientID))
return;
int FakeID = VANILLA_MAX_CLIENTS - 1;
CNetObj_ClientInfo *pClientInfo = static_cast<CNetObj_ClientInfo *>(Server()->SnapNewItem(NETOBJTYPE_CLIENTINFO, FakeID, sizeof(CNetObj_ClientInfo)));
@ -593,6 +610,19 @@ void CPlayer::SetTeam(int Team, bool DoChatMsg)
//GameServer()->m_pController->OnPlayerInfoChange(GameServer()->m_apPlayers[m_ClientID]);
for(int i = 0; i < MAX_CLIENTS; i++)
{
if(Server()->ClientIngame(i) && Server()->IsSixup(i))
{
protocol7::CNetMsg_Sv_Team Msg;
Msg.m_ClientID = m_ClientID;
Msg.m_Team = m_Team;
Msg.m_Silent = !DoChatMsg;
Msg.m_CooldownTick = m_LastSetTeam + Server()->TickSpeed() * g_Config.m_SvTeamChangeDelay;
Server()->SendPackMsgOne(&Msg, MSGFLAG_VITAL|MSGFLAG_NORECORD, i);
}
}
if(Team == TEAM_SPECTATORS)
{
// update spectator modes