mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 10:08:18 +00:00
commit
b1c4148e9c
|
@ -173,6 +173,8 @@ void CHud::RenderScoreHud()
|
||||||
float Whole = 300 * Graphics()->ScreenAspect();
|
float Whole = 300 * Graphics()->ScreenAspect();
|
||||||
float StartY = 229.0f;
|
float StartY = 229.0f;
|
||||||
|
|
||||||
|
const float ScoreSingleBoxHeight = 18.0f;
|
||||||
|
|
||||||
bool ForceScoreInfoInit = !m_aScoreInfo[0].m_Initialized || !m_aScoreInfo[1].m_Initialized;
|
bool ForceScoreInfoInit = !m_aScoreInfo[0].m_Initialized || !m_aScoreInfo[1].m_Initialized;
|
||||||
m_aScoreInfo[0].m_Initialized = m_aScoreInfo[1].m_Initialized = true;
|
m_aScoreInfo[0].m_Initialized = m_aScoreInfo[1].m_Initialized = true;
|
||||||
|
|
||||||
|
@ -215,7 +217,7 @@ void CHud::RenderScoreHud()
|
||||||
Graphics()->SetColor(1.0f, 0.0f, 0.0f, 0.25f);
|
Graphics()->SetColor(1.0f, 0.0f, 0.0f, 0.25f);
|
||||||
else
|
else
|
||||||
Graphics()->SetColor(0.0f, 0.0f, 1.0f, 0.25f);
|
Graphics()->SetColor(0.0f, 0.0f, 1.0f, 0.25f);
|
||||||
m_aScoreInfo[t].m_RoundRectQuadContainerIndex = RenderTools()->CreateRoundRectQuadContainer(Whole - ScoreWidthMax - ImageSize - 2 * Split, StartY + t * 20, ScoreWidthMax + ImageSize + 2 * Split, 18.0f, 5.0f, CUI::CORNER_L);
|
m_aScoreInfo[t].m_RoundRectQuadContainerIndex = RenderTools()->CreateRoundRectQuadContainer(Whole - ScoreWidthMax - ImageSize - 2 * Split, StartY + t * 20, ScoreWidthMax + ImageSize + 2 * Split, ScoreSingleBoxHeight, 5.0f, CUI::CORNER_L);
|
||||||
}
|
}
|
||||||
Graphics()->TextureClear();
|
Graphics()->TextureClear();
|
||||||
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
|
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
|
@ -282,10 +284,15 @@ void CHud::RenderScoreHud()
|
||||||
}
|
}
|
||||||
|
|
||||||
// draw tee of the flag holder
|
// draw tee of the flag holder
|
||||||
CTeeRenderInfo Info = m_pClient->m_aClients[ID].m_RenderInfo;
|
CTeeRenderInfo TeeInfo = m_pClient->m_aClients[ID].m_RenderInfo;
|
||||||
Info.m_Size = 18.0f;
|
TeeInfo.m_Size = ScoreSingleBoxHeight;
|
||||||
RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, EMOTE_NORMAL, vec2(1, 0),
|
|
||||||
vec2(Whole - ScoreWidthMax - Info.m_Size / 2 - Split, StartY + 1.0f + Info.m_Size / 2 + t * 20));
|
CAnimState *pIdleState = CAnimState::GetIdle();
|
||||||
|
vec2 OffsetToMid;
|
||||||
|
RenderTools()->GetRenderTeeOffsetToRenderedTee(pIdleState, &TeeInfo, OffsetToMid);
|
||||||
|
vec2 TeeRenderPos(Whole - ScoreWidthMax - TeeInfo.m_Size / 2 - Split, StartY + (t * 20) + ScoreSingleBoxHeight / 2.0f + OffsetToMid.y);
|
||||||
|
|
||||||
|
RenderTools()->RenderTee(pIdleState, &TeeInfo, EMOTE_NORMAL, vec2(1.0f, 0.0f), TeeRenderPos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
StartY += 8.0f;
|
StartY += 8.0f;
|
||||||
|
@ -391,7 +398,7 @@ void CHud::RenderScoreHud()
|
||||||
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.25f);
|
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 0.25f);
|
||||||
else
|
else
|
||||||
Graphics()->SetColor(0.0f, 0.0f, 0.0f, 0.25f);
|
Graphics()->SetColor(0.0f, 0.0f, 0.0f, 0.25f);
|
||||||
m_aScoreInfo[t].m_RoundRectQuadContainerIndex = RenderTools()->CreateRoundRectQuadContainer(Whole - ScoreWidthMax - ImageSize - 2 * Split - PosSize, StartY + t * 20, ScoreWidthMax + ImageSize + 2 * Split + PosSize, 18.0f, 5.0f, CUI::CORNER_L);
|
m_aScoreInfo[t].m_RoundRectQuadContainerIndex = RenderTools()->CreateRoundRectQuadContainer(Whole - ScoreWidthMax - ImageSize - 2 * Split - PosSize, StartY + t * 20, ScoreWidthMax + ImageSize + 2 * Split + PosSize, ScoreSingleBoxHeight, 5.0f, CUI::CORNER_L);
|
||||||
}
|
}
|
||||||
Graphics()->TextureClear();
|
Graphics()->TextureClear();
|
||||||
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
|
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
|
@ -446,10 +453,15 @@ void CHud::RenderScoreHud()
|
||||||
}
|
}
|
||||||
|
|
||||||
// draw tee
|
// draw tee
|
||||||
CTeeRenderInfo Info = m_pClient->m_aClients[ID].m_RenderInfo;
|
CTeeRenderInfo TeeInfo = m_pClient->m_aClients[ID].m_RenderInfo;
|
||||||
Info.m_Size = 18.0f;
|
TeeInfo.m_Size = ScoreSingleBoxHeight;
|
||||||
RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, EMOTE_NORMAL, vec2(1, 0),
|
|
||||||
vec2(Whole - ScoreWidthMax - Info.m_Size / 2 - Split, StartY + 1.0f + Info.m_Size / 2 + t * 20));
|
CAnimState *pIdleState = CAnimState::GetIdle();
|
||||||
|
vec2 OffsetToMid;
|
||||||
|
RenderTools()->GetRenderTeeOffsetToRenderedTee(pIdleState, &TeeInfo, OffsetToMid);
|
||||||
|
vec2 TeeRenderPos(Whole - ScoreWidthMax - TeeInfo.m_Size / 2 - Split, StartY + (t * 20) + ScoreSingleBoxHeight / 2.0f + OffsetToMid.y);
|
||||||
|
|
||||||
|
RenderTools()->RenderTee(pIdleState, &TeeInfo, EMOTE_NORMAL, vec2(1.0f, 0.0f), TeeRenderPos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -221,7 +221,17 @@ void CKillMessages::OnRender()
|
||||||
}
|
}
|
||||||
|
|
||||||
if(m_aKillmsgs[r].m_VictimID >= 0)
|
if(m_aKillmsgs[r].m_VictimID >= 0)
|
||||||
RenderTools()->RenderTee(CAnimState::GetIdle(), &m_aKillmsgs[r].m_VictimRenderInfo, EMOTE_PAIN, vec2(-1, 0), vec2(x, y + 28));
|
{
|
||||||
|
CTeeRenderInfo TeeInfo = m_aKillmsgs[r].m_VictimRenderInfo;
|
||||||
|
|
||||||
|
CAnimState *pIdleState = CAnimState::GetIdle();
|
||||||
|
vec2 OffsetToMid;
|
||||||
|
RenderTools()->GetRenderTeeOffsetToRenderedTee(pIdleState, &TeeInfo, OffsetToMid);
|
||||||
|
vec2 TeeRenderPos(x, y + 46.0f / 2.0f + OffsetToMid.y);
|
||||||
|
|
||||||
|
RenderTools()->RenderTee(pIdleState, &TeeInfo, EMOTE_PAIN, vec2(-1, 0), TeeRenderPos);
|
||||||
|
}
|
||||||
|
|
||||||
x -= 32.0f;
|
x -= 32.0f;
|
||||||
|
|
||||||
// render weapon
|
// render weapon
|
||||||
|
@ -254,8 +264,19 @@ void CKillMessages::OnRender()
|
||||||
|
|
||||||
// render killer tee
|
// render killer tee
|
||||||
x -= 24.0f;
|
x -= 24.0f;
|
||||||
|
|
||||||
if(m_aKillmsgs[r].m_KillerID >= 0)
|
if(m_aKillmsgs[r].m_KillerID >= 0)
|
||||||
RenderTools()->RenderTee(CAnimState::GetIdle(), &m_aKillmsgs[r].m_KillerRenderInfo, EMOTE_ANGRY, vec2(1, 0), vec2(x, y + 28));
|
{
|
||||||
|
CTeeRenderInfo TeeInfo = m_aKillmsgs[r].m_KillerRenderInfo;
|
||||||
|
|
||||||
|
CAnimState *pIdleState = CAnimState::GetIdle();
|
||||||
|
vec2 OffsetToMid;
|
||||||
|
RenderTools()->GetRenderTeeOffsetToRenderedTee(pIdleState, &TeeInfo, OffsetToMid);
|
||||||
|
vec2 TeeRenderPos(x, y + 46.0f / 2.0f + OffsetToMid.y);
|
||||||
|
|
||||||
|
RenderTools()->RenderTee(pIdleState, &TeeInfo, EMOTE_ANGRY, vec2(1, 0), TeeRenderPos);
|
||||||
|
}
|
||||||
|
|
||||||
x -= 32.0f;
|
x -= 32.0f;
|
||||||
|
|
||||||
// render killer name
|
// render killer name
|
||||||
|
|
|
@ -293,9 +293,16 @@ void CMenus::RenderPlayers(CUIRect MainView)
|
||||||
|
|
||||||
// player info
|
// player info
|
||||||
Player.VSplitLeft(28.0f, &Button, &Player);
|
Player.VSplitLeft(28.0f, &Button, &Player);
|
||||||
CTeeRenderInfo Info = m_pClient->m_aClients[Index].m_RenderInfo;
|
|
||||||
Info.m_Size = Button.h;
|
CTeeRenderInfo TeeInfo = m_pClient->m_aClients[Index].m_RenderInfo;
|
||||||
RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, EMOTE_NORMAL, vec2(1.0f, 0.0f), vec2(Button.x + Button.h / 2, Button.y + Button.h / 2));
|
TeeInfo.m_Size = Button.h;
|
||||||
|
|
||||||
|
CAnimState *pIdleState = CAnimState::GetIdle();
|
||||||
|
vec2 OffsetToMid;
|
||||||
|
RenderTools()->GetRenderTeeOffsetToRenderedTee(pIdleState, &TeeInfo, OffsetToMid);
|
||||||
|
vec2 TeeRenderPos(Button.x + Button.h / 2, Button.y + Button.h / 2 + OffsetToMid.y);
|
||||||
|
|
||||||
|
RenderTools()->RenderTee(pIdleState, &TeeInfo, EMOTE_NORMAL, vec2(1.0f, 0.0f), TeeRenderPos);
|
||||||
|
|
||||||
Player.HSplitTop(1.5f, 0, &Player);
|
Player.HSplitTop(1.5f, 0, &Player);
|
||||||
Player.VSplitMid(&Player, &Button);
|
Player.VSplitMid(&Player, &Button);
|
||||||
|
@ -589,10 +596,17 @@ bool CMenus::RenderServerControlKick(CUIRect MainView, bool FilterSpectators)
|
||||||
|
|
||||||
if(Item.m_Visible)
|
if(Item.m_Visible)
|
||||||
{
|
{
|
||||||
CTeeRenderInfo Info = m_pClient->m_aClients[aPlayerIDs[i]].m_RenderInfo;
|
CTeeRenderInfo TeeInfo = m_pClient->m_aClients[aPlayerIDs[i]].m_RenderInfo;
|
||||||
Info.m_Size = Item.m_Rect.h;
|
TeeInfo.m_Size = Item.m_Rect.h;
|
||||||
RenderTools()->RenderTee(CAnimState::GetIdle(), &Info, EMOTE_NORMAL, vec2(1, 0), vec2(Item.m_Rect.x + Item.m_Rect.h / 2, Item.m_Rect.y + Item.m_Rect.h / 2));
|
|
||||||
Item.m_Rect.x += Info.m_Size;
|
CAnimState *pIdleState = CAnimState::GetIdle();
|
||||||
|
vec2 OffsetToMid;
|
||||||
|
RenderTools()->GetRenderTeeOffsetToRenderedTee(pIdleState, &TeeInfo, OffsetToMid);
|
||||||
|
vec2 TeeRenderPos(Item.m_Rect.x + Item.m_Rect.h / 2, Item.m_Rect.y + Item.m_Rect.h / 2 + OffsetToMid.y);
|
||||||
|
|
||||||
|
RenderTools()->RenderTee(pIdleState, &TeeInfo, EMOTE_NORMAL, vec2(1.0f, 0.0f), TeeRenderPos);
|
||||||
|
|
||||||
|
Item.m_Rect.x += TeeInfo.m_Size;
|
||||||
UI()->DoLabelScaled(&Item.m_Rect, m_pClient->m_aClients[aPlayerIDs[i]].m_aName, 16.0f, -1);
|
UI()->DoLabelScaled(&Item.m_Rect, m_pClient->m_aClients[aPlayerIDs[i]].m_aName, 16.0f, -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -737,6 +737,15 @@ void CCharacter::OnDirectInput(CNetObj_PlayerInput *pNewInput)
|
||||||
mem_copy(&m_LatestPrevInput, &m_LatestInput, sizeof(m_LatestInput));
|
mem_copy(&m_LatestPrevInput, &m_LatestInput, sizeof(m_LatestInput));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CCharacter::ResetHook()
|
||||||
|
{
|
||||||
|
m_Core.m_HookedPlayer = -1;
|
||||||
|
m_Core.m_HookState = HOOK_RETRACTED;
|
||||||
|
m_Core.m_TriggeredEvents |= COREEVENT_HOOK_RETRACT;
|
||||||
|
GameWorld()->ReleaseHooked(GetPlayer()->GetCID());
|
||||||
|
m_Core.m_HookPos = m_Core.m_Pos;
|
||||||
|
}
|
||||||
|
|
||||||
void CCharacter::ResetInput()
|
void CCharacter::ResetInput()
|
||||||
{
|
{
|
||||||
m_Input.m_Direction = 0;
|
m_Input.m_Direction = 0;
|
||||||
|
@ -1886,10 +1895,7 @@ void CCharacter::HandleTiles(int Index)
|
||||||
m_Core.m_Pos = (*m_pTeleOuts)[z - 1][TeleOut];
|
m_Core.m_Pos = (*m_pTeleOuts)[z - 1][TeleOut];
|
||||||
if(!g_Config.m_SvTeleportHoldHook)
|
if(!g_Config.m_SvTeleportHoldHook)
|
||||||
{
|
{
|
||||||
m_Core.m_HookedPlayer = -1;
|
ResetHook();
|
||||||
m_Core.m_HookState = HOOK_RETRACTED;
|
|
||||||
m_Core.m_TriggeredEvents |= COREEVENT_HOOK_RETRACT;
|
|
||||||
m_Core.m_HookPos = m_Core.m_Pos;
|
|
||||||
}
|
}
|
||||||
if(g_Config.m_SvTeleportLoseWeapons)
|
if(g_Config.m_SvTeleportLoseWeapons)
|
||||||
ResetPickups();
|
ResetPickups();
|
||||||
|
@ -1908,11 +1914,7 @@ void CCharacter::HandleTiles(int Index)
|
||||||
|
|
||||||
if(!g_Config.m_SvTeleportHoldHook)
|
if(!g_Config.m_SvTeleportHoldHook)
|
||||||
{
|
{
|
||||||
m_Core.m_HookedPlayer = -1;
|
ResetHook();
|
||||||
m_Core.m_HookState = HOOK_RETRACTED;
|
|
||||||
m_Core.m_TriggeredEvents |= COREEVENT_HOOK_RETRACT;
|
|
||||||
GameWorld()->ReleaseHooked(GetPlayer()->GetCID());
|
|
||||||
m_Core.m_HookPos = m_Core.m_Pos;
|
|
||||||
}
|
}
|
||||||
if(g_Config.m_SvTeleportLoseWeapons)
|
if(g_Config.m_SvTeleportLoseWeapons)
|
||||||
{
|
{
|
||||||
|
@ -1936,11 +1938,7 @@ void CCharacter::HandleTiles(int Index)
|
||||||
|
|
||||||
if(!g_Config.m_SvTeleportHoldHook)
|
if(!g_Config.m_SvTeleportHoldHook)
|
||||||
{
|
{
|
||||||
m_Core.m_HookedPlayer = -1;
|
ResetHook();
|
||||||
m_Core.m_HookState = HOOK_RETRACTED;
|
|
||||||
m_Core.m_TriggeredEvents |= COREEVENT_HOOK_RETRACT;
|
|
||||||
GameWorld()->ReleaseHooked(GetPlayer()->GetCID());
|
|
||||||
m_Core.m_HookPos = m_Core.m_Pos;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -1955,11 +1953,7 @@ void CCharacter::HandleTiles(int Index)
|
||||||
|
|
||||||
if(!g_Config.m_SvTeleportHoldHook)
|
if(!g_Config.m_SvTeleportHoldHook)
|
||||||
{
|
{
|
||||||
m_Core.m_HookedPlayer = -1;
|
ResetHook();
|
||||||
m_Core.m_HookState = HOOK_RETRACTED;
|
|
||||||
m_Core.m_TriggeredEvents |= COREEVENT_HOOK_RETRACT;
|
|
||||||
GameWorld()->ReleaseHooked(GetPlayer()->GetCID());
|
|
||||||
m_Core.m_HookPos = m_Core.m_Pos;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -1978,10 +1972,7 @@ void CCharacter::HandleTiles(int Index)
|
||||||
|
|
||||||
if(!g_Config.m_SvTeleportHoldHook)
|
if(!g_Config.m_SvTeleportHoldHook)
|
||||||
{
|
{
|
||||||
m_Core.m_HookedPlayer = -1;
|
ResetHook();
|
||||||
m_Core.m_HookState = HOOK_RETRACTED;
|
|
||||||
m_Core.m_TriggeredEvents |= COREEVENT_HOOK_RETRACT;
|
|
||||||
m_Core.m_HookPos = m_Core.m_Pos;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -1995,10 +1986,7 @@ void CCharacter::HandleTiles(int Index)
|
||||||
|
|
||||||
if(!g_Config.m_SvTeleportHoldHook)
|
if(!g_Config.m_SvTeleportHoldHook)
|
||||||
{
|
{
|
||||||
m_Core.m_HookedPlayer = -1;
|
ResetHook();
|
||||||
m_Core.m_HookState = HOOK_RETRACTED;
|
|
||||||
m_Core.m_TriggeredEvents |= COREEVENT_HOOK_RETRACT;
|
|
||||||
m_Core.m_HookPos = m_Core.m_Pos;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -2275,9 +2263,7 @@ void CCharacter::Pause(bool Pause)
|
||||||
|
|
||||||
if(m_Core.m_HookedPlayer != -1) // Keeping hook would allow cheats
|
if(m_Core.m_HookedPlayer != -1) // Keeping hook would allow cheats
|
||||||
{
|
{
|
||||||
m_Core.m_HookedPlayer = -1;
|
ResetHook();
|
||||||
m_Core.m_HookState = HOOK_RETRACTED;
|
|
||||||
m_Core.m_TriggeredEvents |= COREEVENT_HOOK_RETRACT;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -54,6 +54,7 @@ public:
|
||||||
|
|
||||||
void OnPredictedInput(CNetObj_PlayerInput *pNewInput);
|
void OnPredictedInput(CNetObj_PlayerInput *pNewInput);
|
||||||
void OnDirectInput(CNetObj_PlayerInput *pNewInput);
|
void OnDirectInput(CNetObj_PlayerInput *pNewInput);
|
||||||
|
void ResetHook();
|
||||||
void ResetInput();
|
void ResetInput();
|
||||||
void FireWeapon();
|
void FireWeapon();
|
||||||
|
|
||||||
|
|
|
@ -726,6 +726,14 @@ void CGameTeams::SwapTeamCharacters(CPlayer *pPlayer, CPlayer *pTargetPlayer, in
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < MAX_CLIENTS; i++)
|
||||||
|
{
|
||||||
|
if(m_Core.Team(i) == Team && GameServer()->m_apPlayers[i])
|
||||||
|
{
|
||||||
|
GameServer()->m_apPlayers[i]->m_SwapTargetsClientID = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int TimeoutAfterDelay = g_Config.m_SvSaveSwapGamesDelay + g_Config.m_SvSwapTimeout;
|
int TimeoutAfterDelay = g_Config.m_SvSaveSwapGamesDelay + g_Config.m_SvSwapTimeout;
|
||||||
if(Since >= TimeoutAfterDelay)
|
if(Since >= TimeoutAfterDelay)
|
||||||
{
|
{
|
||||||
|
@ -735,12 +743,17 @@ void CGameTeams::SwapTeamCharacters(CPlayer *pPlayer, CPlayer *pTargetPlayer, in
|
||||||
|
|
||||||
GameServer()->SendChatTeam(Team, aBuf);
|
GameServer()->SendChatTeam(Team, aBuf);
|
||||||
|
|
||||||
pPlayer->m_SwapTargetsClientID = -1;
|
|
||||||
pTargetPlayer->m_SwapTargetsClientID = -1;
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < MAX_CLIENTS; i++)
|
||||||
|
{
|
||||||
|
if(m_Core.Team(i) == Team && GameServer()->m_apPlayers[i])
|
||||||
|
{
|
||||||
|
GameServer()->m_apPlayers[i]->GetCharacter()->ResetHook();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CSaveTee PrimarySavedTee;
|
CSaveTee PrimarySavedTee;
|
||||||
PrimarySavedTee.Save(pPlayer->GetCharacter());
|
PrimarySavedTee.Save(pPlayer->GetCharacter());
|
||||||
|
|
||||||
|
@ -750,9 +763,6 @@ void CGameTeams::SwapTeamCharacters(CPlayer *pPlayer, CPlayer *pTargetPlayer, in
|
||||||
PrimarySavedTee.Load(pTargetPlayer->GetCharacter(), Team);
|
PrimarySavedTee.Load(pTargetPlayer->GetCharacter(), Team);
|
||||||
SecondarySavedTee.Load(pPlayer->GetCharacter(), Team);
|
SecondarySavedTee.Load(pPlayer->GetCharacter(), Team);
|
||||||
|
|
||||||
pPlayer->m_SwapTargetsClientID = -1;
|
|
||||||
pTargetPlayer->m_SwapTargetsClientID = -1;
|
|
||||||
|
|
||||||
str_format(aBuf, sizeof(aBuf),
|
str_format(aBuf, sizeof(aBuf),
|
||||||
"%s has swapped with %s.",
|
"%s has swapped with %s.",
|
||||||
Server()->ClientName(pPlayer->GetCID()), Server()->ClientName(pTargetPlayer->GetCID()));
|
Server()->ClientName(pPlayer->GetCID()), Server()->ClientName(pTargetPlayer->GetCID()));
|
||||||
|
|
Loading…
Reference in a new issue