📄 console.cpp
字号:
//-----------------------------------------------------------------------------
//
// $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 },
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -