You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

452 lines
14 KiB

/*==LICENSE==*
CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011 Cyan Worlds, 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 <http://www.gnu.org/licenses/>.
You can contact Cyan Worlds, Inc. by email legal@cyan.com
or by snail mail at:
Cyan Worlds, Inc.
14617 N Newport Hwy
Mead, WA 99021
*==LICENSE==*/
//////////////////////////////////////////////////////////////////////////////
// //
// pfGameConsoleCommands //
// //
// Set of console commands that are actually meant for implementing //
// gameplay. Simpler than Python, easier to implement for programmers, and //
// far lower level, but should be used with extreme caution. //
// //
// Why? Because unlike normal console commands, which will eventually be //
// disabled in the shipping product (thus no danger of any fan cracking //
// them), these WILL be in the finished product. Debugging hacks and temp //
// workarounds to new features are NOT to be implemented here. //
// //
// Because of their nature, all Game. console commands should be approved //
// by Brice before checkin. //
// //
// Preferred method of adding Game. commands: //
// 1. Implement in normal console command groups (Debug. if nothing //
// else) //
// 2. Get the command approved //
// 3. Once command is tested and approved and deemed both worthy and //
// bug-free, cut-and-paste the command into the Game. group //
// //
//////////////////////////////////////////////////////////////////////////////
#ifdef PLASMA_EXTERNAL_RELEASE
#define LIMIT_CONSOLE_COMMANDS 1
#endif
#include "pfConsoleCmd.h"
#include "pfConsole.h"
#include "plPipeline.h"
#include "plgDispatch.h"
#include "../plGImage/plMipmap.h"
#include "../plGImage/plTGAWriter.h"
#include "../pfMessage/pfGameGUIMsg.h"
#include "../../NucleusLib/inc/hsResMgr.h"
#include "../pfGameGUIMgr/pfGUICtrlGenerator.h"
#include "../plAvatar/plAvatarMgr.h"
#include "../plAvatar/plAnimStage.h"
#include "../plAvatar/plAvBrainGeneric.h"
#include "../plAvatar/plAvBrainHuman.h"
#include "../plMessage/plAvatarMsg.h"
#include "../pnKeyedObject/plFixedKey.h"
#define PF_SANITY_CHECK( cond, msg ) { if( !( cond ) ) { PrintString( msg ); return; } }
//// DO NOT REMOVE!!!!
//// This is here so Microsoft VC won't decide to "optimize" this file out
//// DO NOT REMOVE!!!!
void pfConsoleCmdGroup::DummyJunior( void )
{
}
//// DO NOT REMOVE!!!!
//// plDoesFileExist //////////////////////////////////////////////////////////
// Utility function to determine whether the given file exists
static hsBool plDoesFileExist( const char *path )
{
hsUNIXStream stream;
if( !stream.Open( path, "rb" ) )
return false;
stream.Close();
return true;
}
//////////////////////////////////////////////////////////////////////////////
//// Game Group Commands /////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
PF_CONSOLE_GROUP( Game )
#ifndef LIMIT_CONSOLE_COMMANDS
PF_CONSOLE_CMD( Game, TakeScreenshot, "...", "Takes a shot of the current frame and saves it to the given file" )
{
hsAssert( pfConsole::GetPipeline() != nil, "Cannot use this command before pipeline initialization" );
plMipmap myMipmap;
char fileName[ 512 ];
UInt32 uniqueNumber;
if( numParams > 1 )
{
PrintString( "Too many parameters to TakeScreenshot" );
return;
}
else if( numParams == 1 )
strcpy( fileName, (char *)params[ 0 ] );
else
{
// Think up a filename
for( uniqueNumber = 1; uniqueNumber < 1000; uniqueNumber++ )
{
sprintf( fileName, "screen%03d.tga", uniqueNumber );
if( !plDoesFileExist( fileName ) )
break;
}
if( uniqueNumber == 1000 )
{
PrintString( "Out of filenames for TakeScreenshot" );
return;
}
}
if( !pfConsole::GetPipeline()->CaptureScreen( &myMipmap ) )
PrintString( "Error capturing screenshot" );
else
{
char str[ 512 ];
plTGAWriter::Instance().WriteMipmap( fileName, &myMipmap );
sprintf( str, "Screenshot written to '%s'.", fileName );
PrintString( str );
}
}
PF_CONSOLE_CMD( Game, LoadDialog, "string dlgName", "Loads the given GUI dialog into memory" )
{
plUoid lu( kGameGUIMgr_KEY );
plKey mgrKey = hsgResMgr::ResMgr()->FindKey( lu );
if( mgrKey )
{
pfGameGUIMsg *msg = TRACKED_NEW pfGameGUIMsg( mgrKey, pfGameGUIMsg::kLoadDialog );
msg->SetString( params[ 0 ] );
plgDispatch::MsgSend( msg );
}
}
PF_CONSOLE_CMD( Game, LoadLocalDialog, "string ageName, string dlgName", "Loads the given GUI dialog into memory" )
{
plUoid lu( kGameGUIMgr_KEY );
plKey mgrKey = hsgResMgr::ResMgr()->FindKey( lu );
if( mgrKey )
{
pfGameGUIMsg *msg = TRACKED_NEW pfGameGUIMsg( mgrKey, pfGameGUIMsg::kLoadDialog );
msg->SetString( params[ 1 ] );
msg->SetAge( params[ 0 ] );
plgDispatch::MsgSend( msg );
}
}
PF_CONSOLE_CMD( Game, ShowDialog, "string dlgName", "Shows the given GUI dialog" )
{
plUoid lu( kGameGUIMgr_KEY );
plKey mgrKey = hsgResMgr::ResMgr()->FindKey( lu );
if( mgrKey )
{
pfGameGUIMsg *msg = TRACKED_NEW pfGameGUIMsg( mgrKey, pfGameGUIMsg::kShowDialog );
msg->SetString( params[ 0 ] );
plgDispatch::MsgSend( msg );
}
}
PF_CONSOLE_CMD( Game, HideDialog, "string dlgName", "Hides the given GUI dialog" )
{
plUoid lu( kGameGUIMgr_KEY );
plKey mgrKey = hsgResMgr::ResMgr()->FindKey( lu );
if( mgrKey )
{
pfGameGUIMsg *msg = TRACKED_NEW pfGameGUIMsg( mgrKey, pfGameGUIMsg::kHideDialog );
msg->SetString( params[ 0 ] );
plgDispatch::MsgSend( msg );
}
}
PF_CONSOLE_CMD( Game, SwitchDialog, "string olddlgName, string newdlgName", "Hide olddlg and show newdlg" )
{
plUoid lu( kGameGUIMgr_KEY );
plKey mgrKey = hsgResMgr::ResMgr()->FindKey( lu );
if( mgrKey )
{
pfGameGUIMsg *msg = TRACKED_NEW pfGameGUIMsg( mgrKey, pfGameGUIMsg::kHideDialog );
msg->SetString( params[ 0 ] );
plgDispatch::MsgSend( msg );
pfGameGUIMsg *msg2 = TRACKED_NEW pfGameGUIMsg( mgrKey, pfGameGUIMsg::kShowDialog );
msg2->SetString( params[ 1 ] );
plgDispatch::MsgSend( msg2 );
}
}
PF_CONSOLE_SUBGROUP( Game, GUI )
#include "../pfGameGUIMgr/pfGUICtrlGenerator.h"
static hsColorRGBA sDynCtrlColor = hsColorRGBA().Set( 1, 1, 1, 1 ), sDynCtrlTextColor = hsColorRGBA().Set( 0, 0, 0, 1 );
PF_CONSOLE_CMD( Game_GUI, SetDynamicCtrlColor, "float bgRed, float bgGreen, float bgBlue, float textRed, float textGreen, float textBlue", "" )
{
sDynCtrlColor.Set( params[ 0 ], params[ 1 ], params[ 2 ], 1.f );
sDynCtrlTextColor.Set( params[ 3 ], params[ 4 ], params[ 5 ], 1.f );
}
PF_CONSOLE_CMD( Game_GUI, CreateRectButton, "string title, float x, float y, float width, float height, string command", "" )
{
pfGUICtrlGenerator::Instance().GenerateRectButton( params[ 0 ], params[ 1 ], params[ 2 ],
params[ 3 ], params[ 4 ],
params[ 5 ],
sDynCtrlColor, sDynCtrlTextColor );
}
PF_CONSOLE_CMD( Game_GUI, CreateRoundButton, "float x, float y, float radius, string command", "" )
{
pfGUICtrlGenerator::Instance().GenerateSphereButton( params[ 0 ], params[ 1 ], params[ 2 ],
params[ 3 ],
sDynCtrlColor );
}
PF_CONSOLE_CMD( Game_GUI, CreateDragBar, "float x, float y, float width, float height", "")
{
pfGUICtrlGenerator::Instance().GenerateDragBar( params[ 0 ], params[ 1 ], params[ 2 ], params[ 3 ], sDynCtrlColor );
}
PF_CONSOLE_CMD( Game_GUI, CreateDialog, "string name", "" )
{
pfGUICtrlGenerator::Instance().GenerateDialog( params[ 0 ] );
}
#endif
//#include "../pfKI/pfKI.h"
#include "../pfMessage/pfKIMsg.h"
PF_CONSOLE_CMD( Game, EnterChatMode, "", "Enters in-game chat mode" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kEnterChatMode);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KIToggleMini, "", "Toggle between mini and big KI" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kMiniBigKIToggle);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KIPutAway, "", "Put KI completely away" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kKIPutAway);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KIChatPageUp, "", "Scroll chat display one page up" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kChatAreaPageUp);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KIChatPageDown, "", "Scroll chat display one page down" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kChatAreaPageDown);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KIChatToStart, "", "Scroll chat display to top of buffer" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kChatAreaGoToBegin);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KIChatToEnd, "", "Scroll chat display to bottom of buffer" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kChatAreaGoToEnd);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KITakePicture, "", "Take picture with KI" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kKITakePicture);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KICreateJournal, "", "Create journal note entry" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kKICreateJournalNote);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KIChatToggleFaded, "", "Toggle fade of chat display" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kKIToggleFade);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KIChatToggleFadeEnable, "", "Toggle enable of chat fade" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kKIToggleFadeEnable);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KIUpSizeFont, "", "Up size the KI font (chatarea)" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kKIUpSizeFont);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KIDownSizeFont, "", "Down size the KI font (chatarea)" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kKIDownSizeFont);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KIOpenYeeshaBook, "", "Open the player's Yeesha book" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kKIOpenYeehsaBook);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KIOpenKI, "", "Open the KI a little at a time" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kKIOpenKI);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KIHelp, "", "Open the CCR help dialog" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kKIShowCCRHelp);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KICreateMarker, "", "Create marker in the working marker folder" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kKICreateMarker);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, KICreateMarkerFolder, "", "Create marker folder in current Age's journal folder" )
{
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kKICreateMarkerFolder);
plgDispatch::MsgSend( msg );
}
PF_CONSOLE_CMD( Game, SetChatFadeDelay, "float delayInSecs", "Sets the time in seconds before the chat text disappears" )
{
// pfKI::GetInstance()->SetChatFadeDelay( params[ 0 ] );
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kSetChatFadeDelay);
msg->SetDelay( params[0] );
plgDispatch::MsgSend( msg );
}
#include "../plAvatar/plArmatureMod.h"
PF_CONSOLE_CMD( Game, LimitAvatarLOD, "int newLOD", "Zero is (always) highest detail; 2 is (currently) lowest." )
{
int newLOD = params[0];
if(newLOD >= 0 && newLOD <= 2)
plArmatureLODMod::fMinLOD = newLOD;
}
PF_CONSOLE_SUBGROUP( Game, Emote) // Game.Emote.Shakefist
void Emote(const char *emotion, float fadeIn = 2.0, float fadeOut = 2.0)
{
plArmatureMod *avatar = plAvatarMgr::GetInstance()->GetLocalAvatar();
AvatarEmote(avatar, emotion);
}
PF_CONSOLE_CMD( Game_Emote, Wave, "", "")
{
Emote("Wave", 4.0, 1.0);
}
PF_CONSOLE_CMD( Game_Emote, Sneeze, "", "")
{
Emote("Sneeze");
}
PF_CONSOLE_CMD( Game_Emote, Dance, "", "")
{
Emote("Dance");
}
PF_CONSOLE_CMD( Game_Emote, Laugh, "", "")
{
Emote("Laugh");
}
PF_CONSOLE_CMD( Game_Emote, Clap, "", "")
{
Emote("Clap", 4.0, 3.0);
}
PF_CONSOLE_CMD( Game_Emote, Talk, "", "")
{
Emote("Talk");
}
PF_CONSOLE_CMD( Game_Emote, Sit, "", "")
{
plArmatureMod *avatar = plAvatarMgr::GetInstance()->GetLocalAvatar();
PushSimpleMultiStage(avatar, "SitDownGround", "SitIdleGround", "SitStandGround", true, true, plAGAnim::kBodyLower, plAvBrainGeneric::kSitOnGround);
}
#ifndef PLASMA_EXTERNAL_RELEASE
PF_CONSOLE_CMD( Game, SetLocalClientAsAdmin, "bool enable", "Makes chat messages from this client appear as admin messages" )
{
// pfKI::GetInstance()->SetTextChatAdminMode( (bool)params[ 0 ] );
pfKIMsg* msg = TRACKED_NEW pfKIMsg(pfKIMsg::kSetTextChatAdminMode);
msg->SetFlags( params[0] ? pfKIMsg::kAdminMsg : 0 );
plgDispatch::MsgSend( msg );
}
#endif
#include "../pfConditional/plObjectInBoxConditionalObject.h"
PF_CONSOLE_CMD( Game, BreakVolumeSensors, "bool break", "reverts to old broken volume sensor logic" )
{
bool b = params[ 0 ];
plVolumeSensorConditionalObject::makeBriceHappyVar = !b;
}