void CRaceDemo::OnMessage(int MsgType, void *pRawMsg) { if(!g_Config.m_ClAutoRaceRecord || Client()->State() != IClient::STATE_ONLINE || m_pClient->m_Snap.m_Spectate) return; // check for messages from server if(MsgType == NETMSGTYPE_SV_KILLMSG) { CNetMsg_Sv_KillMsg *pMsg = (CNetMsg_Sv_KillMsg *)pRawMsg; if(pMsg->m_Victim == m_pClient->m_Snap.m_LocalClientID && m_RaceState == RACE_FINISHED) { // check for new record CheckDemo(); OnReset(); } } else if(MsgType == NETMSGTYPE_SV_CHAT) { CNetMsg_Sv_Chat *pMsg = (CNetMsg_Sv_Chat *)pRawMsg; if(pMsg->m_ClientID == -1 && m_RaceState == RACE_STARTED) { const char* pMessage = pMsg->m_pMessage; int Num = 0; while(str_comp_num(pMessage, " finished in: ", 14)) { pMessage++; Num++; if(!pMessage[0]) return; } // store the name char aName[64]; str_copy(aName, pMsg->m_pMessage, Num+1); // prepare values and state for saving int Minutes; float Seconds; if(!str_comp(aName, m_pClient->m_aClients[m_pClient->m_Snap.m_LocalClientID].m_aName) && sscanf(pMessage, " finished in: %d minute(s) %f", &Minutes, &Seconds) == 2) { m_RaceState = RACE_FINISHED; m_RecordStopTime = Client()->GameTick() + Client()->GameTickSpeed(); m_Time = Minutes*60 + Seconds; } } } }
bool CFileCollection::IsFilenameValid(const char *pFilename) { if(m_aFileDesc[0] == '\0') { int FilenameLength = str_length(pFilename); if(m_FileExtLength+TIMESTAMP_LENGTH > FilenameLength) { return false; } pFilename += FilenameLength-m_FileExtLength-TIMESTAMP_LENGTH; } else { if(str_length(pFilename) != m_FileDescLength+TIMESTAMP_LENGTH+m_FileExtLength || str_comp_num(pFilename, m_aFileDesc, m_FileDescLength) || str_comp(pFilename+m_FileDescLength+TIMESTAMP_LENGTH, m_aFileExt)) return false; pFilename += m_FileDescLength; } if(pFilename[0] == '_' && pFilename[1] >= '0' && pFilename[1] <= '9' && pFilename[2] >= '0' && pFilename[2] <= '9' && pFilename[3] >= '0' && pFilename[3] <= '9' && pFilename[4] >= '0' && pFilename[4] <= '9' && pFilename[5] == '-' && pFilename[6] >= '0' && pFilename[6] <= '9' && pFilename[7] >= '0' && pFilename[7] <= '9' && pFilename[8] == '-' && pFilename[9] >= '0' && pFilename[9] <= '9' && pFilename[10] >= '0' && pFilename[10] <= '9' && pFilename[11] == '_' && pFilename[12] >= '0' && pFilename[12] <= '9' && pFilename[13] >= '0' && pFilename[13] <= '9' && pFilename[14] == '-' && pFilename[15] >= '0' && pFilename[15] <= '9' && pFilename[16] >= '0' && pFilename[16] <= '9' && pFilename[17] == '-' && pFilename[18] >= '0' && pFilename[18] <= '9' && pFilename[19] >= '0' && pFilename[19] <= '9') return true; return false; }
void LoadPaths(const char *pArgv0) { // check current directory IOHANDLE File = io_open("storage.cfg", IOFLAG_READ); if(!File) { // check usable path in argv[0] unsigned int Pos = ~0U; for(unsigned i = 0; pArgv0[i]; i++) if(pArgv0[i] == '/' || pArgv0[i] == '\\') Pos = i; if(Pos < MAX_PATH_LENGTH) { char aBuffer[MAX_PATH_LENGTH]; str_copy(aBuffer, pArgv0, Pos+1); str_append(aBuffer, "/storage.cfg", sizeof(aBuffer)); File = io_open(aBuffer, IOFLAG_READ); } if(Pos >= MAX_PATH_LENGTH || !File) { dbg_msg("storage", "couldn't open storage.cfg"); return; } } char *pLine; CLineReader LineReader; LineReader.Init(File); while((pLine = LineReader.Get())) { if(str_length(pLine) > 9 && !str_comp_num(pLine, "add_path ", 9)) AddPath(pLine+9); } io_close(File); if(!m_NumPaths) dbg_msg("storage", "no paths found in storage.cfg"); }
void CRaceDemo::CheckDemo() { // stop the demo recording Client()->RaceRecordStop(); char aTmpDemoName[128]; str_format(aTmpDemoName, sizeof(aTmpDemoName), "%s_tmp", m_pMap); // loop through demo files m_pClient->m_pMenus->DemolistPopulate(); for(int i = 0; i < m_pClient->m_pMenus->m_lDemos.size(); i++) { if(!str_comp_num(m_pClient->m_pMenus->m_lDemos[i].m_aName, m_pMap, str_length(m_pMap)) && str_comp_num(m_pClient->m_pMenus->m_lDemos[i].m_aName, aTmpDemoName, str_length(aTmpDemoName))) { const char *pDemo = m_pClient->m_pMenus->m_lDemos[i].m_aName; // set cursor pDemo += str_length(m_pMap)+1; float DemoTime = str_tofloat(pDemo); if(m_Time < DemoTime) { // save new record SaveDemo(m_pMap); // delete old demo char aFilename[512]; str_format(aFilename, sizeof(aFilename), "demos/%s.demo", m_pClient->m_pMenus->m_lDemos[i].m_aName); Storage()->RemoveFile(aFilename, IStorage::TYPE_SAVE); } m_Time = 0; return; } } // save demo if there is none SaveDemo(m_pMap); m_Time = 0; }
void IGameController::CycleMap() { if(m_aMapWish[0] != 0) { dbg_msg("game", "rotating map to %s", m_aMapWish); str_copy(g_Config.m_SvMap, m_aMapWish, sizeof(g_Config.m_SvMap)); m_aMapWish[0] = 0; m_RoundCount = 0; return; } if(!str_length(g_Config.m_SvMaprotation)) return; if(m_RoundCount < g_Config.m_SvRoundsPerMap-1) return; // handle maprotation const char *pMapRotation = g_Config.m_SvMaprotation; const char *pCurrentMap = g_Config.m_SvMap; int CurrentMapLen = str_length(pCurrentMap); const char *pNextMap = pMapRotation; while(*pNextMap) { int WordLen = 0; while(pNextMap[WordLen] && !IsSeparator(pNextMap[WordLen])) WordLen++; if(WordLen == CurrentMapLen && str_comp_num(pNextMap, pCurrentMap, CurrentMapLen) == 0) { // map found pNextMap += CurrentMapLen; while(*pNextMap && IsSeparator(*pNextMap)) pNextMap++; break; } pNextMap++; } // restart rotation if(pNextMap[0] == 0) pNextMap = pMapRotation; // cut out the next map char Buf[512]; for(int i = 0; i < 512; i++) { Buf[i] = pNextMap[i]; if(IsSeparator(pNextMap[i]) || pNextMap[i] == 0) { Buf[i] = 0; break; } } // skip spaces int i = 0; while(IsSeparator(Buf[i])) i++; m_RoundCount = 0; dbg_msg("game", "rotating map to %s", &Buf[i]); str_copy(g_Config.m_SvMap, &Buf[i], sizeof(g_Config.m_SvMap)); }
void CServerBrowserFilter::CServerFilter::Filter() { int NumServers = m_pServerBrowserFilter->m_NumServers; m_NumSortedServers = 0; m_NumSortedPlayers = 0; // allocate the sorted list if(m_SortedServersCapacity < NumServers) { if(m_pSortedServerlist) mem_free(m_pSortedServerlist); m_SortedServersCapacity = max(1000, NumServers+NumServers/2); m_pSortedServerlist = (int *)mem_alloc(m_SortedServersCapacity*sizeof(int), 1); } // filter the servers for(int i = 0; i < NumServers; i++) { int Filtered = 0; if(m_SortHash&IServerBrowser::FILTER_EMPTY && ((m_SortHash&IServerBrowser::FILTER_SPECTATORS && m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_NumPlayers == 0) || m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_NumClients == 0)) Filtered = 1; else if(m_SortHash&IServerBrowser::FILTER_FULL && ((m_SortHash&IServerBrowser::FILTER_SPECTATORS && m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_NumPlayers == m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_MaxPlayers) || m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_NumClients == m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_MaxClients)) Filtered = 1; else if(m_SortHash&IServerBrowser::FILTER_PW && m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_Flags&IServerBrowser::FLAG_PASSWORD) Filtered = 1; else if(m_SortHash&IServerBrowser::FILTER_FAVORITE && !m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_Favorite) Filtered = 1; else if(m_SortHash&IServerBrowser::FILTER_PURE && !(m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_Flags&IServerBrowser::FLAG_PURE)) Filtered = 1; else if(m_SortHash&IServerBrowser::FILTER_PURE_MAP && !(m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_Flags&IServerBrowser::FLAG_PUREMAP)) Filtered = 1; else if(m_SortHash&IServerBrowser::FILTER_PING && m_Ping < m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_Latency) Filtered = 1; else if(m_SortHash&IServerBrowser::FILTER_COMPAT_VERSION && str_comp_num(m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_aVersion, m_pServerBrowserFilter->m_aNetVersion, 3) != 0) Filtered = 1; else if(m_aServerAddress[0] && !str_find_nocase(m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_aAddress, m_aServerAddress)) Filtered = 1; else if(m_SortHash&IServerBrowser::FILTER_GAMETYPE_STRICT && m_aGametype[0] && str_comp_nocase(m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_aGameType, m_aGametype)) Filtered = 1; else if(!(m_SortHash&IServerBrowser::FILTER_GAMETYPE_STRICT) && m_aGametype[0] && !str_find_nocase(m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_aGameType, m_aGametype)) Filtered = 1; else { if(m_SortHash&IServerBrowser::FILTER_COUNTRY) { Filtered = 1; // match against player country for(int p = 0; p < m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_NumClients; p++) { if(m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_aClients[p].m_Country == m_Country) { Filtered = 0; break; } } } if(!Filtered && g_Config.m_BrFilterString[0] != 0) { int MatchFound = 0; m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_QuickSearchHit = 0; // match against server name if(str_find_nocase(m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_aName, g_Config.m_BrFilterString)) { MatchFound = 1; m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_SERVERNAME; } // match against players for(int p = 0; p < m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_NumClients; p++) { if(str_find_nocase(m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_aClients[p].m_aName, g_Config.m_BrFilterString) || str_find_nocase(m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_aClients[p].m_aClan, g_Config.m_BrFilterString)) { MatchFound = 1; m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_PLAYER; break; } } // match against map if(str_find_nocase(m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_aMap, g_Config.m_BrFilterString)) { MatchFound = 1; m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_MAPNAME; } if(!MatchFound) Filtered = 1; } } if(Filtered == 0) { // check for friend m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_FriendState = IFriends::FRIEND_NO; for(int p = 0; p < m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_NumClients; p++) { m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_aClients[p].m_FriendState = m_pServerBrowserFilter->m_pFriends->GetFriendState(m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_aClients[p].m_aName, m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_aClients[p].m_aClan); m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_FriendState = max(m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_FriendState, m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_aClients[p].m_FriendState); } if(!(m_SortHash&IServerBrowser::FILTER_FRIENDS) || m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_FriendState != IFriends::FRIEND_NO) { m_pSortedServerlist[m_NumSortedServers++] = i; m_NumSortedPlayers += (m_SortHash&IServerBrowser::FILTER_SPECTATORS) ? m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_NumPlayers : m_pServerBrowserFilter->m_ppServerlist[i]->m_Info.m_NumClients; } } } }
void CGameContext::AbortVoteOnTeamChange(int ClientID) { if(m_VoteCloseTime && ClientID == m_VoteClientID && !str_comp_num(m_aVoteCommand, "set_team ", 9)) m_VoteCloseTime = -1; }
void CServerBrowser::Filter() { if(m_ServerdataLocked) return; int i = 0, p = 0; m_NumSortedServers = 0; // allocate the sorted list if(m_NumSortedServersCapacity < m_NumServers) { if(m_pSortedServerlist) mem_free(m_pSortedServerlist); m_NumSortedServersCapacity = m_NumServers; m_pSortedServerlist = (int *)mem_alloc(m_NumSortedServersCapacity*sizeof(int), 1); } // filter the servers for(i = 0; i < m_NumServers; i++) { int Filtered = 0; if(g_Config.m_BrFilterEmpty && ((g_Config.m_BrFilterSpectators && m_ppServerlist[i]->m_Info.m_NumPlayers == 0) || m_ppServerlist[i]->m_Info.m_NumClients == 0)) Filtered = 1; else if(g_Config.m_BrFilterFull && ((g_Config.m_BrFilterSpectators && m_ppServerlist[i]->m_Info.m_NumPlayers == m_ppServerlist[i]->m_Info.m_MaxPlayers) || m_ppServerlist[i]->m_Info.m_NumClients == m_ppServerlist[i]->m_Info.m_MaxClients)) Filtered = 1; else if(g_Config.m_BrFilterPw && (m_ppServerlist[i]->m_Info.m_Flags&SERVER_FLAG_PASSWORD)) Filtered = 1; else if(g_Config.m_BrFilterPure && (str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "DM") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "TDM") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "CTF") != 0)) { Filtered = 1; } else if(g_Config.m_BrFilterPureMap && !(str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm1") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm2") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm6") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm7") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm8") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm9") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf1") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf2") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf3") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf4") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf5") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf6") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf7") == 0) ) { Filtered = 1; } else if(g_Config.m_BrFilterPing < m_ppServerlist[i]->m_Info.m_Latency) Filtered = 1; else if(g_Config.m_BrFilterCompatversion && str_comp_num(m_ppServerlist[i]->m_Info.m_aVersion, m_aNetVersion, 3) != 0) Filtered = 1; else if(g_Config.m_BrFilterServerAddress[0] && !str_find_nocase(m_ppServerlist[i]->m_Info.m_aAddress, g_Config.m_BrFilterServerAddress)) Filtered = 1; else if(g_Config.m_BrFilterGametypeStrict && g_Config.m_BrFilterGametype[0] && str_comp_nocase(m_ppServerlist[i]->m_Info.m_aGameType, g_Config.m_BrFilterGametype)) Filtered = 1; else if(!g_Config.m_BrFilterGametypeStrict && g_Config.m_BrFilterGametype[0] && !str_find_nocase(m_ppServerlist[i]->m_Info.m_aGameType, g_Config.m_BrFilterGametype)) Filtered = 1; else if(g_Config.m_BrFilterVersionStrict && g_Config.m_BrFilterVersion[0] && str_comp_nocase(m_ppServerlist[i]->m_Info.m_aVersion, g_Config.m_BrFilterVersion)) Filtered = 1; else if(!g_Config.m_BrFilterVersionStrict && g_Config.m_BrFilterVersion[0] && !str_find_nocase(m_ppServerlist[i]->m_Info.m_aVersion, g_Config.m_BrFilterVersion)) Filtered = 1; else if(g_Config.m_BrShowDDNet && g_Config.m_UiPage != CMenus::PAGE_DDNET && g_Config.m_UiPage != CMenus::PAGE_FAVORITES && str_find_nocase(m_ppServerlist[i]->m_Info.m_aName, "[DDRaceNetwork]")) Filtered = 1; else { if(g_Config.m_BrFilterCountry) { Filtered = 1; // match against player country for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumClients; p++) { if(m_ppServerlist[i]->m_Info.m_aClients[p].m_Country == g_Config.m_BrFilterCountryIndex) { Filtered = 0; break; } } } if(!Filtered && g_Config.m_BrFilterString[0] != 0) { int MatchFound = 0; m_ppServerlist[i]->m_Info.m_QuickSearchHit = 0; // match against server name if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aName, g_Config.m_BrFilterString)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_SERVERNAME; } // match against players for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumClients; p++) { if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aClients[p].m_aName, g_Config.m_BrFilterString) || str_find_nocase(m_ppServerlist[i]->m_Info.m_aClients[p].m_aClan, g_Config.m_BrFilterString)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_PLAYER; break; } } // match against map if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aMap, g_Config.m_BrFilterString)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_MAPNAME; } if(!MatchFound) Filtered = 1; } if(!Filtered && g_Config.m_BrExcludeString[0] != 0) { int MatchFound = 0; // match against server name if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aName, g_Config.m_BrExcludeString)) { MatchFound = 1; } // match against map if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aMap, g_Config.m_BrExcludeString)) { MatchFound = 1; } if(MatchFound) Filtered = 1; } } if(Filtered == 0) { // check for friend m_ppServerlist[i]->m_Info.m_FriendState = IFriends::FRIEND_NO; for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumClients; p++) { m_ppServerlist[i]->m_Info.m_aClients[p].m_FriendState = m_pFriends->GetFriendState(m_ppServerlist[i]->m_Info.m_aClients[p].m_aName, m_ppServerlist[i]->m_Info.m_aClients[p].m_aClan); m_ppServerlist[i]->m_Info.m_FriendState = max(m_ppServerlist[i]->m_Info.m_FriendState, m_ppServerlist[i]->m_Info.m_aClients[p].m_FriendState); } if(!g_Config.m_BrFilterFriends || m_ppServerlist[i]->m_Info.m_FriendState != IFriends::FRIEND_NO) m_pSortedServerlist[m_NumSortedServers++] = i; } } }
void CAutoMapper::Load(const char* pTileName) { char aPath[256]; str_format(aPath, sizeof(aPath), "editor/%s.rules", pTileName); IOHANDLE RulesFile = m_pEditor->Storage()->OpenFile(aPath, IOFLAG_READ, IStorage::TYPE_ALL); if(!RulesFile) return; CLineReader LineReader; LineReader.Init(RulesFile); CConfiguration *pCurrentConf = 0; CRun *pCurrentRun = 0; CIndexRule *pCurrentIndex = 0; char aBuf[256]; // read each line while(char *pLine = LineReader.Get()) { // skip blank/empty lines as well as comments if(str_length(pLine) > 0 && pLine[0] != '#' && pLine[0] != '\n' && pLine[0] != '\r' && pLine[0] != '\t' && pLine[0] != '\v' && pLine[0] != ' ') { if(pLine[0]== '[') { // new configuration, get the name pLine++; CConfiguration NewConf; NewConf.m_StartX = 0; NewConf.m_StartY = 0; NewConf.m_EndX = 0; NewConf.m_EndY = 0; int ConfigurationID = m_lConfigs.add(NewConf); pCurrentConf = &m_lConfigs[ConfigurationID]; str_copy(pCurrentConf->m_aName, pLine, str_length(pLine)); // add start run CRun NewRun; NewRun.m_AutomapCopy = true; int RunID = pCurrentConf->m_aRuns.add(NewRun); pCurrentRun = &pCurrentConf->m_aRuns[RunID]; } else if(str_startswith(pLine, "NewRun")) { // add new run CRun NewRun; NewRun.m_AutomapCopy = true; int RunID = pCurrentConf->m_aRuns.add(NewRun); pCurrentRun = &pCurrentConf->m_aRuns[RunID]; } else if(str_startswith(pLine, "Index") && pCurrentRun) { // new index int ID = 0; char aOrientation1[128] = ""; char aOrientation2[128] = ""; char aOrientation3[128] = ""; sscanf(pLine, "Index %d %127s %127s %127s", &ID, aOrientation1, aOrientation2, aOrientation3); CIndexRule NewIndexRule; NewIndexRule.m_ID = ID; NewIndexRule.m_Flag = 0; NewIndexRule.m_RandomProbability = 1.0; NewIndexRule.m_DefaultRule = true; NewIndexRule.m_SkipEmpty = false; NewIndexRule.m_SkipFull = false; if(str_length(aOrientation1) > 0) { if(!str_comp(aOrientation1, "XFLIP")) NewIndexRule.m_Flag |= TILEFLAG_VFLIP; else if(!str_comp(aOrientation1, "YFLIP")) NewIndexRule.m_Flag |= TILEFLAG_HFLIP; else if(!str_comp(aOrientation1, "ROTATE")) NewIndexRule.m_Flag |= TILEFLAG_ROTATE; } if(str_length(aOrientation2) > 0) { if(!str_comp(aOrientation2, "XFLIP")) NewIndexRule.m_Flag |= TILEFLAG_VFLIP; else if(!str_comp(aOrientation2, "YFLIP")) NewIndexRule.m_Flag |= TILEFLAG_HFLIP; else if(!str_comp(aOrientation2, "ROTATE")) NewIndexRule.m_Flag |= TILEFLAG_ROTATE; } if(str_length(aOrientation3) > 0) { if(!str_comp(aOrientation3, "XFLIP")) NewIndexRule.m_Flag |= TILEFLAG_VFLIP; else if(!str_comp(aOrientation3, "YFLIP")) NewIndexRule.m_Flag |= TILEFLAG_HFLIP; else if(!str_comp(aOrientation3, "ROTATE")) NewIndexRule.m_Flag |= TILEFLAG_ROTATE; } // add the index rule object and make it current int IndexRuleID = pCurrentRun->m_aIndexRules.add(NewIndexRule); pCurrentIndex = &pCurrentRun->m_aIndexRules[IndexRuleID]; } else if(str_startswith(pLine, "Pos") && pCurrentIndex) { int x = 0, y = 0; char aValue[128]; int Value = CPosRule::NORULE; array<CIndexInfo> NewIndexList; sscanf(pLine, "Pos %d %d %127s", &x, &y, aValue); if(!str_comp(aValue, "EMPTY")) { Value = CPosRule::INDEX; CIndexInfo NewIndexInfo = {0, 0, false}; NewIndexList.add(NewIndexInfo); } else if(!str_comp(aValue, "FULL")) { Value = CPosRule::NOTINDEX; CIndexInfo NewIndexInfo1 = {0, 0, false}; //CIndexInfo NewIndexInfo2 = {-1, 0}; NewIndexList.add(NewIndexInfo1); //NewIndexList.add(NewIndexInfo2); } else if(!str_comp(aValue, "INDEX") || !str_comp(aValue, "NOTINDEX")) { if(!str_comp(aValue, "INDEX")) Value = CPosRule::INDEX; else Value = CPosRule::NOTINDEX; int pWord = 4; while(true) { int ID = 0; char aOrientation1[128] = ""; char aOrientation2[128] = ""; char aOrientation3[128] = ""; char aOrientation4[128] = ""; sscanf(str_trim_words(pLine, pWord), "%d %127s %127s %127s %127s", &ID, aOrientation1, aOrientation2, aOrientation3, aOrientation4); CIndexInfo NewIndexInfo; NewIndexInfo.m_ID = ID; NewIndexInfo.m_Flag = 0; NewIndexInfo.m_TestFlag = false; if(!str_comp(aOrientation1, "OR")) { NewIndexList.add(NewIndexInfo); pWord += 2; continue; } else if(str_length(aOrientation1) > 0) { NewIndexInfo.m_TestFlag = true; if(!str_comp(aOrientation1, "XFLIP")) NewIndexInfo.m_Flag = TILEFLAG_VFLIP; else if(!str_comp(aOrientation1, "YFLIP")) NewIndexInfo.m_Flag = TILEFLAG_HFLIP; else if(!str_comp(aOrientation1, "ROTATE")) NewIndexInfo.m_Flag = TILEFLAG_ROTATE; else if(!str_comp(aOrientation1, "NONE")) NewIndexInfo.m_Flag = 0; else NewIndexInfo.m_TestFlag = false; } else { NewIndexList.add(NewIndexInfo); break; } if(!str_comp(aOrientation2, "OR")) { NewIndexList.add(NewIndexInfo); pWord += 3; continue; } else if(str_length(aOrientation2) > 0 && NewIndexInfo.m_Flag != 0) { if(!str_comp(aOrientation2, "XFLIP")) NewIndexInfo.m_Flag |= TILEFLAG_VFLIP; else if(!str_comp(aOrientation2, "YFLIP")) NewIndexInfo.m_Flag |= TILEFLAG_HFLIP; else if(!str_comp(aOrientation2, "ROTATE")) NewIndexInfo.m_Flag |= TILEFLAG_ROTATE; } else { NewIndexList.add(NewIndexInfo); break; } if(!str_comp(aOrientation3, "OR")) { NewIndexList.add(NewIndexInfo); pWord += 4; continue; } else if(str_length(aOrientation3) > 0 && NewIndexInfo.m_Flag != 0) { if(!str_comp(aOrientation3, "XFLIP")) NewIndexInfo.m_Flag |= TILEFLAG_VFLIP; else if(!str_comp(aOrientation3, "YFLIP")) NewIndexInfo.m_Flag |= TILEFLAG_HFLIP; else if(!str_comp(aOrientation3, "ROTATE")) NewIndexInfo.m_Flag |= TILEFLAG_ROTATE; } else { NewIndexList.add(NewIndexInfo); break; } if(!str_comp(aOrientation4, "OR")) { NewIndexList.add(NewIndexInfo); pWord += 5; continue; } else { NewIndexList.add(NewIndexInfo); break; } } } if(Value != CPosRule::NORULE) { CPosRule NewPosRule = {x, y, Value, NewIndexList}; pCurrentIndex->m_aRules.add(NewPosRule); pCurrentConf->m_StartX = min(pCurrentConf->m_StartX, NewPosRule.m_X); pCurrentConf->m_StartY = min(pCurrentConf->m_StartY, NewPosRule.m_Y); pCurrentConf->m_EndX = max(pCurrentConf->m_EndX, NewPosRule.m_X); pCurrentConf->m_EndY = max(pCurrentConf->m_EndY, NewPosRule.m_Y); if(x == 0 && y == 0) { for(int i = 0; i < NewIndexList.size(); ++i) { if(Value == CPosRule::INDEX && NewIndexList[i].m_ID == 0) pCurrentIndex->m_SkipFull = true; else pCurrentIndex->m_SkipEmpty = true; } } } } else if(str_startswith(pLine, "Random") && pCurrentIndex) { float Value; char Specifier = ' '; sscanf(pLine, "Random %f%c", &Value, &Specifier); if(Specifier == '%') { pCurrentIndex->m_RandomProbability = Value / 100.0; } else { pCurrentIndex->m_RandomProbability = 1.0 / Value; } } else if(str_startswith(pLine, "NoDefaultRule") && pCurrentIndex) { pCurrentIndex->m_DefaultRule = false; } else if(!str_comp_num(pLine, "NoLayerCopy", 11) && pCurrentRun) { pCurrentRun->m_AutomapCopy = false; } } } // add default rule for Pos 0 0 if there is none for (int g = 0; g < m_lConfigs.size(); ++g) { for (int h = 0; h < m_lConfigs[g].m_aRuns.size(); ++h) { for(int i = 0; i < m_lConfigs[g].m_aRuns[h].m_aIndexRules.size(); ++i) { CIndexRule *pIndexRule = &m_lConfigs[g].m_aRuns[h].m_aIndexRules[i]; bool Found = false; for(int j = 0; j < pIndexRule->m_aRules.size(); ++j) { CPosRule *pRule = &pIndexRule->m_aRules[j]; if(pRule && pRule->m_X == 0 && pRule->m_Y == 0) { Found = true; break; } } if(!Found && pIndexRule->m_DefaultRule) { array<CIndexInfo> NewIndexList; CIndexInfo NewIndexInfo = {0, 0, false}; NewIndexList.add(NewIndexInfo); CPosRule NewPosRule = {0, 0, CPosRule::NOTINDEX, NewIndexList}; pIndexRule->m_aRules.add(NewPosRule); pIndexRule->m_SkipEmpty = true; pIndexRule->m_SkipFull = false; } if(pIndexRule->m_SkipEmpty && pIndexRule->m_SkipFull) { pIndexRule->m_SkipFull = false; } } } } io_close(RulesFile); str_format(aBuf, sizeof(aBuf),"loaded %s", aPath); m_pEditor->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "editor", aBuf); m_FileLoaded = true; }
void CServerBrowser::Filter() { int i = 0, p = 0; m_NumSortedServers = 0; // allocate the sorted list if(m_NumSortedServersCapacity < m_NumServers) { if(m_pSortedServerlist) mem_free(m_pSortedServerlist); m_NumSortedServersCapacity = m_NumServers; m_pSortedServerlist = (int *)mem_alloc(m_NumSortedServersCapacity*sizeof(int), 1); } // filter the servers for(i = 0; i < m_NumServers; i++) { int Filtered = 0; if(g_Config.m_BrFilterEmpty && ((g_Config.m_BrFilterSpectators && m_ppServerlist[i]->m_Info.m_NumPlayers == 0) || m_ppServerlist[i]->m_Info.m_NumClients == 0)) Filtered = 1; else if(g_Config.m_BrFilterFull && ((g_Config.m_BrFilterSpectators && m_ppServerlist[i]->m_Info.m_NumPlayers == m_ppServerlist[i]->m_Info.m_MaxPlayers) || m_ppServerlist[i]->m_Info.m_NumClients == m_ppServerlist[i]->m_Info.m_MaxClients)) Filtered = 1; else if(g_Config.m_BrFilterPw && m_ppServerlist[i]->m_Info.m_Flags&SERVER_FLAG_PASSWORD) Filtered = 1; else if(g_Config.m_BrFilterPure && (str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "DM") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "TDM") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "BALL") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "DEF") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "INF") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "INV") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "GUN") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "CTF") != 0)) { Filtered = 1; } else if(g_Config.m_BrFilterPureMap && !(str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm1") == 0) && !(str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm2") == 0) && !(str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm2") == 0) && !(str_comp(m_ppServerlist[i]->m_Info.m_aMap, "grinder") == 0) && !(str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf1") == 0) ) { // don't skip non-standard maps for a while, ever //Filtered = 1; } else if(g_Config.m_BrFilterPing < m_ppServerlist[i]->m_Info.m_Latency) Filtered = 1; else if(g_Config.m_BrFilterCompatversion && str_comp_num(m_ppServerlist[i]->m_Info.m_aVersion, m_aNetVersion, 3) != 0) Filtered = 1; else if(g_Config.m_BrFilterServerAddress[0] && !str_find_nocase(m_ppServerlist[i]->m_Info.m_aAddress, g_Config.m_BrFilterServerAddress)) Filtered = 1; else if(g_Config.m_BrFilterGametypeStrict && g_Config.m_BrFilterGametype[0] && str_comp_nocase(m_ppServerlist[i]->m_Info.m_aGameType, g_Config.m_BrFilterGametype)) Filtered = 1; else if(!g_Config.m_BrFilterGametypeStrict && g_Config.m_BrFilterGametype[0] && !str_find_nocase(m_ppServerlist[i]->m_Info.m_aGameType, g_Config.m_BrFilterGametype)) Filtered = 1; else { if(g_Config.m_BrFilterCountry) { Filtered = 1; // match against player country for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumClients; p++) { if(m_ppServerlist[i]->m_Info.m_aClients[p].m_Country == g_Config.m_BrFilterCountryIndex) { Filtered = 0; break; } } } if(!Filtered && g_Config.m_BrFilterString[0] != 0) { int MatchFound = 0; m_ppServerlist[i]->m_Info.m_QuickSearchHit = 0; // match against server name if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aName, g_Config.m_BrFilterString)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_SERVERNAME; } // match against players for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumClients; p++) { if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aClients[p].m_aName, g_Config.m_BrFilterString) || str_find_nocase(m_ppServerlist[i]->m_Info.m_aClients[p].m_aClan, g_Config.m_BrFilterString)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_PLAYER; break; } } // match against map if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aMap, g_Config.m_BrFilterString)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_MAPNAME; } if(!MatchFound) Filtered = 1; } } if(Filtered == 0) { // check for friend m_ppServerlist[i]->m_Info.m_FriendState = IFriends::FRIEND_NO; for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumClients; p++) { m_ppServerlist[i]->m_Info.m_aClients[p].m_FriendState = m_pFriends->GetFriendState(m_ppServerlist[i]->m_Info.m_aClients[p].m_aName, m_ppServerlist[i]->m_Info.m_aClients[p].m_aClan); m_ppServerlist[i]->m_Info.m_FriendState = max(m_ppServerlist[i]->m_Info.m_FriendState, m_ppServerlist[i]->m_Info.m_aClients[p].m_FriendState); } if(!g_Config.m_BrFilterFriends || m_ppServerlist[i]->m_Info.m_FriendState != IFriends::FRIEND_NO) m_pSortedServerlist[m_NumSortedServers++] = i; } } }
void CAutoMapper::Load(const char* pTileName) { char aPath[256]; str_format(aPath, sizeof(aPath), "editor/%s.rules", pTileName); IOHANDLE RulesFile = m_pEditor->Storage()->OpenFile(aPath, IOFLAG_READ, IStorageTW::TYPE_ALL); if(!RulesFile) return; CLineReader LineReader; LineReader.Init(RulesFile); CConfiguration *pCurrentConf = 0; CIndexRule *pCurrentIndex = 0; char aBuf[256]; // read each line while(char *pLine = LineReader.Get()) { // skip blank/empty lines as well as comments if(str_length(pLine) > 0 && pLine[0] != '#' && pLine[0] != '\n' && pLine[0] != '\r' && pLine[0] != '\t' && pLine[0] != '\v' && pLine[0] != ' ') { if(pLine[0]== '[') { // new configuration, get the name pLine++; CConfiguration NewConf; int ID = m_lConfigs.add(NewConf); pCurrentConf = &m_lConfigs[ID]; str_copy(pCurrentConf->m_aName, pLine, str_length(pLine)); } else { if(!str_comp_num(pLine, "Index", 5)) { // new index int ID = 0; char aFlip[128] = ""; sscanf(pLine, "Index %d %127s", &ID, aFlip); CIndexRule NewIndexRule; NewIndexRule.m_ID = ID; NewIndexRule.m_Flag = 0; NewIndexRule.m_RandomValue = 0; NewIndexRule.m_BaseTile = false; if(str_length(aFlip) > 0) { if(!str_comp(aFlip, "XFLIP")) NewIndexRule.m_Flag = TILEFLAG_VFLIP; else if(!str_comp(aFlip, "YFLIP")) NewIndexRule.m_Flag = TILEFLAG_HFLIP; } // add the index rule object and make it current int ArrayID = pCurrentConf->m_aIndexRules.add(NewIndexRule); pCurrentIndex = &pCurrentConf->m_aIndexRules[ArrayID]; } else if(!str_comp_num(pLine, "BaseTile", 8) && pCurrentIndex) { pCurrentIndex->m_BaseTile = true; } else if(!str_comp_num(pLine, "Pos", 3) && pCurrentIndex) { int x = 0, y = 0; char aValue[128]; int Value = CPosRule::EMPTY; bool IndexValue = false; sscanf(pLine, "Pos %d %d %127s", &x, &y, aValue); if(!str_comp(aValue, "FULL")) Value = CPosRule::FULL; else if(!str_comp_num(aValue, "INDEX", 5)) { sscanf(pLine, "Pos %*d %*d INDEX %d", &Value); IndexValue = true; } CPosRule NewPosRule = {x, y, Value, IndexValue}; pCurrentIndex->m_aRules.add(NewPosRule); } else if(!str_comp_num(pLine, "Random", 6) && pCurrentIndex) { sscanf(pLine, "Random %d", &pCurrentIndex->m_RandomValue); } } } } io_close(RulesFile); str_format(aBuf, sizeof(aBuf),"loaded %s", aPath); m_pEditor->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "editor", aBuf); m_FileLoaded = true; }
int CMain::HandleMessage(int ClientNetID, char *pMessage) { CClient *pClient = ClientNet(ClientNetID); if(!pClient) return true; if(str_comp_num(pMessage, "update", sizeof("update")-1) == 0) { char *pData = str_skip_whitespaces(&pMessage[sizeof("update")-1]); // parse json data json_settings JsonSettings; mem_zero(&JsonSettings, sizeof(JsonSettings)); char aError[256]; json_value *pJsonData = json_parse_ex(&JsonSettings, pData, strlen(pData), aError); if(!pJsonData) { dbg_msg("main", "JSON Error: %s", aError); if(pClient->m_Stats.m_Pong) m_Server.Network()->Send(ClientNetID, "1"); return 1; } // extract data const json_value &rStart = (*pJsonData); if(rStart["uptime"].type) pClient->m_Stats.m_Uptime = rStart["uptime"].u.integer; if(rStart["load"].type) pClient->m_Stats.m_Load = rStart["load"].u.dbl; if(rStart["network_rx"].type) pClient->m_Stats.m_NetworkRx = rStart["network_rx"].u.integer; if(rStart["network_tx"].type) pClient->m_Stats.m_NetworkTx = rStart["network_tx"].u.integer; if(rStart["memory_total"].type) pClient->m_Stats.m_MemTotal = rStart["memory_total"].u.integer; if(rStart["memory_used"].type) pClient->m_Stats.m_MemUsed = rStart["memory_used"].u.integer; if(rStart["hdd_total"].type) pClient->m_Stats.m_HDDTotal = rStart["hdd_total"].u.integer; if(rStart["hdd_used"].type) pClient->m_Stats.m_HDDUsed = rStart["hdd_used"].u.integer; if(rStart["cpu"].type) pClient->m_Stats.m_CPU = rStart["cpu"].u.dbl; if(rStart["online4"].type && pClient->m_ClientNetType == NETTYPE_IPV6) pClient->m_Stats.m_Online4 = rStart["online4"].u.boolean; if(rStart["online6"].type && pClient->m_ClientNetType == NETTYPE_IPV4) pClient->m_Stats.m_Online6 = rStart["online6"].u.boolean; if(m_Config.m_Verbose) { if(rStart["online4"].type) dbg_msg("main", "Online4: %s\nUptime: %" PRId64 "\nLoad: %lf\nNetworkRx: %" PRId64 "\nNetworkTx: %" PRId64 "\nMemTotal: %" PRId64 "\nMemUsed: %" PRId64 "\nHDDTotal: %" PRId64 "\nHDDUsed: %" PRId64 "\nCPU: %lf\n", rStart["online4"].u.boolean ? "true" : "false", pClient->m_Stats.m_Uptime, pClient->m_Stats.m_Load, pClient->m_Stats.m_NetworkRx, pClient->m_Stats.m_NetworkTx, pClient->m_Stats.m_MemTotal, pClient->m_Stats.m_MemUsed, pClient->m_Stats.m_HDDTotal, pClient->m_Stats.m_HDDUsed, pClient->m_Stats.m_CPU); else if(rStart["online6"].type) dbg_msg("main", "Online6: %s\nUptime: %" PRId64 "\nLoad: %lf\nNetworkRx: %" PRId64 "\nNetworkTx: %" PRId64 "\nMemTotal: %" PRId64 "\nMemUsed: %" PRId64 "\nHDDTotal: %" PRId64 "\nHDDUsed: %" PRId64 "\nCPU: %lf\n", rStart["online6"].u.boolean ? "true" : "false", pClient->m_Stats.m_Uptime, pClient->m_Stats.m_Load, pClient->m_Stats.m_NetworkRx, pClient->m_Stats.m_NetworkTx, pClient->m_Stats.m_MemTotal, pClient->m_Stats.m_MemUsed, pClient->m_Stats.m_HDDTotal, pClient->m_Stats.m_HDDUsed, pClient->m_Stats.m_CPU); else dbg_msg("main", "Uptime: %" PRId64 "\nLoad: %lf\nNetworkRx: %" PRId64 "\nNetworkTx: %" PRId64 "\nMemTotal: %" PRId64 "\nMemUsed: %" PRId64 "\nHDDTotal: %" PRId64 "\nHDDUsed: %" PRId64 "\nCPU: %lf\n", pClient->m_Stats.m_Uptime, pClient->m_Stats.m_Load, pClient->m_Stats.m_NetworkRx, pClient->m_Stats.m_NetworkTx, pClient->m_Stats.m_MemTotal, pClient->m_Stats.m_MemUsed, pClient->m_Stats.m_HDDTotal, pClient->m_Stats.m_HDDUsed, pClient->m_Stats.m_CPU); } // clean up json_value_free(pJsonData); if(pClient->m_Stats.m_Pong) m_Server.Network()->Send(ClientNetID, "0"); return 0; } else if(str_comp_num(pMessage, "pong", sizeof("pong")-1) == 0) { char *pData = str_skip_whitespaces(&pMessage[sizeof("pong")-1]); if(!str_comp(pData, "0") || !str_comp(pData, "off")) pClient->m_Stats.m_Pong = false; else if(!str_comp(pData, "1") || !str_comp(pData, "on")) pClient->m_Stats.m_Pong = true; return 0; } if(pClient->m_Stats.m_Pong) m_Server.Network()->Send(ClientNetID, "1"); return 1; }
void CServerBrowser::Filter() { int i = 0, p = 0; m_NumSortedServers = 0; // allocate the sorted list if(m_NumSortedServersCapacity < m_NumServers) { if(m_pSortedServerlist) mem_free(m_pSortedServerlist); m_NumSortedServersCapacity = m_NumServers; m_pSortedServerlist = (int *)mem_alloc(m_NumSortedServersCapacity*sizeof(int), 1); } // filter the servers // clear the friendlist online state m_pFriends->ClearOnlineState(); for(i = 0; i < m_NumServers; i++) { //Change the friend online state for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumClients; p++) { m_pFriends->SetOnline(m_ppServerlist[i]->m_Info.m_aClients[p].m_aName, m_ppServerlist[i]->m_Info.m_aClients[p].m_aClan, m_ppServerlist[i]->m_Addr); } int Filtered = 0; if(g_Config.m_BrFilterFriends) { Filtered = 1; for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumClients; p++) { if(m_pFriends->IsFriend(m_ppServerlist[i]->m_Info.m_aClients[p].m_aName, m_ppServerlist[i]->m_Info.m_aClients[p].m_aClan, false)) { Filtered = 0; break; } } } else { if(g_Config.m_BrFilterEmpty && ((g_Config.m_BrFilterSpectators && m_ppServerlist[i]->m_Info.m_NumPlayers == 0) || m_ppServerlist[i]->m_Info.m_NumClients == 0)) Filtered = 1; else if(g_Config.m_BrFilterFull && ((g_Config.m_BrFilterSpectators && m_ppServerlist[i]->m_Info.m_NumPlayers == m_ppServerlist[i]->m_Info.m_MaxPlayers) || m_ppServerlist[i]->m_Info.m_NumClients == m_ppServerlist[i]->m_Info.m_MaxClients)) Filtered = 1; else if(g_Config.m_BrFilterPw && m_ppServerlist[i]->m_Info.m_Flags&SERVER_FLAG_PASSWORD) Filtered = 1; else if(g_Config.m_BrFilterPure && (str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "DM") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "TDM") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "CTF") != 0)) { Filtered = 1; } else if(g_Config.m_BrFilterPureMap && !(str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm1") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm2") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm6") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm7") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm8") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm9") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf1") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf2") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf3") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf4") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf5") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf6") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf7") == 0) ) { Filtered = 1; } else if(g_Config.m_BrFilterPing < m_ppServerlist[i]->m_Info.m_Latency) Filtered = 1; else if(g_Config.m_BrFilterCompatversion && str_comp_num(m_ppServerlist[i]->m_Info.m_aVersion, m_aNetVersion, 3) != 0) Filtered = 1; else if(g_Config.m_BrFilterServerAddress[0] && !str_find_nocase(m_ppServerlist[i]->m_Info.m_aAddress, g_Config.m_BrFilterServerAddress)) Filtered = 1; else if(g_Config.m_BrFilterGametypeStrict && g_Config.m_BrFilterGametype[0] && str_comp_nocase(m_ppServerlist[i]->m_Info.m_aGameType, g_Config.m_BrFilterGametype)) Filtered = 1; else if(!g_Config.m_BrFilterGametypeStrict && g_Config.m_BrFilterGametype[0] && !str_find_nocase(m_ppServerlist[i]->m_Info.m_aGameType, g_Config.m_BrFilterGametype)) Filtered = 1; else { if(g_Config.m_BrFilterCountry) { int MatchFound = 0; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_SERVERNAME; // match against player country for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumClients; p++) { if(m_ppServerlist[i]->m_Info.m_aClients[p].m_Country == g_Config.m_BrFilterCountryIndex) { MatchFound = 1; } } if (!MatchFound) Filtered = 1; } if (g_Config.m_BrFilterString[0] != 0) //multi filter { char aBrFilterStringPart[512]; int BrFilterStringLastIndex = 0; str_copy(aBrFilterStringPart, g_Config.m_BrFilterString, sizeof(aBrFilterStringPart)); for (int iFilter = 0; iFilter <= str_length(g_Config.m_BrFilterString); iFilter++) { if (g_Config.m_BrFilterString[iFilter] == 32 || g_Config.m_BrFilterString[iFilter] == 0) { int MatchFound = 0; if (sizeof(aBrFilterStringPart) > iFilter - BrFilterStringLastIndex) str_copy(aBrFilterStringPart, g_Config.m_BrFilterString + BrFilterStringLastIndex, iFilter - BrFilterStringLastIndex + 1); else str_copy(aBrFilterStringPart, g_Config.m_BrFilterString + BrFilterStringLastIndex, sizeof(aBrFilterStringPart)); BrFilterStringLastIndex = iFilter + 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit = 0; // match against server name if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aName, aBrFilterStringPart)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_SERVERNAME; } // match against players for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumClients; p++) { if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aClients[p].m_aName, aBrFilterStringPart)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_PLAYER; break; } } // match against map if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aMap, aBrFilterStringPart)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_MAPNAME; } if(!MatchFound) Filtered = 1; } } } } } if(Filtered == 0) m_pSortedServerlist[m_NumSortedServers++] = i; } }
int CSkins::SkinScan(const char *pName, int IsDir, int DirType, void *pUser) { CALLSTACK_ADD(); int l = str_length(pName); if(l < 4 || IsDir || str_comp(pName+l-4, ".png") != 0) return 0; CSkin Skin; Skin.m_IsVanilla = false; for(unsigned int i = 0; i < sizeof(vanillaSkins) / sizeof(vanillaSkins[0]); i++) { if(str_comp(pName, vanillaSkins[i]) == 0) { Skin.m_IsVanilla = true; break; } } if(g_Config.m_ClVanillaSkinsOnly && !Skin.m_IsVanilla) return 0; IStorageTW::CLoadHelper<CSkins> *pLoadHelper = (IStorageTW::CLoadHelper<CSkins> *)pUser; CSkins *pSelf = pLoadHelper->pSelf; // Don't add duplicate skins (one from user's config directory, other from // client itself) for(int i = 0; i < pSelf->Num(); i++) { const char* pExName = pSelf->Get(i)->m_aName; if(str_comp_num(pExName, pName, l-4) == 0 && str_length(pExName) == l-4) return 0; } char aBuf[512]; str_format(aBuf, sizeof(aBuf), "%s/%s", pLoadHelper->pFullDir, pName); CImageInfo Info; if(!pSelf->Graphics()->LoadPNG(&Info, aBuf, DirType)) { pSelf->Console()->Printf(IConsole::OUTPUT_LEVEL_ADDINFO, "game", "failed to load skin from %s", aBuf); return 0; } Skin.m_OrgTexture = pSelf->Graphics()->LoadTextureRaw(Info.m_Width, Info.m_Height, Info.m_Format, Info.m_pData, Info.m_Format, 0); int BodySize = 96; // body size if (BodySize > Info.m_Height) return 0; unsigned char *d = (unsigned char *)Info.m_pData; int Pitch = Info.m_Width*4; // dig out blood color { int aColors[3] = {0}; for(int y = 0; y < BodySize; y++) for(int x = 0; x < BodySize; x++) { if(d[y*Pitch+x*4+3] > 128) { aColors[0] += d[y*Pitch+x*4+0]; aColors[1] += d[y*Pitch+x*4+1]; aColors[2] += d[y*Pitch+x*4+2]; } } Skin.m_BloodColor = normalize(vec3(aColors[0], aColors[1], aColors[2])); } // create colorless version int Step = Info.m_Format == CImageInfo::FORMAT_RGBA ? 4 : 3; // make the texture gray scale for(int i = 0; i < Info.m_Width*Info.m_Height; i++) { int v = (d[i*Step]+d[i*Step+1]+d[i*Step+2])/3; d[i*Step] = v; d[i*Step+1] = v; d[i*Step+2] = v; } int Freq[256] = {0}; int OrgWeight = 0; int NewWeight = 192; // find most common frequence for(int y = 0; y < BodySize; y++) for(int x = 0; x < BodySize; x++) { if(d[y*Pitch+x*4+3] > 128) Freq[d[y*Pitch+x*4]]++; } for(int i = 1; i < 256; i++) { if(Freq[OrgWeight] < Freq[i]) OrgWeight = i; } // reorder int InvOrgWeight = 255-OrgWeight; int InvNewWeight = 255-NewWeight; for(int y = 0; y < BodySize; y++) for(int x = 0; x < BodySize; x++) { int v = d[y*Pitch+x*4]; if(v <= OrgWeight) v = (int)(((v/(float)OrgWeight) * NewWeight)); else v = (int)(((v-OrgWeight)/(float)InvOrgWeight)*InvNewWeight + NewWeight); d[y*Pitch+x*4] = v; d[y*Pitch+x*4+1] = v; d[y*Pitch+x*4+2] = v; } Skin.m_ColorTexture = pSelf->Graphics()->LoadTextureRaw(Info.m_Width, Info.m_Height, Info.m_Format, Info.m_pData, Info.m_Format, 0); mem_free(Info.m_pData); // set skin data str_copy(Skin.m_aName, pName, min((int)sizeof(Skin.m_aName),l-3)); pSelf->m_aSkins.add(Skin); if(g_Config.m_Debug) pSelf->Console()->Printf(IConsole::OUTPUT_LEVEL_ADDINFO, "game", "loaded skin '%s'", Skin.m_aName); return 0; }
void CServerBrowser::Filter() { int i = 0, p = 0; m_NumSortedServers = 0; // allocate the sorted list if(m_NumSortedServersCapacity < m_NumServers) { if(m_pSortedServerlist) mem_free(m_pSortedServerlist); m_NumSortedServersCapacity = m_NumServers; m_pSortedServerlist = (int *)mem_alloc(m_NumSortedServersCapacity*sizeof(int), 1); } // filter the servers for(i = 0; i < m_NumServers; i++) { int Filtered = 0; if(g_Config.m_BrFilterEmpty && m_ppServerlist[i]->m_Info.m_NumPlayers == 0) Filtered = 1; else if(g_Config.m_BrFilterFull && m_ppServerlist[i]->m_Info.m_NumPlayers == m_ppServerlist[i]->m_Info.m_MaxPlayers) Filtered = 1; else if(g_Config.m_BrFilterPw && m_ppServerlist[i]->m_Info.m_Flags&SERVER_FLAG_PASSWORD) Filtered = 1; else if(g_Config.m_BrFilterPure && (str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "DM") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "TDM") != 0 && str_comp(m_ppServerlist[i]->m_Info.m_aGameType, "CTF") != 0)) { Filtered = 1; } else if(g_Config.m_BrFilterPureMap && !(str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm1") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm2") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm6") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm7") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm8") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "dm9") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf1") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf2") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf3") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf4") == 0 || str_comp(m_ppServerlist[i]->m_Info.m_aMap, "ctf5") == 0) ) { Filtered = 1; } else if(g_Config.m_BrFilterPing < m_ppServerlist[i]->m_Info.m_Latency) Filtered = 1; else if(g_Config.m_BrFilterCompatversion && str_comp_num(m_ppServerlist[i]->m_Info.m_aVersion, m_aNetVersion, 3) != 0) Filtered = 1; else { if(g_Config.m_BrFilterString[0] != 0) { int MatchFound = 0; m_ppServerlist[i]->m_Info.m_QuickSearchHit = 0; // match against server name if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aName, g_Config.m_BrFilterString)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_SERVERNAME; } // match against players for(p = 0; p < m_ppServerlist[i]->m_Info.m_NumPlayers; p++) { if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aPlayers[p].m_aName, g_Config.m_BrFilterString)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_PLAYERNAME; break; } } // match against map if(str_find_nocase(m_ppServerlist[i]->m_Info.m_aMap, g_Config.m_BrFilterString)) { MatchFound = 1; m_ppServerlist[i]->m_Info.m_QuickSearchHit |= IServerBrowser::QUICK_MAPNAME; } if(!MatchFound) Filtered = 1; } if(!Filtered && g_Config.m_BrFilterGametype[0] != 0) { // match against game type if(!str_find_nocase(m_ppServerlist[i]->m_Info.m_aGameType, g_Config.m_BrFilterGametype)) Filtered = 1; } } if(Filtered == 0) m_pSortedServerlist[m_NumSortedServers++] = i; } }
void CGameContext::AbortVoteKickOnDisconnect(int ClientID) { if(m_VoteCloseTime && !str_comp_num(m_aVoteCommand, "kick ", 5) && str_toint(&m_aVoteCommand[5]) == ClientID) m_VoteCloseTime = -1; }
void CGameTeams::OnFinish(CPlayer* Player) { if (!Player || !Player->IsPlaying()) return; //TODO:DDRace:btd: this ugly float time = (float) (Server()->Tick() - GetStartTime(Player)) / ((float) Server()->TickSpeed()); if (time < 0.000001f) return; CPlayerData *pData = GameServer()->Score()->PlayerData(Player->GetCID()); char aBuf[128]; SetCpActive(Player, -2); str_format(aBuf, sizeof(aBuf), "%s finished in: %d minute(s) %5.2f second(s)", Server()->ClientName(Player->GetCID()), (int) time / 60, time - ((int) time / 60 * 60)); if (g_Config.m_SvHideScore || !g_Config.m_SvSaveWorseScores) GameServer()->SendChatTarget(Player->GetCID(), aBuf); else GameServer()->SendChat(-1, CGameContext::CHAT_ALL, aBuf); float diff = fabs(time - pData->m_BestTime); if (time - pData->m_BestTime < 0) { // new record \o/ Server()->SaveDemo(Player->GetCID(), time); if (diff >= 60) str_format(aBuf, sizeof(aBuf), "New record: %d minute(s) %5.2f second(s) better.", (int) diff / 60, diff - ((int) diff / 60 * 60)); else str_format(aBuf, sizeof(aBuf), "New record: %5.2f second(s) better.", diff); if (g_Config.m_SvHideScore || !g_Config.m_SvSaveWorseScores) GameServer()->SendChatTarget(Player->GetCID(), aBuf); else GameServer()->SendChat(-1, CGameContext::CHAT_ALL, aBuf); } else if (pData->m_BestTime != 0) // tee has already finished? { Server()->StopRecord(Player->GetCID()); if (diff <= 0.005) { GameServer()->SendChatTarget(Player->GetCID(), "You finished with your best time."); } else { if (diff >= 60) str_format(aBuf, sizeof(aBuf), "%d minute(s) %5.2f second(s) worse, better luck next time.", (int) diff / 60, diff - ((int) diff / 60 * 60)); else str_format(aBuf, sizeof(aBuf), "%5.2f second(s) worse, better luck next time.", diff); GameServer()->SendChatTarget(Player->GetCID(), aBuf); //this is private, sent only to the tee } } else { Server()->SaveDemo(Player->GetCID(), time); } bool CallSaveScore = false; #if defined(CONF_SQL) CallSaveScore = g_Config.m_SvUseSQL && g_Config.m_SvSaveWorseScores; #endif if (!pData->m_BestTime || time < pData->m_BestTime) { // update the score pData->Set(time, GetCpCurrent(Player)); CallSaveScore = true; } if (CallSaveScore) if (g_Config.m_SvNamelessScore || str_comp_num(Server()->ClientName(Player->GetCID()), "nameless tee", 12) != 0) GameServer()->Score()->SaveScore(Player->GetCID(), time, GetCpCurrent(Player)); bool NeedToSendNewRecord = false; // update server best time if (GameServer()->m_pController->m_CurrentRecord == 0 || time < GameServer()->m_pController->m_CurrentRecord) { // check for nameless if (g_Config.m_SvNamelessScore || str_comp_num(Server()->ClientName(Player->GetCID()), "nameless tee", 12) != 0) { GameServer()->m_pController->m_CurrentRecord = time; //dbg_msg("character", "Finish"); NeedToSendNewRecord = true; } } SetDDRaceState(Player, DDRACE_FINISHED); // set player score if (!pData->m_CurrentTime || pData->m_CurrentTime > time) { pData->m_CurrentTime = time; NeedToSendNewRecord = true; for (int i = 0; i < MAX_CLIENTS; i++) { if (GetPlayer(i) && GetPlayer(i)->m_ClientVersion >= VERSION_DDRACE) { if (!g_Config.m_SvHideScore || i == Player->GetCID()) { CNetMsg_Sv_PlayerTime Msg; Msg.m_Time = time * 100.0; Msg.m_ClientID = Player->GetCID(); Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, i); } } } } if (NeedToSendNewRecord && Player->m_ClientVersion >= VERSION_DDRACE) { for (int i = 0; i < MAX_CLIENTS; i++) { if (GameServer()->m_apPlayers[i] && GameServer()->m_apPlayers[i]->m_ClientVersion >= VERSION_DDRACE) { GameServer()->SendRecord(i); } } } if (Player->m_ClientVersion >= VERSION_DDRACE) { CNetMsg_Sv_DDRaceTime Msg; Msg.m_Time = (int) (time * 100.0f); Msg.m_Check = 0; Msg.m_Finish = 1; if (pData->m_BestTime) { float Diff = (time - pData->m_BestTime) * 100; Msg.m_Check = (int) Diff; } Server()->SendPackMsg(&Msg, MSGFLAG_VITAL, Player->GetCID()); } int TTime = 0 - (int) time; if (Player->m_Score < TTime) Player->m_Score = TTime; }
void IGameController::CycleMap() { if(m_aMapWish[0] != 0) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "rotating map to %s", m_aMapWish); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); str_copy(g_Config.m_SvMap, m_aMapWish, sizeof(g_Config.m_SvMap)); m_aMapWish[0] = 0; m_RoundCount = 0; return; } if(!str_length(g_Config.m_SvMaprotation)) return; if(m_RoundCount < g_Config.m_SvRoundsPerMap-1) return; if (g_Config.m_SvExtend) { g_Config.m_SvExtend = 0; return; } // handle maprotation const char *pMapRotation = g_Config.m_SvMaprotation; const char *pCurrentMap = g_Config.m_SvMap; int CurrentMapLen = str_length(pCurrentMap); const char *pNextMap = pMapRotation; while(*pNextMap) { int WordLen = 0; while(pNextMap[WordLen] && !IsSeparator(pNextMap[WordLen])) WordLen++; if(WordLen == CurrentMapLen && str_comp_num(pNextMap, pCurrentMap, CurrentMapLen) == 0) { // map found pNextMap += CurrentMapLen; while(*pNextMap && IsSeparator(*pNextMap)) pNextMap++; break; } pNextMap++; } // restart rotation if(pNextMap[0] == 0) pNextMap = pMapRotation; // cut out the next map char aBuf[512]; for(int i = 0; i < 512; i++) { aBuf[i] = pNextMap[i]; if(IsSeparator(pNextMap[i]) || pNextMap[i] == 0) { aBuf[i] = 0; break; } } // skip spaces int i = 0; while(IsSeparator(aBuf[i])) i++; m_RoundCount = 0; char aBufMsg[256]; str_format(aBufMsg, sizeof(aBufMsg), "rotating map to %s", &aBuf[i]); GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf); str_copy(g_Config.m_SvMap, &aBuf[i], sizeof(g_Config.m_SvMap)); }
void CGameContext::AbortVoteOnDisconnect(int ClientID) { if(m_VoteCloseTime && ClientID == m_VoteClientID && (!str_comp_num(m_aVoteCommand, "kick ", 5) || !str_comp_num(m_aVoteCommand, "set_team ", 9) || (!str_comp_num(m_aVoteCommand, "ban ", 4) && Server()->IsBanned(ClientID)))) m_VoteCloseTime = -1; }