mirror of
https://github.com/ddnet/ddnet.git
synced 2024-09-19 09:12:19 +00:00
Compare commits
8 commits
c705166d8c
...
42de361ccb
Author | SHA1 | Date | |
---|---|---|---|
42de361ccb | |||
0feee9aa3e | |||
65cf776846 | |||
62075d22e3 | |||
0369946156 | |||
232018de23 | |||
868c513c0c | |||
e9a2ffde38 |
|
@ -621,6 +621,18 @@ void CClient::Connect(const char *pAddress, const char *pPassword)
|
||||||
else
|
else
|
||||||
m_aNetClient[CONN_MAIN].Connect(aConnectAddrs, NumConnectAddrs);
|
m_aNetClient[CONN_MAIN].Connect(aConnectAddrs, NumConnectAddrs);
|
||||||
|
|
||||||
|
const CServerBrowser::CServerEntry *pEntry = m_ServerBrowser.Find(aConnectAddrs[0]);
|
||||||
|
if(pEntry != nullptr && pEntry->m_GotInfo)
|
||||||
|
{
|
||||||
|
if(str_length(pEntry->m_Info.m_aVerifyUrl))
|
||||||
|
{
|
||||||
|
std::shared_ptr<CHttpRequest> pVerifyGet = HttpGet(pEntry->m_Info.m_aVerifyUrl);
|
||||||
|
pVerifyGet->Timeout(CTimeout{10000, 0, 500, 10});
|
||||||
|
pVerifyGet->IpResolve(aConnectAddrs[0].type == NETTYPE_IPV4 ? IPRESOLVE::V4 : IPRESOLVE::V6);
|
||||||
|
Http()->Run(pVerifyGet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_aNetClient[CONN_MAIN].RefreshStun();
|
m_aNetClient[CONN_MAIN].RefreshStun();
|
||||||
SetState(IClient::STATE_CONNECTING);
|
SetState(IClient::STATE_CONNECTING);
|
||||||
|
|
||||||
|
|
|
@ -2364,6 +2364,10 @@ void CServer::UpdateRegisterServerInfo()
|
||||||
JsonWriter.WriteAttribute("requires_login");
|
JsonWriter.WriteAttribute("requires_login");
|
||||||
JsonWriter.WriteBoolValue(false);
|
JsonWriter.WriteBoolValue(false);
|
||||||
|
|
||||||
|
// Client will send a HTTP GET request to the url of sv_verify_url upon connecting
|
||||||
|
JsonWriter.WriteAttribute("verify_url");
|
||||||
|
JsonWriter.WriteStrValue(g_Config.m_SvVerifyUrl);
|
||||||
|
|
||||||
JsonWriter.WriteAttribute("clients");
|
JsonWriter.WriteAttribute("clients");
|
||||||
JsonWriter.BeginArray();
|
JsonWriter.BeginArray();
|
||||||
|
|
||||||
|
|
|
@ -118,6 +118,7 @@ public:
|
||||||
CClient m_aClients[SERVERINFO_MAX_CLIENTS];
|
CClient m_aClients[SERVERINFO_MAX_CLIENTS];
|
||||||
int m_NumFilteredPlayers;
|
int m_NumFilteredPlayers;
|
||||||
bool m_RequiresLogin;
|
bool m_RequiresLogin;
|
||||||
|
char m_aVerifyUrl[128];
|
||||||
|
|
||||||
static int EstimateLatency(int Loc1, int Loc2);
|
static int EstimateLatency(int Loc1, int Loc2);
|
||||||
static bool ParseLocation(int *pResult, const char *pString);
|
static bool ParseLocation(int *pResult, const char *pString);
|
||||||
|
|
|
@ -445,6 +445,7 @@ MACRO_CONFIG_INT(SvDnsblBan, sv_dnsbl_ban, 0, 0, 1, CFGFLAG_SERVER, "Automatical
|
||||||
MACRO_CONFIG_STR(SvDnsblBanReason, sv_dnsbl_ban_reason, 128, "VPN detected, try connecting without. Contact admin if mistaken", CFGFLAG_SERVER, "Ban reason for 'sv_dnsbl_ban'")
|
MACRO_CONFIG_STR(SvDnsblBanReason, sv_dnsbl_ban_reason, 128, "VPN detected, try connecting without. Contact admin if mistaken", CFGFLAG_SERVER, "Ban reason for 'sv_dnsbl_ban'")
|
||||||
MACRO_CONFIG_INT(SvDnsblChat, sv_dnsbl_chat, 0, 0, 1, CFGFLAG_SERVER, "Don't allow chat from blacklisted addresses")
|
MACRO_CONFIG_INT(SvDnsblChat, sv_dnsbl_chat, 0, 0, 1, CFGFLAG_SERVER, "Don't allow chat from blacklisted addresses")
|
||||||
MACRO_CONFIG_INT(SvRconVote, sv_rcon_vote, 0, 0, 1, CFGFLAG_SERVER, "Only allow authed clients to call votes")
|
MACRO_CONFIG_INT(SvRconVote, sv_rcon_vote, 0, 0, 1, CFGFLAG_SERVER, "Only allow authed clients to call votes")
|
||||||
|
MACRO_CONFIG_STR(SvVerifyUrl, sv_verify_url, 128, "", CFGFLAG_SERVER, "A URL which the client will send a HTTP GET request to upon connecting")
|
||||||
|
|
||||||
MACRO_CONFIG_INT(SvPlayerDemoRecord, sv_player_demo_record, 0, 0, 1, CFGFLAG_SERVER, "Automatically record demos for each player")
|
MACRO_CONFIG_INT(SvPlayerDemoRecord, sv_player_demo_record, 0, 0, 1, CFGFLAG_SERVER, "Automatically record demos for each player")
|
||||||
MACRO_CONFIG_INT(SvDemoChat, sv_demo_chat, 0, 0, 1, CFGFLAG_SERVER, "Record chat for demos")
|
MACRO_CONFIG_INT(SvDemoChat, sv_demo_chat, 0, 0, 1, CFGFLAG_SERVER, "Record chat for demos")
|
||||||
|
|
|
@ -72,6 +72,7 @@ bool CServerInfo2::FromJsonRaw(CServerInfo2 *pOut, const json_value *pJson)
|
||||||
const json_value &Version = ServerInfo["version"];
|
const json_value &Version = ServerInfo["version"];
|
||||||
const json_value &Clients = ServerInfo["clients"];
|
const json_value &Clients = ServerInfo["clients"];
|
||||||
const json_value &RequiresLogin = ServerInfo["requires_login"];
|
const json_value &RequiresLogin = ServerInfo["requires_login"];
|
||||||
|
const json_value &VerifyUrl = ServerInfo["verify_url"];
|
||||||
|
|
||||||
Error = false;
|
Error = false;
|
||||||
Error = Error || MaxClients.type != json_integer;
|
Error = Error || MaxClients.type != json_integer;
|
||||||
|
@ -103,6 +104,11 @@ bool CServerInfo2::FromJsonRaw(CServerInfo2 *pOut, const json_value *pJson)
|
||||||
{
|
{
|
||||||
pOut->m_RequiresLogin = RequiresLogin;
|
pOut->m_RequiresLogin = RequiresLogin;
|
||||||
}
|
}
|
||||||
|
str_copy(pOut->m_aVerifyUrl, "");
|
||||||
|
if(VerifyUrl.type == json_string)
|
||||||
|
{
|
||||||
|
str_copy(pOut->m_aVerifyUrl, VerifyUrl);
|
||||||
|
}
|
||||||
pOut->m_Passworded = Passworded;
|
pOut->m_Passworded = Passworded;
|
||||||
str_copy(pOut->m_aGameType, GameType);
|
str_copy(pOut->m_aGameType, GameType);
|
||||||
str_copy(pOut->m_aName, Name);
|
str_copy(pOut->m_aName, Name);
|
||||||
|
@ -239,6 +245,7 @@ CServerInfo2::operator CServerInfo() const
|
||||||
str_copy(Result.m_aName, m_aName);
|
str_copy(Result.m_aName, m_aName);
|
||||||
str_copy(Result.m_aMap, m_aMapName);
|
str_copy(Result.m_aMap, m_aMapName);
|
||||||
str_copy(Result.m_aVersion, m_aVersion);
|
str_copy(Result.m_aVersion, m_aVersion);
|
||||||
|
str_copy(Result.m_aVerifyUrl, m_aVerifyUrl);
|
||||||
|
|
||||||
for(int i = 0; i < minimum(m_NumClients, (int)SERVERINFO_MAX_CLIENTS); i++)
|
for(int i = 0; i < minimum(m_NumClients, (int)SERVERINFO_MAX_CLIENTS); i++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -39,6 +39,7 @@ public:
|
||||||
char m_aMapName[MAX_MAP_LENGTH];
|
char m_aMapName[MAX_MAP_LENGTH];
|
||||||
char m_aVersion[32];
|
char m_aVersion[32];
|
||||||
bool m_RequiresLogin;
|
bool m_RequiresLogin;
|
||||||
|
char m_aVerifyUrl[128];
|
||||||
|
|
||||||
bool operator==(const CServerInfo2 &Other) const;
|
bool operator==(const CServerInfo2 &Other) const;
|
||||||
bool operator!=(const CServerInfo2 &Other) const { return !(*this == Other); }
|
bool operator!=(const CServerInfo2 &Other) const { return !(*this == Other); }
|
||||||
|
|
|
@ -805,50 +805,9 @@ void CChat::AddLine(int ClientId, int Team, const char *pLine)
|
||||||
{
|
{
|
||||||
if(!g_Config.m_ClChatOld)
|
if(!g_Config.m_ClChatOld)
|
||||||
{
|
{
|
||||||
pCurrentLine->m_CustomColoredSkin = LineAuthor.m_RenderInfo.m_CustomColoredSkin;
|
|
||||||
if(pCurrentLine->m_CustomColoredSkin)
|
|
||||||
pCurrentLine->m_RenderSkin = LineAuthor.m_RenderInfo.m_ColorableRenderSkin;
|
|
||||||
else
|
|
||||||
pCurrentLine->m_RenderSkin = LineAuthor.m_RenderInfo.m_OriginalRenderSkin;
|
|
||||||
|
|
||||||
str_copy(pCurrentLine->m_aSkinName, LineAuthor.m_aSkinName);
|
str_copy(pCurrentLine->m_aSkinName, LineAuthor.m_aSkinName);
|
||||||
pCurrentLine->m_ColorBody = LineAuthor.m_RenderInfo.m_ColorBody;
|
pCurrentLine->m_TeeRenderInfo = LineAuthor.m_RenderInfo;
|
||||||
pCurrentLine->m_ColorFeet = LineAuthor.m_RenderInfo.m_ColorFeet;
|
|
||||||
|
|
||||||
pCurrentLine->m_RenderSkinMetrics = LineAuthor.m_RenderInfo.m_SkinMetrics;
|
|
||||||
pCurrentLine->m_HasRenderTee = true;
|
pCurrentLine->m_HasRenderTee = true;
|
||||||
|
|
||||||
// 0.7
|
|
||||||
if(Client()->IsSixup())
|
|
||||||
{
|
|
||||||
for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++)
|
|
||||||
{
|
|
||||||
const char *pPartName = LineAuthor.m_aSixup[g_Config.m_ClDummy].m_aaSkinPartNames[Part];
|
|
||||||
int Id = m_pClient->m_Skins7.FindSkinPart(Part, pPartName, false);
|
|
||||||
const CSkins7::CSkinPart *pSkinPart = m_pClient->m_Skins7.GetSkinPart(Part, Id);
|
|
||||||
if(LineAuthor.m_aSixup[g_Config.m_ClDummy].m_aUseCustomColors[Part])
|
|
||||||
{
|
|
||||||
pCurrentLine->m_Sixup.m_aTextures[Part] = pSkinPart->m_ColorTexture;
|
|
||||||
pCurrentLine->m_Sixup.m_aColors[Part] = m_pClient->m_Skins7.GetColor(
|
|
||||||
LineAuthor.m_aSixup[g_Config.m_ClDummy].m_aSkinPartColors[Part],
|
|
||||||
Part == protocol7::SKINPART_MARKING);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pCurrentLine->m_Sixup.m_aTextures[Part] = pSkinPart->m_OrgTexture;
|
|
||||||
pCurrentLine->m_Sixup.m_aColors[Part] = vec4(1.0f, 1.0f, 1.0f, 1.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(LineAuthor.m_SkinInfo.m_aSixup[g_Config.m_ClDummy].m_HatTexture.IsValid())
|
|
||||||
{
|
|
||||||
if(Part == protocol7::SKINPART_BODY && str_comp(pPartName, "standard"))
|
|
||||||
pCurrentLine->m_Sixup.m_HatSpriteIndex = CSkins7::HAT_OFFSET_SIDE + (ClientId % CSkins7::HAT_NUM);
|
|
||||||
if(Part == protocol7::SKINPART_DECORATION && str_comp(pPartName, "twinbopp"))
|
|
||||||
pCurrentLine->m_Sixup.m_HatSpriteIndex = CSkins7::HAT_OFFSET_SIDE + (ClientId % CSkins7::HAT_NUM);
|
|
||||||
pCurrentLine->m_Sixup.m_HatTexture = LineAuthor.m_SkinInfo.m_aSixup[g_Config.m_ClDummy].m_HatTexture;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -917,17 +876,11 @@ void CChat::OnRefreshSkins()
|
||||||
{
|
{
|
||||||
if(Line.m_HasRenderTee)
|
if(Line.m_HasRenderTee)
|
||||||
{
|
{
|
||||||
const CSkin *pSkin = m_pClient->m_Skins.Find(Line.m_aSkinName);
|
Line.m_TeeRenderInfo.Apply(m_pClient->m_Skins.Find(Line.m_aSkinName));
|
||||||
if(Line.m_CustomColoredSkin)
|
|
||||||
Line.m_RenderSkin = pSkin->m_ColorableSkin;
|
|
||||||
else
|
|
||||||
Line.m_RenderSkin = pSkin->m_OriginalSkin;
|
|
||||||
|
|
||||||
Line.m_RenderSkinMetrics = pSkin->m_Metrics;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Line.m_RenderSkin.Reset();
|
Line.m_TeeRenderInfo.Reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1291,28 +1244,7 @@ void CChat::OnRender()
|
||||||
if(!g_Config.m_ClChatOld && Line.m_HasRenderTee)
|
if(!g_Config.m_ClChatOld && Line.m_HasRenderTee)
|
||||||
{
|
{
|
||||||
const int TeeSize = MessageTeeSize();
|
const int TeeSize = MessageTeeSize();
|
||||||
CTeeRenderInfo RenderInfo;
|
Line.m_TeeRenderInfo.m_Size = TeeSize;
|
||||||
RenderInfo.m_CustomColoredSkin = Line.m_CustomColoredSkin;
|
|
||||||
if(Line.m_CustomColoredSkin)
|
|
||||||
RenderInfo.m_ColorableRenderSkin = Line.m_RenderSkin;
|
|
||||||
else
|
|
||||||
RenderInfo.m_OriginalRenderSkin = Line.m_RenderSkin;
|
|
||||||
RenderInfo.m_SkinMetrics = Line.m_RenderSkinMetrics;
|
|
||||||
|
|
||||||
RenderInfo.m_ColorBody = Line.m_ColorBody;
|
|
||||||
RenderInfo.m_ColorFeet = Line.m_ColorFeet;
|
|
||||||
RenderInfo.m_Size = TeeSize;
|
|
||||||
|
|
||||||
if(Client()->IsSixup())
|
|
||||||
{
|
|
||||||
for(int Part = 0; Part < protocol7::NUM_SKINPARTS; Part++)
|
|
||||||
{
|
|
||||||
RenderInfo.m_aSixup[g_Config.m_ClDummy].m_aColors[Part] = Line.m_Sixup.m_aColors[Part];
|
|
||||||
RenderInfo.m_aSixup[g_Config.m_ClDummy].m_aTextures[Part] = Line.m_Sixup.m_aTextures[Part];
|
|
||||||
RenderInfo.m_aSixup[g_Config.m_ClDummy].m_HatSpriteIndex = Line.m_Sixup.m_HatSpriteIndex;
|
|
||||||
RenderInfo.m_aSixup[g_Config.m_ClDummy].m_HatTexture = Line.m_Sixup.m_HatTexture;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
float RowHeight = FontSize() + RealMsgPaddingY;
|
float RowHeight = FontSize() + RealMsgPaddingY;
|
||||||
float OffsetTeeY = TeeSize / 2.0f;
|
float OffsetTeeY = TeeSize / 2.0f;
|
||||||
|
@ -1320,9 +1252,9 @@ void CChat::OnRender()
|
||||||
|
|
||||||
const CAnimState *pIdleState = CAnimState::GetIdle();
|
const CAnimState *pIdleState = CAnimState::GetIdle();
|
||||||
vec2 OffsetToMid;
|
vec2 OffsetToMid;
|
||||||
CRenderTools::GetRenderTeeOffsetToRenderedTee(pIdleState, &RenderInfo, OffsetToMid);
|
CRenderTools::GetRenderTeeOffsetToRenderedTee(pIdleState, &Line.m_TeeRenderInfo, OffsetToMid);
|
||||||
vec2 TeeRenderPos(x + (RealMsgPaddingX + TeeSize) / 2.0f, y + OffsetTeeY + FullHeightMinusTee / 2.0f + OffsetToMid.y);
|
vec2 TeeRenderPos(x + (RealMsgPaddingX + TeeSize) / 2.0f, y + OffsetTeeY + FullHeightMinusTee / 2.0f + OffsetToMid.y);
|
||||||
RenderTools()->RenderTee(pIdleState, &RenderInfo, EMOTE_NORMAL, vec2(1, 0.1f), TeeRenderPos, Blend);
|
RenderTools()->RenderTee(pIdleState, &Line.m_TeeRenderInfo, EMOTE_NORMAL, vec2(1, 0.1f), TeeRenderPos, Blend);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ColorRGBA TextColor = TextRender()->DefaultTextColor().WithMultipliedAlpha(Blend);
|
const ColorRGBA TextColor = TextRender()->DefaultTextColor().WithMultipliedAlpha(Blend);
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
#include <game/client/component.h>
|
#include <game/client/component.h>
|
||||||
#include <game/client/lineinput.h>
|
#include <game/client/lineinput.h>
|
||||||
|
#include <game/client/render.h>
|
||||||
#include <game/client/skin.h>
|
#include <game/client/skin.h>
|
||||||
#include <game/generated/protocol7.h>
|
#include <game/generated/protocol7.h>
|
||||||
|
|
||||||
|
@ -45,30 +46,12 @@ class CChat : public CComponent
|
||||||
int m_QuadContainerIndex;
|
int m_QuadContainerIndex;
|
||||||
|
|
||||||
char m_aSkinName[std::size(g_Config.m_ClPlayerSkin)];
|
char m_aSkinName[std::size(g_Config.m_ClPlayerSkin)];
|
||||||
CSkin::SSkinTextures m_RenderSkin;
|
|
||||||
CSkin::SSkinMetrics m_RenderSkinMetrics;
|
|
||||||
bool m_CustomColoredSkin;
|
|
||||||
ColorRGBA m_ColorBody;
|
|
||||||
ColorRGBA m_ColorFeet;
|
|
||||||
|
|
||||||
bool m_HasRenderTee;
|
bool m_HasRenderTee;
|
||||||
|
CTeeRenderInfo m_TeeRenderInfo;
|
||||||
|
|
||||||
float m_TextYOffset;
|
float m_TextYOffset;
|
||||||
|
|
||||||
int m_TimesRepeated;
|
int m_TimesRepeated;
|
||||||
|
|
||||||
class CSixup
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
IGraphics::CTextureHandle m_aTextures[protocol7::NUM_SKINPARTS];
|
|
||||||
IGraphics::CTextureHandle m_HatTexture;
|
|
||||||
IGraphics::CTextureHandle m_BotTexture;
|
|
||||||
int m_HatSpriteIndex;
|
|
||||||
ColorRGBA m_BotColor;
|
|
||||||
ColorRGBA m_aColors[protocol7::NUM_SKINPARTS];
|
|
||||||
};
|
|
||||||
|
|
||||||
// 0.7 Skin
|
|
||||||
CSixup m_Sixup;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
bool m_PrevScoreBoardShowed;
|
bool m_PrevScoreBoardShowed;
|
||||||
|
|
|
@ -366,10 +366,7 @@ void CGhost::OnRender()
|
||||||
IsTeamplay = (m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) != 0;
|
IsTeamplay = (m_pClient->m_Snap.m_pGameInfoObj->m_GameFlags & GAMEFLAG_TEAMS) != 0;
|
||||||
|
|
||||||
GhostNinjaRenderInfo = Ghost.m_RenderInfo;
|
GhostNinjaRenderInfo = Ghost.m_RenderInfo;
|
||||||
GhostNinjaRenderInfo.m_OriginalRenderSkin = pSkin->m_OriginalSkin;
|
GhostNinjaRenderInfo.Apply(pSkin);
|
||||||
GhostNinjaRenderInfo.m_ColorableRenderSkin = pSkin->m_ColorableSkin;
|
|
||||||
GhostNinjaRenderInfo.m_BloodColor = pSkin->m_BloodColor;
|
|
||||||
GhostNinjaRenderInfo.m_SkinMetrics = pSkin->m_Metrics;
|
|
||||||
GhostNinjaRenderInfo.m_CustomColoredSkin = IsTeamplay;
|
GhostNinjaRenderInfo.m_CustomColoredSkin = IsTeamplay;
|
||||||
if(!IsTeamplay)
|
if(!IsTeamplay)
|
||||||
{
|
{
|
||||||
|
@ -392,11 +389,7 @@ void CGhost::InitRenderInfos(CGhostItem *pGhost)
|
||||||
IntsToStr(&pGhost->m_Skin.m_Skin0, 6, aSkinName, std::size(aSkinName));
|
IntsToStr(&pGhost->m_Skin.m_Skin0, 6, aSkinName, std::size(aSkinName));
|
||||||
CTeeRenderInfo *pRenderInfo = &pGhost->m_RenderInfo;
|
CTeeRenderInfo *pRenderInfo = &pGhost->m_RenderInfo;
|
||||||
|
|
||||||
const CSkin *pSkin = m_pClient->m_Skins.Find(aSkinName);
|
pRenderInfo->Apply(m_pClient->m_Skins.Find(aSkinName));
|
||||||
pRenderInfo->m_OriginalRenderSkin = pSkin->m_OriginalSkin;
|
|
||||||
pRenderInfo->m_ColorableRenderSkin = pSkin->m_ColorableSkin;
|
|
||||||
pRenderInfo->m_BloodColor = pSkin->m_BloodColor;
|
|
||||||
pRenderInfo->m_SkinMetrics = pSkin->m_Metrics;
|
|
||||||
pRenderInfo->m_CustomColoredSkin = pGhost->m_Skin.m_UseCustomColor;
|
pRenderInfo->m_CustomColoredSkin = pGhost->m_Skin.m_UseCustomColor;
|
||||||
if(pGhost->m_Skin.m_UseCustomColor)
|
if(pGhost->m_Skin.m_UseCustomColor)
|
||||||
{
|
{
|
||||||
|
@ -697,11 +690,7 @@ void CGhost::OnRefreshSkins()
|
||||||
CTeeRenderInfo *pRenderInfo = &Ghost.m_RenderInfo;
|
CTeeRenderInfo *pRenderInfo = &Ghost.m_RenderInfo;
|
||||||
if(aSkinName[0] != '\0')
|
if(aSkinName[0] != '\0')
|
||||||
{
|
{
|
||||||
const CSkin *pSkin = m_pClient->m_Skins.Find(aSkinName);
|
pRenderInfo->Apply(m_pClient->m_Skins.Find(aSkinName));
|
||||||
pRenderInfo->m_OriginalRenderSkin = pSkin->m_OriginalSkin;
|
|
||||||
pRenderInfo->m_ColorableRenderSkin = pSkin->m_ColorableSkin;
|
|
||||||
pRenderInfo->m_BloodColor = pSkin->m_BloodColor;
|
|
||||||
pRenderInfo->m_SkinMetrics = pSkin->m_Metrics;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1822,12 +1822,8 @@ bool CMenus::PrintHighlighted(const char *pName, F &&PrintFn)
|
||||||
|
|
||||||
CTeeRenderInfo CMenus::GetTeeRenderInfo(vec2 Size, const char *pSkinName, bool CustomSkinColors, int CustomSkinColorBody, int CustomSkinColorFeet) const
|
CTeeRenderInfo CMenus::GetTeeRenderInfo(vec2 Size, const char *pSkinName, bool CustomSkinColors, int CustomSkinColorBody, int CustomSkinColorFeet) const
|
||||||
{
|
{
|
||||||
const CSkin *pSkin = m_pClient->m_Skins.Find(pSkinName);
|
|
||||||
|
|
||||||
CTeeRenderInfo TeeInfo;
|
CTeeRenderInfo TeeInfo;
|
||||||
TeeInfo.m_OriginalRenderSkin = pSkin->m_OriginalSkin;
|
TeeInfo.Apply(m_pClient->m_Skins.Find(pSkinName));
|
||||||
TeeInfo.m_ColorableRenderSkin = pSkin->m_ColorableSkin;
|
|
||||||
TeeInfo.m_SkinMetrics = pSkin->m_Metrics;
|
|
||||||
TeeInfo.m_CustomColoredSkin = CustomSkinColors;
|
TeeInfo.m_CustomColoredSkin = CustomSkinColors;
|
||||||
if(CustomSkinColors)
|
if(CustomSkinColors)
|
||||||
{
|
{
|
||||||
|
|
|
@ -633,11 +633,8 @@ void CMenus::RenderSettingsTee(CUIRect MainView)
|
||||||
|
|
||||||
// Note: get the skin info after the settings buttons, because they can trigger a refresh
|
// Note: get the skin info after the settings buttons, because they can trigger a refresh
|
||||||
// which invalidates the skin.
|
// which invalidates the skin.
|
||||||
const CSkin *pSkin = m_pClient->m_Skins.Find(pSkinName);
|
|
||||||
CTeeRenderInfo OwnSkinInfo;
|
CTeeRenderInfo OwnSkinInfo;
|
||||||
OwnSkinInfo.m_OriginalRenderSkin = pSkin->m_OriginalSkin;
|
OwnSkinInfo.Apply(m_pClient->m_Skins.Find(pSkinName));
|
||||||
OwnSkinInfo.m_ColorableRenderSkin = pSkin->m_ColorableSkin;
|
|
||||||
OwnSkinInfo.m_SkinMetrics = pSkin->m_Metrics;
|
|
||||||
OwnSkinInfo.m_CustomColoredSkin = *pUseCustomColor;
|
OwnSkinInfo.m_CustomColoredSkin = *pUseCustomColor;
|
||||||
if(*pUseCustomColor)
|
if(*pUseCustomColor)
|
||||||
{
|
{
|
||||||
|
|
|
@ -844,10 +844,7 @@ void CPlayers::OnRender()
|
||||||
{
|
{
|
||||||
aRenderInfo[i].m_aSixup[g_Config.m_ClDummy].Reset();
|
aRenderInfo[i].m_aSixup[g_Config.m_ClDummy].Reset();
|
||||||
|
|
||||||
aRenderInfo[i].m_OriginalRenderSkin = pSkin->m_OriginalSkin;
|
aRenderInfo[i].Apply(pSkin);
|
||||||
aRenderInfo[i].m_ColorableRenderSkin = pSkin->m_ColorableSkin;
|
|
||||||
aRenderInfo[i].m_BloodColor = pSkin->m_BloodColor;
|
|
||||||
aRenderInfo[i].m_SkinMetrics = pSkin->m_Metrics;
|
|
||||||
aRenderInfo[i].m_CustomColoredSkin = IsTeamplay;
|
aRenderInfo[i].m_CustomColoredSkin = IsTeamplay;
|
||||||
if(!IsTeamplay)
|
if(!IsTeamplay)
|
||||||
{
|
{
|
||||||
|
@ -857,12 +854,8 @@ void CPlayers::OnRender()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const CSkin *pSkin = m_pClient->m_Skins.Find("x_spec");
|
|
||||||
CTeeRenderInfo RenderInfoSpec;
|
CTeeRenderInfo RenderInfoSpec;
|
||||||
RenderInfoSpec.m_OriginalRenderSkin = pSkin->m_OriginalSkin;
|
RenderInfoSpec.Apply(m_pClient->m_Skins.Find("x_spec"));
|
||||||
RenderInfoSpec.m_ColorableRenderSkin = pSkin->m_ColorableSkin;
|
|
||||||
RenderInfoSpec.m_BloodColor = pSkin->m_BloodColor;
|
|
||||||
RenderInfoSpec.m_SkinMetrics = pSkin->m_Metrics;
|
|
||||||
RenderInfoSpec.m_CustomColoredSkin = false;
|
RenderInfoSpec.m_CustomColoredSkin = false;
|
||||||
RenderInfoSpec.m_Size = 64.0f;
|
RenderInfoSpec.m_Size = 64.0f;
|
||||||
const int LocalClientId = m_pClient->m_Snap.m_LocalClientId;
|
const int LocalClientId = m_pClient->m_Snap.m_LocalClientId;
|
||||||
|
|
|
@ -1554,11 +1554,7 @@ void CGameClient::OnNewSnapshot()
|
||||||
pClient->m_SkinInfo.m_Size = 64;
|
pClient->m_SkinInfo.m_Size = 64;
|
||||||
|
|
||||||
// find new skin
|
// find new skin
|
||||||
const CSkin *pSkin = m_Skins.Find(pClient->m_aSkinName);
|
pClient->m_SkinInfo.Apply(m_Skins.Find(pClient->m_aSkinName));
|
||||||
pClient->m_SkinInfo.m_OriginalRenderSkin = pSkin->m_OriginalSkin;
|
|
||||||
pClient->m_SkinInfo.m_ColorableRenderSkin = pSkin->m_ColorableSkin;
|
|
||||||
pClient->m_SkinInfo.m_SkinMetrics = pSkin->m_Metrics;
|
|
||||||
pClient->m_SkinInfo.m_BloodColor = pSkin->m_BloodColor;
|
|
||||||
pClient->m_SkinInfo.m_CustomColoredSkin = pClient->m_UseCustomColor;
|
pClient->m_SkinInfo.m_CustomColoredSkin = pClient->m_UseCustomColor;
|
||||||
|
|
||||||
if(!pClient->m_UseCustomColor)
|
if(!pClient->m_UseCustomColor)
|
||||||
|
@ -3750,13 +3746,9 @@ void CGameClient::RefreshSkins()
|
||||||
|
|
||||||
for(auto &Client : m_aClients)
|
for(auto &Client : m_aClients)
|
||||||
{
|
{
|
||||||
Client.m_SkinInfo.m_OriginalRenderSkin.Reset();
|
|
||||||
Client.m_SkinInfo.m_ColorableRenderSkin.Reset();
|
|
||||||
if(Client.m_aSkinName[0] != '\0')
|
if(Client.m_aSkinName[0] != '\0')
|
||||||
{
|
{
|
||||||
const CSkin *pSkin = m_Skins.Find(Client.m_aSkinName);
|
Client.m_SkinInfo.Apply(m_Skins.Find(Client.m_aSkinName));
|
||||||
Client.m_SkinInfo.m_OriginalRenderSkin = pSkin->m_OriginalSkin;
|
|
||||||
Client.m_SkinInfo.m_ColorableRenderSkin = pSkin->m_ColorableSkin;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -56,6 +56,14 @@ public:
|
||||||
Sixup.Reset();
|
Sixup.Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Apply(const CSkin *pSkin)
|
||||||
|
{
|
||||||
|
m_OriginalRenderSkin = pSkin->m_OriginalSkin;
|
||||||
|
m_ColorableRenderSkin = pSkin->m_ColorableSkin;
|
||||||
|
m_BloodColor = pSkin->m_BloodColor;
|
||||||
|
m_SkinMetrics = pSkin->m_Metrics;
|
||||||
|
}
|
||||||
|
|
||||||
CSkin::SSkinTextures m_OriginalRenderSkin;
|
CSkin::SSkinTextures m_OriginalRenderSkin;
|
||||||
CSkin::SSkinTextures m_ColorableRenderSkin;
|
CSkin::SSkinTextures m_ColorableRenderSkin;
|
||||||
|
|
||||||
|
|
|
@ -3526,7 +3526,7 @@ void CGameContext::ConAddMapVotes(IConsole::IResult *pResult, void *pUserData)
|
||||||
str_format(aCommand, sizeof(aCommand), "clear_votes; add_map_votes \"%s\"", aDirectory);
|
str_format(aCommand, sizeof(aCommand), "clear_votes; add_map_votes \"%s\"", aDirectory);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
str_format(aCommand, sizeof(aCommand), "change_map \"%s/%s\"", pDirectory, aOptionEscaped);
|
str_format(aCommand, sizeof(aCommand), "change_map \"%s%s%s\"", pDirectory, pDirectory[0] == '\0' ? "" : "/", aOptionEscaped);
|
||||||
|
|
||||||
pSelf->AddVote(aDescription, aCommand);
|
pSelf->AddVote(aDescription, aCommand);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#ifndef GAME_VERSION_H
|
#ifndef GAME_VERSION_H
|
||||||
#define GAME_VERSION_H
|
#define GAME_VERSION_H
|
||||||
#ifndef GAME_RELEASE_VERSION
|
#ifndef GAME_RELEASE_VERSION
|
||||||
#define GAME_RELEASE_VERSION "18.5"
|
#define GAME_RELEASE_VERSION "18.5.1"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// teeworlds
|
// teeworlds
|
||||||
|
@ -13,7 +13,7 @@
|
||||||
#define GAME_NETVERSION7 "0.7 802f1be60a05665f"
|
#define GAME_NETVERSION7 "0.7 802f1be60a05665f"
|
||||||
|
|
||||||
// ddnet
|
// ddnet
|
||||||
#define DDNET_VERSION_NUMBER 18050
|
#define DDNET_VERSION_NUMBER 18051
|
||||||
extern const char *GIT_SHORTREV_HASH;
|
extern const char *GIT_SHORTREV_HASH;
|
||||||
#define GAME_NAME "DDNet"
|
#define GAME_NAME "DDNet"
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue