sin-sdk/console.cpp

1395 lines
36 KiB
C++

//-----------------------------------------------------------------------------
//
// $Logfile:: /Quake 2 Engine/Sin/code/game/console.cpp $
// $Revision:: 68 $
// $Author:: Jimdose $
// $Date:: 12/18/98 11:03p $
//
// Copyright (C) 1997 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source is may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
// $Log:: /Quake 2 Engine/Sin/code/game/console.cpp $
//
// 68 12/18/98 11:03p Jimdose
// removed include of qcommon.h
//
// 67 11/07/98 5:28p Aldie
// Only filter missioncon for coop
//
// 66 11/07/98 3:52p Aldie
// Fixed loop bug for console parsing
//
// 65 11/07/98 2:25p Aldie
// Fixed check for ---
//
// 64 11/07/98 2:21p Aldie
// Added coop filter for some console stuff
//
// 63 10/27/98 1:42p Markd
// Fixed de-slashify stuff
//
// 62 10/19/98 11:50p Aldie
// Added slashfix to menufiles.
//
//
// 60 10/17/98 8:16p Jimdose
// Got rid of code posting the event 1 second later when console wasn't found.
// Functions just return now.
// Made ConsoleExists print out warning during any developer setting, not just
// > 1
//
// 59 10/11/98 12:02a Aldie
// Console savegame fix
//
// 58 10/10/98 9:59p Jimdose
// working on console savegames
//
// 57 10/07/98 11:43p Jimdose
// Got savegames working
//
// 56 9/23/98 10:07p Aldie
// Don't remove consoles that aren't in the manager
//
// 55 9/14/98 6:42p Aldie
// Fixed a bug with the nouse spawnflag which was setting hideModel()
// incorrectly
//
// 54 9/10/98 8:39p Markd
// Removed level.hidestats, replaced it with a player event
//
// 53 8/19/98 2:24p Aldie
// Moved warning message to developer 2
//
// 52 8/17/98 6:19p Markd
// Changed SetCamera to a Player method
//
// 51 8/15/98 3:00p Markd
// Fixed camera/console issues with weapons
//
// 50 8/08/98 1:59p Aldie
// Fixed console commands so they can be recieved from the client
//
// 49 8/06/98 10:53p Aldie
// Added weapon tweaks and kickback. Also modified blast radius damage and
// rocket jumping.
//
// 48 7/31/98 8:09p Jimdose
// Script commands now include flags to indicate cheats and console commands
//
// 47 7/29/98 3:38p Aldie
// Don't use a camera if there isn't one.
//
// 46 7/26/98 4:14a Aldie
// Console camera fun stuff.
//
// 45 7/26/98 1:17a Aldie
// Camera system for consoles
//
// 44 7/23/98 2:38p Aldie
// Made mission computer not be in the PVS
//
// 43 7/21/98 7:32p Aldie
// Changed mission computer defaults
//
// 42 7/21/98 1:10p Aldie
// Added meansofdeath to obituaries
//
// 41 7/09/98 9:35p Jimdose
// Removed RF_CONSOLE renderfx flag
//
// 40 7/09/98 4:45p Markd
// hid non-use consoles
//
// 39 7/09/98 4:33p Markd
// added pvs support for consoles
//
// 38 7/03/98 12:00p Aldie
// Better error checking when setting a layout.
//
// 37 7/01/98 7:01p Aldie
// Added mission computer
//
// 36 5/25/98 2:28p Aldie
// Fixed issues with not loading game dll
//
// 35 5/24/98 8:46p Jimdose
// Made a lot of functions more str-friendly.
// Got rid of a lot of char * based strings
// Cleaned up get spawn arg functions and sound functions
// sound functions now use consistant syntax
//
// 34 5/24/98 4:48p Jimdose
// Made char *'s const
//
// 33 5/17/98 8:13p Aldie
// New menu cutover changes.
//
// 32 5/02/98 8:38p Aldie
// More console stuff for demos
//
// 31 4/30/98 4:46p Aldie
// Server side console states.
//
// 30 4/21/98 2:24p Aldie
// Added ability to kick users.
//
// 29 4/18/98 6:09p Aldie
// Added generic status bars.
//
// 28 4/08/98 4:55p Aldie
// Alpha characters on consoles.
//
// 27 4/07/98 3:49p Aldie
// Added more menu control.
//
// 26 4/05/98 9:28p Aldie
// Added foreground color to consoles.
//
// 25 4/05/98 5:19p Aldie
// Rearranged console rendering
//
// 24 4/04/98 6:02p Jimdose
// Made response from EV_Trigger_ActivateTargets to EV_Trigger_Effect
//
// 23 4/03/98 1:10p Aldie
// Made all commands wait until console is actually created.
//
// 22 3/31/98 7:50p Aldie
// Fixed menufile bug.
//
// 21 3/31/98 7:35p Aldie
// Fixed menufile and focus.
//
// 20 3/31/98 11:55a Aldie
// Fixed loadmenufile.
//
// 19 3/30/98 11:46p Aldie
// Update to use triggers.
//
// 18 3/30/98 11:06p Aldie
// Added menus.
//
// 17 3/28/98 3:28p Aldie
// Added layout files.
//
// 16 3/27/98 6:23p Aldie
// Added rows, cols, and clear.
//
// 15 3/27/98 12:05p Aldie
// Changed an event name.
//
// 14 3/26/98 7:15p Aldie
// Added deactivate but it won't be used.
//
// 13 3/26/98 6:22p Aldie
// Fixed sending of layout commands.
//
// 12 3/26/98 4:09p Aldie
// Virtual width and height support.
//
// 11 3/26/98 2:51p Aldie
// Added interface between consoles and scripts.
//
// 10 3/24/98 4:29p Aldie
// New event system changes.
//
// 9 3/24/98 12:28p Aldie
// Added some commands to test consoles.
//
// 8 3/23/98 1:08p Aldie
// Added console entity.
//
// 6 12/12/97 4:22p Jimdose
// Added "message" key to console.
//
// 5 12/06/97 4:51p Markd
// Added GetArgs as commands for future processing
//
// 4 10/27/97 3:34p Jimdose
// Included stdarg.h
//
// 3 10/27/97 3:29p Jimdose
// Removed dependency on quakedef.h
//
// 2 9/26/97 5:23p Jimdose
// Added standard Ritual headers
//
// DESCRIPTION:
// Consoles are script controlled decals that can change dynamically. Eventually,
// their behaviour will be expanded to include interaction with the player as well.
//
#include "console.h"
#include "scriptmaster.h"
#include "camera.h"
#include "Player.h"
ConsoleManager consoleManager;
Event EV_Console_Activate( "conactivate" );
CLASS_DECLARATION( TriggerUse, Console, "console" );
ResponseDef Console::Responses[] =
{
{ &EV_Console_Activate, ( Response )Console::Activate },
{ &EV_Trigger_Effect, ( Response )Console::Activate },
{ &EV_Use, ( Response )Console::Use },
{ NULL, NULL }
};
/*****************************************************************************/
/*SINED console (0 .5 .8) ? NOUSE SCROLL MENU NOPVS
consolename (required)
virtualwidth
virtualheight
fraction
rows
cols
menufile
scroll
menu
/*****************************************************************************/
Console::Console()
{
netconsole_t *con;
str mfile;
if ( LoadingSavegame )
{
// Increment the global number of consoles and return
globals.num_consoles++;
return;
}
showModel();
setMoveType( MOVETYPE_PUSH );
setSolidType( SOLID_BSP );
console_name = G_GetSpawnArg( "consolename", "" );
if ( !LoadingSavegame && !console_name.length() )
{
error("Console", "consolename is undefined\n" );
}
if ( console_name == MAIN_CONSOLE )
{
error("Console", "console name \"maincon\" is reserved\n");
}
if ( console_name == MISSION_CONSOLE )
{
error("Console", "console name \"missioncon\" is reserved\n");
}
wait = G_GetFloatArg("wait",1.0f);
virtual_width = G_GetFloatArg("virtualwidth",640.0f);
virtual_height = G_GetFloatArg("virtualheight",480.0f);
fraction = G_GetFloatArg("fraction",1.0f);
rows = G_GetIntArg("rows",32);
cols = G_GetIntArg("cols",80);
mfile = G_GetSpawnArg("menufile", "");
scroll = G_GetIntArg("scroll",0);
menu = G_GetIntArg("menu",0);
respondto = TRIGGER_PLAYERS;
menufile = G_FixSlashes( mfile.c_str() );
if (scroll)
spawnflags |= 2;
if (menu)
spawnflags |= 4;
// A console of this name already exists, so just assign it's number to the number of the
// one that already exists
if ( !LoadingSavegame )
{
console_number = consoleManager.ConsoleExists( console_name );
if ( console_number )
{
return;
}
}
// Check for a free console on the server
if (globals.num_consoles >= globals.max_consoles)
error("Console::Create", "No free consoles\n" );
// Increment the global number of consoles.
globals.num_consoles++;
console_number = globals.num_consoles;
con = &g_consoles[globals.num_consoles];
con->inuse = true;
con->s.spawnflags = spawnflags;
con->s.consoleactive = true;
con->s.create_time = -1;
con->s.number = globals.num_consoles;
con->s.virtual_width = virtual_width;
con->s.virtual_height = virtual_height;
con->s.fraction = fraction;
con->s.rows = rows;
con->s.cols = cols;
con->s.menu_file[0] = 0;
con->s.linepos = 1;
con->s.console_owner = entnum;
created = true;
if ( menufile.length() )
{
strcpy( con->s.menu_file, menufile.c_str() );
con->s.menufile_update_time = -1;
}
else
{
con->s.menufile_update_time = 0;
}
strcpy( con->s.console_name, console_name.c_str() );
con->s.name_update_time = -1;
con->s.console_return_time = 0;
if ( !LoadingSavegame )
{
// Add it to the manager
consoleManager.AddConsole(this);
}
}
Console::~Console()
{
consoleManager.RemoveConsole(this);
}
void Console::Use( Event *ev )
{
// Don't respond to users using me!
if (spawnflags & 1)
return;
TriggerStuff(ev);
}
void Console::Activate( Event *ev )
{
char string[1024];
Entity *other;
Event *ev2;
Camera *cam;
int num;
if (!created)
{
Event *ev1;
ev1 = new Event(ev);
PostEvent(ev1,0.1);
return;
}
assert(created);
other = ev->GetEntity(1);
num = G_FindTarget( 0, Target() );
if ( num && other->isClient() )
{
Player * client;
client = ( Player * )other;
cam = (Camera *) G_GetEntity( num );
assert( cam );
client->SetCamera( cam );
ev2 = new Event( EV_Player_HideStats );
client->ProcessEvent( ev2 );
}
Com_sprintf( string, sizeof( string ), "use %s", console_name.c_str() );
gi.WriteByte (svc_console_command);
gi.WriteString (string);
gi.unicast (other->edict, true);
ev2 = new Event(EV_EnterConsole);
ev2->AddString(console_name);
other->PostEvent(ev2,0);
}
CLASS_DECLARATION( Listener, ConsoleManager, "consolemgr" );
Event EV_ConsoleManager_ProcessCommand( "consolecmd", EV_CONSOLE );
Event EV_ConsoleManager_ProcessVariable( "consolevar", EV_CONSOLE );
Event EV_ConsoleManager_ConPositionPositive( "consolepos", EV_CONSOLE );
Event EV_ConsoleManager_ConPositionNegative( "consoleneg", EV_CONSOLE );
Event EV_ConsoleManager_ConPositionReturn( "consoleret", EV_CONSOLE );
Event EV_ConsoleManager_ConMenuInfo( "consolemenu", EV_CONSOLE );
Event EV_ConsoleManager_ConPrint( "conprint" );
Event EV_ConsoleManager_ConNewline( "connewline" );
Event EV_ConsoleManager_ConLayout( "conlayout" );
Event EV_ConsoleManager_ConAppLayout( "conapplayout" );
Event EV_ConsoleManager_ConClearLayout( "conclearlayout" );
Event EV_ConsoleManager_ConVirtualWidth( "convirtualwidth" );
Event EV_ConsoleManager_ConVirtualHeight( "convirtualheight" );
Event EV_ConsoleManager_ConFraction( "confraction" );
Event EV_ConsoleManager_ConDeactivate( "condeactivate" );
Event EV_ConsoleManager_ConActivate( "conactivate" );
Event EV_ConsoleManager_ConRows( "rows" );
Event EV_ConsoleManager_ConColumns( "cols" );
Event EV_ConsoleManager_ConClear( "conclear" );
Event EV_ConsoleManager_ConLayoutFile( "conlayoutfile" );
Event EV_ConsoleManager_ConLoadMenuFile( "conmenufile" );
Event EV_ConsoleManager_ConFocus( "focus" );
Event EV_ConsoleManager_ConForeground( "foreground" );
Event EV_ConsoleManager_MenuActive( "menuactive" );
Event EV_ConsoleManager_MenuInactive( "menuinactive" );
Event EV_ConsoleManager_ConStatusBar( "sbar" );
Event EV_ConsoleManager_ConStatusBarValue( "sbarvalue" );
Event EV_ConsoleManager_ConKickUsers( "kick" );
Event EV_KickFromConsole( "kickcon" );
Event EV_EnterConsole( "entercon" );
Event EV_ExitConsole( "exitcon", EV_CONSOLE );
ResponseDef ConsoleManager::Responses[] =
{
{ &EV_ConsoleManager_ProcessCommand, ( Response )ConsoleManager::ProcessCmd },
{ &EV_ConsoleManager_ProcessVariable, ( Response )ConsoleManager::ProcessVar },
{ &EV_ConsoleManager_ConPositionPositive, ( Response )ConsoleManager::ConsolePositionPositive },
{ &EV_ConsoleManager_ConPositionNegative, ( Response )ConsoleManager::ConsolePositionNegative },
{ &EV_ConsoleManager_ConPositionReturn, ( Response )ConsoleManager::ConsolePositionReturn },
{ &EV_ConsoleManager_ConMenuInfo, ( Response )ConsoleManager::ConsoleMenuInfo },
{ &EV_ConsoleManager_ConPrint, ( Response )ConsoleManager::ConsolePrint },
{ &EV_ConsoleManager_ConPrint, ( Response )ConsoleManager::ConsolePrint },
{ &EV_ConsoleManager_ConNewline, ( Response )ConsoleManager::ConsoleNewline },
{ &EV_ConsoleManager_ConLayout, ( Response )ConsoleManager::ConsoleLayout },
{ &EV_ConsoleManager_ConLayoutFile, ( Response )ConsoleManager::ConsoleLayoutFile },
{ &EV_ConsoleManager_ConAppLayout, ( Response )ConsoleManager::ConsoleAppLayout },
{ &EV_ConsoleManager_ConClearLayout, ( Response )ConsoleManager::ConsoleClearLayout },
{ &EV_ConsoleManager_ConVirtualWidth, ( Response )ConsoleManager::ConsoleVirtualWidth },
{ &EV_ConsoleManager_ConVirtualHeight, ( Response )ConsoleManager::ConsoleVirtualHeight },
{ &EV_ConsoleManager_ConFraction, ( Response )ConsoleManager::ConsoleFraction },
{ &EV_ConsoleManager_ConDeactivate, ( Response )ConsoleManager::ConsoleDeactivate },
{ &EV_ConsoleManager_ConActivate, ( Response )ConsoleManager::ConsoleActivate },
{ &EV_ConsoleManager_ConRows, ( Response )ConsoleManager::ConsoleRows },
{ &EV_ConsoleManager_ConColumns, ( Response )ConsoleManager::ConsoleColumns },
{ &EV_ConsoleManager_ConClear, ( Response )ConsoleManager::ConsoleClear },
{ &EV_ConsoleManager_ConLoadMenuFile, ( Response )ConsoleManager::ConsoleLoadMenuFile },
{ &EV_ConsoleManager_ConFocus, ( Response )ConsoleManager::ConsoleFocus },
{ &EV_ConsoleManager_ConForeground, ( Response )ConsoleManager::ConsoleForeground },
{ &EV_ConsoleManager_MenuActive, ( Response )ConsoleManager::ConsoleMenuActive },
{ &EV_ConsoleManager_MenuInactive, ( Response )ConsoleManager::ConsoleMenuInactive },
{ &EV_ConsoleManager_ConStatusBar, ( Response )ConsoleManager::ConsoleStatusBar },
{ &EV_ConsoleManager_ConStatusBarValue, ( Response )ConsoleManager::ConsoleStatusBarValue },
{ &EV_ConsoleManager_ConKickUsers, ( Response )ConsoleManager::ConsoleKickUsers },
{ NULL, NULL }
};
//=============
//ConsoleExists - returns the number of the console, 0 if not found.
//=============
int ConsoleManager::ConsoleExists
(
str con_name
)
{
int num,i;
Console *p;
// Check for mission computer
if ( con_name == "missioncon" )
return mission_console_number;
num = consoleList.NumObjects();
for( i = 1; i <= num; i++ )
{
p = ( Console * )consoleList.ObjectAt( i );
if ( con_name == p->ConsoleName() )
{
return p->ConsoleNumber();
}
}
gi.dprintf( "Console %s does not exist\n", con_name.c_str() );
return 0;
}
//=============
//ConsoleExists
//=============
qboolean ConsoleManager::ConsoleExists
(
int con_number
)
{
int num,i;
Console *p;
// Check for mission computer
if ( con_number == mission_console_number )
return true;
num = consoleList.NumObjects();
for( i = 1; i <= num; i++ )
{
p = ( Console * )consoleList.ObjectAt( i );
if (p->ConsoleNumber() == con_number)
return true;
}
return false;
}
//==========
//ProcessCmd - Send this command to the script director.
//==========
void ConsoleManager::ProcessCmd
(
Event *ev
)
{
Director.ConsoleInput(ev->GetToken(1),ev->GetToken(2));
}
//==========
//ProcessVar - Send this variable to the script director.
//==========
void ConsoleManager::ProcessVar
(
Event *ev
)
{
Director.ConsoleVariable(ev->GetToken(1),ev->GetToken(2));
}
//=====================
//ConsolePositionReturn
//=====================
void ConsoleManager::ConsolePositionReturn
(
Event *ev
)
{
netconsole_t *svcon;
int num = ev->GetInteger(1);
if (!ConsoleExists(num))
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svcon->s.linepos = 1;
svcon->s.cmdline[svcon->s.linepos] = 0;
svcon->s.console_return_time = level.time;
}
//=======================
//ConsolePositionPositive
//=======================
void ConsoleManager::ConsolePositionPositive
(
Event *ev
)
{
netconsole_t *svcon;
int num = ev->GetInteger(1);
if (!ConsoleExists(num))
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
if (svcon->s.linepos < MAXCMDLINE-1)
{
svcon->s.cmdline[svcon->s.linepos] = ev->GetInteger(2);
svcon->s.linepos++;
svcon->s.cmdline[svcon->s.linepos] = 0;
}
}
//=======================
//ConsolePositionNegative
//=======================
void ConsoleManager::ConsolePositionNegative
(
Event *ev
)
{
netconsole_t *svcon;
int num = ev->GetInteger(1);
if (!ConsoleExists(num))
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
if (svcon->s.linepos > 1)
{
svcon->s.linepos--;
svcon->s.cmdline[svcon->s.linepos] = 0;
}
}
//===============
//ConsoleMenuInfo
//===============
void ConsoleManager::ConsoleMenuInfo
(
Event *ev
)
{
netconsole_t *svcon;
int num = ev->GetInteger(1);
if (!ConsoleExists(num))
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svcon->s.menu_level = ev->GetInteger(2);
svcon->s.sel_menu_item = ev->GetInteger(3);
}
void ConsoleManager::CreateMissionComputer
(
void
)
{
netconsole_t *con;
// Check for a free console on the server
if (globals.num_consoles >= globals.max_consoles)
gi.error("Console::CreateMissionComputer", "No free consoles\n" );
// Increment the global number of consoles.
globals.num_consoles++;
mission_console_number = globals.num_consoles;
con = &g_consoles[globals.num_consoles];
con->inuse = true;
con->s.spawnflags = 2|8;
con->s.consoleactive = true;
con->s.create_time = -1;
con->s.number = globals.num_consoles;
con->s.virtual_width = 320;
con->s.virtual_height = 240;
con->s.fraction = 1.0f;
con->s.rows = 30;
con->s.cols = 40;
con->s.menu_file[0] = 0;
con->s.linepos = 1;
con->s.menufile_update_time = 0;
strcpy( con->s.console_name, MISSION_CONSOLE );
con->s.name_update_time = -1;
con->s.console_return_time = 0;
}
void ConsoleManager::Reset
(
void
)
{
globals.num_consoles = 0;
mission_console_number = 0;
consoleList.ClearObjectList();
}
//==========
//AddConsole - Add a console to the manager
//==========
int ConsoleManager::AddConsole
(
Console *console
)
{
int num;
num = consoleList.AddObject( console );
return num;
}
//=============
//RemoveConsole - Remove a console from the manager
//=============
void ConsoleManager::RemoveConsole
(
Console *console
)
{
// Make sure that this exists in the manager
if ( consoleList.IndexOfObject( console ) )
consoleList.RemoveObject( console );
}
//============
//ConsolePrint - Print a string to the buffer of the console
//============
void ConsoleManager::ConsolePrint
(
Event *ev
)
{
char *bufptr;
const char *str;
netconbuffer_t *svbuff;
netconsole_t *svcon;
int *start;
int *end;
int num;
num = ConsoleExists( ev->GetString( 1 ) );
if ( !num )
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svbuff = &g_conbuffers[num];
bufptr = &svbuff->s.buffer[0];
start = &svbuff->s.start;
end = &svbuff->s.end;
str = ev->GetString(2);
svbuff->s.end_index += strlen(str);
while (*str)
{
if ( (*end+1)%MAX_BUFFER_LENGTH == (*start) )
{
svbuff->s.start_index += 1;
*start = (*start + 1)%MAX_BUFFER_LENGTH;
}
bufptr[*end]=*str;
*end = (*end+1) % MAX_BUFFER_LENGTH;
str++;
}
}
//==============
//ConsoleNewline - Prints a newline to the buffer of the console
//==============
void ConsoleManager::ConsoleNewline
(
Event *ev
)
{
ev->AddString("\n");
ConsolePrint(ev);
}
//=================
//ConsoleLayoutFile - Orders the console to load a client side layout file
//=================
void ConsoleManager::ConsoleLayoutFile
(
Event *ev
)
{
netconsole_t *svcon;
int num;
const char *layout_filename;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
layout_filename = ev->GetString(2);
strcpy(svcon->s.layout_file, layout_filename);
svcon->s.layoutfile_update_time = level.time;
}
//=============
//ConsoleLayout - Set the layout string
//=============
void ConsoleManager::ConsoleLayout
(
Event *ev
)
{
str console_name;
netconsole_t *svcon;
int num;
char *layout;
char *token;
char newlayout[ MAX_LAYOUT_LENGTH ];
static const char *seps = " ";
console_name = ev->GetString( 1 );
num = ConsoleExists( console_name );
if ( !num )
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[ num ];
layout = strdup( ev->GetString( 2 ) );
if ( strlen( layout ) > MAX_LAYOUT_LENGTH )
error( "ConsoleManager::ConsoleLayout", "Max layout length exceeded for %s\n", ev->GetString( 1 ) );
strcpy( newlayout, layout );
if ( coop->value && ( console_name == "missioncon" ) )
{
newlayout[ 0 ] = 0;
token = strtok( layout, seps );
while ( token )
{
// Skip over "fc" console commands in coop
if ( !strcmp( token, "fc" ) )
{
strtok( NULL, seps );
strtok( NULL, seps );
strtok( NULL, seps );
strtok( NULL, seps );
}
else if ( strstr( token, "---" ) )
{
strcat( newlayout, " " );
strcat( newlayout, "\"\"" );
// Skip over extraneous lines of characters
}
else
{
strcat( newlayout, " " );
strcat( newlayout, token );
}
token = strtok( NULL, seps );
}
}
free( layout );
strcpy( svcon->s.layout, newlayout );
svcon->s.layout_update_time = level.time;
}
//================
//ConsoleAppLayout - Append to the layout string
//================
void ConsoleManager::ConsoleAppLayout
(
Event *ev
)
{
netconsole_t *svcon;
int layout_length, num;
char *layout;
const char *token;
char newlayout[ MAX_LAYOUT_LENGTH ];
static const char *seps = " ";
str consolename;
consolename = ev->GetString( 1 );
num = ConsoleExists( consolename );
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
layout = strdup( ev->GetString( 2 ) );
layout_length = strlen(layout) + strlen(svcon->s.layout) + 1;
if ( layout_length > MAX_LAYOUT_LENGTH )
error("ConsoleManager::ConsoleAppLayout", "Max layout length exceeded for %s\n", ev->GetString(1) );
strcpy( newlayout, layout );
if ( coop->value && ( consolename == "missioncon" ) )
{
newlayout[ 0 ] = 0;
token = strtok( layout, seps );
while ( token )
{
// Skip over "fc" console commands in coop
if ( !strcmp( token, "fc" ) )
{
strtok ( NULL, seps );
strtok ( NULL, seps );
strtok ( NULL, seps );
strtok ( NULL, seps );
}
else if ( strstr( token, "---" ) )
{
strcat( newlayout, "\"\"" );
// Skip over extraneous lines of characters
}
else
{
strcat( newlayout, " " );
strcat( newlayout, token );
}
token = strtok( NULL, seps );
}
}
free( layout );
strcat(svcon->s.layout, " ");
strcat(svcon->s.layout, newlayout);
svcon->s.layout_update_time = level.time;
}
//==================
//ConsoleClearLayout - Clear the layout string
//==================
void ConsoleManager::ConsoleClearLayout
(
Event *ev
)
{
netconsole_t *svcon;
int num;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svcon->s.layout[0] = 0;
svcon->s.layout_update_time = level.time;
}
//===========
//ConsoleRows - Set the number of rows in the console
//===========
void ConsoleManager::ConsoleRows
(
Event *ev
)
{
netconsole_t *svcon;
int num;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svcon->s.rows = ev->GetInteger( 2 );
}
//==============
//ConsoleColumns - Set the number of columns in the console
//==============
void ConsoleManager::ConsoleColumns
(
Event *ev
)
{
netconsole_t *svcon;
int num;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svcon->s.cols = ev->GetInteger( 2 );
}
//===================
//ConsoleVirtualWidth - Set the virtual width of the console
//===================
void ConsoleManager::ConsoleVirtualWidth
(
Event *ev
)
{
netconsole_t *svcon;
int num;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svcon->s.virtual_width = ev->GetFloat( 2 );
}
//====================
//ConsoleVirtualHeight - Set the virtual height of the console
//====================
void ConsoleManager::ConsoleVirtualHeight
(
Event *ev
)
{
netconsole_t *svcon;
int num;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svcon->s.virtual_height = ev->GetFloat( 2 );
}
//===============
//ConsoleFraction - Set the fraction of the console that the scrolling
//part of the console covers.
//===============
void ConsoleManager::ConsoleFraction
(
Event *ev
)
{
netconsole_t *svcon;
int num;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svcon->s.fraction = ev->GetFloat( 2 );
}
//=================
//ConsoleDeactivate - Deactivate the console.
//=================
void ConsoleManager::ConsoleDeactivate
(
Event *ev
)
{
netconsole_t *svcon;
int num;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svcon->s.consoleactive = false;
}
//=================
//ConsoleActivate - Activate the console
//=================
void ConsoleManager::ConsoleActivate
(
Event *ev
)
{
netconsole_t *svcon;
int num;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svcon->s.consoleactive = true;
}
//============
//ConsoleClear - Clears the buffer of the scrolling part of the console
//============
void ConsoleManager::ConsoleClear
(
Event *ev
)
{
const char *bufptr;
netconbuffer_t *svbuff;
netconsole_t *svcon;
int num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svbuff = &g_conbuffers[num];
bufptr = &svbuff->s.buffer[0];
svbuff->s.start = 0;
svbuff->s.end = 0;
svbuff->s.end_index = 0;
svbuff->s.start_index = 0;
svcon->s.cleared_console_time = level.time;
}
//==============
//ConsoleManager - Load a client side menu file
//==============
void ConsoleManager::ConsoleLoadMenuFile
(
Event *ev
)
{
netconsole_t *svcon;
int num;
const char *path;
str mfile;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
path = ev->GetString(2);
mfile = G_FixSlashes( path );
strcpy(svcon->s.menu_file, mfile.c_str() );
svcon->s.menufile_update_time = level.time;
}
//============
//ConsoleFocus - Change the focus of console to the scrolling part or
//the menu part.
//============
void ConsoleManager::ConsoleFocus
(
Event *ev
)
{
const char *focus;
netconsole_t *svcon;
int num;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
focus = ev->GetString( 2 );
if (!stricmp(focus,"menu"))
{
svcon->s.focus = MENU3D;
}
else if (!strcmp(focus,"console"))
{
svcon->s.focus = CONSOLE3D;
}
else
{
error("ConsoleManager::ConsoleFocus", "invalid focus type\n" );
}
}
//=================
//ConsoleForeground - Set the foreground color of the console
//=================
void ConsoleManager::ConsoleForeground
(
Event *ev
)
{
netconsole_t *svcon;
int num;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svcon->s.red = ev->GetFloat( 2 );
svcon->s.green = ev->GetFloat( 3 );
svcon->s.blue = ev->GetFloat( 4 );
svcon->s.alpha = ev->GetFloat( 5 );
}
//===================
//ConsoleMenuActivate - Activates the menu (i.e. draw it)
//===================
void ConsoleManager::ConsoleMenuActive
(
Event *ev
)
{
netconsole_t *svcon;
int num;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svcon->s.menuactive = true;
}
//===================
//ConsoleMenuInactive - Deactivates the menu (i.e. don't draw it)
//===================
void ConsoleManager::ConsoleMenuInactive
(
Event *ev
)
{
netconsole_t *svcon;
int num;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
svcon = &g_consoles[num];
svcon->s.menuactive = false;
}
//================
//ConsoleStatusBar - Create a status bar on the console.
//================
void ConsoleManager::ConsoleStatusBar
(
Event *ev
)
{
netconsole_t *svcon;
int num;
int sbar_num;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
sbar_num = ev->GetInteger(2);
svcon = &g_consoles[num];
svcon->s.sbar[sbar_num].width = ev->GetFloat(3);
svcon->s.sbar[sbar_num].height = ev->GetFloat(4);
svcon->s.sbar[sbar_num].min = ev->GetFloat(5);
svcon->s.sbar[sbar_num].max = ev->GetFloat(6);
svcon->s.sbar[sbar_num].value = ev->GetFloat(7);
svcon->s.sbar[sbar_num].red = ev->GetFloat(8);
svcon->s.sbar[sbar_num].green = ev->GetFloat(9);
svcon->s.sbar[sbar_num].blue = ev->GetFloat(10);
svcon->s.sbar[sbar_num].alpha = ev->GetFloat(11);
svcon->s.sbar[sbar_num].update_time = level.time;
}
//=====================
//ConsoleStatusBarValue
//=====================
void ConsoleManager::ConsoleStatusBarValue
(
Event *ev
)
{
netconsole_t *svcon;
int num;
int sbar_num;
num = ConsoleExists(ev->GetString( 1 ));
if (!num)
{
// ConsoleExists will give a warning about this console not existing
return;
}
sbar_num = ev->GetInteger(2);
svcon = &g_consoles[num];
svcon->s.sbar[sbar_num].value = ev->GetFloat(3);
}
//================
//ConsoleKickUsers
//================
void ConsoleManager::ConsoleKickUsers
(
Event *ev
)
{
char msg[ MAX_MSGLEN ];
if (!ConsoleExists(ev->GetString( 1 )))
{
// ConsoleExists will give a warning about this console not existing
return;
}
sprintf(msg,"sku %s", ev->GetString(1));
gi.WriteByte (svc_console_command);
gi.WriteString (msg);
gi.multicast (NULL, MULTICAST_ALL);
}