mirror of
https://github.com/ddnet/ddnet.git
synced 2024-09-19 09:12:19 +00:00
Compare commits
12 commits
e4608e3893
...
7968dcba09
Author | SHA1 | Date | |
---|---|---|---|
7968dcba09 | |||
a2e0ab2dbe | |||
255694c061 | |||
b475c67039 | |||
a266cd2f70 | |||
2c77e79061 | |||
ChillerDragon | 46c5344d71 | ||
96ad30eb21 | |||
b03245f7dd | |||
ChillerDragon | 7192bbf397 | ||
ChillerDragon | 984845b2a9 | ||
5a49dcedbd |
|
@ -996,6 +996,7 @@ endif()
|
|||
########################################################################
|
||||
|
||||
set(EXPECTED_DATA
|
||||
announcement.txt
|
||||
arrow.png
|
||||
assets/entities/comfort/ddnet.png
|
||||
assets/entities/license.txt
|
||||
|
|
0
data/announcement.txt
Normal file
0
data/announcement.txt
Normal file
|
@ -80,10 +80,10 @@ sv_rescue_delay 5
|
|||
# Message on chat displayed when joining
|
||||
sv_welcome "Welcome to my server!"
|
||||
|
||||
# File which will have the announcements (each one in new line)
|
||||
# File which contains the announcements (One on each line)
|
||||
sv_announcement_filename "announcement.txt"
|
||||
|
||||
# Number of minutes before next announcement will be displayed (from the announcement file)
|
||||
# Number of minutes before the next announcement will be displayed (from the announcement file)
|
||||
sv_announcement_interval 120
|
||||
|
||||
# Whether announcements will be displayed in their order or chosen randomly
|
||||
|
|
|
@ -80,6 +80,7 @@ void CInput::Init()
|
|||
|
||||
m_pGraphics = Kernel()->RequestInterface<IEngineGraphics>();
|
||||
m_pConsole = Kernel()->RequestInterface<IConsole>();
|
||||
m_pConfigManager = Kernel()->RequestInterface<IConfigManager>();
|
||||
|
||||
MouseModeRelative();
|
||||
|
||||
|
@ -824,6 +825,9 @@ int CInput::Update()
|
|||
}
|
||||
break;
|
||||
case SDL_WINDOWEVENT_MINIMIZED:
|
||||
#if defined(CONF_PLATFORM_ANDROID) // Save the config when minimized on Android.
|
||||
m_pConfigManager->Save();
|
||||
#endif
|
||||
Graphics()->WindowDestroyNtf(Event.window.windowID);
|
||||
break;
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <vector>
|
||||
|
||||
class IEngineGraphics;
|
||||
class IConfigManager;
|
||||
|
||||
class CInput : public IEngineInput
|
||||
{
|
||||
|
@ -59,6 +60,7 @@ public:
|
|||
private:
|
||||
IEngineGraphics *m_pGraphics;
|
||||
IConsole *m_pConsole;
|
||||
IConfigManager *m_pConfigManager;
|
||||
|
||||
IEngineGraphics *Graphics() const { return m_pGraphics; }
|
||||
IConsole *Console() const { return m_pConsole; }
|
||||
|
|
|
@ -273,7 +273,8 @@ public:
|
|||
virtual bool DnsblWhite(int ClientId) = 0;
|
||||
virtual bool DnsblPending(int ClientId) = 0;
|
||||
virtual bool DnsblBlack(int ClientId) = 0;
|
||||
virtual const char *GetAnnouncementLine(const char *pFileName) = 0;
|
||||
virtual const char *GetAnnouncementLine() = 0;
|
||||
virtual void ReadAnnouncementsFile(const char *pFileName) = 0;
|
||||
virtual bool ClientPrevIngame(int ClientId) = 0;
|
||||
virtual const char *GetNetErrorString(int ClientId) = 0;
|
||||
virtual void ResetNetErrorString(int ClientId) = 0;
|
||||
|
|
|
@ -537,8 +537,7 @@ int CServer::Init()
|
|||
|
||||
m_CurrentGameTick = MIN_TICK;
|
||||
|
||||
m_AnnouncementLastLine = 0;
|
||||
m_aAnnouncementFile[0] = '\0';
|
||||
m_AnnouncementLastLine = -1;
|
||||
mem_zero(m_aPrevStates, sizeof(m_aPrevStates));
|
||||
|
||||
return 0;
|
||||
|
@ -2783,6 +2782,8 @@ int CServer::Run()
|
|||
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf);
|
||||
}
|
||||
|
||||
ReadAnnouncementsFile(g_Config.m_SvAnnouncementFileName);
|
||||
|
||||
// process pending commands
|
||||
m_pConsole->StoreCommands(false);
|
||||
m_pRegister->OnConfigChange();
|
||||
|
@ -3809,6 +3810,17 @@ void CServer::ConchainStdoutOutputLevel(IConsole::IResult *pResult, void *pUserD
|
|||
}
|
||||
}
|
||||
|
||||
void CServer::ConchainAnnouncementFileName(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData)
|
||||
{
|
||||
CServer *pSelf = (CServer *)pUserData;
|
||||
bool Changed = pResult->NumArguments() && str_comp(pResult->GetString(0), g_Config.m_SvAnnouncementFileName);
|
||||
pfnCallback(pResult, pCallbackUserData);
|
||||
if(Changed)
|
||||
{
|
||||
pSelf->ReadAnnouncementsFile(g_Config.m_SvAnnouncementFileName);
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(CONF_FAMILY_UNIX)
|
||||
void CServer::ConchainConnLoggingServerChange(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData)
|
||||
{
|
||||
|
@ -3887,6 +3899,8 @@ void CServer::RegisterCommands()
|
|||
Console()->Chain("loglevel", ConchainLoglevel, this);
|
||||
Console()->Chain("stdout_output_level", ConchainStdoutOutputLevel, this);
|
||||
|
||||
Console()->Chain("sv_announcement_filename", ConchainAnnouncementFileName, this);
|
||||
|
||||
#if defined(CONF_FAMILY_UNIX)
|
||||
Console()->Chain("sv_conn_logging_server", ConchainConnLoggingServerChange, this);
|
||||
#endif
|
||||
|
@ -3930,27 +3944,30 @@ void CServer::GetClientAddr(int ClientId, NETADDR *pAddr) const
|
|||
}
|
||||
}
|
||||
|
||||
const char *CServer::GetAnnouncementLine(const char *pFileName)
|
||||
void CServer::ReadAnnouncementsFile(const char *pFileName)
|
||||
{
|
||||
if(str_comp(pFileName, m_aAnnouncementFile) != 0)
|
||||
{
|
||||
str_copy(m_aAnnouncementFile, pFileName);
|
||||
m_vAnnouncements.clear();
|
||||
m_vAnnouncements.clear();
|
||||
|
||||
CLineReader LineReader;
|
||||
if(!LineReader.OpenFile(m_pStorage->OpenFile(pFileName, IOFLAG_READ, IStorage::TYPE_ALL)))
|
||||
if(pFileName[0] == '\0')
|
||||
return;
|
||||
|
||||
CLineReader LineReader;
|
||||
if(!LineReader.OpenFile(m_pStorage->OpenFile(pFileName, IOFLAG_READ, IStorage::TYPE_ALL)))
|
||||
{
|
||||
dbg_msg("announcements", "failed to open '%s'", pFileName);
|
||||
return;
|
||||
}
|
||||
while(const char *pLine = LineReader.Get())
|
||||
{
|
||||
if(str_length(pLine) && pLine[0] != '#')
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
while(const char *pLine = LineReader.Get())
|
||||
{
|
||||
if(str_length(pLine) && pLine[0] != '#')
|
||||
{
|
||||
m_vAnnouncements.emplace_back(pLine);
|
||||
}
|
||||
m_vAnnouncements.emplace_back(pLine);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const char *CServer::GetAnnouncementLine()
|
||||
{
|
||||
if(m_vAnnouncements.empty())
|
||||
{
|
||||
return 0;
|
||||
|
@ -3959,7 +3976,7 @@ const char *CServer::GetAnnouncementLine(const char *pFileName)
|
|||
{
|
||||
m_AnnouncementLastLine = 0;
|
||||
}
|
||||
else if(!Config()->m_SvAnnouncementRandom)
|
||||
else if(!g_Config.m_SvAnnouncementRandom)
|
||||
{
|
||||
if(++m_AnnouncementLastLine >= m_vAnnouncements.size())
|
||||
m_AnnouncementLastLine %= m_vAnnouncements.size();
|
||||
|
|
|
@ -259,7 +259,6 @@ public:
|
|||
|
||||
size_t m_AnnouncementLastLine;
|
||||
std::vector<std::string> m_vAnnouncements;
|
||||
char m_aAnnouncementFile[IO_MAX_PATH_LENGTH];
|
||||
|
||||
std::shared_ptr<ILogger> m_pFileLogger = nullptr;
|
||||
std::shared_ptr<ILogger> m_pStdoutLogger = nullptr;
|
||||
|
@ -427,6 +426,7 @@ public:
|
|||
static void ConchainSixupUpdate(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
||||
static void ConchainLoglevel(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
||||
static void ConchainStdoutOutputLevel(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
||||
static void ConchainAnnouncementFileName(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
||||
|
||||
#if defined(CONF_FAMILY_UNIX)
|
||||
static void ConchainConnLoggingServerChange(IConsole::IResult *pResult, void *pUserData, IConsole::FCommandCallback pfnCallback, void *pCallbackUserData);
|
||||
|
@ -443,7 +443,8 @@ public:
|
|||
|
||||
void GetClientAddr(int ClientId, NETADDR *pAddr) const override;
|
||||
int m_aPrevStates[MAX_CLIENTS];
|
||||
const char *GetAnnouncementLine(const char *pFileName) override;
|
||||
const char *GetAnnouncementLine() override;
|
||||
void ReadAnnouncementsFile(const char *pFileName) override;
|
||||
|
||||
int *GetIdMap(int ClientId) override;
|
||||
|
||||
|
|
|
@ -228,7 +228,7 @@ MACRO_CONFIG_INT(SvWarmup, sv_warmup, 0, 0, 0, CFGFLAG_SERVER, "Number of second
|
|||
MACRO_CONFIG_STR(SvMotd, sv_motd, 900, "", CFGFLAG_SERVER, "Message of the day to display for the clients")
|
||||
MACRO_CONFIG_STR(SvGametype, sv_gametype, 32, "ddnet", CFGFLAG_SERVER, "Game type (ddnet, mod)")
|
||||
MACRO_CONFIG_INT(SvTournamentMode, sv_tournament_mode, 0, 0, 1, CFGFLAG_SERVER, "Tournament mode. When enabled, players joins the server as spectator")
|
||||
MACRO_CONFIG_INT(SvSpamprotection, sv_spamprotection, 1, 0, 1, CFGFLAG_SERVER, "Spam protection")
|
||||
MACRO_CONFIG_INT(SvSpamprotection, sv_spamprotection, 1, 0, 1, CFGFLAG_SERVER, "Spam protection for: team change, chat, skin change, emotes and votes")
|
||||
|
||||
MACRO_CONFIG_INT(SvSpectatorSlots, sv_spectator_slots, 0, 0, MAX_CLIENTS, CFGFLAG_SERVER, "Number of slots to reserve for spectators")
|
||||
MACRO_CONFIG_INT(SvInactiveKickTime, sv_inactivekick_time, 0, 0, 1000, CFGFLAG_SERVER, "How many minutes to wait before taking care of inactive players")
|
||||
|
@ -548,8 +548,8 @@ MACRO_CONFIG_INT(SvMinTeamSize, sv_min_team_size, 2, 1, MAX_CLIENTS, CFGFLAG_SER
|
|||
MACRO_CONFIG_INT(SvMaxTeamSize, sv_max_team_size, MAX_CLIENTS, 1, MAX_CLIENTS, CFGFLAG_SERVER | CFGFLAG_GAME, "Maximum team size")
|
||||
MACRO_CONFIG_INT(SvMapVote, sv_map_vote, 1, 0, 1, CFGFLAG_SERVER, "Whether to allow /map")
|
||||
|
||||
MACRO_CONFIG_STR(SvAnnouncementFileName, sv_announcement_filename, 24, "announcement.txt", CFGFLAG_SERVER, "file which will have the announcement, each one at a line")
|
||||
MACRO_CONFIG_INT(SvAnnouncementInterval, sv_announcement_interval, 300, 1, 9999, CFGFLAG_SERVER, "time(minutes) in which the announcement will be displayed from the announcement file")
|
||||
MACRO_CONFIG_STR(SvAnnouncementFileName, sv_announcement_filename, IO_MAX_PATH_LENGTH, "announcement.txt", CFGFLAG_SERVER, "File which contains the announcements, one on each line")
|
||||
MACRO_CONFIG_INT(SvAnnouncementInterval, sv_announcement_interval, 120, 1, 9999, CFGFLAG_SERVER, "The time (minutes) for how often an announcement will be displayed from the announcement file")
|
||||
MACRO_CONFIG_INT(SvAnnouncementRandom, sv_announcement_random, 1, 0, 1, CFGFLAG_SERVER, "Whether announcements are sequential or random")
|
||||
|
||||
MACRO_CONFIG_INT(SvOldLaser, sv_old_laser, 0, 0, 1, CFGFLAG_SERVER | CFGFLAG_GAME, "Whether lasers can hit you if you shot them and that they pull you towards the bounce origin (0 for all new maps) or lasers can't hit you if you shot them, and they pull others towards the shooter")
|
||||
|
|
|
@ -1565,7 +1565,7 @@ void CGameClient::OnNewSnapshot()
|
|||
pClient->m_SkinInfo.m_ColorFeet = ColorRGBA(1, 1, 1);
|
||||
}
|
||||
|
||||
pClient->UpdateRenderInfo(IsTeamPlay(), g_Config.m_ClDummy);
|
||||
pClient->UpdateRenderInfo(IsTeamPlay());
|
||||
}
|
||||
}
|
||||
else if(Item.m_Type == NETOBJTYPE_PLAYERINFO)
|
||||
|
@ -2388,7 +2388,7 @@ void CGameClient::CClientStats::Reset()
|
|||
m_FlagCaptures = 0;
|
||||
}
|
||||
|
||||
void CGameClient::CClientData::UpdateRenderInfo(bool IsTeamPlay, int Conn)
|
||||
void CGameClient::CClientData::UpdateRenderInfo(bool IsTeamPlay)
|
||||
{
|
||||
m_RenderInfo = m_SkinInfo;
|
||||
|
||||
|
@ -2403,6 +2403,7 @@ void CGameClient::CClientData::UpdateRenderInfo(bool IsTeamPlay, int Conn)
|
|||
m_RenderInfo.m_ColorFeet = color_cast<ColorRGBA>(ColorHSLA(aTeamColors[m_Team]));
|
||||
|
||||
// 0.7
|
||||
for(auto &Sixup : m_RenderInfo.m_aSixup)
|
||||
{
|
||||
const ColorRGBA aTeamColorsSixup[2] = {
|
||||
ColorRGBA(0.753f, 0.318f, 0.318f, 1.0f),
|
||||
|
@ -2410,19 +2411,20 @@ void CGameClient::CClientData::UpdateRenderInfo(bool IsTeamPlay, int Conn)
|
|||
const ColorRGBA aMarkingColorsSixup[2] = {
|
||||
ColorRGBA(0.824f, 0.345f, 0.345f, 1.0f),
|
||||
ColorRGBA(0.345f, 0.514f, 0.824f, 1.0f)};
|
||||
float MarkingAlpha = m_RenderInfo.m_aSixup[Conn].m_aColors[protocol7::SKINPART_MARKING].a;
|
||||
for(auto &Color : m_RenderInfo.m_aSixup[Conn].m_aColors)
|
||||
float MarkingAlpha = Sixup.m_aColors[protocol7::SKINPART_MARKING].a;
|
||||
for(auto &Color : Sixup.m_aColors)
|
||||
Color = aTeamColorsSixup[m_Team];
|
||||
if(MarkingAlpha > 0.1f)
|
||||
m_RenderInfo.m_aSixup[Conn].m_aColors[protocol7::SKINPART_MARKING] = aMarkingColorsSixup[m_Team];
|
||||
Sixup.m_aColors[protocol7::SKINPART_MARKING] = aMarkingColorsSixup[m_Team];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_RenderInfo.m_ColorBody = color_cast<ColorRGBA>(ColorHSLA(12829350));
|
||||
m_RenderInfo.m_ColorFeet = color_cast<ColorRGBA>(ColorHSLA(12829350));
|
||||
for(auto &Color : m_RenderInfo.m_aSixup[Conn].m_aColors)
|
||||
Color = color_cast<ColorRGBA>(ColorHSLA(12829350));
|
||||
for(auto &Sixup : m_RenderInfo.m_aSixup)
|
||||
for(auto &Color : Sixup.m_aColors)
|
||||
Color = color_cast<ColorRGBA>(ColorHSLA(12829350));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3757,8 +3759,7 @@ void CGameClient::RefreshSkins()
|
|||
Client.m_SkinInfo.m_OriginalRenderSkin.Reset();
|
||||
Client.m_SkinInfo.m_ColorableRenderSkin.Reset();
|
||||
}
|
||||
for(int Dummy = 0; Dummy < NUM_DUMMIES; Dummy++)
|
||||
Client.UpdateRenderInfo(IsTeamPlay(), Dummy);
|
||||
Client.UpdateRenderInfo(IsTeamPlay());
|
||||
}
|
||||
|
||||
for(auto &pComponent : m_vpAll)
|
||||
|
|
|
@ -438,7 +438,7 @@ public:
|
|||
bool m_SpecCharPresent;
|
||||
vec2 m_SpecChar;
|
||||
|
||||
void UpdateRenderInfo(bool IsTeamPlay, int Conn);
|
||||
void UpdateRenderInfo(bool IsTeamPlay);
|
||||
void Reset();
|
||||
|
||||
class CSixup
|
||||
|
|
|
@ -196,7 +196,7 @@ void *CGameClient::TranslateGameMsg(int *pMsgId, CUnpacker *pUnpacker, int Conn)
|
|||
{
|
||||
m_aClients[pMsg7->m_ClientId].m_Team = pMsg7->m_Team;
|
||||
m_pClient->m_TranslationContext.m_aClients[pMsg7->m_ClientId].m_Team = pMsg7->m_Team;
|
||||
m_aClients[pMsg7->m_ClientId].UpdateRenderInfo(IsTeamPlay(), Conn);
|
||||
m_aClients[pMsg7->m_ClientId].UpdateRenderInfo(IsTeamPlay());
|
||||
|
||||
// if(pMsg7->m_ClientId == m_LocalClientId)
|
||||
// {
|
||||
|
@ -620,10 +620,12 @@ void *CGameClient::TranslateGameMsg(int *pMsgId, CUnpacker *pUnpacker, int Conn)
|
|||
switch(GameMsgId)
|
||||
{
|
||||
case protocol7::GAMEMSG_CTF_DROP:
|
||||
m_Sounds.Enqueue(CSounds::CHN_GLOBAL, SOUND_CTF_DROP);
|
||||
if(Conn == g_Config.m_ClDummy)
|
||||
m_Sounds.Enqueue(CSounds::CHN_GLOBAL, SOUND_CTF_DROP);
|
||||
break;
|
||||
case protocol7::GAMEMSG_CTF_RETURN:
|
||||
m_Sounds.Enqueue(CSounds::CHN_GLOBAL, SOUND_CTF_RETURN);
|
||||
if(Conn == g_Config.m_ClDummy)
|
||||
m_Sounds.Enqueue(CSounds::CHN_GLOBAL, SOUND_CTF_RETURN);
|
||||
break;
|
||||
case protocol7::GAMEMSG_TEAM_ALL:
|
||||
{
|
||||
|
@ -650,7 +652,8 @@ void *CGameClient::TranslateGameMsg(int *pMsgId, CUnpacker *pUnpacker, int Conn)
|
|||
}
|
||||
break;
|
||||
case protocol7::GAMEMSG_CTF_GRAB:
|
||||
m_Sounds.Enqueue(CSounds::CHN_GLOBAL, SOUND_CTF_GRAB_EN);
|
||||
if(Conn == g_Config.m_ClDummy)
|
||||
m_Sounds.Enqueue(CSounds::CHN_GLOBAL, SOUND_CTF_GRAB_EN);
|
||||
break;
|
||||
case protocol7::GAMEMSG_GAME_PAUSED:
|
||||
{
|
||||
|
@ -660,7 +663,8 @@ void *CGameClient::TranslateGameMsg(int *pMsgId, CUnpacker *pUnpacker, int Conn)
|
|||
}
|
||||
break;
|
||||
case protocol7::GAMEMSG_CTF_CAPTURE:
|
||||
m_Sounds.Enqueue(CSounds::CHN_GLOBAL, SOUND_CTF_CAPTURE);
|
||||
if(Conn == g_Config.m_ClDummy)
|
||||
m_Sounds.Enqueue(CSounds::CHN_GLOBAL, SOUND_CTF_CAPTURE);
|
||||
int ClientId = clamp(aParaI[1], 0, MAX_CLIENTS - 1);
|
||||
m_aStats[ClientId].m_FlagCaptures++;
|
||||
|
||||
|
|
|
@ -1263,7 +1263,7 @@ void CEditor::DoToolbarLayers(CUIRect ToolBar)
|
|||
{
|
||||
pButtonName = "Tele";
|
||||
pfnPopupFunc = PopupTele;
|
||||
Rows = 3;
|
||||
Rows = m_TeleNumbers.size() + 1;
|
||||
}
|
||||
|
||||
if(pButtonName != nullptr)
|
||||
|
@ -8013,7 +8013,7 @@ void CEditor::Render()
|
|||
return pLayer->m_Type == LAYERTYPE_TILES && std::static_pointer_cast<CLayerTiles>(pLayer)->m_Tele;
|
||||
});
|
||||
if(HasTeleTiles)
|
||||
str_copy(m_aTooltip, "Use shift+mousewheel up/down to adjust the tele numbers. Use ctrl+f to change all tele numbers to the first unused number.");
|
||||
str_copy(m_aTooltip, "Use shift+mousewheel up/down to adjust the tele number. Use ctrl+f to change current tele number to the first unused number.");
|
||||
|
||||
if(Input()->ShiftIsPressed())
|
||||
{
|
||||
|
@ -8960,9 +8960,6 @@ void CEditor::AdjustBrushSpecialTiles(bool UseNextFree, int Adjust)
|
|||
// Only handle tele, switch and tune layers
|
||||
if(pLayerTiles->m_Tele)
|
||||
{
|
||||
int NextFreeTeleNumber = FindNextFreeTeleNumber();
|
||||
int NextFreeCPNumber = FindNextFreeTeleNumber(true);
|
||||
|
||||
std::shared_ptr<CLayerTele> pTeleLayer = std::static_pointer_cast<CLayerTele>(pLayer);
|
||||
for(int y = 0; y < pTeleLayer->m_Height; y++)
|
||||
{
|
||||
|
@ -8974,13 +8971,18 @@ void CEditor::AdjustBrushSpecialTiles(bool UseNextFree, int Adjust)
|
|||
|
||||
if(UseNextFree)
|
||||
{
|
||||
if(IsTeleTileCheckpoint(pTeleLayer->m_pTiles[i].m_Index))
|
||||
pTeleLayer->m_pTeleTile[i].m_Number = NextFreeCPNumber;
|
||||
else
|
||||
pTeleLayer->m_pTeleTile[i].m_Number = NextFreeTeleNumber;
|
||||
pTeleLayer->m_pTeleTile[i].m_Number = FindNextFreeTeleNumber(pTeleLayer->m_pTiles[i].m_Index);
|
||||
}
|
||||
else
|
||||
AdjustNumber(pTeleLayer->m_pTeleTile[i].m_Number);
|
||||
|
||||
if(m_TeleNumbers[pTeleLayer->m_pTiles[i].m_Index] != pTeleLayer->m_pTeleTile[i].m_Number)
|
||||
{
|
||||
if(UseNextFree || Adjust != 0)
|
||||
m_TeleNumbers[pTeleLayer->m_pTiles[i].m_Index] = pTeleLayer->m_pTeleTile[i].m_Number;
|
||||
else if(!UseNextFree && Adjust == 0)
|
||||
pTeleLayer->m_pTeleTile[i].m_Number = m_TeleNumbers[pTeleLayer->m_pTiles[i].m_Index];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9040,12 +9042,12 @@ int CEditor::FindNextFreeSwitchNumber()
|
|||
return Number;
|
||||
}
|
||||
|
||||
int CEditor::FindNextFreeTeleNumber(bool IsCheckpoint)
|
||||
int CEditor::FindNextFreeTeleNumber(int Index)
|
||||
{
|
||||
int Number = -1;
|
||||
for(int i = 1; i <= 255; i++)
|
||||
{
|
||||
if(!m_Map.m_pTeleLayer->ContainsElementWithId(i, IsCheckpoint))
|
||||
if(!m_Map.m_pTeleLayer->ContainsElementWithId(i, Index))
|
||||
{
|
||||
Number = i;
|
||||
break;
|
||||
|
|
|
@ -218,8 +218,15 @@ public:
|
|||
void MakeTuneLayer(const std::shared_ptr<CLayer> &pLayer);
|
||||
};
|
||||
|
||||
struct CProperty
|
||||
class CProperty
|
||||
{
|
||||
public:
|
||||
CProperty(const char *name, int value, int type, int min, int max) :
|
||||
m_pName(name), m_Value(value), m_Type(type), m_Min(min), m_Max(max) {}
|
||||
|
||||
CProperty(std::nullptr_t) :
|
||||
m_pName(nullptr), m_Value(0), m_Type(0), m_Min(0), m_Max(0) {}
|
||||
|
||||
const char *m_pName;
|
||||
int m_Value;
|
||||
int m_Type;
|
||||
|
@ -428,8 +435,15 @@ public:
|
|||
|
||||
// DDRace
|
||||
|
||||
m_TeleNumber = 1;
|
||||
m_TeleCheckpointNumber = 1;
|
||||
m_TeleNumbers = {
|
||||
{TILE_TELEINEVIL, 1},
|
||||
{TILE_TELEINWEAPON, 1},
|
||||
{TILE_TELEINHOOK, 1},
|
||||
{TILE_TELEIN, 1},
|
||||
{TILE_TELEOUT, 1},
|
||||
{TILE_TELECHECK, 1},
|
||||
{TILE_TELECHECKOUT, 1}};
|
||||
|
||||
m_SwitchNum = 1;
|
||||
m_TuningNum = 1;
|
||||
m_SwitchDelay = 0;
|
||||
|
@ -1127,9 +1141,8 @@ public:
|
|||
IGraphics::CTextureHandle GetSwitchTexture();
|
||||
IGraphics::CTextureHandle GetTuneTexture();
|
||||
|
||||
unsigned char m_TeleNumber;
|
||||
unsigned char m_TeleCheckpointNumber;
|
||||
unsigned char m_ViewTeleNumber;
|
||||
std::map<int, unsigned char> m_TeleNumbers;
|
||||
|
||||
unsigned char m_TuningNum;
|
||||
|
||||
|
@ -1143,7 +1156,7 @@ public:
|
|||
|
||||
void AdjustBrushSpecialTiles(bool UseNextFree, int Adjust = 0);
|
||||
int FindNextFreeSwitchNumber();
|
||||
int FindNextFreeTeleNumber(bool IsCheckpoint = false);
|
||||
int FindNextFreeTeleNumber(int Index);
|
||||
|
||||
// Undo/Redo
|
||||
CEditorHistory m_EditorHistory;
|
||||
|
|
|
@ -77,7 +77,7 @@ void CLayerTele::BrushDraw(std::shared_ptr<CLayer> pBrush, float wx, float wy)
|
|||
int sx = ConvertX(wx);
|
||||
int sy = ConvertY(wy);
|
||||
if(str_comp(pTeleLayer->m_aFileName, m_pEditor->m_aFileName))
|
||||
m_pEditor->m_TeleNumber = pTeleLayer->m_TeleNum;
|
||||
m_pEditor->m_TeleNumbers = pTeleLayer->m_TeleNumbers;
|
||||
|
||||
bool Destructive = m_pEditor->m_BrushDrawDestructive || IsEmpty(pTeleLayer);
|
||||
|
||||
|
@ -99,22 +99,19 @@ void CLayerTele::BrushDraw(std::shared_ptr<CLayer> pBrush, float wx, float wy)
|
|||
m_pTeleTile[Index].m_Type,
|
||||
m_pTiles[Index].m_Index};
|
||||
|
||||
if((m_pEditor->m_AllowPlaceUnusedTiles || IsValidTeleTile(pTeleLayer->m_pTiles[y * pTeleLayer->m_Width + x].m_Index)) && pTeleLayer->m_pTiles[y * pTeleLayer->m_Width + x].m_Index != TILE_AIR)
|
||||
unsigned char TgtIndex = pTeleLayer->m_pTiles[y * pTeleLayer->m_Width + x].m_Index;
|
||||
if((m_pEditor->m_AllowPlaceUnusedTiles || IsValidTeleTile(TgtIndex)) && TgtIndex != TILE_AIR)
|
||||
{
|
||||
bool IsCheckpoint = IsTeleTileCheckpoint(pTeleLayer->m_pTiles[y * pTeleLayer->m_Width + x].m_Index);
|
||||
if(!IsCheckpoint && !IsTeleTileNumberUsed(pTeleLayer->m_pTiles[y * pTeleLayer->m_Width + x].m_Index, false))
|
||||
bool IsCheckpoint = IsTeleTileCheckpoint(TgtIndex);
|
||||
if(!IsCheckpoint && !IsTeleTileNumberUsed(TgtIndex, false))
|
||||
{
|
||||
// Tele tile number is unused. Set a known value which is not 0,
|
||||
// as tiles with number 0 would be ignored by previous versions.
|
||||
m_pTeleTile[Index].m_Number = 255;
|
||||
}
|
||||
else if(!IsCheckpoint && m_pEditor->m_TeleNumber != pTeleLayer->m_TeleNum)
|
||||
else if(m_pEditor->m_TeleNumbers[TgtIndex] != pTeleLayer->m_TeleNumbers[TgtIndex])
|
||||
{
|
||||
m_pTeleTile[Index].m_Number = m_pEditor->m_TeleNumber;
|
||||
}
|
||||
else if(IsCheckpoint && m_pEditor->m_TeleCheckpointNumber != pTeleLayer->m_TeleCheckpointNum)
|
||||
{
|
||||
m_pTeleTile[Index].m_Number = m_pEditor->m_TeleCheckpointNumber;
|
||||
m_pTeleTile[Index].m_Number = m_pEditor->m_TeleNumbers[TgtIndex];
|
||||
}
|
||||
else if(pTeleLayer->m_pTeleTile[y * pTeleLayer->m_Width + x].m_Number)
|
||||
{
|
||||
|
@ -122,7 +119,7 @@ void CLayerTele::BrushDraw(std::shared_ptr<CLayer> pBrush, float wx, float wy)
|
|||
}
|
||||
else
|
||||
{
|
||||
if((!IsCheckpoint && !m_pEditor->m_TeleNumber) || (IsCheckpoint && !m_pEditor->m_TeleCheckpointNumber))
|
||||
if(!m_pEditor->m_TeleNumbers[TgtIndex])
|
||||
{
|
||||
m_pTeleTile[Index].m_Number = 0;
|
||||
m_pTeleTile[Index].m_Type = 0;
|
||||
|
@ -138,7 +135,7 @@ void CLayerTele::BrushDraw(std::shared_ptr<CLayer> pBrush, float wx, float wy)
|
|||
}
|
||||
else
|
||||
{
|
||||
m_pTeleTile[Index].m_Number = IsCheckpoint ? m_pEditor->m_TeleCheckpointNumber : m_pEditor->m_TeleNumber;
|
||||
m_pTeleTile[Index].m_Number = m_pEditor->m_TeleNumbers[TgtIndex];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -283,10 +280,8 @@ void CLayerTele::FillSelection(bool Empty, std::shared_ptr<CLayer> pBrush, CUIRe
|
|||
// as tiles with number 0 would be ignored by previous versions.
|
||||
m_pTeleTile[TgtIndex].m_Number = 255;
|
||||
}
|
||||
else if(!IsCheckpoint && ((pLt->m_pTeleTile[SrcIndex].m_Number == 0 && m_pEditor->m_TeleNumber) || m_pEditor->m_TeleNumber != pLt->m_TeleNum))
|
||||
m_pTeleTile[TgtIndex].m_Number = m_pEditor->m_TeleNumber;
|
||||
else if(IsCheckpoint && ((pLt->m_pTeleTile[SrcIndex].m_Number == 0 && m_pEditor->m_TeleCheckpointNumber) || m_pEditor->m_TeleCheckpointNumber != pLt->m_TeleCheckpointNum))
|
||||
m_pTeleTile[TgtIndex].m_Number = m_pEditor->m_TeleCheckpointNumber;
|
||||
else if((pLt->m_pTeleTile[SrcIndex].m_Number == 0 && m_pEditor->m_TeleNumbers[m_pTiles[TgtIndex].m_Index]) || m_pEditor->m_TeleNumbers[m_pTiles[TgtIndex].m_Index] != pLt->m_TeleNumbers[m_pTiles[TgtIndex].m_Index])
|
||||
m_pTeleTile[TgtIndex].m_Number = m_pEditor->m_TeleNumbers[m_pTiles[TgtIndex].m_Index];
|
||||
else
|
||||
m_pTeleTile[TgtIndex].m_Number = pLt->m_pTeleTile[SrcIndex].m_Number;
|
||||
}
|
||||
|
@ -303,13 +298,13 @@ void CLayerTele::FillSelection(bool Empty, std::shared_ptr<CLayer> pBrush, CUIRe
|
|||
FlagModified(sx, sy, w, h);
|
||||
}
|
||||
|
||||
bool CLayerTele::ContainsElementWithId(int Id, bool Checkpoint)
|
||||
bool CLayerTele::ContainsElementWithId(int Id, int Index)
|
||||
{
|
||||
for(int y = 0; y < m_Height; ++y)
|
||||
{
|
||||
for(int x = 0; x < m_Width; ++x)
|
||||
{
|
||||
if(IsTeleTileNumberUsed(m_pTeleTile[y * m_Width + x].m_Type, Checkpoint) && m_pTeleTile[y * m_Width + x].m_Number == Id)
|
||||
if(m_pTeleTile[y * m_Width + x].m_Type == Index && m_pTeleTile[y * m_Width + x].m_Number == Id)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -22,8 +22,7 @@ public:
|
|||
~CLayerTele();
|
||||
|
||||
CTeleTile *m_pTeleTile;
|
||||
unsigned char m_TeleNum;
|
||||
unsigned char m_TeleCheckpointNum;
|
||||
std::map<int, unsigned char> m_TeleNumbers;
|
||||
|
||||
void Resize(int NewW, int NewH) override;
|
||||
void Shift(int Direction) override;
|
||||
|
@ -33,7 +32,7 @@ public:
|
|||
void BrushFlipY() override;
|
||||
void BrushRotate(float Amount) override;
|
||||
void FillSelection(bool Empty, std::shared_ptr<CLayer> pBrush, CUIRect Rect) override;
|
||||
virtual bool ContainsElementWithId(int Id, bool Checkpoint);
|
||||
virtual bool ContainsElementWithId(int Id, int Index);
|
||||
virtual void GetPos(int Number, int Offset, int &TeleX, int &TeleY);
|
||||
|
||||
int m_GotoTeleOffset;
|
||||
|
|
|
@ -310,17 +310,15 @@ int CLayerTiles::BrushGrab(std::shared_ptr<CLayerGroup> pBrush, CUIRect Rect)
|
|||
for(int x = 0; x < r.w; x++)
|
||||
{
|
||||
pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x] = static_cast<CLayerTele *>(this)->m_pTeleTile[(r.y + y) * m_Width + (r.x + x)];
|
||||
if(IsValidTeleTile(pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Type))
|
||||
unsigned char TgtIndex = pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Type;
|
||||
if(IsValidTeleTile(TgtIndex))
|
||||
{
|
||||
if(IsTeleTileNumberUsed(pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Type, false))
|
||||
m_pEditor->m_TeleNumber = pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Number;
|
||||
else if(IsTeleTileNumberUsed(pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Type, true))
|
||||
m_pEditor->m_TeleCheckpointNumber = pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Number;
|
||||
if(IsTeleTileNumberUsedAny(TgtIndex))
|
||||
m_pEditor->m_TeleNumbers[TgtIndex] = pGrabbed->m_pTeleTile[y * pGrabbed->m_Width + x].m_Number;
|
||||
}
|
||||
}
|
||||
|
||||
pGrabbed->m_TeleNum = m_pEditor->m_TeleNumber;
|
||||
pGrabbed->m_TeleCheckpointNum = m_pEditor->m_TeleCheckpointNumber;
|
||||
pGrabbed->m_TeleNumbers = m_pEditor->m_TeleNumbers;
|
||||
|
||||
str_copy(pGrabbed->m_aFileName, m_pEditor->m_aFileName);
|
||||
}
|
||||
|
|
|
@ -2433,23 +2433,29 @@ CUi::EPopupMenuFunctionResult CEditor::PopupTele(void *pContext, CUIRect View, b
|
|||
{
|
||||
CEditor *pEditor = static_cast<CEditor *>(pContext);
|
||||
|
||||
static int s_PreviousTeleNumber;
|
||||
static int s_PreviousCheckpointNumber;
|
||||
const size_t TeleNumbersSize = pEditor->m_TeleNumbers.size();
|
||||
|
||||
static std::vector<int> s_PreviousTeleNumbers;
|
||||
if(s_PreviousTeleNumbers.size() != TeleNumbersSize)
|
||||
s_PreviousTeleNumbers.resize(TeleNumbersSize);
|
||||
static int s_PreviousViewTeleNumber;
|
||||
|
||||
CUIRect NumberPicker;
|
||||
CUIRect FindEmptySlot;
|
||||
CUIRect FindFreeTeleSlot, FindFreeCheckpointSlot, FindFreeViewSlot;
|
||||
CUIRect FindFreeViewSlot;
|
||||
std::vector<CUIRect> FindFreeTeleSlots;
|
||||
if(FindFreeTeleSlots.size() != TeleNumbersSize)
|
||||
FindFreeTeleSlots.resize(TeleNumbersSize);
|
||||
|
||||
View.VSplitRight(15.f, &NumberPicker, &FindEmptySlot);
|
||||
NumberPicker.VSplitRight(2.f, &NumberPicker, nullptr);
|
||||
|
||||
FindEmptySlot.HSplitTop(13.0f, &FindFreeTeleSlot, &FindEmptySlot);
|
||||
FindEmptySlot.HSplitTop(13.0f, &FindFreeCheckpointSlot, &FindEmptySlot);
|
||||
for(auto &Slot : FindFreeTeleSlots)
|
||||
FindEmptySlot.HSplitTop(13.0f, &Slot, &FindEmptySlot);
|
||||
FindEmptySlot.HSplitTop(13.0f, &FindFreeViewSlot, &FindEmptySlot);
|
||||
|
||||
FindFreeTeleSlot.HMargin(1.0f, &FindFreeTeleSlot);
|
||||
FindFreeCheckpointSlot.HMargin(1.0f, &FindFreeCheckpointSlot);
|
||||
for(auto &Slot : FindFreeTeleSlots)
|
||||
Slot.HMargin(1.0f, &Slot);
|
||||
FindFreeViewSlot.HMargin(1.0f, &FindFreeViewSlot);
|
||||
|
||||
auto ViewTele = [](CEditor *pEd) -> bool {
|
||||
|
@ -2465,79 +2471,95 @@ CUi::EPopupMenuFunctionResult CEditor::PopupTele(void *pContext, CUIRect View, b
|
|||
return false;
|
||||
};
|
||||
|
||||
static std::vector<ColorRGBA> s_vColors = {
|
||||
ColorRGBA(0.5f, 1, 0.5f, 0.5f),
|
||||
ColorRGBA(0.5f, 1, 0.5f, 0.5f),
|
||||
ColorRGBA(0.5f, 1, 0.5f, 0.5f),
|
||||
};
|
||||
enum
|
||||
static std::vector<ColorRGBA> s_vColors;
|
||||
if(s_vColors.size() != TeleNumbersSize + 1)
|
||||
{
|
||||
PROP_TELE = 0,
|
||||
PROP_TELE_CP,
|
||||
PROP_TELE_VIEW,
|
||||
NUM_PROPS,
|
||||
};
|
||||
s_vColors.resize(TeleNumbersSize + 1, ColorRGBA(0.5f, 1, 0.5f, 0.5f));
|
||||
}
|
||||
|
||||
// find next free numbers buttons
|
||||
{
|
||||
// Pressing ctrl+f will find next free numbers for both tele and checkpoints
|
||||
|
||||
static int s_NextFreeTelePid = 0;
|
||||
if(pEditor->DoButton_Editor(&s_NextFreeTelePid, "F", 0, &FindFreeTeleSlot, 0, "[ctrl+f] Find next free tele number") || (Active && pEditor->Input()->ModifierIsPressed() && pEditor->Input()->KeyPress(KEY_F)))
|
||||
static std::vector<int> s_NextFreeTelePids;
|
||||
if(s_NextFreeTelePids.size() != TeleNumbersSize)
|
||||
s_NextFreeTelePids.resize(TeleNumbersSize, 0);
|
||||
for(size_t i = 0; i < s_NextFreeTelePids.size(); i++)
|
||||
{
|
||||
int TeleNumber = pEditor->FindNextFreeTeleNumber();
|
||||
if(pEditor->DoButton_Editor(&s_NextFreeTelePids[i], "F", 0, &FindFreeTeleSlots[i], 0, "[ctrl+f] Find next free tele number") || (Active && pEditor->Input()->ModifierIsPressed() && pEditor->Input()->KeyPress(KEY_F)))
|
||||
{
|
||||
int Tile = (*std::next(pEditor->m_TeleNumbers.begin(), i)).first;
|
||||
int TeleNumber = pEditor->FindNextFreeTeleNumber(Tile);
|
||||
|
||||
if(TeleNumber != -1)
|
||||
pEditor->m_TeleNumber = TeleNumber;
|
||||
}
|
||||
|
||||
static int s_NextFreeCheckpointPid = 0;
|
||||
if(pEditor->DoButton_Editor(&s_NextFreeCheckpointPid, "F", 0, &FindFreeCheckpointSlot, 0, "[ctrl+f] Find next free checkpoint number") || (Active && pEditor->Input()->ModifierIsPressed() && pEditor->Input()->KeyPress(KEY_F)))
|
||||
{
|
||||
int CPNumber = pEditor->FindNextFreeTeleNumber(true);
|
||||
|
||||
if(CPNumber != -1)
|
||||
pEditor->m_TeleCheckpointNumber = CPNumber;
|
||||
if(TeleNumber != -1)
|
||||
{
|
||||
pEditor->m_TeleNumbers[Tile] = TeleNumber;
|
||||
pEditor->AdjustBrushSpecialTiles(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int s_NextFreeViewPid = 0;
|
||||
int btn = pEditor->DoButton_Editor(&s_NextFreeViewPid, "N", 0, &FindFreeViewSlot, 0, "[n] Show next tele with this number");
|
||||
if(btn || (Active && pEditor->Input()->KeyPress(KEY_N)))
|
||||
s_vColors[PROP_TELE_VIEW] = ViewTele(pEditor) ? ColorRGBA(0.5f, 1, 0.5f, 0.5f) : ColorRGBA(1, 0.5f, 0.5f, 0.5f);
|
||||
s_vColors[TeleNumbersSize] = ViewTele(pEditor) ? ColorRGBA(0.5f, 1, 0.5f, 0.5f) : ColorRGBA(1, 0.5f, 0.5f, 0.5f);
|
||||
}
|
||||
|
||||
// number picker
|
||||
{
|
||||
CProperty aProps[] = {
|
||||
{"Number", pEditor->m_TeleNumber, PROPTYPE_INT, 1, 255},
|
||||
{"Checkpoint", pEditor->m_TeleCheckpointNumber, PROPTYPE_INT, 1, 255},
|
||||
{"View", pEditor->m_ViewTeleNumber, PROPTYPE_INT, 1, 255},
|
||||
{nullptr},
|
||||
};
|
||||
static std::map<int, const char *> TeleText = {
|
||||
{TILE_TELEINEVIL, "Red Tele"},
|
||||
{TILE_TELEINWEAPON, "Weapon Tele"},
|
||||
{TILE_TELEINHOOK, "Hook Tele"},
|
||||
{TILE_TELEIN, "Blue Tele"},
|
||||
{TILE_TELEOUT, "Tele To"},
|
||||
{TILE_TELECHECK, "CP Tele"},
|
||||
{TILE_TELECHECKOUT, "CP Tele To"}};
|
||||
|
||||
static int s_aIds[NUM_PROPS] = {0};
|
||||
std::vector<CProperty> aProps;
|
||||
for(size_t i = 0; i < TeleNumbersSize; i++)
|
||||
{
|
||||
auto Tele = (*std::next(pEditor->m_TeleNumbers.begin(), i));
|
||||
aProps.emplace_back(CProperty{TeleText[Tele.first], Tele.second, PROPTYPE_INT, 1, 255});
|
||||
}
|
||||
aProps.emplace_back(CProperty{"View", pEditor->m_ViewTeleNumber, PROPTYPE_INT, 1, 255});
|
||||
aProps.emplace_back(nullptr);
|
||||
|
||||
static std::vector<int> s_aIds;
|
||||
if(s_aIds.size() != TeleNumbersSize + 2)
|
||||
{
|
||||
s_aIds.resize(TeleNumbersSize, 0);
|
||||
s_aIds.emplace_back(0); // PROP_TELE_VIEW
|
||||
s_aIds.emplace_back(0); // NUM_PROPS
|
||||
}
|
||||
|
||||
int NewVal = 0;
|
||||
int Prop = pEditor->DoProperties(&NumberPicker, aProps, s_aIds, &NewVal, s_vColors);
|
||||
if(Prop == PROP_TELE)
|
||||
pEditor->m_TeleNumber = (NewVal - 1 + 255) % 255 + 1;
|
||||
else if(Prop == PROP_TELE_CP)
|
||||
pEditor->m_TeleCheckpointNumber = (NewVal - 1 + 255) % 255 + 1;
|
||||
else if(Prop == PROP_TELE_VIEW)
|
||||
int Prop = pEditor->DoProperties(&NumberPicker, aProps.data(), s_aIds.data(), &NewVal, s_vColors);
|
||||
|
||||
if(Prop >= 0 && Prop < static_cast<int>(TeleNumbersSize))
|
||||
{
|
||||
auto Tele = (*std::next(pEditor->m_TeleNumbers.begin(), Prop));
|
||||
pEditor->m_TeleNumbers[Tele.first] = (NewVal - 1 + 255) % 255 + 1;
|
||||
pEditor->AdjustBrushSpecialTiles(false);
|
||||
}
|
||||
else if(Prop == static_cast<int>(TeleNumbersSize))
|
||||
pEditor->m_ViewTeleNumber = (NewVal - 1 + 255) % 255 + 1;
|
||||
|
||||
if(s_PreviousTeleNumber == 1 || s_PreviousTeleNumber != pEditor->m_TeleNumber)
|
||||
s_vColors[PROP_TELE] = pEditor->m_Map.m_pTeleLayer->ContainsElementWithId(pEditor->m_TeleNumber, false) ? ColorRGBA(1, 0.5f, 0.5f, 0.5f) : ColorRGBA(0.5f, 1, 0.5f, 0.5f);
|
||||
|
||||
if(s_PreviousCheckpointNumber == 1 || s_PreviousCheckpointNumber != pEditor->m_TeleCheckpointNumber)
|
||||
s_vColors[PROP_TELE_CP] = pEditor->m_Map.m_pTeleLayer->ContainsElementWithId(pEditor->m_TeleCheckpointNumber, true) ? ColorRGBA(1, 0.5f, 0.5f, 0.5f) : ColorRGBA(0.5f, 1, 0.5f, 0.5f);
|
||||
for(size_t i = 0; i < s_PreviousTeleNumbers.size(); i++)
|
||||
{
|
||||
auto Tele = (*std::next(pEditor->m_TeleNumbers.begin(), i));
|
||||
if(s_PreviousTeleNumbers[i] == 1 || s_PreviousTeleNumbers[i] != Tele.second)
|
||||
s_vColors[i] = pEditor->m_Map.m_pTeleLayer->ContainsElementWithId(Tele.second, Tele.first) ? ColorRGBA(1, 0.5f, 0.5f, 0.5f) : ColorRGBA(0.5f, 1, 0.5f, 0.5f);
|
||||
}
|
||||
|
||||
if(s_PreviousViewTeleNumber != pEditor->m_ViewTeleNumber)
|
||||
s_vColors[PROP_TELE_VIEW] = ViewTele(pEditor) ? ColorRGBA(0.5f, 1, 0.5f, 0.5f) : ColorRGBA(1, 0.5f, 0.5f, 0.5f);
|
||||
s_vColors[TeleNumbersSize] = ViewTele(pEditor) ? ColorRGBA(0.5f, 1, 0.5f, 0.5f) : ColorRGBA(1, 0.5f, 0.5f, 0.5f);
|
||||
}
|
||||
|
||||
s_PreviousTeleNumber = pEditor->m_TeleNumber;
|
||||
s_PreviousCheckpointNumber = pEditor->m_TeleCheckpointNumber;
|
||||
for(size_t i = 0; i < s_PreviousTeleNumbers.size(); i++)
|
||||
{
|
||||
s_PreviousTeleNumbers[i] = (*std::next(pEditor->m_TeleNumbers.begin(), i)).second;
|
||||
}
|
||||
s_PreviousViewTeleNumber = pEditor->m_ViewTeleNumber;
|
||||
|
||||
return CUi::POPUP_KEEP_OPEN;
|
||||
|
|
|
@ -893,6 +893,12 @@ void CGameContext::ConReloadCensorlist(IConsole::IResult *pResult, void *pUserDa
|
|||
pSelf->ReadCensorList();
|
||||
}
|
||||
|
||||
void CGameContext::ConReloadAnnouncement(IConsole::IResult *pResult, void *pUserData)
|
||||
{
|
||||
CGameContext *pSelf = (CGameContext *)pUserData;
|
||||
pSelf->Server()->ReadAnnouncementsFile(g_Config.m_SvAnnouncementFileName);
|
||||
}
|
||||
|
||||
void CGameContext::ConDumpAntibot(IConsole::IResult *pResult, void *pUserData)
|
||||
{
|
||||
CGameContext *pSelf = (CGameContext *)pUserData;
|
||||
|
|
|
@ -1253,7 +1253,7 @@ void CGameContext::OnTick()
|
|||
|
||||
if(Server()->Tick() % (g_Config.m_SvAnnouncementInterval * Server()->TickSpeed() * 60) == 0)
|
||||
{
|
||||
const char *pLine = Server()->GetAnnouncementLine(g_Config.m_SvAnnouncementFileName);
|
||||
const char *pLine = Server()->GetAnnouncementLine();
|
||||
if(pLine)
|
||||
SendChat(-1, TEAM_ALL, pLine);
|
||||
}
|
||||
|
@ -3643,6 +3643,7 @@ void CGameContext::OnConsoleInit()
|
|||
Console()->Register("set_team_all", "i[team-id]", CFGFLAG_SERVER, ConSetTeamAll, this, "Set team of all players to team");
|
||||
Console()->Register("hot_reload", "", CFGFLAG_SERVER | CMDFLAG_TEST, ConHotReload, this, "Reload the map while preserving the state of tees and teams");
|
||||
Console()->Register("reload_censorlist", "", CFGFLAG_SERVER, ConReloadCensorlist, this, "Reload the censorlist");
|
||||
Console()->Register("reload_announcement", "", CFGFLAG_SERVER, ConReloadAnnouncement, this, "Reload the announcements");
|
||||
|
||||
Console()->Register("add_vote", "s[name] r[command]", CFGFLAG_SERVER, ConAddVote, this, "Add a voting option");
|
||||
Console()->Register("remove_vote", "r[name]", CFGFLAG_SERVER, ConRemoveVote, this, "remove a voting option");
|
||||
|
|
|
@ -516,6 +516,7 @@ private:
|
|||
static void ConUnFreezeHammer(IConsole::IResult *pResult, void *pUserData);
|
||||
|
||||
static void ConReloadCensorlist(IConsole::IResult *pResult, void *pUserData);
|
||||
static void ConReloadAnnouncement(IConsole::IResult *pResult, void *pUserData);
|
||||
|
||||
CCharacter *GetPracticeCharacter(IConsole::IResult *pResult);
|
||||
|
||||
|
|
Loading…
Reference in a new issue