diff options
Diffstat (limited to 'tracker/AdminServer/mapslist.cpp')
| -rw-r--r-- | tracker/AdminServer/mapslist.cpp | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/tracker/AdminServer/mapslist.cpp b/tracker/AdminServer/mapslist.cpp new file mode 100644 index 0000000..0681a65 --- /dev/null +++ b/tracker/AdminServer/mapslist.cpp @@ -0,0 +1,230 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: defines a RCon class used to send rcon commands to remote servers +// +// $NoKeywords: $ +//============================================================================= + +#include "mapslist.h" +#include "Iresponse.h" + +#include "Socket.h" +#include "proto_oob.h" +#include "DialogGameInfo.h" +#include "inetapi.h" +#include "TokenLine.h" +#include "dialogkickplayer.h" +#include <string.h> + +extern void v_strncpy(char *dest, const char *src, int bufsize); + +typedef enum +{ + NONE = 0, + INFO_REQUESTED, + INFO_RECEIVED +} RCONSTATUS; + + +typedef enum +{ + FS, + PAK +} MAP_TYPES; + +CMapsList::CMapsList(IResponse *target,serveritem_t &server, const char *rconPassword,const char *mod) { + + memcpy(&m_Server, &server,sizeof(serveritem_t)); + m_pResponseTarget=target; + + if(strcmp(mod,"valve") ) + { + v_strncpy(m_sMod,mod,64); + } + else + { + m_sMod[0]=0; // its the "valve" default mod, list all maps + } + + m_bIsRefreshing=false; + m_bNewMapsList=false; + m_bRconFailed=false; + + v_strncpy(m_szRconPassword,rconPassword,100); + + m_pRcon = new CRcon(this , server,rconPassword); +} + +CMapsList::~CMapsList() { + delete m_pRcon; +} + + +//----------------------------------------------------------------------------- +// Purpose: sends a status query packet to a single server +//----------------------------------------------------------------------------- +void CMapsList::SendQuery() +{ + m_bIsRefreshing=true; + m_pRcon->SendRcon("maps *"); +} + + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CMapsList::RunFrame() +{ + if(m_pRcon) + { + m_pRcon->RunFrame(); + } +} + + +void CMapsList::ServerResponded() +{ + char store[2048]; + strcpy(store, m_pRcon->RconResponse()); + char *cur=store; + char *next=NULL; + int i=0,k=0; + bool checkDir=false; + +// maps format: +// Dir: valve +//------------- +//(fs) rapidcore.bsp +//(fs) frenzy.bsp +//(fs) crossfire.bsp +// +//Dir: valve +//------------- +//(pak) boot_camp.bsp +//(pak) bounce.bsp + + m_MapsList.RemoveAll(); + + char check[21]; + _snprintf(check,21,"%s/",m_sMod); + if(strstr(store,check)) + { // if the name of the mod dir is in the return list its old style format + checkDir=true; + } + + + while(cur!=NULL) + { + cur++; + next=strchr(cur,'\n'); + if(next!=NULL) + { + *next='\0'; + } + + if( strncmp(cur,"Dir:",4) && strncmp(cur,"-------------",13) ) + { + TokenLine mapsLine; + mapsLine.SetLine(cur); + + if(mapsLine.CountToken() >= 2 ) + { + char tmpMap[100]; + v_strncpy(tmpMap,mapsLine.GetToken(1),100); // type + char *end = strstr(tmpMap,".bsp"); // cull the .bsp + if(end != NULL) + { + *end='\0'; + } + if(checkDir==true && strstr(tmpMap,m_sMod)==NULL ) + // if the map name doesn't have the mod dir in it + // and its not running the "valve" mod continue + { + cur=next; + continue; + } + + if ( strchr(tmpMap,'/') ) // remove the directory part of the map name + { + strcpy(tmpMap,strrchr(tmpMap,'/')+1); + } + + for(k=0;k<m_MapsList.Count();k++) // now check it doesn't already exist inside the map list... + { + if(!strncmp(tmpMap,m_MapsList[k].name,strlen(tmpMap)) ) + { + break; + } + } + if(k==m_MapsList.Count() // the map wasn't found + && !(tmpMap[0]=='c' && (tmpMap[1]>='1' && tmpMap[1]<='5')) // a heuristic to remove single player maps + && !(tmpMap[0]=='t' && tmpMap[1]=='0') ) // from the list + { + Maps_t map; + // this map wasn't found already + v_strncpy(map.name,tmpMap,strlen(tmpMap)+1); + if( !strcmp("(fs)",mapsLine.GetToken(0)) ) + { // name + map.type=FS; + } + else + { + map.type=PAK; + } + m_MapsList.AddToTail(map); + i++; + } // if k == Count + + } // CountToken + } // if not a Dir: or "----------" + cur=next; + } + + m_bNewMapsList=true; + m_bIsRefreshing=false; + + // notify the UI of the new server info + m_pResponseTarget->ServerResponded(); + +} + +void CMapsList::ServerFailedToRespond() +{ + // rcon failed + //m_pResponseTarget->ServerFailedToRespond(); +} + +void CMapsList::Refresh() +{ + SendQuery(); +} + +bool CMapsList::IsRefreshing() +{ + + return m_bIsRefreshing; +} + +serveritem_t &CMapsList::GetServer() +{ + return m_Server; +} + + +bool CMapsList::NewMapsList() +{ + return m_bNewMapsList; +} + +CUtlVector<Maps_t> *CMapsList::GetMapsList() +{ + m_bNewMapsList=false; + return &m_MapsList; +} + +void CMapsList::SetPassword(const char *newPass) +{ + m_pRcon->SetPassword(newPass); + m_bRconFailed=false; +}
\ No newline at end of file |