1394 lines
36 KiB
C++
1394 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);
|
|
}
|