/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see .
*/
/***********************************************************************************************
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
***********************************************************************************************
* *
* Project Name : Command & Conquer *
* *
* $Archive:: /Commando/Code/Commando/gamesideservercontrol.cpp $*
* *
* $Author:: Bhayes $*
* *
* $Modtime:: 3/19/02 4:37p $*
* *
* $Revision:: 9 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "always.h"
#include "gamesideservercontrol.h"
#include "registry.h"
#include "_globals.h"
#include "consolefunction.h"
#include "gamedata.h"
#include "servercontrol.h"
#include "gamemode.h"
#include "buildnum.h"
#include "slavemaster.h"
#include "consolemode.h"
#include
#include
/*
** Static class data.
*/
bool GameSideServerControlClass::Listening = false;
StringClass GameSideServerControlClass::Response;
/***********************************************************************************************
* GameSideServerControlClass::Init -- Start listening for server control messages *
* *
* *
* *
* INPUT: Nothing *
* *
* OUTPUT: Nothing *
* *
* WARNINGS: None *
* *
* HISTORY: *
* 11/16/2001 3:55PM ST : Created *
*=============================================================================================*/
void GameSideServerControlClass::Init(void)
{
char password[64] = DEFAULT_SERVER_CONTROL_PASSWORD;
if (!Listening) {
/*
** Only for dedicated servers.
*/
if (SlaveMaster.Am_I_Slave() || (The_Game() && The_Game()->IsDedicated.Is_True()) || ConsoleBox.Is_Exclusive()) {
/*
** Get the port number from the registry.
*/
RegistryClass reg(APPLICATION_SUB_KEY_NAME_NET_SERVER_CONTROL);
int port = reg.Get_Int(SERVER_CONTROL_PORT_KEY, DEFAULT_SERVER_CONTROL_PORT);
if (port != 0) {
/*
** See if we should only bind to the loopback address (for slaves).
*/
int loopback = reg.Get_Int(SERVER_CONTROL_LOOPBACK_KEY, 0);
if (SlaveMaster.Am_I_Slave()) {
ServerControl.Allow_Remote_Admin((loopback == 0) ? true : false);
}
/*
** Get the bind IP from the registry.
*/
unsigned long ip = reg.Get_Int(SERVER_CONTROL_IP_KEY, 0);
/*
** Get the password from the registry.
*/
reg.Get_String(SERVER_CONTROL_PASSWORD_KEY, password, sizeof(password), password);
/*
** Start listening.
*/
ServerControl.Start_Listening(port, password, &App_Request_Callback, NULL, loopback ? true : false, ip);
Listening = true;
/*
** Update the welcome message.
*/
Set_Welcome_Message();
}
} else {
Listening = false;
}
}
}
/***********************************************************************************************
* GameSideServerControlClass::Set_Welcome_Message -- Update the welcome message *
* *
* *
* *
* INPUT: Nothing *
* *
* OUTPUT: Nothing *
* *
* WARNINGS: None *
* *
* HISTORY: *
* 11/16/2001 3:56PM ST : Created *
*=============================================================================================*/
void GameSideServerControlClass::Set_Welcome_Message(void)
{
char buffer[1024];
buffer[0] = 0;
char welcome[1024];
/*
** Basic welcome message includes build info.
*/
sprintf(welcome, "Welcome to Renegade %s\n", BuildInfoClass::Composite_Build_Info());
/*
** Get the slave info and add it into the welcome message.
*/
SlaveMaster.Get_Slave_Info(buffer, sizeof(buffer));
strcat(welcome, buffer);
welcome[499] = 0;
ServerControl.Set_Welcome_Message(welcome);
}
/***********************************************************************************************
* GameSideServerControlClass::Shutdown -- Stop listening to server control messages *
* *
* *
* *
* INPUT: Nothing *
* *
* OUTPUT: Nothing *
* *
* WARNINGS: None *
* *
* HISTORY: *
* 11/16/2001 3:57PM ST : Created *
*=============================================================================================*/
void GameSideServerControlClass::Shutdown(void)
{
ServerControl.Stop_Listening();
Listening = false;
}
/***********************************************************************************************
* GameSideServerControlClass::App_Request_Callback -- Server control request handler *
* *
* *
* *
* INPUT: Request text *
* *
* OUTPUT: Response text *
* *
* WARNINGS: None *
* *
* HISTORY: *
* 11/16/2001 3:58PM ST : Created *
*=============================================================================================*/
const char *GameSideServerControlClass::App_Request_Callback(char *request)
{
Response.Erase(0, Response.Get_Length());
if (Listening) {
if (GameModeManager::Find("Combat")->Is_Active()) {
ConsoleFunctionManager::Parse_Input(request);
}
}
Response += "\n";
return(Response.Peek_Buffer());
}
/***********************************************************************************************
* GameSideServerControlClass::Print -- Adds to the response packet for the current request *
* *
* *
* *
* INPUT: Response text *
* *
* OUTPUT: Nothing *
* *
* WARNINGS: None *
* *
* HISTORY: *
* 11/16/2001 3:58PM ST : Created *
*=============================================================================================*/
void GameSideServerControlClass::Print(char *text, ...)
{
if (Listening) {
if (Response.Get_Length() > 32768) {
Response.Erase(0, Response.Get_Length());
}
char buffer[8192];
va_list va;
buffer[sizeof(buffer)-1] = 0;
va_start(va, text);
_vsnprintf(&buffer[0], sizeof(buffer)-1, text, va);
va_end(va);
Response += buffer;
}
}
/***********************************************************************************************
* GameSideServerControlClass::Send_Message -- Send a request message to another server *
* *
* *
* *
* INPUT: Message *
* IP *
* Port *
* *
* OUTPUT: Nothing *
* *
* WARNINGS: None *
* *
* HISTORY: *
* 11/16/2001 3:59PM ST : Created *
*=============================================================================================*/
void GameSideServerControlClass::Send_Message(char *text, unsigned long ip, unsigned short port)
{
if (Listening) {
ServerControl.Send_Message(text, ip, port);
}
}