void menu::run_menu() { if (!is_open) return; reset_vars(); static int a_int = 0; static float a_float = 0; static bool a_bool = false; switch (current_menu) { case Main_Menu: { sub_title = "Main Menu"; option_count = 9; add_option_i("Edit Int", &a_int, 0, 100); add_option_f("Edit Float", &a_float, 0, 5); add_option_b("Toggle Bool", &a_bool); add_option_bc("Toggle Godmode", true, toggle_godmode, !*toggle_godmode()); add_option_c("Explode Self", explode_player, PLAYER::PLAYER_ID()); add_option_bc_arg("Spawn Adder", false, spawn_vehicle, true, "adder"); add_option_bc_arg("Change Model to Alien", false, set_model, true, "S_M_M_MovAlien_01"); add_option_c("Open Sub", change_menu, Sub_1); add_option_c("Players Menu", change_menu, Players); break; } case Sub_1: { sub_title = "Sub menu 1"; option_count = 15 + 1; for (int i = 0; i < 15; i++) { add_option_n(string("Option ") + string(i + 1)); } add_option_c("Open Nested Sub", change_menu, Sub_2); break; } case Sub_2: { sub_title = "A Nested Sub"; option_count = 3; add_option_n("Option 1"); add_option_n("Option 2"); add_option_n("Option 3"); break; } case Players: { sub_title = "Players Menu"; option_count = get_players_count(); for_player { char* name = PLAYER::GET_PLAYER_NAME(player); if (!strcmp(name, "**Invalid**")) continue; add_option_c(name, open_players_options, player); } break; } case Players_Options: { sub_title = PLAYER::GET_PLAYER_NAME(selected_player); option_count = 3; add_option_c("Blow Up", explode_player, selected_player); add_option_c("Teleport To", teleport, ENTITY::GET_ENTITY_COORDS(PLAYER::GET_PLAYER_PED(selected_player))); add_option_bc_arg("Drop Cash", true, toggle_cash_drop, !*toggle_cash_drop(0, selected_player), selected_player); break; } } }
void game_sv_TeamDeathmatch::AutoBalanceTeams() { if (!Get_AutoTeamBalance()) return; //calc team count s16 MinTeam, MaxTeam; u32 NumToMove; u32 cnt = get_players_count(), l_teams[2] = {0,0}; for(u32 it=0; it<cnt; it++) { xrClientData *l_pC = (xrClientData*) m_server->client_Get (it); game_PlayerState* ps = l_pC->ps; if (!l_pC->net_Ready) continue; if (ps->IsSkip()) continue; if(ps->team>=1) ++(l_teams[ps->team-1]); }; if (l_teams[0] == l_teams[1]) return; if (l_teams[0] > l_teams[1]) { MinTeam = 1; MaxTeam = 0; } else { MinTeam = 0; MaxTeam = 1; }; NumToMove = (l_teams[MaxTeam] - l_teams[MinTeam]) / 2; if (!NumToMove) return; /////////////////////////////////////////////////////////////////////// while (NumToMove) { ///////// get lowest score player from MaxTeam u32 LowestPlayer = 0; s16 LowestScore = 32767; for(u32 it=0; it<cnt; it++) { xrClientData *l_pC = (xrClientData*) m_server->client_Get (it); game_PlayerState* ps = l_pC->ps; if (!l_pC->net_Ready) continue; if (ps->IsSkip()) continue; if (ps->team-1 != MaxTeam) continue; if (ps->frags() < LowestScore) { LowestScore = ps->frags(); LowestPlayer = it; }; }; ///////// move player to opposite team xrClientData *l_pC = (xrClientData*) m_server->client_Get (LowestPlayer); game_PlayerState* ps = l_pC->ps; ps->team = u8((MinTeam+1) & 0x00ff); NumToMove--; } };
u8 game_sv_TeamDeathmatch::AutoTeam() { u32 cnt = get_players_count(), l_teams[2] = {0,0}; for(u32 it=0; it<cnt; it++) { xrClientData *l_pC = (xrClientData*) m_server->client_Get (it); game_PlayerState* ps = l_pC->ps; if (!l_pC->net_Ready) continue; if (ps->IsSkip() || ps->team == 0 || ps->testFlag(GAME_PLAYER_FLAG_SPECTATOR)) continue; if(ps->team>=1) ++(l_teams[ps->team-1]); } return (l_teams[0]>l_teams[1])?2:1; }
u32 game_sv_TeamDeathmatch::GetPlayersCountInTeams (u8 team) { u32 cnt = get_players_count(), TeamPlayersCount = 0; for(u32 it=0; it<cnt; it++) { xrClientData *l_pC = (xrClientData*) m_server->client_Get (it); game_PlayerState* ps = l_pC->ps; if (!l_pC->net_Ready) continue; if (ps->IsSkip() || ps->team == 0 || ps->testFlag(GAME_PLAYER_FLAG_SPECTATOR)) continue; if(ps->team>=team) TeamPlayersCount++; } return (TeamPlayersCount); };
void game_sv_TeamDeathmatch::AutoSwapTeams () { if (!Get_AutoTeamSwap()) return; u32 cnt = get_players_count(); for (u32 it=0; it<cnt; ++it) { // init xrClientData *l_pC = (xrClientData*) m_server->client_Get (it); if (!l_pC || !l_pC->net_Ready || !l_pC->ps) continue; game_PlayerState* ps = l_pC->ps; if (ps->IsSkip()) continue; if (ps->team != 0) ps->team = (ps->team == 1) ? 2 : 1; } }