26 #include "../../cl_shared.h"
27 #include "../../ui/ui_data.h"
30 #include "../cl_game.h"
44 if (!
selectedServer && cgi->Cmd_Argc() != 2 && cgi->Cmd_Argc() != 3) {
45 cgi->Com_Printf(
"Usage: %s <server> [<port>]\n", cgi->
Cmd_Argv(0));
51 if (cgi->Cmd_Argc() == 2) {
54 }
else if (cgi->Cmd_Argc() == 3) {
63 if (cgi->GAME_IsTeamEmpty() && !cgi->GAME_LoadDefaultTeam(
true)) {
64 cgi->UI_Popup(
_(
"Error"),
"%s",
_(
"Assemble a team first"));
68 if (cgi->Cvar_GetInteger(
"mn_server_need_password")) {
69 cgi->UI_PushWindow(
"serverpassword");
74 cgi->SV_Shutdown(
"Server quit.",
false);
77 cgi->GAME_SetServerInfo(server, serverport);
81 cgi->HUD_InitUI(
"missionoptions");
88 cgi->NET_StreamFree(s);
91 const int cmd = cgi->NET_ReadByte(
buf);
93 cgi->NET_StreamFree(s);
97 cgi->NET_ReadStringLine(
buf, commandBuf,
sizeof(commandBuf));
99 if (
Q_streq(commandBuf,
"print")) {
101 cgi->NET_ReadString(
buf, paramBuf,
sizeof(paramBuf));
102 cgi->Com_Printf(
"%s\n", paramBuf);
104 cgi->NET_StreamFree(s);
115 cgi->Com_Printf(
"You must set 'rcon_password' before issuing a rcon command.\n");
120 cgi->NET_OOB_Printf2(
SV_CMD_RCON " %s %s", password, command);
122 }
else if (rcon_address->
string) {
125 if (strstr(rcon_address->
string,
":"))
126 port = strstr(rcon_address->
string,
":") + 1;
132 cgi->NET_OOB_Printf(s,
SV_CMD_RCON " %s %s", password, command);
138 cgi->Com_Printf(
"You are not connected to any server\n");
148 if (cgi->Cmd_Argc() < 2) {
149 cgi->Com_Printf(
"Usage: %s <command>\n", cgi->
Cmd_Argv(0));
153 if (!rcon_client_password->
string) {
154 cgi->Com_Printf(
"You must set 'rcon_password' before issuing a rcon command.\n");
159 Com_Printf(
"Could not send the rcon command\n");
164 if (cgi->Com_ServerState())
165 cgi->Cmd_ExecuteString(
"startgame");
167 cgi->Cmd_ExecuteString(
"rcon startgame");
175 cgi->SV_ShutdownWhenEmpty();
184 if (cgi->Com_ServerState())
188 cgi->Com_Printf(
"disconnecting...\n");
189 cgi->CL_Disconnect();
193 cgi->Com_Printf(
"reconnecting...\n");
206 if (cgi->Com_ServerState())
212 cgi->UI_RegisterText(
TEXT_STANDARD,
_(
"Select a free team or your coop team"));
219 cgi->Cvar_SetValue(
"cl_teamnum", teamnum);
220 Com_sprintf(buf,
sizeof(buf),
_(
"Current team: %i"), teamnum);
226 cgi->Com_DPrintf(
DEBUG_CLIENT,
"team %i is already in use: %i (max: %i)\n",
237 int i = cgi->Cvar_GetInteger(
"cl_teamnum");
239 if (i <= TEAM_CIVILIAN || i > teamData.
maxteams) {
250 for (i++; i <= teamData.
maxteams; i++) {
269 if (adrStr[0] !=
'\0' && cgi->Cmd_GenericCompleteFunction(adrStr, partial, match)) {
270 cgi->Com_Printf(
"%s\n", adrStr);
284 cgi->UI_RegisterOption(
TEXT_LIST, gameTypes);
288 {
"mp_selectteam_init",
GAME_MP_SelectTeam_Init_f,
"Function that gets all connected players and let you choose a free team"},
296 {
"rcon",
GAME_MP_Rcon_f,
"Execute a rcon command - see rcon_password"},
298 {
nullptr,
nullptr,
nullptr}
303 rcon_client_password = cgi->
Cvar_Get(
"rcon_password",
"", 0,
"Remote console password");
304 rcon_address = cgi->
Cvar_Get(
"rcon_address",
"", 0,
"Address of the host you would like to control via rcon");
310 cgi->Cmd_TableAddList(mpCallbacks);
314 cl_maxsoldiersperteam->
modified =
false;
315 cl_maxsoldiersperplayer->
modified =
false;
320 cgi->Cmd_TableRemoveList(mpCallbacks);
322 cgi->Cvar_Delete(
"rcon_address");
bool Q_strnull(const char *string)
static int GAME_MP_CompleteNetworkAddress(const char *partial, const char **match)
Autocomplete function for some network functions.
serverList_t * selectedServer
static const cmdList_t mpCallbacks[]
const char * va(const char *format,...)
does a varargs printf into a temp buffer, so I don't need to have varargs versions of all text functi...
This is a cvar definition. Cvars can be user modified and used in our menus e.g.
static void GAME_MP_InitUI_f(void)
cvar_t * cl_roundtimelimit
bool GAME_MP_Rcon(const char *password, const char *command)
Sends an rcon command to the gameserver that the user is currently connected to, or if this is not th...
bool Com_sprintf(char *dest, size_t size, const char *fmt,...)
copies formatted string with buffer-size checking
Serverlist menu callbacks headers for multiplayer.
static void GAME_MP_Rcon_f(void)
cvar_t * rcon_client_password
void Com_Printf(const char *const fmt,...)
static void GAME_MP_StartGame_f(void)
cvar_t * cl_maxsoldiersperplayer
const char *IMPORT * Cvar_GetString(const char *varName)
const char *IMPORT * Cmd_Args(void)
static void GAME_MP_TeamNum_f(void)
Increase or decrease the teamnum.
void Q_strncpyz(char *dest, const char *src, size_t destsize)
Safe strncpy that ensures a trailing zero.
cvar_t *IMPORT * Cvar_Set(const char *varName, const char *value,...) __attribute__((format(__printf__
static void GAME_MP_Disconnect_f(void)
Binding for disconnect console command.
dbuffer *IMPORT * NET_ReadMsg(struct net_stream *s)
Serverlist management headers for multiplayer.
gametype_t gts[MAX_GAMETYPES]
void GAME_MP_CallbacksInit(const cgame_import_t *import)
static const cgame_import_t * cgi
Atomic structure used to define most of the UI.
cvar_t *IMPORT * Cvar_Get(const char *varName, const char *value, int flags, const char *desc)
static void GAME_MP_RconCallback(struct net_stream *s)
static cvar_t * info_password
struct net_stream *IMPORT * NET_Connect(const char *node, const char *service, stream_onclose_func *onclose)
static void GAME_MP_Reconnect_f(void)
The server is changing levels.
static bool GAME_MP_SetTeamNum(int teamnum)
void GAME_MP_PingServers_f(void)
The first function called when entering the multiplayer menu, then CL_Frame takes over...
void GAME_MP_CallbacksShutdown(void)
static void GAME_MP_SelectTeam_Init_f(void)
Send the SV_CMD_TEAMINFO command to server.
static cvar_t * rcon_address
const char uiNode_t *IMPORT * UI_AddOption(uiNode_t **tree, const char *name, const char *label, const char *value)
const char *IMPORT * Cmd_Argv(int n)
cvar_t * cl_maxsoldiersperteam
static void GAME_MP_Connect_f(void)