You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ryzom-core/ryzom/tools/client/client_multi/commands.cpp

2857 lines
81 KiB
C++

/** \file commands.cpp
* File with all the commands for the console.
*
* $Id: commands.cpp,v 1.8 2004/06/23 15:03:04 lecroart Exp $
*/
//////////////
// Includes //
//////////////
#include "stdpch.h"
// Game Share
#include "game_share/generic_xml_msg_mngr.h"
#include "game_share/visual_slot_manager.h"
// Misc.
#include "nel/misc/command.h"
#include "nel/misc/i18n.h"
#include "nel/misc/bit_mem_stream.h"
// 3D Interface.
#include "nel/3d/u_scene.h"
#include "nel/3d/u_landscape.h"
#include "nel/3d/u_play_list.h"
#include "nel/3d/u_animation_set.h"
#include "nel/3d/u_animation.h"
#include "nel/3d/u_track.h"
#include "nel/3d/u_play_list_manager.h"
// Client.
#include "interface_manager.h"
#include "commands.h"
#include "user_entity.h"
#include "entity_animation_manager.h"
#include "firework.h"
#include "view.h"
#include "time_client.h"
#include "entities.h"
#include "world_database_manager.h"
#include "continent_manager.h"
#include "continent.h"
#include "ig_client.h"
#include "ingame_database_manager.h"
#include "client_chat_manager.h"
#include "net_manager.h"
#include "pacs_client.h"
#include "teleport.h"
#include "misc.h"
#include "sheet_manager.h"
#include "demo.h"
#include "sound_manager.h"
#include "cdb_leaf.h"
#include "debug_client.h"
#include "input_handler_manager.h"
// game share
#include "game_share/brick_types.h"
#include "game_share/player_visual_properties.h"
#include "game_share/ryzom_version.h"
#include "game_share/mode_and_behaviour.h"
#include "brick_manager.h"
////////////
// DEFINE //
////////////
//#define _LIMITED_COMMAND_ // Disable some commands
#define _CMD_CHEAT_ON_ // Activate cheat commands
#define _CMD_TEST_ON_ // Activate test commands
#define _CMD_DEBUG_ON_ // Activate debug commands
////////////////
// Namespaces //
////////////////
using namespace NLMISC;
using namespace NL3D;
using namespace NLNET;
using namespace std;
/////////////
// Externs //
/////////////
extern CUserEntity UserEntity;
extern UScene * Scene;
extern ULandscape * Landscape;
extern CEntityAnimationManager * EAM;
extern CFirework * Firework;
extern CClientChatManager ChatMngr;
extern CGenericXmlMsgHeaderManager GenericMsgHeaderMngr;
extern ::CNetManagerMulti NetMngr;
extern CInterfaceManager *IM;
//////////////
// COMMANDS //
//////////////
////////////////////
// FINAL COMMANDS //
//-----------------------------------------------
// 'emote' : play an emote.
//-----------------------------------------------
NLMISC_COMMAND(emote, "play an emote.", "<number>")
{
const uint nbEmotes = EAM->getNbEmots();
// Check parameters.
if(args.size() == 1)
{
// Check the number is valid.
uint num = atoi(args[0].c_str());
if(num < nbEmotes)
{
// Create the message and send.
const string msgName = "COMMAND:EMOTE";
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream(msgName, out))
{
MBEHAV::EBehaviour behaviour = (MBEHAV::EBehaviour)(MBEHAV::EMOTE_BEGIN + num);
out.serialEnum(behaviour);
NetMngr.push(out);
}
else
nlwarning("command 'emote': unknown message named '%s'.", msgName.c_str());
// Command Well done.
return true;
}
}
CInterfaceManager::getInstance()->displaySystemInfo(ucstring("This command need 1 paramter and this must be one of the following number :"));
CAnimationState::TAnimStateId result;
for(uint i = 0; i<nbEmotes; ++i)
{
EAM->getEmot(i, result);
CInterfaceManager::getInstance()->displaySystemInfo(ucstring(NLMISC::toString("%d - %s", i, CAnimationState::getAnimationStateName(result).c_str ())));
}
// Command Well done.
return true;
}// chat_mode //
//-----------------------------------------------
// 'guildSymbol' : Show/Hide the Guild Symbol.
//-----------------------------------------------
NLMISC_COMMAND(guildSymbol, "Show/Hide the Guild Symbol.", "")
{
// Check parameters.
if(args.size() != 0)
return false;
// Invert the state.
GuildSymbol.Active = !GuildSymbol.Active;
// Command Well done.
return true;
}// chat_mode //
//-----------------------------------------------
// 'chatMode' : To specify how you will speak and who will be able to hear you.
//-----------------------------------------------
NLMISC_COMMAND(chatMode, "To specify how will you speak and who will be able to hear you.", "<mode : [say|shout|universe|team|clade]>")
{
// Check parameters.
if(args.size() != 1)
return false;
CInputHandlerManager *pIHM = CInputHandlerManager::getInstance();
uint8 mode ;
if (args[0] == "say")
mode = 0;
else if(args[0] == "shout")
mode = 1;
else if(args[0] == "universe")
mode = 2;
else if(args[0] == "team")
mode = 3;
else if(args[0] == "clade")
mode = 4;
else
{
nlwarning("Command 'chatMode': unknown chat mode '%s'.", args[0].c_str());
return false;
}
// Display debug info.
nlinfo("Command 'chatMode': '%s' mode.", args[0].c_str());
// Set the chat mode.
ChatMngr.setChatMode(mode);
// Command Well done.
return true;
}// chat_mode //
//-----------------------------------------------
// 'tell' : send a private message to a unique player.
//-----------------------------------------------
NLMISC_COMMAND(tell, "send a private message to a unique player", "<char name><message>")
{
// Check parameters.
if(args.size() < 2)
return false;
// Compute the message.
string message;
for(uint i=1; i<args.size(); i++)
message += args[i] + " ";
// Send the message.
string receiver = args[0];
ChatMngr.tell(receiver, message);
// Command Well done.
return true;
}// tell //
//-----------------------------------------------
// 'bugReport' : to report a bug.
//-----------------------------------------------
NLMISC_COMMAND(bugReport, "call the bug report tool with dump.", "<AddScreenshot>")
{
const char *brname[] = { "bug_report.exe", "bug_report_r.exe", "bug_report_rd.exe", "bug_report_df.exe", "bug_report_d.exe" };
string brn;
for (uint i = 0; i < sizeof(brname)/sizeof(brname[0]); i++)
{
if (CFile::fileExists (brname[i]))
{
brn = brname[i];
break;
}
}
if (brn.empty())
{
log.displayNL("bug_report*.exe not found");
return false;
}
string sys;
sys = "Language "+CI18N::getCurrentLanguageName().toString() +" ";
if (args.size()>0)
{
uint8 quality = atoi (args[0].c_str());
if (quality == 0)
quality = 80;
CBitmap btm;
Driver->getBuffer(btm);
string filename = CFile::findNewFile ("screenshot.jpg");
COFile fs(filename);
btm.writeJPG(fs, quality);
sys += "AttachedFile "+filename+" ";
}
sys += "ClientVersion "RYZOM_VERSION" ";
// for now, set the same version than client one
sys += "ShardVersion "RYZOM_VERSION" ";
if (ClientCfg.Local)
sys += "ShardName OFFLINE ";
FILE *fp = fopen ("bug_report.txt", "wb");
if (fp != NULL)
{
// must put \r\n each line
fprintf (fp, "UserPosition: %.2f %.2f %.2f\r\n", View.viewPos().x, View.viewPos().y, View.viewPos().z);
fprintf (fp, "ServerTick: %u\r\n", NetMngr.getCurrentServerTick() );
fprintf (fp, "LocalAddress: %s\r\n", NetMngr.getAddress().asString().c_str() );
// TODO add debug information for the bug report
fclose (fp);
sys += "DumpFilename bug_report.txt ";
}
nlinfo ("Calling for bug report : '%s %s'", brn.c_str(), sys.c_str());
launchProgram(brn, sys);
return true;
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////// COMMANDS after should NOT appear IN the FINAL VERSION ///////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
#if !FINAL_VERSION
NLMISC_COMMAND(missionReward, "debug"," ")
{
if (args.size() == 1)
{
uint8 index = atoi( args[1].c_str() );
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("BOTCHAT:COMPLETE_MISSION", out))
{
out.serial(index);
NetMngr.push(out);
}
else
nlwarning("<CBotChat acceptMission> : unknown message name : BOTCHAT:COMPLETE_MISSION");
return true;
}
return false;
}
NLMISC_COMMAND(missionProgress, "debug"," ")
{
if (args.size() == 1)
{
uint8 index = atoi( args[1].c_str() );
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("BOTCHAT:PROGRESS_MISSION", out))
{
out.serial(index);
NetMngr.push(out);
}
else
nlwarning("<CBotChat acceptMission> : unknown message name : BOTCHAT:PROGRESS_MISSION");
return true;
}
return false;
}
/*
NLMISC_COMMAND( displayDBModifs, "display server database modification in the chat window"," ")
{
if ( VerboseDatabase )
CInterfaceManager::getInstance()->getChatOutput()->addTextChild(ucstring("the database is already in verbose mode"),CRGBA(255,255,255,255));
else
{
CInterfaceManager::getInstance()->getChatOutput()->addTextChild(ucstring("database is now in verbose mode"),CRGBA(255,255,255,255));
VerboseDatabase = true;
}
return true;
}
NLMISC_COMMAND( hideDBModifs, "stop displaying server database modification in the chat window"," ")
{
if ( !VerboseDatabase )
CInterfaceManager::getInstance()->getChatOutput()->addTextChild(ucstring("the database is already not in verbose mode"),CRGBA(255,255,255,255));
else
{
CInterfaceManager::getInstance()->getChatOutput()->addTextChild(ucstring("database is not in verbose mode anymore"),CRGBA(255,255,255,255));
VerboseDatabase = false;
}
return true;
}
*/
NLMISC_COMMAND(save_sentences, "save sentences"," ")
{
// CSentenceDisplayer::saveSentences();
return true;
}
NLMISC_COMMAND(get_sheet_id, "get_sheet_id","<sheet file name>")
{
if (args.size() != 1)
return false;
CSheetId id(args[0]);
char buf[10];
itoa( id.asInt(),buf,10 );
CInterfaceManager::getInstance()->displaySystemInfo(ucstring(buf));
return true;
}
NLMISC_COMMAND(get_sheet_name, "get_sheet_name","<Sheet Id>")
{
if (args.size() != 1)
return false;
CSheetId id( atoi(args[0].c_str()) );
string name = id.toString();
CInterfaceManager::getInstance()->displaySystemInfo(ucstring(name));
return true;
}
NLMISC_COMMAND(forget_all, "forget all bricks", "")
{
// Check parameters.
if(args.size() != 0)
{
return false;
}
char buf[100];
for (uint i = 0;i<20;i++)
{
sprintf(buf,"SERVER:BRICK_FAMILY:%d:BRICKS",i);
CCDBNodeLeaf * node= CInterfaceManager::getInstance()->getDbProp(buf);
node->setValue64(0);
}
return true;
} // forget_all //
//-----------------------------------------------
// 'use_preprog_magic'
//-----------------------------------------------
NLMISC_COMMAND(use_preprog_magic, "use the specified magic preprog sentence", "<sentence id>")
{
// Check parameters.
if(args.size() != 1)
{
return false;
}
// Create the message for the server to execute a phrase.
const string msgName = "SENTENCE:EXECUTE";
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("SENTENCE:EXECUTE", out))
{
uint8 phrase = atoi(args[0].c_str() );
out.serial(phrase);
BRICK_TYPE::EBrickType type = BRICK_TYPE::MAGIC;
out.serialEnum( type );
NetMngr.push(out);
}
else
nlwarning("mainLoop : unknown message name : '%s'.", msgName.c_str());
return true;
} // use_preprog_magic //
//-----------------------------------------------
// 'use_preprog_combat'
//-----------------------------------------------
NLMISC_COMMAND(use_preprog_combat, "use the specified combat preprog sentence", "<sentence id>")
{
// Check parameters.
if(args.size() != 1)
{
return false;
}
// Create the message for the server to execute a phrase.
const string msgName = "SENTENCE:EXECUTE";
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("SENTENCE:EXECUTE", out))
{
uint8 phrase = atoi(args[0].c_str() );
out.serial(phrase);
BRICK_TYPE::EBrickType type = BRICK_TYPE::COMBAT;
out.serialEnum( type );
NetMngr.push(out);
}
else
nlwarning("mainLoop : unknown message name : '%s'.", msgName.c_str());
return true;
} // use_preprog_combat //
//-----------------------------------------------
// 'engage'
//-----------------------------------------------
NLMISC_COMMAND(engage, "engage target in combat", "")
{
// Create the message for the server to execute a phrase.
const string msgName = "COMBAT:ENGAGE";
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream(msgName, out))
{
NetMngr.push(out);
}
else
nlwarning("mainLoop : unknown message name : '%s'.", msgName.c_str());
return true;
} // engage //
//-----------------------------------------------
// 'default_attack'
//-----------------------------------------------
NLMISC_COMMAND(default_attack, "use default attack on target", "")
{
// Default attack on the current selection.
UserEntity.attack();
// Well Done.
return true;
}// default_attack //
//-----------------------------------------------
// 'disengage'
//-----------------------------------------------
NLMISC_COMMAND(disengage, "disengage from combat", "")
{
// Disengage from combat.
UserEntity.disengage();
// Well Done.
return true;
}// disengage //
//-----------------------------------------------
// 'create_team'
//-----------------------------------------------
NLMISC_COMMAND(create_team, "create a new team", "")
{
// Create the message for the server to execute a phrase.
const string msgName = "TEAM:CREATE";
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream(msgName, out))
{
NetMngr.push(out);
}
else
nlwarning("mainLoop : unknown message name : '%s'.", msgName.c_str());
return true;
} // create_team //
//-----------------------------------------------
// 'leave_team'
//-----------------------------------------------
NLMISC_COMMAND(leave_team, "leave team", "")
{
// Create the message for the server to execute a phrase.
const string msgName = "TEAM:LEAVE";
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream(msgName, out))
{
NetMngr.push(out);
}
else
nlwarning("mainLoop : unknown message name : '%s'.", msgName.c_str());
return true;
} // leave_team //
//-----------------------------------------------
// 'join_team'
//-----------------------------------------------
NLMISC_COMMAND(join_team, "join the specified team", "")
{
// Create the message for the server to execute a phrase.
const string msgName = "TEAM:JOIN";
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream(msgName, out))
{
NetMngr.push(out);
}
else
nlwarning("mainLoop : unknown message name : '%s'.", msgName.c_str());
return true;
} // join_team //
//-----------------------------------------------
// 'join_team_proposal'
//-----------------------------------------------
NLMISC_COMMAND(join_team_proposal, "propose to current target to join the team", "")
{
// Create the message for the server to execute a phrase.
const string msgName = "TEAM:JOIN_PROPOSAL";
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream(msgName, out))
{
NetMngr.push(out);
}
else
nlwarning("mainLoop : unknown message name : '%s'.", msgName.c_str());
return true;
} // join_team_proposal //
//-----------------------------------------------
// 'join_team_decline'
//-----------------------------------------------
NLMISC_COMMAND(join_team_decline, "decline a join team proposal", "")
{
// Create the message for the server to execute a phrase.
const string msgName = "TEAM:JOIN_PROPOSAL_DECLINE";
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream(msgName, out))
{
NetMngr.push(out);
}
else
nlwarning("mainLoop : unknown message name : '%s'.", msgName.c_str());
return true;
} // join_team_decline //
//-----------------------------------------------
// 'kick_teammate'
//-----------------------------------------------
NLMISC_COMMAND(kick_teammate, "kick someone from your team", "")
{
// Create the message for the server to execute a phrase.
const string msgName = "TEAM:KICK";
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream(msgName, out))
{
NetMngr.push(out);
}
else
nlwarning("mainLoop : unknown message name : '%s'.", msgName.c_str());
return true;
} // kick_teammate //
//-----------------------------------------------
// 'cancel_current_sentence'
//-----------------------------------------------
NLMISC_COMMAND(cancel_current_sentence, "cancel the sentence being executed", "")
{
// no parameter needed
// Create the message for the server to cancel the phrase being executed
const string msgName = "SENTENCE:CANCEL_CURRENT";
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream(msgName, out))
{
NetMngr.push(out);
}
else
nlwarning("command : unknown message name : '%s'.", msgName.c_str());
return true;
} // cancel_current_sentence //
//-----------------------------------------------
// 'cancel_all_sentences'
//-----------------------------------------------
NLMISC_COMMAND(cancel_all_sentences, "cancel all the sentences being executed", "")
{
// no parameter needed
// Create the message for the server to cancel the phrase being executed
const string msgName = "SENTENCE:CANCEL_ALL";
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream(msgName, out))
{
NetMngr.push(out);
}
else
nlwarning("command : unknown message name : '%s'.", msgName.c_str());
return true;
} // cancel_all_sentences //
//-----------------------------------------------
// 'ignore'
//-----------------------------------------------
NLMISC_COMMAND(ignore, "add or remove a player from the ignore list", "<player name>")
{
// Check parameters.
if(args.size() < 1)
{
return false;
}
// send info
string player = args[0];
ChatMngr.ignore( player );
return true;
} // ignore //
/*
//-----------------------------------------------
// drop :
//-----------------------------------------------
NLMISC_COMMAND(drop,"drop an item to the ground","<id>")
{
if( args.size() < 1 )
{
return false;
}
uint32 id = atoi( args[0].c_str() );
CEntityId itemId(RYZOMID::object,id);
sint32 x = (sint32)UserEntity.pos().x * 1000;
sint32 y = (sint32)UserEntity.pos().y * 1000;
sint32 z = (sint32)UserEntity.pos().z * 1000;
CBitMemStream bms;
string msgType = "ITEM:DROP";
if( GenericMsgHeaderMngr.pushNameToStream(msgType,bms) )
{
bms.serial( itemId );
bms.serial( x );
bms.serial( y );
bms.serial( z );
NetMngr.push( bms );
nldebug("<drop> sending 'ITEM:DROP' message to server");
}
else
{
nlwarning("<drop> unknown message name : ITEM:DROP");
}
return true;
}// drop //
*/
//////////
// DEMO //
class CDummyProgress : public IProgressCallback
{
void progress (float value) {};
};
#ifndef _LIMITED_COMMAND_
//-----------------------------------------------
// teleport :
// Teleport the User somewhere else.
//-----------------------------------------------
void teleport(const CVectorD &pos)
{
if(!ClientCfg.Local)
{
// Create the message for the server to teleport the character.
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("TP:WANTED", out))
{
sint32 x = (sint32)(pos.x*1000.0);
sint32 y = (sint32)(pos.y*1000.0);
sint32 z = (sint32)(pos.z*1000.0);
out.serial( x );
out.serial( y );
out.serial( z );
// Add the message to the send list.
NetMngr.push(out);
// send TELEPORT
nldebug("teleport: TELEPORT sent");
}
else
nlwarning("teleport: unknown message name : 'TP:WANTED'.");
}
else
{
// Remove the selection.
UserEntity.selection(CLFECOMMON::INVALID_SLOT);
// Remove the target.
UserEntity.targetSlot(CLFECOMMON::INVALID_SLOT);
// Change the position of the entity and in Pacs.
UserEntity.pos(pos);
// Select the closest continent from the new position.
CDummyProgress dummy;
ContinentMngr.select(pos, dummy);
// Change the position of the entity and in Pacs.
UserEntity.pacsPos(pos);
}
}// teleport //
//-----------------------------------------------
// 'pos' : Command To change the user position.
//-----------------------------------------------
NLMISC_COMMAND(pos, "Change the position of the user.", "<x, y, (z)> OR 1 name of 'tp.teleport_list'. or a bot name")
{
CVectorD newPos;
// Named destination.
if(args.size() == 1)
{
string dest = args[0];
newPos = CTeleport::getPos(NLMISC::strlwr(dest));
if(newPos == CTeleport::Unknown)
{
//here we try to teleport to a bot destination
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("TP:BOT", out))
{
string str = args[0];
out.serial( str );
nldebug("/pos: TP:BOT sent");
NetMngr.push(out);
}
else
nlwarning("/pos: unknown message name : 'TP:BOT'.");
return true;
}
}
// Teleport to anywhere.
else if(args.size() == 2 || args.size() == 3)
{
newPos.x = atof(args[0].c_str());
newPos.y = atof(args[1].c_str());
if(args.size() == 3)
newPos.z = atof(args[2].c_str());
else
newPos.z = 0.0;
}
// Bad argument number.
else
return false;
// Teleport to the right destination.
teleport(newPos);
// Command well done.
return true;
}
//-----------------------------------------------
// 'entity' : Create an entity on the user or just remove it if Form not valid.
//-----------------------------------------------
NLMISC_COMMAND(entity, "Create an entity on the user or just remove it if Form not valid.", "<Slot> <Form>")
{
// Check parameters.
if(args.size() != 2)
return false;
// Try to create the sheet with the parameter as a string.
CSheetId sheetId;
if(!sheetId.build(args[1]))
{
// Try to create the sheet with the parameter as an int.
sheetId = atoi(args[1].c_str());
if(sheetId == CSheetId::Unknown)
{
nlwarning("Command 'entity': '%s' is not a valid form.", args[1]);
return false;
}
}
// The slot where the new entity will be.
CLFECOMMON::TCLEntityId slot = (CLFECOMMON::TCLEntityId)atoi(args[0].c_str());
// Debug Infos
nldebug("Command 'entity' : AddNewEntity with form %s in the slot %d.", args[1].c_str(), slot);
// Remove the old entity.
EntitiesMngr.remove(slot, false);
// Create the new entity.
CEntityCL *entity = EntitiesMngr.create(slot, sheetId.asInt());
if(entity)
{
// Update VP if Player
if(dynamic_cast<CPlayerCL *>(entity))
{
SPropVisualA visualA;
visualA.PropertySubData.Sex = ClientCfg.Sex;
SPropVisualB visualB;
SPropVisualC visualC;
sint64 *prop = (sint64 *)&visualB;
IM->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_VPB))->setValue64(*prop);
prop = (sint64 *)&visualC;
IM->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_VPC))->setValue64(*prop);
prop = (sint64 *)&visualA;
IM->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_VPA))->setValue64(*prop);
EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_VPA);
}
// Compute the position.
sint64 x = (sint64)((UserEntity.pos().x+UserEntity.front().x*2.0)*1000.0);
sint64 y = (sint64)((UserEntity.pos().y+UserEntity.front().y*2.0)*1000.0);
sint64 z = (sint64)((UserEntity.pos().z+UserEntity.front().z*2.0)*1000.0);
// Write the position in the DB.
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P0", x);
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P1", y);
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P2", z);
// Update the position.
EntitiesMngr.updateVisualProperty(0, slot, 0);
// Set the direction
entity->front(UserEntity.front());
entity->dir(UserEntity.front());
nlinfo("entity: slot: %d \"%s\", \"%f\", \"%f\", \"%f\", \"%f\", \"%f\", \"%f\" ",slot,args[1].c_str(),
(UserEntity.pos().x+UserEntity.front().x*2.0), (UserEntity.pos().y+UserEntity.front().y*2.0), (UserEntity.pos().z+UserEntity.front().z*2.0));
// UserEntity.front().x, UserEntity.front().y, UserEntity.front().z );
}
else
nldebug("command 'entity' : entity in slot %d removed.", slot);
// Command well done.
return true;
}// entity //
////////////////////
// DEBUG COMMANDS //
#include "string_manager_client.h"
#ifdef ENABLE_INCOMING_MSG_RECORDER
//-----------------------------------------------
// record
//-----------------------------------------------
NLMISC_COMMAND(record, "Start Recording", "name")
{
// Check parameters.
if(args.size() != 1)
return false;
// Warning when already recording.
if(NetMngr.isRecording())
{
IM->displaySystemInfo(ucstring("Already Recording. Stop the current Record first"));
return true;
}
// Save entities and DB.
dump(args[0]);
// On/Off record.
if(!ClientCfg.Local)
NetMngr.setRecordingMode(true, args[0]+"_net.rec");
return true;
}// record //
//-----------------------------------------------
// replay
//-----------------------------------------------
NLMISC_COMMAND(replay, "replay", "name")
{
// Check parameters.
if(args.size() != 1)
return false;
// Load entities and DB.
loadDump(args[0]);
// On/Off record.
if(ClientCfg.Local)
NetMngr.setReplayingMode(!NetMngr.isReplaying(), args[0]+"_net.rec");
return true;
}// replay //
//-----------------------------------------------
// stopRecord
//-----------------------------------------------
NLMISC_COMMAND(stopRecord, "Stop Recording", "")
{
// Check parameters.
if(args.size() != 0)
return false;
// On/Off record.
if(!ClientCfg.Local)
NetMngr.setRecordingMode(false);
return true;
}// stopRecord //
#endif // ENABLE_INCOMING_MSG_RECORDER
//-----------------------------------------------
// 'dump' : command to create a file with the current state of the client.
//-----------------------------------------------
NLMISC_COMMAND(dump, "Command to create a file with the current state of the client.", "<dump name> = default]")
{
if(args.size() > 1)
return false;
string dumpName;
if(args.size() == 1)
dumpName = args[0];
else
dumpName = "default";
dump(dumpName);
return true;
}// dump //
//-----------------------------------------------
// 'loadDump' : command to load a dump file.
//-----------------------------------------------
NLMISC_COMMAND(loadDump, "Ccommand to load a dump file.", "[<dump name> = default]")
{
if(args.size() > 1)
return false;
string dumpName;
if(args.size() == 1)
dumpName = args[0];
else
dumpName = "default";
loadDump(dumpName);
return true;
}// loadDump //
//-----------------------------------------------
// 'watchEntity' : Choose the entity to watch.
//-----------------------------------------------
NLMISC_COMMAND(sheet2idx, "Return the index ", "<sheet name> <Visual Slot Number>")
{
if(args.size() != 2)
return false;
string result;
NLMISC::CSheetId sheetId;
if(sheetId.build(args[0]))
{
uint32 idx = CVisualSlotManager::getInstance()->sheet2Index(sheetId, (SLOTTYPE::EVisualSlot)atoi(args[1].c_str()));
result = NLMISC::toString("Index = %d", idx);
}
else
result = NLMISC::toString("sheet '%s' not valid.", args[0].c_str());
IM->displaySystemInfo(ucstring(result));
nlinfo("'sheet2idx': %s", result.c_str());
return true;
}
//-----------------------------------------------
// 'watchEntity' : Choose the entity to watch.
//-----------------------------------------------
NLMISC_COMMAND(watchEntity, "Choose the entity to watch.", "<slot>")
{
if(args.size() != 1)
return false;
// Set the new debug entity slot.
WatchedEntitySlot = (CLFECOMMON::TCLEntityId)atoi(args[0].c_str());
return true;
}// watchEntity //
//-----------------------------------------------
// 'dynstr'
//-----------------------------------------------
NLMISC_COMMAND(dynstr, "display a dyn string value", "<dyn string_id>")
{
if (args.size() != 1)
return false;
uint dynId = atoi(args[0].c_str());
ucstring result;
STRING_MANAGER::CStringManagerClient::instance()->getDynString(dynId, result);
CInterfaceManager::getInstance()->displaySystemInfo(result);
return true;
}// dynstr //
NLMISC_COMMAND(serverstr, "display a server string value", "<serverstr string_id>")
{
if (args.size() != 1)
return false;
uint dynId = atoi(args[0].c_str());
ucstring result;
STRING_MANAGER::CStringManagerClient::instance()->getString(dynId, result);
CInterfaceManager::getInstance()->displaySystemInfo(result);
return true;
}// serverstr //
//-----------------------------------------------
// 'verboseAnimSelection' : Enable/Disable the animation log for the current selection.
//-----------------------------------------------
NLMISC_COMMAND(verboseAnimSelection, "Enable/Disable the animation log for the current selection.", "")
{
// Check parameters.
if(args.size() != 0)
return false;
VerboseAnimSelection = !VerboseAnimSelection;
if(VerboseAnimSelection)
nlinfo("Enable VerboseAnimSelection");
else
nlinfo("Disable VerboseAnimSelection");
return true;
}// verboseAnimSelection //
//-----------------------------------------------
// 'verboseAnimUser' : Enable/Disable the animation log for the user.
//-----------------------------------------------
NLMISC_COMMAND(verboseAnimUser, "Enable/Disable the animation log for the user.", "")
{
// Check parameters.
if(args.size() != 0)
return false;
VerboseAnimUser = !VerboseAnimUser;
if(VerboseAnimUser)
nlinfo("Enable VerboseAnimUser");
else
nlinfo("Disable VerboseAnimUser");
return true;
}// VerboseAnimUser //
//-----------------------------------------------
// 'verboseDatabase' : Enable/Disable the log for the database.
//-----------------------------------------------
NLMISC_COMMAND(verboseDatabase, "Enable/Disable the log for the database.", "")
{
// Check parameters.
if(args.size() != 0)
return false;
VerboseDatabase = !VerboseDatabase;
if(VerboseDatabase)
nlinfo("Enable VerboseDatabase");
else
nlinfo("Disable VerboseDatabase");
return true;
}// verboseDatabase //
//-----------------------------------------------
// 'verboseVP' : Enable/Disable the visual properties log.
//-----------------------------------------------
NLMISC_COMMAND(verboseVP, "Enable/Disable the visual properties log.", "")
{
// Check parameters.
if(args.size() != 0)
return false;
VerboseVP = !VerboseVP;
if(VerboseVP)
nlinfo("Enable verboseVP");
else
nlinfo("Disable verboseVP");
return true;
}// verboseVP //
//-----------------------------------------------
// verbosePropertiesLoggingMode
//-----------------------------------------------
NLMISC_COMMAND(verbosePropertiesLoggingMode, "Set logging mode", "")
{
// Check parameters.
if(args.size() != 0)
return false;
CNetworkConnection::LoggingMode = !CNetworkConnection::LoggingMode;
if(CNetworkConnection::LoggingMode)
nlinfo("Enable LoggingMode");
else
nlinfo("Disable LoggingMode");
return true;
}
//-----------------------------------------------
// 'where' : display player position (on the server)
//-----------------------------------------------
NLMISC_COMMAND(where, "display player position (on the server)", " ")
{
// Check parameters.
if(args.size() != 0)
return false;
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("DEBUG:WHERE", out))
NetMngr.push(out);
else
nlwarning("mainLoop : unknown message name DEBUG:WHERE");
return true;
}// chat_mode //
//-----------------------------------------------
// 'who' : Display all players currently in game
//-----------------------------------------------
NLMISC_COMMAND(who, "Display all players currently in game"," ")
{
// Check parameters.
if(args.size() != 0)
return false;
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("DEBUG:WHO", out))
NetMngr.push(out);
else
nlwarning("mainLoop : unknown message name DEBUG:WHO");
return true;
}// who //
//-----------------------------------------------
// 'cmd' : Send a command to a server
//-----------------------------------------------
NLMISC_COMMAND(cmd, "Send a command to a server","<service name> <cmd>")
{
// Check parameters.
if(args.size() < 2)
return false;
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("DEBUG:CMD", out))
{
bool addentity = false;
string dest = args[0];
string cmd = args[1];
string arg;
for (uint i = 2; i < args.size(); i++)
{
arg += args[i] + " ";
}
out.serial(addentity);
out.serial(dest);
out.serial(cmd);
out.serial(arg);
NetMngr.push(out);
}
else
nlwarning("mainLoop : unknown message name DEBUG:CMD");
return true;
}// cmd //
//-----------------------------------------------
// 'cmd' : Send a command to a server
//-----------------------------------------------
NLMISC_COMMAND(cmde, "Send a command to a server with entityid","<service name> <cmd>")
{
// Check parameters.
if(args.size() < 2)
return false;
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("DEBUG:CMD", out))
{
bool addentity = true;
string dest = args[0];
string cmd = args[1];
string arg;
for (uint i = 2; i < args.size(); i++)
{
arg += args[i] + " ";
}
out.serial(addentity);
out.serial(dest);
out.serial(cmd);
out.serial(arg);
NetMngr.push(out);
}
else
nlwarning("mainLoop : unknown message name DEBUG:CMD");
return true;
}// cmde //
//-----------------------------------------------
// 'services' : Ask the server all services up.
//-----------------------------------------------
NLMISC_COMMAND(services, "Ask the server all services up.", "")
{
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("DEBUG:SERVICES", out))
{
// Add the message to the send list.
NetMngr.push(out);
// send TELEPORT
nlinfo("command 'services': 'DEBUG:SERVICES' sent.");
}
else
nlwarning("command 'services': unknown message named 'DEBUG:SERVICES'.");
return true;
}
//-----------------------------------------------
// 'mode' : Command To change the mode for an entity in a slot.
//-----------------------------------------------
NLMISC_COMMAND(mode, "Command To change the mode for an entity in a slot.", "<Slot> <Mode>")
{
// Check parameters.
if(args.size() != 2)
{
// Help
CInterfaceManager::getInstance()->displaySystemInfo(ucstring("This command need 2 paramters :"));
CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" <Slot> : the slot number of the entity to change"));
CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" <Mode> : the mode wanted for the entity, one of the following number :"));
for(uint i = 0; i<MBEHAV::NUMBER_OF_MODES; ++i)
CInterfaceManager::getInstance()->displaySystemInfo(ucstring(NLMISC::toString(" %d - %s", i, MBEHAV::modeToString((MBEHAV::EMode)i))));
}
// Right parameters number
else
{
// Compute parameters
CLFECOMMON::TCLEntityId slot = (CLFECOMMON::TCLEntityId)atoi(args[0].c_str());
MBEHAV::EMode mod = (MBEHAV::EMode)atoi(args[1].c_str());
// Compute the position.
CEntityCL *entity = EntitiesMngr.entity(slot);
if(entity)
{
// Write the behaviour in the DB.
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_MODE), mod);
// Update the behaviour.
entity->updateVisualProperty(NetMngr.getCurrentServerTick()+10, CLFECOMMON::PROPERTY_MODE);
}
// Invalid slot.
else
CInterfaceManager::getInstance()->displaySystemInfo(ucstring("There is no entity in the given slot."));
}
// Command well done.
return true;
}// mode //
//-----------------------------------------------
// 'behaviour' : Command To change the behaviour for an entity in a slot.
//-----------------------------------------------
NLMISC_COMMAND(behaviour, "Command To change the behaviour for an entity in a slot.", "<Slot> <Behaviour> [<Attack Intensity>] [<Impact Intensity>]")
{
// Check parameters.
if(args.size() < 2 || args.size() > 4)
{
// Help
CInterfaceManager::getInstance()->displaySystemInfo(ucstring("This command need 2 or 3 paramters :"));
CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" <Slot> : the slot number of the entity to change"));
CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" <Behaviour> : the behaviour to play for the entity, one of the following number :"));
for(uint i = 0; i<MBEHAV::EMOTE_BEGIN; ++i)
CInterfaceManager::getInstance()->displaySystemInfo(ucstring(NLMISC::toString(" %d - %s", i, MBEHAV::behaviourToString((MBEHAV::EBehaviour)i))));
CInterfaceManager::getInstance()->displaySystemInfo(ucstring(NLMISC::toString(" %d-%d - Emotes", MBEHAV::EMOTE_BEGIN, MBEHAV::EMOTE_END)));
}
else
{
// COmpute parameters
CLFECOMMON::TCLEntityId slot = (CLFECOMMON::TCLEntityId)atoi(args[0].c_str());
MBEHAV::EBehaviour beh = (MBEHAV::EBehaviour)atoi(args[1].c_str());
// Make the behaviour
MBEHAV::CBehaviour behaviour(beh);
// Get the Power
if(args.size() >= 3)
behaviour.Combat.AttackIntensity = atoi(args[2].c_str());
if(args.size() >= 4)
behaviour.Combat.ImpactIntensity = atoi(args[3].c_str());
// Compute the position.
CEntityCL *entity = EntitiesMngr.entity(slot);
if(entity)
{
// Cast into an uint32.
uint32 b = behaviour;
// Write the behaviour in the DB.
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_BEHAVIOUR), b);
// Update the behaviour.
entity->updateVisualProperty(NetMngr.getCurrentServerTick()+10, CLFECOMMON::PROPERTY_BEHAVIOUR);
}
else
CInterfaceManager::getInstance()->displaySystemInfo(ucstring("There is no entity in the given slot."));
}
// Command well done.
return true;
}// behaviour //
//-----------------------------------------------
// 'magic' : Command to cast a spell.
//-----------------------------------------------
NLMISC_COMMAND(magic, "Command to cast a spell.", "\n"
"<Slot> : the one who cast the spell\n"
"<type> : 0->GOOD 1->Bad 2->NEUTRAL\n"
"<success> : 0->success 1->Fail 2->Fumble\n"
"<Spell Power> : \n"
"<Impact Intensity> : \n"
"<resist> : 0->not resisted, any other->resisted.\n")
{
// Check parameters.
if(args.size() != 6)
{
// Help
// CInterfaceManager::getInstance()->displaySystemInfo(ucstring("This command need 2 or 3 paramters :"));
// CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" <Slot> : the slot number of the entity to change"));
// CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" <Behaviour> : the behaviour to play for the entity, one of the following number :"));
// for(uint i = 0; i<MBEHAV::EMOTE_BEGIN; ++i)
// CInterfaceManager::getInstance()->displaySystemInfo(ucstring(NLMISC::toString(" %d - %s", i, MBEHAV::behaviourToString((MBEHAV::EBehaviour)i))));
// CInterfaceManager::getInstance()->displaySystemInfo(ucstring(NLMISC::toString(" %d-%d - Emotes", MBEHAV::EMOTE_BEGIN, MBEHAV::EMOTE_END)));
}
else
{
// Compute parameters
CLFECOMMON::TCLEntityId slot = (CLFECOMMON::TCLEntityId)atoi(args[0].c_str());
// Magic Type (good bad neutral)
uint type = atoi(args[1].c_str())%3;
MBEHAV::EBehaviour behTmp = (MBEHAV::EBehaviour)(MBEHAV::CASTING_GOOD+type);
MBEHAV::CBehaviour castingBeh(behTmp);
// Result
MBEHAV::CBehaviour behaviour;
uint result = atoi(args[2].c_str())%3;
if (type==0)
behaviour.Behaviour = (MBEHAV::EBehaviour)(MBEHAV::END_CASTING_GOOD_SUCCESS + result);
else if(type==1)
behaviour.Behaviour = (MBEHAV::EBehaviour)(MBEHAV::END_CASTING_BAD_SUCCESS + result);
else
behaviour.Behaviour = (MBEHAV::EBehaviour)(MBEHAV::END_CASTING_NEUTRAL_SUCCESS + result);
// Spell Power
behaviour.Magic.SpellPower = atoi(args[3].c_str());
// Impact Intensity
behaviour.Magic.ImpactIntensity = atoi(args[4].c_str());
// Resist
behaviour.Magic.TargetResists = (atoi(args[5].c_str()) != 0);
// Get the entity
CEntityCL *entity = EntitiesMngr.entity(slot);
if(entity)
{
// Cast into an uint32.
uint32 b = castingBeh;
// Write the behaviour in the DB.
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_BEHAVIOUR), b);
// Update the behaviour.
entity->updateVisualProperty(NetMngr.getCurrentServerTick()+10, CLFECOMMON::PROPERTY_BEHAVIOUR);
b = behaviour;
// Write the behaviour in the DB.
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_BEHAVIOUR), b);
// Update the behaviour.
entity->updateVisualProperty(NetMngr.getCurrentServerTick()+50, CLFECOMMON::PROPERTY_BEHAVIOUR);
}
else
CInterfaceManager::getInstance()->displaySystemInfo(ucstring("There is no entity in the given slot."));
}
// Command well done.
return true;
}// magic //
//-----------------------------------------------
// 'target' : Set the target for an entity. Do not set the target slot to remove the target.
//-----------------------------------------------
NLMISC_COMMAND(target, "Set a target for an entity. Do not set the target slot to remove the target.", "<Slot> [<Target Slot>]")
{
CLFECOMMON::TCLEntityId targetSlot = CLFECOMMON::INVALID_SLOT;
// Check parameters.
switch(args.size())
{
// Set the target for the entity.
case 2:
targetSlot = (CLFECOMMON::TCLEntityId)atoi(args[1].c_str());
// Remove the target for the entity.
case 1:
{
uint entitySlot = (uint)atoi(args[0].c_str());
CEntityCL *entity = EntitiesMngr.entity(entitySlot);
if(entity)
entity->targetSlot(targetSlot);
else
nlwarning("command 'target': there is no entity in the slot %d.", entitySlot);
}
break;
// Bad command.
default:
return false;
}
// Well done.
return true;
}
//-----------------------------------------------
// 'particle' : Create a particle at the the user position
//-----------------------------------------------
NLMISC_COMMAND(particle, "Create a particule at the user position (play FireWorkA_with_sound.ps by default)", "[<filename.ps>]")
{
string fn;
// Check parameters.
if(args.size() == 0)
{
fn = "FireWorkA_with_sound.ps";
}
else if(args.size() == 1)
{
fn = args[0];
}
else
return false;
UInstance *fx = Scene->createInstance(fn);
// not found
if(fx == NULL)
{
log.displayNL ("Can't create instance '%s'", fn.c_str());
return false;
}
fx->setPos(UserEntity.pos());
fx->setClusterSystem(UserEntity.skeleton()->getClusterSystem());
// Command well done.
return true;
}
//-----------------------------------------------
// 'move' : Move an entity.
//-----------------------------------------------
NLMISC_COMMAND(move, "Move an entity.", "Form ID; Slot: [1-254]")
{
// Check parameters.
if(args.size() != 1)
return false;
CLFECOMMON::TCLEntityId slot = (CLFECOMMON::TCLEntityId)atoi(args[0].c_str());
// Compute the position.
CEntityCL *entity = EntitiesMngr.entity(slot);
if(entity)
{
sint64 x = (sint64)((entity->pos().x+UserEntity.front().x*10.0)*1000.0);
sint64 y = (sint64)((entity->pos().y+UserEntity.front().y*10.0)*1000.0);
sint64 z = (sint64)((entity->pos().z+UserEntity.front().z*10.0)*1000.0);
// Write the position in the DB.
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P0", x);
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P1", y);
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P2", z);
// Update the position.
EntitiesMngr.updateVisualProperty(NetMngr.getCurrentServerTick()+30, slot, 0);
x = (sint64)((entity->pos().x)*1000.0);
y = (sint64)((entity->pos().y)*1000.0);
z = (sint64)((entity->pos().z)*1000.0);
// Write the position in the DB.
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P0", x);
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P1", y);
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P2", z);
// Update the position.
EntitiesMngr.updateVisualProperty(NetMngr.getCurrentServerTick()+60, slot, 0);
}
else
nlwarning("command 'move' : there is no entity allocated in slot %d.", slot);
// Command well done.
return true;
}
//-----------------------------------------------
// 'move_to' : Move an entity to another one.
//-----------------------------------------------
NLMISC_COMMAND(move_to, "Move an entity to another one.", "<slot(from)>:[1-254], <slot(to)>:[0-254] default 0")
{
sint64 x, y, z;
// Check parameters.
if(args.size() == 1)
{
x = (sint64)(UserEntity.pos().x*1000.0);
y = (sint64)(UserEntity.pos().y*1000.0);
z = (sint64)(UserEntity.pos().z*1000.0);
}
else if(args.size() == 2)
{
CLFECOMMON::TCLEntityId slotDest = (CLFECOMMON::TCLEntityId)atoi(args[1].c_str());
// Compute the position.
CEntityCL *entity = EntitiesMngr.entity(slotDest);
if(entity)
{
x = (sint64)(entity->pos().x*1000.0);
y = (sint64)(entity->pos().y*1000.0);
z = (sint64)(entity->pos().z*1000.0);
}
else
{
// Command is correct but not all the parameters are valid.
nlwarning("command 'move_to' : there is no entity allocated for the dest in slot %d.", slotDest);
return true;
}
}
// Wrong number of parameters.
else
return false;
CLFECOMMON::TCLEntityId slot = (CLFECOMMON::TCLEntityId)atoi(args[0].c_str());
// Write the position in the DB.
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P0", x);
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P1", y);
IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P2", z);
// Update the position.
EntitiesMngr.updateVisualProperty(NetMngr.getCurrentServerTick()+30, slot, 0);
// Command well done.
return true;
}
//-----------------------------------------------
// 'setMode' : Set The Mode for an Entity without to add a stage for it.
//-----------------------------------------------
NLMISC_COMMAND(setMode, "Set The Mode for an Entity without to add a stage for it.", "<slot> <mode>")
{
// Check parameters.
if(args.size() != 2)
return false;
// Get the Slot and the Mode.
CLFECOMMON::TCLEntityId slot = (CLFECOMMON::TCLEntityId)atoi(args[0].c_str());
MBEHAV::EMode mod = (MBEHAV::EMode)atoi(args[1].c_str());
// Compute the position.
CEntityCL *entity = EntitiesMngr.entity(slot);
if(entity)
entity->mode(mod);
else
nlwarning("command 'setMode' : there is no entity allocated in slot '%d'.", slot);
// Command well done.
return true;
}
//-----------------------------------------------
// 'logEntities' : Write the position and orientation af all entities in the vision in the file 'entities.txt'.
//-----------------------------------------------
NLMISC_COMMAND(logEntities, "Write the position and orientation af all entities in the vision in the file 'entities.txt'.", "")
{
// Check parameters
if(args.size() != 0)
return false;
// Log entities
EntitiesMngr.writeEntities();
// Command well done.
return true;
}
//-----------------------------------------------
// 'log' : Command to Add/Del Positive/Negative Filters for logs.
//-----------------------------------------------
NLMISC_COMMAND(log, "Add/Del Positive/Negative Filters for logs.", "Log System <debug, info, warning, assert>, Type <pos/neg/del/reset>, Filter <string>")
{
// check args, if there s not the right number of parameter, return bad
if(args.size() < 2 || args.size() > 3)
return false;
CLog *logSys;
// Debug log system.
if (string(args[0].c_str()) == "debug")
logSys = DebugLog;
// Info log system.
else if(string(args[0].c_str()) == "info")
logSys = InfoLog;
// Warning log system.
else if(string(args[0].c_str()) == "warning")
logSys = WarningLog;
// Assert log system.
else if(string(args[0].c_str()) == "assert")
logSys = AssertLog;
// Unknown Log System -> return false.
else
return false;
// Add a positive filter.
if (string(args[1].c_str()) == "pos")
logSys->addPositiveFilter(args[2].c_str());
// Add a negative filter.
else if(string(args[1].c_str()) == "neg")
logSys->addNegativeFilter(args[2].c_str());
// Removes a filter by name (in both filters).
else if(string(args[1].c_str()) == "del")
logSys->removeFilter(args[2].c_str());
// Reset both filters.
else if(string(args[1].c_str()) == "reset")
logSys->resetFilters();
// Unknown Filter -> return false.
else
return false;
// Command well done.
return true;
}
//-----------------------------------------------
// 'db' : Command to change some variables in the database or to get it
//-----------------------------------------------
NLMISC_COMMAND(db, "Modify Database","<Property> <Value>")
{
int size = args.size();
if (size == 2)
{
// Convert the string into an sint64.
sint64 value = atoiInt64(args[1].c_str());
// Set the property.
CInterfaceManager::getInstance()->getDbProp(args[0])->setValue64(value);
}
else if (size == 1)
{
sint64 prop = CInterfaceManager::getInstance()->getDbProp(args[0])->getValue64();
string str = toString(prop);
CInterfaceManager *pIM = CInterfaceManager::getInstance();
pIM->displaySystemInfo(ucstring(str));
nlinfo("%s", str.c_str());
return true;
}
else
return false;
return true;
}// db //
//-----------------------------------------------
// 'exec' : Execute a scipt file
//-----------------------------------------------
extern CLog g_log;
NLMISC_COMMAND(exec, "Execute a scipt file","<FileName>")
{
int size = args.size();
if (size != 1)
return false;
CIFile iFile;
if (iFile.open(CPath::lookup(args[0], false)))
{
char line[512];
char *buffer;
// Read line by line and execute each line
bool eof = false;
while (!eof)
{
buffer = &line[0];
uint read = 0;
while (true)
{
if (read == 512 -1)
{
*buffer = '\0';
break;
}
try
{
// read one byte
iFile.serialBuffer ((uint8 *)buffer, 1);
}
catch (EFile &)
{
*buffer = '\0';
eof = true;
break;
}
if (*buffer == '\n')
{
*buffer = '\0';
break;
}
// skip '\r' char
if (*buffer != '\r')
{
buffer++;
read++;
}
}
if (strlen(line) > 0)
ICommand::execute(line, g_log);
if (iFile.eof())
eof = true;
}
iFile.close();
}
else
{
CInterfaceManager::getInstance()->displaySystemInfo(ucstring("Cannot open file"));
}
return true;
}// exec //
//-----------------------------------------------
// 'vP' : Modify the Visual Property.
//-----------------------------------------------
NLMISC_COMMAND(vP, "Modify the Visual Property.",
"\n"
"<slot> of the entity to change.\n"
"<type> the property to change :\n"
" 0->CHEST\n"
" 1->LEG\n"
" 2->ARM\n"
" 3->HEAD\n"
" 4->WEAPON_R\n"
" 5->WEAPON_L\n"
" 6->FEET\n"
" 7->HAND\n"
" 8->EYES\n"
" 9->SEX (0: Male, 1: Female)\n"
"<value> for the property.\n")
{
// Check parameters
if(args.size() != 3)
return false;
// Get the database entry.
SPropVisualA vA;
SPropVisualB vB;
SPropVisualC vC;
uint slot = atoi(args[0].c_str());
const string propNameA = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPA);
const string propNameB = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPB);
const string propNameC = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPC);
vA.PropertyA = CInterfaceManager::getInstance()->getDbProp(propNameA)->getValue64();
vB.PropertyB = CInterfaceManager::getInstance()->getDbProp(propNameB)->getValue64();
vC.PropertyC = CInterfaceManager::getInstance()->getDbProp(propNameC)->getValue64();
// Get the visual item index
uint value = atoi(args[2].c_str());
// Get the visual slot to change.
uint type = atoi(args[1].c_str());
switch(type)
{
case 0:
vA.PropertySubData.JacketModel = value;
break;
case 1:
vA.PropertySubData.TrouserModel = value;
break;
case 2:
vA.PropertySubData.ArmModel = value;
break;
case 3:
vA.PropertySubData.HatModel = value;
break;
case 4:
vA.PropertySubData.WeaponRightHand = value;
break;
case 5:
vA.PropertySubData.WeaponLeftHand = value;
break;
case 6:
vB.PropertySubData.FeetModel = value;
break;
case 7:
vB.PropertySubData.HandsModel = value;
break;
case 8:
vC.PropertySubData.EyesColor = value;
break;
case 9:
vA.PropertySubData.Sex = value;
break;
default:
nlwarning("command 'vP': type not valid.");
return false;
break;
}
// Set the database.
CInterfaceManager::getInstance()->getDbProp(propNameA)->setValue64((sint64)vA.PropertyA);
CInterfaceManager::getInstance()->getDbProp(propNameB)->setValue64((sint64)vB.PropertyB);
CInterfaceManager::getInstance()->getDbProp(propNameC)->setValue64((sint64)vC.PropertyC);
// Force to update properties.
EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_VPA);
// Done.
return true;
}// vP //
//-----------------------------------------------
// 'altLook' : Modify the Visual Property.
//-----------------------------------------------
NLMISC_COMMAND(altLook, "Modify the Alternative Look Property.",
"\n"
"<slot> of the entity to change.\n"
"<colorTop>\n"
"<colorBottom>\n"
"<rWeapon>\n"
"<lWeapon>\n"
"<seed>\n"
"<hairColor>\n"
"<putHelm>\n")
{
// Check parameters
if(args.size() != 8)
return false;
// Get the database entry.
uint slot = atoi(args[0].c_str());
const string propName = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPA);
// Get the old value (not useful since we change the whole property).
SAltLookProp altLookProp;
altLookProp.Summary = CInterfaceManager::getInstance()->getDbProp(propName)->getValue64();
altLookProp.Element.ColorTop = atoi(args[1].c_str());
altLookProp.Element.ColorBot = atoi(args[2].c_str());
altLookProp.Element.WeaponRightHand = atoi(args[3].c_str());
altLookProp.Element.WeaponLeftHand = atoi(args[4].c_str());
altLookProp.Element.Seed = atoi(args[5].c_str());
altLookProp.Element.ColorHair = atoi(args[6].c_str());
altLookProp.Element.Hat = atoi(args[7].c_str());
// Set the database.
CInterfaceManager::getInstance()->getDbProp(propName)->setValue64((sint64)altLookProp.Summary);
// Force to update properties.
EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_VPA);
// Done.
return true;
}// altLook //
//-----------------------------------------------
// 'color' : Command to color an entity.
//-----------------------------------------------
NLMISC_COMMAND(color, "Command to color an entity.",
"\n"
"<Slot>: whole number (if <0 slot will be the current selection)\n"
"<UserColor>: whole number\n"
"<Hair>: whole number\n"
"<Eyes>: whole number\n"
"[<Part>]: whole number\n"
" default=the whole body\n"
" 0=CHEST\n"
" 1=LEG\n"
" 2=HEAD\n"
" 3=ARMS\n"
" 4=HANDS\n"
" 5=FEET\n")
{
// Check parameters.
if(args.size() != 4 && args.size() != 5)
return false;
// Witch part to dye ?
sint part = -1;
if(args.size() == 5)
part = atoi(args[4].c_str());
// Get the entity slot to dye.
sint slotTmp = atoi(args[0].c_str());
CLFECOMMON::TCLEntityId slot;
if(slotTmp >= 0)
slot = (CLFECOMMON::TCLEntityId)slotTmp;
else
slot = (CLFECOMMON::TCLEntityId)UserEntity.selection();
CEntityCL *entity = EntitiesMngr.entity(slot);
if(entity)
entity->changeColors(atoi(args[1].c_str()), atoi(args[2].c_str()), atoi(args[3].c_str()), part);
else
nlwarning("command 'changeColors': there is no entity allocated in slot '%d'.", slot);
// Command well done.
return true;
}// color //
#endif // #ifndef _LIMITED_COMMAND_
//-----------------------------------------------
// 'fire' : Command to launch the firework.
//-----------------------------------------------
NLMISC_COMMAND(fire, "launch the firework","")
{
Firework->start(T1);
return true;
}
//-----------------------------------------------
// 'save_int_cfg' : save the interface config file.
//-----------------------------------------------
NLMISC_COMMAND(save_int_cfg, "save the interface config file","")
{
CInterfaceManager::getInstance()->saveConfig ("interface.cfg");
return true;
}
//-----------------------------------------------
// 'harvest_deposit'
//-----------------------------------------------
NLMISC_COMMAND(harvest_deposit, "harvest a deposit", "")
{
// no parameter needed
// Create the message for the server
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("HARVEST:DEPOSIT", out))
{
NetMngr.push(out);
// open the interface
CInterfaceManager::getInstance()->getWindowFromId("ui:interface:harvest")->setActive(true);
}
else
nlwarning("command : unknown message name : 'HARVEST:DEPOSIT'.");
return true;
} // harvest_deposit //
//-----------------------------------------------
// 'training'
//-----------------------------------------------
NLMISC_COMMAND(training, "start a training action", "")
{
// no parameter needed
// Create the message for the server
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("TRAINING", out))
{
NetMngr.push(out);
}
else
nlwarning("command : unknown message name : 'TRAINING'.");
return true;
} // training //
//-----------------------------------------------
// 'mount' : Set the entity to mount.
//-----------------------------------------------
NLMISC_COMMAND(mount, "Set the entity to mount.","<Slot> [<Mount>]")
{
CLFECOMMON::TCLEntityId slot;
CLFECOMMON::TCLEntityId mount = CLFECOMMON::INVALID_SLOT;
switch(args.size())
{
case 2:
mount = (CLFECOMMON::TCLEntityId) atoi(args[1].c_str());
case 1:
slot = (CLFECOMMON::TCLEntityId) atoi(args[0].c_str());
break;
default:
return false;
break;
}
// Set the database.
string propName = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_ENTITY_MOUNTED_ID);
CInterfaceManager::getInstance()->getDbProp(propName)->setValue64(mount);
// Force to update properties.
EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_ENTITY_MOUNTED_ID);
// Command well done
return true;
}// mount //
//-----------------------------------------------
// 'rider' : Set the rider.
//-----------------------------------------------
NLMISC_COMMAND(rider, "Set the rider.","<Slot> [<rider>]")
{
CLFECOMMON::TCLEntityId slot;
CLFECOMMON::TCLEntityId rider = CLFECOMMON::INVALID_SLOT;
switch(args.size())
{
case 2:
rider = (CLFECOMMON::TCLEntityId) atoi(args[1].c_str());
case 1:
slot = (CLFECOMMON::TCLEntityId) atoi(args[0].c_str());
break;
default:
return false;
break;
}
// Set the database.
string propName = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_RIDER_ENTITY_ID);
CInterfaceManager::getInstance()->getDbProp(propName)->setValue64(rider);
// Force to update properties.
EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_RIDER_ENTITY_ID);
// Command well done
return true;
}// rider //
#ifndef _LIMITED_COMMAND_
#ifdef _CMD_CHEAT_ON_
////////////////////
// CHEAT COMMANDS //
NLMISC_COMMAND(learn_all, "learn all bricks", "all magic combat")
{
// Check parameters.
if(args.size() > 1)
return false;
uint type = 0;
if(args.size() == 1)
{
if (args[0] == "magic" || args[0] == "1")
type = 1;
if (args[0] == "combat" || args[0] == "2")
type = 2;
}
char buf[100];
if (ClientCfg.Local)
{
CBrickManager * pBM = CBrickManager::getInstance();
uint i = 0;
for (; i < pBM->getNumberOfFamily(); i++ )
{
sint64 flag = 0;
if ( pBM->getFamilySize(i) )
{
CBrickSheet *brick= pBM->getBrick(pBM->getBrickSheet(i, 0));
if(brick)
{
if ( type == 0 || (brick->BrickType == BRICK_TYPE::COMBAT && type == 2) || (brick->BrickType == BRICK_TYPE::MAGIC && type == 1) )
{
for (uint j = 0; j < pBM->getFamilySize(i);j++)
{
flag |= (sint64)1 << (sint64)j;
}
sprintf(buf,"SERVER:BRICK_FAMILY:%d:BRICKS",i);
CCDBNodeLeaf * node= CInterfaceManager::getInstance()->getDbProp(buf);
node->setValue64(flag);
}
}
}
}
//set all career to 25
for (i = 0; i < ROLES::role_unknown; i++ )
{
string role = string("SERVER:CHARACTER_INFO:CAREER")+toString(3);
string prop = role +string(":LEVEL");
CCDBNodeLeaf * node= CInterfaceManager::getInstance()->getDbProp(prop);
node->setValue64(25);
for (uint j = 0; j < 8; j++ )
{
prop = role + string(":JOB") + toString(j) + string(":LEVEL");
node= CInterfaceManager::getInstance()->getDbProp(prop);
node->setValue64(25);
}
}
// Learn all Faber Plans. For all database entries
uint faberPlanMId= 0;
while(true)
{
CInterfaceManager *pIM= CInterfaceManager::getInstance();
CCDBNodeLeaf *leaf= pIM->getDbProp("SERVER:FABER_PLANS:"+toString(faberPlanMId)+":KNOWN", false);
if(!leaf)
break;
leaf->setValue64(0xFFFFFFFFFFFFFFFF);
faberPlanMId++;
}
}
else
{
// Create the message for the server to learn all bricks
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("CHEAT:LEARN_ALL_BRICKS", out))
{
// Add the message to the send list.
NetMngr.push(out);
// send TELEPORT
nlinfo("command 'learn_all': learn all bricks Asked.");
}
else
nlwarning("command 'learn_all': unknown message named 'CHEAT:LEARN_ALL_BRICKS'.");
}
return true;
} // learn_all //
NLMISC_COMMAND(learnAllFaberPlans, "learn all faber plans", "")
{
if (ClientCfg.Local)
{
// Learn all Faber Plans. For all database entries
uint faberPlanMId= 0;
while(true)
{
CInterfaceManager *pIM= CInterfaceManager::getInstance();
CCDBNodeLeaf *leaf= pIM->getDbProp("SERVER:FABER_PLANS:"+toString(faberPlanMId)+":KNOWN", false);
if(!leaf)
break;
leaf->setValue64(0xFFFFFFFFFFFFFFFF);
faberPlanMId++;
}
}
else
{
// Create the message for the server to learn all bricks
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("CHEAT:LEARN_ALL_FABER_PLANS", out))
{
// Add the message to the send list.
NetMngr.push(out);
// send TELEPORT
nlinfo("command 'learnAllFaberPlans': learn all faber plans Asked.");
}
else
nlwarning("command 'learnAllFaberPlans': unknown message named 'CHEAT:LEARN_ALL_FABER_PLANS'.");
}
return true;
} // learnAllFaberPlans //
//-----------------------------------------------
// 'god' : To be invulnerable.
//-----------------------------------------------
NLMISC_COMMAND(god, "To be invulnerable","")
{
// Check parameters.
if(args.size() != 0)
return false;
// Create the message for the server to teleport the character.
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("CHEAT:GOD", out))
{
// Add the message to the send list.
NetMngr.push(out);
// send TELEPORT
nlinfo("command 'god': God Mode Asked.");
}
else
nlwarning("command 'god': unknown message named 'CHEAT:GOD'.");
// Done.
return true;
}// god //
//-----------------------------------------------
// 'createItem' : Create an item in the hand of the user.
//-----------------------------------------------
NLMISC_COMMAND(createItem, "Create an item in the hand of the user.","<Form> [<Quantity>] [<Quality>]")
{
CSheetId sheetId;
uint16 quantity = 1;
uint16 quality = 1;
// Check parameters.
switch(args.size())
{
case 3:
quality = atoi(args[2].c_str());
case 2:
quantity = atoi(args[1].c_str());
case 1:
// Try to create the sheet with the parameter as a string.
if(!sheetId.build(args[0]))
{
// Try to create the sheet with the parameter as an int.
sheetId = atoi(args[0].c_str());
}
break;
// Bad number of parameters.
default:
nlwarning("Command 'createItem': invalid number of parameter.");
return false;
}
// Check Sheet Id.
if(sheetId == CSheetId::Unknown)
{
nlwarning("Command 'createItem': '%s' is not a valid form.", args[0].c_str());
return false;
}
// Create the message for the server to teleport the character.
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("CHEAT:CREATE_ITEM_IN_BAG", out))
{
uint32 sheet = sheetId.asInt();
out.serial(sheet);
out.serial(quantity);
out.serial(quality);
// Add the message to the send list.
NetMngr.push(out);
// send TELEPORT
nlinfo("Command 'createItem': CREATE_ITEM_IN_BAG sent");
}
else
nlwarning("Command 'createItem': unknown message named 'CHEAT:CREATE_ITEM_IN_BAG'.");
// Command well done.
return true;
}// createItem //
//-----------------------------------------------
// 'xp' : To gain XP in a given Skill.
//-----------------------------------------------
NLMISC_COMMAND(xp, "To gain XP in a given Skill.","<Skill> <Amount>")
{
// Check parameters.
if(args.size() != 2)
return false;
// Create the message for the server to teleport the character.
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("CHEAT:XP", out))
{
uint32 xp = atoi(args[1].c_str());
string skill = args[0];
out.serial( skill );
out.serial(xp);
// Add the message to the send list.
NetMngr.push(out);
// send CHEAT:XP
nlinfo("command 'xp': CHEAT:XP pushed.");
}
else
nlwarning("command 'xp': unknown message named 'CHEAT:XP'.");
// Done.
return true;
}// xp //
//-----------------------------------------------
// 'money' : To earn Money.
// \todo
//-----------------------------------------------
NLMISC_COMMAND(money, "To earn Money.","<very big seed> [<big seed>] [<medium seed>] [<small seed>]")
{
sint32 a = 0;
sint32 b = 0;
sint32 c = 0;
sint32 d = 0;
// Check parameters.
switch(args.size())
{
case 4:
d = atoi(args[3].c_str());
case 3:
c = atoi(args[2].c_str());
case 2:
b = atoi(args[1].c_str());
case 1:
a = atoi(args[0].c_str());
break;
default:
return false;
}
// Create the message for the server to teleport the character.
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("CHEAT:MONEY", out))
{
out.serial(a);
out.serial(b);
out.serial(c);
out.serial(d);
// Add the message to the send list.
NetMngr.push(out);
// send CHEAT:MONEY
nlinfo("command 'money': CHEAT:MONEY pushed.");
}
else
nlwarning("command 'money': unknown message named 'CHEAT:MONEY'.");
// Done.
return true;
}// money //
//-----------------------------------------------
// 'setTime' : To set Ryzom time on server.
//-----------------------------------------------
NLMISC_COMMAND(setTime, "To set Ryzom time on server.","<Time>")
{
// Check parameters.
if(args.size() != 1)
return false;
// Create the message for the server to set ryzom time.
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("CHEAT:SET_TIME", out))
{
float time = (float)( atof(args[0].c_str()) );
out.serial(time);
// Add the message to the send list.
NetMngr.push(out);
// send CHEAT:SET_TIME
nlinfo("command 'setTime': CHEAT:SET_TIME pushed.");
}
else
nlwarning("command 'setTime': unknown message named 'CHEAT:SET_TIME'.");
// Done.
return true;
}// setTime //
//-----------------------------------------------
// 'setDay' : To set Ryzom day on server.
//-----------------------------------------------
NLMISC_COMMAND(setDay, "To set Ryzom day on server.","<Day>")
{
// Check parameters.
if(args.size() != 1)
return false;
// Create the message for the server to set ryzom time.
CBitMemStream out;
if(GenericMsgHeaderMngr.pushNameToStream("CHEAT:SET_DAY", out))
{
uint32 Day = (uint32) atoi(args[0].c_str());
out.serial(Day);
// Add the message to the send list.
NetMngr.push(out);
// send CHEAT:SET_DAY
nlinfo("command 'setDay': CHEAT:SET_DAY pushed.");
}
else
nlwarning("command 'setDay': unknown message named 'CHEAT:SET_DAY'.");
// Done.
return true;
}// setTime //
//-----------------------------------------------
// createPerso :
//-----------------------------------------------
NLMISC_COMMAND( createPerso, "create a new character", "Parameters:\n-Character name\n-Race( Fyros, Tryker...)\n-gender(Male, Female)\n-Role( MeleeFighter, RangeFighter, AttackCaster, BufferCaster, HealerCaster...)\n-Level (1-25 (but more accepted)>" )
{
// Check parameters.
if(args.size() < 5) return false;
// read params
string characterName = args[0];
EGSPD::CPeople::TPeople race = EGSPD::CPeople::fromString( args[1] );
if( race == EGSPD::CPeople::unknown ) return false;
GSGENDER::EGender gender = GSGENDER::stringToEnum( args[2] );
if( gender == GSGENDER::unknown ) return false;
ROLES::ERole role = ROLES::toRoleId( args[3] );
if( role == ROLES::role_unknown ) return false;
uint16 level = atoi( args[4].c_str() );
CBitMemStream bms;
string msgType = "CHEAT:CREATE_CHARACTER";
if( GenericMsgHeaderMngr.pushNameToStream(msgType,bms) )
{
bms.serial( characterName );
bms.serialEnum( race );
bms.serialEnum( gender );
bms.serialEnum( role );
bms.serial( level );
NetMngr.push( bms );
nldebug("<create_perso> sending 'CHEAT:CREATE_CHARACTER' message to server");
}
else
{
nlwarning("<create_perso> unknown message name : CHEAT:CREATE_CHARACTER");
}
return true;
} // createPerso //
/*
//-----------------------------------------------
// add_role :
//-----------------------------------------------
NLMISC_COMMAND( add_role, "add role to character", "<Role( MeleeFighter, RangeFighter, AttackCaster, BufferCaster, HealerCaster...), Level (1-25 (but more accepted))>" )
{
// Check parameters.
if(args.size() < 2) return false;
ROLES::ERole role = ROLES::toRoleId( args[0] );
if( role == ROLES::role_unknown ) return false;
uint16 level = atoi( args[1].c_str() );
CBitMemStream bms;
string msgType = "CHEAT:ADD_ROLE";
if( GenericMsgHeaderMngr.pushNameToStream(msgType,bms) )
{
bms.serialEnum( role );
bms.serial( level );
NetMngr.push( bms );
nldebug("<add_role> sending 'CHEAT:ADD_ROLE' message to server");
}
else
{
nlwarning("<add_role> unknown message name : CHEAT:ADD_ROLE");
}
return true;
} // add_role //
*/
//-----------------------------------------------
// learn_bricks :
//-----------------------------------------------
NLMISC_COMMAND( learn_bricks, "learn brick for role and level", "<Role( MeleeFighter, RangeFighter, AttackCaster, BufferCaster, HealerCaster...), Level (1-25 (but more accepted))>" )
{
// Check parameters.
if(args.size() < 2) return false;
ROLES::ERole role = ROLES::toRoleId( args[0] );
if( role == ROLES::role_unknown ) return false;
uint16 level = atoi( args[1].c_str() );
CBitMemStream bms;
string msgType = "CHEAT:LEARN_BRICK";
if( GenericMsgHeaderMngr.pushNameToStream(msgType,bms) )
{
bms.serialEnum( role );
bms.serial( level );
NetMngr.push( bms );
nldebug("<learn_bricks> sending 'CHEAT:LEARN_BRICK' message to server");
}
else
{
nlwarning("<learn_bricks> unknown message name : CHEAT:LEARN_BRICK");
}
return true;
} // learn_bricks
#endif // _CMD_CHEAT_ON_
///////////////////
// TEST COMMANDS //
//-----------------------------------------------
// 'test' :
//-----------------------------------------------
NLMISC_COMMAND(test, "", "")
{
sint64 x, y, z;
MBEHAV::EMode mod = MBEHAV::MOUNT_NORMAL;
MBEHAV::EMode mod2 = MBEHAV::NORMAL;
const NLMISC::TGameCycle cst = NetMngr.getCurrentServerTick();
NLMISC::TGameCycle gc;
CLFECOMMON::TCLEntityId entSlot = (CLFECOMMON::TCLEntityId)1;
CEntityCL *entPtr = EntitiesMngr.entity(entSlot);
if(entPtr)
{
CLFECOMMON::TCLEntityId mountSlot = (CLFECOMMON::TCLEntityId)2;
// Compute the position.
CEntityCL *mountPtr = EntitiesMngr.entity(mountSlot);
if(mountPtr)
{
//
gc = (NLMISC::TGameCycle)(cst+10);
//
x = (sint64)((mountPtr->pos().x+2)*1000.0);
y = (sint64)((mountPtr->pos().y)*1000.0);
z = (sint64)((mountPtr->pos().z)*1000.0);
IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSX), x);
IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSY), y);
IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSZ), z);
IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_MODE), mod); // Mode
IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_ENTITY_MOUNTED_ID), mountSlot); // Mount
entPtr->updateVisualProperty(gc, CLFECOMMON::PROPERTY_POSITION);
entPtr->updateVisualProperty(gc, CLFECOMMON::PROPERTY_MODE);
entPtr->updateVisualProperty(gc, CLFECOMMON::PROPERTY_ENTITY_MOUNTED_ID);
//
IngameDbMngr.setProp("Entities:E" + toString("%d", mountSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_MODE), mod);
IngameDbMngr.setProp("Entities:E" + toString("%d", mountSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_RIDER_ENTITY_ID), entSlot);
mountPtr->updateVisualProperty(gc, CLFECOMMON::PROPERTY_MODE);
mountPtr->updateVisualProperty(gc, CLFECOMMON::PROPERTY_RIDER_ENTITY_ID);
/*
//
gc = (NLMISC::TGameCycle)(cst+30);
//
x = (sint64)((mountPtr->pos().x+21)*1000.0);
y = (sint64)((mountPtr->pos().y+20)*1000.0);
z = (sint64)((mountPtr->pos().z)*1000.0);
IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSX), x);
IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSY), y);
IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSZ), z);
IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_MODE), mod2); // Mode
IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_ENTITY_MOUNTED_ID), CLFECOMMON::INVALID_SLOT); // Mount
entPtr->updateVisualProperty(gc, CLFECOMMON::PROPERTY_POSITION);
entPtr->updateVisualProperty(gc, CLFECOMMON::PROPERTY_MODE);
entPtr->updateVisualProperty(gc, CLFECOMMON::PROPERTY_ENTITY_MOUNTED_ID);
//
x = (sint64)((mountPtr->pos().x+20)*1000.0);
y = (sint64)((mountPtr->pos().y+20)*1000.0);
z = (sint64)((mountPtr->pos().z)*1000.0);
IngameDbMngr.setProp("Entities:E" + toString("%d", mountSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSX), x);
IngameDbMngr.setProp("Entities:E" + toString("%d", mountSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSY), y);
IngameDbMngr.setProp("Entities:E" + toString("%d", mountSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSZ), z);
IngameDbMngr.setProp("Entities:E" + toString("%d", mountSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_MODE), mod2);
IngameDbMngr.setProp("Entities:E" + toString("%d", mountSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_RIDER_ENTITY_ID), CLFECOMMON::INVALID_SLOT);
mountPtr->updateVisualProperty(gc, CLFECOMMON::PROPERTY_POSITION);
mountPtr->updateVisualProperty(gc, CLFECOMMON::PROPERTY_MODE);
mountPtr->updateVisualProperty(gc, CLFECOMMON::PROPERTY_RIDER_ENTITY_ID);
//
gc = (NLMISC::TGameCycle)(cst+50);
//
x = (sint64)((mountPtr->pos().x)*1000.0);
y = (sint64)((mountPtr->pos().y)*1000.0);
z = (sint64)((mountPtr->pos().z)*1000.0);
IngameDbMngr.setProp("Entities:E" + toString("%d", mountSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSX), x);
IngameDbMngr.setProp("Entities:E" + toString("%d", mountSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSY), y);
IngameDbMngr.setProp("Entities:E" + toString("%d", mountSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSZ), z);
mountPtr->updateVisualProperty(gc, CLFECOMMON::PROPERTY_POSITION);
*/
}
}
return true;
}
//-----------------------------------------------
/// Macro to set the new dist to front(back or side) for a given sheet.
/// commandName : Name of the command.
/// variableName : Variable Name to change.
//-----------------------------------------------
#define DIST_TO_COMMAND(commandName, variableName) \
/* Check Parameters */ \
if(args.size() != 2) \
{ \
nlwarning("Command '" #commandName "': need 2 parameters, try '/help " #commandName "' for more details."); \
return false; \
} \
\
/* Try to create the sheet with the parameter as a string. */ \
CSheetId sheetId; \
if(!sheetId.build(args[0])) \
{ \
/* Try to create the sheet with the parameter as an int. */ \
sheetId = atoi(args[0].c_str()); \
if(sheetId == CSheetId::Unknown) \
{ \
nlwarning("Command '" #commandName "': '%s' is not a valid form.", args[0]); \
return false; \
} \
} \
\
/* Get the new distance. */ \
float dist = (float)atof(args[1].c_str()); \
if(dist < 0) \
{ \
nlwarning("Command '" #commandName "': distance < 0, this is not good."); \
return false; \
} \
\
CCharacterSheet *ch = dynamic_cast<CCharacterSheet *>(SheetMngr.get(sheetId)); \
if(ch == 0) \
{ \
nlwarning("Command '" #commandName "': cannot find the character for the given sheet."); \
return false; \
} \
\
/* Set the new distance for this sheet. */ \
ch->variableName = dist; \
\
/* Well Done */ \
return true; \
//-----------------------------------------------
// 'dist2front' : Change the distance to the front for a given sheet.
//-----------------------------------------------
NLMISC_COMMAND(dist2front, "Change the distance to the front for a given sheet.", "<form> <dist>")
{
DIST_TO_COMMAND(dist2front, DistToFront);
}
//-----------------------------------------------
// 'dist2back' : Change the distance to the back for a given sheet.
//-----------------------------------------------
NLMISC_COMMAND(dist2back, "Change the distance to the back for a given sheet.", "<form> <dist>")
{
DIST_TO_COMMAND(dist2back, DistToBack);
}
//-----------------------------------------------
// 'dist2side' : Change the distance to the side for a given sheet.
//-----------------------------------------------
NLMISC_COMMAND(dist2side, "Change the distance to the side for a given sheet.", "<form> <dist>")
{
DIST_TO_COMMAND(dist2side, DistToSide);
}
//-----------------------------------------------
// 'shape' : Add a shape in the scene.
//-----------------------------------------------
NLMISC_COMMAND(shape, "Add a shape in the scene.", "<shape file>")
{
if(args.size() != 1)
{
nlwarning("Command 'shape': need 1 parameter, try '/help shape' for more details.");
return false;
}
UInstance *instance = Scene->createInstance(args[0]);
if(instance)
{
// Set the position
instance->setPos(UserEntity.pos());
// Compute the direction Matrix
CMatrix dir;
dir.identity();
CVector vi = UserEntity.dir()^CVector(0.f, 0.f, 1.f);
CVector vk = vi^UserEntity.dir();
dir.setRot(vi, UserEntity.dir(), vk, true);
// Set Orientation : User Direction should be normalized.
instance->setRotQuat(dir.getRot());
}
else
nlwarning("Command 'shape': cannot find the shape %s.", args[0].c_str());
// Command Well Done
return true;
}
//-----------------------------------------------
// 'parent' : Change the parent of an entity. 'parent slot' not defined remove the current parent.
//-----------------------------------------------
NLMISC_COMMAND(parent, "Change the parent of an entity.", "<slot> [<parent slot>]")
{
CLFECOMMON::TCLEntityId parentSlot = CLFECOMMON::INVALID_SLOT;
// Check parameters.
switch(args.size())
{
// Set the target for the entity.
case 2:
parentSlot = (CLFECOMMON::TCLEntityId)atoi(args[1].c_str());
// Remove the target for the entity.
case 1:
{
uint entitySlot = (uint)atoi(args[0].c_str());
CEntityCL *entity = EntitiesMngr.entity(entitySlot);
if(entity)
{
entity->parent(parentSlot);
entity->pos(CVectorD::Null);
}
else
nlwarning("command 'parent': there is no entity in the slot %d.", entitySlot);
}
break;
// Bad command.
default:
return false;
}
// Well done.
return true;
}
//-----------------------------------------------
// 'displaySentenceCounter' : display the sentence counter to compare with db counter
//-----------------------------------------------
NLMISC_COMMAND(displaySentenceCounter, "display the sentence counter to compare with db counter.", "")
{
CInterfaceManager *pIM= CInterfaceManager::getInstance();
CBrickManager *pBM= CBrickManager::getInstance();
uint srvVal= pIM->getDbProp("SERVER:BUILDING_SENTENCE:COUNTER")->getValue32();
uint locVal= pIM->getLocalSyncActionCounter() ;
srvVal&= pIM->getLocalSyncActionCounterMask();
locVal&= pIM->getLocalSyncActionCounterMask();
pIM->displaySystemInfo(ucstring( "ServerCounter: " + toString(srvVal) + "/ LocalCounter: " + toString(locVal)) );
// Well done.
return true;
} // displaySentenceCounter //
#if defined(NL_OS_WINDOWS)
NLMISC_COMMAND (url, "launch a browser to the specified url", "<url>")
{
if (args.size () != 1)
return false;
HINSTANCE result = ShellExecute(NULL, "open", args[0].c_str(), NULL,NULL, SW_SHOW);
if ((sint32)result > 32)
return true;
else
{
log.displayNL ("ShellExecute failed %d", (uint32)result);
return false;
}
}
#endif
#if defined(NL_OS_WINDOWS)
NLMISC_COMMAND (igurl, "launch a *in game* browser to the specified url", "<url>")
{
const char *webname[] = { "web.exe", "web_r.exe", "web_rd.exe", "web_df.exe", "web_d.exe" };
if (args.size () != 1)
return false;
string wn;
for (uint i = 0; i < sizeof(webname)/sizeof(webname[0]); i++)
{
if (CFile::fileExists (webname[i]))
{
wn = webname[i];
break;
}
}
if (wn.empty())
{
log.displayNL("web*.exe not found");
return false;
}
uint32 x, y, w, h;
Driver->getWindowPos(x, y);
Driver->getWindowSize(w, h);
x += w/2;
y += h/2;
w = (uint32)((float)w * 0.8f);
h = (uint32)((float)h * 0.8f);
string params;
params = toString (x);
params += " " + toString (y);
params += " " + toString (w);
params += " " + toString (h);
params += " " + args[0];
nlinfo ("launching web with : %s", params.c_str());
launchProgram(wn, params);
return true;
}
#endif
#endif // _LIMITED_COMMAND_
#endif // FINAL_VERSION