#include "MW4AppHeaders.hpp" //#include "AdeptHeaders.hpp" // // // // This file is the interface between GameOS and the gosScript generic networking scripts. // // When an application comes to rewrite the generic Network scripts it may have to alter // functions or callbacks in this file. // // This file includes GameOS\Network.hpp which exposes more network functions that are // require to write a lobby or connection screens. // // // #include #include #include #include #include "GameSpy\GameSpy.h" #include #include #include "network.hpp" #include "mw4\mwapplication.hpp" #include "mw4\mw4shell.hpp" #include "mw4\netparams.h" #include "rasfuncs.h" #include "missionlang\resource.h" const char * const PLAYER_CLAN_NAME_KEY = "Clan Name"; #define SHELLSCRIPTS_PATH "Content\\ShellScripts\\" //======================================================================== // global functions //======================================================================== extern bool __stdcall PrepareDefaultServerAdvertisers(void); extern int __stdcall Mech4CreateGame(char *szGameName, char *szPlayerName, char *szPassword); //======================================================================== // definitions for callbacks //======================================================================== #define SCRIPTCALLBACK(func) int __stdcall func( void * instance, int args, void * arg[]) #define SCRIPTVAR_INT(var) int var #define SCRIPTVAR_STR(var) char * var #define SCRIPTVAR_ARR(var) char ** var #define SCRIPTVAR_IRR(var) int * var #define RESET_NULL_TO_EMPTY(ptr) if ((ptr)==NULL) ptr=EMPTY_STRING #define FREE_PTR(ptr) if ((void *)ptr) { gos_Free((void *)ptr); (ptr)=NULL; } #define STRING_SIZE 256 #define NUM_ELEMENTS 20 #define MAX_FILTER_STRING 100 #define MAX_SORT_STRING 100 #define MAX_SORT_TYPE_STRING 20 #define MAX_SORT_COLUMNS 10 #define CONNECTION_FILE_VERSION 0x00010005 #define DEFAULT_SORT_COLUMN 1 #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0])) #define FixSZString(a) ((a)[sizeof(a)-1]) = 0 //#define USE_GAMESPY //======================================================================== // global functions //======================================================================== extern void MechMessageBox(char *szTitle, char *szMessage); extern bool StringPurgeAndDuplicate(char * &szDest, const char *szSrc); //======================================================================== // strings for options file //======================================================================== extern const char OPTIONS_INI[]; extern const char OPTIONS_SECTION[]; extern const char OPTIONS_SERVER_SECTION[]; extern const char OPTION_PLAYERNAME[]; extern const char OPTION_TEAMNAME[]; extern const char OPTION_PASSWORD[]; extern const char OPTION_USEPASSWORD[]; extern const char OPTION_PLAYERICON[]; extern const char OPTION_TEAMICON[]; extern const char OPTION_CONNECTIONNAME[]; extern const char OPTION_ALLOWDECALTRANSFER[]; extern const char OPTION_DEFAULTSERVERNAME[]; //======================================================================== // typedefs //======================================================================== typedef struct tagCONNECTION { DWORD dwVersion; DWORD dwChecksum; bool bBrowseGameSpy; bool bBrowseLAN; bool bBrowseGUN; int iNumTCPIP; char szTCPIPAddress[5][30]; bool bAlreadyConnected; char szPhonebookEntryName[50]; char szConnectionName[100]; char szUserName[100]; char szPassword[100]; MWApplication::Bandwidth_Type bandwidth; MWApplication::Connection_Type connectiontype; // mdm - Filter settings for game list // set the booleans bool bPingFilterOn; bool bGameTypeFilterOn; bool bPlayerFilterOn; bool bClanFilterOn; bool bActiveFilterOn; bool bAvailableFilterOn; int PingVal; char szGameType[MAX_FILTER_STRING]; // mdm - Sort settings for game list int sortColumn; char sortColumnName[MAX_SORT_STRING]; char sortType[MAX_SORT_TYPE_STRING]; int sortDescending; bool bCurVerOff; bool bNewVerOff; bool bOldVerOff; int VersionSortVal; } CONNECTION; #if 0 typedef struct tagServerOptions { BOOL bDedicated; BOOL bPasswordProtected; BOOL bPrivateGame; BOOL bDisplayServerMessage; int iMapCycleIndex; int iDelayBetweenMaps; BOOL bAllowJoin; int iAllowJoinTimeLimit; BOOL bAllowCustomDecals; BOOL bFirstPersonPerspectiveOnly; BOOL bUnlimitedAmmo; BOOL bHeat; BOOL bFriendlyFire; bSplashDamage bImmediateRespawn bDeadCanTalk bDeadCanSee iMaxPlayers bUseMapCycle bMaxPing bAvailable bContains1OrMorePlayers bGameType bContainsPlayerNames bContainsPlayersClan iGameType iMaxPing iNumGameTypes bChatBoxNeedsUpdating } #endif //======================================================================== // prototypes for the callback functions //======================================================================== extern SCRIPTCALLBACK(GetReferenceVersion); extern SCRIPTCALLBACK(GetListSize); extern SCRIPTCALLBACK(SortGameList); extern SCRIPTCALLBACK(Select); extern SCRIPTCALLBACK(GetSelection); extern SCRIPTCALLBACK(GetGameData); extern SCRIPTCALLBACK(StartPingServer); extern SCRIPTCALLBACK(StartPingClient); extern SCRIPTCALLBACK(ShutdownPing); extern SCRIPTCALLBACK(GetPing); extern SCRIPTCALLBACK(GetPlayerList); extern SCRIPTCALLBACK(UpdateGUNGameList); extern SCRIPTCALLBACK(GetTotalGameCount); extern SCRIPTCALLBACK(UpdateGameList); extern SCRIPTCALLBACK(CancelActivity); extern SCRIPTCALLBACK(IsGameListUpdating); extern SCRIPTCALLBACK(SetGameNameDefault); extern SCRIPTCALLBACK(SetPlayerNameDefault); extern SCRIPTCALLBACK(CreateSession); extern SCRIPTCALLBACK(JoinSelected); extern SCRIPTCALLBACK(Disconnect); extern SCRIPTCALLBACK(CheckZoneMatch); extern SCRIPTCALLBACK(CreateBrowsers); extern SCRIPTCALLBACK(LoadMPConnectionSettings); extern SCRIPTCALLBACK(SaveMPConnectionSettings); extern SCRIPTCALLBACK(InitMainMPScreen); extern SCRIPTCALLBACK(InitNewConnectionScreen); extern SCRIPTCALLBACK(InitBrowseChoiceScreen); extern SCRIPTCALLBACK(InitServerListScreen); extern SCRIPTCALLBACK(AddServer); extern SCRIPTCALLBACK(UpdateServerList); extern SCRIPTCALLBACK(RefreshServerInfo); extern SCRIPTCALLBACK(SelectServer); extern SCRIPTCALLBACK(JoinGame); extern SCRIPTCALLBACK(HostGame); extern SCRIPTCALLBACK(InitConnectionWizard); extern SCRIPTCALLBACK(TermConnectionWizard); extern SCRIPTCALLBACK(LaunchDUNWizard); extern SCRIPTCALLBACK(RemoveConnection); extern SCRIPTCALLBACK(QuickJoin); extern SCRIPTCALLBACK(GetHostOptions); extern SCRIPTCALLBACK(GetFilterOptions); extern SCRIPTCALLBACK(RefreshGameList); extern SCRIPTCALLBACK(ChatSend); extern SCRIPTCALLBACK(FillPlayerRosterMechType); extern SCRIPTCALLBACK(FillMechTypes); extern SCRIPTCALLBACK(FillGameSettings); extern SCRIPTCALLBACK(GetRASEntryUserNameAndPassword); extern SCRIPTCALLBACK(kldc12); extern SCRIPTCALLBACK(kldc13); extern SCRIPTCALLBACK(kldc14); extern SCRIPTCALLBACK(kldc15); extern SCRIPTCALLBACK(kldc16); extern SCRIPTCALLBACK(kldc17); extern SCRIPTCALLBACK(kldc18); extern SCRIPTCALLBACK(kldc19); extern SCRIPTCALLBACK(kldc20); extern SCRIPTCALLBACK(kldc21); extern SCRIPTCALLBACK(kldc22); extern SCRIPTCALLBACK(kldc23); extern SCRIPTCALLBACK(kldc24); extern SCRIPTCALLBACK(kldc25); extern SCRIPTCALLBACK(GetDialupConnectionStatus); extern SCRIPTCALLBACK(CancelDialup); extern SCRIPTCALLBACK(PreConnect); extern SCRIPTCALLBACK(CreateNewPhonebookEntry); extern SCRIPTCALLBACK(BrowseIPAddress); extern SCRIPTCALLBACK(GetServerInfo); extern SCRIPTCALLBACK(GetServerInfoStatus); extern SCRIPTCALLBACK(ApplyFilters); extern SCRIPTCALLBACK(SaveFilters); extern SCRIPTCALLBACK(ClearFIlters); extern SCRIPTCALLBACK(RevertFilters); extern SCRIPTCALLBACK(SetFilterParam); extern SCRIPTCALLBACK(GetFilterParam); extern SCRIPTCALLBACK(SaveSortInfo); extern SCRIPTCALLBACK(GetSortInfo); //======================================================================== // prototypes for callback variables //======================================================================== extern SCRIPTVAR_INT(gConnectionType); extern SCRIPTVAR_INT(NumberOfGames); extern SCRIPTVAR_INT(NumberOfPlayers); extern SCRIPTVAR_INT(Available); extern SCRIPTVAR_STR(GameName); extern SCRIPTVAR_STR(PlayerName); extern SCRIPTVAR_STR(ServerIPAddress); extern SCRIPTVAR_STR(NGPassword); extern SCRIPTVAR_ARR(ListOfPlayers); extern SCRIPTVAR_ARR(ListOfClans); extern SCRIPTVAR_ARR(ListOfModems); extern SCRIPTVAR_ARR(ListOfSerialPorts); extern SCRIPTVAR_INT(ConnectionIndex); extern SCRIPTVAR_INT(SortColumnID); extern SCRIPTVAR_INT(SortDescending); extern SCRIPTVAR_INT(NumConnections); extern SCRIPTVAR_INT(AmIOnDialUpDefault); extern SCRIPTVAR_INT(BrowseGameSpy); extern SCRIPTVAR_INT(BrowseGUN); extern SCRIPTVAR_INT(BrowseLAN); extern SCRIPTVAR_INT(BrowseIPAddresses); extern SCRIPTVAR_INT(NumIPAddresses); extern SCRIPTVAR_INT(NumServers); extern SCRIPTVAR_ARR(ListOfConnections); extern SCRIPTVAR_ARR(ListOfIPAddresses); extern SCRIPTVAR_ARR(ListOfServers); extern SCRIPTVAR_ARR(ServerInfo); extern SCRIPTVAR_INT(UseDUN); extern SCRIPTVAR_INT(NumDUN); extern SCRIPTVAR_ARR(ListOfDUN); extern SCRIPTVAR_INT(DUNIndex); extern SCRIPTVAR_STR(DUNUserName); extern SCRIPTVAR_STR(DUNPassword); extern SCRIPTVAR_STR(DialupConnectionStatus); extern SCRIPTVAR_INT(AdvertiseThisGame); extern SCRIPTVAR_STR(LocalIPAddress); extern SCRIPTVAR_STR(ReferenceVersion); extern SCRIPTVAR_INT(iDedicated); extern SCRIPTVAR_INT(bPasswordProtected); extern SCRIPTVAR_INT(kldi30); extern SCRIPTVAR_INT(kldi61); extern SCRIPTVAR_STR(GameDataID); extern SCRIPTVAR_STR(SortColumnName); extern SCRIPTVAR_STR(SortType); extern SCRIPTVAR_STR(FilterParamVal); extern SCRIPTVAR_STR(PingTimeStr); extern SCRIPTVAR_STR(GamePassword); extern SCRIPTVAR_STR(ErrorMsg); extern SCRIPTVAR_STR(klds07); extern SCRIPTVAR_STR(GameSpyAddress); extern SCRIPTVAR_ARR(ListOfTCPIPAddresses); //======================================================================== // other externs //======================================================================== extern void RegisterData(void); extern void UnRegisterData(void); extern bool ValidatePath(char *pszData); extern void SaveConnection(CONNECTION *con); extern void LoadConnection(CONNECTION *con, char *szFileName, bool bSaveAsDefault); ////////////////// // Some forward declarations ////////////////// int PushFiltersToGameList( void ); void SetFilterDefaultsForConnection( CONNECTION * pConnection ); //======================================================================== // GUN key stuff //======================================================================== //======================================================================== // global variables //======================================================================== void* NetworkInstance=(void *)NET_SCRIPT_PRIORITY; DWORD gInSecureGame=0; static CONNECTION conDefault; //======================================================================== // GosScript registered variable definitions //======================================================================== SCRIPTVAR_INT(Available) = 0; SCRIPTVAR_INT(gConnectionType) = -1; SCRIPTVAR_STR(PlayerName) = NULL; SCRIPTVAR_STR(ServerIPAddress) = NULL; SCRIPTVAR_STR(GameName) = NULL; SCRIPTVAR_STR(NGPassword) = NULL; SCRIPTVAR_INT(NumberOfGames) = 0; SCRIPTVAR_ARR(ListOfPlayers) = NULL; SCRIPTVAR_ARR(ListOfClans) = NULL; SCRIPTVAR_INT(NumberOfPlayers) = 0; SCRIPTVAR_ARR(ListOfSerialPorts) = NULL; SCRIPTVAR_ARR(ListOfModems) = NULL; SCRIPTVAR_INT(ConnectionIndex) = 0; SCRIPTVAR_INT(SortColumnID) = -1; SCRIPTVAR_INT(SortDescending) = 1; SCRIPTVAR_INT(NumConnections) = 0; SCRIPTVAR_INT(AmIOnDialUpDefault) = 0; // 0=no, 1=yes SCRIPTVAR_INT(BrowseGameSpy) = 0; SCRIPTVAR_INT(BrowseGUN) = 0; SCRIPTVAR_INT(BrowseLAN) = 0; SCRIPTVAR_INT(BrowseIPAddresses) = 0; SCRIPTVAR_INT(NumIPAddresses) = 0; SCRIPTVAR_INT(NumServers) = 0; SCRIPTVAR_ARR(ListOfConnections) = NULL; SCRIPTVAR_ARR(ListOfIPAddresses) = NULL; SCRIPTVAR_ARR(ListOfServers) = NULL; SCRIPTVAR_ARR(ServerInfo) = NULL; SCRIPTVAR_INT(UseDUN) = 0; SCRIPTVAR_INT(NumDUN) = 0; SCRIPTVAR_ARR(ListOfDUN) = NULL; SCRIPTVAR_INT(DUNIndex) = 0; SCRIPTVAR_STR(DUNUserName) = NULL; SCRIPTVAR_STR(DUNPassword) = NULL; SCRIPTVAR_STR(DialupConnectionStatus) = NULL; SCRIPTVAR_INT(AdvertiseThisGame) = 1; SCRIPTVAR_STR(LocalIPAddress) = NULL; SCRIPTVAR_STR(ReferenceVersion) = NULL; SCRIPTVAR_INT(iDedicated) = 0; SCRIPTVAR_INT(bPasswordProtected) = 0; SCRIPTVAR_INT(kldi30) = 0; SCRIPTVAR_INT(kldi61) = 0; SCRIPTVAR_STR(GameDataID) = NULL; SCRIPTVAR_STR(SortColumnName) = NULL; SCRIPTVAR_STR(SortType) = NULL; SCRIPTVAR_STR(FilterParamVal) = NULL; SCRIPTVAR_STR(PingTimeStr) = NULL; SCRIPTVAR_STR(GamePassword) = NULL; SCRIPTVAR_STR(ErrorMsg) = NULL; SCRIPTVAR_STR(klds07) = NULL; SCRIPTVAR_STR(GameSpyAddress) = NULL; SCRIPTVAR_ARR(ListOfTCPIPAddresses) = NULL; char EMPTY_STRING[] = ""; //======================================================================== // GameList Script API Variables //======================================================================== struct APIVars { SCRIPTVAR_STR(GameVersion); SCRIPTVAR_STR(ServerAddress); SCRIPTVAR_STR(ServerPort); SCRIPTVAR_STR(ServerName); SCRIPTVAR_STR(NumPlayers); SCRIPTVAR_STR(MaxPlayers); SCRIPTVAR_STR(PasswordStatus); SCRIPTVAR_STR(MapType); SCRIPTVAR_STR(GameType); SCRIPTVAR_STR(ProtocolString); SCRIPTVAR_INT(Protocol); SCRIPTVAR_STR(Flags); SCRIPTVAR_INT(ConnectionType); SCRIPTVAR_INT(Dedicated); SCRIPTVAR_INT(StatsTracking); SCRIPTVAR_INT(PureServer); SCRIPTVAR_INT(Locked); // internal vars char selectID[255]; }; APIVars g_APIVars; // jcem - start #include "ctcls.h" #include "ctcl.h" extern bool g_bCOOP; // COin OPeration extern SCRIPTCALLBACK(CancelDialup); extern SCRIPTCALLBACK(LoadMPConnectionSettings); extern SCRIPTCALLBACK(InitConnectionWizard); extern SCRIPTCALLBACK(PreConnect); // jcem - end //======================================================================== // This callback indicates the current size of the game list. //======================================================================== SCRIPTCALLBACK(GetListSize) { return (ServerBrowser::GetGameList())->GetIndexedView()->GetCount(); } SCRIPTCALLBACK(GetReferenceVersion) { int retval = 0; Browse::GameList::Lock(); if ( ServerBrowser::GetGameList() ) { Browse::GameList * pGameList = ServerBrowser::GetGameList(); if ( pGameList ) { const char * pRefID = pGameList->GetReferenceGameID(); if ( pRefID ) { // get version from reference game const char * pVersion = pGameList->GetDataField( pRefID, GAMELIST_KEY_PRODUCT_VERSION); if ( pVersion ) { strncpy(ReferenceVersion, pVersion, STRING_SIZE-1); ReferenceVersion[STRING_SIZE-1] = 0; retval = 1; goto CLEANUP; } } } } // if we get here it is because we don't know what the current reference version is ReferenceVersion[0] = 0; CLEANUP: Browse::GameList::Unlock(); return retval; } //======================================================================== // This callback instructs the internal game list to sort itself according // to the column specified. If sortDescending is non-zero, then the list // will be sorted in descending order. Otherwise, the list will be sorted // in ascending order. //======================================================================== SCRIPTCALLBACK(SortGameList) { if ( !ServerBrowser::GetGameList() || !ServerBrowser::GetGameList()->GetIndexedView() ) { return 0; } if (( args < 4 ) || ( args > 5 )) { PAUSE(( "Invalid number of arguments (%d) to SortGameList().", args )); return 0; } int columnID = (int) arg[0]; if ( columnID < 0 || columnID > 9999 ) { columnID = *( (int *) arg[0]); if ( columnID < 0 || columnID > 9999 ) { return -1; } } const char * column = *( (char **) arg[1] ); const char * sortType = *( (char **)arg[2] ); int sortDescending = (int)(arg[3]); // literals aren't pointers if ( sortDescending < 0 || sortDescending > 1 ) { sortDescending = *( (int *) arg[3] ); } Browse::IndexedTableView::VersionOrderType versionOrder = Browse::IndexedTableView::NO_VERSION; if ( args == 5 ) { if ((int)(arg[4]) != 0) { switch (conDefault.VersionSortVal) { case 0: versionOrder = Browse::IndexedTableView::NO_VERSION; break; case 1: versionOrder = Browse::IndexedTableView::CUR_OLD_NEW_VERSION; break; case 2: versionOrder = Browse::IndexedTableView::CUR_NEW_OLD_VERSION; break; case 3: versionOrder = Browse::IndexedTableView::OLD_CUR_NEW_VERSION; break; case 4: versionOrder = Browse::IndexedTableView::OLD_NEW_CUR_VERSION; break; case 5: versionOrder = Browse::IndexedTableView::NEW_OLD_CUR_VERSION; break; case 6: versionOrder = Browse::IndexedTableView::NEW_CUR_OLD_VERSION; break; } } Verify(versionOrder <= Browse::IndexedTableView::TOTAL_VERSION); } Browse::IndexedTableView::SortOrderType sortEnum; // parse sort order if ( !strcmp(sortType, "numeric") ) { if ( sortDescending ) { sortEnum = Browse::IndexedTableView::DESCENDING_NUMERIC; } else { sortEnum = Browse::IndexedTableView::ASCENDING_NUMERIC; } } else { if ( sortDescending ) { sortEnum = Browse::IndexedTableView::DESCENDING_ALPHABETICAL; } else { sortEnum = Browse::IndexedTableView::ASCENDING_ALPHABETICAL; } } // store the sort data in the current connection strncpy(conDefault.sortType, sortType, MAX_SORT_TYPE_STRING-1); conDefault.sortType[MAX_SORT_TYPE_STRING-1] = 0; strncpy(conDefault.sortColumnName, column, MAX_SORT_STRING-1); conDefault.sortColumnName[MAX_SORT_STRING-1] = 0; conDefault.sortDescending = sortDescending; conDefault.sortColumn = columnID; return (int) ServerBrowser::GetGameList()->GetIndexedView()->Sort(column, sortEnum, versionOrder); } //======================================================================== // This callback selects the row at the specified index. // The selection serves as a reference point for the client application when // the server list is updated (through sorting or new server updates, for example). // See GetSelection() below. //======================================================================== SCRIPTCALLBACK(Select) { int retval = -1; if ( args != 1 ) { PAUSE(( "Invalid number of arguments (%d) to Select().", args )); return 0; } int selIndex = (int)arg[0]; if ( selIndex < -1 || selIndex > 9999 ) { // assume its a pointer if its out of the above range selIndex = *(int *)(arg[0]); } // // make sure we have a valid game list // if (ServerBrowser::GetGameList() == NULL) return -1; ServerBrowser::GetGameList()->Lock(); Browse::IndexedTableView * indexView = ServerBrowser::GetGameList()->GetIndexedView(); gosASSERT(indexView); if ( selIndex < 0 || selIndex >= indexView->GetCount() ) { // PAUSE(( "Invalid select index %d, should be >= 0 and <= %d", selIndex, indexView->GetCount() )); goto CLEANUP; } char * gameID; if ( indexView->GetIndex( selIndex, &gameID ) == false ) { PAUSE(( "Unable to find gameID for select index %d.", selIndex )); goto CLEANUP; } if ( indexView->SetSelection( gameID ) == false ) { PAUSE(( "Error setting selectio to gameid %s.\n", gameID )); goto CLEANUP; } strcpy(g_APIVars.selectID, gameID); retval = 1; CLEANUP: ServerBrowser::GetGameList()->Unlock(); return retval; } //======================================================================== // This callback returns an integer indicating the index of the currently // selected row. This callback can be used to keep a specific game server // in the client's view visible after a call to Update GUNGameList() or // SortGameList(). By calling Select() and specifying the game server you // want to keep track of, you can later call GetSelection() to obtain the // current index of that game server in the list. //======================================================================== SCRIPTCALLBACK(GetSelection) { int index=0; Browse::GameList * pGameList; pGameList = ServerBrowser::GetGameList(); if (pGameList) index = pGameList->GetIndexedView()->GetIndexFromID( g_APIVars.selectID ); return index; } //////////////////////////////////////////////////////////////////////////////////////// // SetFilterDefaultsForConnection() // Purpose: // Set the default values for a connection's filter settings. // // Parameters: // [pConnection] : // // Returns: none // // Change Log // Author MMDDYY Description // -------------------- ------ ------------------------------------------------ // Michael Moore 100400 Initial Version // // //////////////////////////////////////////////////////////////////////////////////////// void SetFilterDefaultsForConnection( CONNECTION * pConnection ) { gosASSERT(pConnection); pConnection->bPingFilterOn = 0; pConnection->bGameTypeFilterOn= 0; pConnection->bPlayerFilterOn = 0; pConnection->bClanFilterOn = 0; pConnection->bActiveFilterOn = 0; pConnection->bAvailableFilterOn = 0; pConnection->PingVal = 100; strcpy(pConnection->szGameType, ""); pConnection->bCurVerOff = 0; pConnection->bNewVerOff = 0; pConnection->bOldVerOff = 0; pConnection->VersionSortVal = 1; } //////////////////////////////////////////////////////////////////////////////////////// // SetSortDefaultsForConnection() // Purpose: // Set the sorting defaults for the indicated connection structure. // // Parameters: // [pConnectino] : // // Returns: none // // Change Log // Author MMDDYY Description // -------------------- ------ ------------------------------------------------ // Michael Moore 100500 Initial Version // // //////////////////////////////////////////////////////////////////////////////////////// void SetSortDefaultsForConnection( CONNECTION * pConnection ) { gosASSERT(pConnection); pConnection->sortColumn = -1; pConnection->sortColumnName[0] = 0; strcpy(pConnection->sortType, "alphabetical"); pConnection->sortDescending = 1; } ////======================================================================== ////======================================================================== //SCRIPTCALLBACK(LockServer) //{ // if (kldi59) // ServerAdvertiser::SetFlagsAllAdvertisers(ServerAdvertiser::GetFlagsAllAdvertisers() | NETFLAGS_LOCKED_FLAG); // else // ServerAdvertiser::SetFlagsAllAdvertisers(ServerAdvertiser::GetFlagsAllAdvertisers() & ~NETFLAGS_LOCKED_FLAG); // // return 0; //} //======================================================================== //======================================================================== SCRIPTCALLBACK(InitConnectionWizard) { NumDUN = RAS::GetListOfEntries(ListOfDUN); if (ConnectionIndex < NumConnections) { LoadConnection(&conDefault, ListOfConnections[ConnectionIndex], true); BrowseGameSpy = conDefault.bBrowseGameSpy; BrowseGUN = conDefault.bBrowseGUN; BrowseLAN = conDefault.bBrowseLAN; BrowseIPAddresses = conDefault.iNumTCPIP; kldi61 = conDefault.bAlreadyConnected; for (int i=0 ; i<5 ; i++) StringPurgeAndDuplicate(ListOfTCPIPAddresses[i], conDefault.szTCPIPAddress[i]); StringPurgeAndDuplicate(klds07, conDefault.szConnectionName); StringPurgeAndDuplicate(DUNUserName, conDefault.szUserName); StringPurgeAndDuplicate(DUNPassword, conDefault.szPassword); for (DUNIndex=0 ; DUNIndexGetLocString(IDS_NETUI_DEFAULT_CONNECTION_NAME)); strcpy(szConnectionFile, "m4c"); strcat(szConnectionFile, szConnectionName); strcat(szConnectionFile, ".m4c"); int i=0; while (gos_DoesFileExist(szConnectionFile)) { i++; sprintf(szConnectionName, "%s %d", Application::GetInstance()->GetLocString(IDS_NETUI_DEFAULT_CONNECTION_NAME), i); strcpy(szConnectionFile, "m4c"); strcat(szConnectionFile, szConnectionName); strcat(szConnectionFile, ".m4c"); } StringPurgeAndDuplicate(klds07, szConnectionName); } } return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(TermConnectionWizard) { // // here's where I save the connection // conDefault.bBrowseGameSpy = !!BrowseGameSpy; conDefault.bBrowseGUN = !!BrowseGUN; conDefault.bBrowseLAN = !!BrowseLAN; conDefault.iNumTCPIP = BrowseIPAddresses; conDefault.bAlreadyConnected = !!kldi61; conDefault.connectiontype = conDefault.connectiontype; conDefault.bandwidth = conDefault.bandwidth; conDefault.dwVersion = CONNECTION_FILE_VERSION; for (int i=0 ; i<5 ; i++) strcpy(conDefault.szTCPIPAddress[i], ListOfTCPIPAddresses[i]); strcpy(conDefault.szPhonebookEntryName, ListOfDUN[DUNIndex]); strcpy(conDefault.szConnectionName, klds07); strcpy(conDefault.szUserName, DUNUserName); strcpy(conDefault.szPassword, DUNPassword); if (!ValidatePath(conDefault.szConnectionName)) return -1; if (conDefault.szConnectionName[0]) SaveConnection(&conDefault); return 0; } //======================================================================== //======================================================================== bool ValidatePath(char *pszData) { char *pszTmp; // //Special case the name "NUL", it doesn't return a failure code for CreateDirectory() //or CreateFile(), even though no such folder\file gets created! // if (0 == _strcmpi(pszData, "NUL")) { return false; } pszTmp = pszData; while (*pszTmp != '\0') { switch (*pszTmp) { case '\"': case '*': case '?': case '\\': case '/': case ':': case '<': case '>': case '|': return false; } pszTmp++; } return true; } //======================================================================== //======================================================================== void SaveConnection(CONNECTION *con) { char szFileName[256]; strcpy(szFileName, "m4c"); strcat(szFileName, con->szConnectionName); strcat(szFileName, ".m4c"); if (true) { HGOSFILE hf = NULL; gos_OpenFile(&hf, szFileName, READWRITE); if (hf) { gos_WriteFile(hf, con, sizeof(*con)); gos_CloseFile(hf); } LoadConnection(con, con->szConnectionName, true); } } //======================================================================== //======================================================================== void LoadConnection(CONNECTION *con, char *szConnectionName, bool bSaveAsDefault) { if (szConnectionName==NULL || szConnectionName[0]==0) return; char szFileName[256]; strcpy(szFileName, "m4c"); strcat(szFileName, szConnectionName); strcat(szFileName, ".m4c"); if (true) { HGOSFILE hf = NULL; gos_OpenFile(&hf, szFileName, READONLY); if (hf) { gos_ReadFile(hf, con, sizeof(*con)); gos_CloseFile(hf); } } // // save the connection // if (bSaveAsDefault) { NotationFile startup_ini(OPTIONS_INI, NotationFile::Standard, true); Page *page = startup_ini.SetPage(OPTIONS_SECTION); page->SetEntry(OPTION_CONNECTIONNAME, szConnectionName); startup_ini.Save(); } } //======================================================================== //======================================================================== SCRIPTCALLBACK(LaunchDUNWizard) { return 0; } //======================================================================== // This callback provides information about the game server located at // the specified index. The callback sets the following script // variables, which represent the standard GUN server info fields: // // $$GameID$$ // $$GameVersion$$ // $$ServerAddress$$ // $$ServerPort$$ // $$ServerName$$ // $$NumPlayers$$ // $$MaxPlayers$$ // $$PasswordStatus$$ // $$MapType$$ // $$GameType$$ //======================================================================== SCRIPTCALLBACK(GetGameData) { if ( args != 1 ) { PAUSE(( "Invalid number of arguments (%d) to GetGameData callback.", args )); return 0; } Browse::GameList *pGameList = ServerBrowser::GetGameList(); if (pGameList == NULL) return 0; pGameList->Lock(); int index = *((int *) arg[0]); char * gameID; if ( pGameList->GetIndexedView()->GetIndex(index, &gameID) == false ) { pGameList->Unlock(); return 0; } strcpy(GameDataID, gameID); g_APIVars.GameVersion = (char *)pGameList->GetDataField( gameID, GAMELIST_KEY_PRODUCT_VERSION); g_APIVars.ServerAddress = (char *)pGameList->GetDataField( gameID, GAMELIST_KEY_SERVER_ADDRESS); g_APIVars.ServerPort = (char *)pGameList->GetDataField( gameID, GAMELIST_KEY_SERVER_PORT); g_APIVars.ServerName = (char *)pGameList->GetDataField( gameID, GAMELIST_KEY_SERVER_NAME); g_APIVars.NumPlayers = (char *)pGameList->GetDataField( gameID, GAMELIST_KEY_NUM_PLAYERS); g_APIVars.MaxPlayers = (char *)pGameList->GetDataField( gameID, GAMELIST_KEY_MAX_PLAYERS); g_APIVars.PasswordStatus = (char *)pGameList->GetDataField( gameID, GAMELIST_KEY_PASSWORD_PROTECTED); g_APIVars.MapType = (char *)pGameList->GetDataField( gameID, GAMELIST_KEY_MAP_TYPE); g_APIVars.GameType = (char *)pGameList->GetDataField( gameID, GAMELIST_KEY_GAME_TYPE); g_APIVars.ProtocolString = (char *)pGameList->GetDataField( gameID, GAMELIST_KEY_PROTOCOL); g_APIVars.Flags = (char *)pGameList->GetDataField( gameID, GAMELIST_KEY_FLAGS); if (g_APIVars.ProtocolString) g_APIVars.Protocol = atoi(g_APIVars.ProtocolString); else g_APIVars.Protocol = -1; if (g_APIVars.Flags) { g_APIVars.ConnectionType = atoi(g_APIVars.Flags) & NETFLAGS_CONNECTION_TYPE_MASK; g_APIVars.Dedicated = !!(atoi(g_APIVars.Flags) & NETFLAGS_DEDICATED_FLAG); g_APIVars.StatsTracking = !!(atoi(g_APIVars.Flags) & NETFLAGS_STATSTRACKING_FLAG); g_APIVars.PureServer = !!(atoi(g_APIVars.Flags) & NETFLAGS_PURESERVER_FLAG); g_APIVars.Locked = !!(atoi(g_APIVars.Flags) & NETFLAGS_LOCKED_FLAG); } else { g_APIVars.ConnectionType = 0; g_APIVars.Dedicated = 0; g_APIVars.StatsTracking = 0; g_APIVars.PureServer = 0; g_APIVars.Locked = 0; } RESET_NULL_TO_EMPTY(g_APIVars.GameVersion); RESET_NULL_TO_EMPTY(g_APIVars.ServerAddress); RESET_NULL_TO_EMPTY(g_APIVars.ServerPort); RESET_NULL_TO_EMPTY(g_APIVars.ServerName); RESET_NULL_TO_EMPTY(g_APIVars.NumPlayers); RESET_NULL_TO_EMPTY(g_APIVars.MaxPlayers); RESET_NULL_TO_EMPTY(g_APIVars.PasswordStatus); RESET_NULL_TO_EMPTY(g_APIVars.MapType); RESET_NULL_TO_EMPTY(g_APIVars.GameType); pGameList->Unlock(); return 1; } //////////////////////////////////////////////////////////////////////////////////////// // SCRIPTCALLBACK() // Purpose: // Obtain the current sort information from the connection. This fills in the // SortColumName, SortType, SortIsDescending, and SortColumnID registered vars // for use by the script. // // Parameters: // [GetSortInfo] : // // Returns: none // // Change Log // Author MMDDYY Description // -------------------- ------ ------------------------------------------------ // Michael Moore 100600 Initial Version // // //////////////////////////////////////////////////////////////////////////////////////// SCRIPTCALLBACK(GetSortInfo) { strcpy(SortType, conDefault.sortType); strcpy(SortColumnName, conDefault.sortColumnName); SortColumnID = conDefault.sortColumn; SortDescending = conDefault.sortDescending; return 1; } //////////////////////////////////////////////////////////////////////////////////////// // SCRIPTCALLBACK() // Purpose: // Saves the sort order information for all of the columns. Also saves which // column is currently sorted. // // Parameters: // [SaveSortInfo] : // // Returns: none // // Change Log // Author MMDDYY Description // -------------------- ------ ------------------------------------------------ // Michael Moore 100500 Initial Version // // //////////////////////////////////////////////////////////////////////////////////////// SCRIPTCALLBACK(SaveSortInfo) { SaveConnection( &conDefault ); return 1; } //======================================================================== // Clear all filters on the game list. //======================================================================== SCRIPTCALLBACK(ClearFilters) { Browse::TableItemFilter * filter = ServerBrowser::GetGameList()->GetIndexedView()->GetFilter(); if ( !filter ) { return -1; } filter->ClearAllFilters(); // jcem begin filter = NULL; ServerBrowser::GetGameList()->GetIndexedView()->SetFilter( *filter ); // jcem end return 0; } //////////////////////////////////////////////////////////////////////////////////////// // SCRIPTCALLBACK() // Purpose: // Save the connection to disk, thus saving the filter values. // // Parameters: // [SaveFilters] : // // Returns: none // // Change Log // Author MMDDYY Description // -------------------- ------ ------------------------------------------------ // Michael Moore 100400 Initial Version // // //////////////////////////////////////////////////////////////////////////////////////// SCRIPTCALLBACK(SaveFilters) { // Save the connection to disk so that the filter settings are stored. SaveConnection( &conDefault ); return 0; } //////////////////////////////////////////////////////////////////////////////////////// // SCRIPTCALLBACK() // Purpose: // Reverts the filter settings by reloading the connection from disk. // // Parameters: // [RevertFilters] : // // Returns: none // // Change Log // Author MMDDYY Description // -------------------- ------ ------------------------------------------------ // Michael Moore 100400 Initial Version // // //////////////////////////////////////////////////////////////////////////////////////// SCRIPTCALLBACK(RevertFilters) { LoadConnection(&conDefault, ListOfConnections[ConnectionIndex], true); return 0; } //////////////////////////////////////////////////////////////////////////////////////// // SCRIPTCALLBACK() // Purpose: // Pushes the filter settings currently found in the connection to the game list. // // Parameters: // [ApplyFilters] : // // Returns: none // // Change Log // Author MMDDYY Description // -------------------- ------ ------------------------------------------------ // Michael Moore 100400 Initial Version // // //////////////////////////////////////////////////////////////////////////////////////// SCRIPTCALLBACK(ApplyFilters) { return PushFiltersToGameList(); } //////////////////////////////////////////////////////////////////////////////////////// // PushFiltersToGameList() // Purpose: // Pushes the condefault filter settings out to the filter that is being used // for the game list. This is the function to call when the user click's ok and // wants to accept the changes made to the filter settings. // // Parameters: // [void] : // // Returns: int // // Change Log // Author MMDDYY Description // -------------------- ------ ------------------------------------------------ // Michael Moore 100400 Initial Version // // //////////////////////////////////////////////////////////////////////////////////////// int PushFiltersToGameList( void ) { // push the filter variables out to the gamelist filter Browse::GameList * pGameList = ServerBrowser::GetGameList(); if ( !pGameList ) { PAUSE(( "Invalid to call ApplyFilters when no game list has been created." )); return -1; } gosASSERT(pGameList->GetIndexedView()); Browse::GameListFilter * pFilter = (Browse::GameListFilter *) pGameList->GetIndexedView()->GetFilter(); if ( !pFilter ) { PAUSE(( "ApplyFilters called but no GameListFilter found on indexed view." )); return -1; } // set the booleans pFilter->EnablePingFilter( conDefault.bPingFilterOn ? true : false ); pFilter->EnableGameTypeFilter( conDefault.bGameTypeFilterOn ? true : false ); pFilter->EnablePlayerFilter( conDefault.bPlayerFilterOn ? true : false ); pFilter->EnableClanFilter( conDefault.bClanFilterOn ? true : false ); pFilter->EnableActiveFilter( conDefault.bActiveFilterOn ? true : false ); pFilter->EnableAvailableFilter( conDefault.bAvailableFilterOn ? true : false ); pFilter->EnableCurVerOffFilter( conDefault.bCurVerOff ? true : false ); pFilter->EnableNewVerOffFilter( conDefault.bNewVerOff ? true : false ); pFilter->EnableOldVerOffFilter( conDefault.bOldVerOff ? true : false ); // set the values pFilter->SetPingFilter( 0, conDefault.PingVal ); pFilter->SetGameTypeFilter( conDefault.szGameType ); Browse::IndexedTableView::VersionOrderType versionOrder = Browse::IndexedTableView::NO_VERSION; switch (conDefault.VersionSortVal) { case 0: versionOrder = Browse::IndexedTableView::NO_VERSION; break; case 1: versionOrder = Browse::IndexedTableView::CUR_OLD_NEW_VERSION; break; case 2: versionOrder = Browse::IndexedTableView::CUR_NEW_OLD_VERSION; break; case 3: versionOrder = Browse::IndexedTableView::OLD_CUR_NEW_VERSION; break; case 4: versionOrder = Browse::IndexedTableView::OLD_NEW_CUR_VERSION; break; case 5: versionOrder = Browse::IndexedTableView::NEW_OLD_CUR_VERSION; break; case 6: versionOrder = Browse::IndexedTableView::NEW_CUR_OLD_VERSION; break; } Verify(versionOrder <= Browse::IndexedTableView::TOTAL_VERSION); // apply the filter! pGameList->GetIndexedView()->Filter( versionOrder ); return 0; } //////////////////////////////////////////////////////////////////////////////////////// // SCRIPTCALLBACK() // Purpose: // Gets the filter parameter requested. If the parameter value is an integer, // it is returned as the value of the function. If the parameter is a string // value, it is returned in the registered variable FilterParamVal. // // Parameters: // [GetFilterParam] : // // Returns: none // // Change Log // Author MMDDYY Description // -------------------- ------ ------------------------------------------------ // Michael Moore 100500 Initial Version // // //////////////////////////////////////////////////////////////////////////////////////// SCRIPTCALLBACK(GetFilterParam) { if ( args != 1 ) { return -1; } char * param = (char *) arg[0]; if ( !param ) return -1; if ( !stricmp(param, "pingon") ) { return conDefault.bPingFilterOn; } else if ( !stricmp(param, "gametypeon") ) { return conDefault.bGameTypeFilterOn; } else if ( !stricmp(param, "playeron") ) { return conDefault.bPlayerFilterOn; } else if ( !stricmp(param, "clanon") ) { return conDefault.bClanFilterOn; } else if ( !stricmp(param, "activeon") ) { return conDefault.bActiveFilterOn; } else if ( !stricmp(param, "availableon") ) { return conDefault.bAvailableFilterOn; } else if ( !stricmp(param, "curveroff") ) { return conDefault.bCurVerOff; } else if ( !stricmp(param, "oldveroff") ) { return conDefault.bOldVerOff; } else if ( !stricmp(param, "newveroff") ) { return conDefault.bNewVerOff; } else if ( !stricmp(param, "versionsort") ) { return conDefault.VersionSortVal; } else if ( !stricmp(param, "ping") ) { return conDefault.PingVal; } else if ( !stricmp(param, "gametype") ) { strcpy(FilterParamVal, conDefault.szGameType); } else { return -1; // error } return 0; // success } //////////////////////////////////////////////////////////////////////////////////////// // SCRIPTCALLBACK() // Purpose: // Set a filter property. First param is the name of the property to set, and // the second param is a string indicating the value of the parameter. // // Parameters: // [SetFilterParam] : // // Returns: none // // Change Log // Author MMDDYY Description // -------------------- ------ ------------------------------------------------ // Michael Moore 100400 Initial Version // // //////////////////////////////////////////////////////////////////////////////////////// SCRIPTCALLBACK(SetFilterParam) { if ( args != 2 ) { return -1; } char * param = (char *) arg[0]; int iVal = (int) arg[1]; char * val = NULL; if ( iVal < -2 || iVal > 9999 ) { val = *(char **) arg[1]; iVal = atoi(val); } if ( !stricmp(param, "pingon") ) { conDefault.bPingFilterOn = !!iVal; } else if ( !stricmp(param, "gametypeon") ) { conDefault.bGameTypeFilterOn = !!iVal; } else if ( !stricmp(param, "playeron") ) { conDefault.bPlayerFilterOn = !!iVal; } else if ( !stricmp(param, "clanon") ) { conDefault.bClanFilterOn = !!iVal; } else if ( !stricmp(param, "activeon") ) { conDefault.bActiveFilterOn = !!iVal; } else if ( !stricmp(param, "availableon") ) { conDefault.bAvailableFilterOn = !!iVal; } else if ( !stricmp(param, "curveroff") ) { conDefault.bCurVerOff = !!iVal; } else if ( !stricmp(param, "oldveroff") ) { conDefault.bOldVerOff = !!iVal; } else if ( !stricmp(param, "newveroff") ) { conDefault.bNewVerOff = !!iVal; } else if ( !stricmp(param, "versionsort") ) { if ( iVal < 1 || iVal > 6 ) { PAUSE(( "Invalid version sorting filter setting '%s'. Should be a number between 1 and 6.\n", val ? val : "NULL" )); return -1; } conDefault.VersionSortVal = iVal; } else if ( !stricmp(param, "ping") ) { if ( iVal < 0 || iVal > 9999 ) { PAUSE(( "Invalid ping filter setting '%s'. Should be a number between 0 and 1000.\n", val ? val : "NULL" )); return -1; } conDefault.PingVal = iVal; } else if ( !stricmp(param, "gametype") ) { if ( !val ) { PAUSE(( "Val is NULL inside SetFilterParam.\n" )); return -1; } strncpy(conDefault.szGameType, val, MAX_FILTER_STRING-1); conDefault.szGameType[MAX_FILTER_STRING-1] = 0; } else { return -1; // error } return 0; // success } //======================================================================== // Start the ping server. This should only be invoked by the game when // it is hosting. //======================================================================== SCRIPTCALLBACK(StartPingServer) { return Browse::GameList::StartPingServer(); } //======================================================================== // Start the ping client. This will start pinging any games that are // in ServerBrowser::GetGameList(). //======================================================================== SCRIPTCALLBACK(StartPingClient) { return Browse::GameList::StartPingClient( ZONE_PING_INTERVAL ); } //======================================================================== // Shutdown the ping service. THis should be called when joining a game. // THis should also be called to shutdown client pinging before calling // StartPingServer() when hosting a game. //======================================================================== SCRIPTCALLBACK(ShutdownPing) { Browse::GameList::ShutdownPing(); return 1; } //======================================================================== // returns the ping time of the game server at the indicated index. //======================================================================== SCRIPTCALLBACK(GetPing) { int retval = -1; int index = -1; if ( args != 1 ) { return retval; } Browse::GameList::Lock(); if ( !ServerBrowser::GetGameList() ) { goto CLEANUP; } index = *((int *) arg[0]); if ( index > ServerBrowser::GetGameList()->GetIndexedView()->GetCount() ) { index = (unsigned int) atoi( (char *) arg[0] ); if ( index > ServerBrowser::GetGameList()->GetIndexedView()->GetCount() ) { goto CLEANUP; } } retval = ServerBrowser::GetGameList()->GetPing(index); if ( retval < 0 ) { strcpy(PingTimeStr, "-"); } else if ( retval == 0 ) { strcpy(PingTimeStr, "N/A"); } else { sprintf(PingTimeStr, "%d", retval); } CLEANUP: Browse::GameList::Unlock(); return retval; } // mdm - modified so that if -1 is the index, then there are two args // expected and the second is expected to be a gameid //======================================================================== //======================================================================== SCRIPTCALLBACK(GetPlayerList) { int i; NumberOfPlayers = 0; char * gameID = 0; Browse::PlayerList * pList = 0; int count = 0; Browse::IndexedTableView * indexView = 0; if ( args != 1 && args != 2) { return -1; } ServerBrowser::GetGameList()->Lock(); // enter crit section if ( (int)arg[0] == -1 ) { gameID = *((char **)arg[1]); } else { int index = *((int *) arg[0]); if ( ServerBrowser::GetGameList() == NULL ) { ServerBrowser::GetGameList()->Unlock(); // yuck. return -1; } indexView = ServerBrowser::GetGameList()->GetIndexedView(); if ( indexView->GetIndex( index, &gameID ) == false ) { ServerBrowser::GetGameList()->Unlock(); // yuck. return -1; } } if ( !gameID ) { // not able to find the game named in GameName variable goto CLEANUP; } pList = ServerBrowser::GetGameList()->GetPlayerList( gameID ); const char *p; int iNumPlayers; int iNumBots; int iMaxPlayers; p = ServerBrowser::GetGameList()->GetDataField(gameID, GAMELIST_KEY_NUM_PLAYERS); iNumPlayers = (p) ? atoi(p) : 0; if (iNumPlayers > 16) iNumPlayers = 16; p = ServerBrowser::GetGameList()->GetDataField(gameID, GAMELIST_KEY_NUM_BOTS); iNumBots = (p) ? atoi(p) : 0; if (iNumBots > iNumPlayers) iNumBots = iNumPlayers; p = ServerBrowser::GetGameList()->GetDataField(gameID, GAMELIST_KEY_MAX_PLAYERS); iMaxPlayers = (p) ? atoi(p) : 0; indexView = pList->GetIndexedView(); for (i = 0; i < indexView->GetCount(); i++) { char * playerID; if ( indexView->GetIndex( i, &playerID ) == false ) { PAUSE(( "Unable to find playerID for index %d", i )); continue; } const char * playerName = pList->GetDataField(playerID, PLAYERLIST_KEY_PLAYER_NAME ); if ( playerName ) { strncpy(ListOfPlayers[count], playerName, 19); ListOfPlayers[count][19] = 0; // mdm - clan name support - temporary const char * clanName = pList->GetDataField(playerID, PLAYERLIST_KEY_CLAN_NAME ); ListOfClans[count][0] = 0; if ( clanName ) { strncpy(ListOfClans[count], clanName, 19); ListOfClans[count][19] = 0; } count++; } if (count >= 16) { break; } } for ( ; i < (iNumPlayers-iNumBots) ; i++) { strncpy(ListOfPlayers[count], "Unknown Human", 19); ListOfPlayers[count][19] = 0; strncpy(ListOfClans[count], "Unknown Clan", 19); ListOfClans[count][19] = 0; count++; if (count >= 16) { break; } } for ( ; i < iNumPlayers ; i++) { strncpy(ListOfPlayers[count], "Unknown Bot", 19); ListOfPlayers[count][19] = 0; strncpy(ListOfClans[count], "Unknown Clan", 19); ListOfClans[count][19] = 0; count++; if (count >= 16) { break; } } if (count > 16) count = 16; NumberOfPlayers = count; CLEANUP: ServerBrowser::GetGameList()->Unlock(); // leave critical section return 0; } //======================================================================== // Returns the total number of games known to exist, even those that // are currently filtered out of the list. //======================================================================== SCRIPTCALLBACK(GetTotalGameCount) { if ( ServerBrowser::GetGameList() == NULL ) { return 0; } return ServerBrowser::GetGameList()->GetTotalCount(); } //======================================================================== // Update the list of GUN games. This should only be called by // the GUNTech scripts, LAN scripts should invoke UpdateGameList. //======================================================================== SCRIPTCALLBACK(UpdateGUNGameList) { if (ServerBrowser::GetGameList() == NULL) return 0; ServerBrowser::GetGameList()->Lock(); // enter crit section Browse::IndexedTableView * indexView = ServerBrowser::GetGameList()->GetIndexedView(); gosASSERT(indexView); NumberOfGames = indexView->GetCount(); ServerBrowser::GetGameList()->Unlock(); // leave crit. section return 1; } ////======================================================================== //// Update the list of games - if GunTech don't use this, use //// UpdateGUNGameList instead. ////======================================================================== //SCRIPTCALLBACK(UpdateGameList) //{ // NumberOfGames=(DWORD)gos_NetInformation( gos_NumberOfGames ); // // if( NumberOfGames>19 ) // NumberOfGames=19; // // // // // get the LAN games // // // for( int t0=0; t0GetEntry(OPTION_DEFAULTSERVERNAME, (const char **)&s, false)) { strcpy(GameName, s); } else { sprintf(GameName, Application::GetInstance()->GetLocString(IDS_NETUI_GAMENAME), (char *)MWApplication::GetInstance()->m_pilotName); } startup_ini.Save(); return 0; } //======================================================================== // Sets the global variable 'PlayerName' to the default player name. //======================================================================== SCRIPTCALLBACK(SetPlayerNameDefault) { char szPlayerName[256]; szPlayerName[0]=0; if (true) { #if 0 // // prepare to read from options file // NotationFile startup_ini(OPTIONS_INI, NotationFile::Standard, true); Page *page = startup_ini.SetPage(OPTIONS_SECTION); char *s; // player name if (page->GetEntry(OPTION_PLAYERNAME, (const char **)&s, false)) { strcpy(szPlayerName, s); } else { strcpy(szPlayerName, MWApplication::GetInstance()->m_pilotName); //DWORD dwSize = sizeof(szPlayerName); //GetComputerNameA(szPlayerName, &dwSize); } #endif strcpy(szPlayerName, (char *)MW4Shell::Instance->m_optionsObject->m_playerName); #ifdef LAB_ONLY // 8/9/2000 MJL // removing this, because we can now change player names, so it // is no longer necessary for you to need extra random characters // added to your name #ifdef MLYONS if (true) { char szRandomNumber[12]; unsigned int low_ticks; // // I basically want a random number here, so I get the low 32 bits // of the time stamp counter, a number that increments once for every // tick the CPU makes. // __asm { lea ecx, low_ticks ; load a pointer to the variable rdtsc ; read time-stamp counter mov ds:[ecx+0], eax ; store the value //mov ds:[ecx+4], edx ; in the variable } // // now, I use that tick count to make two random letters // sprintf(szRandomNumber, "_%c%c", 'a' + low_ticks % 26, 'a' + (low_ticks/26)%26); strcat(szPlayerName, szRandomNumber); } #endif #endif } StringPurgeAndDuplicate(PlayerName, szPlayerName); return 0; } int MechMessageBoxWin32(char *szTitle, char *szMessage, unsigned int uType=0); //======================================================================== //======================================================================== void MechMessageBox(char *szTitle, char *szMessage) { if (!MWApplication::GetInstance()->Win32DedicatedServer) { SCRIPTVAR_STR(MessageBoxTitle); SCRIPTVAR_STR(MessageBoxMessage); MessageBoxTitle = (char *)gos_Malloc(1024); MessageBoxMessage = (char *)gos_Malloc(1024); strncpy(MessageBoxTitle, szTitle, 1024); strncpy(MessageBoxMessage, szMessage, 1024); gosScript_RegisterVariable( "MessageBoxTitle", &MessageBoxTitle, GOSVAR_STRING, 0, 0); gosScript_RegisterVariable( "MessageBoxMessage", &MessageBoxMessage, GOSVAR_STRING, 0, 0); gosScript_ExecuteScript(SHELLSCRIPTS_PATH"MessageBox.script", 0x2000); gosScript_UnregisterVariable( "MessageBoxTitle", 0); gosScript_UnregisterVariable( "MessageBoxMessage", 0); } else { ::MechMessageBoxWin32(szMessage, szTitle); } } //======================================================================== //======================================================================== int __stdcall Mech4CreateGame(char *szGameName, char *szPlayerName, char *szPassword) { if (true) { // // load the default connection // if (AdvertiseThisGame) { if (!ServerBrowser::IPX) { #ifdef USE_GAMESPY #ifdef NEW_GAMESPY if (conDefault.bBrowseGameSpy) #endif InitGameSpyServerAdvertiser(NULL); #endif if (conDefault.bBrowseGUN) InitGUNServerAdvertiser(); #ifdef USE_GAMESPY for (int i=0 ; iGetEntry("OverridePingDecision", &szOverridePingDecision)) { // the OverridePingDecision setting is present in the ini file, check the value // set the value to true if the numerical value is not zero bPingOverridden = (atoi(szOverridePingDecision) != 0); // // now, if it's true, go ahead and see whether we should allow pings if (bPingOverridden) { if (page->GetEntry("AllowPing", &szAllowPing)) { // Allow pings if the numerical value is not zero bAllowPing = (atoi(szAllowPing) != 0); } else { // the AllowPing setting isn't present, so go ahead // and set the bPingOverride value back to false so that // we can choose whether to allow Pings. bPingOverridden = false; } } } } } // // mdm - this comment outlines what this code should be if there is the ability // for an override of ping time behavior when hosting in the options.ini // if ( bPingOverridden ) { if ( bAllowPing == false ) dwFlags |= NETFLAGS_NOPING_FLAG; } else { // enabled code below inside the else if ( conDefault.connectiontype < MechWarrior4::MWApplication::xDSL ) { // mdm - turn off pings if connection type is modem or isdn dwFlags |= NETFLAGS_NOPING_FLAG; } } //dwFlags |= NETFLAGS_PURESERVER_FLAG; int result = gos_CreateGame( szGameName, szPlayerName, Environment.NetworkMaxPlayers, szPassword, gInSecureGame!=0,NGPassword, dwFlags ); if ( result == 0 ) { // create game went ok -- check if any advertising problems if ( ServerAdvertiser::GetAdvertiseOK() == false ) { MechMessageBox(Application::GetInstance()->GetLocString(IDS_NETUI_ERROR), Application::GetInstance()->GetLocString(IDS_NETUI_ADVERTISE_ERROR)); } } else { // create game failed! Script will display an error dialog, we just need to clean up and return // mdm - must remove the server advertisers from the list ServerAdvertiser::ReleaseAll(); return result; } if (gos_NetInformation(gos_MyIPAddress)) StringPurgeAndDuplicate(LocalIPAddress, (char *)gos_NetInformation(gos_MyIPAddress)); else LocalIPAddress[0]=0; // mdm - host must advertise his clan name manually since he doesn't get a RequestConnectionMessageHandler callback const char *my_clan_name = "\0"; NotationFile options_ini(OPTIONS_SECTION, NotationFile::Standard, true); Page *page = options_ini.FindPage(OPTIONS_SECTION); if (page) { page->GetEntry("TeamName", &my_clan_name); } int size = strlen(my_clan_name)+1; Max_Clamp(size, 255); // get our dplay id int myID = (DWORD) gos_NetInformation( gos_MyID, 0, NULL ); gosASSERT(myID); ServerAdvertiser::AdvertiseItem( myID, PLAYERLIST_KEY_CLAN_NAME, my_clan_name); return result; } //======================================================================== //======================================================================== int __stdcall Mech4ReconnectGame() { if (AdvertiseThisGame) { if (!ServerBrowser::IPX) { if (conDefault.bBrowseGUN) { ServerAdvertiser::ReleaseAll(); InitGUNServerAdvertiser(); InitLANServerAdvertiser(); } else return true; } else return true; } else return true; DWORD dwFlags = 0; dwFlags |= (conDefault.connectiontype & NETFLAGS_CONNECTION_TYPE_MASK); int param; int *pp=¶m; param=DEDICATED_SERVER_PARAMETER; if (MW4Shell::GetLocalNetworkMissionParamater(0, 0, (void **)&pp)) dwFlags |= NETFLAGS_DEDICATED_FLAG; param=REPORTSTATS_PARAMETER; if (MW4Shell::GetLocalNetworkMissionParamater(0, 0, (void **)&pp)) dwFlags |= NETFLAGS_STATSTRACKING_FLAG; param=CLOSED_GAME_PARAMETER; if (MW4Shell::GetLocalNetworkMissionParamater(0, 0, (void **)&pp)) dwFlags |= NETFLAGS_LOCKED_FLAG; // mdm - by default, modems and isdn don't want clients to ping them // // bPingOverriden indicates whether we should override our own decision // of whether or not to allow clients to ping us. // // bPing indicates whether pings are allowed, but is only relevant if // bPingOverridden is true // bool bPingOverridden = false; bool bAllowPing = false; if (true) { const char * szOverridePingDecision; const char * szAllowPing; Page * page; NotationFile options_ini(OPTIONS_INI, NotationFile::Standard, true); page = options_ini.FindPage(OPTIONS_SERVER_SECTION); if (page) { // the page is present in the ini file if (page->GetEntry("OverridePingDecision", &szOverridePingDecision)) { // the OverridePingDecision setting is present in the ini file, check the value // set the value to true if the numerical value is not zero bPingOverridden = (atoi(szOverridePingDecision) != 0); // // now, if it's true, go ahead and see whether we should allow pings if (bPingOverridden) { if (page->GetEntry("AllowPing", &szAllowPing)) { // Allow pings if the numerical value is not zero bAllowPing = (atoi(szAllowPing) != 0); } else { // the AllowPing setting isn't present, so go ahead // and set the bPingOverride value back to false so that // we can choose whether to allow Pings. bPingOverridden = false; } } } } } // // mdm - this comment outlines what this code should be if there is the ability // for an override of ping time behavior when hosting in the options.ini // if ( bPingOverridden ) { if ( bAllowPing == false ) dwFlags |= NETFLAGS_NOPING_FLAG; } else { // enabled code below inside the else if ( conDefault.connectiontype < MechWarrior4::MWApplication::xDSL ) { // mdm - turn off pings if connection type is modem or isdn dwFlags |= NETFLAGS_NOPING_FLAG; } } gos_ReConnectGame( dwFlags ); if ( ServerAdvertiser::GetAdvertiseOK() == false ) { ServerAdvertiser::ReleaseAll(); return false; } if (gos_NetInformation(gos_MyIPAddress)) StringPurgeAndDuplicate(LocalIPAddress, (char *)gos_NetInformation(gos_MyIPAddress)); else LocalIPAddress[0]=0; // mdm - host must advertise his clan name manually since he doesn't get a RequestConnectionMessageHandler callback const char *my_clan_name = "\0"; NotationFile options_ini(OPTIONS_SECTION, NotationFile::Standard, true); Page *page = options_ini.FindPage(OPTIONS_SECTION); if (page) { page->GetEntry("TeamName", &my_clan_name); } int size = strlen(my_clan_name)+1; Max_Clamp(size, 255); // get our dplay id int myID = (DWORD) gos_NetInformation( gos_MyID, 0, NULL ); gosASSERT(myID); ServerAdvertiser::AdvertiseItem( myID, PLAYERLIST_KEY_CLAN_NAME, my_clan_name); MWApplication *app = MWApplication::GetInstance(); #if 0 for (int i = 1; i < Maximum_Connection_Numbers; i++) { Connection * pConnectObj = Network::GetInstance()->GetConnection(i); if (pConnectObj) { ServerAdvertiser::AddPlayerAll(pConnectObj->GetNetworkAddress(), pConnectObj->GetConnectionName()); Check_Object(pConnectObj); // all players are registered with ServerAdvertisers in GameOS when the dplay // AddPlayer message arrives. GUN registers the player using their dplay ID // as their unique identifier. // this if check is to avoid multithreading problem. if (app->servedConnectionData[i].clanName != NULL) { ServerAdvertiser::AdvertiseItem( pConnectObj->GetNetworkAddress(), // player ID; 0 = server PLAYER_CLAN_NAME_KEY, // key name app->servedConnectionData[i].clanName); // key val } } } #else // Need to add back all the players AND bots for (int connection = 0; connection < Maximum_Players; ++connection) { if (app->servedConnectionData[connection].clientConnected) { ServerAdvertiser::AddPlayerAll(connection, app->servedConnectionData[connection].pilotName); // this if check is to avoid multithreading problem. if (app->servedConnectionData[connection].clanName != NULL) { if (!CTCL_IsConsole()) { gos_NetSetAdvertItem( connection, // player ID; 0 = server PLAYER_CLAN_NAME_KEY, // key name app->servedConnectionData[connection].clanName); // key val } } } } // Now add back the bots for (connection = 0; connection < Maximum_Lancemates; ++connection) { if (app->lancemateConnectionData[connection].lancemateConnected) { ServerAdvertiser::AddPlayerAll(connection+256, app->lancemateConnectionData[connection].lancemateName); // this if check is to avoid multithreading problem. if (app->lancemateConnectionData[connection].lancemateClan != NULL) { if (!CTCL_IsConsole()) { gos_NetSetAdvertItem( connection+256, // player ID; 0 = server PLAYER_CLAN_NAME_KEY, // key name app->lancemateConnectionData[connection].lancemateClan); // key val } } } } #endif return true; } //======================================================================== // //======================================================================== SCRIPTCALLBACK(CreateSession) { if (!GameName) { SetGameNameDefault(NULL,0,NULL); Environment.NetworkMaxPlayers = 4; GamePassword = NULL; gInSecureGame = false; } else { // // save the game name in the options.ini file // NotationFile startup_ini(OPTIONS_INI, NotationFile::Standard, true); Page *page = startup_ini.SetPage(OPTIONS_SERVER_SECTION); page->SetEntry(OPTION_DEFAULTSERVERNAME, GameName); startup_ini.Save(); } if ( !PlayerName ) { SetPlayerNameDefault( NULL, 0, NULL ); } return Mech4CreateGame(GameName, PlayerName, GamePassword); } //======================================================================== // Join a game (On a serial or modem game, enumerate the current game and join that) // // 0=OK // 1=Bad game name (or waiting for game on modem/serial) // 2=Bad player name // 3=Failed to connect // 4=No dial tone // 5=Invalid password // 6=Too many players in the game //======================================================================== SCRIPTCALLBACK(JoinSelected) { // test code to be used until the new UI is all ready to go if (!PlayerName) { SetPlayerNameDefault( NULL, 0, NULL ); } int result=gos_JoinGame( GameName, PlayerName, GamePassword, NGPassword); switch (result) { case 0: break; case 2: MechMessageBox(Application::GetInstance()->GetLocString(IDS_NETUI_ERROR), Application::GetInstance()->GetLocString(IDS_NETUI_JOIN_NOPLAYERNAME_ERROR)); break; case 1: case 3: case 4: MechMessageBox(Application::GetInstance()->GetLocString(IDS_NETUI_ERROR), Application::GetInstance()->GetLocString(IDS_NETUI_JOIN_ERROR)); break; break; case 5: MechMessageBox(Application::GetInstance()->GetLocString(IDS_NETUI_ERROR), Application::GetInstance()->GetLocString(IDS_NETUI_JOIN_PASSWORD_ERROR)); break; case 6: MechMessageBox(Application::GetInstance()->GetLocString(IDS_NETUI_ERROR), Application::GetInstance()->GetLocString(IDS_NETUI_JOIN_GAMELOCKED_ERROR)); break; case 7: MechMessageBox(Application::GetInstance()->GetLocString(IDS_NETUI_ERROR), Application::GetInstance()->GetLocString(IDS_NETUI_ICS)); break; } return result; } //======================================================================== // Hang up the line or disconnect a network game //======================================================================== SCRIPTCALLBACK(Disconnect) { if ( ServerBrowser::GetGameList() ) { ServerBrowser::GetGameList()->ShutdownPing(); } ServerBrowser::ReleaseAll(); ServerAdvertiser::ReleaseAll(); gos_Disconnect(); return true; } //======================================================================== // Open a TCPIP and ZoneMatch connection //======================================================================== SCRIPTCALLBACK(CheckZoneMatch) { return CheckForZoneMatch(); } //======================================================================== // Open a TCPIP and ZoneMatch connection //======================================================================== SCRIPTCALLBACK(CreateBrowsers) { // // load the default connection // if (conDefault.bBrowseLAN) { InitTCPIPServerBrowser(); InitIPXServerBrowser(); } for (int i=0 ; iGetDataField( gameID, GAMELIST_KEY_SERVER_INFO_STATUS ); if ( queryResult ) { int qr = atoi(queryResult); retval = qr; } else { // couldn't find server retval = atoi(GAMELIST_VALUE_SERVER_INFO_STATUS_NOSERVER); } CLEANUP: Browse::GameList::Unlock(); return retval; } //======================================================================== // GetServerInfo - get information for the selected server. This will // get player information //======================================================================== SCRIPTCALLBACK(GetServerInfo) { if ( args != 1 ) { return -1; } if ( ServerBrowser::GetGameList() == NULL ) { PAUSE(( "No game list object when GetServerInfo called.\n" )); return -1; // no game list object! } char * gameID = *(( char **) arg[0]); Browse::GameList::Lock(); bool retval = ServerBrowser::ServerInfo( gameID ); if (retval == false ) { // somehow, none of the browsers responded to the request for server info // for the game Browse::GameList::Unlock(); return -1; } Browse::GameList::Unlock(); return 0; } //======================================================================== // GetZMStatus // Get status information on the ZoneMatch connection. // argv[0] == 1 -> return current operational phase // argv[0] == 2 -> return current net status // argv[0] == 3 -> return last known error //======================================================================== SCRIPTCALLBACK(GetZMStatus) { if ( args != 1 ) { PAUSE(( "Invalid number of arguments (%d) to GetZMStatus().", args )); return 0; } int queryMode = (int)arg[0]; switch (queryMode) { case 1: // return current operational phase return GetGUNStatus(); break; case 2: // return current net status return GetGUNNetStatus(); break; case 3: // return last known error { int lastError = GetGUNLastError(); const char * errorMsg = GetGUNErrorMessage(); if ( errorMsg && ErrorMsg ) { strncpy(ErrorMsg, errorMsg, 254); ErrorMsg[255] = 0; } else if ( ErrorMsg ) { ErrorMsg[0] = 0; } return lastError; } break; default: return -1; break; } } //////////////////////////////////////////////////////////////////////////////////////// // SCRIPTCALLBACK() // Purpose: // Returns the total number of game servers to be downloaded for the current // update, or -1 if not known. // // Parameters: // [GetGUNDownloadSize] : // // Returns: none // // Change Log // Author MMDDYY Description // -------------------- ------ ------------------------------------------------ // Michael Moore 092200 Initial Version // // //////////////////////////////////////////////////////////////////////////////////////// SCRIPTCALLBACK(GetGUNDownloadSize) { int tableSize, progressCount; GetGUNDownloadStats(&tableSize, &progressCount); return tableSize; } //////////////////////////////////////////////////////////////////////////////////////// // SCRIPTCALLBACK() // Purpose: // Returns the total number of game servers currently received for the current // download, or -1 if not known. // // Parameters: // [GetGUNDownloadProgress] : // // Returns: none // // Change Log // Author MMDDYY Description // -------------------- ------ ------------------------------------------------ // Michael Moore 092200 Initial Version // // //////////////////////////////////////////////////////////////////////////////////////// SCRIPTCALLBACK(GetGUNDownloadProgress) { int tableSize, progressCount; GetGUNDownloadStats(&tableSize, &progressCount); return progressCount; } //======================================================================== // GetZMStatus // Get status information on the ZoneMatch connection. // argv[0] == 1 -> return current operational phase // argv[0] == 2 -> return current net status // argv[0] == 3 -> return last known error //======================================================================== SCRIPTCALLBACK(GetGameSpyStatus) { if ( args != 1 ) { PAUSE(( "Invalid number of arguments (%d) to GetZMStatus().", args )); return 0; } int queryMode = (int)arg[0]; switch (queryMode) { case 1: // return current operational phase return GameSpy::GetStatus(); break; case 2: // return current net status return GameSpy::GetNetStatus(); break; case 3: // return last known error return GameSpy::GetLastError(); break; default: return -1; break; } } //======================================================================== //======================================================================== SCRIPTCALLBACK(LoadMPConnectionSettings) { conDefault.dwVersion = (DWORD)-1; char *szFile; ConnectionIndex = 0; NumConnections = 0; if ((szFile=gos_FindFiles("m4c*.m4c")) != NULL) { ConnectionIndex = 0; do { StringPurgeAndDuplicate(ListOfConnections[NumConnections], szFile+3); ListOfConnections[NumConnections][strlen(ListOfConnections[NumConnections])-4] = 0; LoadConnection(&conDefault, ListOfConnections[NumConnections], false); if (conDefault.dwVersion == CONNECTION_FILE_VERSION) NumConnections++; if (NumConnections >= NUM_ELEMENTS) break; } while ((szFile=gos_FindFilesNext()) != NULL); gos_FindFilesClose(); } // // see if we have a default connection // if (true) { NotationFile startup_ini(OPTIONS_INI, NotationFile::Standard, true); Page *page = startup_ini.FindPage(OPTIONS_SECTION); if (!page) page = startup_ini.AddPage(OPTIONS_SECTION); char *s; if (page->GetEntry(OPTION_CONNECTIONNAME, (const char **)&s, false)) { for ( ; ConnectionIndex < NumConnections ; ConnectionIndex++) { if (!strcmp(ListOfConnections[ConnectionIndex], s)) break; } if (ConnectionIndex == NumConnections) ConnectionIndex = 0; } startup_ini.Save(); } return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(SaveMPConnectionSettings) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(InitMainMPScreen) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(InitNewConnectionScreen) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(InitBrowseChoiceScreen) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(InitServerListScreen) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(AddServer) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(SelectServer) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(JoinGame) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(HostGame) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(GetDialupConnectionStatus) { if (conDefault.bAlreadyConnected) return 3; return RAS::GetStatus(DialupConnectionStatus); } //======================================================================== //======================================================================== SCRIPTCALLBACK(PreConnect) { LoadConnection(&conDefault, ListOfConnections[ConnectionIndex], true); BrowseGameSpy = conDefault.bBrowseGameSpy; BrowseGUN = conDefault.bBrowseGUN; BrowseLAN = conDefault.bBrowseLAN; BrowseIPAddresses = conDefault.iNumTCPIP; kldi61 = conDefault.bAlreadyConnected; MWApplication::MyConnectionSpeed = conDefault.bandwidth; MWApplication::MyConnectionType = conDefault.connectiontype; if (conDefault.bAlreadyConnected == 0) RAS::Dial(conDefault.szPhonebookEntryName, conDefault.szUserName, conDefault.szPassword); return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(CancelDialup) { return RAS::HangUp(); } //======================================================================== //======================================================================== SCRIPTCALLBACK(RemoveConnection) { // // don't remove if there's only one connection // if (NumConnections < 2) return -1; // // step 1: remove the file // char szFileName[256]; strcpy(szFileName, "m4c"); strcat(szFileName, ListOfConnections[ConnectionIndex]); strcat(szFileName, ".m4c"); gos_DeleteFile(szFileName); // // step 2: adjust the list by moving every name beyond this // connection down one // for (int i=ConnectionIndex ; i+1GetLocString(IDS_NETUI_ERROR), Application::GetInstance()->GetLocString(IDS_NETUI_NODIALUP_ERROR)); } NumDUN = RAS::GetListOfEntries(ListOfDUN); return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(QuickJoin) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(GetHostOptions) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(GetFilterOptions) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(RefreshGameList) { return ServerBrowser::RefreshList(); } //======================================================================== //======================================================================== SCRIPTCALLBACK(UpdateGameList) { if ( args == 1 ) { int handle = (int) arg[0]; if ( handle < -1 || handle > 9999) { handle = *( int *) arg[0]; } ServerBrowser::Update( handle ); } else { ServerBrowser::Update(); } return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(CancelActivity) { ServerBrowser::CancelAllActivity(); return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(IsGameListUpdating) { return (int)ServerBrowser::StillBusy(); } //======================================================================== //======================================================================== SCRIPTCALLBACK(ChatSend) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(FillPlayerRosterMechType) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(FillMechTypes) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(FillGameSettings) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(GetRASEntryUserNameAndPassword) { FreeString(DUNUserName); FreeString(DUNPassword); AllocString(DUNUserName); AllocString(DUNPassword); RAS::GetUserNameAndPassword(ListOfDUN[DUNIndex], DUNUserName, DUNPassword); return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(kldc12) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(kldc13) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(kldc14) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(kldc15) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(kldc16) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(kldc17) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(kldc18) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(kldc19) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(kldc20) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(kldc21) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(kldc22) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(kldc23) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(kldc24) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(kldc25) { return 0; } //======================================================================== //======================================================================== SCRIPTCALLBACK(BrowseIPAddress) { gosASSERT(args == 1); char ** szIPAddress = (char **)arg[0]; // // add the address to the default connection // if (conDefault.iNumTCPIP < ARRAY_SIZE(conDefault.szTCPIPAddress)) { strncpy(conDefault.szTCPIPAddress[conDefault.iNumTCPIP], *szIPAddress, sizeof(conDefault.szTCPIPAddress[conDefault.iNumTCPIP])); FixSZString(conDefault.szTCPIPAddress[conDefault.iNumTCPIP]); conDefault.iNumTCPIP++; SaveConnection(&conDefault); } int handle = InitTCPIPServerBrowser(*szIPAddress); #ifdef USE_GAMESPY InitGameSpyServerBrowser(*szIPAddress); #endif return handle; } //======================================================================== // gos_NetStartGame // // This gets called as soon as the user clicks "Multiplayer." After this // point, the app waits until we tell it we're ready to go. //======================================================================== bool __stdcall gos_NetStartGame( char* GameOptionsScript, bool Secure ) { // avoid compiler warning GameOptionsScript=GameOptionsScript; RAS::InitializeLibrary(); // store secure state gInSecureGame=Secure; // initialize GameOS variables gos_InitializeNetworking(); // clean up anything we may have previously allocated UnRegisterData(); // RegisterData(); // get the ip address // FreeString(LocalIPAddress); // jcem AllocString(LocalIPAddress); if (MWApplication::GetInstance()->Win32DedicatedServer) return 1; // // // OLD UI!! // gosScript_RegisterCallback( "CheckZoneMatch", &CheckZoneMatch, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetPlayerList", &GetPlayerList, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "UpdateGUNGameList", &UpdateGUNGameList, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "JoinSelected", &JoinSelected, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetTotalGameCount", &GetTotalGameCount, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "CreateSession", &CreateSession, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "Disconnect", &Disconnect, GOSVAR_INT, 0, NetworkInstance ); // gamelist api callbacks gosScript_RegisterCallback( "GetGameData", &GetGameData, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "SortGameList", &SortGameList, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "Select", &Select, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetSelection", &GetSelection, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetListSize", &GetListSize, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetReferenceVersion", &GetReferenceVersion, GOSVAR_INT, 0, NetworkInstance ); // ping control callbacks gosScript_RegisterCallback( "StartPingServer", &StartPingServer, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "StartPingClient", &StartPingClient, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "ShutdownPing", &ShutdownPing, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetPing", &GetPing, GOSVAR_INT, 0, NetworkInstance ); // misc callbacks gosScript_RegisterCallback( "SetGameNameDefault", &SetGameNameDefault, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "SetPlayerNameDefault", &SetPlayerNameDefault, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "InitConnectionWizard", &InitConnectionWizard, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "TermConnectionWizard", &TermConnectionWizard, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "LaunchDUNWizard", &LaunchDUNWizard, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetDialupConnectionStatus",&GetDialupConnectionStatus, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "PreConnect", &PreConnect, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "CancelDialup", &CancelDialup, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "CreateNewPhonebookEntry", &CreateNewPhonebookEntry, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetZMStatus", &GetZMStatus, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetGameSpyStatus", &GetGameSpyStatus, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetServerInfo", &GetServerInfo, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetServerInfoStatus", &GetServerInfoStatus, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetGUNDownloadSize", &GetGUNDownloadSize, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetGUNDownloadProgress", &GetGUNDownloadProgress, GOSVAR_INT, 0, NetworkInstance ); // // Callbacks for Filter support // gosScript_RegisterCallback( "ApplyFilters", &ApplyFilters, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "SaveFilters", &SaveFilters, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "RevertFilters", &RevertFilters, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "ClearFilters", &ClearFilters, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "SetFilterParam", &SetFilterParam, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetFilterParam", &GetFilterParam, GOSVAR_INT, 0, NetworkInstance ); // // Callbacks for Sorting support // gosScript_RegisterCallback( "SaveSortInfo", &SaveSortInfo, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "GetSortInfo", &GetSortInfo, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterCallback( "BrowseIPAddress", &BrowseIPAddress, GOSVAR_INT, 0, NetworkInstance ); // // Integers passed between the UI and GameOS // gosScript_RegisterVariable( "gConnectionType", &gConnectionType, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterVariable( "NumberOfGames", &NumberOfGames, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterVariable( "NumberOfPlayers", &NumberOfPlayers, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterVariable( "Available", &Available, GOSVAR_INT, 0, NetworkInstance ); // gamelist scripting API int variables gosScript_RegisterVariable( "ServerPort", &g_APIVars.ServerPort, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "AdvertiseThisGame", &AdvertiseThisGame, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterVariable( "LocalIPAddress", &LocalIPAddress, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "LocalGameVersion", &Environment.version, GOSVAR_STRING, 0, NetworkInstance ); // // Strings // gosScript_RegisterVariable( "ReferenceVersion", &ReferenceVersion, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "GameName", &GameName, GOSVAR_STRING, 0, NetworkInstance ); // gosScript_RegisterVariable( "PlayerName", &PlayerName, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "ServerIPAddress", &ServerIPAddress, GOSVAR_STRING, 0, NetworkInstance ); // gosScript_RegisterVariable( "NGPassword", &NGPassword, GOSVAR_STRING, 0, NetworkInstance ); // gamelist scripting API string variables gosScript_RegisterVariable( "NumPlayers", &g_APIVars.NumPlayers, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "MaxPlayers", &g_APIVars.MaxPlayers, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "GameID", &GameDataID, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "GameVersion", &g_APIVars.GameVersion, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "ServerAddress", &g_APIVars.ServerAddress, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "ServerName", &g_APIVars.ServerName, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "PasswordStatus", &g_APIVars.PasswordStatus, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "MapType", &g_APIVars.MapType, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "GameType", &g_APIVars.GameType, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "Protocol", &g_APIVars.Protocol, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterVariable( "ConnectionType", &g_APIVars.ConnectionType, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterVariable( "Dedicated", &g_APIVars.Dedicated, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterVariable( "StatsTracking", &g_APIVars.StatsTracking, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterVariable( "PureServer", &g_APIVars.PureServer, GOSVAR_INT, 0, NetworkInstance ); gosScript_RegisterVariable( "Locked", &g_APIVars.Locked, GOSVAR_INT, 0, NetworkInstance ); // // Arrays of strings // gosScript_RegisterVariable( "ListOfPlayers", &ListOfPlayers, GOSVAR_STRING, NUM_ELEMENTS, NetworkInstance ); gosScript_RegisterVariable( "ListOfClans", &ListOfClans, GOSVAR_STRING, NUM_ELEMENTS, NetworkInstance ); gosScript_RegisterCallback( "LoadMPConnectionSettings", &LoadMPConnectionSettings, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterCallback( "CreateBrowsers", &CreateBrowsers, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "ConnectionIndex", &ConnectionIndex, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "NumConnections", &NumConnections, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "AmIOnDialUpDefault", &AmIOnDialUpDefault, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "BrowseGameSpy", &BrowseGameSpy, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "BrowseGUN", &BrowseGUN, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "BrowseLAN", &BrowseLAN, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "BrowseIPAddresses", &BrowseIPAddresses, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "NumIPAddresses", &NumIPAddresses, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "NumServers", &NumServers, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "ListOfConnections", &ListOfConnections, GOSVAR_STRING, NUM_ELEMENTS, NetworkInstance); gosScript_RegisterVariable( "ListOfIPAddresses", &ListOfIPAddresses, GOSVAR_STRING, NUM_ELEMENTS, NetworkInstance); gosScript_RegisterVariable( "ListOfServers", &ListOfServers, GOSVAR_STRING, NUM_ELEMENTS, NetworkInstance); gosScript_RegisterVariable( "ServerInfo", &ServerInfo, GOSVAR_STRING, NUM_ELEMENTS, NetworkInstance); gosScript_RegisterVariable( "UseDUN", &UseDUN, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "NumDUN", &NumDUN, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "ListOfDUN", &ListOfDUN, GOSVAR_STRING, NUM_ELEMENTS, NetworkInstance); gosScript_RegisterVariable( "DUNIndex", &DUNIndex, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "DUNUserName", &DUNUserName, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "DUNPassword", &DUNPassword, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "DialupConnectionStatus", &DialupConnectionStatus, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "ZoneServerAddress", &Environment.ZoneMatchServerIP, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "GameSpyServerAddress", &GameSpyAddress, GOSVAR_STRING, 0, NetworkInstance ); gosScript_RegisterVariable( "MaxPlayerLimit", &Environment.NetworkMaxPlayers, GOSVAR_INT, 0, NetworkInstance ); ////////////////////////////////// // mdm // Variables for the filter screen ////////////////////////////////// gosScript_RegisterVariable( "kldi02", &iDedicated, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "kldi03", &bPasswordProtected, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "kldi30", &kldi30, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "kldi61", &kldi61, GOSVAR_INT, 0, NetworkInstance); // sort and filter registered vars gosScript_RegisterVariable( "SortColumnID", &SortColumnID, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "SortDescending", &SortDescending, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "SortColumnName", &SortColumnName, GOSVAR_STRING, 0, NetworkInstance); gosScript_RegisterVariable( "SortType", &SortType, GOSVAR_STRING, 0, NetworkInstance); gosScript_RegisterVariable( "FilterParamVal", &FilterParamVal, GOSVAR_STRING, 0, NetworkInstance); gosScript_RegisterVariable( "PingTimeStr", &PingTimeStr, GOSVAR_STRING, 0, NetworkInstance); gosScript_RegisterVariable( "GamePassword", &GamePassword, GOSVAR_STRING, 0, NetworkInstance); gosScript_RegisterVariable( "ErrorMsg", &ErrorMsg, GOSVAR_STRING, 0, NetworkInstance); gosScript_RegisterVariable( "klds07", &klds07, GOSVAR_STRING, 0, NetworkInstance); gosScript_RegisterVariable( "klda18", &ListOfTCPIPAddresses, GOSVAR_STRING, NUM_ELEMENTS, NetworkInstance); gosScript_RegisterCallback( "kldc01", &RemoveConnection, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterCallback( "kldc02", &QuickJoin, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterCallback( "kldc03", &GetHostOptions, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterCallback( "kldc04", &GetFilterOptions, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterCallback( "RefreshGameList", &RefreshGameList, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterCallback( "UpdateGameList", &UpdateGameList, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterCallback( "CancelActivity", &CancelActivity, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterCallback( "IsGameListUpdating", &IsGameListUpdating, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterCallback( "kldc07", &ChatSend, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterCallback( "kldc08", &FillPlayerRosterMechType, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterCallback( "kldc09", &FillMechTypes, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterCallback( "kldc10", &FillGameSettings, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterCallback( "kldc11", &GetRASEntryUserNameAndPassword, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "bandwidth", &conDefault.bandwidth, GOSVAR_INT, 0, NetworkInstance); gosScript_RegisterVariable( "NetHardware" , &conDefault.connectiontype, GOSVAR_INT, 0, NetworkInstance); // jcem - start if (CTCL_IsConsole() || g_bCOOP) { CancelDialup(NetworkInstance, 0, NULL); LoadMPConnectionSettings(NetworkInstance, 0, NULL); InitConnectionWizard(NetworkInstance, 0, NULL); ConnectionIndex = 0; PreConnect(NetworkInstance, 0, NULL); #if 0 gosScript_ExecuteScript( SHELLSCRIPTS_PATH"Multiplayer\\Hostgame1.script", 0x1000, NetworkInstance); gosScript_ExecuteScript( SHELLSCRIPTS_PATH"Mouse.script", 0x1700); #endif } else if (CTCL_GetType() != _ECTCL_None) { // game or cameraship } else { // jcem - end gosScript_ExecuteScript( SHELLSCRIPTS_PATH"Multiplayer\\MultiplayerConsole.script", 0x1200, NetworkInstance); gosScript_ExecuteScript( SHELLSCRIPTS_PATH"Mouse.script", 0x1700); // jcem - start } // jcem - end return 1;//gConnectionType!=-1; } //======================================================================== //======================================================================== void __stdcall gos_NetEndGame() { RAS::TerminateLibrary(); ServerBrowser::ReleaseAll(); ServerAdvertiser::ReleaseAll(); UnRegisterData(); gos_ShutdownNetwork(); FreeString(LocalIPAddress); } bool __stdcall gos_NetDoneStartGame() { UnRegisterData(); return 1; } //======================================================================== //======================================================================== bool StringPurgeAndDuplicate(char * &szDest, const char *szSrc) { gosASSERT(szSrc != NULL); if (szDest) { gos_Free(szDest); szDest=NULL; } int size=strlen(szSrc); szDest = (char *)gos_Malloc(size+1); if (szDest) { strcpy(szDest, szSrc); return true; } return false; } //======================================================================== //======================================================================== bool __stdcall PrepareDefaultServerAdvertisers(void) { UnRegisterData(); RegisterData(); LoadMPConnectionSettings(NULL, 0, NULL); InitConnectionWizard(NULL, 0, NULL); return true; }