extern int RelationalUpdatePlayerDetails(const char* oldName, const char* newName, const char* newNotes) { int ret = FALSE; int exist_id, player_id; DBProvider *pdb; if ((pdb = ConnectToDB(dbProviderType)) == NULL) return FALSE; player_id = GetPlayerId(pdb, oldName); exist_id = GetPlayerId(pdb, newName); if (exist_id != player_id && exist_id != -1) { /* Can't change the name to an existing one */ outputerrf( _("New player name already exists.") ); } else { char *buf = g_strdup_printf("UPDATE player SET name = '%s', notes = '%s' WHERE player_id = %d", newName, newNotes, player_id); if (pdb->UpdateCommand(buf)) { ret = 1; pdb->Commit(); } else outputerrf( _("Error running database command") ); g_free(buf); } pdb->Disconnect(); return ret; }
void CGameServerChannel::Cleanup() { m_pServerNub->RemoveChannel(GetChannelId()); if (GetPlayerId()) { gEnv->pEntitySystem->RemoveEntity( GetPlayerId(), true ); } }
void ClientSession::OnRead(size_t len) { mRecvBuffer.Commit(len); /// 패킷 파싱하고 처리 while (true) { /// 패킷 헤더 크기 만큼 읽어와보기 PacketHeader header; if (false == mRecvBuffer.Peek((char*)&header, sizeof(PacketHeader))) return; /// 패킷 완성이 되는가? if (mRecvBuffer.GetStoredSize() < (size_t) header.mSize) return; if (header.mType >= PKT_MAX || header.mType <= PKT_NONE) { printf("[DEBUG] Invalid packet type", GetPlayerId()); Disconnect(); return; } /// packet dispatch... HandlerTable[header.mType](this); } }
void RoboCatServer::Update() { RoboCat::Update(); Vector3 oldLocation = GetLocation(); Vector3 oldVelocity = GetVelocity(); float oldRotation = GetRotation(); ClientProxyPtr client = NetworkManagerServer::sInstance->GetClientProxy( GetPlayerId() ); if( client ) { MoveList& moveList = client->GetUnprocessedMoveList(); for( const Move& unprocessedMove : moveList ) { const InputState& currentState = unprocessedMove.GetInputState(); float deltaTime = unprocessedMove.GetDeltaTime(); ProcessInput( deltaTime, currentState ); SimulateMovement( deltaTime ); } moveList.Clear(); } HandleShooting(); if( !RoboMath::Is2DVectorEqual( oldLocation, GetLocation() ) || !RoboMath::Is2DVectorEqual( oldVelocity, GetVelocity() ) || oldRotation != GetRotation() ) { NetworkManagerServer::sInstance->SetStateDirty( GetNetworkId(), ECRS_Pose ); } }
void PlayerServer::Update() { Player::Update(); Vector3 oldLocation = GetLocation(); Vector3 oldVelocity = GetVelocity(); if ( mControlType == PCT_HUMAN ) { ClientProxyPtr client = NetworkManagerServer::sInstance->GetClientProxy( GetPlayerId() ); if ( !client ) { LOG( "NO HUMANC CONTROLING THIS, IT HAS BECOME SENTIENT RUN" ); return; } MoveList& moveList = client->GetUnprocessedMoveList(); for ( const Move& unprocessedMove : moveList ) { const InputState& currentState = unprocessedMove.GetInputState(); float deltaTime = unprocessedMove.GetDeltaTime(); ProcessInput( deltaTime, currentState ); SimulateMovement( TIME_STEP ); } moveList.Clear(); // TODO: Check if there velocity has actually changed before sending // update NetworkManagerServer::sInstance->SetStateDirty( GetNetworkId(), PRS_POSI ); } }
extern void CommandRelationalErase(char *sz) { char *mq, *gq, buf[1024]; DBProvider *pdb; char *player_name; int player_id; if (!sz || !*sz || ((player_name = NextToken(&sz)) == NULL)) { outputl( _("You must specify a player name to remove " "(see `help relational erase player').") ); return; } if ((pdb = ConnectToDB(dbProviderType)) == NULL) return; player_id = GetPlayerId(pdb, player_name); if (player_id == -1) { outputl (_("Player not found or player stats empty")); return; } /* Get all matches involving player */ mq = g_strdup_printf ("FROM session WHERE player_id0 = %d OR player_id1 = %d", player_id, player_id); /* first remove any gamestats and games */ gq = g_strdup_printf ("FROM game WHERE session_id in (select session_id %s)", mq); sprintf(buf, "DELETE FROM gamestat WHERE game_id in (select game_id %s)", gq); pdb->UpdateCommand(buf); sprintf(buf, "DELETE %s", gq); pdb->UpdateCommand(buf); /* Now remove any matchstats */ sprintf(buf, "DELETE FROM matchstat WHERE session_id in (select session_id %s)", mq); pdb->UpdateCommand(buf); /* then remove any matches */ sprintf(buf, "DELETE %s", mq); pdb->UpdateCommand(buf); /* then the player */ sprintf(buf, "DELETE FROM player WHERE player_id = %d", player_id); pdb->UpdateCommand(buf); g_free(mq); g_free(gq); pdb->Commit(); pdb->Disconnect(); }
static int AddPlayer(DBProvider * pdb, const char *name) { int id = GetPlayerId(pdb, name); if (id == -1) { /* Add new player to database */ id = GetNextId(pdb, "player"); if (id != -1) { char *buf = g_strdup_printf("INSERT INTO player(player_id,name,notes) VALUES (%d, '%s', '')", id, name); if (!pdb->UpdateCommand(buf)) id = -1; g_free(buf); } } return id; }
void RoboCat::EnterAttackState( uint32_t inTargetNetId ) { mTargetNetId = inTargetNetId; //cache the target cat GameObjectPtr go = NetworkManager::sInstance->GetGameObject( mTargetNetId ); //double check this attack target is valid if ( go && go->GetClassId() == RoboCat::kClassId && go->GetPlayerId() != GetPlayerId() ) { mTargetCat = go; mState = RC_ATTACK; } else { mState = RC_IDLE; } }
void RoboCatServer::TakeDamage( int inDamagingPlayerId ) { mHealth--; if( mHealth <= 0.f ) { //score one for damaging player... ScoreBoardManager::sInstance->IncScore( inDamagingPlayerId, 1 ); //and you want to die SetDoesWantToDie( true ); //tell the client proxy to make you a new cat ClientProxyPtr clientProxy = NetworkManagerServer::sInstance->GetClientProxy( GetPlayerId() ); if( clientProxy ) { clientProxy->HandleCatDied(); } } //tell the world our health dropped NetworkManagerServer::sInstance->SetStateDirty( GetNetworkId(), ECRS_Health ); }
void GameClient::ExecuteNWF() { // Geschickte Network Commands der Spieler ausführen und ggf. im Replay aufzeichnen AsyncChecksum checksum = AsyncChecksum::create(*game); const unsigned curGF = GetGFNumber(); for(const NWFPlayerInfo& player : nwfInfo->getPlayerInfos()) { const PlayerGameCommands& currentGCs = player.commands.front(); // Command im Replay aufzeichnen (wenn nicht gerade eins schon läuft xD) // Nur Commands reinschreiben, KEINE PLATZHALTER (nc_count = 0) if(!currentGCs.gcs.empty() && replayinfo && replayinfo->replay.IsRecording()) { // Set the current checksum as the GF checksum. The checksum from the command is from the last NWF! PlayerGameCommands replayCmds(checksum, currentGCs.gcs); replayinfo->replay.AddGameCommand(curGF, player.id, replayCmds); } // Das ganze Zeug soll die andere Funktion ausführen ExecuteAllGCs(player.id, currentGCs); } // Send GC message for this NWF // First for all potential AIs as we need to combine the AI cmds of the local player with our own ones for(AIPlayer& ai : game->aiPlayers_) { const std::vector<gc::GameCommandPtr> aiGCs = ai.FetchGameCommands(); /// Cmds from own AI get added to our gcs if(ai.GetPlayerId() == GetPlayerId()) gameCommands_.insert(gameCommands_.end(), aiGCs.begin(), aiGCs.end()); else mainPlayer.sendMsgAsync(new GameMessage_GameCommand(ai.GetPlayerId(), checksum, aiGCs)); } mainPlayer.sendMsgAsync(new GameMessage_GameCommand(0xFF, checksum, gameCommands_)); gameCommands_.clear(); }
extern statcontext *relational_player_stats_get(const char *player0, const char *player1) { int id0 = -1; int id1 = -1; DBProvider *pdb = NULL; char *query[2]; int i; char *buf; RowSet *rs; statcontext *psc; g_return_val_if_fail(player0, NULL); if ((pdb = ConnectToDB(dbProviderType)) == NULL) return NULL; id0 = GetPlayerId(pdb, player0); if (player1) id1 = GetPlayerId(pdb, player1); if (id0 == -1 || (player1 && id1 == -1)) return NULL; psc = g_new0(statcontext, 1); if (!player1) { query[0] = g_strdup_printf("where matchstat.player_id = %d", id0); query[1] = g_strdup_printf("NATURAL JOIN session WHERE " "(session.player_id0 = %d OR session.player_id1 = %d) " "AND matchstat.player_id != %d", id0, id0, id0); } else { query[0] = g_strdup_printf("NATURAL JOIN session WHERE " "((session.player_id0 = %d OR session.player_id1 = %d) " " AND " " (session.player_id0 = %d OR session.player_id1 = %d))" "AND matchstat.player_id = %d", id0, id0, id1, id1, id0); query[1] = g_strdup_printf("NATURAL JOIN session WHERE " "((session.player_id0 = %d OR session.player_id1 = %d) " " AND " " (session.player_id0 = %d OR session.player_id1 = %d))" "AND matchstat.player_id = %d", id0, id0, id1, id1, id1); } IniStatcontext(psc); for (i = 0; i < 2; ++i) { buf = g_strdup_printf("SUM(total_moves)," "SUM(unforced_moves)," "SUM(total_cube_decisions)," "SUM(close_cube_decisions)," "SUM(doubles)," "SUM(takes)," "SUM(passes)," "SUM(very_bad_moves)," "SUM(bad_moves)," "SUM(doubtful_moves)," "SUM(unmarked_moves)," "SUM(very_unlucky_rolls)," "SUM(unlucky_rolls)," "SUM(unmarked_rolls)," "SUM(lucky_rolls)," "SUM(very_lucky_rolls)," "SUM(missed_doubles_below_cp)," "SUM(missed_doubles_above_cp)," "SUM(wrong_doubles_below_dp)," "SUM(wrong_doubles_above_tg)," "SUM(wrong_takes)," "SUM(wrong_passes)," "SUM(chequer_error_total_normalised)," "SUM(error_missed_doubles_below_cp_normalised)," "SUM(error_missed_doubles_above_cp_normalised)," "SUM(error_wrong_doubles_below_dp_normalised)," "SUM(error_wrong_doubles_above_tg_normalised)," "SUM(error_wrong_takes_normalised)," "SUM(error_wrong_passes_normalised)," "SUM(luck_total_normalised)" "from matchstat " "%s", query[i]); rs = pdb->Select(buf); g_free(buf); if ((!rs) || !strtol(rs->data[1][0], NULL, 0)) return NULL; psc->anTotalMoves[i] = strtol(rs->data[1][0], NULL, 0); psc->anUnforcedMoves[i] = strtol(rs->data[1][1], NULL, 0); psc->anTotalCube[i] = strtol(rs->data[1][2], NULL, 0); psc->anCloseCube[i] = strtol(rs->data[1][3], NULL, 0); psc->anDouble[i] = strtol(rs->data[1][4], NULL, 0); psc->anTake[i] = strtol(rs->data[1][5], NULL, 0); psc->anPass[i] = strtol(rs->data[1][6], NULL, 0); psc->anMoves[i][SKILL_VERYBAD] = strtol(rs->data[1][7], NULL, 0); psc->anMoves[i][SKILL_BAD] = strtol(rs->data[1][8], NULL, 0); psc->anMoves[i][SKILL_DOUBTFUL] = strtol(rs->data[1][9], NULL, 0); psc->anMoves[i][SKILL_NONE] = strtol(rs->data[1][10], NULL, 0); psc->anLuck[i][LUCK_VERYBAD] = strtol(rs->data[1][11], NULL, 0); psc->anLuck[i][LUCK_BAD] = strtol(rs->data[1][12], NULL, 0); psc->anLuck[i][LUCK_NONE] = strtol(rs->data[1][13], NULL, 0); psc->anLuck[i][LUCK_GOOD] = strtol(rs->data[1][14], NULL, 0); psc->anLuck[i][LUCK_VERYGOOD] = strtol(rs->data[1][15], NULL, 0); psc->anCubeMissedDoubleDP[i] = strtol(rs->data[1][16], NULL, 0); psc->anCubeMissedDoubleTG[i] = strtol(rs->data[1][17], NULL, 0); psc->anCubeWrongDoubleDP[i] = strtol(rs->data[1][18], NULL, 0); psc->anCubeWrongDoubleTG[i] = strtol(rs->data[1][19], NULL, 0); psc->anCubeWrongTake[i] = strtol(rs->data[1][20], NULL, 0); psc->anCubeWrongPass[i] = strtol(rs->data[1][21], NULL, 0); psc->arErrorCheckerplay[i][0] = (float)g_ascii_strtod(rs->data[1][22], NULL); psc->arErrorMissedDoubleDP[i][0] = (float)g_ascii_strtod(rs->data[1][23], NULL); psc->arErrorMissedDoubleTG[i][0] = (float)g_ascii_strtod(rs->data[1][24], NULL); psc->arErrorWrongDoubleDP[i][0] = (float)g_ascii_strtod(rs->data[1][25], NULL); psc->arErrorWrongDoubleTG[i][0] = (float)g_ascii_strtod(rs->data[1][26], NULL); psc->arErrorWrongTake[i][0] = (float)g_ascii_strtod(rs->data[1][27], NULL); psc->arErrorWrongPass[i][0] = (float)g_ascii_strtod(rs->data[1][28], NULL); psc->arLuck[i][0] = (float)g_ascii_strtod(rs->data[1][29], NULL); FreeRowset(rs); } psc->fMoves = 1; psc->fCube = 1; psc->fDice = 1; return psc; }