bool CServerRemoteAccess::LookupValue(const char *variable, CUtlBuffer &value) { const char* strval = LookupStringValue(variable); if (strval) { value.PutString(strval); value.PutChar(0); return true; } if (!Q_stricmp(variable, "stats")) { char stats[512]; GetStatsString(stats, sizeof(stats)); value.PutString(stats); value.PutChar(0); return true; } if (!Q_stricmp(variable, "banlist")) { GetUserBanList(value); return true; } if (!Q_stricmp(variable, "playerlist")) { GetPlayerList(value); return true; } if (!Q_stricmp(variable, "maplist")) { GetMapList(value); return true; } if (!Q_stricmp(variable, "uptime")) { value.PutInt(int(Sys_FloatTime() - Host_GetStartTime())); value.PutChar(0); return true; } if (!Q_stricmp(variable, "ipaddress")) { value.PutString(NET_AdrToString(net_local_adr)); value.PutChar(0); return true; } if (!Q_stricmp(variable, "mapcycle")) { int len; void* mapcyclelist = COM_LoadFileForMe(mapcyclefile.string, &len); if (mapcyclelist && len) { value.PutString((char*)mapcyclelist); value.PutChar(0); COM_FreeFile(mapcyclelist); } return true; } value.PutChar(0); return false; }
//----------------------------------------------------------------------------- // Purpose: Finds the value of a particular server variable //----------------------------------------------------------------------------- bool CServerRemoteAccess::LookupValue(const char *variable, CUtlBuffer &value) { Assert(value.IsText()); // first see if it's a cvar const char *strval = LookupStringValue(variable); if (strval) { value.PutString(strval); value.PutChar(0); } else if (!stricmp(variable, "stats")) { char stats[512]; GetStatsString(stats, sizeof(stats)); value.PutString(stats); value.PutChar(0); } else if (!stricmp(variable, "banlist")) { // returns a list of banned users and ip's GetUserBanList(value); } else if (!stricmp(variable, "playerlist")) { GetPlayerList(value); } else if (!stricmp(variable, "maplist")) { GetMapList(value); } else if (!stricmp(variable, "uptime")) { int timeSeconds = (int)(Plat_FloatTime()); value.PutInt(timeSeconds); value.PutChar(0); } else if (!stricmp(variable, "ipaddress")) { char addr[25]; Q_snprintf( addr, sizeof(addr), "%s:%i", net_local_adr.ToString(true), sv.GetUDPPort()); value.PutString( addr ); value.PutChar(0); } else if (!stricmp(variable, "mapcycle")) { ConVarRef mapcycle( "mapcyclefile" ); if ( mapcycle.IsValid() ) { // send the mapcycle list file FileHandle_t f = g_pFileSystem->Open(mapcycle.GetString(), "rb" ); if ( f == FILESYSTEM_INVALID_HANDLE ) return true; int len = g_pFileSystem->Size(f); char *mapcycleData = (char *)_alloca( len+1 ); if ( len && g_pFileSystem->Read( mapcycleData, len, f ) ) { mapcycleData[len] = 0; // Make sure it's null terminated. value.PutString((const char *)mapcycleData); value.PutChar(0); } else { value.PutString( "" ); value.PutChar(0); } g_pFileSystem->Close( f ); } } else { // value not found, null terminate value.PutChar(0); return false; } return true; }
boolean MouseHandler(Game *game, unsigned int mousePressed, int x, int y) { MSGERROR err; COORD coord; int i, j; int distance; int boardsize; int checker; CheckerState state; int playerID; PlayerList *plist; Player *player; if (!game) return 0; switch(game->gamestate) { case GAME_NEWGAME: ERRCALL(GetPlayerList(&game->board, &plist)); GetBoardSize(&game->board, &boardsize); distance = (BOARDGAME_MAXWIDTH-BOARDGAME_MINWIDTH)/boardsize/2; x += BOARDGAME_CHECKERSIZE/2; y += BOARDGAME_CHECKERSIZE/2; for(i=0; i<boardsize; i++) { for(j=0; j<8; j++) { GetCheckersBoardCoord(&coord, j, BOARDGAME_MAXWIDTH-i*distance*2); if (CheckMouseCollision(x, y, BOARDGAME_POSX+i*distance+coord.X, BOARDGAME_POSY+i*distance+coord.Y, 20, 20)) { ERRCALL(GetCurrentPlayerID(&game->board, &playerID)); ERRCALL(GetPlayerList(&game->board, &plist)); ERRCALL(GetPlayer(plist, playerID, &player)); if (game->deleteState == 1) { ERRCALL(DeleteChecker(&game->board, i, j, &playerID, &state)); switch(state) { case CHECKERSTATE_SUCCESS: game->deleteState = 0; ERRCALL(GetCheckerCount(&game->board, playerID, &checker)); if (checker < 3) { game->infomessage = 150; game->dieplayerevent = 0; game->diedplayer = playerID; ERRCALL(KickPlayer(plist, playerID)); ERRCALL(CheckVictory(&game->board, &state)); if (state == CHECKERSTATE_VICTORY) { MessageBox(game->hWnd, "Congratulazioni, hai vinto!", "Vittoria", MB_ICONINFORMATION); Victory(game); return 0; } } NextRoundHandler(game); break; } } else if (player->tableCheckersCount > 0) // Se il numero di pedine fuori il campo è maggiore di 0, allora le sposta nel campo da gioco { ERRCALL(PutChecker(&game->board, i, j, playerID, &state)); // Imposta una pedina switch(state) { case CHECKERSTATE_ALREADYUSED: break; case CHECKERSTATE_SUCCESS: NextRoundHandler(game); break; case CHECKERSTATE_TRIS: game->deleteState = 1; break; } } else // altrimenti muove le pedine già esistenti { ERRCALL(GetChecker(&game->board, i, j, &checker)); if (checker != CHECKER_EMPTY) // E' stato selezionato un nodo già occupato { if (checker == playerID) // Controlla se la pedina selezionata in quel punto appartiene al giocatore che deve prendere la pedina { game->isCheckerSelected = 1; // Ora che la pedina è stata selezionata, ci si prepara per il movimento game->gameMoveCheckerIndex = i; // Coordinate della pedina selezionata game->gameMoveCheckerPosition = j; // Coordinate della pedina selezionata } } } return 1; } } } break; } return 0; }