Changed: remove server src and cfg for Atys live branch (useless since we use another repo)

--HG--
branch : atys
hg/ark Live-746
ulukyn 6 years ago
parent 2c6bfe7d54
commit 9fc1987631

@ -1,149 +0,0 @@
// Use with commandline: ryzom_admin_service -A. -C. -L. --nobreak --fulladminname=admin_executor_service --shortadminname=AES
#include "admin_executor_service_default.cfg"
// ---- config local variables
// Address of the admin service (default port is 49996)
ASHost = "localhost";
ASPort="46701";
// ---- service NeL variables (used by ConfigFile class)
AESAliasName= "aes_open";
StartCommands=
{
// Create a gateway module
"moduleManager.createModule StandardGateway gw",
// add a layer 5 transport
"gw.transportAdd L5Transport l5",
// open the transport
"gw.transportCmd l5(open)",
/// Create default connection with admin executor service
// Create a gateway module
"moduleManager.createModule StandardGateway gw_aes",
// create the admin executor service module
"moduleManager.createModule AdminExecutorServiceClient aes_client",
"aes_client.plug gw_aes",
// create a layer 3 client to connect to aes gateway
"gw_aes.transportAdd L3Client aes_l3c",
"gw_aes.transportCmd aes_l3c(connect addr="+AESHost+":"+AESPort+")",
// create the admin executor service module
"moduleManager.createModule AdminExecutorService aes",
// create a gateway to connect to as
"moduleManager.createModule StandardGateway asc_gw",
// create a layer 3 client
"asc_gw.transportAdd L3Client l3c",
"asc_gw.transportCmd l3c(connect addr="+ASHost+":"+ASPort+")",
// create a gateway for services to connect
"moduleManager.createModule StandardGateway aes_gw",
// create a layer 3 server
"aes_gw.transportAdd L3Server l3s",
"aes_gw.transportOptions l3s(PeerInvisible)",
"aes_gw.transportCmd l3s(open port="+AESPort+")",
// plug the as
"aes.plug asc_gw",
"aes.plug aes_gw",
};
StartCommands +=
{
"aes.addRegisteredService bms_master open",
// "aes.addRegisteredService bms_pd_master open",
"aes.addRegisteredService egs open",
"aes.addRegisteredService gpms open",
"aes.addRegisteredService ios open",
"aes.addRegisteredService rns open",
"aes.addRegisteredService rws open",
"aes.addRegisteredService ts open",
"aes.addRegisteredService ms open",
"aes.addRegisteredService ais_newbyland open",
"aes.addRegisteredService mfs open",
"aes.addRegisteredService su open",
"aes.addRegisteredService fes open",
"aes.addRegisteredService sbs open",
"aes.addRegisteredService lgs open",
// "aes.addRegisteredService mos open",
// "aes.addRegisteredService pdss open",
"aes.addRegisteredService ras open",
};
bms_master = { "./", "/home/nevrax/dev/live/service_backup_service/backup_service", "-C. -L. --nobreak --writepid -P49990" };
bms_pd_master = { "./", "/home/nevrax/dev/live/service_backup_service/backup_service", "-C. -L. --nobreak --writepid -P49992" };
egs = { "./", "/home/nevrax/dev/live/service_entities_game_service/entities_game_service", "-C. -L. --nobreak --writepid" };
gpms = { "/home/nevrax/dev/gpms", "/home/nevrax/dev/live/service_gpm_service/gpm_service", "-C. -L. --nobreak --writepid" };
ios = { "/home/nevrax/dev/ios", "/home/nevrax/dev/live/service_input_output_service/input_output_service", "-C. -L. --nobreak --writepid" };
rns = { "/home/nevrax/dev/rns", "/home/nevrax/dev/live/service_ryzom_naming_service/ryzom_naming_service", "-C. -L. --nobreak --writepid" };
rws = { "/home/nevrax/dev/rws", "/home/nevrax/dev/live/service_ryzom_welcome_service/ryzom_welcome_service", "-C. -L. --nobreak --writepid" };
ts = { "/home/nevrax/dev/ts", "/home/nevrax/dev/live/service_tick_service/tick_service", "-C. -L. --nobreak --writepid" };
ms = { "/home/nevrax/dev/ms", "/home/nevrax/dev/live/service_mirror_service/mirror_service", "-C. -L. --nobreak --writepid" };
ais_newbyland = { "/home/nevrax/dev/ais_newbyland", "/home/nevrax/dev/live/service_ai_service/ai_service", "-C. -L. --nobreak --writepid -mCommon:Newbieland:Post" };
mfs = { "/home/nevrax/dev/mfs", "/home/nevrax/dev/live/service_mail_forum_service/mail_forum_service", "-C. -L. --nobreak --writepid" };
su = { "/home/nevrax/dev/su", "/home/nevrax/dev/live/service_shard_unifier_service/shard_unifier_service", "-C. -L. --nobreak --writepid" };
fes = { "/home/nevrax/dev/fes", "/home/nevrax/dev/live/service_frontend_service/frontend_service", "-C. -L. --nobreak --writepid" };
sbs = { "/home/nevrax/dev/sbs", "/home/nevrax/dev/live/service_session_browser_server/session_browser_server", "-C. -L. --nobreak --writepid" };
lgs = { "/home/nevrax/dev/lgs", "/home/nevrax/dev/live/service_logger_service/logger_service", "-C. -L. --nobreak --writepid" };
mos = { "/home/nevrax/dev/mos", "/home/nevrax/dev/live/service_monitor_service/monitor_service", "-C. -L. --nobreak --writepid" };
pdss = { "/home/nevrax/dev/pdss", "/home/nevrax/dev/live/service_pd_support_service/pd_support_service", "-C. -L. --nobreak --writepid" };
ras = { "./", "src/ryzom_admin_service/ryzom_admin_service", "--fulladminname=admin_service --shortadminname=AS -C. -L. --nobreak --writepid" };
RegisteredServices=
{
"bms_master",
"bms_pd_master",
"egs",
"gpms",
"ios",
"rns",
"rws",
"ts",
"ms",
"ais_newbyland",
"mfs",
"su",
"fes",
"sbs",
"lgs",
"mos",
"pdss",
"ras",
};
//
DontUseStdIn = 0;
// ---- service NeL variables (used by CVariable class)
// If the update loop is too slow, a thread will produce an assertion.
// By default, the value is set to 10 minutes.
// Set to 0 for no assertion.
UpdateAssertionThreadTimeout = 0;
// ---- service custom variables (used by ConfigFile class)
// ---- service custom variables (used by CVariable class)
// in second, -1 for not restarting
RestartDelay = 60;
// how many second before aborting the request if not finished
RequestTimeout = 5;
// log path for advanced log report
LogPath = "/.";
// setup for deployment environment with exeternal configuration system responsible for launching apps and
// for configuring AES services
DontLaunchServicesDirectly = 1;
UseExplicitAESRegistration = 1;
KillServicesOnDisconnect = 1;
ShardName="dev";

@ -1,7 +0,0 @@
#include "common.cfg"
// I'm the AES, I'll not connect to myself!
DontUseAES = 1;
// I don't need a connection to a naming service
DontUseNS = 1;

@ -1,22 +0,0 @@
// Use with commandline: ryzom_admin_service --fulladminname=ryzom_admin_service --shortadminname=AS -C. -L. --nobreak --writepid
// ---- config local variables
ASWebPort="46700";
ASPort="46701";
#include "admin_service_default.cfg"
// ---- service NeL variables (used by ConfigFile class)
AESAliasName= "ras";
Paths = {
".",
};
// ---- service NeL variables (used by CVariable class)
// ---- service custom variables (used by ConfigFile class)
// ---- service custom variables (used by CVariable class)

@ -1,27 +0,0 @@
#include "common.cfg"
DontUseNS = 1;
RRDToolPath = "rrdtool";
RRDVarPath = "save_shard/rrd_graphs";
// Variables required to be defined by other cfgs
//AESHost="localhost";
//ASWebPort="46700";
//ASPort="46701";
StartCommands +=
{
// create the admin service module and open the web interface
"moduleManager.createModule AdminService as webPort="+ASWebPort,
// create a gateway for aes to connect
"moduleManager.createModule StandardGateway as_gw",
// create a layer 3 server
"as_gw.transportAdd L3Server l3s",
"as_gw.transportOptions l3s(PeerInvisible)",
"as_gw.transportCmd l3s(open port="+ASPort+")",
// plug the as
"as.plug as_gw",
};

@ -1,64 +0,0 @@
// Use with commandline: ai_service -C. -L. --nobreak --writepid -mCommon:Newbieland:Post
// ---- config local variables
SUPort = 50505;
SUHost = "localhost";
// SU - listen address of the SU service (for L5 connections)
SUAddress = SUHost+":"+SUPort;
#include "ai_service_default.cfg"
// ---- service NeL variables (used by ConfigFile class)
AESAliasName= "ais_newbyland";
GraphVars += { "TickSpeedLoop", "60000" };
GraphVars += { "L5CallbackCount", "60000" };
GraphVars += { "L5CallbackTime", "60000" };
GraphVars += { "MirrorCallbackCount", "60000" };
GraphVars += { "MirrorCallbackTime", "60000" };
Paths = {
".",
"../common/data_common",
"../common/data_leveldesign",
};
// ---- service NeL variables (used by CVariable class)
// ---- service custom variables (used by ConfigFile class)
#include "used_continents.cfg"
// Mirror limits
DatasetSizefe_temp = 600000;
DatasetSizefame = 26000;
// define the primitives configuration used. (AIS, EGS)
UsedPrimitives =
{
"newbieland_all",
};
// the following variable must be defined but should be empty - it's presence is used to change the behaviour
// of the packed sheet reader
GeorgePaths = { "" };
// ---- service custom variables (used by CVariable class)
NbPlayersLimit = PlayerLimit;
// Entity Limits (AIS)
NbPetLimit = NbPlayersLimit*4;
NbFaunaLimit = 50000;
NbNpcLimit = 20000;
NbFxLimit = 500;
#include "backup_service_interface.cfg"
// Set this shard as a ring (1) or mainland (0) shard (main behavior switch)
IsRingShard = 0;
// Disable ryzom verbose logging
VerboseMIRROR = 0;

@ -1,198 +0,0 @@
#include "common.cfg"
// a list of system command that run at server startup.
SystemCmd = {};
//////////////////////////////////////////////////////////////////////////////
//- Basic (specific) heal profile parameters ---------------------------------
// Downtime for normal heal (on other bots of the group)
HealSpecificDowntime = 100;
// Downtime for self heal
HealSpecificDowntimeSelf = 100;
//////////////////////////////////////////////////////////////////////////////
// Disable caching of ligo primitive in binary files
CachePrims = 0;
CachePrimsLog = 0;
// do not log the corrected position.
LogAcceptablePos = 0;
// do not log group creation failure
LogGroupCreationFailure = 0;
// do not log aliad tree owner construstion.
LogAliasTreeOwner = 0;
// do not log outpost info
LogOutpostDebug = 0;
// Speed factor, for debug purpose only. Don't set to high speed factor !
SpeedFactor = 1;
// Speep up the timer triggering. Set a value between 1 (normal) and INT_MAX.
TimerSpeedUp = 1;
// Default timer for wander behavior
DefaultWanderMinTimer = 50; // 5s
DefaultWanderMaxTimer = 100; // 10s
// Fame and guard behavior
// Fame value under witch the guard attack the player in sigth
FameForGuardAttack = -450000;
// The minimum of fame for guard to help the player
FameForGuardHelp = -200000;
// The default aggro distance for NPC
DefaultNpcAggroDist = 15;
// The default escort range for escort behavior
DefaultEscortRange = 10;
//////////////////////////////////////////////////////////////////////////////
// Aggro //
//////////////////////////////////////////////////////////////////////////////
AggroReturnDistCheck = 15.0;
AggroReturnDistCheckFauna = 15.0;
AggroReturnDistCheckNpc = 1.5;
AggroD1Radius = 250.0;
AggroD2Radius = 150.0;
AggroPrimaryGroupDist = 0.0;
AggroPrimaryGroupCoef = 0.0;
AggroSecondaryGroupDist = 0.0;
AggroSecondaryGroupCoef = 0.0;
AggroPropagationRadius = 60.0;
BotRepopFx = "";
// GROUP KEYWORDS
// used mainly in event handlers to determine to which groups events apply
KeywordsGroupNpc = {
"patrol", // a group of bots who guard a patrol route or point
"convoy", // a group with pack animals who follow roads from place to place
"with_players", // a group who may travel with players
};
// BOT KEYWORDS
// used mainly in npc_state_profile to determine which ai profiles to assign to which bots
KeywordsBotNpc = {
"team_leader", // a bot who leads the way in front of their team (and acts as leader
// in discussion with players)
"animal_leader", // a bot who leads pack animals
"guard", // a bot who is a guard of some sort (eg karavan guard)
"emissary", // eg karavan emissary
"preacher", // eg kami preacher
"guardian", // typically kami guardians
"vip", // someone who has an escort of players or NPCs (assumed to be harmless)
};
// STATE KEYWORDS
// used mainly in event handlers to determine to which state events apply
// eg: when a player goes link dead if the team that this player is escorting
// is in a dangerous area the team may enter a 'protect ourselves and wait for
// players' punctual state
KeywordsStateNpc = {
"safe", // eg the gathering point at town entrance
"dangerous", // eg a route through the wilds
};
ColourNames =
{
"red : 0",
"beige : 1",
"green : 2",
"turquoise : 3",
"blue : 4",
"violet : 5",
"white : 6",
"black : 7",
"redHair: 0",
"blackHair: 1",
};
StartCommandsWhenMirrorReady = {
};
//---------------------------------------------------------
// commands for multi IA configuration
// For multi IA config, use the -m command line switch folowed
// by a semicolon separated list of command block to run.
// ex :
// -mCommon:Matis:Post
// will execute the folowing command blocks in order :
// * StartCommandsWhenMirrorReadyCommon
// * StartCommandsWhenMirrorReadyMatis
// * StartCommandsWhenMirrorReadyPost
//---------------------------------------------------------
// common commands before loading continents
StartCommandsWhenMirrorReadyCommon =
{
"RandomPosMaxRetry 6400",
"fightRangeRange 4 60",
"LogOutpostDebug 1",
"grpHistoryRecordLog",
"verboseAIProfiles",
"verboseAliasNodeTreeParserLog",
"verboseCombatLog",
"verboseFaunaMgrLog",
"verboseFaunaParseLog",
"verboseNPCBotProfiles",
"verboseNPCMgrLog",
"verboseNPCParserLog",
"verboseNpcDescriptionMsgLog",
"verbosePrimitiveParserLog",
// "verboseSwitchMultipleChangesOfAProperty",
};
// commands for Newbieland continent
StartCommandsWhenMirrorReadyNewbieland =
{
"loadContinent newbieland",
"createStaticAIInstance newbieland",
"loadMapsFromCommon newbieland_all",
};
// commands for post continents loading
StartCommandsWhenMirrorReadyPost =
{
"spawnInstances",
"updateAI",
"updateAI",
};
// commands for Ring continents
StartCommandsWhenMirrorReadyRing =
{
"loadContinent r2_desert",
"createDynamicAIInstance 10000",
"loadPrimitiveFile dummy.primitive",
"loadContinent r2_forest",
"createDynamicAIInstance 10001",
"loadPrimitiveFile dummy.primitive",
"loadContinent r2_lakes",
"createDynamicAIInstance 10003",
"loadPrimitiveFile dummy.primitive",
"loadContinent r2_jungle",
"createDynamicAIInstance 10002",
"loadPrimitiveFile dummy.primitive",
"loadContinent r2_roots",
"createDynamicAIInstance 10004",
"loadPrimitiveFile dummy.primitive",
// "spawnInstances",
"updateAI",
"updateAI",
// L5 connect to the shard unifier
"unifiedNetwork.addService ShardUnifier ( address="+SUAddress+" sendId external autoRetry )",
// Create a shard AIS Module
"moduleManager.createModule AisControl ais",
// Connect AIS
"ais.plug gw"
};

@ -1,34 +0,0 @@
// Use with commandline: backup_service -C. -L. --nobreak --writepid -P49990
#include "backup_service_default.cfg"
// ---- config local variables
// ---- service NeL variables (used by ConfigFile class)
AESAliasName = "bms_master";
Paths += {
".",
"../common/data_leveldesign",
};
// ---- service NeL variables (used by CVariable class)
// Where to save specific shard data (ie: player backup), relatively to SaveShardRoot
SaveFilesDirectory = "";
// where to save generic shard data (ie: packed_sheet)
WriteFilesDirectory = "data_shard";
// ---- service custom variables (used by ConfigFile class)
WebPort = 49970;
// ---- service custom variables (used by CVariable class)
// BS - Root directory where data are backuped to
IncrementalBackupDirectory = "../incremental_backup";
// Root directory where data from shards are stored into
SaveShardRoot = "save_shard/";

@ -1,32 +0,0 @@
#include "common.cfg"
// ---- service NeL variables (used by ConfigFile class)
DontUseNS = 1;
// ---- service NeL variables (used by CVariable class)
ListeningPort = 49990;
// ---- service custom variables (used by ConfigFile class)
// Listening port for the Web server to connect in
WebPort = 49898;
BSReadState = 1;
// ---- service custom variables (used by CVariable class)
// Port for the Layer 3 interface of the backup service
L3ListeningPort = 49950;
// template path from SaveShardRoot to find character saves
SaveTemplatePath = "$shard/characters/account_$userid_$charid$ext";
// character saves possible extension list
SaveExtList = "_pdr.bin _pdr.xml .bin";
//BSFilePrefix = "R:/code/ryzom/r2_shard/";
//BSFileSubst = "r2_shard/";

@ -1,5 +0,0 @@
L3BSPort = "49950";
BSHost = "localhost:49990";
UseBS = 1;
// Root directory where data from shards are stored into
SaveShardRoot = "save_shard/";

@ -1,99 +0,0 @@
// ---- config local variables
// Used by ConfigFile in EGS and WS
ShardId = 302;
// Used by CVariable in WS
PlayerLimit = 5000;
// Used to connect to AES (this file) and to set up AES service (admin_executor_service.cfg)
AESPort="46702";
AESHost="localhost";
// ---- service NeL variables (used by ConfigFile class)
WindowStyle = "WIN";
// don't connect to the old NeLNS AES
DontUseAES = 1;
// Configure module gateway for layer 5 module comm
StartCommands +=
{
// Create a gateway module
"moduleManager.createModule StandardGateway gw",
// add a layer 5 transport
"gw.transportAdd L5Transport l5",
// open the transport
"gw.transportCmd l5(open)",
/// Create default connection with admin executor service
// Create a gateway module
"moduleManager.createModule StandardGateway gw_aes",
// create the admin executor service module
"moduleManager.createModule AdminExecutorServiceClient aes_client",
"aes_client.plug gw_aes",
// create a layer 3 client to connect to aes gateway
"gw_aes.transportAdd L3Client aes_l3c",
"gw_aes.transportCmd aes_l3c(connect addr="+AESHost+":"+AESPort+")",
};
NSHost = "localhost";
// A list of vars to graph for any service
GraphVars +=
{
"ProcessUsedMemory", "60000", // every minute
};
IgnoredFiles = { "continent.cfg", "__read_me.txt", "bandit.html", "flora_primr.primitive" };
// Set a mainland SessionId.
// Live: Must be 0 for ring shards, non-zero (usually ShardId) for mainland shards
// Dev: Can be non-zero to initially connect a client to a ring shard
NoWSShardId = ShardId;
// ---- service NeL variables (used by CVariable class)
// Disable generation / display of nldebug messages
DisableNLDebug = 1;
// Disable nel net verbose logging
VerboseNETTC = 0;
VerboseLNETL0 = 0;
VerboseLNETL1 = 0;
VerboseLNETL2 = 0;
VerboseLNETL3 = 0;
VerboseLNETL4 = 0;
VerboseLNETL5 = 0;
VerboseLNETL6 = 0;
// If the update loop is too slow, a thread will produce an assertion.
// By default, the value is set to 10 minutes.
// Set to 0 for no assertion.
UpdateAssertionThreadTimeout = 6000000;
// how to sleep between 2 network updates
// 0 = pipe
// 1 = usleep
// 2 = nanosleep
// 3 = sched_yield
// 4 = nothing
UseYieldMethod = 0;
DefaultMaxExpectedBlockSize = 200000000; // 200 M !
DefaultMaxSentBlockSize = 200000000; // 200 M !
// Will SaveFilesDirectory will be converted to a full path?
ConvertSaveFilesDirectoryToFullPath = 0;
// Where to save specific shard data (ie: player backup), relatively to SaveShardRoot
SaveFilesDirectory = "";
// where to save generic shard data (ie: packed_sheet)
WriteFilesDirectory = "data_shard";
// ---- service custom variables (used by ConfigFile class)
// ---- service custom variables (used by CVariable class)

@ -1,320 +0,0 @@
// Auto generated config file
// Use with commandline: dynamic_scenario_service -C. -L. --nobreak --writepid
AESAliasName= "dss";
ASWebPort="46700";
ASPort="46701";
AESPort="46702";
SUPort = 50505;
SUGlobalPort = 50503;
L3BSPort = "49950";
L3SlaveBSPort = "49951";
L3MasterLGSPort = 49992;
LGSBSPort = 49994;
L3LGSBSPort = 49995;
SUHost = "localhost";
MFSHost = "localhost";
BSHost = "localhost:49990";
SlaveBSHost = "";
MasterLGSHost = "localhost";
SlaveLGSHost = "localhost";
LGSBSHost = "localhost";
DBHost = "localhost";
#define DONT_USE_LGS_SLAVE
// Configure module gateway for layer 5 module comm
StartCommands +=
{
// Create a gateway module
"moduleManager.createModule StandardGateway gw",
// add a layer 5 transport
"gw.transportAdd L5Transport l5",
// open the transport
"gw.transportCmd l5(open)",
/// Create default connection with admin executor service
// Create a gateway module
"moduleManager.createModule StandardGateway gw_aes",
// create the admin executor service module
"moduleManager.createModule AdminExecutorServiceClient aes_client",
"aes_client.plug gw_aes",
// create a layer 3 client to connect to aes gateway
"gw_aes.transportAdd L3Client aes_l3c",
"gw_aes.transportCmd aes_l3c(connect addr=localhost:"+AESPort+")",
};
/// A list of vars to graph for any service
GraphVars =
{
"ProcessUsedMemory", "60000", // every minute
};
/* Force default value for PDLib directory (e.g. SaveFilesDirectory...)
* PLEASE NOTICE THAT THIS LINE MUST BE LEFT TO ""
* Only log analyser must have the $shard parameter to find all shards root directory
*/
PDRootDirectory = "";
// Log PD updates to log file (1 enabled, 0 disabled), see PDLogSaveDirectory to choose where to log
PDEnableLog = 1;
// Log PD StringManager updates to log file (1 enabled, 0 disabled), see PDLogSaveDirectory to choose where to log
PDEnableStringLog = 0;
// Number of seconds between 2 logs to file
PDLogUpdate = 10;
// MySGL wrapper strict mode - controls use of asserts if SQL requests fail
MSWStrictMode=0;
// This is the mapping for logical continent to physical one
ContinentNameTranslator =
{
"matis_newbie", "matis",
"zorai_newbie", "zorai",
"terre", "terre_oubliee",
"sources", "sources_interdites"
};
NegFiltersDebug = { "ZZZZZZZZZZZ" };
NegFiltersInfo = { "ZZZZZZZZZZZ" };
NegFiltersWarning = { "ZZZZZZZZZZZ", "Missing log context for log" };
//NegFiltersDebug = { "NET", "ADMIN", "MIRROR", "NC", "PATH" };
//NegFiltersInfo = { "NET", "ADMIN", "MIRROR", "NC", "CF", "TimerManagerUpdate" };
// NegFiltersWarning = { "CT_LRC", "AnimalSpawned" };
// Block the system in the tick service that provokes stalls when overloaded
WaitForBSThreshold=0;
// Only produce log*.log files and not <service name>*.log
DontLog=1;
IgnoredFiles = { "continent.cfg", "__read_me.txt", "bandit.html", "flora_primr.primitive" };
// If the update loop is too slow, a thread will produce an assertion.
// By default, the value is set to 10 minutes.
// Set to 0 for no assertion.
UpdateAssertionThreadTimeout = 6000000;
DefaultMaxExpectedBlockSize = 200000000; // 200 M !
DefaultMaxSentBlockSize = 200000000; // 200 M !
// MS Packet size limit in bytes, PER DATASET (warning: depending on the weights, limits per property may be very small)
MaxOutBandwidth = 100000000;
// how to sleep between 2 network updates
// 0 = pipe
// 1 = usleep
// 2 = nanosleep
// 3 = sched_yield
// 4 = nothing
UseYieldMethod = 0;
// The privileges needed to access any ring session
PrivilegeForSessionAccess = ":DEV:SGM:GM:SG:";
// The max number of ring points (aka ring access) for each ecosystem
MaxRingPoints = "A1:D7:F7:J8:L6:R13";
// Level limit for newb scenarios
FreeTrialSkillLimit=21;
// Level limit for newb scenarios
DefaultInterShardExchangeLevelCap=0;
// Configureation for DSS
MaxNpcs = 300;
MaxStaticObjects = 200;
// the following variable must be defined but should be empty - it's presence is used to change the behaviour
// of the packed sheet reader
GeorgePaths = { "" };
// Dissable nel net verbose logging
VerboseNETTC = 0;
VerboseLNETL0 = 0;
VerboseLNETL1 = 0;
VerboseLNETL2 = 0;
VerboseLNETL3 = 0;
VerboseLNETL4 = 0;
VerboseLNETL5 = 0;
VerboseLNETL6 = 0;
// Dissable ryzom verbose logging
VerboseMIRROR = 0;
VerboseRingRPLog = 0;
VerboseCDBGroup = 0;
// What to do with characters coming from another mainland shard?
// 0: teleport to the stored session id
// 1: let the character play anyway, but leave the stored session id unchanged
// 2: assign the stored session id with FixedSessionId and let play
AllowCharsFromAllSessions = 0;
// Use Shard Unifier or not
DontUseSU = 0;
// the domain's set of useful addresses
LSHost = SUHost;
RSMHost = SUHost;
// MFS config
WebSrvUsersDirectory = "";
WebRootDirectory = "/home/nevrax/live/save_shard/www";
HoFHDTDirectory = "/local/www/hof/hdt";
// BS Specifics --------------------------------------------------------------------------
// BS - set to 1 if a BS is not part of a naming service group (then BS not disclosed
// to other services by the Layer 5, i.e. the services sending requests to BS have
// to know its/their address(es) by another mean)
BSDontUseNS = 1;
// BS - set the host of the naming service where the BS register
BSNSHost = "localhost";
UseBS = 1;
XMLSave = 0;
// Where to save specific shard data (ie: player backup), relatively to SaveShardRoot
SaveFilesDirectory = "";
// where to save generic shard data (ie: packed_sheet)
WriteFilesDirectory = "r2_shard/data_shard";
// Will SaveFilesDirectory will be converted to a full path?
ConvertSaveFilesDirectoryToFullPath = 0;
// BS - Root directory where data are backuped to
IncrementalBackupDirectory = "../incremental_backup";
// IOS - Directory to store ios.string_cache file
StringManagerCacheDirectory = "../data_shard_local";
// IOS - Directory to log chat into
LogChatDirectory = "../data_shard_local";
// MFS - Directories
WebRootDirectory = "../www";
// Root directory where data from shards are stored into
SaveShardRoot = "../save_shard/";
// SU Specifics --------------------------------------------------------------------------
// SU - set to 1 if SU didn't use a naming service
SUDontUseNS = 1;
// SU - host for the NS used by SU
SUNSHost = "localhost";
// SU - listen address of the SU service (for L5 connections)
SUAddress = SUHost+":"+SUPort;
// SU - nel and ring database names
DBNelName = "nel";
DBRingName = "ring_open";
// Nel DB user
DBNelUser = "open";
// Ring DB user
DBRingUser = "open";
// SU - password to access to the nel database with DBNelUseruser (default is no password)
DBNelPass = "";
// SU - password to access to the ring database with DBRingUser (default is no password)
DBRingPass = "";
// WS Specifics --------------------------------------------------------------------------
// WS - use or not the legacy WelcomeService from nel ns (only for backward compatibility during transition to ring)
DontUseLSService = 1;
// Global config --------------------------------------------------------------------------
// set to 0 if you want to use the admin system
DontUseAES = 1;
// Dissable generation / display of nldebug messages
DissableNLDebug = 1;
DisableNLDebug = 1;
ShardId = 201;
BasePort = 51400;
SaveFilesDirectory="open_ring01/";
NSHost = "localhost";
// Player limits (AIS, EGS, WS, FS)
NbPlayersLimit = 5000;
NbGuildLimit = 15000;
PlayerLimit = NbPlayersLimit;
ClientLimit = 1000;
// Set this shard as a ring (1) or mainland (0) shard (main behavior switch)
IsRingShard = 1;
// Set a mainland SessionId.
// Live: Must be 0 for ring shards, non-zero (usually ShardId) for mainland shards
// Dev: Can be non-zero to initially connect a client to a ring shard
NoWSShardId = ShardId;
FixedSessionId = 0;
// Mirror limits
DatasetSizefe_temp = 600000;
DatasetSizefame = 26000;
// FS Specifics --------------------------------------------------------------------------
// Client bandwidth ratio, set to 1 for standard operation, more than one allocate more bandwidth
BandwidthRatio = 2;
// EGS Specifics --------------------------------------------------------------------------
// Entity Limits (EGS)
NbObjectsLimit = 2000;
NbNpcSpawnedByEGSLimit = 5000;
NbForageSourcesLimit = 10000;
NbToxicCloudsLimit = 5000;
// AIS Specifics --------------------------------------------------------------------------
// Entity Limits (AIS)
NbPetLimit = NbPlayersLimit*4;
NbFaunaLimit = 50000;
NbNpcLimit = 50000;
NbFxLimit = 500;
// This is the list of continent to use with their unique instance number
UsedContinents =
{
"r2_desert", "10000",
"r2_forest", "10001",
"r2_jungle", "10002",
"r2_lakes", "10003",
"r2_roots", "10004",
};
// define the primitives configuration used.
UsedPrimitives =
{
};
FSListenHost = "localhost";
#include "dynamic_scenario_service_default.cfg"
WriteFilesDirectory="../live/service_dynamic_scenario_service/";
DontLog = 1;
WebSrvHost = "http://localhost:50000/";
Mainlands = {
"302", "Open", "(Open Developer Community)", "en",
};
HomeMainlandNames =
{
"302", "Open", "open",
};
RRDVarPath = "../rrd_graphs";
NegFiltersInfo+= {"FESTATS", "FETIME", "FERECV", "FESEND: sent SYNC message to client 1", "EIT: Register EId"};
NegFiltersWarning+= {"PIPO_SESSION1", "casino_session_matis01", "invalid damage type 10", "_log_Item_Delete",
"_log_Item_Money", "_log_Item_Create", "_log_Item_Move", "botChatMissionAdvance> invalid index 0",
"_MaxRange(0) < _MinRange(1)", "Can't find craft plan sheet 'unknown.unknown'"};
DontUseAES=1;
RingRPEnabled=0;
DomainName = "ryzom_open";
EnableStlAllocatorChecker = 0;
// start commands for setting up the exchange level caps of different ryzom shards
StartCommands += { "setShardExchangeLimit 101 250" };
StartCommands += { "setShardExchangeLimit 102 250" };
StartCommands += { "setShardExchangeLimit 103 250" };
StartCommands += { "setShardExchangeLimit 104 0" };
StartCommands += { "setShardExchangeLimit 105 0" };
StartCommands += { "displayShardExchangeLimits" };
StartCommands += { "EnableStlAllocatorChecker 0" };
Paths = {
".",
"../common/data_common",
"../common/data_leveldesign",
};

@ -1,9 +0,0 @@
DelayBeforeStartAct = 1;
MaxNpcs = 300;
MaxStaticObjects = 200;
StartCommands +=
{
"unifiedNetwork.addService ShardUnifier ( address="+SUAddress+" sendId external autoRetry )",
};

@ -1,196 +0,0 @@
// Use with commandline: entities_game_service -C. -L. --nobreak --writepid
// ---- config local variables
#define DONT_USE_LGS_SLAVE
AESPort="46702";
SUPort = 50505;
SUGlobalPort = 50503;
L3MasterLGSPort = 41292;
L3SlaveLGSPort = 49993;
SUHost = "localhost";
MasterLGSHost = "localhost";
SlaveLGSHost = "localhost";
// SU - listen address of the SU service (for L5 connections)
SUAddress = SUHost+":"+SUPort;
#include "entities_game_service_default.cfg"
// ---- service NeL variables (used by ConfigFile class)
AESAliasName= "egs";
StartCommands += {
"moduleManager.createModule AnimSessionManager asm",
"asm.plug gw",
};
// start commands for setting up the exchange level caps of different ryzom shards
StartCommands += { "setShardExchangeLimit 302 250" };
StartCommands += { "displayShardExchangeLimits" };
StartCommands += { "EnableStlAllocatorChecker 0" };
GraphVars += { "CharacterLoadPerTick", "60000" };
GraphVars += { "CharacterSavePerTick", "60000" };
GraphVars += { "TickSpeedLoop", "60000" };
GraphVars += { "L5CallbackCount", "60000" };
GraphVars += { "L5CallbackTime", "60000" };
GraphVars += { "MirrorCallbackCount", "60000" };
GraphVars += { "MirrorCallbackTime", "60000" };
NSHost = "localhost";
Paths = {
".",
"../common/data_common",
"../common/data_leveldesign",
};
PathsNoRecurse= {"."};
// ---- service NeL variables (used by CVariable class)
// ---- service custom variables (used by ConfigFile class)
WebSrvHost = "http://localhost:55555/";
NbPlayersLimit = PlayerLimit;
NbGuildLimit = 15000;
// Entity Limits (EGS)
NbObjectsLimit = 2000;
NbNpcSpawnedByEGSLimit = 5000;
NbForageSourcesLimit = 10000;
NbToxicCloudsLimit = 5000;
#include "used_continents.cfg"
// define the primitives configuration used.
UsedPrimitives =
{
"newbieland_all",
};
// the following variable must be defined but should be empty - it's presence is used to change the behaviour
// of the packed sheet reader
GeorgePaths = { "" };
HomeMainlandNames =
{
"302", "Open", "open",
};
/*
UsedContinents +=
{
"bagne", "0",
"fyros", "1",
"fyros_island", "2",
"fyros_newbie", "3",
"indoors", "4", // NB : this is for uninstanciated indoors building.
"matis", "5",
"matis_newbie", "7",
"matis_island", "8",
"nexus", "9",
"route_gouffre","10",
"sources", "11",
"terre", "12",
// "testroom", "13",
"tryker", "14",
"tryker_island","15",
"tryker_newbie","16",
"zorai", "17",
"zorai_island", "18",
"zorai_newbie", "19",
"newbieland", "20",
"kitiniere", "21",
};
// define the primitives configuration used.
UsedPrimitives =
{
"newbieland_all",
"matis_newbie_all",
"matis_all",
"matis_island_all",
"zorai_newbie_all",
"zorai_all",
"zorai_island_all",
"fyros_newbie_all",
"fyros_all",
"fyros_island_all",
"tryker_newbie_all",
"tryker_all",
"tryker_island_all",
"terre_all",
"sources_all",
"route_gouffre_all",
"nexus_all",
"bagne_all",
"kitiniere_all",
};
*/
// Mirror limits
DatasetSizefe_temp = 600000;
DatasetSizefame = 26000;
// ---- service custom variables (used by CVariable class)
RingRPEnabled=0;
RingRPXPRequiredPerAction=700;
RingRPXPRequiredPerTimeSlice=700;
MaxXPGainPerPlayer = 30.0;
DeathXPFactor = 0.1;
MFSHost = "localhost";
// Use Shard Unifier or not
DontUseSU = 0;
// Set this shard as a ring (1) or mainland (0) shard (main behavior switch)
IsRingShard = 0;
// Set a mainland SessionId.
// Live: Must be 0 for ring shards, non-zero (usually ShardId) for mainland shards
// Dev: Can be non-zero to initially connect a client to a ring shard
FixedSessionId = ShardId;
// Level limit for newb scenarios
FreeTrialSkillLimit=21;
// Level limit for newb scenarios
DefaultInterShardExchangeLevelCap=0;
// Disable ryzom verbose logging
VerboseMIRROR = 0;
VerboseRingRPLog = 0;
VerboseCDBGroup = 0;
// What to do with characters coming from another mainland shard?
// 0: teleport to the stored session id
// 1: let the character play anyway, but leave the stored session id unchanged
// 2: assign the stored session id with FixedSessionId and let play
AllowCharsFromAllSessions = 0;
/* Force default value for PDLib directory (e.g. SaveFilesDirectory...)
* PLEASE NOTICE THAT THIS LINE MUST BE LEFT TO ""
* Only log analyser must have the $shard parameter to find all shards root directory
*/
PDRootDirectory = "";
// Log PD updates to log file (1 enabled, 0 disabled), see PDLogSaveDirectory to choose where to log
PDEnableLog = 1;
// Log PD StringManager updates to log file (1 enabled, 0 disabled), see PDLogSaveDirectory to choose where to log
PDEnableStringLog = 0;
// Number of seconds between 2 logs to file
PDLogUpdate = 10;
#include "backup_service_interface.cfg"
XMLSave = 0;

File diff suppressed because it is too large Load Diff

@ -1,47 +0,0 @@
// Use with commandline: frontend_service -C. -L. --nobreak --writepid
// ---- config local variables
// Client bandwidth ratio, set to 1 for standard opration, more than one allocate more bandwidth
BandwidthRatio = 1;
FSUDPPort = 47851;
FSListenHost = "shard.ryzomcore.org";
#include "frontend_service_default.cfg"
// ---- service NeL variables (used by ConfigFile class)
AESAliasName= "fes";
GraphVars += { "TickSpeedLoop", "60000" };
GraphVars += { "L5CallbackCount", "60000" };
GraphVars += { "L5CallbackTime", "60000" };
GraphVars += { "MirrorCallbackCount", "60000" };
GraphVars += { "MirrorCallbackTime", "60000" };
Paths = {
"../common/data_common",
".",
"../common/data_leveldesign",
};
// ---- service NeL variables (used by CVariable class)
// ---- service custom variables (used by ConfigFile class)
//AcceptInvalidCookie = 1;
ClientLimit = 1000;
// Mirror limits
DatasetSizefe_temp = 600000;
DatasetSizefame = 26000;
// ---- service custom variables (used by CVariable class)
// Disable ryzom verbose logging
VerboseMIRROR = 0;
// Root directory where data from shards are stored into
SaveShardRoot = "save_shard/";

@ -1,104 +0,0 @@
#include "common.cfg"
// Configure module gateway for front end operation
StartCommands +=
{
// Add a security plugin (will add player info on player module proxy)
"gw.securityCreate FESecurity",
// create a front end service transport
"gw.transportAdd FEServer fes",
// set the transport option (need PeerInvisible and Firewalled)
"gw.transportOptions fes(PeerInvisible Firewalled)",
// open the transport
"gw.transportCmd fes(open)",
};
// UDP port for client communication
//FrontendPort = 47851;
ListenAddress = FSListenHost+":"+FSUDPPort;
// Maximum size that can be read from a client message
DatagramLength = 10000;
// Time-out before removing a client when it does not send any more data
ClientTimeOut = 600000; // 10 min
// Time-out before removing a limbo client when it does not send any more data
LimboTimeOut = 60000; // 1 min
// Maximum bytes per game cycle sent to all clients (currently not used/implemented)
TotalBandwidth = 536870911; // <512 MB : max value for 32 bit bitsize !
// Maximum bytes per game cycle sent to a client, including all headers
ClientBandwidth = 332 * BandwidthRatio; // 332 <=> 13 kbit/s at 5 Hz; 202 <=> 16 kbit/s at 10 Hz
// Maximum bytes for impulsion channels per datagram sent to a client
ImpulsionByteSize0 = 20 * BandwidthRatio;
ImpulsionByteSize1 = 200 * BandwidthRatio;
ImpulsionByteSize2 = 200 * BandwidthRatio;
NbMinimalVisualBytes = 50;
// Distance/delta ratio that triggers the sending of a position
DistanceDeltaRatioForPos = 100;
// Number of game cycles per front-end cycle
GameCycleRatio = 1;
// Execution period of distance calculation
CalcDistanceExecutionPeriod = 8;
// Execution period of position prioritization
PositionPrioExecutionPeriod = 2;
// Execution period of orientation prioritization
OrientationPrioExecutionPeriod = 8;
// Execution period of discreet properties prioritization
DiscreetPrioExecutionPeriod = 2;
SortPrioExecutionPeriod = 1;
// Display or not the "FE" nlinfos
DisplayInfo = 1;
// Prioritizer mode (currently the only mode is 1 for DistanceDelta)
PriorityMode = 1;
// Strategy for selecting pairs to prioritize (Power2WithCeiling=0, Scoring=1)
SelectionStrategy = 1;
// Minimum number of pairs to select for prioritization
MinNbPairsToSelect = 2000;
// Index of client to monitor, or 0 for no monitoring
ClientMonitor = 0;
// Allow or not beeping
AllowBeep = 1;
Lag = 0; // The lag on the simulated network (used by simlag)
PacketLoss = 0; // percentage of lost packet (used by simlag)
PacketDuplication = 0; // percentage of duplicated packet (used by simlag)
PacketDisordering = 0; // percentage of disordered packet (used by simlag) (Lag must be >100 to use disordering)
// ----------------------------------------
// Frontend/Patch mode settings
// If 1, the frontend server is used in Patch/Frontend mode (0 = only frontend mode, old behaviour)
UseWebPatchServer = 1;
// If 0, the frontend service is in Patch mode at startup, and it won't accept clients unless WS tells it to do so.
AcceptClientsAtStartup = 1;
// Patch URL footer. PatchURL will look like 'http://223.254.124.23:43435/patch'
PatchingURLFooter = ":43435/patch";
// System command to be executed when FS tries to start Web Patch server (ideally at FS startup)
StartWebServerSysCommand = "";
// System command to be executed when FS tries to stop Web Patch server (ideally when FS turns to frontend mode)
StopWebServerSysCommand = "";
// Use Thread for sending
UseSendThread = 1;
// Unidirectional Mirror mode (FS part)
ExpediteTOCK = 1;

@ -1,39 +0,0 @@
// Use with commandline: gpm_service -C. -L. --nobreak --writepid
#include "gpm_service_default.cfg"
// ---- config local variables
// ---- service NeL variables (used by ConfigFile class)
AESAliasName= "gpms";
GraphVars += { "TickSpeedLoop", "60000" };
GraphVars += { "L5CallbackCount", "60000" };
GraphVars += { "L5CallbackTime", "60000" };
GraphVars += { "MirrorCallbackCount", "60000" };
GraphVars += { "MirrorCallbackTime", "60000" };
Paths = {
".",
"../common/data_common",
"../common/data_leveldesign",
};
// ---- service NeL variables (used by CVariable class)
// ---- service custom variables (used by ConfigFile class)
#include "used_continents.cfg"
// Mirror limits
DatasetSizefe_temp = 600000;
DatasetSizefame = 26000;
// ---- service custom variables (used by CVariable class)
// Set this shard as a ring (1) or mainland (0) shard (main behavior switch)
IsRingShard = 0;
// Disable ryzom verbose logging
VerboseMIRROR = 0;

@ -1,7 +0,0 @@
#include "common.cfg"
CheckPlayerSpeed = 0;
SecuritySpeedFactor = 1.5;
LoadPacsPrims = 0;
LoadPacsCol = 1;

@ -1,81 +0,0 @@
// Use with commandline: input_output_service -C. -L. --nobreak --writepid
// ---- config local variables
#define DONT_USE_LGS_SLAVE
AESPort="46702";
SUPort = 50505;
SUGlobalPort = 50503;
L3MasterLGSPort = 41292;
L3SlaveLGSPort = 49993;
SUHost = "localhost";
MasterLGSHost = "localhost";
SlaveLGSHost = "localhost";
// SU - listen address of the SU service (for L5 connections)
SUAddress = SUHost+":"+SUPort;
#include "input_output_service_default.cfg"
// ---- service NeL variables (used by ConfigFile class)
AESAliasName= "ios";
// Create a char name mapper
StartCommands +=
{
"moduleManager.createModule CharNameMapper cnm",
"cnm.plug gw",
"moduleManager.createModule IOSRingModule iosrm",
"iosrm.plug gw",
};
Paths = {
".",
"../common/data_common",
"../common/data_leveldesign",
};
// ---- service NeL variables (used by CVariable class)
// ---- service custom variables (used by ConfigFile class)
// Mirror limits
DatasetSizefe_temp = 600000;
DatasetSizefame = 26000;
// the following variable must be defined but should be empty - it's presence is used to change the behaviour
// of the packed sheet reader
GeorgePaths = { "" };
// Use Shard Unifier or not
DontUseSU = 0;
HomeMainlandNames =
{
"302", "Open", "open",
};
// ---- service custom variables (used by CVariable class)
// Set this shard as a ring (1) or mainland (0) shard (main behavior switch)
IsRingShard = 0;
// Disable ryzom verbose logging
VerboseMIRROR = 0;
#include "backup_service_interface.cfg"
// IOS - Directory to store ios.string_cache file
StringManagerCacheDirectory = "data_shard_local";
// IOS - Directory to log chat into
LogChatDirectory = "data_shard_local";
ReadTranslationWork = 1;
TranslationWorkPath = "";
VerboseStringManager = 0;
VerboseStringManagerParser = 0;
VerboseChat = 0;
VerboseChatManagement = 0;
VerboseNameTranslation = 0;

@ -1,95 +0,0 @@
#include "common.cfg"
// ---- service NeL variables (used by ConfigFile class)
StartCommands +=
{
// L5 connect to the shard unifier
"unifiedNetwork.addService ShardUnifier ( address="+SUAddress+" sendId external autoRetry )",
// Create a gateway for global interconnection
// modules from different shard are visible to each other if they connect to
// this gateway. SU Local module have no interest to be plugged here.
"moduleManager.createModule StandardGateway glob_gw",
// add a layer 3 server transport
"glob_gw.transportAdd L3Client l3c",
// open the transport
"glob_gw.transportCmd l3c(connect addr="+SUHost+":"+SUGlobalPort+")",
// Create a gateway for logger service connection
"moduleManager.createModule StandardGateway lgs_gw",
// add a layer 3 server transport for master logger service
"lgs_gw.transportAdd L3Client masterL3c",
// open the transport
"lgs_gw.transportCmd masterL3c(connect addr="+MasterLGSHost+":"+L3MasterLGSPort+")",
};
#ifndef DONT_USE_LGS_SLAVE
StartCommands +=
{
// add a layer 3 server transport for slave logger service
"lgs_gw.transportAdd L3Client slaveL3c",
// open the transport
"lgs_gw.transportCmd slaveL3c(connect addr="+SlaveLGSHost+":"+L3SlaveLGSPort+")",
};
#endif
StartCommands +=
{
// Create a chat unifier client
"moduleManager.createModule ChatUnifierClient cuc",
// and plug it on the gateway to reach the SU ChatUnifierServer
"cuc.plug glob_gw",
"cuc.plug gw",
// Create the logger service client module
"moduleManager.createModule LoggerServiceClient lsc",
"lsc.plug lgs_gw",
};
#endif
// ---- service NeL variables (used by CVariable class)
// ---- service custom variables (used by ConfigFile class)
// a list of system command that can be run with "sysCmd" service command.
SystemCmd = {};
// IOS don't use work directory by default
ReadTranslationWork = 0;
TranslationWorkPath = "translation/work";
// Global shard bot name translation file. You sould overide this
// in input_output_service.cfg to specialize the file
// depending on the shard main language.
BotNameTranslationFile = "bot_names.txt";
// Global shard event faction translation file. You sould override this
// in input_output_service.cfg to specialize the file
// depending on the shard main language.
EventFactionTranslationFile = "event_factions.txt";
// ---- service custom variables (used by CVariable class)
// Activate/deactivate debugging of missing paremeter replacement
DebugReplacementParameter = 1;
// Default verbose debug flags:
//-----------------------------
// Log bot name translation from 'BotNameTranslationFile'
VerboseNameTranslation = 1;
// Log chat management operation
VerboseChatManagement = 1;
// Log chat event
VerboseChat = 1;
// Log string manager message
VerboseStringManager = 1;
// Log the string manager parsing message
VerboseStringManagerParser = 0;

@ -1,50 +0,0 @@
// Use with commandline: logger_service -C. -L. --nobreak --writepid
#include "logger_service_default.cfg"
// ---- config local variables
LGSL3Port = 41292;
// ---- service NeL variables (used by ConfigFile class)
AESAliasName= "lgs";
StartCommands +=
{
"moduleManager.createModule LoggerService ls",
"moduleManager.createModule StandardGateway lgs_gw",
"ls.plug lgs_gw",
"lgs_gw.transportAdd L3Server l3s",
"lgs_gw.transportOptions l3s(PeerInvisible)",
"lgs_gw.transportCmd l3s(open port="+ LGSL3Port +")",
};
DontUseNS = 1;
Paths = {
".",
"../common/data_leveldesign",
};
// ---- service NeL variables (used by CVariable class)
// Where to save specific shard data (ie: player backup), relatively to SaveShardRoot
SaveFilesDirectory = "save_shard/";
// where to save generic shard data (ie: packed_sheet)
WriteFilesDirectory = "r2_shard/data_shard";
// ---- service custom variables (used by ConfigFile class)
// Use Shard Unifier or not
DontUseSU = 0;
HomeMainlandNames =
{
"302", "Open", "open",
};
// ---- service custom variables (used by CVariable class)
#include "backup_service_interface.cfg"

@ -1,19 +0,0 @@
// Use with commandline: mail_forum_service -C. -L. --nobreak --writepid
#include "mail_forum_service_default.cfg"
// ---- config local variables
// ---- service NeL variables (used by ConfigFile class)
AESAliasName= "mfs";
Paths = {
".",
};
// ---- service NeL variables (used by CVariable class)
// ---- service custom variables (used by ConfigFile class)
// ---- service custom variables (used by CVariable class)

@ -1,29 +0,0 @@
#include "common.cfg"
// ---- service NeL variables (used by ConfigFile class)
DontUseNS = 1;
// ---- service NeL variables (used by CVariable class)
// ---- service custom variables (used by ConfigFile class)
// ---- service custom variables (used by CVariable class)
WebRootDirectory = "save_shard/www";
// Set if Hall of Fame generator is enabled
HoFEnableGenerator = 1;
// Set if HoF generator is verbose
HoFVerbose = 0;
// Directory where HDT files are
HoFHDTDirectory = "/local/www/hof/hdt";
// HoF generator maximum update period in milliseconds
HoFGeneratorUpdatePeriod = 200;
// HoF generator directory update period in seconds
HoFGeneratorDirUpdatePeriod = 60;

@ -1,35 +0,0 @@
// Use with commandline: mirror_service -C. -L. --nobreak --writepid
#include "mirror_service_default.cfg"
// ---- config local variables
// ---- service NeL variables (used by ConfigFile class)
AESAliasName= "ms";
GraphVars += { "UserSpeedLoop", "60000" };
GraphVars += { "L5CallbackCount", "60000" };
GraphVars += { "L5CallbackTime", "60000" };
Paths = {
".",
"../common/data_common",
"../common/data_leveldesign",
};
// ---- service NeL variables (used by CVariable class)
// ---- service custom variables (used by ConfigFile class)
// Mirror limits
DatasetSizefe_temp = 600000;
DatasetSizefame = 26000;
// MS Packet size limit in bytes, PER DATASET (warning: depending on the weights, limits per property may be very small)
MaxOutBandwidth = 100000000;
// ---- service custom variables (used by CVariable class)
// Disable ryzom verbose logging
VerboseMIRROR = 0;

@ -1,6 +0,0 @@
#include "common.cfg"
// ---- service custom variables (used by ConfigFile class)
// Linux only
DestroyGhostSegments = 1;

@ -1,38 +0,0 @@
// Use with commandline: monitor_service -C. -L. --nobreak --writepid
#include "monitor_service_default.cfg"
#include "used_continents.cfg"
// ---- config local variables
// ---- service NeL variables (used by ConfigFile class)
AESAliasName= "mos";
GraphVars += { "UserSpeedLoop", "60000" };
GraphVars += { "L5CallbackCount", "60000" };
GraphVars += { "L5CallbackTime", "60000" };
Paths = {
".",
"../common/data_common",
"../common/data_leveldesign",
};
// ---- service NeL variables (used by CVariable class)
// ---- service custom variables (used by ConfigFile class)
// Mirror limits
DatasetSizefe_temp = 600000;
DatasetSizefame = 26000;
// MS Packet size limit in bytes, PER DATASET (warning: depending on the weights, limits per property may be very small)
MaxOutBandwidth = 100000000;
// ---- service custom variables (used by CVariable class)
// Disable ryzom verbose logging
VerboseMIRROR = 0;

@ -1,21 +0,0 @@
// Use with commandline: ryzom_naming_service -C. -L. --nobreak --writepid
#include "naming_service_default.cfg"
// ---- config local variables
// ---- service NeL variables (used by ConfigFile class)
AESAliasName= "rns";
Paths = {
"data_www"
};
// ---- service NeL variables (used by CVariable class)
// ---- service custom variables (used by ConfigFile class)
BasePort = 51000;
// ---- service custom variables (used by CVariable class)

@ -1,7 +0,0 @@
#include "common.cfg"
SId = 1;
DontUseNS = 1;
UniqueOnShardServices = {}; // { "EGS", "GPMS", "IOS", "TICKS", "WS", "AIS", "DSS" };
UniqueByMachineServices = {}; // { "MS" };

@ -1,4 +0,0 @@
Ce repertoire ne doit contenir *que* des fichiers qui sont differents s'il y a plusieurs instance de shard.
C'est le cas par exemple des sauvegardes des joueurs, des guiles, de la date etc...
ATTENTION: *aucuns* fichiers (sauf le read me) ici ne doivent etre commité dans le cvs car ils sont sauvé dynamiquement et doivent savoir se creer lorsqu'ils n'existent pas.

@ -1,47 +0,0 @@
// Use with commandline: session_browser_server -C. -L. --nobreak --writepid
#include "session_browser_server_default.cfg"
// ---- config local variables
#include "sql.cfg"
SBSPort = 48851;
SUHost = "localhost";
// ---- service NeL variables (used by ConfigFile class)
AESAliasName= "sbs";
StartCommands +=
{
"moduleManager.createModule SessionBrowserServerMod sbs suAddr="+SUHost+":49999 listenPort="+SBSPort+" ring_db(host="+DBHost+" user="+DBRingUser+" password="+DBRingPass+" base="+DBRingName+")",
"sbs.plug gw",
};
GraphVars += { "NetSpeedLoop", "60000" };
GraphVars += { "L5CallbackCount", "60000" };
GraphVars += { "L5CallbackTime", "60000" };
Paths = {
".",
};
// ---- service NeL variables (used by CVariable class)
// ---- service custom variables (used by ConfigFile class)
// Use Shard Unifier or not
DontUseSU = 0;
HomeMainlandNames =
{
"302", "Open", "open",
};
// The max number of ring points (aka ring access) for each ecosystem
MaxRingPoints = "A1:D7:F7:J8:L6:R13";
// ---- service custom variables (used by CVariable class)

@ -1,77 +0,0 @@
# ------------------------------------------------------------------------------
# SCREEN KEYBINDINGS
# ------------------------------------------------------------------------------
# Remove some stupid / dangerous key bindings
bind ^k
#bind L
bind ^\
# Make them better
bind \\ quit
bind K kill
bind I login on
bind O login off
hardstatus alwayslastline "%w"
chdir $RYZOM_PATH/server
screen -t aes /bin/sh ../tools/scripts/linux/service_launcher.sh aes $RYZOM_PATH/../build/bin/ryzom_admin_service -A. -C. -L. --nobreak --fulladminname=admin_executor_service --shortadminname=AES
# bms_master
screen -t bms_master /bin/sh ../tools/scripts/linux/service_launcher.sh bms_master $RYZOM_PATH/../build/bin/ryzom_backup_service -C. -L. --nobreak --writepid -P49990
# bms_pd_master
#screen -t bms_pd_master /bin/sh ../tools/scripts/linux/service_launcher.sh bms_pd_master $RYZOM_PATH/../build/bin/ryzom_backup_service -C. -L. --nobreak --writepid -P49992
# egs
screen -t egs /bin/sh ../tools/scripts/linux/service_launcher.sh egs $RYZOM_PATH/../build/bin/ryzom_entities_game_service -C. -L. --nobreak --writepid
# gpms
screen -t gpms /bin/sh ../tools/scripts/linux/service_launcher.sh gpms $RYZOM_PATH/../build/bin/ryzom_gpm_service -C. -L. --nobreak --writepid
# ios
screen -t ios /bin/sh ../tools/scripts/linux/service_launcher.sh ios $RYZOM_PATH/../build/bin/ryzom_ios_service -C. -L. --nobreak --writepid
# rns
screen -t rns /bin/sh ../tools/scripts/linux/service_launcher.sh rns $RYZOM_PATH/../build/bin/ryzom_naming_service -C. -L. --nobreak --writepid
# rws
screen -t rws /bin/sh ../tools/scripts/linux/service_launcher.sh rws $RYZOM_PATH/../build/bin/ryzom_welcome_service -C. -L. --nobreak --writepid
# ts
screen -t ts /bin/sh ../tools/scripts/linux/service_launcher.sh ts $RYZOM_PATH/../build/bin/ryzom_tick_service -C. -L. --nobreak --writepid
# ms
screen -t ms /bin/sh ../tools/scripts/linux/service_launcher.sh ms $RYZOM_PATH/../build/bin/ryzom_mirror_service -C. -L. --nobreak --writepid
# ais_newbyland
screen -t ais_newbyland /bin/sh ../tools/scripts/linux/service_launcher.sh ais_newbyland $RYZOM_PATH/../build/bin/ryzom_ai_service -C. -L. --nobreak --writepid -mCommon:Newbieland:Post
# mfs
screen -t mfs /bin/sh ../tools/scripts/linux/service_launcher.sh mfs $RYZOM_PATH/../build/bin/ryzom_mail_forum_service -C. -L. --nobreak --writepid
# su
screen -t su /bin/sh ../tools/scripts/linux/service_launcher.sh su $RYZOM_PATH/../build/bin/ryzom_shard_unifier_service -C. -L. --nobreak --writepid
# fes
screen -t fes /bin/sh ../tools/scripts/linux/service_launcher.sh fes $RYZOM_PATH/../build/bin/ryzom_frontend_service -C. -L. --nobreak --writepid
# sbs
screen -t sbs /bin/sh ../tools/scripts/linux/service_launcher.sh sbs $RYZOM_PATH/../build/bin/ryzom_session_browser_service -C. -L. --nobreak --writepid
# lgs
screen -t lgs /bin/sh ../tools/scripts/linux/service_launcher.sh lgs $RYZOM_PATH/../build/bin/ryzom_logger_service -C. -L. --nobreak --writepid
# mos
#screen -t mos /bin/sh ../tools/scripts/linux/service_launcher.sh mos $RYZOM_PATH/../build/bin/ryzom_monitor_service -C. -L. --nobreak --writepid
# pdss
#screen -t pdss /bin/sh ../tools/scripts/linux/service_launcher.sh pdss $RYZOM_PATH/../build/bin/ryzom_pd_support_service -C. -L. --nobreak --writepid
# ras
screen -t ras /bin/sh ../tools/scripts/linux/service_launcher.sh ras $RYZOM_PATH/../build/bin/ryzom_admin_service --fulladminname=admin_service --shortadminname=AS -C. -L. --nobreak --writepid
# switch back to AES screen
select 0

@ -1,50 +0,0 @@
// Use with commandline: shard_unifier_service -C. -L. --nobreak --writepid
// ---- config local variables
SUGlobalPort = 50503;
#include "sql.cfg"
#include "shard_unifier_service_default.cfg"
// ---- service NeL variables (used by ConfigFile class)
AESAliasName= "su";
// Create a command executor
StartCommands +=
{
"moduleManager.createModule CommandExecutor ce",
"ce.plug gw",
};
GraphVars += { "TotalConcurentUser", "60000" };
GraphVars += { "NetSpeedLoop", "60000" };
GraphVars += { "L5CallbackCount", "60000" };
GraphVars += { "L5CallbackTime", "60000" };
Paths = {
".",
};
// ---- service NeL variables (used by CVariable class)
// ---- service custom variables (used by ConfigFile class)
// Use Shard Unifier or not
DontUseSU = 0;
HomeMainlandNames =
{
"302", "Open", "open",
};
// ---- service custom variables (used by CVariable class)
DomainName = "ryzom_open";
// The privileges needed to access any ring session
PrivilegeForSessionAccess = ":DEV:SGM:GM:SG:";
#include "backup_service_interface.cfg"

@ -1,33 +0,0 @@
#include "common.cfg"
DontUseNS = 1;
StartCommands +=
{
// Create a gateway for global interconnection
// modules from different shard are visible to each other if they connect to
// this gateway. SU Local module have no interest to be plugged here.
"moduleManager.createModule StandardGateway glob_gw",
// add a layer 3 server transport
"glob_gw.transportAdd L3Server l3s",
// open the transport
"glob_gw.transportCmd l3s(open port="+SUGlobalPort+")",
// Create a session manager module
"moduleManager.createModule RingSessionManager rsm web(port=49999) ring_db(host="+DBHost+" user="+DBRingUser+" password="+DBRingPass+" base="+DBRingName+") nel_db(host="+DBHost+" user="+DBNelUser+" password="+DBNelPass+" base="+DBNelName+")",
"rsm.plug gw",
// Create a login service module
"moduleManager.createModule LoginService ls ring_db(host="+DBHost+" user="+DBRingUser+" password="+DBRingPass+" base="+DBRingName+") web(port=49998) nel_db(host="+DBHost+" user="+DBNelUser+" password="+DBNelPass+" base="+DBNelName+")",
"ls.plug gw",
// Create a character synchronization module
"moduleManager.createModule CharacterSynchronisation cs fake_edit_char ring_db(host="+DBHost+" user="+DBRingUser+" password="+DBRingPass+" base="+DBRingName+")",
"cs.plug gw",
// Create entity locator module
"moduleManager.createModule EntityLocator el ring_db(host="+DBHost+" user="+DBRingUser+" password="+DBRingPass+" base="+DBRingName+") nel_db(host="+DBHost+" user="+DBNelUser+" password="+DBNelPass+" base="+DBNelName+")",
"el.plug gw",
// Create a mail forum notifier forwarder
"moduleManager.createModule MailForumNotifierFwd mfnfwd ring_db(host="+DBHost+" user="+DBRingUser+" password="+DBRingPass+" base="+DBRingName+") web(port=49897)",
"mfnfwd.plug gw",
// Create a chat unifier server module
"moduleManager.createModule ChatUnifierServer cus ring_db(host="+DBHost+" user="+DBRingUser+" password="+DBRingPass+" base="+DBRingName+")",
"cus.plug gw",
};

@ -1,14 +0,0 @@
DBHost = "localhost";
DBNelName = "nel";
DBRingName = "ring_open";
// Nel DB user
DBNelUser = "shard";
// Ring DB user
DBRingUser = "shard";
// SU - password to access to the nel database with DBNelUseruser (default is no password)
DBNelPass = "";
// SU - password to access to the ring database with DBRingUser (default is no password)
DBRingPass = "";
// MySQL wrapper strict mode - controls use of asserts if SQL requests fail
MSWStrictMode=0;

@ -1,52 +0,0 @@
# Supporting modules and libraries.
# Need servershare for build packed collision tool
# Need aishare for build wmap tool
IF(WITH_RYZOM_TOOLS OR WITH_RYZOM_SERVER)
ADD_SUBDIRECTORY(server_share)
ADD_SUBDIRECTORY(ai_share)
ENDIF()
IF(WITH_RYZOM_SERVER)
# Supporting modules and libraries.
ADD_SUBDIRECTORY(admin_modules)
ADD_SUBDIRECTORY(gameplay_module_lib)
ADD_SUBDIRECTORY(pd_lib)
# Ryzom Services
ADD_SUBDIRECTORY(ai_service)
ADD_SUBDIRECTORY(backup_service)
ADD_SUBDIRECTORY(dynamic_scenario_service)
ADD_SUBDIRECTORY(entities_game_service)
ADD_SUBDIRECTORY(frontend_service)
ADD_SUBDIRECTORY(gpm_service)
ADD_SUBDIRECTORY(input_output_service)
ADD_SUBDIRECTORY(ryzom_admin_service)
ADD_SUBDIRECTORY(ryzom_naming_service)
ADD_SUBDIRECTORY(ryzom_welcome_service)
ADD_SUBDIRECTORY(log_analyser_service)
ADD_SUBDIRECTORY(logger_service)
ADD_SUBDIRECTORY(mail_forum_service)
ADD_SUBDIRECTORY(mirror_service)
ADD_SUBDIRECTORY(monitor_service)
ADD_SUBDIRECTORY(pd_reference_builder)
ADD_SUBDIRECTORY(pd_support_service)
ADD_SUBDIRECTORY(persistant_data_service)
ADD_SUBDIRECTORY(session_browser_server)
ADD_SUBDIRECTORY(shard_unifier_service)
ADD_SUBDIRECTORY(tick_service)
ADD_SUBDIRECTORY(patchman_service)
# Deprecated, no longer used.
#ADD_SUBDIRECTORY(ags_test)
#ADD_SUBDIRECTORY(ai_data_service)
#ADD_SUBDIRECTORY(entity_view_service)
ADD_SUBDIRECTORY(general_utilities_service)
# Not sure, no longer used maybe?
#sabrina
#simulation_service
#testing_tool_service
ENDIF()

@ -1,19 +0,0 @@
FILE(GLOB SRC *.cpp *.h)
NL_TARGET_LIB(ryzom_adminmodules ${SRC})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
TARGET_LINK_LIBRARIES(ryzom_adminmodules nelmisc nelnet)
NL_DEFAULT_PROPS(ryzom_adminmodules "Ryzom, Library: Service Admin Modules")
NL_ADD_RUNTIME_FLAGS(ryzom_adminmodules)
NL_ADD_LIB_SUFFIX(ryzom_adminmodules)
IF(WITH_PCH)
ADD_NATIVE_PRECOMPILED_HEADER(ryzom_adminmodules ${CMAKE_CURRENT_SOURCE_DIR}/stdpch.h ${CMAKE_CURRENT_SOURCE_DIR}/stdpch.cpp)
ENDIF()
IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC)
INSTALL(TARGETS ryzom_adminmodules LIBRARY DESTINATION ${RYZOM_LIB_PREFIX} ARCHIVE DESTINATION ${RYZOM_LIB_PREFIX} COMPONENT libraries)
ENDIF()

@ -1,40 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
/** This file declare a pure nel module library */
#include "nel/net/module_manager.h"
#include "nel/net/module.h"
#include "nel/net/module_builder_parts.h"
using namespace std;
using namespace NLMISC;
using namespace NLNET;
extern void as_forceLink();
extern void aes_forceLink();
extern void aesclient_forceLink();
void admin_modules_forceLink()
{
as_forceLink();
aes_forceLink();
aesclient_forceLink();
}
//NLMISC_DECL_PURE_LIB(CNelModuleLibrary);

@ -1,731 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
/////////////////////////////////////////////////////////////////
// WARNING : this is a generated file, don't change it !
/////////////////////////////////////////////////////////////////
#include "stdpch.h"
#include "admin_modules_itf.h"
namespace ADMIN
{
/////////////////////////////////////////////////////////////////
// WARNING : this is a generated file, don't change it !
/////////////////////////////////////////////////////////////////
const CAdminServiceSkel::TMessageHandlerMap &CAdminServiceSkel::getMessageHandlers() const
{
static TMessageHandlerMap handlers;
static bool init = false;
if (!init)
{
std::pair < TMessageHandlerMap::iterator, bool > res;
res = handlers.insert(std::make_pair(std::string("USU"), &CAdminServiceSkel::upServiceUpdate_skel));
// if this assert, you have a doubly message name in your interface definition !
nlassert(res.second);
res = handlers.insert(std::make_pair(std::string("GU"), &CAdminServiceSkel::graphUpdate_skel));
// if this assert, you have a doubly message name in your interface definition !
nlassert(res.second);
res = handlers.insert(std::make_pair(std::string("HRGU"), &CAdminServiceSkel::highRezGraphUpdate_skel));
// if this assert, you have a doubly message name in your interface definition !
nlassert(res.second);
res = handlers.insert(std::make_pair(std::string("CR"), &CAdminServiceSkel::commandResult_skel));
// if this assert, you have a doubly message name in your interface definition !
nlassert(res.second);
init = true;
}
return handlers;
}
bool CAdminServiceSkel::fwdOnProcessModuleMessage(NLNET::IModuleProxy *sender, const NLNET::CMessage &message)
{
const TMessageHandlerMap &mh = getMessageHandlers();
TMessageHandlerMap::const_iterator it(mh.find(message.getName()));
if (it == mh.end())
{
return false;
}
TMessageHandler cmd = it->second;
(this->*cmd)(sender, message);
return true;
}
void CAdminServiceSkel::upServiceUpdate_skel(NLNET::IModuleProxy *sender, const NLNET::CMessage &__message)
{
H_AUTO(CAdminServiceSkel_upServiceUpdate_USU);
std::vector < TServiceStatus > serviceStatus;
nlRead(__message, serialCont, serviceStatus);
upServiceUpdate(sender, serviceStatus);
}
void CAdminServiceSkel::graphUpdate_skel(NLNET::IModuleProxy *sender, const NLNET::CMessage &__message)
{
H_AUTO(CAdminServiceSkel_graphUpdate_GU);
TGraphDatas graphDatas;
nlRead(__message, serial, graphDatas);
graphUpdate(sender, graphDatas);
}
void CAdminServiceSkel::highRezGraphUpdate_skel(NLNET::IModuleProxy *sender, const NLNET::CMessage &__message)
{
H_AUTO(CAdminServiceSkel_highRezGraphUpdate_HRGU);
THighRezDatas graphDatas;
nlRead(__message, serial, graphDatas);
highRezGraphUpdate(sender, graphDatas);
}
void CAdminServiceSkel::commandResult_skel(NLNET::IModuleProxy *sender, const NLNET::CMessage &__message)
{
H_AUTO(CAdminServiceSkel_commandResult_CR);
uint32 commandId;
nlRead(__message, serial, commandId);
std::string serviceAlias;
nlRead(__message, serial, serviceAlias);
std::string result;
nlRead(__message, serial, result);
commandResult(sender, commandId, serviceAlias, result);
}
// An AES send an update of the list of service up
void CAdminServiceProxy::upServiceUpdate(NLNET::IModule *sender, const std::vector < TServiceStatus > &serviceStatus)
{
if (_LocalModuleSkel && _LocalModule->isImmediateDispatchingSupported())
{
// immediate local synchronous dispatching
_LocalModuleSkel->upServiceUpdate(_ModuleProxy->getModuleGateway()->getPluggedModuleProxy(sender), serviceStatus);
}
else
{
// send the message for remote dispatching and execution or local queing
NLNET::CMessage __message;
buildMessageFor_upServiceUpdate(__message, serviceStatus);
_ModuleProxy->sendModuleMessage(sender, __message);
}
}
// An AES send graph data update
void CAdminServiceProxy::graphUpdate(NLNET::IModule *sender, const TGraphDatas &graphDatas)
{
if (_LocalModuleSkel && _LocalModule->isImmediateDispatchingSupported())
{
// immediate local synchronous dispatching
_LocalModuleSkel->graphUpdate(_ModuleProxy->getModuleGateway()->getPluggedModuleProxy(sender), graphDatas);
}
else
{
// send the message for remote dispatching and execution or local queing
NLNET::CMessage __message;
buildMessageFor_graphUpdate(__message, graphDatas);
_ModuleProxy->sendModuleMessage(sender, __message);
}
}
// An AES send high rez graph data update
void CAdminServiceProxy::highRezGraphUpdate(NLNET::IModule *sender, const THighRezDatas &graphDatas)
{
if (_LocalModuleSkel && _LocalModule->isImmediateDispatchingSupported())
{
// immediate local synchronous dispatching
_LocalModuleSkel->highRezGraphUpdate(_ModuleProxy->getModuleGateway()->getPluggedModuleProxy(sender), graphDatas);
}
else
{
// send the message for remote dispatching and execution or local queing
NLNET::CMessage __message;
buildMessageFor_highRezGraphUpdate(__message, graphDatas);
_ModuleProxy->sendModuleMessage(sender, __message);
}
}
// AES send back the result of execution of a command
void CAdminServiceProxy::commandResult(NLNET::IModule *sender, uint32 commandId, const std::string &serviceAlias, const std::string &result)
{
if (_LocalModuleSkel && _LocalModule->isImmediateDispatchingSupported())
{
// immediate local synchronous dispatching
_LocalModuleSkel->commandResult(_ModuleProxy->getModuleGateway()->getPluggedModuleProxy(sender), commandId, serviceAlias, result);
}
else
{
// send the message for remote dispatching and execution or local queing
NLNET::CMessage __message;
buildMessageFor_commandResult(__message, commandId, serviceAlias, result);
_ModuleProxy->sendModuleMessage(sender, __message);
}
}
// Message serializer. Return the message received in reference for easier integration
const NLNET::CMessage &CAdminServiceProxy::buildMessageFor_upServiceUpdate(NLNET::CMessage &__message, const std::vector < TServiceStatus > &serviceStatus)
{
__message.setType("USU");
nlWrite(__message, serialCont, const_cast < std::vector < TServiceStatus >& > (serviceStatus));
return __message;
}
// Message serializer. Return the message received in reference for easier integration
const NLNET::CMessage &CAdminServiceProxy::buildMessageFor_graphUpdate(NLNET::CMessage &__message, const TGraphDatas &graphDatas)
{
__message.setType("GU");
nlWrite(__message, serial, const_cast < TGraphDatas& > (graphDatas));
return __message;
}
// Message serializer. Return the message received in reference for easier integration
const NLNET::CMessage &CAdminServiceProxy::buildMessageFor_highRezGraphUpdate(NLNET::CMessage &__message, const THighRezDatas &graphDatas)
{
__message.setType("HRGU");
nlWrite(__message, serial, const_cast < THighRezDatas& > (graphDatas));
return __message;
}
// Message serializer. Return the message received in reference for easier integration
const NLNET::CMessage &CAdminServiceProxy::buildMessageFor_commandResult(NLNET::CMessage &__message, uint32 commandId, const std::string &serviceAlias, const std::string &result)
{
__message.setType("CR");
nlWrite(__message, serial, commandId);
nlWrite(__message, serial, const_cast < std::string& > (serviceAlias));
nlWrite(__message, serial, const_cast < std::string& > (result));
return __message;
}
/////////////////////////////////////////////////////////////////
// WARNING : this is a generated file, don't change it !
/////////////////////////////////////////////////////////////////
const CAdminExecutorServiceSkel::TMessageHandlerMap &CAdminExecutorServiceSkel::getMessageHandlers() const
{
static TMessageHandlerMap handlers;
static bool init = false;
if (!init)
{
std::pair < TMessageHandlerMap::iterator, bool > res;
res = handlers.insert(std::make_pair(std::string("SCO"), &CAdminExecutorServiceSkel::setShardOrders_skel));
// if this assert, you have a doubly message name in your interface definition !
nlassert(res.second);
res = handlers.insert(std::make_pair(std::string("SDS"), &CAdminExecutorServiceSkel::shutdownShard_skel));
// if this assert, you have a doubly message name in your interface definition !
nlassert(res.second);
res = handlers.insert(std::make_pair(std::string("CC"), &CAdminExecutorServiceSkel::controlCmd_skel));
// if this assert, you have a doubly message name in your interface definition !
nlassert(res.second);
res = handlers.insert(std::make_pair(std::string("SCMD"), &CAdminExecutorServiceSkel::serviceCmd_skel));
// if this assert, you have a doubly message name in your interface definition !
nlassert(res.second);
res = handlers.insert(std::make_pair(std::string("CR"), &CAdminExecutorServiceSkel::commandResult_skel));
// if this assert, you have a doubly message name in your interface definition !
nlassert(res.second);
res = handlers.insert(std::make_pair(std::string("GU"), &CAdminExecutorServiceSkel::graphUpdate_skel));
// if this assert, you have a doubly message name in your interface definition !
nlassert(res.second);
res = handlers.insert(std::make_pair(std::string("HRGU"), &CAdminExecutorServiceSkel::highRezGraphUpdate_skel));
// if this assert, you have a doubly message name in your interface definition !
nlassert(res.second);
res = handlers.insert(std::make_pair(std::string("SSU"), &CAdminExecutorServiceSkel::serviceStatusUpdate_skel));
// if this assert, you have a doubly message name in your interface definition !
nlassert(res.second);
init = true;
}
return handlers;
}
bool CAdminExecutorServiceSkel::fwdOnProcessModuleMessage(NLNET::IModuleProxy *sender, const NLNET::CMessage &message)
{
const TMessageHandlerMap &mh = getMessageHandlers();
TMessageHandlerMap::const_iterator it(mh.find(message.getName()));
if (it == mh.end())
{
return false;
}
TMessageHandler cmd = it->second;
(this->*cmd)(sender, message);
return true;
}
void CAdminExecutorServiceSkel::setShardOrders_skel(NLNET::IModuleProxy *sender, const NLNET::CMessage &__message)
{
H_AUTO(CAdminExecutorServiceSkel_setShardOrders_SCO);
std::string shardName;
nlRead(__message, serial, shardName);
TShardOrders shardOrders;
nlRead(__message, serial, shardOrders);
setShardOrders(sender, shardName, shardOrders);
}
void CAdminExecutorServiceSkel::shutdownShard_skel(NLNET::IModuleProxy *sender, const NLNET::CMessage &__message)
{
H_AUTO(CAdminExecutorServiceSkel_shutdownShard_SDS);
std::string shardName;
nlRead(__message, serial, shardName);
uint32 delay;
nlRead(__message, serial, delay);
shutdownShard(sender, shardName, delay);
}
void CAdminExecutorServiceSkel::controlCmd_skel(NLNET::IModuleProxy *sender, const NLNET::CMessage &__message)
{
H_AUTO(CAdminExecutorServiceSkel_controlCmd_CC);
uint32 commandId;
nlRead(__message, serial, commandId);
std::string serviceAlias;
nlRead(__message, serial, serviceAlias);
std::string command;
nlRead(__message, serial, command);
controlCmd(sender, commandId, serviceAlias, command);
}
void CAdminExecutorServiceSkel::serviceCmd_skel(NLNET::IModuleProxy *sender, const NLNET::CMessage &__message)
{
H_AUTO(CAdminExecutorServiceSkel_serviceCmd_SCMD);
uint32 commandId;
nlRead(__message, serial, commandId);
std::string serviceAlias;
nlRead(__message, serial, serviceAlias);
std::string command;
nlRead(__message, serial, command);
serviceCmd(sender, commandId, serviceAlias, command);
}
void CAdminExecutorServiceSkel::commandResult_skel(NLNET::IModuleProxy *sender, const NLNET::CMessage &__message)
{
H_AUTO(CAdminExecutorServiceSkel_commandResult_CR);
uint32 commandId;
nlRead(__message, serial, commandId);
std::string serviceAlias;
nlRead(__message, serial, serviceAlias);
std::string result;
nlRead(__message, serial, result);
commandResult(sender, commandId, serviceAlias, result);
}
void CAdminExecutorServiceSkel::graphUpdate_skel(NLNET::IModuleProxy *sender, const NLNET::CMessage &__message)
{
H_AUTO(CAdminExecutorServiceSkel_graphUpdate_GU);
TGraphDatas graphDatas;
nlRead(__message, serial, graphDatas);
graphUpdate(sender, graphDatas);
}
void CAdminExecutorServiceSkel::highRezGraphUpdate_skel(NLNET::IModuleProxy *sender, const NLNET::CMessage &__message)
{
H_AUTO(CAdminExecutorServiceSkel_highRezGraphUpdate_HRGU);
THighRezDatas graphDatas;
nlRead(__message, serial, graphDatas);
highRezGraphUpdate(sender, graphDatas);
}
void CAdminExecutorServiceSkel::serviceStatusUpdate_skel(NLNET::IModuleProxy *sender, const NLNET::CMessage &__message)
{
H_AUTO(CAdminExecutorServiceSkel_serviceStatusUpdate_SSU);
std::string status;
nlRead(__message, serial, status);
serviceStatusUpdate(sender, status);
}
// AS send orders for a shard
void CAdminExecutorServiceProxy::setShardOrders(NLNET::IModule *sender, const std::string &shardName, const TShardOrders &shardOrders)
{
if (_LocalModuleSkel && _LocalModule->isImmediateDispatchingSupported())
{
// immediate local synchronous dispatching
_LocalModuleSkel->setShardOrders(_ModuleProxy->getModuleGateway()->getPluggedModuleProxy(sender), shardName, shardOrders);
}
else
{
// send the message for remote dispatching and execution or local queing
NLNET::CMessage __message;
buildMessageFor_setShardOrders(__message, shardName, shardOrders);
_ModuleProxy->sendModuleMessage(sender, __message);
}
}
// AS send a command to shutdown a shard with a delay
void CAdminExecutorServiceProxy::shutdownShard(NLNET::IModule *sender, const std::string &shardName, uint32 delay)
{
if (_LocalModuleSkel && _LocalModule->isImmediateDispatchingSupported())
{
// immediate local synchronous dispatching
_LocalModuleSkel->shutdownShard(_ModuleProxy->getModuleGateway()->getPluggedModuleProxy(sender), shardName, delay);
}
else
{
// send the message for remote dispatching and execution or local queing
NLNET::CMessage __message;
buildMessageFor_shutdownShard(__message, shardName, delay);
_ModuleProxy->sendModuleMessage(sender, __message);
}
}
// AS send a control command to this AES
void CAdminExecutorServiceProxy::controlCmd(NLNET::IModule *sender, uint32 commandId, const std::string &serviceAlias, const std::string &command)
{
if (_LocalModuleSkel && _LocalModule->isImmediateDispatchingSupported())
{
// immediate local synchronous dispatching
_LocalModuleSkel->controlCmd(_ModuleProxy->getModuleGateway()->getPluggedModuleProxy(sender), commandId, serviceAlias, command);
}
else
{
// send the message for remote dispatching and execution or local queing
NLNET::CMessage __message;
buildMessageFor_controlCmd(__message, commandId, serviceAlias, command);
_ModuleProxy->sendModuleMessage(sender, __message);
}
}
// Send a command to a service.
void CAdminExecutorServiceProxy::serviceCmd(NLNET::IModule *sender, uint32 commandId, const std::string &serviceAlias, const std::string &command)
{
if (_LocalModuleSkel && _LocalModule->isImmediateDispatchingSupported())
{
// immediate local synchronous dispatching
_LocalModuleSkel->serviceCmd(_ModuleProxy->getModuleGateway()->getPluggedModuleProxy(sender), commandId, serviceAlias, command);
}
else
{
// send the message for remote dispatching and execution or local queing
NLNET::CMessage __message;
buildMessageFor_serviceCmd(__message, commandId, serviceAlias, command);
_ModuleProxy->sendModuleMessage(sender, __message);
}
}
// AES client send back the result of execution of a command
void CAdminExecutorServiceProxy::commandResult(NLNET::IModule *sender, uint32 commandId, const std::string &serviceAlias, const std::string &result)
{
if (_LocalModuleSkel && _LocalModule->isImmediateDispatchingSupported())
{
// immediate local synchronous dispatching
_LocalModuleSkel->commandResult(_ModuleProxy->getModuleGateway()->getPluggedModuleProxy(sender), commandId, serviceAlias, result);
}
else
{
// send the message for remote dispatching and execution or local queing
NLNET::CMessage __message;
buildMessageFor_commandResult(__message, commandId, serviceAlias, result);
_ModuleProxy->sendModuleMessage(sender, __message);
}
}
// A service send graph data update
void CAdminExecutorServiceProxy::graphUpdate(NLNET::IModule *sender, const TGraphDatas &graphDatas)
{
if (_LocalModuleSkel && _LocalModule->isImmediateDispatchingSupported())
{
// immediate local synchronous dispatching
_LocalModuleSkel->graphUpdate(_ModuleProxy->getModuleGateway()->getPluggedModuleProxy(sender), graphDatas);
}
else
{
// send the message for remote dispatching and execution or local queing
NLNET::CMessage __message;
buildMessageFor_graphUpdate(__message, graphDatas);
_ModuleProxy->sendModuleMessage(sender, __message);
}
}
// A service high rez graph data update
void CAdminExecutorServiceProxy::highRezGraphUpdate(NLNET::IModule *sender, const THighRezDatas &graphDatas)
{
if (_LocalModuleSkel && _LocalModule->isImmediateDispatchingSupported())
{
// immediate local synchronous dispatching
_LocalModuleSkel->highRezGraphUpdate(_ModuleProxy->getModuleGateway()->getPluggedModuleProxy(sender), graphDatas);
}
else
{
// send the message for remote dispatching and execution or local queing
NLNET::CMessage __message;
buildMessageFor_highRezGraphUpdate(__message, graphDatas);
_ModuleProxy->sendModuleMessage(sender, __message);
}
}
// A service send an update of of it's status string
void CAdminExecutorServiceProxy::serviceStatusUpdate(NLNET::IModule *sender, const std::string &status)
{
if (_LocalModuleSkel && _LocalModule->isImmediateDispatchingSupported())
{
// immediate local synchronous dispatching
_LocalModuleSkel->serviceStatusUpdate(_ModuleProxy->getModuleGateway()->getPluggedModuleProxy(sender), status);
}
else
{
// send the message for remote dispatching and execution or local queing
NLNET::CMessage __message;
buildMessageFor_serviceStatusUpdate(__message, status);
_ModuleProxy->sendModuleMessage(sender, __message);
}
}
// Message serializer. Return the message received in reference for easier integration
const NLNET::CMessage &CAdminExecutorServiceProxy::buildMessageFor_setShardOrders(NLNET::CMessage &__message, const std::string &shardName, const TShardOrders &shardOrders)
{
__message.setType("SCO");
nlWrite(__message, serial, const_cast < std::string& > (shardName));
nlWrite(__message, serial, shardOrders);
return __message;
}
// Message serializer. Return the message received in reference for easier integration
const NLNET::CMessage &CAdminExecutorServiceProxy::buildMessageFor_shutdownShard(NLNET::CMessage &__message, const std::string &shardName, uint32 delay)
{
__message.setType("SDS");
nlWrite(__message, serial, const_cast < std::string& > (shardName));
nlWrite(__message, serial, delay);
return __message;
}
// Message serializer. Return the message received in reference for easier integration
const NLNET::CMessage &CAdminExecutorServiceProxy::buildMessageFor_controlCmd(NLNET::CMessage &__message, uint32 commandId, const std::string &serviceAlias, const std::string &command)
{
__message.setType("CC");
nlWrite(__message, serial, commandId);
nlWrite(__message, serial, const_cast < std::string& > (serviceAlias));
nlWrite(__message, serial, const_cast < std::string& > (command));
return __message;
}
// Message serializer. Return the message received in reference for easier integration
const NLNET::CMessage &CAdminExecutorServiceProxy::buildMessageFor_serviceCmd(NLNET::CMessage &__message, uint32 commandId, const std::string &serviceAlias, const std::string &command)
{
__message.setType("SCMD");
nlWrite(__message, serial, commandId);
nlWrite(__message, serial, const_cast < std::string& > (serviceAlias));
nlWrite(__message, serial, const_cast < std::string& > (command));
return __message;
}
// Message serializer. Return the message received in reference for easier integration
const NLNET::CMessage &CAdminExecutorServiceProxy::buildMessageFor_commandResult(NLNET::CMessage &__message, uint32 commandId, const std::string &serviceAlias, const std::string &result)
{
__message.setType("CR");
nlWrite(__message, serial, commandId);
nlWrite(__message, serial, const_cast < std::string& > (serviceAlias));
nlWrite(__message, serial, const_cast < std::string& > (result));
return __message;
}
// Message serializer. Return the message received in reference for easier integration
const NLNET::CMessage &CAdminExecutorServiceProxy::buildMessageFor_graphUpdate(NLNET::CMessage &__message, const TGraphDatas &graphDatas)
{
__message.setType("GU");
nlWrite(__message, serial, const_cast < TGraphDatas& > (graphDatas));
return __message;
}
// Message serializer. Return the message received in reference for easier integration
const NLNET::CMessage &CAdminExecutorServiceProxy::buildMessageFor_highRezGraphUpdate(NLNET::CMessage &__message, const THighRezDatas &graphDatas)
{
__message.setType("HRGU");
nlWrite(__message, serial, const_cast < THighRezDatas& > (graphDatas));
return __message;
}
// Message serializer. Return the message received in reference for easier integration
const NLNET::CMessage &CAdminExecutorServiceProxy::buildMessageFor_serviceStatusUpdate(NLNET::CMessage &__message, const std::string &status)
{
__message.setType("SSU");
nlWrite(__message, serial, const_cast < std::string& > (status));
return __message;
}
/////////////////////////////////////////////////////////////////
// WARNING : this is a generated file, don't change it !
/////////////////////////////////////////////////////////////////
const CAdminExecutorServiceClientSkel::TMessageHandlerMap &CAdminExecutorServiceClientSkel::getMessageHandlers() const
{
static TMessageHandlerMap handlers;
static bool init = false;
if (!init)
{
std::pair < TMessageHandlerMap::iterator, bool > res;
res = handlers.insert(std::make_pair(std::string("SCMD"), &CAdminExecutorServiceClientSkel::serviceCmd_skel));
// if this assert, you have a doubly message name in your interface definition !
nlassert(res.second);
res = handlers.insert(std::make_pair(std::string("SCMDNR"), &CAdminExecutorServiceClientSkel::serviceCmdNoReturn_skel));
// if this assert, you have a doubly message name in your interface definition !
nlassert(res.second);
init = true;
}
return handlers;
}
bool CAdminExecutorServiceClientSkel::fwdOnProcessModuleMessage(NLNET::IModuleProxy *sender, const NLNET::CMessage &message)
{
const TMessageHandlerMap &mh = getMessageHandlers();
TMessageHandlerMap::const_iterator it(mh.find(message.getName()));
if (it == mh.end())
{
return false;
}
TMessageHandler cmd = it->second;
(this->*cmd)(sender, message);
return true;
}
void CAdminExecutorServiceClientSkel::serviceCmd_skel(NLNET::IModuleProxy *sender, const NLNET::CMessage &__message)
{
H_AUTO(CAdminExecutorServiceClientSkel_serviceCmd_SCMD);
uint32 commandId;
nlRead(__message, serial, commandId);
std::string command;
nlRead(__message, serial, command);
serviceCmd(sender, commandId, command);
}
void CAdminExecutorServiceClientSkel::serviceCmdNoReturn_skel(NLNET::IModuleProxy *sender, const NLNET::CMessage &__message)
{
H_AUTO(CAdminExecutorServiceClientSkel_serviceCmdNoReturn_SCMDNR);
std::string command;
nlRead(__message, serial, command);
serviceCmdNoReturn(sender, command);
}
// execute a command and return the result.
void CAdminExecutorServiceClientProxy::serviceCmd(NLNET::IModule *sender, uint32 commandId, const std::string &command)
{
if (_LocalModuleSkel && _LocalModule->isImmediateDispatchingSupported())
{
// immediate local synchronous dispatching
_LocalModuleSkel->serviceCmd(_ModuleProxy->getModuleGateway()->getPluggedModuleProxy(sender), commandId, command);
}
else
{
// send the message for remote dispatching and execution or local queing
NLNET::CMessage __message;
buildMessageFor_serviceCmd(__message, commandId, command);
_ModuleProxy->sendModuleMessage(sender, __message);
}
}
// Send a command to a service without waiting for the return value.
void CAdminExecutorServiceClientProxy::serviceCmdNoReturn(NLNET::IModule *sender, const std::string &command)
{
if (_LocalModuleSkel && _LocalModule->isImmediateDispatchingSupported())
{
// immediate local synchronous dispatching
_LocalModuleSkel->serviceCmdNoReturn(_ModuleProxy->getModuleGateway()->getPluggedModuleProxy(sender), command);
}
else
{
// send the message for remote dispatching and execution or local queing
NLNET::CMessage __message;
buildMessageFor_serviceCmdNoReturn(__message, command);
_ModuleProxy->sendModuleMessage(sender, __message);
}
}
// Message serializer. Return the message received in reference for easier integration
const NLNET::CMessage &CAdminExecutorServiceClientProxy::buildMessageFor_serviceCmd(NLNET::CMessage &__message, uint32 commandId, const std::string &command)
{
__message.setType("SCMD");
nlWrite(__message, serial, commandId);
nlWrite(__message, serial, const_cast < std::string& > (command));
return __message;
}
// Message serializer. Return the message received in reference for easier integration
const NLNET::CMessage &CAdminExecutorServiceClientProxy::buildMessageFor_serviceCmdNoReturn(NLNET::CMessage &__message, const std::string &command)
{
__message.setType("SCMDNR");
nlWrite(__message, serial, const_cast < std::string& > (command));
return __message;
}
}

File diff suppressed because it is too large Load Diff

@ -1,417 +0,0 @@
<generator header_tag="ADMIN_MODULES_ITF">
<include file="nel/misc/time_nl.h"/>
<namespace name="ADMIN">
<!-- PHP interface of the admin service module-->
<!-- ############################################################## -->
<callback_interface name="CAdminServiceWeb" caller="php">
<doc line="This is the interface used by PHP to call methods"/>
<doc line="on the Admin service module"/>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- globalCmd -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<invoke name="globalCmd" msg="GCMD">
<doc line="Send a command to the AS."/>
<doc line="This is used to issue global commands like 'as.allStart' or 'as.allStop'."/>
<doc line="The result is returned by the return message"/>
<doc line="serviceCmdResult."/>
<param type="std::string" name="command" php_serial="String" byref="true"/>
</invoke>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- controlCmd -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<invoke name="controlCmd" msg="CCMD">
<doc line="Send a service related command to the executor "/>
<doc line="(not to the controled service)"/>
<doc line="The result is returned by the return message"/>
<doc line="controlCmdResult."/>
<param type="std::string" name="serviceAlias" php_serial="String" byref="true"/>
<param type="std::string" name="command" php_serial="String" byref="true"/>
</invoke>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- serviceCmd -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<invoke name="serviceCmd" msg="SCMD">
<doc line="Send a command to a service."/>
<doc line="The result is returned by the return message"/>
<doc line="serviceCmdResult."/>
<param type="std::string" name="serviceAlias" php_serial="String" byref="true"/>
<param type="std::string" name="command" php_serial="String" byref="true"/>
</invoke>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- commandResult -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<return name="commandResult" msg="CMDR">
<param type="std::string" name="serviceAlias" php_serial="String" byref="true"/>
<param type="std::string" name="result" php_serial="String" byref="true"/>
</return>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- getShardOrders -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<invoke name="getShardOrders" msg="GSO">
<doc line="Get the orders of each known shard."/>
<doc line="The return value is a vector of string, one entry by shard"/>
<return type="std::string" php_serial="String" array="true"/>
</invoke>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- getStates -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<invoke name="getStates" msg="GS">
<doc line="Get the last known state of all services."/>
<doc line="The return value is a vector of string, one entry by service"/>
<return type="std::string" php_serial="String" array="true"/>
</invoke>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- getHighRezGraphInfo -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<invoke name="getHighRezGraphInfo" msg="GHRGI">
<doc line="Get information about a high rez graph."/>
<doc line="The return is a string array containing"/>
<doc line="the name of the var, the available sample"/>
<doc line="period as two unix date (start dans end)"/>
<doc line="and the number of samples available"/>
<doc line="If the var is not found, an empty array is returned"/>
<return type="std::string" php_serial="String" array="true"/>
<param type="std::string" name="varAddr" php_serial="String" byref="true"/>
</invoke>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- getHighRezGraph -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<invoke name="getHighRezGraph" msg="GHRG">
<doc line="Get the data for a high resolution graph."/>
<doc line="The return is a string array, each"/>
<doc line="string containing 'time:milliOffset:value"/>
<doc line="Set endDate to 0 to specify a start date relative"/>
<doc line="to the last sample date. In this case, start date"/>
<doc line="is interpreted as the number of second before"/>
<doc line="the last sample."/>
<return type="std::string" php_serial="String" array="true"/>
<param type="std::string" name="varAddr" php_serial="String" byref="true"/>
<param type="uint32" name="startDate" />
<param type="uint32" name="endDate" />
<param type="uint32" name="milliStep" />
</invoke>
</callback_interface>
<!-- ############################################################## -->
<!-- Item data for graph -->
<!-- ############################################################## -->
<class name="TGraphData">
<serial/>
<property type="std::string" name="ServiceAlias" byref="true"/>
<property type="std::string" name="VarName" byref="true"/>
<property type="uint32" name="SamplePeriod"/>
<property type="double" name="Value"/>
</class>
<!-- ############################################################## -->
<!-- Group of data for graph -->
<!-- ############################################################## -->
<class name="TGraphDatas">
<serial/>
<property type="uint32" name="CurrentTime"/>
<property type="std::vector &lt; TGraphData &gt;" name="Datas" byref="true" serial="Cont"/>
</class>
<!-- ############################################################## -->
<!-- Item data for high rez graph -->
<!-- ############################################################## -->
<class name="THighRezData">
<serial/>
<property type="NLMISC::TTime" name="SampleTick"/>
<property type="double" name="Value"/>
</class>
<!-- ############################################################## -->
<!-- Group of data for high rez graph -->
<!-- ############################################################## -->
<class name="THighRezDatas">
<serial/>
<property type="std::string" name="ServiceAlias" byref="true"/>
<property type="std::string" name="VarName" byref="true"/>
<property type="uint32" name="CurrentTime"/>
<property type="std::vector &lt; THighRezData &gt;" name="Datas" byref="true" serial="Cont"/>
</class>
<!-- ############################################################## -->
<!-- Shard orders enum -->
<!-- ############################################################## -->
<enum name="TShardOrders">
<item name="so_autostart_on"/>
<item name="so_autostart_off"/>
</enum>
<!-- ############################################################## -->
<!-- Service orders enum -->
<!-- ############################################################## -->
<enum name="TRunningOrders">
<item name="ro_deactivated"/>
<item name="ro_activated"/>
</enum>
<!-- ############################################################## -->
<!-- Service running state enum-->
<!-- ############################################################## -->
<enum name="TRunningState">
<item name="rs_stopped"/>
<item name="rs_running"/>
<item name="rs_online"/>
<!-- <item name="rs_stopped"/>
<item name="rs_starting"/>
-->
<!-- <item name="rs_connected"/>-->
<!-- <item name="rs_online"/>
<item name="rs_stopping"/>
--> </enum>
<!-- ############################################################## -->
<!-- Service running tag -->
<!-- ############################################################## -->
<enum name="TRunningTag">
<item name="rt_chain_crashing"/>
<item name="rt_locally_started"/>
<item name="rt_locally_stopped"/>
<item name="rt_globally_stopped"/>
<item name="rt_stopped_for_patch"/>
<item name="rt_externaly_started"/>
<item name="rt_slow_to_stop"/>
<item name="rt_slow_to_start"/>
</enum>
<!-- ############################################################## -->
<!-- Service status -->
<!-- ############################################################## -->
<class name="TServiceStatus">
<serial/>
<property type="std::string" name="ShardName" byref="true"/>
<property type="std::string" name="ServiceLongName" byref="true"/>
<property type="std::string" name="ServiceShortName" byref="true"/>
<property type="std::string" name="ServiceAliasName" byref="true"/>
<property type="TRunningState" name="RunningState" enum="smart"/>
<property type="TRunningOrders" name="RunningOrders" enum="smart"/>
<property type="std::set &lt; TRunningTag &gt;" name="RunningTags" serial="Cont" enum="smart" byref="true"/>
<property type="std::string" name="Status" byref="true"/>
</class>
<!-- ############################################################## -->
<!-- Module interface of the admin service module-->
<!-- ############################################################## -->
<module_interface name="CAdminService">
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- up service update -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<method name="upServiceUpdate" msg="USU">
<doc line="An AES send an update of the list of service up"/>
<param type="std::vector &lt; TServiceStatus &gt;" name="serviceStatus" byref="true" serial="Cont"/>
</method>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- graphUpdate -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<method name="graphUpdate" msg="GU">
<doc line="An AES send graph data update"/>
<param type="TGraphDatas" name="graphDatas" byref="true"/>
</method>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- HR graphUpdate -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<method name="highRezGraphUpdate" msg="HRGU">
<doc line="An AES send high rez graph data update"/>
<param type="THighRezDatas" name="graphDatas" byref="true"/>
</method>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- updateAESStates -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- <method name="updateAESStates" msg="UAS">
<doc line="An AES send it's updated state strings"/>
<param type="std::vector &lt; std::string &gt;" name="states" byref="true" serial="Cont"/>
</method>
-->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- aes return command result -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<method name="commandResult" msg="CR">
<doc line="AES send back the result of execution of a command"/>
<param type="uint32" name="commandId" />
<param type="std::string" name="serviceAlias" byref="true"/>
<param type="std::string" name="result" byref="true"/>
</method>
</module_interface>
<!-- ############################################################## -->
<!-- Module interface of the admin executor service module-->
<!-- ############################################################## -->
<module_interface name="CAdminExecutorService">
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- global state from AS -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- <method name="setGlobalOrders" msg="SGO" broadcast="true">
<doc line="AS send it's global running orders"/>
<param type="TRunningOrders" name="globalOrders" enum="smart"/>
</method>
-->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- shard state from AS -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<method name="setShardOrders" msg="SCO" broadcast="true">
<doc line="AS send orders for a shard"/>
<param type="std::string" name="shardName" byref="true"/>
<param type="TShardOrders" name="shardOrders" enum="smart"/>
</method>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- shutdown shard from AS -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<method name="shutdownShard" msg="SDS" broadcast="true">
<doc line="AS send a command to shutdown a shard with a delay"/>
<param type="std::string" name="shardName" byref="true"/>
<param type="uint32" name="delay"/>
</method>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- controlCmd -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<method name="controlCmd" msg="CC" broadcast="true">
<doc line="AS send a control command to this AES"/>
<param type="uint32" name="commandId" />
<param type="std::string" name="serviceAlias" byref="true"/>
<param type="std::string" name="command" byref="true"/>
</method>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- service command -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<method name="serviceCmd" msg="SCMD">
<doc line="Send a command to a service."/>
<param type="uint32" name="commandId" />
<param type="std::string" name="serviceAlias" php_serial="String" byref="true"/>
<param type="std::string" name="command" php_serial="String" byref="true"/>
</method>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- aes client return command result -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<method name="commandResult" msg="CR">
<doc line="AES client send back the result of execution of a command"/>
<param type="uint32" name="commandId" />
<param type="std::string" name="serviceAlias" byref="true"/>
<param type="std::string" name="result" byref="true"/>
</method>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- graphUpdate -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<method name="graphUpdate" msg="GU">
<doc line="A service send graph data update"/>
<param type="TGraphDatas" name="graphDatas" byref="true"/>
</method>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- HR graphUpdate -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<method name="highRezGraphUpdate" msg="HRGU">
<doc line="A service high rez graph data update"/>
<param type="THighRezDatas" name="graphDatas" byref="true"/>
</method>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- serviceConnected-->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- <method name="serviceConnected" msg="SR">
<doc line="A service inform the AES that it is connected"/>
<param type="std::string" name="longName" byref="true"/>
<param type="std::string" name="shortName" byref="true"/>
<param type="std::string" name="aliasName" byref="true"/>
<param type="uint32" name="pid"/>
</method>
-->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- service status update -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<method name="serviceStatusUpdate" msg="SSU">
<doc line="A service send an update of of it's status string"/>
<param type="std::string" name="status" byref="true"/>
</method>
</module_interface>
<!-- ############################################################## -->
<!-- Module interface of the admin executor service client module-->
<!-- ############################################################## -->
<module_interface name="CAdminExecutorServiceClient">
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- service command -->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<method name="serviceCmd" msg="SCMD">
<doc line="execute a command and return the result."/>
<param type="uint32" name="commandId" />
<param type="std::string" name="command" byref="true"/>
</method>
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- service command (one way)-->
<!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<method name="serviceCmdNoReturn" msg="SCMDNR">
<doc line="Send a command to a service without waiting for the return value."/>
<param type="std::string" name="command" byref="true"/>
</method>
</module_interface>
</namespace>
</generator>

@ -1,478 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdpch.h"
#include "nel/misc/singleton.h"
#include "nel/net/module.h"
#include "nel/net/module_builder_parts.h"
#include "nel/net/unified_network.h"
#include "nel/net/service.h"
#include "admin_modules_itf.h"
using namespace std;
using namespace NLMISC;
using namespace NLNET;
void aesclient_forceLink() {}
namespace ADMIN
{
class CAdminExecutorServiceClient
: /*public CManualSingleton<CAdminExecutorService>,*/
public CEmptyModuleServiceBehav<CEmptyModuleCommBehav<CEmptySocketBehav<CModuleBase> > >,
public CAdminExecutorServiceClientSkel
{
enum
{
// Maximum time without sending report string (a kind of 'keep alive')
MAX_DELAY_BETWEEN_REPORT = 30, // 30 seconds
};
/// Flag to inform AES that we don't want to be affected by shard orders
bool _DontUseShardOrders;
/// Admin executor service module
TModuleProxyPtr _AdminExecutorService;
/// Date of last state reporting to AES
uint32 _LastStateReport;
/// Last date of status string update
uint32 _LastStatusStringReport;
/// Last status string sent (to avoid double send)
string _LastSentStatus;
/// The service alias (must be an unique name)
string _ServiceAlias;
/// A cache of the value because reading it is very slow
uint32 _ProcessUsedMemory;
struct TGraphSample
{
// The date of the sample (in second)
uint32 TimeStamp;
// The date of the sample (in ms)
TTime HighRezTimeStamp;
// sample value
double SampleValue;
};
struct TGraphVarInfo
{
/// Name of the graphed var
string VarName;
/** Mean time between two sample in ms
* (in fact, if will be the min period)
* Set it to 1 to have a sample at each tick
* If the period is set less than 1000 ms,
* then the var is considered 'high rez'.
* Otherwise, the period is rounded at the
* nearest integer second.
* For 'high rez' var, the service buffer
* the relative timestamp in ms at each
* tick loop and send update every seconds
* to the AES service.
* In addition, HighRez var are also sent
* every second as normal sample.
*/
uint32 MeanSamplePeriod;
/// Date of last sample (low rez)
uint32 LastSampleTimeStamp;
/// Date of last sample (high rez)
TTime LastHighRezTimeStamp;
/// The vector of buffered samples
vector<TGraphSample> Samples;
TGraphVarInfo()
: MeanSamplePeriod(1000),
LastSampleTimeStamp(0),
LastHighRezTimeStamp(0)
{
}
};
/// The list of variable to graph (build from service config file var 'GraphVars')
vector<TGraphVarInfo> _GraphVars;
/// Date of last graph
public:
CAdminExecutorServiceClient()
: _DontUseShardOrders(false),
_LastStateReport(0),
_LastStatusStringReport(0),
_ProcessUsedMemory(0)
{
CAdminExecutorServiceClientSkel::init(this);
}
std::string makeServiceAlias()
{
string serviceAlias = IService::getInstance()->getServiceAliasName();
if (serviceAlias.empty())
{
serviceAlias = IService::getInstance()->getHostName()+"."+IService::getInstance()->getServiceUnifiedName();
}
return serviceAlias;
}
string getModuleManifest() const
{
uint32 pid = getpid ();
string serviceAlias = _ServiceAlias;
CSString manifest;
manifest << "LongName=" << IService::getInstance()->getServiceLongName()
<< " ShortName=" << IService::getInstance()->getServiceShortName()
<< " AliasName=" << serviceAlias
<< " PID=" << pid
<< " DontUseShardOrders=" << _DontUseShardOrders;
return manifest;
}
bool initModule(const TParsedCommandLine &pcl)
{
if (!CModuleBase::initModule(pcl))
return false;
// try to read the config file
IService *service = IService::getInstance();
if (service == NULL)
{
nlwarning("Failed to get the IService singleton instance");
return false;
}
CConfigFile::CVar *gv = service->ConfigFile.getVarPtr("GraphVars");
if (gv)
{
_GraphVars.clear();
for (uint i =0; i<gv->size()/2; ++i)
{
TGraphVarInfo gvi;
gvi.VarName = gv->asString(i*2);
gvi.MeanSamplePeriod = max(1, gv->asInt((i*2)+1));
_GraphVars.push_back(gvi);
}
}
// precompute the service name
_ServiceAlias = makeServiceAlias();
// loop for an optional 'dontUseShardOrders' flag in init params
const TParsedCommandLine *duso = pcl.getParam("dontUseShardOrders");
if (duso != NULL)
_DontUseShardOrders = (duso->ParamValue == "true" || duso->ParamName == "1");
return true;
}
void onModuleUp(IModuleProxy *proxy)
{
if (proxy->getModuleClassName() == "AdminExecutorService")
{
nldebug("CAdminExecutorServiceClient : admin executor service up as '%s'", proxy->getModuleName().c_str());
// we found the manager of AES
if (_AdminExecutorService != NULL)
{
nlwarning("CAdminExecutorServiceClient : admin executor service already known as '%s', replacing with new one", _AdminExecutorService->getModuleName().c_str());
}
_AdminExecutorService = proxy;
// // send basic service info to AES
// CAdminExecutorServiceProxy aes(proxy);
//
// uint32 pid = getpid ();
//
// string serviceAlias = IService::getInstance()->getServiceAliasName();
// if (serviceAlias.empty())
// serviceAlias = getModuleFullyQualifiedName();
//
// aes.serviceConnected(this,
// IService::getInstance()->getServiceLongName(),
// IService::getInstance()->getServiceShortName(),
// serviceAlias,
// pid);
// for resend of the current status to the new AES
_LastSentStatus = "";
sendServiceStatus();
}
}
void onModuleDown(IModuleProxy *proxy)
{
if (proxy == _AdminExecutorService)
{
nldebug("CAdminExecutorServiceClient : admin executor service '%s' is down", proxy->getModuleName().c_str());
_AdminExecutorService = NULL;
}
}
void onModuleUpdate()
{
H_AUTO(CAdminExecutorServiceClient_onModuleUpdate);
uint32 now = CTime::getSecondsSince1970();
TTime timer = CTime::getLocalTime();
// update every HR variables
for (uint i=0; i<_GraphVars.size(); ++i)
{
if (_GraphVars[i].MeanSamplePeriod < 1000)
{
// this is a HR var
TGraphVarInfo &gvi = _GraphVars[i];
if (gvi.LastHighRezTimeStamp + gvi.MeanSamplePeriod < timer)
{
// it's time to get a sample
// create a sample
gvi.Samples.push_back(TGraphSample());
TGraphSample &gs = gvi.Samples.back();
// inialise it
gs.TimeStamp = now;
gs.HighRezTimeStamp = timer;
IVariable *var = dynamic_cast<IVariable*>(ICommand::getCommand(gvi.VarName));
if (var != NULL)
NLMISC::fromString(var->toString(), gs.SampleValue);
}
}
}
if (_LastStateReport != now)
{
if ((now & 0xf) == 0)
{
// every 16 seconds because very slow
IVariable *var = dynamic_cast<IVariable*>(ICommand::getCommand("ProcessUsedMemory"));
if (var != NULL)
NLMISC::fromString(var->toString(), _ProcessUsedMemory);
}
// at least one second as passed, check for updates to send to
// AES
TGraphDatas graphDatas;
graphDatas.setCurrentTime(now);
THighRezDatas highRezDatas;
highRezDatas.setServiceAlias(_ServiceAlias);
highRezDatas.setCurrentTime(now);
vector<TGraphData> &datas = graphDatas.getDatas();
for (uint i=0; i<_GraphVars.size(); ++i)
{
if (_GraphVars[i].LastSampleTimeStamp+(_GraphVars[i].MeanSamplePeriod/1000) < now)
{
TGraphVarInfo &gvi = _GraphVars[i];
// it's time to send update for this var
// create a new sample entry
datas.push_back(TGraphData());
// and fill it
TGraphData &gd = datas.back();
gd.setServiceAlias(_ServiceAlias);
gd.setVarName(gvi.VarName);
gd.setSamplePeriod(max(uint32(1), uint32(gvi.MeanSamplePeriod/1000)));
if (gvi.Samples.empty())
{
// no sample collected yet, just ask a new one
IVariable *var = dynamic_cast<IVariable*>(ICommand::getCommand(gvi.VarName));
if (var != NULL)
{
float val;
NLMISC::fromString(var->toString(), val);
gd.setValue(val);
}
}
else
{
// we have some sample collected, just use the last one
gd.setValue(gvi.Samples.back().SampleValue);
}
// if it's a high rez sampler, send the complete buffer
if (gvi.MeanSamplePeriod < 1000 && _AdminExecutorService != NULL)
{
// build the message
highRezDatas.setVarName(gvi.VarName);
highRezDatas.getDatas().clear();
for (uint j=0; j<gvi.Samples.size(); ++j)
{
highRezDatas.getDatas().push_back(THighRezData());
THighRezData &hrd = highRezDatas.getDatas().back();
hrd.setSampleTick(gvi.Samples[j].HighRezTimeStamp);
hrd.setValue(gvi.Samples[j].SampleValue);
}
if (!highRezDatas.getDatas().empty() && _AdminExecutorService != NULL)
{
// send the high rez data
CAdminExecutorServiceProxy aes(_AdminExecutorService);
aes.highRezGraphUpdate(this, highRezDatas);
}
// we don't send normal update for high rez sampler
datas.pop_back();
}
// update the time stamp
gvi.LastSampleTimeStamp = now;
// clear the buffer
gvi.Samples.clear();
}
}
// if we have some data to send, send them
if (!datas.empty() && _AdminExecutorService != NULL)
{
CAdminExecutorServiceProxy aes(_AdminExecutorService);
aes.graphUpdate(this, graphDatas);
}
// update the last report date
_LastStateReport = now;
}
// send an update of the status (if needed)
sendServiceStatus();
}
void sendServiceStatus()
{
CSString status;
uint32 now = NLMISC::CTime::getSecondsSince1970();
status << "\tServiceAlias=" << _ServiceAlias;
// build the status string
IVariable *var = dynamic_cast<IVariable*>(ICommand::getCommand("State"));
if (var != NULL)
status << "\tState=" <<var->toString();
var = dynamic_cast<IVariable*>(ICommand::getCommand("UserSpeedLoop"));
if (var != NULL)
status << "\tUserSpeedLoop=" <<var->toString();
var = dynamic_cast<IVariable*>(ICommand::getCommand("TickSpeedLoop"));
if (var != NULL)
status << "\tTickSpeedLoop=" <<var->toString();
if (_ProcessUsedMemory != 0)
status << "\tProcessUsedMemory=" <<_ProcessUsedMemory;
var = dynamic_cast<IVariable*>(ICommand::getCommand("Uptime"));
if (var != NULL)
status << "\tUpTime=" <<var->toString();
var = dynamic_cast<IVariable*>(ICommand::getCommand("NbPlayers"));
if (var != NULL)
status << "\tNbPlayers=" <<var->toString();
var = dynamic_cast<IVariable*>(ICommand::getCommand("NbEntities"));
if (var != NULL)
status << "\tNbEntities=" <<var->toString();
var = dynamic_cast<IVariable*>(ICommand::getCommand("LocalEntities"));
if (var != NULL)
status << "\tLocalEntities=" <<var->toString();
uint32 shardId = IService::getInstance()->getShardId();
status << "\tShardId=" <<toString(shardId);
// add any service specific info
if (IService::isServiceInitialized())
{
status << "\t" << IService::getInstance()->getServiceStatusString();
}
if ((status != _LastSentStatus || (now - _LastStatusStringReport) > MAX_DELAY_BETWEEN_REPORT)
&& _AdminExecutorService != NULL)
{
CAdminExecutorServiceProxy aes(_AdminExecutorService);
aes.serviceStatusUpdate(this, status);
_LastSentStatus = status;
_LastStatusStringReport = now;
}
}
///////////////////////////////////////////////////////////////
// implementation from Admin executor service client
///////////////////////////////////////////////////////////////
// execute a command and return the result.
virtual void serviceCmd(NLNET::IModuleProxy *sender, uint32 commandId, const std::string &command)
{
// create a displayer to gather the output of the command
class CStringDisplayer: public IDisplayer
{
public:
virtual void doDisplay( const CLog::TDisplayInfo& args, const char *message)
{
_Data += message;
}
std::string _Data;
};
CStringDisplayer stringDisplayer;
IService::getInstance()->CommandLog.addDisplayer(&stringDisplayer);
// retrieve the command from the input message and execute it
nlinfo ("ADMIN: Executing command from network : '%s'", command.c_str());
ICommand::execute (command, IService::getInstance()->CommandLog);
// unhook our displayer as it's work is now done
IService::getInstance()->CommandLog.removeDisplayer(&stringDisplayer);
string serviceAlias = IService::getInstance()->getServiceAliasName();
if (serviceAlias.empty())
serviceAlias = getModuleFullyQualifiedName();
// return the result to AES
CAdminExecutorServiceProxy aes(sender);
aes.commandResult(this, commandId, serviceAlias, stringDisplayer._Data);
}
// execute a command without result
virtual void serviceCmdNoReturn(NLNET::IModuleProxy *sender, const std::string &command)
{
// retrieve the command from the input message and execute it
nlinfo ("ADMIN: Executing command from network : '%s'", command.c_str());
ICommand::execute (command, IService::getInstance()->CommandLog);
}
};
NLNET_REGISTER_MODULE_FACTORY(CAdminExecutorServiceClient, "AdminExecutorServiceClient");
} // namespace ADMIN

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,17 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdpch.h"

@ -1,45 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef ADMIN_MODULES_STDPCH_H
#define ADMIN_MODULES_STDPCH_H
#include <time.h>
#include <memory>
#include "nel/misc/types_nl.h"
#include "nel/misc/file.h"
#include "nel/misc/hierarchical_timer.h"
#include "nel/misc/mutable_container.h"
#include "nel/misc/path.h"
#include "nel/misc/singleton.h"
#include "nel/misc/sstring.h"
#include "nel/misc/string_conversion.h"
#include "nel/misc/time_nl.h"
#include "nel/net/message.h"
#include "nel/net/module.h"
#include "nel/net/module_builder_parts.h"
#include "nel/net/module_gateway.h"
#include "nel/net/module_manager.h"
#include "nel/net/module_message.h"
#include "nel/net/service.h"
#include "nel/net/unified_network.h"
#include "game_share/callback_adaptor.h"
#include "game_share/utils.h"
#endif

File diff suppressed because it is too large Load Diff

@ -1,286 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef GD_ACTOR_H
#define GD_ACTOR_H
// Nel Misc
#include "nel/misc/types_nl.h"
#include "nel/misc/sheet_id.h"
#include "nel/misc/entity_id.h"
#include "nel/misc/vectord.h"
// Nel Pacs
#include "nel/pacs/u_move_primitive.h"
#include "nel/pacs/u_move_container.h"
// Nel Ligo
#include "nel/ligo/primitive.h"
// Game share
#include "game_share/mode_and_behaviour.h"
#include "game_share/mirror_prop_value.h"
#include "game_share/ryzom_mirror_properties.h"
#include "game_share/player_visual_properties.h"
// AgS test
#include "move_manager.h"
#include "ags_timer.h"
#include "mirrors.h"
namespace AGS_TEST
{
// external refs
class CActorGroup;
// the class
class CActor
{
public:
enum EActivity {
UNKNOWN=-1,
NOTHING=0,
SQUARE,
FIGHT,
WANDER,
FAUNA_WANDER,
FAUNA_WAIT,
FAUNA_EAT,
FAUNA_SLEEP,
ATTACK,
FLEE
};
/*
enum ECycleState
{
STATE_WANDER,
STATE_HUNGRY,
STATE_VERY_HUNGRY,
STATE_STARVING,
STATE_EATING,
STATE_DIGESTING,
STATE_TIRED,
STATE_VERY_TIRED,
STATE_EXHAUSTED,
STATE_SLEEPING,
STATE_SHAKING
};
*/
enum ECycleState
{
STATE_WANDER,
STATE_HUNGRY,
STATE_VERY_HUNGRY,
STATE_STARVING,
STATE_DIGESTING,
STATE_TIRED,
STATE_VERY_TIRED,
STATE_EXHAUSTED,
STATE_SHAKING,
STATE_LAST
};
// The only legal constructor
CActor(const std::string &type, const std::string &name, const NLMISC::CEntityId &id, bool &success);
//
~CActor();
// Removing x-refs to other actors if they are deleted
void removeRefs(CActor *actor);
// some basic read accessors
std::string getName() { return _name; }
std::string getType() { return _sheetId.toString(); }
sint32 getSheetID() { return _sheetId.asInt(); }
const NLMISC::CEntityId &getSid() { return _id; }
sint32 getX() { return _x(); }
sint32 getY() { return _y(); }
sint32 getZ() { return _z(); }
float getAngle() { return _angle(); }
// uint8 getMode() { return (uint8)(_mode().Mode); }
// void initMode() { _mode.init( TheDataset, _id, "Mode" ); }
//bool positionChanged() { return _positionChanged; }
// some basic write accessors
void setPos(sint32 x, sint32 y, sint32 z); // { _x=x; _y=y; _z=z; _positionChanged=true; } // commented by ben, uses pacs now
void setAngle(float angle) { _angle=angle; /*_positionChanged=true;*/ }
void setMagnetPos(const NLMISC::CVector &pos) { _Magnet = pos; }
void setMagnetRange(float range,float decay) { _MagnetDistance=range; _MagnetDecayDistance=decay; }
void setSpawnTime(float min,float max) { _MinSpawnDelay=min; _MaxSpawnDelay=max; }
void setAttackDistance(float distance)
{
_AttackDistance = distance;
nlinfo("Set attack distance for <%s> to %f meters",_name.c_str(),_AttackDistance);
}
void setPrimZone(NLLIGO::CPrimZone *primZone) { _PrimZone = primZone; }
void setBehaviour(std::string behaviourName);
/* void setMode(std::string behaviourName);
void setMode(MBEHAV::EMode mode);*/
void setLeftHand(NLMISC::CSheetId sheetId);
void setRightHand(NLMISC::CSheetId sheetId);
void setGroup(CActorGroup *group);
void setVPA(const SAltLookProp &vpa);
void setActivity(EActivity activity);
void setDefaultActivity(EActivity activity) { _DefaultActivity = activity; }
void setChatSet(sint32 set) { _ChatSet = set; }
sint32 getChatSet() const { return _ChatSet; }
// connections to the other game services
void addToOtherServices();
void removeFromOtherServices();
// the following used to connect to a specific service identified by service ID
//void addToGPMS(uint8 serviceID);
//void addToIOS(uint8 serviceID);
// some complex movement - involving GPMS update
void initMovePrimitive(sint32 x, sint32 y, sint32 z);
void moveBy(sint32 x, sint32 y, sint32 z);
//void addPositionChangesToMessage(NLNET::CMessage &msg);
void teleportTo(sint32 x, sint32 y, sint32 z);
// displaying the actor's current state
void display(NLMISC::CLog *log = NLMISC::InfoLog);
const char *getActivityName() { switch(_activity) { case FIGHT: return "FIGHT"; case NOTHING: return "IDLE"; case SQUARE: return "SQUARE"; case WANDER: return "WANDER"; } return ""; }
// changeing the actor's activity
void resetActivity() { setActivity(_DefaultActivity); }
void doNothing();
void doSquare();
void doWander();
void doEat();
void doSleep();
void doFight(CActor *target);
void doFight(const NLMISC::CEntityId &id);
void doFight(CActorGroup *target);
void doAttacked(CActor *target);
void doAttack();
void doFlee();
bool fighting() { return _activity==FIGHT; }
void stopFight();
void checkRespawn();
bool checkAttack( NLMISC::CVectorD & );
// Functions called at each update depending on the current _activity
bool processSquare();
bool processFight();
bool processEat();
bool processSleep();
bool computeMove( NLMISC::CVectorD &pos);
bool computeFlee( NLMISC::CVectorD &pos);
// the update routine that moves the actor and does other stuff
// returns false if the actor is dead, remote controled, etc
bool update();
// script management
/*
static void addScript(std::string name, std::vector<std::string> args, sint32 firstArg);
void assignScript(std::string name);
*/
// utility functions
double calcDist(CActor &target) { return (_x-target.getX()) * (_x-target.getX()) + (_y-target.getY()) * (_y-target.getY()); }
bool testPositionInPatat(const NLMISC::CVector &pos) { return (_PrimZone) ? _PrimZone->contains(pos) : true; } // if no prim zone, always true
//private:
CActor();
// basic identity
NLMISC::CEntityId _id;
NLMISC::CSheetId _sheetId;
std::string _name;
std::string _visualName;
// Eat and rest cycles
CAGSTimer _Timer; // Timer for eat and sleep cycles ( synchronized with TICK service)
ECycleState _CyclesState; // Current eat and sleep cycles
void updateCycles(); // State machine computing transitions between timer states (eat and sleep)
void checkTimers(); // called at each update to see if the last timer delay has expired (if true calls updateCycles)
// position
CMirrorPropValue1DS<TYPE_POSX> _x;
CMirrorPropValue1DS<TYPE_POSY> _y;
CMirrorPropValue1DS<TYPE_POSZ> _z;
CMirrorPropValue1DS<TYPE_ORIENTATION> _angle;
CMirrorPropValue1DS<TYPE_VPA> _vpa;
CMirrorPropValue1DS<TYPE_WHO_SEES_ME> _whoseesme;
CMirrorPropValue1DS<TYPE_BEHAVIOUR> _behaviour;
CMirrorPropValue1DS<TYPE_MODE> _mode;
//bool _positionChanged; // to know whether need to send position to GPS
// properties used to govern the update() code
EActivity _activity; // behavioural activity
EActivity _DefaultActivity; // the activity we were firt attributed and return to when nothing better to do
CActor *_target; // target for combat
// continent the entity spawned in
uint8 _Continent;
// pacs move container for the actor
NLPACS::UMoveContainer *_MoveContainer;
// pacs primitive for the actor
NLPACS::UMovePrimitive *_MovePrimitive;
// iterator for the move grid
CMoveManager::TObstacleGrid::CIterator _GridIterator;
// magnet
NLMISC::CVector _Magnet;
float _MagnetDistance;
float _MagnetDecayDistance;
// attack distance
float _AttackDistance;
// prim zone
NLLIGO::CPrimZone* _PrimZone;
// actor group
CActorGroup* _Group;
// bot page set
sint32 _ChatSet;
// respawn counter
sint32 _RespawnCounter;
float _MinSpawnDelay;
float _MaxSpawnDelay;
// added on services
bool _AlreadyAdded;
};
} // end of namespace AGS_TEST
#endif // GD_ACTOR_H

@ -1,144 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// Nel Misc
#include "nel/misc/command.h"
#include "nel/misc/path.h"
#include "nel/net/message.h"
#include "nel/net/unified_network.h"
// Game share
#include "game_share/tick_event_handler.h"
//#include "game_share/msg_brick_service.h"
// Local includes
#include "actor.h"
#include "actor_group.h"
#include "actor_manager.h"
#include "sheets.h"
using namespace NLMISC;
using namespace NLNET;
using namespace std;
namespace AGS_TEST
{
//----------------------------------------------------------------------------------
void CActorGroup::removeActor(CActor *actor)
{
if (this==0) return;
for (int i=_actors.size();i--;)
if (_actors[i]==actor)
{
_actors[i]=_actors[_actors.size()-1];
_actors.pop_back();
}
}
//----------------------------------------------------------------------------------
// displaying the actor's current state
void CActorGroup::display()
{
if (this==0) return;
nlinfo("");
nlinfo("ActorGroup: %s",_name.c_str());
// diaply the group's actors' stats
for (int i=_actors.size();i--;)
_actors[i]->display();
}
void CActorGroup::doFight(CActorGroup *target)
{
if (this==0) return;
if (target->actorCount()==0) return;
// tell each actor in the group to fight the opposing group member with matching ID
for (int i=_actors.size();i--;)
_actors[i]->doFight((*target)[i%target->actorCount()]);
}
void CActorGroup::doFight(CActor *target)
{
if (this==0) return;
// tell all the actors in the group to attack the target chap
for (int i=_actors.size();i--;)
_actors[i]->doFight(target);
}
void CActorGroup::stopFight()
{
if (this==0) return;
for (int i=_actors.size();i--;)
_actors[i]->stopFight();
}
//----------------------------------------------------------------------------------
// magnet state control
void CActorGroup::fadeMagnet(const NLMISC::CVector &pos, float distance, float decay, NLMISC::TGameCycle endTime)
{
_ToStartMagnet = _Magnet;
_ToStartMagnetDistance = _MagnetDistance;
_ToStartMagnetDecay = _MagnetDecay;
_ToStopMagnet = pos;
_ToStopMagnetDistance = distance;
_ToStopMagnetDecay= decay;
_ToStartCycle = CTickEventHandler::getGameCycle();
_ToStopCycle = endTime;
_ToFade = true;
}
//----------------------------------------------------------------------------------
// overall actors update
void CActorGroup::update()
{
if (_ToFade)
{
TGameCycle cycle = CTickEventHandler::getGameCycle();
if (cycle > _ToStopCycle)
{
cycle = _ToStopCycle;
_ToFade = false;
}
float ratio = (float)(cycle-_ToStartCycle)/(float)(_ToStopCycle-_ToStartCycle);
_Magnet = _ToStartMagnet*(1.0f-ratio) + _ToStopMagnet*ratio;
_MagnetDistance = _ToStartMagnetDistance*(1.0f-ratio) + _ToStopMagnetDistance*ratio;
_MagnetDecay = _ToStartMagnetDecay*(1.0f-ratio) + _ToStopMagnetDecay*ratio;
}
if (_MagnetActors)
{
uint i;
for (i=0; i<_actors.size(); ++i)
{
_actors[i]->setMagnetPos(_Magnet);
_actors[i]->setMagnetRange(_MagnetDistance, _MagnetDecay);
}
}
}
} // end of namespace AGS_TEST

@ -1,102 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef GD_ACTOR_GROUP_H
#define GD_ACTOR_GROUP_H
// Nel Misc
#include "nel/misc/types_nl.h"
#include "nel/misc/vector.h"
// Game share
#include "game_share/ryzom_entity_id.h"
#include "nel/misc/sheet_id.h"
#include "game_share/mode_and_behaviour.h"
namespace AGS_TEST
{
// external refs
class CActor;
// the class
class CActorGroup
{
public:
// Constructor - must have a name for the group
CActorGroup(const std::string &name): _name(name), _MagnetActors(false) {}
// adding actors to the group
void addActor(CActor *actor) { _actors.push_back(actor); }
// Remove actor from the group (ignore if not found)
void removeActor(CActor *actor);
// some basic read accessors
std::string getName() { return _name; }
unsigned actorCount() { return (unsigned)_actors.size(); }
CActor *operator[](unsigned index) { return _actors[index]; }
// displaying the actor's current state
void display();
// changeing the actor's activity
void doNothing();
void doSquare();
void doFight(CActor *target);
void doFight(CActorGroup *target);
void stopFight();
//
void update();
// magnet moving/attraction scripting setup
void magnetActors(bool control=true) { _MagnetActors = control; }
void setMagnet(const NLMISC::CVector &pos, float distance, float decay) { _Magnet = pos; _MagnetDistance = distance; _MagnetDecay = decay; _ToFade = false; }
void fadeMagnet(const NLMISC::CVector &pos, float distance, float decay, NLMISC::TGameCycle endTime);
bool fadeComplete() const { return !_ToFade; }
const NLMISC::CVector &getMagnetPos() const { return _Magnet; }
float getMagnetDistance() const { return _MagnetDistance; }
float getMagnetDecay() const { return _MagnetDecay; }
private:
CActorGroup(); // forbid default constructor
std::string _name;
std::vector<CActor *> _actors;
NLMISC::CVector _Magnet;
float _MagnetDistance;
float _MagnetDecay;
bool _MagnetActors;
NLMISC::CVector _ToStartMagnet;
float _ToStartMagnetDistance;
float _ToStartMagnetDecay;
NLMISC::CVector _ToStopMagnet;
float _ToStopMagnetDistance;
float _ToStopMagnetDecay;
NLMISC::TGameCycle _ToStartCycle, _ToStopCycle;
bool _ToFade;
};
} // end of namespace AGS_TEST
#endif // GD_ACTOR_GROUP_H
/* End of actor_group.h */

@ -1,440 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// Nel
//#include "nel/net/service.h"
// Local headers
#include "position_generator.h"
#include "actor_manager.h"
#include "sheets.h"
#include <nel/net/unified_network.h>
#include "game_share/people.h"
#include "game_share/synchronised_message.h"
#include "nel/misc/variable.h"
#include <set>
using namespace NLMISC;
using namespace NLNET;
using namespace std;
namespace AGS_TEST
{
//-------------------------------------------------------------------------
// Some global variables
extern uint32 GlobalActorCount;
extern uint32 GlobalActorUpdates;
extern uint32 GlobalActorMoves;
CEntityId LastActorId;
NLMISC_DYNVARIABLE(string, LastActorId, "Last created actor")
{
if (get)
*pointer = LastActorId.toString();
else
LastActorId.fromString((*pointer).c_str());
}
//-------------------------------------------------------------------------
// Some function prototypes
static void cbServiceUp( const string& serviceName, uint16 serviceId, void * );
static void cbServiceDown( const string& serviceName, uint16 serviceId, void * );
//------------------------------------------------------------------------
// static data for CActorManager
std::vector<CActor*> CActorManager::_actors;
std::vector<CActorGroup*> CActorManager::_actorGroups;
int CActorManager::_nextActorID=0;
std::set<uint> CActorManager::_visionHandlingServices;
CActorGroup *CActorManager::_defaultActorGroup;
//------------------------------------------------------------------------
// basic functionality for CActorManager singleton
void CActorManager::init()
{
static bool first_time=true;
if (first_time)
{
// Init callback for service up / down
CUnifiedNetwork::getInstance()->setServiceUpCallback ("*", cbServiceUp, NULL);
CUnifiedNetwork::getInstance()->setServiceDownCallback("*", cbServiceDown, NULL);
first_time=false;
}
else
release();
_nextActorID=0;
/*
CPositionGenerator::setPattern(std::string("grid"));
CPositionGenerator::setPosition(17981,-33200);
CPositionGenerator::setSpacing(2000);
*/
_defaultActorGroup = newActorGroup("defaultGroup");
}
void CActorManager::update()
{
set< pair<sint32, sint32> > iaZones;
std::vector<CActorGroup*>::iterator itg;
for (itg=_actorGroups.begin(); itg!=_actorGroups.end(); ++itg)
(*itg)->update();
// iterate through all known actors, calling their update
uint16 positionChangeCount=0;
uint16 updateCount=0;
std::vector<CActor*>::iterator it;
for (it=_actors.begin(); it!=_actors.end(); ++it)
{
bool updated= (*it)->update();
if (updated)
updateCount++;
/*
if ((*it)->positionChanged())
positionChangeCount++;
sint32 zx = (*it)->getX()/160000;
sint32 zy = -(*it)->getY()/160000;
iaZones.insert(make_pair<sint32,sint32>(zx, zy));
*/
}
// for all entities, request vision zones
/*CMessage msg("AGENT_VISON");
sint64 fakeId = 0;
msg.serial(fakeId);
sint32 pos = msg.getPos();
set< pair<sint32, sint32> >::iterator itz;
for (itz=iaZones.begin(); itz!=iaZones.end(); ++itz)
{
sint32 x = (*itz).first,
y = (*itz).second;
msg.serial(x);
msg.serial(y);
}
if (msg.getPos() > pos)
CUnifiedNetwork::getInstance()->send("GPMS", msg);*/
/*
// build the position changed message and send it to GPMS
if (positionChangeCount>0)
{
NLNET::CMessage gpmPosMsg("UPDATE_ENTITIES_POSITIONS");
gpmPosMsg.serial(positionChangeCount);
for (it=_actors.begin(); it!=_actors.end(); ++it)
(*it)->addPositionChangesToMessage(gpmPosMsg);
sendMessageViaMirror( "GPMS", gpmPosMsg );
}
*/
GlobalActorUpdates=updateCount;
//GlobalActorMoves=positionChangeCount;
}
void CActorManager::release()
{
std::vector<CActor*>::iterator it;
for (it=_actors.begin(); it!=_actors.end(); ++it)
{
(*it)->removeFromOtherServices();
}
_actors.clear();
}
// Callback called at service connexion
static void cbServiceUp( const string& serviceName, uint16 serviceId, void * )
{
/*if (serviceName==std::string("EGS"))
CActorManager::reconnectEGS((uint8)serviceId);
if (serviceName==std::string("IOS"))
CActorManager::reconnectIOS((uint8)serviceId);
if (serviceName==std::string("GPMS"))
CActorManager::reconnectGPMS((uint8)serviceId);*/
/*CMessage reqVision("ASK_VISION_ZONE");
CUnifiedNetwork::getInstance()->send(serviceId, reqVision);*/
}
//
static void cbServiceDown( const string& serviceName, uint16 serviceId, void * )
{
CActorManager::removeVisionService(serviceId);
}
//---------------------------------------------------------------------------------
// methods for dealing with tardy connection of a key service
/*void CActorManager::reconnectEGS(uint8 serviceId)
{
}
void CActorManager::reconnectIOS(uint8 serviceId)
{
std::vector<CActor*>::iterator it;
for (it=_actors.begin(); it!=_actors.end(); ++it)
{
(*it)->addToIOS(serviceId);
}
}
void CActorManager::reconnectGPMS(uint8 serviceId)
{
std::vector<CActor*>::iterator it;
for (it=_actors.begin(); it!=_actors.end(); ++it)
{
(*it)->addToGPMS(serviceId);
}
}*/
//---------------------------------------------------------------------------------
// CActorManager methods for creating and killing actors
// method for adding a new actor to the scene
CActor *CActorManager::newActor(const std::string &type, const std::string &name)
{
LastActorId = CEntityId::Unknown;
if (getActor(name)!=NULL)
{
nlinfo("Actor already exists: %s",name.c_str());
return NULL;
}
CSheetId sheetId(type);
const CSheets::CSheet *sheet=CSheets::lookup(sheetId);
if (!sheet)
{
nlwarning("ERROR: Can't find static type data for '%s'(%d) for entity %s", type.c_str(), sheetId.asInt(), name.c_str());
return NULL;
}
// create a new actor record and COPY it into the actor vector
// EGSPD::CPeople::TPeople p_type = EGSPD::CPeople::fromString( type );
bool success = false;
CActor *aNewActor;
if ( sheet->isNpc /*EGSPD::CPeople::isPlayableRace( p_type )*/ )
aNewActor = new CActor(type,name,CEntityId(RYZOMID::npc,_nextActorID++),success);
else
aNewActor = new CActor(type,name,CEntityId(RYZOMID::creature,_nextActorID++),success);
if ( ! success )
{
if (aNewActor)
delete aNewActor;
return NULL;
}
LastActorId = aNewActor->_id;
int x,y;
CPositionGenerator::next(x,y);
aNewActor->setPos(x, y, 0);
aNewActor->setAngle(0);
_actors.push_back(aNewActor);
// get hold of a pointer of the copy of the actor in the actor vector
CActor *theActor=getActor(name);
// add the actor to the GPMS, the IOS, etc
if (theActor!=0)
theActor->addToOtherServices();
/*
CMessage msgMode("SET_MODE");
TDataSetRow index = CMirrors::DataSet->getDataSetRow(theActor->_id);
msgMode.serial(index);
MBEHAV::TMode mode(MBEHAV::NORMAL, x, y);
msgMode.serial(mode);
sendMessageViaMirror("EGS", msgMode);
*/
CMirrors::initSheet( aNewActor->getSid(), sheetId ); // initialize out the sheet
// Let the position & angle & tick be sent ("UPDATE_ENTITIES_POSITIONS") in update
//aNewActor->initMode();
MBEHAV::TMode mode(MBEHAV::NORMAL, x, y);
theActor->_mode = mode.RawModeAndParam;
aNewActor->display();
theActor->setGroup(_defaultActorGroup);
GlobalActorCount++;
return theActor;
}
// method for retrievng a pointer to a named actor
// returns NULL if the actor doesn't exist
CActor *CActorManager::getActor(const std::string &name)
{
std::vector<CActor*>::iterator it;
for (it=_actors.begin(); it!=_actors.end(); ++it)
{
if ((*it)->getName()==name)
return (*it);
}
return 0;
}
// method for retrievng a pointer to given actor
CActor *CActorManager::getActor(unsigned index)
{
if (index>=_actors.size())
return NULL;
else
return (_actors[index]);
}
// method for retrievng a pointer to given actor
CActor *CActorManager::getActor(const NLMISC::CEntityId &id)
{
std::vector<CActor*>::iterator it;
for (it=_actors.begin(); it!=_actors.end(); ++it)
{
if ((*it)->getSid()==id)
return (*it);
}
return NULL;
}
void CActorManager::killActor(const std::string &name)
{
std::vector<CActor*>::iterator it;
for (it=_actors.begin(); it!=_actors.end(); ++it)
{
if ((*it)->getName()==name)
{
// remove from net refferences
(*it)->removeFromOtherServices();
// remove from vision xrefs
std::vector<CActor*>::iterator it2;
for (it2=_actors.begin(); it2!=_actors.end(); ++it2)
{
(*it2)->removeRefs(*it);
}
for (int i=_actorGroups.size();i--;)
_actorGroups[i]->removeActor(*it);
// remove from container
delete *it;
_actors.erase(it);
GlobalActorCount--;
return;
}
}
}
//------------------------------------------------------------------------
// basic functionality for actor group management
// method for adding a new actorGroup to the scene
CActorGroup *CActorManager::newActorGroup(const std::string &name)
{
if (!getActorGroup(name))
{
// create a new actorGroup record and COPY it into the actorGroup vector
CActorGroup *aNewActorGroup = new CActorGroup(name);
_actorGroups.push_back(aNewActorGroup);
aNewActorGroup->display();
}
// get hold of a pointer of the copy of the actorGroup in the actorGroup vector
return getActorGroup(name);
}
// method for retrievng a pointer to a named actorGroup
// returns NULL if the actorGroup doesn't exist
CActorGroup *CActorManager::getActorGroup(const std::string &name)
{
std::vector<CActorGroup*>::iterator it;
for (it=_actorGroups.begin(); it!=_actorGroups.end(); ++it)
{
if ((*it)->getName()==name)
return (*it);
}
return NULL;
}
// method for retrievng a pointer to given actorGroup
CActorGroup *CActorManager::getActorGroup(unsigned index)
{
if (index>=_actorGroups.size())
return NULL;
else
return (_actorGroups[index]);
}
void CActorManager::removeActorGroup(const std::string &name)
{
std::vector<CActorGroup*>::iterator it;
for (it=_actorGroups.begin(); it!=_actorGroups.end(); ++it)
{
if ((*it)->getName()==name)
{
// remove all actors from this group into default group
uint i;
for (i=0; i<(*it)->actorCount(); ++i)
(*(*it))[i]->setGroup(_defaultActorGroup);
// remove from container
delete (*it);
_actorGroups.erase(it);
return;
}
}
}
//
void CActorManager::setActorsToGroup(const std::string &sourceActorGroup, const std::string &destActorGroup)
{
CActorGroup *srcGroup = getActorGroup(sourceActorGroup);
if (srcGroup == NULL)
{
nlwarning("source actor group '%s' is unknown, abort setActorsToGroup(%s, %s)", sourceActorGroup.c_str(), sourceActorGroup.c_str(), destActorGroup.c_str());
return;
}
CActorGroup *destGroup = getActorGroup(destActorGroup);
if (destGroup == NULL)
{
nlwarning("destination actor group '%s' is unknown, abort setActorsToGroup(%s, %s)", destActorGroup.c_str(), sourceActorGroup.c_str(), destActorGroup.c_str());
return;
}
uint i;
for (i=0; i<srcGroup->actorCount(); ++i)
(*srcGroup)[i]->setGroup(destGroup);
}
} // end of namespace AGS_TEST

@ -1,107 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef GD_ACTOR_MANAGER_H
#define GD_ACTOR_MANAGER_H
// Nel
#include "nel/misc/types_nl.h"
//#include "nel/net/message.h"
//#include "nel/net/unified_network.h"
// Local headers
#include "actor.h"
#include "actor_group.h"
#include <set>
namespace AGS_TEST
{
/**
* Singleton, for managing the actors in a scene
* \author Sadge
* \author Nevrax France
* \date 2002
*/
class CActorManager
{
public:
// initialisation and housekeeping for the singleton
static void init();
static void release();
// methods for dealing with tardy connection of a key service
static void reconnectEGS(uint8 serviceId);
static void reconnectIOS(uint8 serviceId);
static void reconnectGPMS(uint8 serviceId);
static void addVisionService(uint serviceId) { _visionHandlingServices.insert(serviceId); }
static void removeVisionService(uint serviceId) { _visionHandlingServices.erase(serviceId); }
// methods managing the actor set
// getActor() returns NULL if the actor doesn't exist
static CActor *newActor(const std::string &type, const std::string &name);
static void killActor(const std::string &name);
static CActor *getActor(const std::string &name);
static CActor *getActor(const NLMISC::CEntityId &id);
static CActor *getActor(unsigned index);
static uint32 numActors() { return _actors.size(); }
// Movement script management
static void update();
private:
// forbid instantiation
CActorManager();
// changed by ben -- std::vector<CActor> replaced by std::vector<CActor*> because highly unsafe (reallocs might occur)
// to avoid memory fragmentation, use NLMISC::CBlockMemory<CActor> instead
static std::vector<CActor*> _actors;
static int _nextActorID;
static std::set<uint> _visionHandlingServices;
public:
// changed by ben -- std::vector<CActorGroup> replaced by std::vector<CActorGroup*> because highly unsafe (reallocs might occur)
// to avoid memory fragmentation, use NLMISC::CBlockMemory<CActorGroup> instead
static std::vector<CActorGroup*> _actorGroups;
static CActorGroup * _defaultActorGroup;
static CActorGroup * newActorGroup(const std::string &name);
static CActorGroup * getActorGroup(const std::string &name);
static CActorGroup * getActorGroup(unsigned index);
static void removeActorGroup(const std::string &name);
static uint32 numActorGroups() { return _actorGroups.size(); }
static CActorGroup* getDefaultActorGroup() { return _defaultActorGroup; }
// move all actors from a group to another group
static void setActorsToGroup(const std::string &sourceActorGroup, const std::string &destActorGroup);
static sint32 getNextActorId() { return ++_nextActorID; }
};
} // end of namespace AGS_TEST
#endif // GD_ACTOR_MANAGER_H
/* End of actor_manager.h */

@ -1,149 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// Nel Misc
#include "nel/misc/command.h"
#include "nel/misc/path.h"
// Game share
#include "game_share/container_property_receiver.h"
#include "game_share/msg_brick_service.h"
// Local includes
#include "ags_test.h"
#include "actor.h"
#include "actor_manager.h"
#include "../src/agent_game/combat_interface.h"
using namespace NLMISC;
using namespace NLNET;
using namespace std;
using namespace AGS_TEST;
CAgsTest* pAgsTest = NULL;
/**
* CallbackArray
*/
TUnifiedCallbackItem CallbackArray[] =
{
{ "AZERTY", NULL },
};
//---------------------------------------------------
// Service Init :
//
//---------------------------------------------------
void CAgsTest::init (void)
{
// Load the sheet id lookup table
// Initialise the actor manager
CActorManager::init();
// For windows speed update
setUpdateTimeout(100);
// keep the pointer on class if need use a methode
pAgsTest = this;
// init the Tick Event Handler
CTickEventHandler::init( serviceUpdate, cbSync );
// initialise the property receiver set
CContainerPropertyReceiver::initPropertyReceiver();
// init the combat interface
CCombatInterface::init();
// Init callback for service up / down
CUnifiedNetwork::getInstance()->setServiceUpCallback ("*", cbServiceUp, NULL);
CUnifiedNetwork::getInstance()->setServiceDownCallback( string("*"), cbServiceDown, 0);
}
//---------------------------------------------------
// Service update :
//
//---------------------------------------------------
bool CAgsTest::update (void)
{
return true;
}
//---------------------------------------------------
// Service release :
//
//---------------------------------------------------
void CAgsTest::release (void)
{
CContainerPropertyReceiver::releaseAllPropertiesManagers();
}
//---------------------------------------------------
// Service update : Call at every ticks
//
//---------------------------------------------------
void CAgsTest::serviceUpdate(void)
{
CActorManager::update();
}
/****************************************************************\
****************************************************************
Callback functions
****************************************************************
\****************************************************************/
// Callback called at service connexion
void cbServiceUp( const string& serviceName, uint16 serviceId, void * )
{
/*if (serviceName==std::string("EGS"))
CActorManager::reconnectEGS((uint8)serviceId);
if (serviceName==std::string("IOS"))
CActorManager::reconnectIOS((uint8)serviceId);
if (serviceName==std::string("GPMS"))
CActorManager::reconnectGPMS((uint8)serviceId);*/
}
// Callback called at service down
void cbServiceDown( const string& serviceName, uint16 serviceId, void * )
{
}
//---------------------------------------------------
// cbSync, for service init with current time/tick if needed
//
//---------------------------------------------------
void cbSync()
{
} // cbSync //
/****************************************************************\
****************************************************************
Service register
****************************************************************
\****************************************************************/
NLNET_SERVICE_MAIN (CAgsTest, "AgG", "ags_test_service", 0, CallbackArray, "", "")
//-------------------------------------------------------------------------

@ -1,66 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef GD_AGS_TEST_H
#define GD_AGS_TEST_H
// Nel Misc
#include "nel/misc/types_nl.h"
// Nel Net
#include "nel/net/service.h"
// Game share
#include "game_share/tick_event_handler.h"
// Callback called at service connexion
void cbServiceUp( const std::string& serviceName, uint16 serviceId, void * );
// Callback called at service down
void cbServiceDown( const std::string& serviceName, uint16 serviceId, void * );
// "Callbacks" for Tick service
void cbSync();
/**
* <Class description>
* \author Alain Saffray
* \author Nevrax France
* \date 2001
*/
class CAgsTest : public NLNET::IService
{
public:
// Initialisation of service
void init (void);
// Update net processing
bool update (void);
// Update service processing
static void serviceUpdate(void);
// Release the service
void release (void);
};
#endif // GD_AGS_TEST_H
/* End of ags_test.h */

@ -1,51 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "ags_timer.h"
#include "game_share/tick_event_handler.h"
namespace AGS_TEST
{
CAGSTimer::CAGSTimer(uint32 dt /*= 0*/)
{
_dt = dt;
}
void CAGSTimer::set(uint32 dt)
{
_start = (uint32)CTickEventHandler::getGameCycle();
_dt = dt;
}
void CAGSTimer::add(uint32 dt)
{
_start = (uint32)CTickEventHandler::getGameCycle();
_dt += dt;
}
bool CAGSTimer::test()
{
uint32 curent = (uint32) CTickEventHandler::getGameCycle();
uint32 elapsed = curent - _start;
return ( elapsed >= _dt );
}
}

@ -1,35 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "nel/misc/types_nl.h"
namespace AGS_TEST
{
class CAGSTimer
{
private:
uint32 _start;
uint32 _dt;
public:
CAGSTimer(uint32 dt = 0);
void set(uint32 dt);
void add(uint32 dt);
bool test();
};
}

@ -1,440 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "ai_mgr.h"
//--------------------------------------------------------------------------
// singleton data declaration
std::vector <CAiMgrFile *> CAiMgr::_files;
//--------------------------------------------------------------------------
// Utility functions
// generate indentation strings
static std::string tab(uint indent)
{
std::string s;
s.resize(indent,'\t');
return s;
}
// opening a STRUCT clause in output XML file
static void writeOpenStruct(FILE *outf, uint indent, std::string name=std::string())
{
if (name.empty())
fprintf(outf,"%s<STRUCT>\n",tab(1).c_str());
else
fprintf(outf,"%s<STRUCT Name=\"%s\">\n",tab(1).c_str(),name.c_str());
}
// closing a STRUCT clause in output XML file
static void writeCloseStruct(FILE *outf, uint indent)
{
fprintf(outf,"%s</STRUCT>\n",tab(1).c_str());
}
// opening an ARRAY clause in output XML file
static void writeOpenArray(FILE *outf, uint indent, std::string name=std::string())
{
if (name.empty())
fprintf(outf,"%s<ARRAY>\n",tab(1).c_str());
else
fprintf(outf,"%s<ARRAY Name=\"%s\">\n",tab(1).c_str(),name.c_str());
}
// closing an ARRAY clause in output XML file
static void writeCloseArray(FILE *outf, uint indent)
{
fprintf(outf,"%s</ARRAY>\n",tab(1).c_str());
}
// writing an ATOM clause in output XML file
static void writeAtom(FILE *outf, uint indent, std::string name, std::string value)
{
if (name.empty())
fprintf(outf,"%s<ATOM Value=\"%s\"/>\n",tab(indent).c_str(),value.c_str());
else
fprintf(outf,"%s<ATOM Name=\"%s\" Value=\"%s\"/>\n",tab(indent).c_str(),name.c_str(),value.c_str());
}
static void writeAtom(FILE *outf, uint indent, std::string name, int value)
{
if (name.empty())
fprintf(outf,"%s<ATOMValue=\"%d\"/>\n",tab(indent).c_str(),value);
else
fprintf(outf,"%s<ATOM Name=\"%s\" Value=\"%d\"/>\n",tab(indent).c_str(),name.c_str(),value);
}
static void writeAtom(FILE *outf, uint indent, std::string name, double value)
{
if (name.empty())
fprintf(outf,"%s<ATOM Value=\"%f\"/>\n",tab(indent).c_str(),value);
else
fprintf(outf,"%s<ATOM Name=\"%s\" Value=\"%f\"/>\n",tab(indent).c_str(),name.c_str(),value);
}
//--------------------------------------------------------------------------
// Display
// display contents of hierarchy
void CAiMgrSpawn::display(uint indent, NLMISC::CLog *log)
{
log->displayNL("%sSPAWN:",tab(indent).c_str());
log->displayNL("%s%s",tab(indent+1).c_str(),_place.c_str());
}
void CAiMgrPopulation::display(uint indent, NLMISC::CLog *log)
{
log->displayNL("%sPOPULATION: %s",tab(indent).c_str(),_name.c_str());
log->displayNL("%stype: %s",tab(indent+1).c_str(),_creatureType.toString().c_str());
log->displayNL("%scount: %i",tab(indent+1).c_str(),_quantity);
log->displayNL("%sface: pi * %4.2f",tab(indent+1).c_str(),_orientation/3.14159265359);
log->displayNL("%sspawn: %i..%i ms",tab(indent+1).c_str(),_minTime,_maxTime);
}
void CAiMgrLocation::display(uint indent, NLMISC::CLog *log)
{
log->displayNL("%sLOCATION: %s",tab(indent).c_str(),_name.c_str());
log->displayNL("%stype: %s",tab(indent+1).c_str(),_type.c_str());
log->displayNL("%spatat: %s",tab(indent+1).c_str(),_boundary.c_str());
}
void CAiMgrInstance::display(uint indent, NLMISC::CLog *log)
{
log->displayNL("%sMANAGER: %s",tab(indent).c_str(),_name.c_str());
log->displayNL("%spatat: %s",tab(indent+1).c_str(),_boundary.c_str());
log->displayNL("%slimit: %i",tab(indent+1).c_str(),_creatureLimit);
uint i;
for (i=0;i<_spawn.size();i++) _spawn[i]->display(indent+1);
for (i=0;i<_population.size();i++) _population[i]->display(indent+1);
for (i=0;i<_location.size();i++) _location[i]->display(indent+1);
for (i=0;i<_children.size();i++) _children[i]->display(indent+1);
}
void CAiMgrFile::display(uint indent, NLMISC::CLog *log)
{
log->displayNL("%sFILE: %s",tab(indent).c_str(),_filename.c_str());
log->displayNL("%sprim file: %s",tab(indent+1).c_str(),_primFilename.c_str());
uint i;
for (i=0;i<_children.size();i++) _children[i]->display(indent+1);
}
void CAiMgr::display(uint indent, NLMISC::CLog *log)
{
log->displayNL("%sDISPLAYING PARSED AI_MANAGER FILE CONTENTS",tab(indent).c_str());
uint i;
for (i=0;i<_files.size();i++) _files[i]->display(indent+1);
}
//--------------------------------------------------------------------------
// Read
// read .AI_MGR 'george' files
void CAiMgrSpawn::read()
{
}
void CAiMgrPopulation::read()
{
}
void CAiMgrLocation::read()
{
}
void CAiMgrInstance::read()
{
}
void CAiMgrFile::read()
{
// read a .AI_MGR file and parse the contents
}
void CAiMgr::read(std::string path,bool recursive)
{
// recurse through sub directories looking for ai manager files to read
}
//--------------------------------------------------------------------------
// Write
// write .AI_MGR 'george' files
void CAiMgrSpawn::write(FILE *outf,uint indent)
{
writeAtom(outf,indent,"",_place.c_str());
}
void CAiMgrPopulation::write(FILE *outf,uint indent)
{
writeOpenStruct(outf,indent,_name);
// writing the static fields
writeAtom(outf,indent+1,"Name",_name);
writeAtom(outf,indent+1,"CreatureType",_creatureType.toString());
writeAtom(outf,indent+1,"Population",_quantity);
writeAtom(outf,indent+1,"MinSpawnTime",_minTime);
writeAtom(outf,indent+1,"MaxSpawnTime",_maxTime);
writeAtom(outf,indent+1,"Orientation",_orientation);
writeCloseStruct(outf,indent);
}
void CAiMgrLocation::write(FILE *outf,uint indent)
{
writeOpenStruct(outf,indent,_name);
// writing the static fields
writeAtom(outf,indent+1,"Name",_name);
writeAtom(outf,indent+1,"LocationType",_type);
writeAtom(outf,indent+1,"Boundary",_boundary);
writeCloseStruct(outf,indent);
}
void CAiMgrInstance::write(FILE *outf,uint indent)
{
uint i;
writeOpenStruct(outf,indent,_name);
// writing the static fields
writeAtom(outf,indent+1,"Name",_name);
writeAtom(outf,indent+1,"Boundary",_boundary);
writeAtom(outf,indent+1,"CreatureLimit",_creatureLimit);
// writing spawn points
if (!_spawn.empty())
{
writeOpenArray(outf,indent+1,"Spawn");
for (i=0;i<_spawn.size();i++) _spawn[i]->write(outf,indent+2);
writeCloseArray(outf,indent+1);
}
// writing populations
if (!_population.empty())
{
writeOpenArray(outf,indent+1,"Population");
for (i=0;i<_population.size();i++) _population[i]->write(outf,indent+2);
writeCloseArray(outf,indent+1);
}
// writing locations
if (!_location.empty())
{
writeOpenArray(outf,indent+1,"Location");
for (i=0;i<_location.size();i++) _location[i]->write(outf,indent+2);
writeCloseArray(outf,indent+1);
}
// writing children
if (!_children.empty())
{
writeOpenArray(outf,indent+1,"Children");
for (i=0;i<_children.size();i++) _children[i]->write(outf,indent+2);
writeCloseArray(outf,indent+1);
}
writeCloseStruct(outf,indent);
}
void CAiMgrFile::write()
{
// opening the file
FILE *outf=fopen(_filename.c_str(),"wt");
if (outf==0)
{
nlwarning("Failed to open file for writing: %s",_filename.c_str());
return;
}
nlinfo("WRITING: %s",_filename.c_str());
// writing the file header
fprintf(outf,"<?xml version=\"1.0\"?>\n");
fprintf(outf,"<FORM Version=\"0.1\" State=\"modified\">\n");
writeOpenStruct(outf,1);
// writing the static fields
writeAtom(outf,2,"Name",_filename);
writeAtom(outf,2,"Prim",_primFilename);
// iterating through the managers to be written to the file
uint i;
writeOpenArray(outf,2,"Child");
for (i=0;i<_children.size();i++)
_children[i]->write(outf,3);
writeCloseArray(outf,2);
// writing the file footer
writeCloseStruct(outf,1);
fprintf(outf,"</FORM>\n");
// closing the file
fclose(outf);
}
void CAiMgr::write()
{
uint i;
for (i=0;i<_files.size();i++)
_files[i]->write();
}
//--------------------------------------------------------------------------
// Test
// test code to test the interfaces of the different classes
void CAiMgrSpawn::test()
{
}
void CAiMgrPopulation::test()
{
}
void CAiMgrLocation::test()
{
}
void CAiMgrInstance::test()
{
}
void CAiMgrFile::test()
{
}
void CAiMgr::test()
{
CAiMgrSpawn *aiMgrSpawn0 = new CAiMgrSpawn;
CAiMgrSpawn *aiMgrSpawn1 = new CAiMgrSpawn;
CAiMgrSpawn *aiMgrSpawn2 = new CAiMgrSpawn;
CAiMgrPopulation *aiMgrPopulation0 = new CAiMgrPopulation;
CAiMgrPopulation *aiMgrPopulation1 = new CAiMgrPopulation;
CAiMgrPopulation *aiMgrPopulation2 = new CAiMgrPopulation;
CAiMgrLocation *aiMgrLocation0 = new CAiMgrLocation;
CAiMgrLocation *aiMgrLocation1 = new CAiMgrLocation;
CAiMgrLocation *aiMgrLocation2 = new CAiMgrLocation;
CAiMgrInstance *aiMgrInstance0 = new CAiMgrInstance;
CAiMgrInstance *aiMgrInstance1 = new CAiMgrInstance;
CAiMgrInstance *aiMgrInstance2 = new CAiMgrInstance;
CAiMgrFile *aiMgrFile0 = new CAiMgrFile;
CAiMgrFile *aiMgrFile1 = new CAiMgrFile;
CAiMgrFile *aiMgrFile2 = new CAiMgrFile;
//--------------------------------------
aiMgrSpawn0->setPlace("aiMgrSpawn0");
aiMgrSpawn1->setPlace("aiMgrSpawn1");
aiMgrSpawn2->setPlace("aiMgrSpawn2");
//--------------------------------------
aiMgrPopulation0->setName("aiMgrPopulation0_name");
aiMgrPopulation0->setType(NLMISC::CSheetId("aiMgrPopulation0_type"));
aiMgrPopulation0->setQuantity(0);
aiMgrPopulation0->setOrientation(0);
aiMgrPopulation0->setSpawnRate(0,1);
aiMgrPopulation1->setName("aiMgrPopulation1_name");
aiMgrPopulation1->setType(NLMISC::CSheetId("aiMgrPopulation1_type"));
aiMgrPopulation1->setQuantity(1);
aiMgrPopulation1->setOrientation(3.14159265359f/2.0f);
aiMgrPopulation1->setSpawnRate(2,3);
aiMgrPopulation2->setName("aiMgrPopulation2_name");
aiMgrPopulation2->setType(NLMISC::CSheetId("aiMgrPopulation2_type"));
aiMgrPopulation2->setQuantity(2);
aiMgrPopulation2->setOrientation(3.14159265359f);
aiMgrPopulation2->setSpawnRate(4,5);
//--------------------------------------
aiMgrLocation0->setName("aiMgrLocation0_name");
aiMgrLocation0->setType("aiMgrLocation0_type");
aiMgrLocation0->setBoundary("aiMgrLocation0_boundary");
aiMgrLocation1->setName("aiMgrLocation1_name");
aiMgrLocation1->setType("aiMgrLocation1_type");
aiMgrLocation1->setBoundary("aiMgrLocation1_boundary");
aiMgrLocation2->setName("aiMgrLocation2_name");
aiMgrLocation2->setType("aiMgrLocation2_type");
aiMgrLocation2->setBoundary("aiMgrLocation2_boundary");
//--------------------------------------
aiMgrInstance0->setName("aiMgrInstance0");
aiMgrInstance0->setBoundary("boundary0");
aiMgrInstance0->setCreatureLimit(0);
aiMgrInstance1->setName("aiMgrInstance1");
aiMgrInstance1->setBoundary("boundary1");
aiMgrInstance1->setCreatureLimit(1);
aiMgrInstance2->setName("aiMgrInstance2");
aiMgrInstance2->setBoundary("boundary2");
aiMgrInstance2->setCreatureLimit(2);
aiMgrInstance1->addSpawn(aiMgrSpawn0);
aiMgrInstance1->addSpawn(aiMgrSpawn1);
aiMgrInstance1->addSpawn(aiMgrSpawn2);
aiMgrInstance1->addPopulation(aiMgrPopulation0);
aiMgrInstance1->addPopulation(aiMgrPopulation1);
aiMgrInstance1->addPopulation(aiMgrPopulation2);
aiMgrInstance1->addLocation(aiMgrLocation0);
aiMgrInstance1->addLocation(aiMgrLocation1);
aiMgrInstance1->addLocation(aiMgrLocation2);
aiMgrInstance1->addChild(aiMgrInstance2);
//--------------------------------------
aiMgrFile0->setName("aiMgrFile0");
aiMgrFile0->setPrim("prim0.prim");
aiMgrFile1->setName("aiMgrFile1");
aiMgrFile0->setPrim("prim1.prim");
aiMgrFile2->setName("aiMgrFile2");
aiMgrFile0->setPrim("prim2.prim");
aiMgrFile1->addChild(aiMgrInstance0);
aiMgrFile1->addChild(aiMgrInstance1);
//--------------------------------------
CAiMgr::addFile(aiMgrFile0);
CAiMgr::addFile(aiMgrFile1);
CAiMgr::addFile(aiMgrFile2);
}

@ -1,207 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//-------------------------------------------------------------------------
// some stuff for manageing the output of AI_MANAGER files
/*
===========================================================================
-------------------------------------------------------------------------
** Common methods of the following classes:
display(uint indent=0)
display the class and all of its child classes recursively
the indent parameter gives the display indentation depth
read()
read the class and its child classes from a file recursively
write()
write the class and its child classes to an output file recursively
test()
runs the class' test routine
-------------------------------------------------------------------------
** The list of classes includes:
CAiMgrSpawn - A spawn point or spawn zone within an ai manager
CAiMgrPopulation - A population of creatures within an ai manager
CAiMgrLocation - A location with type (eg grass, denn, etc) within an ai manager
CAiMgrInstance - An individual AI manager
CAiMgrFile - The collection of AI managers loaded from or to be saved to a file
CAiMgr - The singleton that contains the collection of CAiMgrFiles
===========================================================================
*/
//-------------------------------------------------------------------------
// includes
#include "nel/misc/types_nl.h"
#include "nel/misc/sheet_id.h"
#include <string>
#include <vector>
//-------------------------------------------------------------------------
// class to manage a spawn point or patat for an ai manager
class CAiMgrSpawn
{
public:
void setPlace(std::string place) {_place=place;}
public:
void display(uint indent=0,NLMISC::CLog *log = NLMISC::InfoLog);
void read();
void write(FILE *outf,uint indent);
void test();
private:
std::string _place; // names of patat or point (or x y z)
};
//-------------------------------------------------------------------------
// class to manage a bot population for an ai manager
class CAiMgrPopulation
{
public:
void setName(std::string name) {_name=name;}
void setType(NLMISC::CSheetId creatureType) {_creatureType=creatureType;}
void setQuantity(int quantity) {_quantity=quantity;}
void setOrientation(float orientation) {_orientation=orientation;}
void setSpawnRate(int minTimeMS, int maxTimeMS) {_minTime=minTimeMS; _maxTime=maxTimeMS;}
public:
void display(uint indent=0,NLMISC::CLog *log = NLMISC::InfoLog);
void read();
void write(FILE *outf,uint indent);
void test();
private:
std::string _name;
NLMISC::CSheetId _creatureType;
int _quantity;
float _orientation;
int _minTime;
int _maxTime;
};
//-------------------------------------------------------------------------
// class to manage a location patat for an ai manager
class CAiMgrLocation
{
public:
void setName(std::string name) {_name=name;}
void setType(std::string type) {_type=type;}
void setBoundary(std::string boundary) {_boundary=boundary;}
public:
void display(uint indent=0,NLMISC::CLog *log = NLMISC::InfoLog);
void read();
void write(FILE *outf,uint indent);
void test();
private:
std::string _name;
std::string _type;
std::string _boundary;
};
//-------------------------------------------------------------------------
// class to manage an instance of an ai manager
class CAiMgrInstance
{
public:
void setName(const std::string &name) {_name=name;}
void setBoundary(const std::string &boundary) {_boundary=boundary;}
void setCreatureLimit(int creatureLimit) {_creatureLimit=creatureLimit;}
void addSpawn(CAiMgrSpawn *spawn) {_spawn.push_back(spawn);}
void addPopulation(CAiMgrPopulation *population) {_population.push_back(population);}
void addLocation(CAiMgrLocation *location) {_location.push_back(location);}
void addChild(CAiMgrInstance *mgr) {_children.push_back(mgr);}
public:
void display(uint indent=0,NLMISC::CLog *log = NLMISC::InfoLog);
void read();
void write(FILE *outf,uint indent);
void test();
private:
std::string _name;
std::string _boundary;
int _creatureLimit;
std::vector <CAiMgrSpawn *> _spawn;
std::vector <CAiMgrPopulation *> _population;
std::vector <CAiMgrLocation *> _location;
std::vector <CAiMgrInstance *> _children;
};
//-------------------------------------------------------------------------
// class to manage the set of ai managers stored in a given file
class CAiMgrFile
{
public:
void setName(std::string filename) {_filename=filename;}
void setPrim(std::string primFilename) {_primFilename=primFilename;}
void addChild(CAiMgrInstance *mgr) {_children.push_back(mgr);}
public:
const std::string &getName() {return _filename;}
const std::string &getPrim() {return _primFilename;}
const CAiMgrInstance *getChild(uint i) {return _children[i];}
uint getChildCount() {return _children.size();}
public:
void display(uint indent=0,NLMISC::CLog *log = NLMISC::InfoLog);
void read();
void write();
void test();
private:
std::string _filename;
std::string _primFilename;
std::vector <CAiMgrInstance *> _children;
};
//-------------------------------------------------------------------------
// singleton manager of CAiMgrFile instances
class CAiMgr
{
public:
static void addFile(CAiMgrFile *file) {_files.push_back(file);}
public:
static void display(uint indent=0,NLMISC::CLog *log = NLMISC::InfoLog);
static void read(std::string path,bool recursive=true);
static void write();
static void test();
private:
static std::vector <CAiMgrFile *> _files;
};
//-------------------------------------------------------------------------

File diff suppressed because it is too large Load Diff

@ -1,230 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef NL_COMMAND_EVENT_MANAGER_H
#define NL_COMMAND_EVENT_MANAGER_H
#include "nel/misc/types_nl.h"
#include "nel/misc/common.h"
#include "nel/misc/debug.h"
#include "nel/misc/command.h"
#include "nel/misc/eval_num_expr.h"
#include "nel/net/unified_network.h"
#include <map>
#include <vector>
#include <string>
/**
* A Manager that triggers events and is receptive to events
* \author Benjamin Legros
* \author Nevrax France
* \date 2001
*/
class CCommandEventManager
{
friend void cbProcessScriptEvent( NLNET::CMessage& msgin, const std::string &serviceName, uint16 serviceId );
public:
/// A type of variable, basically consisting in a name and a value (as a string)
typedef std::pair<std::string, std::string> TVar;
/// The variable environment of a script
class CEnvironment : public NLMISC::CEvalNumExpr
{
private:
/// The map type of vars
typedef std::map<std::string, std::string> TVarMap;
/// The map of vars itself
TVarMap _Map;
/// The empty string
std::string _Empty;
public:
CEnvironment() : _Empty("") {}
/// Clear the whole environment
void clear() { _Map.clear(); }
/// Checks if var exists
bool exists(const std::string &var) { return _Map.find(var) != _Map.end(); }
/// Get the value of a var
const std::string &get(const std::string &var) { TVarMap::iterator it=_Map.find(var); return (it!=_Map.end()) ? (*it).second : _Empty; }
/// Set the value of a var
const std::string &set(const std::string &var, const std::string &value)
{
std::pair<TVarMap::iterator, bool> res = _Map.insert(std::make_pair(var, value));
if (!res.second)
(*(res.first)).second = value;
return (*(res.first)).second;
}
/// Erases a var
void erase(const std::string &var) { _Map.erase(var); }
/// Replaces text by value in string (variable must have the form $(variable) to be replaced by their value)
std::string replace(const std::string &text);
protected:
virtual NLMISC::CEvalNumExpr::TReturnState evalValue(const char *value, double &result)
{
TVarMap::iterator it;
if (*value == '?')
{
it = _Map.find(value+1);
if (it == _Map.end())
result = 0.0;
else
result = 1.0;
return NLMISC::CEvalNumExpr::NoError;
}
else
{
it = _Map.find(value);
if (it == _Map.end())
return NLMISC::CEvalNumExpr::UnkownValue;
result = atof((*it).second.c_str());
return NLMISC::CEvalNumExpr::NoError;
}
}
};
class CScript;
/// A script node
class CScriptNode
{
public:
enum EState
{
Ok,
Error,
Halt,
};
/// The line in the script for this node
uint Line;
/// Current running script
CScriptNode *CurrentRun;
/// The root script
CScript *Root;
public:
/// default constructor
CScriptNode() : Line(0), CurrentRun(NULL) {}
/// virtual destructor
virtual ~CScriptNode() {}
/// Execute the script node, returns the next node to be executed, or NULL if script finished
virtual EState execute(CEnvironment &env) = 0;
protected:
/// Execute current node (previous run returned halt)
EState goOnCurrentRun(CEnvironment &env)
{
if (!CurrentRun)
return Error;
EState state = CurrentRun->execute(env);
if (state == Ok)
CurrentRun = NULL;
return state;
}
/// Execute child
EState executeChild(CScriptNode* child, CEnvironment &env)
{
EState state = child->execute(env);
if (state == Halt || state == Error)
CurrentRun = child;
return state;
}
};
/// The script class that receives events, generates events, and triggers commands
class CScript
{
public:
/// The name of the script
std::string Name;
/// The script environment
CEnvironment Environment;
/// The script text
CScriptNode *Root;
/// Verbosity
bool Verbose;
/// Constructor.
CScript(const std::string &name) : Name(name), Verbose(false) {}
///
bool parse(const char *text);
/// Inits script before execution with no default parameters
void init() { init(std::vector<TVar>()); }
/// Inits script before execution, using default parameters
void init(const std::vector<TVar> &initVars)
{
uint i;
for (i=0; i<initVars.size(); ++i)
Environment.set(initVars[i].first, initVars[i].second);
}
/// Runs script till it is finished or it waits for an event
bool run();
};
private:
typedef std::map<std::string, CScript*> TScriptMap;
static TScriptMap _RunningScripts;
static std::string _Empty;
public:
static void init();
static void release();
static bool update();
static bool runScript(const std::string &scriptName, const std::string &scriptFile, bool verbose=false);
static bool stopScript(const std::string &scriptName);
static const std::string &getVarInScript(const std::string &scriptName, const std::string &varName);
static void setVarInScript(const std::string &scriptName, const std::string &varName, const std::string &value);
static void eraseVarInScript(const std::string &scriptName, const std::string &varName);
static void sendEvent(const std::string &var, const std::string &value);
static void setScriptVerbose(const std::string &scriptName, bool verbosity=true);
private:
/// Constructor
CCommandEventManager();
protected:
//
static void processEvent(const std::string &var, const std::string &value);
};
#endif // NL_COMMAND_EVENT_MANAGER_H
/* End of command_event_manager.h */

File diff suppressed because it is too large Load Diff

@ -1,105 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// Misc
#include "nel/misc/path.h"
#include "nel/misc/file.h"
#include "nel/misc/smart_ptr.h"
#include "nel/misc/command.h"
// Georges
//#include "nel/georges/u_form.h"
//#include "nel/georges/u_form_elm.h"
//#include "nel/georges/u_form_loader.h"
#include "nel/georges/load_form.h"
// Local
#include "creatures.h"
///////////
// USING //
///////////
using namespace NLMISC;
using namespace std;
using namespace NLGEORGES;
namespace AGS_TEST
{
//-------------------------------------------------------------------------
// the singleton data
std::map<CSheetId,CCreatures::CCreatureRecord> CCreatures::_creatures;
bool CCreatures::_initialised=false;
//-------------------------------------------------------------------------
// init
void CCreatures::init()
{
if (_initialised)
return;
std::vector<std::string> filters;
filters.push_back("creature");
filters.push_back("player");
loadForm(filters, "ags.packed_sheets", _creatures);
_initialised=true;
}
//-------------------------------------------------------------------------
// display
void CCreatures::display()
{
nlassert(_initialised);
std::map<CSheetId,CCreatures::CCreatureRecord>::iterator it;
for(it=_creatures.begin();it!=_creatures.end();++it)
{
nlinfo("CREATURE: %s Walk: %f Run: %f",(*it).first.toString().c_str(),
(*it).second._walkSpeed,(*it).second._runSpeed);
}
}
//-------------------------------------------------------------------------
// lookup
const CCreatures::CCreatureRecord *CCreatures::lookup( CSheetId id )
{
nlassert(_initialised);
// setup an iterator and lookup the sheet id in the map
std::map<CSheetId,CCreatures::CCreatureRecord>::iterator it;
it=_creatures.find(id);
// if we found a valid entry return a pointer to the creature record otherwise 0
if (it!=_creatures.end())
return &((*it).second);
else
return 0;
}
} // end of namespace AGS_TEST

@ -1,88 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef AGST_CREATURE_H
#define AGST_CREATURE_H
// Nel Misc
#include "nel/misc/types_nl.h"
#include "nel/misc/smart_ptr.h"
#include "nel/georges/u_form.h"
#include "nel/georges/u_form_elm.h"
// Game share
#include "nel/misc/sheet_id.h"
namespace AGS_TEST
{
/**
* Singleton containing database on information on creatures
* \author Sadge
* \author Nevrax France
* \date 2002
*/
class CCreatures
{
public:
class CCreatureRecord
{
public:
CCreatureRecord () : _walkSpeed(1.3f), _runSpeed(6.0f) {}
float _walkSpeed;
float _runSpeed;
void readGeorges (const NLMISC::CSmartPtr<NLGEORGES::UForm> &form, const NLMISC::CSheetId &sheetId)
{
// the form was found so read the true values from George
form->getRootNode ().getValueByName (_walkSpeed, "Basics.MovementSpeeds.WalkSpeed");
form->getRootNode ().getValueByName (_runSpeed, "Basics.MovementSpeeds.RunSpeed");
}
void serial (NLMISC::IStream &s)
{
s.serial (_walkSpeed, _runSpeed);
}
static uint getVersion () { return 1; }
};
// load the creature data from the george files
static void init();
// display the creature data for all known creature types
static void display();
// get a creature data record from the database
static const CCreatureRecord *lookup( NLMISC::CSheetId id );
private:
// prohibit cnstructor as this is a singleton
CCreatures();
static std::map<NLMISC::CSheetId,CCreatureRecord> _creatures;
static bool _initialised;
};
} // end of namespace AGS_TEST
#endif // AGST_CREATURE_H
/* End of creatures.h */

@ -1,579 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
typedef char * TFileName;
TFileName IGFiles[]=
{
"10_ai.ig",
"10_aj.ig",
"10_ak.ig",
"10_al.ig",
"10_am.ig",
"10_an.ig",
"10_ao.ig",
"10_ap.ig",
"10_aq.ig",
"10_ar.ig",
"10_as.ig",
"10_at.ig",
"10_au.ig",
"10_av.ig",
"10_aw.ig",
"10_ax.ig",
"10_ay.ig",
"10_az.ig",
"10_ba.ig",
"10_bb.ig",
"10_bc.ig",
"10_bd.ig",
"10_be.ig",
"11_ai.ig",
"11_aj.ig",
"11_ak.ig",
"11_al.ig",
"11_am.ig",
"11_an.ig",
"11_ao.ig",
"11_ap.ig",
"11_aq.ig",
"11_ar.ig",
"11_as.ig",
"11_at.ig",
"11_au.ig",
"11_av.ig",
"11_aw.ig",
"11_ax.ig",
"11_ay.ig",
"11_az.ig",
"11_ba.ig",
"11_bb.ig",
"11_bc.ig",
"11_bd.ig",
"11_be.ig",
"12_ai.ig",
"12_aj.ig",
"12_ak.ig",
"12_al.ig",
"12_am.ig",
"12_an.ig",
"12_ao.ig",
"12_ap.ig",
"12_aq.ig",
"12_ar.ig",
"12_as.ig",
"12_at.ig",
"12_au.ig",
"12_av.ig",
"12_aw.ig",
"12_ax.ig",
"12_ay.ig",
"12_az.ig",
"12_ba.ig",
"12_bb.ig",
"12_bc.ig",
"12_bd.ig",
"13_ai.ig",
"13_aj.ig",
"13_ak.ig",
"13_al.ig",
"13_am.ig",
"13_an.ig",
"13_ao.ig",
"13_ap.ig",
"13_aq.ig",
"13_ar.ig",
"13_as.ig",
"13_at.ig",
"13_au.ig",
"13_av.ig",
"13_aw.ig",
"13_ax.ig",
"13_ay.ig",
"13_az.ig",
"13_ba.ig",
"14_aj.ig",
"14_ak.ig",
"14_al.ig",
"14_am.ig",
"14_an.ig",
"14_ao.ig",
"14_ap.ig",
"14_aq.ig",
"14_ar.ig",
"14_as.ig",
"14_at.ig",
"14_au.ig",
"14_av.ig",
"14_aw.ig",
"14_ax.ig",
"15_al.ig",
"15_am.ig",
"15_an.ig",
"15_ao.ig",
"15_ap.ig",
"15_aq.ig",
"15_ar.ig",
"15_as.ig",
"15_at.ig",
"15_au.ig",
"15_av.ig",
"15_aw.ig",
"16_am.ig",
"16_an.ig",
"16_ao.ig",
"16_ap.ig",
"16_aq.ig",
"16_ar.ig",
"16_as.ig",
"16_at.ig",
"16_au.ig",
"16_av.ig",
"16_aw.ig",
"17_am.ig",
"17_an.ig",
"17_ao.ig",
"17_ap.ig",
"17_as.ig",
"17_at.ig",
"17_au.ig",
"17_av.ig",
"17_aw.ig",
"17_ax.ig",
"17_ay.ig",
"17_az.ig",
"18_at.ig",
"18_au.ig",
"18_av.ig",
"18_aw.ig",
"18_ax.ig",
"18_ay.ig",
"18_az.ig",
"19_at.ig",
"19_au.ig",
"19_av.ig",
"19_aw.ig",
"19_ax.ig",
"19_ay.ig",
"19_az.ig",
"19_ba.ig",
"19_bb.ig",
"20_au.ig",
"20_av.ig",
"20_aw.ig",
"20_ax.ig",
"20_ay.ig",
"20_az.ig",
"20_ba.ig",
"20_bb.ig",
"20_bc.ig",
"20_bd.ig",
"20_be.ig",
"21_aw.ig",
"21_ax.ig",
"21_ay.ig",
"21_az.ig",
"21_ba.ig",
"21_bb.ig",
"21_bc.ig",
"21_bd.ig",
"21_be.ig",
"22_aw.ig",
"22_ax.ig",
"22_ay.ig",
"22_az.ig",
"22_ba.ig",
"22_bb.ig",
"22_bc.ig",
"22_bd.ig",
"22_be.ig",
"23_av.ig",
"23_aw.ig",
"23_ax.ig",
"23_ay.ig",
"23_az.ig",
"23_ba.ig",
"23_bb.ig",
"23_bc.ig",
"23_bd.ig",
"23_be.ig",
"24_av.ig",
"24_aw.ig",
"24_ax.ig",
"24_ay.ig",
"24_az.ig",
"24_ba.ig",
"24_bb.ig",
"24_bc.ig",
"24_bd.ig",
"24_be.ig",
"25_av.ig",
"25_aw.ig",
"25_ax.ig",
"25_ay.ig",
"25_az.ig",
"25_ba.ig",
"25_bb.ig",
"25_bc.ig",
"26_az.ig",
"26_ba.ig",
"26_bb.ig",
"26_bc.ig",
"26_bd.ig",
"26_be.ig",
"26_bf.ig",
"27_az.ig",
"27_ba.ig",
"27_bb.ig",
"27_bc.ig",
"27_bd.ig",
"27_be.ig",
"27_bf.ig",
"28_az.ig",
"28_ba.ig",
"28_bb.ig",
"28_bc.ig",
"28_bd.ig",
"28_be.ig",
"28_bf.ig",
"29_bb.ig",
"29_bc.ig",
"29_bd.ig",
"29_be.ig",
"29_bf.ig",
"30_bb.ig",
"30_bc.ig",
"30_bd.ig",
"30_be.ig",
"30_bf.ig",
"31_ay.ig",
"31_az.ig",
"31_ba.ig",
"31_bb.ig",
"31_bc.ig",
"31_bd.ig",
"31_be.ig",
"32_ax.ig",
"32_ay.ig",
"32_az.ig",
"32_ba.ig",
"32_bb.ig",
"32_bc.ig",
"32_bd.ig",
"32_be.ig",
"32_bf.ig",
"33_aw.ig",
"33_ax.ig",
"33_ay.ig",
"33_az.ig",
"33_ba.ig",
"33_bb.ig",
"33_bc.ig",
"33_bd.ig",
"33_be.ig",
"33_bf.ig",
"34_aw.ig",
"34_ax.ig",
"34_ay.ig",
"34_az.ig",
"34_ba.ig",
"34_bb.ig",
"34_bc.ig",
"34_bd.ig",
"34_be.ig",
"34_bf.ig",
"34_bg.ig",
"35_av.ig",
"35_aw.ig",
"35_ax.ig",
"35_ay.ig",
"35_az.ig",
"35_ba.ig",
"35_bb.ig",
"35_bc.ig",
"35_bd.ig",
"35_be.ig",
"35_bf.ig",
"35_bg.ig",
"36_av.ig",
"36_aw.ig",
"36_ax.ig",
"36_ay.ig",
"36_az.ig",
"36_ba.ig",
"36_bb.ig",
"36_bc.ig",
"36_bd.ig",
"36_be.ig",
"36_bf.ig",
"36_bg.ig",
"36_bh.ig",
"36_bi.ig",
"36_bj.ig",
"36_bk.ig",
"36_bl.ig",
"36_bm.ig",
"37_aw.ig",
"37_ax.ig",
"37_ay.ig",
"37_az.ig",
"37_ba.ig",
"37_bb.ig",
"37_bc.ig",
"37_bd.ig",
"37_be.ig",
"37_bf.ig",
"37_bg.ig",
"37_bh.ig",
"37_bi.ig",
"37_bj.ig",
"37_bk.ig",
"37_bl.ig",
"37_bm.ig",
"38_aw.ig",
"38_ax.ig",
"38_ay.ig",
"38_az.ig",
"38_ba.ig",
"38_bb.ig",
"38_bd.ig",
"38_be.ig",
"38_bf.ig",
"38_bg.ig",
"38_bh.ig",
"38_bi.ig",
"38_bj.ig",
"38_bk.ig",
"38_bl.ig",
"38_bm.ig",
"39_aw.ig",
"39_ax.ig",
"39_ay.ig",
"39_az.ig",
"39_ba.ig",
"39_bb.ig",
"39_bf.ig",
"39_bg.ig",
"39_bh.ig",
"39_bi.ig",
"39_bj.ig",
"39_bk.ig",
"39_bl.ig",
"39_bm.ig",
"3_af.ig",
"3_ag.ig",
"3_ah.ig",
"3_ai.ig",
"3_aj.ig",
"3_ak.ig",
"3_bc.ig",
"3_bd.ig",
"3_be.ig",
"40_aw.ig",
"40_ax.ig",
"40_ay.ig",
"40_az.ig",
"40_ba.ig",
"40_bb.ig",
"40_bc.ig",
"40_bf.ig",
"40_bg.ig",
"40_bh.ig",
"40_bi.ig",
"40_bj.ig",
"40_bk.ig",
"40_bl.ig",
"40_bm.ig",
"41_aw.ig",
"41_ax.ig",
"41_ay.ig",
"41_az.ig",
"41_ba.ig",
"41_bb.ig",
"41_bc.ig",
"41_be.ig",
"41_bf.ig",
"41_bg.ig",
"41_bh.ig",
"41_bi.ig",
"41_bj.ig",
"41_bk.ig",
"42_ax.ig",
"42_ay.ig",
"42_az.ig",
"42_ba.ig",
"42_bb.ig",
"42_be.ig",
"42_bf.ig",
"42_bg.ig",
"42_bh.ig",
"42_bi.ig",
"42_bj.ig",
"42_bk.ig",
"43_ax.ig",
"43_ay.ig",
"43_az.ig",
"43_ba.ig",
"43_bb.ig",
"43_be.ig",
"43_bf.ig",
"43_bg.ig",
"43_bh.ig",
"43_bi.ig",
"43_bj.ig",
"43_bk.ig",
"44_bf.ig",
"44_bg.ig",
"44_bh.ig",
"44_bi.ig",
"44_bj.ig",
"44_bk.ig",
"45_bg.ig",
"45_bh.ig",
"45_bi.ig",
"45_bj.ig",
"45_bk.ig",
"46_bh.ig",
"46_bi.ig",
"46_bj.ig",
"46_bk.ig",
"46_bl.ig",
"47_bh.ig",
"47_bi.ig",
"47_bj.ig",
"47_bk.ig",
"47_bl.ig",
"48_bh.ig",
"48_bi.ig",
"48_bj.ig",
"48_bk.ig",
"48_bl.ig",
"49_bh.ig",
"49_bi.ig",
"49_bj.ig",
"4_ac.ig",
"4_ad.ig",
"4_ae.ig",
"4_af.ig",
"4_ag.ig",
"4_ah.ig",
"4_ai.ig",
"4_aj.ig",
"4_ak.ig",
"4_ay.ig",
"4_az.ig",
"4_ba.ig",
"4_bb.ig",
"4_bc.ig",
"4_bd.ig",
"4_be.ig",
"4_bf.ig",
"5_ac.ig",
"5_ad.ig",
"5_ae.ig",
"5_af.ig",
"5_ag.ig",
"5_ah.ig",
"5_ai.ig",
"5_aj.ig",
"5_ak.ig",
"5_al.ig",
"5_ay.ig",
"5_az.ig",
"5_ba.ig",
"5_bb.ig",
"5_bc.ig",
"5_bd.ig",
"5_be.ig",
"5_bf.ig",
"5_bg.ig",
"6_ac.ig",
"6_ad.ig",
"6_ae.ig",
"6_af.ig",
"6_ag.ig",
"6_ah.ig",
"6_ai.ig",
"6_aj.ig",
"6_ak.ig",
"6_al.ig",
"6_ay.ig",
"6_az.ig",
"6_ba.ig",
"6_bb.ig",
"6_bc.ig",
"6_bd.ig",
"6_be.ig",
"6_bf.ig",
"6_bg.ig",
"7_ac.ig",
"7_ad.ig",
"7_ae.ig",
"7_af.ig",
"7_ag.ig",
"7_ah.ig",
"7_ai.ig",
"7_aj.ig",
"7_ak.ig",
"7_al.ig",
"7_ay.ig",
"7_az.ig",
"7_ba.ig",
"7_bb.ig",
"7_bc.ig",
"7_bd.ig",
"7_be.ig",
"7_bf.ig",
"7_bg.ig",
"8_af.ig",
"8_ag.ig",
"8_ah.ig",
"8_ai.ig",
"8_aj.ig",
"8_ak.ig",
"8_ax.ig",
"8_ay.ig",
"8_az.ig",
"8_ba.ig",
"8_bb.ig",
"8_bc.ig",
"8_bd.ig",
"8_be.ig",
"9_af.ig",
"9_ag.ig",
"9_ah.ig",
"9_ai.ig",
"9_aj.ig",
"9_ak.ig",
"9_am.ig",
"9_an.ig",
"9_ao.ig",
"9_ap.ig",
"9_aq.ig",
"9_ar.ig",
"9_as.ig",
"9_at.ig",
"9_au.ig",
"9_av.ig",
"9_ax.ig",
"9_ay.ig",
"9_az.ig",
"9_ba.ig",
"9_bb.ig",
"9_bc.ig",
"9_bd.ig",
"9_be.ig"
};

@ -1,53 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "nel/misc/common.h"
#include <string>
#include "ig_loader.h"
#include "ig_list.h"
using namespace NL3D;
using namespace NLMISC;
using namespace std;
void CIGLoader::load()
{
for (int i=sizeof(IGFiles)/sizeof(IGFiles[0]);i--;)
{
try
{
uint k;
CInstanceGroup ig;
CIFile inputStream;
if (!inputStream.open(IGFiles[i]))
{
nlinfo("unable to open %s", argv[1]);
return -1;
}
ig.serial(inputStream);
CVector gpos = ig.getGlobalPos(); // the origin for the ig
for(k = 0; k < ig._InstancesInfos.size(); ++k)
{
nlinfo("instance %s : x = %.1f, y = %.1f, z = %.1f, sx = %.1f, sy = %.1f, sz = %.1f", ig._InstancesInfos[k].Name.c_str(), ig._InstancesInfos[k].Pos.x + gpos.x, ig._InstancesInfos[k].Pos.y + gpos.y, ig._InstancesInfos[k].Pos.z + gpos.z, ig._InstancesInfos[k].Scale.x, ig._InstancesInfos[k].Scale.y, ig._InstancesInfos[k].Scale.z);
}
}
catch (std::exception &e)
{
nlinfo(e.what());
}
}
}

@ -1,136 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// Nel Misc
// #include "nel/misc/command.h"
// #include "nel/misc/path.h"
// Game share
//#include "game_share/sid.h"
// Local headers
#include "macro_manager.h"
using namespace NLMISC;
//using namespace NLNET;
using namespace std;
namespace AGS_TEST
{
//------------------------------------------------------------------------
// static data for CMacroManager
std::vector<CMacroManager::CMacro> CMacroManager::_macros;
bool CMacroManager::_recording=false;
//------------------------------------------------------------------------
// basic functionality for CMacroManager singleton
void CMacroManager::init()
{
}
void CMacroManager::release()
{
_macros.clear();
}
//---------------------------------------------------------------------------------
// display functions
void CMacroManager::listMacros(NLMISC::CLog *log)
{
log->displayNL("Macro list:");
std::vector<CMacro>::iterator it;
for (it=_macros.begin(); it!=_macros.end(); ++it)
{
log->displayNL("\t%s",(*it)._name.c_str());
}
}
void CMacroManager::displayMacro(const std::string &name, NLMISC::CLog *log)
{
std::vector<CMacro>::iterator it;
for (it=_macros.begin(); it!=_macros.end(); ++it)
{
if ((*it)._name==name)
{
log->displayNL("MACRO: %s",name.c_str());
std::vector<CMacroManager::CMacro::TMacroCommand>::iterator mit;
for(mit=(*it)._commands.begin();mit!=(*it)._commands.end();++mit)
{
std::string hold;
std::vector<std::string>::iterator ait;
for(ait=(*mit)._args.begin();ait!=(*mit)._args.end();++ait)
hold=hold+std::string(" ")+(*ait);
log->displayNL("\t\t%s",hold.c_str());
}
}
}
}
//---------------------------------------------------------------------------------
void CMacroManager::recordMacro(const std::string &name)
{
// if a macro already exists by this name then delete it
std::vector<CMacro>::iterator it;
for (it=_macros.begin(); it!=_macros.end(); ++it)
{
if ((*it)._name==name)
{
_macros.erase(it);
break;
}
}
// create the new macro record
CMacroManager::CMacro newMacro;
newMacro._name=name;
_macros.push_back(newMacro);
// setup the recording flag
_recording=true;
}
void CMacroManager::record(NLMISC::ICommand *command,const std::vector<std::string> &args)
{
_macros[_macros.size()-1].record(command,args);
}
//---------------------------------------------------------------------------------
void CMacroManager::execute(const std::string &name, NLMISC::CLog &log)
{
std::vector<CMacro>::iterator it;
for (it=_macros.begin(); it!=_macros.end(); ++it)
if ((*it)._name==name)
{
nlinfo("Executing macro: %s",name.c_str());
(*it).execute(log);
return;
}
}
} // end of namespace AGS_TEST

@ -1,99 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef GD_MACRO_MANAGER_H
#define GD_MACRO_MANAGER_H
// Nel Misc
#include "nel/misc/types_nl.h"
#include "nel/misc/command.h"
namespace AGS_TEST
{
/**
* Singleton, for managing the macros in a scene
* \author Sadge
* \author Nevrax France
* \date 2002
*/
class CMacroManager
{
public:
// initialisation and housekeeping for the singleton
static void init();
static void release();
// methods dealing with macro recording
static void recordMacro(const std::string &name);
static void record(NLMISC::ICommand *command,const std::vector<std::string> &args);
static void stopRecord() { _recording=false; }
static bool recording() { return _recording; }
// executing a macro
static void execute(const std::string &name, NLMISC::CLog &log);
// display functions
static void listMacros(NLMISC::CLog *log = NLMISC::InfoLog);
static void displayMacro(const std::string &name,NLMISC::CLog *log = NLMISC::InfoLog);
private:
class CMacro
{
public:
std::string _name;
typedef struct
{
NLMISC::ICommand *_command;
std::vector<std::string> _args;
} TMacroCommand;
std::vector<TMacroCommand> _commands;
void record(NLMISC::ICommand *command,const std::vector<std::string> &args)
{
TMacroCommand newCommand;
newCommand._command=command;
newCommand._args=args;
_commands.push_back(newCommand);
}
void execute(NLMISC::CLog &log)
{
std::vector<TMacroCommand>::iterator it;
for(it=_commands.begin();it!=_commands.end();++it)
it->_command->execute(it->_args, log, true);
}
};
// forbid instantiation
CMacroManager();
static std::vector<CMacro> _macros;
static bool _recording;
};
#define COMMAND_MACRO_RECORD_TEST\
if (CMacroManager::recording()) {CMacroManager::record(this,args); return true;}
} // end of namespace AGS_TEST
#endif // GD_MACRO_MANAGER_H
/* End of macro_manager.h */

@ -1,197 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// include files
#include "nel/misc/types_nl.h"
#include "nel/misc/vectord.h"
#include "game_share/tick_event_handler.h"
#include "messages.h"
#include "mirrors.h"
#include "actor_manager.h"
using namespace NLMISC;
using namespace NLNET;
using namespace AGS_TEST;
//-------------------------------------------------------------------------
// the callback table
/*
static void cbEngageFight( NLNET::CMessage& msgin, const std::string &serviceName, uint16 serviceId );
static void cbUpdateFightBehaviour( NLNET::CMessage& msgin, const std::string &serviceName, uint16 serviceId );
static void cbUpdateFightPosition( NLNET::CMessage& msgin, const std::string &serviceName, uint16 serviceId );
static void cbUpdateFightEnd( NLNET::CMessage& msgin, const std::string &serviceName, uint16 serviceId );
static void cbAckVisionZone( NLNET::CMessage& msgin, const std::string &serviceName, uint16 serviceId );
static void cbAIVision( NLNET::CMessage& msgin, const std::string &serviceName, uint16 serviceId );
TUnifiedCallbackItem CbArray[] =
{
{ "ENGAGE_FIGHT", cbEngageFight, },
{ "U_FIGHT_BEHAVIOUR", cbUpdateFightBehaviour, },
{ "U_FIGHT_POS", cbUpdateFightPosition, },
{ "U_END_FIGHT", cbUpdateFightEnd, },
{ "U_FIGHT_END", cbUpdateFightEnd, },
{ "ACK_VISION_ZONE", cbAckVisionZone, },
{ "AGENT_VISION", cbAIVision, },
};
*/
//-------------------------------------------------------------------------
// singleton initialisation and release
void CMessages::init()
{
// setup the callback array
//CUnifiedNetwork::getInstance()->addCallbackArray( CbArray, sizeof(CbArray)/sizeof(CbArray[0]) );
}
void CMessages::release()
{
}
//--------------------------------------------------------------------------
// incoming message callbacks
/*
static void cbEngageFight( NLNET::CMessage& msgin, const std::string &serviceName, uint16 serviceId )
{
CEntityId aggressor, target;
msgin.serial(aggressor);
msgin.serial(target);
CActor *actor=CActorManager::getActor(target);
if (actor)
{
nlinfo("Responding to ENGAGE_FIGHT: %s %s",aggressor.toString().c_str(),target.toString().c_str());
actor->doFight(aggressor);
}
else
nlinfo("Ignoring ENGAGE_FIGHT: %s %s",aggressor.toString().c_str(),target.toString().c_str());
}
static void cbUpdateFightBehaviour( NLNET::CMessage& msgin, const std::string &serviceName, uint16 serviceId )
{
nlinfo("Received U_FIGHT_BEHAVIOUR - ** Message not treated **");
}
static void cbUpdateFightPosition( NLNET::CMessage& msgin, const std::string &serviceName, uint16 serviceId )
{
// forwarding position updates from CMS to GPMS
// nlinfo("Received U_FIGHT_POS: length=%i pos=%i",msgin.length(),msgin.getPos() );
// this vector contais the body of the output messsage
CMessage msgout("UPDATE_ENTITIES_POS");
CMessage msgoutCMS("U_FIGHT_POS");
bool CMSChanges=false;
bool GPMSChanges=false;
// parse the input message
TGameCycle cycle = CTickEventHandler::getGameCycle();
while (msgin.length()>(unsigned)msgin.getPos())
{
CEntityId id;
CVectorD pos;
float theta;
msgin.serial(id,pos, theta);
// make sure that the actor is one of ours and doesn't belong to another service
CActor *pactor = CActorManager::getActor(id);
if (pactor!=0)
{
// check pos
if (pactor->testPositionInPatat(pos))
{
sint32 x=(sint32)(pos.x*1000.0);
sint32 y=(sint32)(pos.y*1000.0);
sint32 z=(sint32)(pos.z*1000.0);
//float angle=pactor->getAngle();
msgout.serial(id,x,y,z,theta,cycle);
GPMSChanges=true;
}
else
{
pos=CVectorD(CMirrors::x(id),CMirrors::y(id),CMirrors::z(id));
sint32 x = CMirrors::x(id);
sint32 y = CMirrors::y(id);
sint32 z = CMirrors::z(id);
float angle=pactor->getAngle();
msgoutCMS.serial(id,x,y,z,angle,cycle);
CMSChanges=true;
}
}
}
// create and send the output message
if (GPMSChanges) sendMessageViaMirror( "GPMS", msgout );
if (CMSChanges) sendMessageViaMirror( "CMS", msgoutCMS );
}
static void cbUpdateFightEnd( NLNET::CMessage& msgin, const std::string &serviceName, uint16 serviceId )
{
// dealing with end of fight
// nlinfo("Received U_FIGHT_END: length=%i pos=%i",msgin.length(),msgin.getPos() );
while (msgin.length()>(unsigned)msgin.getPos())
{
// get actor id
CEntityId id;
msgin.serial(id);
// set actor to wandering mode
CActor *actor = CActorManager::getActor(id);
if (actor)
{
nlinfo("Received U_FIGHT_END for actor: %s (%s)",id.toString().c_str(), actor->getName().c_str());
actor->resetActivity();
// at combat end, recover position from mirror (get the last fight position)
actor->setPos(CMirrors::x(actor->getSid()), CMirrors::y(actor->getSid()), CMirrors::z(actor->getSid()));
// actor->doWander();
}
else
{
nlinfo("Received U_FIGHT_END for unknown actor: %s",id.toString().c_str());
}
}
}
//
static void cbAIVision( NLNET::CMessage& msgin, const std::string &serviceName, uint16 serviceId )
{
CMoveManager::processAIVision(msgin);
}
//
static void cbAckVisionZone( NLNET::CMessage& msgin, const std::string &serviceName, uint16 serviceId )
{
CActorManager::addVisionService(serviceId);
}
*/

@ -1,36 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef RY_AGST_MESSAGES_H
#define RY_AGST_MESSAGES_H
#include "game_share/msg_brick_service.h"
class CMessages
{
public:
// singleton initialisation and release
static void init();
static void release();
private:
};
#endif // RY_AGST_MESSAGES_H

@ -1,138 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "mirrors.h"
#include <nel/net/unified_network.h>
#include "game_share/ryzom_entity_id.h"
//#include <nel/misc/command.h>
using namespace std;
using namespace NLMISC;
using namespace NLNET;
using namespace MBEHAV;
//static inits
CMirror CMirrors::Mirror;
CMirroredDataSet *CMirrors::DataSet = NULL;
/*
* Initialisation 2
*/
void cbMirrorIsReady( CMirror *mirror )
{
CMirrors::initMirror();
}
/*
* Initialisation 1
*/
void CMirrors::init( void (*cbUpdate)(), void (*cbSync)(), void (*cbRelease)() )
{
// Init the mirror system
vector<string> datasetNames;
datasetNames.push_back( "fe_temp" );
Mirror.init( datasetNames, cbMirrorIsReady, cbUpdate, cbSync, cbRelease );
// register the service up and service down callbacks
CUnifiedNetwork::getInstance()->setServiceUpCallback("*", cbServiceUp, 0);
CUnifiedNetwork::getInstance()->setServiceDownCallback( "*", cbServiceDown, 0);
}
/*
* Init after the mirror init
*/
void CMirrors::initMirror()
{
Mirror.declareEntityTypeOwner( RYZOMID::npc, 10000 );
Mirror.declareEntityTypeOwner( RYZOMID::creature, 10000 );
DataSet = &(Mirror.getDataSet("fe_temp"));
DataSet->declareProperty( "X", PSOReadWrite );
DataSet->declareProperty( "Y", PSOReadWrite );
DataSet->declareProperty( "Z", PSOReadWrite );
DataSet->declareProperty( "Theta", PSOReadWrite );
DataSet->declareProperty( "Sheet", PSOReadWrite ); // read/write
DataSet->declareProperty( "Mode", PSOReadWrite );
DataSet->declareProperty( "Behaviour", PSOReadOnly );
DataSet->declareProperty( "VisualPropertyA", PSOReadWrite );
DataSet->declareProperty( "WhoSeesMe", PSOReadWrite );
DataSet->declareProperty( "RiderEntity", PSOReadOnly );
DataSet->declareProperty( "TargetList", PSOReadWrite );
Mirror.setNotificationCallback( CMirrors::processMirrorUpdates );
// Note: here we don't call initRyzomVisualPropertyIndices(), so we won't be able to used the
// DSProperty* "constants" in this service
}
void CMirrors::processMirrorUpdates()
{
DataSet->processAddedEntities();
DataSet->processRemovedEntities();
}
void CMirrors::release()
{
// Calling the destructor explicitely, not waiting for the end
Mirror.release();
}
void CMirrors::cbServiceUp( const std::string& serviceName, uint16 serviceId, void * )
{
}
void CMirrors::cbServiceDown( const std::string& serviceName, uint16 serviceId, void * )
{
}
/*
* Test of CMirrorPropValueList
*/
/*NLMISC_COMMAND( testMirrorList, "", "" )
{
CEntityId id = CEntityId( RYZOMID::npc, 99987, 0x82, 0x85 );
CMirrors::Mirror.addEntity( id, true );
TDataSetRow datasetRow = TheDataset.getDataSetRow( id );
CMirrorPropValueList<TDataSetRow> list( TheDataset, id, "TargetList" );
log.displayNL( "SIZE %u", list.size() );
list.resize( 2 );
log.displayNL( "SIZE %u", list.size() );
list.push_front( datasetRow );
CMirrorPropValueList<TDataSetRow>::iterator it;
log.displayNL( "SIZE %u", list.size() );
for ( it=list.begin(); it!=list.end(); ++it )
log.displayNL( "%u", (*it)().getIndex() );
list.resize( 2 );
log.displayNL( "SIZE %u", list.size() );
for ( it=list.begin(); it!=list.end(); ++it )
log.displayNL( "%u", (*it)().getIndex() );
list.push_front( datasetRow );
log.displayNL( "SIZE %u", list.size() );
list.resize( 4 );
log.displayNL( "SIZE %u", list.size() );
for ( it=list.begin(); it!=list.end(); ++it )
log.displayNL( "%u", (*it)().getIndex() );
return true;
}*/

@ -1,65 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef RY_CMS_MIRRORS_H
#define RY_CMS_MIRRORS_H
// include files
#include "nel/misc/types_nl.h"
#include "nel/misc/entity_id.h"
#include "nel/misc/sheet_id.h"
#include "game_share/mode_and_behaviour.h"
#include "game_share/mirror.h"
#include "game_share/mirror_prop_value.h"
class CMirrors
{
public:
// singleton initialisation and release
static void init( void (*cbUpdate)(), void (*cbSync)()=NULL, void (*cbRelease)() = NULL );
static void initMirror();
static void processMirrorUpdates();
static void release();
static bool exists( const NLMISC::CEntityId& id ) { return (DataSet->getDataSetRow( id ).isValid()); }
static sint32 x( const NLMISC::CEntityId& id ) { CMirrorPropValueRO<sint32> value( *DataSet, id, "X" ); return (sint32)value(); }
static sint32 y( const NLMISC::CEntityId& id ) { CMirrorPropValueRO<sint32> value( *DataSet, id, "Y" ); return (sint32)value(); }
static sint32 z( const NLMISC::CEntityId& id ) { CMirrorPropValueRO<sint32> value( *DataSet, id, "Z" ); return (sint32)value(); }
static sint32 mode( const NLMISC::CEntityId& id ) { CMirrorPropValueRO<uint64> value( *DataSet, id, "Mode" ); return (sint32)(MBEHAV::TMode(value()).Mode); }
static sint32 behaviour( const NLMISC::CEntityId& id ) { CMirrorPropValueRO<uint32> value( *DataSet, id, "Behaviour" ); return (uint32)value(); }
static void initSheet( const NLMISC::CEntityId& id, const NLMISC::CSheetId& sheetId ) { CMirrorPropValue<uint32> value( *DataSet, id, "Sheet" ); value = sheetId.asInt(); }
static NLMISC::CSheetId sheet( const NLMISC::CEntityId& id ) { CMirrorPropValueRO<uint32> value( *DataSet, id, "Sheet" ); return NLMISC::CSheetId(value()); }
private:
// callbacks used at service connection and disconnection
static void cbServiceUp( const std::string& serviceName, uint16 serviceId, void * );
static void cbServiceDown( const std::string& serviceName, uint16 serviceId, void * );
public:
static CMirror Mirror;
static CMirroredDataSet *DataSet;
};
#define TheDataset (*CMirrors::DataSet)
#endif // RY_CMS_MIRRORS_H

@ -1,444 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef NL_MOVE_GRID_H
#define NL_MOVE_GRID_H
#include "nel/misc/types_nl.h"
#include "nel/misc/vector.h"
#include "nel/misc/aabbox.h"
#include "nel/misc/block_memory.h"
/**
* A list of object that must have Next and Previous pointers
* \param T the type of item
* \param TPtr a pointer to T to use in list (useful for smartpointer)
*/
template<class TT, class TPtr = TT*>
class CMoveGridObjectList
{
public:
TPtr Head;
TPtr Tail;
CMoveGridObjectList() : Head(NULL), Tail(NULL) {}
void insertAtHead(TT *object)
{
nlassert(object->Next == NULL);
nlassert(object->Previous == NULL);
object->Next = Head;
if (object->Next != NULL)
object->Next->Previous = object;
Head = object;
}
void insertAtTail(TT *object)
{
nlassert(object->Next == NULL);
nlassert(object->Previous == NULL);
object->Previous = Tail;
if (object->Previous != NULL)
object->Previous->Next = object;
Tail = object;
}
void remove(TT *object)
{
// if object at head
if (object->Previous == NULL)
Head = object->Next;
else
object->Previous->Next = object->Next;
// if object at tail
if (object->Next == NULL)
Tail = object->Previous;
else
object->Next->Previous = object->Previous;
object->Previous = NULL;
object->Next = NULL;
}
TT *getHead() { return (TT*)Head; }
TT *getTail() { return (TT*)Tail; }
};
/**
* Move grid, allows to select moving entities fast (template parameter CSIZE is in millimeter)
* \author Benjamin Legros
* \author Nevrax France
* \date 2001
*/
template<typename T, int CELLS, int CSIZE>
class CMoveGrid
{
public:
class CIterator;
friend class CIterator;
protected:
class CCellNode;
class CNode;
public:
/// Constructor
CMoveGrid();
/// Destructor
~CMoveGrid();
/// Insert an element in move grid. Return an iterator towards the inserted object
CIterator insert(const T &object, const NLMISC::CVector &position);
/// Move an object in grid.
void move(CIterator &it, const NLMISC::CVector &position);
/// Remove
void remove(CIterator &it);
void insertNode(CIterator &it, sint x, sint y);
void removeNode(CIterator &it);
/// select
void select(const NLMISC::CVector &position);
/// select
void select(const NLMISC::CAABBox &bbox);
/// begin
CIterator begin();
/// end
CIterator end();
/// clearSelection
void clearSelection();
/// round value so it is a half of a segment
double round(double v)
{
const double INV = 1000.0 / (double)CSIZE;
return (floor(v*INV)+0.5)*(double)CSIZE*0.001;
}
protected:
sint convert(float v)
{
const float INV = 1000.0f / (float)CSIZE;
return (sint)(v*INV);
}
sint convertGrid(float v)
{
const float INV = 1000.0f / (float)CSIZE;
return (sint)(v*INV)&(CELLS-1);
}
sint convertGrid(sint v)
{
return v&(CELLS-1);
}
void select(sint X, sint Y);
protected:
/// A node that contains an objects.
typedef CMoveGridObjectList<CNode> TNodeList;
/// A node that is a cell, containing a list of node inside this cell.
typedef CMoveGridObjectList<CCellNode> TCellNodeList;
class CCellNode
{
public:
sint X, Y;
sint GridX, GridY;
TNodeList NodeList;
CCellNode *Previous, *Next;
CCellNode *Selection;
CCellNode() : X(0), Y(0), GridX(0), GridY(0), Previous(NULL), Next(NULL), Selection(NULL) {}
};
class CNode
{
public:
CCellNode *Root;
CNode *Previous, *Next;
T Object;
CNode() : Previous(NULL), Next(NULL), Root(NULL) {}
};
/// The map of cell nodes
TCellNodeList _Grid[CELLS][CELLS];
/// The first selected cell node
CCellNode *_Selection;
/// The allocator of nodes
NLMISC::CBlockMemory<CNode> _NodeAllocator;
/// The allocator of cell nodes
NLMISC::CBlockMemory<CCellNode> _CellNodeAllocator;
public:
class CIterator
{
friend class CMoveGrid<T, CELLS, CSIZE>;
public:
CIterator(CNode *node = NULL) : _Node(node) {}
CIterator(const CIterator &it) : _Node(it._Node) {}
T & operator * () { return _Node->Object; }
CIterator & operator ++ ()
{
if (_Node->Next != NULL)
{
_Node = _Node->Next;
}
else
{
CCellNode *nextCell = _Node->Root->Selection;
_Node = NULL;
// iterate till we have a non empty selected cell
while (nextCell != NULL && (_Node = nextCell->NodeList.getHead()) == NULL)
nextCell = nextCell->Selection;
}
return *this;
}
CIterator operator ++ (int)
{
CIterator ret(_Node);
++(*this);
return ret;
}
bool operator == (const CIterator &it) const { return it._Node == _Node; }
bool operator != (const CIterator &it) const { return !(*this == it); }
CIterator operator = (const CIterator &it) { _Node = it._Node; return *this; }
protected:
CNode *_Node;
};
};
//
// TEMPLATE IMPLEMENTATION
//
//
template<typename T, int CELLS, int CSIZE>
CMoveGrid<T, CELLS, CSIZE>::CMoveGrid()
{
_Selection = NULL;
}
//
template<typename T, int CELLS, int CSIZE>
CMoveGrid<T, CELLS, CSIZE>::~CMoveGrid()
{
sint i, j;
for (i=0; i<CELLS; ++i)
{
for (j=0; j<CELLS; ++j)
{
TCellNodeList &list = _Grid[i][j];
CCellNode *cellNode;
CNode *node;
while ((cellNode = list.getHead()) != NULL)
{
while ((node = cellNode->NodeList.getHead()) != NULL)
{
cellNode->NodeList.remove(node);
_NodeAllocator.freeBlock(node);
}
list.remove(cellNode);
_CellNodeAllocator.freeBlock(cellNode);
}
}
}
}
//
template<typename T, int CELLS, int CSIZE>
void CMoveGrid<T, CELLS, CSIZE>::insertNode(CIterator &it, sint x, sint y)
{
sint gridX, gridY;
gridX = convertGrid(x);
gridY = convertGrid(y);
CCellNode *cellNode = _Grid[gridX][gridY].getHead();
while (cellNode != NULL && (cellNode->X != x || cellNode->Y != y))
cellNode = cellNode->Next;
if (cellNode == NULL)
{
cellNode = _CellNodeAllocator.allocate();
_Grid[gridX][gridY].insertAtHead(cellNode);
cellNode->X = x;
cellNode->Y = y;
cellNode->GridX = gridX;
cellNode->GridY = gridY;
}
it._Node->Root = cellNode;
cellNode->NodeList.insertAtHead(it._Node);
}
//
template<typename T, int CELLS, int CSIZE>
void CMoveGrid<T, CELLS, CSIZE>::removeNode(CIterator &it)
{
it._Node->Root->NodeList.remove(it._Node);
}
//
template<typename T, int CELLS, int CSIZE>
typename CMoveGrid<T, CELLS, CSIZE>::CIterator CMoveGrid<T, CELLS, CSIZE>::insert(const T &object, const NLMISC::CVector &position)
{
CNode *node = _NodeAllocator.allocate();
sint X, Y;
X = convert(position.x);
Y = convert(position.y);
node->Object = object;
CIterator it(node);
insertNode(it, X, Y);
return CIterator(node);
}
template<typename T, int CELLS, int CSIZE>
void CMoveGrid<T, CELLS, CSIZE>::move(CIterator &it, const NLMISC::CVector &position)
{
sint X, Y;
X = convert(position.x);
Y = convert(position.y);
CNode *node = it._Node;
if (X == node->Root->X && Y == node->Root->Y)
return;
removeNode(it);
insertNode(it, X, Y);
}
template<typename T, int CELLS, int CSIZE>
void CMoveGrid<T, CELLS, CSIZE>::remove(CIterator &it)
{
CNode *node = it._Node;
removeNode(it);
it._Node = NULL;
_NodeAllocator.free(node);
}
template<typename T, int CELLS, int CSIZE>
void CMoveGrid<T, CELLS, CSIZE>::select(const NLMISC::CVector &position)
{
select(convert(position.x), convert(position.y));
}
template<typename T, int CELLS, int CSIZE>
void CMoveGrid<T, CELLS, CSIZE>::select(const NLMISC::CAABBox &bbox)
{
sint x0, x1;
sint y0, y1;
x0 = convert(bbox.getCenter().x-bbox.getHalfSize().x);
x1 = convert(bbox.getCenter().x+bbox.getHalfSize().x);
y0 = convert(bbox.getCenter().y-bbox.getHalfSize().y);
y1 = convert(bbox.getCenter().y+bbox.getHalfSize().y);
sint x, y;
for (y=y0; y<=y1; ++y)
for (x=x0; x<=x1; ++x)
select(x, y);
}
template<typename T, int CELLS, int CSIZE>
void CMoveGrid<T, CELLS, CSIZE>::select(sint x, sint y)
{
sint gx = convertGrid(x),
gy = convertGrid(y);
CCellNode *cellNode = _Grid[gx][gy].getHead();
while (cellNode != NULL && (cellNode->X != x || cellNode->Y != y))
cellNode = cellNode->Next;
if (cellNode != NULL && cellNode->NodeList.getHead() != NULL)
{
cellNode->Selection = _Selection;
_Selection = cellNode;
}
}
template<typename T, int CELLS, int CSIZE>
typename CMoveGrid<T, CELLS, CSIZE>::CIterator CMoveGrid<T, CELLS, CSIZE>::begin()
{
return (_Selection != NULL) ? CIterator(_Selection->NodeList.getHead()) : CIterator(NULL);
}
template<typename T, int CELLS, int CSIZE>
typename CMoveGrid<T, CELLS, CSIZE>::CIterator CMoveGrid<T, CELLS, CSIZE>::end()
{
return CIterator(NULL);
}
template<typename T, int CELLS, int CSIZE>
void CMoveGrid<T, CELLS, CSIZE>::clearSelection()
{
CCellNode *cellNode = _Selection;
_Selection = NULL;
while (cellNode != NULL)
{
CCellNode *nd = cellNode;
cellNode = cellNode->Selection;
nd->Selection = NULL;
}
}
#endif // NL_MOVE_GRID_H
/* End of move_grid.h */

@ -1,220 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "move_manager.h"
#include "nel/misc/config_file.h"
#include "nel/net/service.h"
#include "sheets.h"
#include "nel/misc/file.h"
#include "nel/misc/path.h"
#include "game_share/ryzom_entity_id.h"
//
//#include "nel/3d/u_instance_group.h"
#include "sheets.h"
// ugly
#include "game_share/ig_list.h"
#include "game_share/used_continent.h"
using namespace std;
using namespace NLMISC;
using namespace NLPACS;
using namespace NLNET;
namespace AGS_TEST
{
// the actor grid
CMoveManager::TObstacleGrid CMoveManager::Grid;
// the continents
CContinentContainer CMoveManager::Continents;
//
CMoveManager::TObstacleMap CMoveManager::ObstacleMap;
//
CMoveManager::TPrimZoneMap CMoveManager::PrimZoneMap;
// init
void CMoveManager::init()
{
// init continents
Continents.init(30, 30, 8.0, 2, IService::getInstance()->WriteFilesDirectory);
// load continents
CUsedContinent::TUsedContinentCont usedCont = CUsedContinent::instance().getContinents();
for (uint i=0; i<usedCont.size(); ++i)
{
Continents.loadContinent(usedCont[i].ContinentName, usedCont[i].ContinentName, usedCont[i].ContinentInstance);
Continents.getMoveContainer(usedCont[i].ContinentInstance)->setAsStatic(0);
}
/* CConfigFile::CVar& cvUsedContinents = IService::getInstance()->ConfigFile.getVar("UsedContinents");
uint i;
for (i=0; (sint)i<cvUsedContinents.size(); ++i)
if (cvUsedContinents.asString(i) != "")
{
Continents.loadContinent(cvUsedContinents.asString(i), cvUsedContinents.asString(i), i);
Continents.getMoveContainer(i)->setAsStatic(0);
}
*/
/*
// load trees ig
for (i=sizeof(IGFiles)/sizeof(IGFiles[0]);i--;)
{
try
{
NL3D::UInstanceGroup *ig = NL3D::UInstanceGroup::createInstanceGroup(IGFiles[i]);
if (ig == NULL)
continue;
uint k;
for(k = 0; k < ig->getNumInstance(); ++k)
{
const string &name = ig->getShapeName(k);
sint sz = name.size();
if (sz >= 6 && strlwr(name.substr(sz-6, 6)) == ".shape")
{
const CSheets::CSheet *sheet = CSheets::lookup(CSheetId(ig->getInstanceName(k)));
CObstacle obstacle;
obstacle.Id = CEntityId(RYZOMID::flora, 0xDEADF00D, IService::getInstance()->getServiceId(), IService::getInstance()->getServiceId());
obstacle.Position = ig->getInstancePos(k);
obstacle.Radius = (sheet != NULL) ? sheet->Radius : 0.5f;
Grid.insert(obstacle, obstacle.Position);
}
}
delete ig;
}
catch (std::exception &e)
{
nlinfo(e.what());
}
}
*/
}
// update
void CMoveManager::update()
{
uint i;
for (i=0; (sint)i<Continents.size(); ++i)
if (Continents.getMoveContainer(i) != NULL)
{
Continents.getMoveContainer(i)->evalCollision(1, 0);
Continents.getMoveContainer(i)->evalCollision(1, 1);
}
}
// process ai vision
void CMoveManager::processAIVision(CMessage &msg)
{
TObstacleMap::iterator it;
for (it=ObstacleMap.begin(); it!=ObstacleMap.end(); ++it)
(*((*it).second)).Updated = false;
uint64 AgentId; // should be fakeid...
msg.serial( AgentId );
while (msg.getPos() < (sint32)(msg.length()))
{
CEntityId id;
TTime time;
CVectorD pos;
CVector heading;
float speed;
string sheetId;
// get all from message
msg.serial(id, time, pos, heading, speed, sheetId);
it = ObstacleMap.find(id);
if (it == ObstacleMap.end())
{
// if not exists yet, creates an obstacle
CObstacle obstacle;
obstacle.Id = id;
obstacle.Position = CVector(pos);
obstacle.Radius = 0.5f;
obstacle.External = true;
// get sheet from this sheetId
const CSheets::CSheet *sheet = CSheets::lookup(CSheetId(sheetId));
if (sheet != NULL)
obstacle.Radius = sheet->Radius;
//
nlinfo("New Object %s in IA vision at (%.1f,%.1f,%.1f), radius %.1f", id.toString().c_str(), pos.x, pos.y, pos.z, obstacle.Radius);
// insert in grid
TObstacleGrid::CIterator ito = Grid.insert(obstacle, obstacle.Position);
// insert in map
pair<TObstacleMap::iterator, bool> res = ObstacleMap.insert(make_pair<CEntityId, TObstacleGrid::CIterator>(id, ito));
/*
it = ObstacleMap.find(id);
nlassert(it != ObstacleMap.end());
*/
it = res.first;
}
else
{
(*((*it).second)).Position = pos;
Grid.move((*it).second, pos);
}
(*((*it).second)).Updated = true;
}
// erase not updated obstacles
for (it=ObstacleMap.begin(); it!=ObstacleMap.end(); )
{
if (!(*((*it).second)).Updated && (*((*it).second)).External)
{
nlinfo("Remove old object %s in IA vision", (*it).first.toString().c_str());
TObstacleMap::iterator itr = it++;
Grid.remove((*itr).second);
ObstacleMap.erase(itr);
}
else
{
++it;
}
}
}
// release
void CMoveManager::release()
{
// remove all continents
uint i;
for (i=0; (sint)i<Continents.size(); ++i)
Continents.removeContinent(i);
Continents.clear();
}
} // AGS_TEST
/* End of move_manager.cpp */

@ -1,127 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef NL_MOVE_MANAGER_H
#define NL_MOVE_MANAGER_H
#include "nel/misc/types_nl.h"
#include "nel/misc/vector.h"
#include "nel/net/message.h"
#include "nel/misc/entity_id.h"
#include "nel/ligo/primitive.h"
#include "move_grid.h"
#include "game_share/continent_container.h"
#include <map>
namespace AGS_TEST
{
class CObstacle
{
public:
CObstacle() : External(false), Updated(true) {}
NLMISC::CEntityId Id;
NLMISC::CVector Position;
float Radius;
bool External;
bool Updated;
};
/**
* Manager of a unique move grid
* \author Benjamin Legros
* \author Nevrax France
* \date 2002
*/
class CMoveManager
{
public:
/// The type of grid
typedef CMoveGrid<CObstacle, 256, 16000> TObstacleGrid;
/// A map of obstacle
typedef std::map<NLMISC::CEntityId, TObstacleGrid::CIterator> TObstacleMap;
/// A map of prim zone
typedef std::map<std::string, NLLIGO::CPrimZone> TPrimZoneMap;
public:
/// The grid
static TObstacleGrid Grid;
/// The continent container
static CContinentContainer Continents;
/// The obstacle map
static TObstacleMap ObstacleMap;
/// The prim zone map
static TPrimZoneMap PrimZoneMap;
public:
/// init
static void init();
/// update
static void update();
/// process ia vision from gpms
static void processAIVision(NLNET::CMessage &msg);
/// release
static void release();
/// Add a prim zone in map
static void addPrimZone(const NLLIGO::CPrimZone &primZone)
{
if (PrimZoneMap.find(primZone.getName()) == PrimZoneMap.end())
{
PrimZoneMap.insert(std::make_pair(primZone.getName(), primZone));
nlinfo("Using PrimZone '%s'", primZone.getName().c_str());
}
else
{
nlwarning("PrimZone '%s' already added, abort...", primZone.getName().c_str());
}
}
/// get a prim zone by its name
static NLLIGO::CPrimZone *getPrimZone(const std::string &zoneName)
{
TPrimZoneMap::iterator it = PrimZoneMap.find(zoneName);
if (it == PrimZoneMap.end())
{
nlwarning("Couldn't find PrimZone '%s', abort...", zoneName.c_str());
return NULL;
}
return &((*it).second);
}
public:
};
} // AGS_TEST
#endif // NL_MOVE_MANAGER_H
/* End of move_manager.h */

@ -1,120 +0,0 @@
Alain's code
/****************************************************************\
****************************************************************
Alain's Command section
****************************************************************
\****************************************************************/
// Command for add an entity on the GPMS
NLMISC_COMMAND(add_entity,"Add entity to GPMS","entity Id, sheet Id, entity PosX(meters), entity PosY, entity PosZ, entity Theta angle")
{
// check args, if there s not the right number of parameter, return bad
if(args.size() != 6) return false;
// get the values
uint32 Id = atoi(args[0].c_str());
uint32 SheetId = atoi(args[1].c_str());
sint32 PosX = atoi(args[2].c_str()) * 1000; //coordinates are in millimeters
uint32 PosY = atoi(args[3].c_str()) * 1000;
sint32 PosZ = atoi(args[4].c_str()) * 1000;
float Theta = (float) atof(args[5].c_str()); //direction of entity in radian (direct angle in radian, front of is on +Y (0 = Y direction), all conversion is now made on client)
//normaly creature type, but FE not ready for properties of creature type, this constructor set dynamicId and creatorId to serviceId
// At this time they are no namespace for enum of entity type, this be corrected when i'm change Sid/EntityId class and move it in game_share
Sid sid( /*Sid::*/npc, Id);
//make the message for add entity and send it
CMessage msgout("ADD_ENTITY");
msgout.serial( sid );
msgout.serial( PosX );
msgout.serial( PosY );
msgout.serial( PosZ );
msgout.serial( Theta );
NLMISC::TGameCycle tick = CTickEventHandler::getGameCycle();
//msgout.serial( tick ); //Chaine of time is not complete, must be made in shortly
msgout.serial( SheetId );
CUnifiedNetwork::getInstance()->send( "GPMS", msgout );
return true;
}
// Command for remove an entity on the GPMS
NLMISC_COMMAND(remove_entity,"Remove entity to GPMS","entity Id")
{
// check args, if there s not the right number of parameter, return bad
if(args.size() != 1) return false;
// get the values
uint32 Id = atoi(args[0].c_str());
//normaly creature type, but FE not ready for properties of creature type, this constructor set dynamicId and creatorId to serviceId
// At this time they are no namespace for enum of entity type, this be corrected when i'm change Sid/EntityId class and move it in game_share
Sid sid( /*Sid::*/npc, Id);
CMessage msgout("REMOVE_ENTITY");
msgout.serial( sid );
CUnifiedNetwork::getInstance()->send( "GPMS", msgout );
return true;
}
// Command for update position of an entity, remember pacs constraintes reduce the max move in one ticks at two cells (2*16 meters)
NLMISC_COMMAND(update_position,"Update position of an entity","entity Id, entity PosX(meters), entity PosY, entity PosZ, entity Theta angle")
{
// check args, if there s not the right number of parameter, return bad
if(args.size() != 5) return false;
// get the values
uint32 Id = atoi(args[0].c_str());
sint32 PosX = atoi(args[1].c_str()) * 1000; //coordinates are in millimeters
uint32 PosY = atoi(args[2].c_str()) * 1000;
sint32 PosZ = atoi(args[3].c_str()) * 1000;
float Theta = (float) atof(args[4].c_str()); //direction of entity in radian (direct angle in radian, front of is on +Y (0 = Y direction), all conversion is now made on client)
//normaly creature type, but FE not ready for properties of creature type, this constructor set dynamicId and creatorId to serviceId
// At this time they are no namespace for enum of entity type, this be corrected when i'm change Sid/EntityId class and move it in game_share
Sid sid( /*Sid::*/npc, Id);
CMessage msgout("UPDATE_ENTITY_POS");
msgout.serial( sid );
msgout.serial( PosX );
msgout.serial( PosY );
msgout.serial( PosZ );
msgout.serial( Theta );
NLMISC::TGameCycle tick = CTickEventHandler::getGameCycle();
msgout.serial( tick );
CUnifiedNetwork::getInstance()->send( "GPMS", msgout );
return true;
}
// Command for teleport an entity to new position, no limit of distance to move
NLMISC_COMMAND(teleportation,"Teleport entity to gived position","entity Id, entity PosX(meters), entity PosY, entity PosZ, entity Theta angle")
{
// check args, if there s not the right number of parameter, return bad
if(args.size() != 5) return false;
// get the values
uint32 Id = atoi(args[0].c_str());
sint32 PosX = atoi(args[1].c_str()) * 1000; //coordinates are in millimeters
uint32 PosY = atoi(args[2].c_str()) * 1000;
sint32 PosZ = atoi(args[3].c_str()) * 1000;
float Theta = (float) atof(args[4].c_str()); //direction of entity in radian (direct angle in radian, front of is on +Y (0 = Y direction), all conversion is now made on client)
//normaly creature type, but FE not ready for properties of creature type, this constructor set dynamicId and creatorId to serviceId
// At this time they are no namespace for enum of entity type, this be corrected when i'm change Sid/EntityId class and move it in game_share
Sid sid( /*Sid::*/npc, Id);
CMessage msgout("ENTITY_TELEPORTATION");
msgout.serial( sid );
msgout.serial( PosX );
msgout.serial( PosY );
msgout.serial( PosZ );
msgout.serial( Theta );
NLMISC::TGameCycle tick = CTickEventHandler::getGameCycle();
msgout.serial( tick );
CUnifiedNetwork::getInstance()->send( "GPMS", msgout );
return true;
}

@ -1,206 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "position_generator.h"
#include <nel/misc/debug.h>
namespace AGS_TEST
{
// instantiating static class variables
int CPositionGenerator::_x=0;
int CPositionGenerator::_y=0;
int CPositionGenerator::_dx=0;
int CPositionGenerator::_dy=0;
int CPositionGenerator::_spacing=0;
std::string CPositionGenerator::_pattern("grid");
int CPositionGenerator::_linelen=0;
int CPositionGenerator::_leftonline=0;
std::string CPositionGenerator::_spawnZoneName="";
CPositionGenerator::TSpawnZoneMap CPositionGenerator::_spawnZones;
CPositionGenerator::TSpawnPointMap CPositionGenerator::_spawnPoints;
void CPositionGenerator::setPositionInMM(int x, int y)
{
_x=x;
_y=y;
_linelen=0;
_leftonline=0;
init();
nlinfo("Set spawn position to: %d, %d", (_x+500)/1000, (_y+500)/1000);
}
void CPositionGenerator::setPosition(int x, int y)
{
setPositionInMM(1000*x,1000*y);
}
void CPositionGenerator::setPosition(std::string spawnName) // name of a spawn point or spawn zone
{
if (_spawnPoints.find(spawnName)!=_spawnPoints.end())
{
setPositionInMM( (int)(_spawnPoints[spawnName].Point.x*1000.0f), (int)(_spawnPoints[spawnName].Point.y*1000.0f) );
}
else if (_spawnZones.find(spawnName)!=_spawnZones.end())
{
_spawnZoneName=spawnName;
setPattern("spawnZone");
NLMISC::CVector v=_spawnZones[_spawnZoneName].getNext();
setPositionInMM((int)(v.x*1000.0f),(int)(v.y*1000.0f));
nlinfo("Set spawn Zone to: %s",_spawnZoneName.c_str());
}
else
{
nlinfo("Unknown spawn zone/point: %s",spawnName.c_str());
}
}
void CPositionGenerator::setSpacing(int spacing)
{
_spacing=1000*spacing;
init();
}
void CPositionGenerator::setPattern(const std::string &pattern)
{
_pattern=pattern;
init();
}
void CPositionGenerator::init()
{
_dx=_spacing;
_dy=0;
_linelen=0;
_leftonline=0;
}
void CPositionGenerator::next(int &x, int &y)
{
x=_x;
y=_y;
// nlinfo("Pattern: %s: dx: %d dy: %d spacing: %d",_pattern.c_str(),_dx,_dy,_spacing);
if (_pattern==std::string("grid"))
{
if (_leftonline)
_leftonline--;
else
{
if (_dx)
_linelen++;
_leftonline=_linelen;
_dx+=_dy;
_dy-=_dx;
_dx+=_dy;
}
_x+=_dx;
_y+=_dy;
}
else if (_pattern==std::string("line"))
{
_x+=_dx;
_y+=_dy;
}
else if (_pattern==std::string("spawnZone"))
{
NLMISC::CVector v=_spawnZones[_spawnZoneName].getNext();
_x=(int)(v.x*1000.0f);
_y=(int)(v.y*1000.0f);
}
else
nlwarning("Unknown pattern: %s",_pattern.c_str());
}
void CPositionGenerator::addSpawnZone(const NLLIGO::CPrimZone &zone)
{
if (_spawnZones[zone.getName()].Points.size()!=0)
{
nlinfo("Spawn zone already exists: %s",zone.getName().c_str());
return;
}
// determine the extents of the zone
float minx=(float)(((uint)~0)>>1);
float maxx=-minx-1.0f;
float miny=minx;
float maxy=maxx;
for (uint i=0;i<zone.VPoints.size();i++)
{
if (zone.VPoints[i].x<minx) minx=zone.VPoints[i].x;
if (zone.VPoints[i].x>maxx) maxx=zone.VPoints[i].x;
if (zone.VPoints[i].y<miny) miny=zone.VPoints[i].y;
if (zone.VPoints[i].y>maxy) maxy=zone.VPoints[i].y;
}
// round off the zone extents to centre the bounding box about the zone centre
const float SPACING=4.0f;
float xbase= ((maxx-minx)/2.0f+minx);
float ybase= ((maxx-minx)/2.0f+miny);
int xcount=(int)((maxx-xbase)/SPACING);
int ycount=(int)((maxy-ybase)/SPACING);
// loop through the points in the bounding box seeing whether or not they're in the zone
for (int xi=-xcount;xi<xcount+1; xi++)
for (int yi=-ycount;yi<ycount+1; yi++)
{
NLMISC::CVector v( xbase+SPACING*(float)xi, ybase+SPACING*(float)yi, 0);
if (zone.contains(v))
{
// we've got a point that is in the zone so add it to the spawn zone point array
_spawnZones[zone.getName()].Points.push_back(v);
}
}
// add code here to shuffle the points in the zone
// check that the zone's not empty
if (_spawnZones[zone.getName()].Points.size()!=0)
{
nlinfo("Spawn zone '%s' contains %d spawn points",zone.getName().c_str(), _spawnZones[zone.getName()].Points.size());
}
else
{
nlwarning("FAILED to generate any points for spawn zone: %s", zone.getName().c_str());
_spawnZones.erase(zone.getName());
}
}
std::string CPositionGenerator::getSpawnName()
{
if (_pattern==std::string("spawnZone"))
return _spawnZoneName;
else
{
char buf[100];
sprintf(buf,"%f %f %f",double(_x)*0.001,double(_y)*0.001,0);
return std::string(buf);
}
}
} // end of namespace AGS_TEST

@ -1,84 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef GD_POSITION_GENERATOR_H
#define GD_POSITION_GENERATOR_H
#include <string>
#include "nel/misc/types_nl.h"
#include "nel/ligo/primitive.h"
namespace AGS_TEST
{
class CPositionGenerator
{
public:
static void setPositionInMM(int x, int y); // x and y are in milimeters
static void setPosition(int x, int y); // x and y are in meters
static void setPosition(std::string spawnName); // name of a spawn point or spawn zone
static void setPattern(const std::string &pattern);
static void setSpacing(int spacing);
static void addSpawnPoint(const NLLIGO::CPrimPoint &point) { _spawnPoints[point.getName()]=point; }
static void addSpawnZone(const NLLIGO::CPrimZone &zone);
static void init();
static void next(int &x, int &y);
static std::string getSpawnName();
private:
class CSpawnZone
{
public:
uint Next;
std::vector<NLMISC::CVector> Points;
CSpawnZone(): Next(0) {}
const NLMISC::CVector& getNext()
{
if (Next>=Points.size()) Next=0;
return Points[Next++];
}
};
private:
static int _x, _y;
static int _dx, _dy;
static int _spacing;
static std::string _pattern;
static std::string _spawnZoneName;
typedef std::map<std::string, CSpawnZone> TSpawnZoneMap;
typedef std::map<std::string, NLLIGO::CPrimPoint> TSpawnPointMap;
static TSpawnZoneMap _spawnZones;
static TSpawnPointMap _spawnPoints;
// for grid
static int _linelen, _leftonline;
};
} // end of namespace AGS_TEST
#endif // GD_POSITION_GENERATOR_H

@ -1,144 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "nel/misc/types_nl.h"
#include "nel/net/service.h"
#include "nel/misc/path.h"
#include "game_share/tick_event_handler.h"
#include "game_share/ryzom_version.h"
#include "messages.h" // singleton manager for transport class messages
#include "mirrors.h" // singleton manager for data in mirrors
#include "sheets.h" // singleton manager for data from george forms
#include "move_manager.h" // singleton manager for agent movement
#include "command_event_manager.h"
//#include "combat_interface.h"
//#include "bot_chat_interface.h"
#include "actor_manager.h" // actor manager - the back end of the service
using namespace NLMISC;
using namespace NLNET;
using namespace std;
using namespace AGS_TEST;
static TUnifiedCallbackItem CallbackArray[] =
{
{ "QWERTY", 0, },
};
/*-----------------------------------------------------------------*\
SERVICE CLASS
\*-----------------------------------------------------------------*/
class CAgsTest : public NLNET::IService
{
public:
void init();
bool update();
void release() {}
void tickRelease();
};
// callback for the 'tick' update message
static void cbTick();
// callback for the 'tick' release message
void cbTickRelease()
{
(static_cast<CAgsTest*>(CAgsTest::getInstance()))->tickRelease();
}
/*-----------------------------------------------------------------*\
SERVICE INIT & RELEASE
\*-----------------------------------------------------------------*/
///init
void CAgsTest::init (void)
{
setVersion (RYZOM_VERSION);
// setup the update systems
// setUpdateTimeout(200);
// Load the sheet id lookup table
// init sub systems
CSheets::init();
CMirrors::init(cbTick, NULL, cbTickRelease);
CMessages::init();
CMoveManager::init();
CActorManager::init();
//CCombatInterface::init();
//CBotChatInterface::init();
CCommandEventManager::init();
// setup the debug filters
DebugLog->addNegativeFilter("NETL");
}
///release
void CAgsTest::tickRelease (void)
{
// release sub systems
CSheets::release();
CMessages::release();
CMoveManager::release();
CActorManager::release();
//CCombatInterface::release();
//CBotChatInterface::release();
CCommandEventManager::release();
CMirrors::release();
}
/*-----------------------------------------------------------------*\
SERVICE UPDATES
\*-----------------------------------------------------------------*/
///update called on each 'tick' message from tick service
void cbTick()
{
if ( CMirrors::Mirror.mirrorIsReady() )
{
CActorManager::update();
CMoveManager::update();
//CCombatInterface::_events.clear();
CCommandEventManager::update();
}
}
///update called every complete cycle of service loop
bool CAgsTest::update (void)
{
return true;
}
/*-----------------------------------------------------------------*\
NLNET_SERVICE_MAIN
\*-----------------------------------------------------------------*/
NLNET_SERVICE_MAIN (CAgsTest, "AGS", "ags_test_service", 0, CallbackArray, "", "")

@ -1,111 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// Misc
#include "nel/misc/path.h"
#include "nel/misc/file.h"
#include "nel/misc/smart_ptr.h"
#include "nel/misc/command.h"
#include "nel/misc/path.h"
// Georges
#include "nel/georges/u_form.h"
#include "nel/georges/u_form_elm.h"
#include "nel/georges/u_form_loader.h"
#include "nel/georges/load_form.h"
// Local
#include "sheets.h"
///////////
// USING //
///////////
using namespace NLMISC;
using namespace std;
using namespace NLGEORGES;
namespace AGS_TEST
{
//-------------------------------------------------------------------------
// the singleton data
std::map<CSheetId,CSheets::CSheet> CSheets::_Sheets;
bool CSheets::_Initialised=false;
//-------------------------------------------------------------------------
// init
void CSheets::init()
{
if (_Initialised)
return;
std::vector<std::string> filters;
filters.push_back("creature");
filters.push_back("player");
loadForm(filters, "data_shard/ags_test.packed_sheets", _Sheets);
_Initialised=true;
}
//-------------------------------------------------------------------------
// display
void CSheets::display(NLMISC::CLog *log)
{
nlassert(_Initialised);
std::map<CSheetId,CSheets::CSheet>::iterator it;
for(it=_Sheets.begin();it!=_Sheets.end();++it)
{
log->displayNL("SHEET:%s Walk:%f Run:%f Radius:%f Height:%f Bounding:%f Type:%s ChatType: %s",(*it).first.toString().c_str(),
(*it).second.WalkSpeed,
(*it).second.RunSpeed,
(*it).second.Radius,
(*it).second.Height,
(*it).second.BoundingRadius,
// (*it).second.Name.c_str(),
(*it).second.isNpc?"NPC": "CREATURE",
(std::string()+((*it).second.CanChatTP?"TP ":"")+((*it).second.CanChatTrade?"MERCHANT ":"")+((*it).second.CanChatMission?"MISSION ":"")).c_str()
);
}
}
//-------------------------------------------------------------------------
// lookup
const CSheets::CSheet *CSheets::lookup( CSheetId id )
{
nlassert(_Initialised);
// setup an iterator and lookup the sheet id in the map
std::map<CSheetId,CSheets::CSheet>::iterator it=_Sheets.find(id);
// if we found a valid entry return a pointer to the creature record otherwise 0
if (it!=_Sheets.end())
return &((*it).second);
else
return NULL;
}
} //namespace AGS_TEST

@ -1,178 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef RY_AGST_SHEETS_H
#define RY_AGST_SHEETS_H
// Nel Misc
#include "nel/misc/types_nl.h"
#include "nel/misc/smart_ptr.h"
#include "nel/misc/sheet_id.h"
///Nel Georges
#include "nel/georges/u_form.h"
#include "nel/georges/u_form_elm.h"
namespace AGS_TEST
{
/**
* Singleton containing database on information for actors
* \author Sadge
* \author Nevrax France
* \date 2002
*/
class CSheets
{
public:
class CSheet
{
public:
CSheet(): WalkSpeed(1.3f), RunSpeed(6.0f), Radius(0.5f), Height(2.0f), BoundingRadius(0.5) {}
uint32 Level; // Level of the creature
float AttackThreshold;
float FleeThreshold;
float SurvivalThreshold;
float WalkSpeed;
float RunSpeed;
float Radius; // pacs primitive's radius
float Height; // pacs primitive's height
float BoundingRadius; // fighting radius
bool isNpc; // is it an Npc or is it a creature?
bool CanChatTP; // true if can access chat teleport sub-menu
bool CanChatTrade; // true if can access chat trade sub-menu
bool CanChatMission; // true if can access chat mission sub-menu
// std::string Name;
void readGeorges (const NLMISC::CSmartPtr<NLGEORGES::UForm> &form, const NLMISC::CSheetId &sheetId)
{
const NLGEORGES::UFormElm *elmt = 0;
std::string s;
uint i;
// the form was found so read the true values from George
form->getRootNode ().getValueByName (WalkSpeed, "Basics.MovementSpeeds.WalkSpeed");
form->getRootNode ().getValueByName (RunSpeed, "Basics.MovementSpeeds.RunSpeed");
form->getRootNode ().getValueByName (Radius, "Collision.CollisionRadius");
form->getRootNode ().getValueByName (Height, "Collision.Height");
form->getRootNode ().getValueByName (BoundingRadius, "Collision.BoundingRadius");
form->getRootNode().getValueByName(Level, "Basics.Level");
form->getRootNode().getValueByName (AttackThreshold, "AI.IsA.combatif.seuil_attaque");
form->getRootNode().getValueByName (AttackThreshold, "AI.IsA.combatif.seuil_fuite");
form->getRootNode().getValueByName (SurvivalThreshold, "AI.IsA.combatif.poids_survie");
// form->getRootNode ().getValueByName (Name, "Basics.First Name");
// form->getRootNode ().getValueByName (s, "Basics.CharacterName");
// if (!Name.empty())
// Name+=' ';
// Name+=s;
// are we a creature or an NPC?
form->getRootNode ().getValueByName (s, "Basics.Race");
isNpc= s=="Fyros"? true:
s=="Tryker"? true:
s=="Zorai"? true:
s=="Matis"? true:
false;
// can we chat mission?
if (form->getRootNode ().getValueByName (s, "Basics.Race"))
CanChatMission= (s=="Kami");
// can we chat trade?
CanChatTrade=false;
for (i=1;i<5;++i)
{
if (form->getRootNode ().getValueByName (s, (std::string("ShopKeeper infos.ObjectType")+char('0'+i)).c_str()))
CanChatTrade|= (s!="UNDEFINED" && s!="Unknown" && !s.empty());
if (form->getRootNode ().getValueByName (s, (std::string("ShopKeeper infos.ObjectType")+char('0'+i)).c_str()))
CanChatTrade|= (s!="UNDEFINED" && s!="Unknown" && !s.empty());
}
if (form->getRootNode ().getNodeByName(&elmt,"ShopKeeper infos.Special Items") && elmt!=0)
{
uint arraySize;
elmt->getArraySize(arraySize);
CanChatTrade|= (arraySize!=0);
}
if (form->getRootNode ().getNodeByName(&elmt,"ShopKeeper infos.Special Mp") && elmt!=0)
{
uint arraySize;
elmt->getArraySize(arraySize);
CanChatTrade|= (arraySize!=0);
}
// can we chat TP?
form->getRootNode ().getValueByName (s, "ShopKeeper infos.TeleportType");
CanChatTP= (s!="NONE");
if (CanChatMission) nlinfo("bot can chat Mission: %s",sheetId.toString().c_str());
if (CanChatTrade) nlinfo("bot can chat Trade: %s",sheetId.toString().c_str());
if (CanChatTP) nlinfo("bot can chat TP: %s",sheetId.toString().c_str());
}
void serial (NLMISC::IStream &s)
{
s.serial (WalkSpeed, RunSpeed, Radius, Height);
s.serial (BoundingRadius, isNpc/*, Name*/);
s.serial (CanChatTP, CanChatTrade, CanChatMission);
s.serial (Level);
s.serial( AttackThreshold, FleeThreshold, SurvivalThreshold);
}
void removed() {}
static uint getVersion () { return 6; }
};
// load the creature data from the george files
static void init ();
static void removeUnsuableSheets ();
// display the creature data for all known creature types
static void display(NLMISC::CLog *log = NLMISC::InfoLog);
//
static void release() {}
// get a data record from the database
static const CSheet *lookup( NLMISC::CSheetId id );
private:
// prohibit cnstructor as this is a singleton
CSheets();
static std::map<NLMISC::CSheetId,CSheet> _Sheets;
static bool _Initialised;
};
} // end of namespace AGS_TEST
#endif // RY_AGST_SHEETS_H

@ -1,292 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "nel/misc/debug.h"
#include "nel/misc/path.h"
//#include <io.h>
#include <stdio.h>
#include "xml.h"
using namespace NLMISC;
static inline bool isBlank(char c)
{
static bool lookup[]=
{// 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F
0,0,0,0, 0,0,0,0, 0,1,1,0, 0,1,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0
1,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 32
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 64
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 96
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 128
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 160
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 192
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 224
};
return lookup[uint8(c)];
}
static inline bool isTxt(char c)
{
static bool lookup[]=
{// 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 1,1,1,1, 1,1,1,1, 1,1,0,0, 0,0,0,0, // 32
0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,1, // 64
0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,0, // 96
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 128
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 160
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 192
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 224
};
return lookup[uint8(c)];
}
static inline bool isArgTxt(char c)
{
static bool lookup[]=
{// 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F
0,0,0,0, 0,0,0,0, 0,1,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0
1,1,0,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 0,1,0,1, // 32
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // 64
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // 96
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // 128
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // 160
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // 192
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // 224
};
return lookup[uint8(c)];
}
static inline bool isFreeTxt(char c)
{
static bool lookup[]=
{// 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F
0,0,0,0, 0,0,0,0, 0,1,1,0, 0,1,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, // 0
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 0,1,0,1, // 32
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // 64
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // 96
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // 128
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // 160
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // 192
1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, // 224
};
return lookup[uint8(c)];
}
static bool xmlTxtToString(char *txt,uint length,std::string &destination)
{
bool result=true;
destination.erase();
destination.reserve(length);
for (char *ptr=txt;ptr<txt+length;ptr++)
if (ptr[0]=='&' && ptr[1]=='a' && ptr[2]=='m' && ptr[3]=='p' && ptr[4]==';')
{
destination+='&';
ptr+=4;
}
else if (ptr[0]=='&' && ptr[1]=='l' && ptr[2]=='t' && ptr[3]==';')
{
destination+='<';
ptr+=3;
}
else if (ptr[0]=='&' && ptr[1]=='g' && ptr[2]=='t' && ptr[3]==';')
{
destination+='>';
ptr+=3;
}
else if (ptr[0]=='&' && ptr[1]=='q' && ptr[2]=='u' && ptr[3]=='o' && ptr[4]=='t' && ptr[5]==';' )
{
destination+='\"';
ptr+=5;
}
else
{
result = result && (*ptr!='&');
destination+=*ptr;
}
return result;
}
bool CxmlNode::read(const std::string &filename)
{
// opening the file
FILE *inf=fopen(filename.c_str(),"rt");
if (inf==0)
{
nlwarning("Failed to open file for reading: %s",filename.c_str());
return false;
}
nlinfo("READING: %s",filename.c_str());
// allocate memmory for the read buffer
//uint bufsize=filelength(fileno(inf))+1;
uint32 bufsize = CFile::getFileSize(filename);
char *buf=new char[bufsize+1];
if (buf==0)
{
nlwarning("Failed to allocate memmory for input file: %s",filename.c_str());
fclose(inf);
return false;
}
// read the data into the buffer and nul terminate it
uint count;
count=fread(buf,bufsize,1,inf);
nlassert(count<bufsize);
buf[count]=0;
// close the file
fclose(inf);
// skip to the body of the file - if this is a true xml file there is only one body
char *ptr;
for (ptr=buf;*ptr!=0;ptr++)
{
if (ptr[0]=='<' && ptr[1]!='?')
break;
}
if (*ptr==0)
{
nlwarning("Failed to find XML file body for file: %s",filename.c_str());
delete [] (buf);
return false;
}
// pass parsing control over to the main xml file clause
bool retval= parseInput(ptr);
// make sure there's nothing left in the input data stream after parseInput() finishes
while (retval && isBlank(*ptr)) ptr++;
if (*ptr!=0)
retval=false;
// housekeeping and exit
delete [] (buf);
return retval;
}
bool CxmlNode::parseInput(char * &ptr)
{
// make sure this clause hasn't already been used
nlassert(_name.empty());
nlassert(_txt.empty());
char *marker0;
// if there's no start of clause marker consider we have free text
if (*ptr!='<')
{
for (;isFreeTxt(*ptr);ptr++) _txt+=*ptr;
// make sure the free text is followed by a clause marker of some sort
return (*ptr=='<');
}
// skip the opening '<' of the start of clause marker
*ptr++;
// if we have '<!' parse as comment to closing '>'
if (*ptr=='!')
{
while (isFreeTxt(*++ptr)) _txt+=*ptr;
// skip the end of comment marker
if (*ptr!='>')
return false;
ptr++;
return true;
}
// this should be a normal named clause so identify the clause name
while (isBlank(*ptr)) ptr++;
for (marker0=ptr; isTxt(*ptr); ptr++);
xmlTxtToString(marker0,ptr-marker0,_name);
// extract arguments
while (isBlank(*ptr)) ptr++;
while (isTxt(*ptr))
{
// extract the argument name for the next argument
for (marker0=ptr; isTxt(*ptr); ptr++);
std::string argName;
xmlTxtToString(marker0,ptr-marker0,argName);
// skip the '=' sign and following '"' sign
while (isBlank(*ptr)) ptr++;
if(*ptr!='=')
return false;
do { ptr++; }while (isBlank(*ptr));
if(*ptr!='\"')
return false;
ptr++;
// find the string delimited by the quotes
for (marker0=ptr; isArgTxt(*ptr); ptr++);
if(*ptr!='\"')
return false;
xmlTxtToString(marker0,ptr-marker0,_args[argName]);
// skip blanks in preparation for next arg (or end of args)
while (isBlank(*ptr)) ptr++;
}
// if this is a self-contained clause (ie '<'...'/>') then we've finished
if (*ptr=='/' && ptr[1]=='>')
{
ptr+=2;
return true;
}
// skip the end of clause header marker
if (*ptr!='>')
return false;
ptr++;
// read sub-clauses
while (*ptr && !(ptr[0]=='<'&&ptr[1]=='/'))
{
CxmlNode *childClause =new CxmlNode;
_children.push_back(childClause);
childClause->parseInput(ptr);
}
// skip the opening '</' of the clause end marker
if (!(ptr[0]=='<'&&ptr[1]=='/'))
return false;
ptr+=2;
// read the clause name and make sure it matches the original version
while (isBlank(*ptr)) ptr++;
for (marker0=ptr; isTxt(*ptr); ptr++);
std::string name;
xmlTxtToString(marker0,ptr-marker0,name);
if (name!=_name)
return false;
// skip the closing '>' of the clause end marker
while (isBlank(*ptr)) ptr++;
if (*ptr!='>')
return false;
ptr+=2;
return true;
}

@ -1,55 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "nel/misc/types_nl.h"
#include <string>
#include <vector>
#include <map>
class CxmlNode
{
public:
bool read(const std::string &filename);
bool parseInput(char * &ptr);
inline const std::string &txt() const { return _txt; }
inline const std::string &type() const { return _name; }
inline const std::string &arg(const std::string &argName) const
{
static std::string emptyString;
std::map<std::string,std::string>::const_iterator it;
it=_args.find(argName);
if (it!=_args.end())
return (*it).second;
else
return emptyString;
}
inline uint childCount() const { return _children.size(); }
inline CxmlNode *child(uint index) const { return _children[index]; }
private:
std::string _txt;
std::string _name;
std::map<std::string,std::string> _args;
std::vector<CxmlNode *> _children;
};

@ -1,24 +0,0 @@
FILE(GLOB SRC *.cpp *.h)
#LIST(REMOVE_ITEM SRC ${CMAKE_CURRENT_SOURCE_DIR}/ai_entity_id.cpp))
ADD_EXECUTABLE(ai_data_service WIN32 ${SRC})
INCLUDE_DIRECTORIES(${RZ_SERVER_SRC_DIR} ${MYSQL_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(ai_data_service
admin_modules
ryzom_gameshare
server_share
ai_share
nelmisc
nelnet
nelgeorges
nelpacs
nelligo)
NL_DEFAULT_PROPS(ai_data_service "Ryzom, Services: AI Data Service (AIDS)")
NL_ADD_RUNTIME_FLAGS(ai_data_service)
INSTALL(TARGETS ai_data_service RUNTIME DESTINATION sbin COMPONENT services)

@ -1,534 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <stdio.h>
//#include <direct.h>
#include <io.h>
#include "nel/misc/types_nl.h"
#include "nel/misc/path.h"
#include "nel/misc/file.h"
#include "nel/misc/i_xml.h"
#include "nel/misc/o_xml.h"
#include "nel/misc/config_file.h"
#include "nel/net/service.h"
#include "game_share/xml.h"
#include "ai_files.h"
#include "ai_manager.h"
using namespace NLMISC;
using namespace NLNET;
using namespace std;
//--------------------------------------------------------------------------------
// LOCAL GLOBALS - EQUIVALENT TO SINGLETON DATA
//--------------------------------------------------------------------------------
class CFileInfo
{
public:
std::string Source;
uint Size;
uint DateTime;
void clear()
{
Source.clear();
Size=0;
DateTime=0;
}
};
static CFileInfo mgrObjInfo[RYAI_AI_MANAGER_MAX_MANAGERS];
//--------------------------------------------------------------------------------
// scan() METHOD
//--------------------------------------------------------------------------------
// clear out the data strustures and rescan the directories listed in the config
// file for source and object files
void CAIFiles::scan()
{
uint i;
// clear out out the internal data tables before we begin
for (i=0;i<CAIManager::maxManagers();i++)
mgrObjInfo[i].clear();
CAIManager::liberateUnassignedManagers();
// scan the obj and sav paths for files
_scanObjAndSavFiles();
// iterate through the paths specified in the config file looking for src Files
std::vector<std::string> paths=srcPaths();
for (i = 0; i < paths.size(); i++)
{
nlinfo("SCANNING: %s",paths[i].c_str());
_scanSrcFiles(paths[i]);
}
// run through the managers in the AI_Manager singleton, updating parameters
for (i=0;i<CAIManager::numManagers();i++)
{
CAIManager *mgr=CAIManager::getManagerByIdx(i);
uint mgrId=mgr->id();
nlinfo("Manager: %04d: %s",mgrId,mgr->name().c_str());
}
}
//--------------------------------------------------------------------------------
// clean() METHOD
//--------------------------------------------------------------------------------
void CAIFiles::clean(sint mgrId)
{
remove(fullObjFileName(mgrId).c_str());
}
//--------------------------------------------------------------------------------
// FILE NAME HANDLING METHODS
//--------------------------------------------------------------------------------
//--------------------------------------------------------------------------------
// source file name, extension, etc
// the paths for source files
std::vector<std::string> CAIFiles::srcPaths()
{
std::vector<std::string> v;
try
{
CConfigFile::CVar& var = IService::getInstance()->ConfigFile.getVar("SrcPaths");
for (uint i = 0; i < var.size(); i++)
v.push_back(CPath::standardizePath(var.asString(i)));
}
catch(EUnknownVar &)
{
nlwarning("<SrcPaths> missing variables in config file, using '.'");
v.push_back(std::string("./"));
}
return v;
}
// the standard src extension
std::string CAIFiles::srcExtension()
{
return std::string("primitive");
}
// without path or extension
std::string CAIFiles::srcName(sint mgrId)
{
return CFile::getFilenameWithoutExtension(fullSrcFileName(mgrId));
}
// without path
std::string CAIFiles::srcFileName(sint mgrId)
{
return CFile::getFilename(fullSrcFileName(mgrId));
}
// without extension
std::string CAIFiles::fullSrcName(sint mgrId)
{
return
CFile::getPath(fullSrcFileName(mgrId))+
CFile::getFilenameWithoutExtension(fullSrcFileName(mgrId));
}
// with path and extension
std::string CAIFiles::fullSrcFileName(sint mgrId)
{
if (uint(mgrId)>=CAIManager::maxManagers())
{
nlwarning("CAIFiles::fullSrcFileName(mgrId): mgrId %d not in range 0..%d",mgrId,CAIManager::maxManagers()-1);
return string();
}
return mgrObjInfo[mgrId].Source;
}
//--------------------------------------------------------------------------------
// object file name, extension, etc
// the path for obj files
std::string CAIFiles::objPath()
{
std::string s;
// get the object path from the config file
try
{
s=IService::getInstance()->ConfigFile.getVar("ObjPath").asString();
}
catch(EUnknownVar &)
{
nlwarning("<ObjPath> missing variables in config file, using '.'");
}
// if we haven't found a path use the current directory
if (s.empty())
s="./";
return CPath::standardizePath(s);
}
// the standard obj file extension
std::string CAIFiles::objExtension()
{
return std::string("aimgr_obj");
}
// without path or extension
std::string CAIFiles::objName(sint mgrId)
{
if (uint(mgrId)>=CAIManager::maxManagers())
{
nlwarning("CAIFiles::fullSrcFileName(mgrId): mgrId %d not in range 0..%d",mgrId,CAIManager::maxManagers()-1);
return string();
}
std::string s;
s+=(mgrId/1000)+'0';
s+=(mgrId%1000)/100+'0';
s+=(mgrId%100)/10+'0';
s+=(mgrId%10)+'0';
return s;
}
// without extension
std::string CAIFiles::objFileName(sint mgrId)
{
// if the objName() method fails to generate a file name return an empty string
std::string s=objName(mgrId);
if (s.empty())
return s;
return s+'.'+objExtension();
}
// with path and extension
std::string CAIFiles::fullObjFileName(sint mgrId)
{
// if the objFileName() method fails to generate a file name return an empty string
std::string s=objFileName(mgrId);
if (s.empty())
return s;
return objPath()+s;
}
//--------------------------------------------------------------------------------
// saved data file name, extension, etc
// the path for sav files
std::string CAIFiles::savPath()
{
std::string s;
// get the sav path from the config file
try
{
s=IService::getInstance()->ConfigFile.getVar("SavPath").asString();
}
catch(EUnknownVar &)
{
nlwarning("<SavPath> missing variables in config file, using <ObjPath>");
return objPath();
}
// if we haven't found a path use the current directory
if (s.empty())
s="./";
return CPath::standardizePath(s);
}
// the standard sav file extension
std::string CAIFiles::savExtension()
{
return std::string("aimgr_sav");
}
// without path or extension
std::string CAIFiles::savName(sint mgrId)
{
return objName(mgrId);
}
// without extension
std::string CAIFiles::savFileName(sint mgrId)
{
// if the savName() method fails to generate a file name return an empty string
std::string s=savName(mgrId);
if (s.empty())
return s;
return s+'.'+savExtension();
}
// with path and extension
std::string CAIFiles::fullSavFileName(sint mgrId)
{
// if the savName() method fails to generate a file name return an empty string
std::string s=savName(mgrId);
if (s.empty())
return s;
return savPath()+s;
}
//--------------------------------------------------------------------------------
// CAIFiles PUBLIC METHODS - FOR READING & WRITING OBJ FILES
//--------------------------------------------------------------------------------
void CAIFiles::writeObjFile(sint mgrId)
{
// write the output file
NLMISC::COFile file;
bool fileIsOpen=false;
try
{
NLMISC::COXml output;
if (!file.open(fullObjFileName(mgrId))) throw(NLMISC::Exception());
fileIsOpen=true;
if (output.init (&file, "1.0"))
{
output.xmlPush("AI_MANAGER");
std::string src=CAIFiles::srcName(mgrId);
((NLMISC::IStream*)&output)->serial(src);
CAIManager::getManagerById(mgrId)->MgrDfnRootNode.serial(output);
output.xmlPop();
output.flush ();
}
}
catch (NLMISC::Exception &)
{
nlwarning("CAIFiles::writeObjFile(): Failed to write the output file: %s",fullObjFileName(mgrId).c_str());
}
// close file outside exception handling in case exception thrown somewhere strange
if (fileIsOpen)
file.close();
}
//--------------------------------------------------------------------------------
// CAIFiles PRIVATE METHODS - FOR ADDING FILE RECORDS TO RELAVENT DATA STRUCTURES
//--------------------------------------------------------------------------------
void CAIFiles::_addObjFile(sint mgrId, std::string fullFileName, uint timestamp)
{
// read the input file
NLMISC::CIFile file;
bool fileIsOpen=false;
try
{
NLMISC::CIXml input;
if (!file.open(fullObjFileName(mgrId))) throw(NLMISC::Exception());
fileIsOpen=true;
if (input.init (file))
{
input.xmlPush("AI_MANAGER");
((NLMISC::IStream*)&input)->serial(mgrObjInfo[mgrId].Source);
CAIManager::getManagerById(mgrId)->MgrDfnRootNode.serial(input);
input.xmlPop();
}
}
catch (NLMISC::Exception &)
{
nlwarning("CAIFiles::_addObjFile(): Failed to read the input file: %s",fullObjFileName(mgrId).c_str());
}
// close file outside exception handling in case exception thrown somewhere strange
if (fileIsOpen)
file.close();
// ask the ai manager to initialise itself with name 'name' (fails if manager is running)
if (!CAIManager::getManagerById(mgrId)->set(srcName(mgrId)))
{
nlwarning("Conflict between running manager %04d named '%s' and name in obj file '%s'",
mgrId,CAIManager::getManagerById(mgrId)->name().c_str(),srcName(mgrId).c_str());
return;
}
// assign the new record to the designated slot
mgrObjInfo[mgrId].DateTime=timestamp; // timestamp of obj file
// update the manager flags
CAIManager::getManagerById(mgrId)->setObjFileExists(true);
}
void CAIFiles::_addSavFile(sint mgrId, std::string fullFileName)
{
// open and parse the file
CxmlNode theXmlFile;
if (!theXmlFile.read(fullFileName))
{
nlwarning("Failed to parse xml file: %s",fullFileName.c_str());
return;
}
// make sure the main xml clause is of the correct type for an obj file
if (theXmlFile.type()!=string("ai_manager_dynamic_data"))
{
nlwarning("Ignoring file %s because main clause is not 'ai_manager_dynamic_data'",fullFileName.c_str());
return;
}
// extract the 'name' argument from the main clause
std::string name=theXmlFile.arg("name");
if (name.empty())
{
nlwarning("No manager name found in save file: %s",fullFileName.c_str());
return;
}
// ask the ai manager to initialis itself with name 'name' (fails if manager is running)
if (!CAIManager::getManagerById(mgrId)->set(name))
{
nlwarning("Conflict between running manager %04d named '%s' and name in sav file '%s'",
mgrId,CAIManager::getManagerById(mgrId)->name().c_str(),name.c_str());
return;
}
}
void CAIFiles::_addSrcFile(std::string fileName,std::string fullFileName, uint timestamp)
{
// generate a manger name from the file name
std::string name=CFile::getFilenameWithoutExtension(fileName);
// ask the CAIManager singleton for a manager id for this name
sint mgrId = CAIManager::nameToId(name,true);
if (mgrId==-1)
{
nlwarning("Failed to allocate a manager id for name '%s' (manager ids 0..%d)",
name.c_str(), CAIManager::maxManagers()-1);
return;
}
// make sure that we don't have another file already allocated to this manager
if (!mgrObjInfo[mgrId].Source.empty() && fullSrcFileName(mgrId)!=fullFileName && srcName(mgrId)!=NLMISC::CFile::getFilenameWithoutExtension(fullFileName))
{
nlwarning("File name conflict for: %s: %s != %s",
name.c_str(),mgrObjInfo[mgrId].Source.c_str(),NLMISC::CFile::getFilenameWithoutExtension(fullFileName).c_str());
return;
}
// assign the file name
mgrObjInfo[mgrId].Source=fullFileName;
// update the manager flags
if (timestamp>mgrObjInfo[mgrId].DateTime)
CAIManager::getManagerById(mgrId)->setNeedCompile(true);
}
//--------------------------------------------------------------------------------
// CAIFiles PRIVATE METHODS - FOR DIRECTORIES FOR FILES
//--------------------------------------------------------------------------------
void CAIFiles::_scanSrcFiles(const std::string &path)
{
//nlinfo("Scanning source directory: %s",path.c_str());
// setup the directory scan
_finddata_t fd;
long searchHandle;
if( (searchHandle = _findfirst( (path+"*").c_str(), &fd )) == -1L )
{
nlwarning("Nothing found in directory: %s",path.c_str());
return;
}
// iterate through found entries in the directory
do
{
// if we have a directory then recurse
if ( (fd.attrib & _A_SUBDIR) != 0 )
{
// ignore '.' and '..' entries
if (fd.name[0]!='.' || (fd.name[1]!=0 && (fd.name[1]!='.' || fd.name[2]!=0) ) )
_scanSrcFiles(path+std::string(fd.name)+"/");
}
else
{
// we've found a file so have a look to see whether its one of ours
std::string fileName=std::string(fd.name);
if (CFile::getExtension(fileName)==srcExtension())
_addSrcFile(fileName, path+fileName, uint32(fd.time_write));
}
}
while( _findnext( searchHandle, &fd ) == 0 );
// housekeeping
_findclose( searchHandle );
}
void CAIFiles::_scanObjAndSavFiles()
{
// setup to scan for obj files
std::string path=objPath();
nlinfo("Scanning directory: %s for *.%s",path.c_str(),objExtension().c_str());
// iterate through manager ids looking for correspoding files
for (uint i=0;i<CAIManager::maxManagers();i++)
{
// compose the file name
std::string filename=path+objFileName(sint(i));
_finddata_t fd;
// look for the file and retrieve timestamp info if found
long searchHandle;
if( (searchHandle=_findfirst(filename.c_str(),&fd)) != -1L )
_addObjFile(i, filename.c_str(), uint32(fd.time_write));
_findclose( searchHandle );
}
// setup to scan for sav files
path=savPath();
nlinfo("Scanning directory: %s for *.%s",path.c_str(),savExtension().c_str());
// iterate through manager ids looking for correspoding files
for (uint j=0;j<CAIManager::maxManagers();j++)
{
// if we've already found the name then we don't bother looking for the sav file
if (!CAIManager::getManagerById(j)->name().empty()) continue;
// compose the file name
std::string filename=path+savFileName(sint(j));
_finddata_t fd;
// look for the file
long searchHandle;
if( (searchHandle=_findfirst(filename.c_str(),&fd)) != -1L )
_addSavFile(j,filename.c_str());
_findclose( searchHandle );
}
}

@ -1,75 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef RYAI_AI_FILES_H
#define RYAI_AI_FILES_H
#include "nel/misc/types_nl.h"
#include "nel/misc/sheet_id.h"
#include "nel/misc/entity_id.h"
#include "nel/net/transport_class.h"
#include <map>
#include <string>
class CAIFiles
{
public:
// clear out the data strustures and rescan the directories listed in the config
// file for source and object files
static void scan();
// delete the object files (and temporary files if any) for a given manager
static void clean(sint mgrId);
// source file name, extension, etc
static std::vector<std::string> srcPaths(); // the paths for source files
static std::string srcExtension(); // the standard src extension
static std::string srcName(sint mgrId); // without path or extension
static std::string srcFileName(sint mgrId); // without path
static std::string fullSrcName(sint mgrId); // without extension
static std::string fullSrcFileName(sint mgrId); // with path and extension
// object file name, extension, etc
static std::string objPath(); // the path for obj files
static std::string objExtension(); // the standard obj file extension
static std::string objName(sint mgrId); // without path or extension
static std::string objFileName(sint mgrId); // without extension
static std::string fullObjFileName(sint mgrId); // with path and extension
// saved data file name, extension, etc
static std::string savPath(); // the path for sav files
static std::string savExtension(); // the standard sav file extension
static std::string savName(sint mgrId); // without path or extension
static std::string savFileName(sint mgrId); // without extension
static std::string fullSavFileName(sint mgrId); // with path and extension
// Reading & writing object files
static void CAIFiles::writeObjFile(sint mgrId);
private:
static void CAIFiles::_addSrcFile(std::string fileName,std::string fullFileName, uint timestamp);
static void CAIFiles::_addObjFile(sint mgrId,std::string fullFileName, uint timestamp);
static void CAIFiles::_addSavFile(sint mgrId,std::string fullFileName);
static void CAIFiles::_scanSrcFiles(const std::string &path);
static void CAIFiles::_scanObjAndSavFiles();
};
#endif

@ -1,486 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//===================================================================
/*
AI Managers
-- individual --
what's my id
what's my root name (what's my source file name)
which service am i on
do I need recompiling
what's my load weighting
-- container --
vector?
get manager by name
get manager by id
queue of managers waiting to be allocated to servers - queue is processed on
service update, dispatching new 'manager up's to services who are currently
not in the process of loading
***
if we add a concept of manager families then we can launch rafts of managers together
this can make it easy to explicitly ballance loading
***
even better would be to group by service and assume that all services have same power
this way all can be launched and assigned as services come up. if the services are
launched @ 1 per CPU or one per server then we can explictly overload, and
automatically load ballance afterwards...
*/
#include "nel/misc/debug.h"
#include "nel/misc/file.h"
#include "nel/misc/config_file.h"
#include "nel/misc/path.h"
#include "nel/net/service.h"
#include "game_share/xml.h"
#include "ai_share/ai_share.h"
#include "ai_manager.h"
#include "ai_service.h"
#include "ai_files.h"
#include "aids_actions.h"
using namespace NLMISC;
using namespace NLNET;
using namespace std;
//===================================================================
//---------------------------------------------------
// INSTANTIATED CLASS: Public methods
//-------------
// a few read accessors (static properties)
// the manager id (0..255)
sint CAIManager::id() const
{
return int(this-_managers);
}
// the manager name .. ie the source file name minus extension
const std::string &CAIManager::name() const
{
return _name;
}
// the CPU load rating of the manager for auto-load ballancing purposes
uint CAIManager::weightCPU() const
{
return _weightCPU;
}
// the RAM load rating of the manager for auto-load ballancing purposes
uint CAIManager::weightRAM() const
{
return _weightRAM;
}
//-------------
// a few read accessors (state of the files on disk)
// indicates whether newer source files than object files have been located
bool CAIManager::needCompile() const
{
return _needCompile;
}
// indicate whether an object file has been located in the object directory
bool CAIManager::objExists() const
{
return _objExists;
}
//-------------
// a few read accessors (relating to assignment to & execution by an ai service)
// has the manager been opened (it may still be waiting to be assigned)
bool CAIManager::isOpen() const
{
return _isOpen;
}
// has the manager been assigned to a service
bool CAIManager::isAssigned() const
{
return _isAssigned;
}
// is the manager up and running on the assigned service
bool CAIManager::isUp() const
{
return _isUp;
}
// the id of the service to which the manager is assigned
NLNET::TServiceId CAIManager::serviceId() const
{
return _service;
}
//-------------
// a few basic actions (relating to disk files)
const std::string &xmlDelimitedString(CxmlNode *xmlNode,const std::string &delimiter)
{
static const std::string emptyString;
for (uint i=0;i<xmlNode->childCount();++i)
{
CxmlNode *child=xmlNode->child(i);
if (child->type()==delimiter)
if (child->childCount()==1)
if (child->child(0)->type()=="")
{
return child->child(0)->txt();
}
}
return emptyString;
}
const std::string &getProp(CxmlNode *xmlNode,const std::string &propertyName)
{
static const std::string emptyString;
for (uint i=0;i<xmlNode->childCount();++i)
{
CxmlNode *child=xmlNode->child(i);
if (child->type()=="PROPERTY")
{
const std::string &name= xmlDelimitedString(child,std::string("NAME"));
if (name==propertyName)
return xmlDelimitedString(child,std::string("STRING"));
}
}
return emptyString;
}
// compile the source files to generate new object files
void CAIManager::compile()
{
// get the file names of input and output files
std::string srcFile=CAIFiles::fullSrcFileName(id());
std::string objFile=CAIFiles::fullObjFileName(id());
// make sure this file isn't in the ignore list
CConfigFile::CVar *varPtr;
varPtr=IService::getInstance()->ConfigFile.getVarPtr(std::string("IgnorePrimitives"));
if (varPtr==NULL)
{
nlwarning("Cannot compile file '%s' as IgnorePrimitives variable not found in .cfg file: Please add 'IgnorePrimitives={\"\"};' and try again",CAIFiles::fullSrcFileName(id()).c_str());
return;
}
for (uint i=0;i<varPtr->size();++i)
if (CAIFiles::srcName(id())==CFile::getFilenameWithoutExtension(varPtr->asString(i)))
{
nlinfo("Skipping file in .cfg ignoreList: %s",CAIFiles::fullSrcFileName(id()).c_str());
return;
}
// compile the input file
nlinfo("Compile %s => %s",srcFile.c_str(),objFile.c_str());
CAIDSActions::CurrentManager=id();
AI_SHARE::parsePrimFile(srcFile.c_str());
// make sure this file isn't in the ignore list (if the compiler found nothing interesting it will have been added)
varPtr=IService::getInstance()->ConfigFile.getVarPtr(std::string("IgnorePrimitives"));
for (uint i=0;i<varPtr->size();++i)
if (CAIFiles::srcName(id())==CFile::getFilenameWithoutExtension(varPtr->asString(i)))
{
nlinfo("- Skipping file as it has just been added to .cfg ignoreList: %s",CAIFiles::fullSrcFileName(id()).c_str());
return;
}
// write the output file
CAIFiles::writeObjFile(id());
// write the binary output file (for debugging only)
NLMISC::COFile file;
if (file.open(objFile+"_out"))
{
std::string s;
MgrDfnRootNode.serialToString(s);
file.serial(s);
file.close();
}
else
nlwarning("CAIManager::compile(): Failed to open the output file: %s",(objFile+"_out").c_str());
}
// delete the object files (but not the save files)
void CAIManager::clean()
{
CAIFiles::clean(id());
}
//-------------
// a few basic actions (relating to assignment to & execution by an ai service)
// open the manager on an unspecified service
// (may be queued until a service is available)
void CAIManager::open()
{
CAIService::openMgr(id());
}
// assign manager to a specified service and begin execution
void CAIManager::assign(NLNET::TServiceId serviceId)
{
// make sure that the manager isn't assigned to a service already
if (isAssigned())
{
nlwarning("Cannot assign manager %04d (%s) to service %d as already assigned to %d",
id(), name().c_str(), serviceId.get(), _service.get());
return;
}
// flag me as assigned
_isAssigned=true;
_service=serviceId;
// transfer control to the service's assignMgr() method
CAIService *service=CAIService::getServiceById(serviceId);
if (service!=NULL)
service->assignMgr(id());
}
// stop execution on the current service and assign to a new service
void CAIManager::reassign(NLNET::TServiceId serviceId)
{
CAIService *service=CAIService::getServiceById(_service);
if (service!=NULL)
service->reassignMgr(id(),serviceId);
}
// stop execution of a manager
void CAIManager::close()
{
// make sure that the manager isn't assigned to a service already
if (!isAssigned())
{
nlwarning("Cannot unassign manager %04d (%s) as it is already unassigned", id(), name().c_str());
return;
}
// if the service is running then transfer control to the service singleton's closeMgr() method
if (isUp())
{
CAIService::closeMgr(id());
return;
}
// flag me as unassigned
_isAssigned=false;
_isOpen=false;
_service.set(0);
}
//-------------
// a few basic actions (miscelaneous)
// display information about the state of the manager
void CAIManager::display() const
{
if (isAssigned())
nlinfo("AI Manager %04d: %s: %s ON SERVICE %d (%s)", id(), _name.c_str(),
isUp()? "UP AND RUNNING":
/* else */ "ASSIGNED TO BUT NOT YET UP",
_service.get(),
isOpen()? "auto-assigned":
/* else */ "manualy assigned"
);
else
nlinfo("AI Manager %04d: %s: %s", id(), _name.c_str(),
isOpen()? "OPEN - AWAITING ASSIGNMENT":
!objExists()? "NOT OPEN - OBJECT FILE NOT FOUND":
needCompile()? "NOT OPEN - OBJECT FILE OLDER THAN SOURCE":
/* else */ "NOT OPEN - OBJECT FILE IS UP TO DATE"
);
}
//-------------
// a few write accessors (miscelaneous)
// set the name assigned to manager
// if no name previously assigned then reset all manager properties
// if a name already exists and does not match new name then do nohing and return false
bool CAIManager::set(const std::string &name)
{
// if we already have a name associated with this slot then simply check that it matches the new name
if (!_name.empty())
return (_name==name);
_reset();
_name=name;
return true;
}
// set the state of the needCompile flag
void CAIManager::setNeedCompile(bool val)
{
_needCompile=val;
}
// set the state of the objFileExists flag
void CAIManager::setObjFileExists(bool val)
{
_objExists=val;
}
// set the state of the isUp flag
void CAIManager::setIsUp(bool val)
{
_isUp=val;
}
// set the state of the isOpen flag
void CAIManager::setIsOpen(bool val)
{
_isOpen=val;
}
//---------------------------------------------------
// INSTANTIATED CLASS: Private methods
// default constructor - may only be instantiated by the singleton
CAIManager::CAIManager(): MgrDfnRootNode(std::string())
{
// manager id - make sure that the managers are all in the one static array
// note that id is calaulated from the array address and the addess of 'this'
nlassert(uint(id())<maxManagers());
// reset the rest of the properties
_reset();
}
void CAIManager::_reset()
{
_name.clear();
_weightCPU = 0;
_weightRAM = 0;
_needCompile = false;
_objExists = false;
_isOpen = false;
_isAssigned = false;
_isUp = false;
_service.set(0);
}
//===================================================================
// *** END OF THE INSTANTIATED CLASS *** START OF THE SINGLETON ***
//===================================================================
//---------------------------------------------------
// SINGLETON: Data
CAIManager CAIManager::_managers[RYAI_AI_MANAGER_MAX_MANAGERS];
//---------------------------------------------------
// SINGLETON: Public methods
// get the number of allocated managers
uint CAIManager::numManagers()
{
uint count=0;
for (uint i=0;i<maxManagers();i++)
if (!_managers[i]._name.empty())
count++;
return count;
}
// get a pointer to the manager with given handle (0..maxManagers-1)
CAIManager *CAIManager::getManagerById(sint id)
{
if (uint(id)>=maxManagers())
{
nlwarning("CAIManager::getManagerById(id): id %d not in range 0..%d",id,maxManagers()-1);
return NULL;
}
return &(_managers[id]);
}
// get a pointer to the manager with given index (0..numManagers-1)
CAIManager *CAIManager::getManagerByIdx(uint idx)
{
uint count=0;
for (uint i=0;i<maxManagers();i++)
if (!_managers[i]._name.empty())
{
if (idx==count)
return &(_managers[i]);
count++;
}
nlwarning("CAIManager::getManagerByIdx(idx): idx (%d)>=numManagers (%d)",idx,count);
return NULL;
}
// get the handle for the manager of given name and optionally create a new
// handle if none found - return -1 if none found or no free slots
int CAIManager::nameToId(std::string name, bool assignNewIfNotFound)
{
// see if the name is a numeric version of an id
uint val=atoi(name.c_str());
if (!name.empty() && name.size()<=4 &&
( (val>0 && val<maxManagers()) ||
(val==0 && name==std::string("0000"+4-name.size())) ) )
return val;
// see if the name is already assigned to one of the _managers
for (uint i=0;i<maxManagers();i++)
if (_managers[i]._name==name)
return i;
// the name's not been found so if assignNewIfNotFound then look for a free slot
if (assignNewIfNotFound)
{
for (uint i=0;i<maxManagers();i++)
if (_managers[i]._name.empty())
{
_managers[i].set(name);
return i;
}
nlwarning("Failed to allocate a manager for name '%s' (all %d managers are already allocated)",name.c_str(),maxManagers());
}
return -1;
}
// clear file name assignments for managers that aren't currently running on
// ai services
void CAIManager::liberateUnassignedManagers()
{
for (uint i=0;i<maxManagers();i++)
if (!_managers[i]._isOpen && !_managers[i]._isAssigned)
_managers[i]._reset();
}
//===================================================================

@ -1,331 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef RYAI_AI_MANAGER_H
#define RYAI_AI_MANAGER_H
#define RYAI_AI_MANAGER_MAX_MANAGERS 1024
#include "nel/misc/types_nl.h"
#include "nel/misc/stream.h"
#include "nel/net/unified_network.h"
#include "ai_share/ai_actions.h"
/*
---------------------------------------------------------------------------
This class defines both the singleton that manages the managers and the
class type of the managers themselves. The singleton interface can be found
at the end of the class
---------------------------------------------------------------------------
*/
class CAIManager
{
//===================================================================
// *** SUB-CLASSES FOR MGR DEFINITON DATA TREE ***
//===================================================================
public:
struct SMgrDfnElm
{
SMgrDfnElm() {}
SMgrDfnElm(uint64 action,const std::vector <CAIActions::CArg> &args): Action(action)
{
Args.resize(args.size());
for (uint i=0;i<args.size();++i)
Args[i]=args[i];
}
SMgrDfnElm(const SMgrDfnElm &other): Action(other.Action), Args(other.Args) {}
void serial(NLMISC::IStream &f)
{
//f.xmlPushBegin("CMD");
std::string s=getAction();
//f.xmlSetAttrib("Action");
f.serial(s);
setAction(s);
//f.xmlPushEnd();
f.serialCont(Args);
//f.xmlPop();
}
void serialToString(std::string &s) throw()
{
s+=char(Args.size());
s+=NLMISC::toString("%*s",sizeof(uint64),"");
((uint64*)&(s[s.size()]))[-1]=Action;
for (uint i=0;i<Args.size();++i)
Args[i].serialToString(s);
}
std::string getAction()
{
std::string s;
for (uint i=0;i<8 && ((char *)&Action)[i];++i) s+=((char *)&Action)[i];
return s;
}
void setAction(std::string action)
{
Action=0;
for (uint i=0;i<8 && action[i];++i) ((char *)&Action)[i]=action[i];
}
uint64 Action;
std::vector <CAIActions::CArg> Args;
};
struct SMgrDfnNode : public NLMISC::CRefCount
{
SMgrDfnNode() {}
SMgrDfnNode(const std::string &name)
: Name(name)
{}
SMgrDfnNode(const SMgrDfnNode &other)
: Name(other.Name),
Data(other.Data),
Child(other.Child)
{}
void serial(NLMISC::IStream &f)
{
f.serial(Name);
f.serialCont(Data);
uint32 count;
f.serial(count);
Child.resize(count);
if (f.isReading())
{
for (uint i=0; i<count; ++i)
{
Child[i] = new SMgrDfnNode;
f.serial(*Child[i]);
}
}
else
{
for (uint i=0; i<count; ++i)
{
f.serial(*Child[i]);
}
}
}
void serialToString(std::string &s) throw()
{
uint i;
for (i=0;i<Data.size();++i)
Data[i].serialToString(s);
for (i=0;i<Child.size();++i)
Child[i]->serialToString(s);
}
std::string Name;
std::vector <SMgrDfnElm> Data;
std::vector <NLMISC::CSmartPtr<SMgrDfnNode> > Child;
bool Visited; // used to identify modified nodes in file re-parse operations
};
//===================================================================
// *** START OF THE INSTANTIATED CLASS ***
//===================================================================
public:
//---------------------------------------------------
// INSTANTIATED CLASS: Public methods
//-------------
// a few read accessors (static properties)
// the manager id (0..255)
sint id() const;
// the manager name .. ie the source file name minus extension
const std::string &name() const;
// the CPU load rating of the manager for auto-load ballancing purposes
uint weightCPU() const;
// the RAM load rating of the manager for auto-load ballancing purposes
uint weightRAM() const;
//-------------
// a few read accessors (state of the files on disk)
// indicates whether newer source files than object files have been located
bool needCompile() const;
// indicate whether an object file has been located in the object directory
bool objExists() const;
//-------------
// a few read accessors (relating to assignment to & execution by an ai service)
// has the manager been opened (it may still be waiting to be assigned)
bool isOpen() const;
// has the manager been assigned to a service
bool isAssigned() const;
// is the manager up and running on the assigned service
bool isUp() const;
// the id of the service to which the manager is assigned
NLNET::TServiceId serviceId() const;
//-------------
// a few basic actions (relating to disk files)
// compile the source files to generate new object files
void compile();
// delete the object files (but not the save files)
void clean();
//-------------
// a few basic actions (relating to assignment to & execution by an ai service)
// open the manager on an unspecified service
// (may be queued until a service is available)
void open();
// assign manager to a specified service and begin execution
void assign(NLNET::TServiceId serviceId);
// stop execution on the current service and assign to a new service
void reassign(NLNET::TServiceId serviceId);
// stop execution of a manager
void close();
//-------------
// a few basic actions (miscelaneous)
// display information about the state of the manager
void display() const;
//-------------
// a few write accessors (miscelaneous)
// set the name assigned to manager
// if no name previously assigned then reset all manager properties
// if a name already exists and does not match new name then do nohing and return false
bool set(const std::string &name);
// set the state of the needCompile flag
void setNeedCompile(bool val);
// set the state of the objFileExists flag
void setObjFileExists(bool val);
// set the state of the isUp flag
void setIsUp(bool val);
// set the state of the isOpen flag
void setIsOpen(bool val);
private:
//---------------------------------------------------
// INSTANTIATED CLASS: Private methods
// default constructor - may only be instantiated by the singleton
CAIManager();
// reset properties to initial values
void _reset();
private:
//---------------------------------------------------
// INSTANTIATED CLASS: Private data
// manager name (file name of source file minus extension)
std::string _name;
// cpu rating for load ballancing
uint _weightCPU;
// ram rating for load ballancing
uint _weightRAM;
// do we need to recompile
bool _needCompile;
// does an object file exist
bool _objExists;
// is the manager open (at least queued in CAIService singleton)
bool _isOpen;
// is manager assigned to a service
bool _isAssigned;
// is manager up and running on the assigned service
bool _isUp;
// id of the service manager is assigned to
NLNET::TServiceId _service;
public:
//---------------------------------------------------
// INSTANTIATED CLASS: Public data
// the tree of definition data read from (and written to) data files
SMgrDfnNode MgrDfnRootNode;
//===================================================================
// *** END OF THE INSTANTIATED CLASS *** START OF THE SINGLETON ***
//===================================================================
public:
//---------------------------------------------------
// SINGLETON: Public methods
// get the number of valid handles (ie the maximum number of managers allowed)
static uint maxManagers() { return RYAI_AI_MANAGER_MAX_MANAGERS; }
// get the number of allocated managers
static uint numManagers();
// get a pointer to the manager with given handle (0..maxManagers-1)
static CAIManager *getManagerById(sint id);
// get a pointer to the manager with given index (0..numManagers-1)
static CAIManager *getManagerByIdx(uint idx);
// get the handle for the manager of given name and optionally create a new
// handle if none found - return -1 if none found or no free slots
static sint nameToId(std::string name, bool assignNewIfNotFound=false);
// clear file name assignments for managers that aren't currently running on
// ai services
static void liberateUnassignedManagers();
private:
//---------------------------------------------------
// SINGLETON: Private methods
private:
//---------------------------------------------------
// SINGLETON: Private data
static CAIManager _managers[RYAI_AI_MANAGER_MAX_MANAGERS];
//===================================================================
// *** END OF THE SINGLETON ***
//===================================================================
};
#endif

@ -1,322 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//===================================================================
/*
***
when a service goes down I must remember that the managers are no longer running
in the normal way I can try to bring them back up on the remaining services
***
when a service comes up and the rest of the services are over-loaded it would be
good to be able to load ballance (if loading is fast enough)
- tell new service to load static data and prepare to launch.
- wait for new service to say 'ready'
- tell old service to transfer to new service (ie: save to ram & transmit to new service)
- * old service must continue to forward packets to the new service to ensure smooth continuation
- old service tells me when he's down
- new service tells me when he's up
***
Need to deal with 'save's as well...
***
Need init() and release() in order to register message callbacks, etc?
*/
/*
//-------------------------------------------------------------------------
// Some global variables
uint32 GlobalServicesUp=0;
NLMISC_VARIABLE(uint32, GlobalServicesUp, "ServicesUp");
*/
#include "nel/misc/debug.h"
#include "ai_manager.h"
#include "ai_service.h"
#include "ai_files.h"
#include "messages.h"
//===================================================================
//---------------------------------------------------
// INSTANTIATED CLASS: Public methods
// a few read accessors
NLNET::TServiceId CAIService::id() const
{
// compute the index of this AIService class instance in the array of
// CAIService (this is stored in the _services array)
return NLNET::TServiceId(this-_services);
}
bool CAIService::isUp() const
{
return _isUp;
}
uint CAIService::powerCPU() const
{
return _powerCPU;
}
uint CAIService::powerRAM() const
{
return _powerRAM;
}
// assign a given manager to this service (ie open and run it)
void CAIService::assignMgr(sint mgrId)
{
// get a pointer to the manager in question
CAIManager *m=CAIManager::getManagerById(mgrId);
if (m==NULL)
return;
// if this method has not been called by the manager's own method then ping pong
if (!m->isAssigned())
{
m->assign(id());
return;
}
// if the manager is assigned to a different service then bomb
if (m->serviceId()!=id())
{
nlwarning("Cannot assign manager %04d (%s) to service %d as it is already assigned to service %d",
mgrId, m->name().c_str(), id().get(), m->serviceId().get());
return;
}
// if the service is up then send it a message to launch the manager
if (isUp())
{
// std::string dataBuf
// dataBuf.resize(binFileSize(id()));
// FILE *f=fopen(binFileName(id()),"rb");
// if (f==NULL)
// {
// nlinfo("Failed to load action list file: %s (try 'aiMake')",binFileName(id()));
// return false;
// }
// if (fread(dataBuf.buffer(),1,binFileSize(id()),f) != binFileSize(id()))
// {
// nlinfo("Read error in binary file: %s",binFileName(id()));
// return false;
// }
// fclose(f);
// CMsgAIUploadActions(id(),dataBuf).send();
// CMsgAIOpenMgrs(mgrId,m->name()).send(id());
m->setIsUp(true);
// return true;
}
// return false;
}
// unassign a manager currently running on this service (ie close it)
void CAIService::unassignMgr(sint mgrId)
{
// if the manager isn't assigned to this service then bomb
if (CAIManager::getManagerById(mgrId)->serviceId()!=id())
{
nlwarning("Cannot stop manager %04d (%s) on service %d as it is assigned to service %d",
mgrId, CAIManager::getManagerById(mgrId)->name().c_str(), id().get(), CAIManager::getManagerById(mgrId)->serviceId().get());
return;
}
// transfer control to the singleton to finish the work
closeMgr(mgrId);
}
// reassign a manager currently assigned to this service to another service
void CAIService::reassignMgr(sint mgrId, NLNET::TServiceId serviceId)
{
// get a pointerto the service
CAIService *s=getServiceById(serviceId);
if (s==NULL)
return;
// this is a very simple implementation of control transfer... should be revised later
unassignMgr(mgrId);
s->assignMgr(mgrId);
}
//---------------------------------------------------
// INSTANTIATED CLASS: Private methods
CAIService::CAIService()
{
// if the following assert fails it's because a CAIService object has
// been instantiated outside of the singleton's array
nlassert(id().get() < maxServices());
}
//===================================================================
// *** END OF THE INSTANTIATED CLASS *** START OF THE SINGLETON ***
//===================================================================
//---------------------------------------------------
// SINGLETON: Data
class CAIService CAIService::_services[RYAI_AI_SERVICE_MAX_SERVICES];
//---------------------------------------------------
// SINGLETON: Public methods
// get the number of allocated managers
uint CAIService::numServices()
{
uint count=0;
for (uint i=0;i<maxServices();i++)
if (_services[i].isUp())
count++;
return count;
}
// get a pointer to the manager with given handle (0..maxManagers-1)
CAIService *CAIService::getServiceById(NLNET::TServiceId id)
{
if (id.get() >= maxServices())
{
nlwarning("CAIService::getServiceById(id): id %d not in range 0..%d",id.get(),maxServices()-1);
return NULL;
}
return &(_services[NLNET::TServiceId8(id).get()]);
}
// get a pointer to the manager with given index (0..numManagers-1)
CAIService *CAIService::getServiceByIdx(uint idx)
{
uint count=0;
for (uint i=0;i<maxServices();i++)
if (_services[i].isUp())
{
if (idx==count)
return &(_services[i]);
count++;
}
nlwarning("CAIService::getServiceByIdx(idx): idx (%d)>=maxServices (%d)",idx,count);
return NULL;
}
// select a service to assign the manager to and assign it
// if no services are available then the manager is queued until one
// becomes available
// managers opened via this interface are queued back up and re-launched
// if their service goes down
void CAIService::openMgr(sint mgrId)
{
// get a pointer to the manager in question
CAIManager *m=CAIManager::getManagerById(mgrId);
if (m==NULL)
return;
m->setIsOpen(true);
}
// close a manager (on whichever service its running)
void CAIService::closeMgr(sint mgrId)
{
// get a pointer to the manager in question
CAIManager *m=CAIManager::getManagerById(mgrId);
if (m==NULL)
return;
// if the manager is flagged as up and running on a service then shut it down
if (m->isUp())
{
CAIService *s=getServiceById(m->serviceId());
if (s!=NULL && s->isUp())
{
// send a message to the service to stop the manager
CMsgAICloseMgrs(mgrId).send(m->serviceId());
}
// clear the manager's isUp() flag
m->setIsUp(false);
}
// if the manager is assigned to a service then transfer control to the manager's close()
if (m->isAssigned())
m->close();
}
// update routine called by service_main update every net loop
void CAIService::update()
{
#define IN_TRANSIT_PACKET_LIMIT 1
for (uint i=0;i<maxServices();i++)
{
CAIService &s=_services[i];
if (s.isUp())
{
// see whether we have enough spare capacity to start sending data about a new manager
// if so look through the managers for any that are awaiting assignment
if (s._dataSentCount+s._dataToSend.size()-s._dataAckCount<IN_TRANSIT_PACKET_LIMIT)
{
// look for the heaviest manager that doesn't blow my quotas
uint best=~0u;
uint bestScore=0;
for (uint j=0;j<CAIManager::maxManagers();j++)
{
CAIManager *m=CAIManager::getManagerById(j);
if (m->isOpen() && !m->isAssigned())
if (m->weightRAM()<=s._unusedPowerRAM && m->weightCPU()<=s._unusedPowerCPU)
if (m->weightRAM()+m->weightCPU()/2>=bestScore)
{
best=j;
bestScore=m->weightRAM()+m->weightCPU()/2;
}
}
// if we found a manager then go ahead and assign it
if (best!=~0u)
s.assignMgr(best);
}
// if we have data waiting to be sent then send it
while (!s._dataToSend.empty() && s._dataSentCount-s._dataAckCount<IN_TRANSIT_PACKET_LIMIT)
{
NLNET::CUnifiedNetwork::getInstance()->send( s.id(), *(s._dataToSend.begin()) );
s._dataToSend.pop_front();
s._dataSentCount++;
}
}
}
#undef IN_TRANSIT_PACKET_LIMIT
}
//===================================================================

@ -1,148 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef RYAI_AI_SERVICE_H
#define RYAI_AI_SERVICE_H
#define RYAI_AI_SERVICE_MAX_SERVICES 256
#include "nel/misc/types_nl.h"
#include "nel/net/message.h"
#include "nel/net/unified_network.h"
#include <list>
/*
---------------------------------------------------------------------------
This class defines both the singleton that manages the ai services and the
class type of the ai services themselves. The singleton interface can be found
at the end of the class
---------------------------------------------------------------------------
*/
class CAIService
{
//===================================================================
// *** START OF THE INSTANTIATED CLASS ***
//===================================================================
public:
//---------------------------------------------------
// INSTANTIATED CLASS: Public methods
// a few read accessors
NLNET::TServiceId id() const;
bool isUp() const;
uint powerCPU() const;
uint powerRAM() const;
// assign a given manager to this service (ie open and run it)
void assignMgr(sint mgrId);
// unassign a manager currently running on this service (ie close it)
void unassignMgr(sint mgrId);
// reassign a manager currently assigned to this service to another service
void reassignMgr(sint mgrId, NLNET::TServiceId serviceId);
private:
//---------------------------------------------------
// INSTANTIATED CLASS: Private methods
CAIService(); // may only be instantiated by the singleton
private:
//---------------------------------------------------
// INSTANTIATED CLASS: Private data
bool _isUp; // flag says the service is up
uint _powerCPU; // maximum CPU weight allowed on service
uint _powerRAM; // maximum RAM weight allowed on service
uint _unusedPowerCPU; // remaining CPU capacity (after counting weight of running managers)
uint _unusedPowerRAM; // remaining RAM capacity (after counting weight of running managers)
uint _dataSentCount; // number of data packets sent to service
uint _dataAckCount; // number of data acknowledges received from service
// vector of buffers of data that are waiting to be sent to the service
std::list<NLNET::CMessage> _dataToSend;
//===================================================================
// *** END OF THE INSTANTIATED CLASS *** START OF THE SINGLETON ***
//===================================================================
public:
//---------------------------------------------------
// SINGLETON: Public methods
// get the number of valid handles (ie the maximum number of managers allowed)
static uint maxServices() { return RYAI_AI_SERVICE_MAX_SERVICES; }
// get the number of allocated managers
static uint numServices();
// get a pointer to the manager with given handle (0..maxManagers-1)
static CAIService *getServiceById(NLNET::TServiceId id);
// get a pointer to the manager with given index (0..numManagers-1)
static CAIService *getServiceByIdx(uint idx);
// select a service to assign the manager to and assign it
// if no services are available then the manager is queued until one
// becomes available
// managers opened via this interface are queued back up and re-launched
// if their service goes down
static void openMgr(sint mgrId);
// close a manager (on whichever service its running)
static void closeMgr(sint mgrId);
// update routine called by service_main update every net loop
static void update();
private:
//---------------------------------------------------
// SINGLETON: Private methods
private:
//---------------------------------------------------
// SINGLETON: Private data
static class CAIService _services[RYAI_AI_SERVICE_MAX_SERVICES];
//===================================================================
// *** END OF THE SINGLETON ***
//===================================================================
};
#endif

@ -1,261 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//----------------------------------------------------------------------------
#include "nel/misc/command.h"
#include "nel/misc/debug.h"
#include "nel/misc/config_file.h"
#include "nel/misc/path.h"
#include "nel/net/service.h"
#include "aids_actions.h"
using namespace NLMISC;
using namespace NLNET;
using namespace std;
//----------------------------------------------------------------------------
// Stuff for debug message logging
//----------------------------------------------------------------------------
static bool verboseLog=false;
#define TAB toString("%*s",CurrentMgrDfnNodes.size()*4,"").c_str()
#define TAB1 toString("%*s",CurrentMgrDfnNodes.size()*4-4,"").c_str()
#define LOG if (!verboseLog) {} else nlinfo
NLMISC_COMMAND(verboseAIDSActionLog,"Turn on or off or check the state of verbose AIDSAction parser logging","")
{
if(args.size()>1)
return false;
if(args.size()==1)
StrToBool (verboseLog, args[0]);
nlinfo("verboseAIDSActionLogging is %s",verboseLog?"ON":"OFF");
return true;
}
//----------------------------------------------------------------------------
// Singleton data instantiation
//----------------------------------------------------------------------------
CAIDSActions *CAIDSActions::Instance=NULL;
uint CAIDSActions::CurrentManager=0;
//----------------------------------------------------------------------------
// Local utility functions and variables
//----------------------------------------------------------------------------
static uint BadParseDepth=0;
static CAIManager::SMgrDfnNode DefaultNode;
static std::vector<CAIManager::SMgrDfnNode *> CurrentMgrDfnNodes;
static bool FoundAIData=false;
static std::string FileName;
static void Prepare(CAIManager::SMgrDfnNode &node)
{
// recurse through children
for (uint i=0;i<node.Child.size();++i)
Prepare(*node.Child[i]);
// deal with self
node.Visited=false;
node.Data.clear();
}
static void Clean(CAIManager::SMgrDfnNode &node)
{
// recurse through children
for (uint i=0;i<node.Child.size();++i)
Clean(*node.Child[i]);
// deal with self
if (!node.Visited)
{
node.Child.clear();
node.Name.clear(); // clearing the name makes the slot re-usable next compile
}
}
//----------------------------------------------------------------------------
// Public methods
//----------------------------------------------------------------------------
void CAIDSActions::openFile(const std::string &fileName)
{
LOG("Scanning file: %s",fileName.c_str());
// setup local vars
BadParseDepth=0;
DefaultNode.Child.clear();
DefaultNode.Data.clear();
CurrentMgrDfnNodes.clear();
FoundAIData=false;
}
void CAIDSActions::closeFile(const std::string &fileName)
{
// if the primitive file didn't contain anything interesting then add it to the ignore list
if (!FoundAIData)
{
nlinfo("No manager found in primitive file: %s - adding to ignore list",fileName.c_str());
// lookup the ignore files in the config file and copy into a temp vector
CConfigFile::CVar *varPtr=IService::getInstance()->ConfigFile.getVarPtr(std::string("IgnorePrimitives"));
std::vector<std::string> ignoreFiles;
for (uint i=0;i<varPtr->size();++i)
ignoreFiles.push_back(CFile::getFilenameWithoutExtension(varPtr->asString(i)));
//append this file to the vector and pass it back to the config file manager for storage
ignoreFiles.push_back(NLMISC::CFile::getFilenameWithoutExtension(fileName));
varPtr->setAsString(ignoreFiles);
IService::getInstance()->ConfigFile.save();
}
}
void CAIDSActions::begin(const std::string &contextName)
{
LOG("%s{ // %s",TAB,contextName.c_str());
uint i;
// if we've encountered a parse problem just count levels of indentation
if (BadParseDepth)
{
++BadParseDepth;
return;
}
// if the CurrentMgrDfnNodes vector is empty then we must be parsing a new manager
if (CurrentMgrDfnNodes.empty())
{
nlinfo("- Parsing: %s",contextName.c_str());
// update variables used in this source file (AIDS_ACTIONS.CPP)
FoundAIData=true;
CurrentMgrDfnNodes.push_back(&(CAIManager::getManagerById(CurrentManager)->MgrDfnRootNode));
CurrentMgrDfnNodes[0]->Name=contextName;
// reset the 'visited' flags for the manager's data tree
Prepare(*CurrentMgrDfnNodes[0]);
CurrentMgrDfnNodes[0]->Visited=true;
// copy the default dfn nodes to the current node and add a 'set_slot' action
CAIManager::SMgrDfnNode *curNode=CurrentMgrDfnNodes[CurrentMgrDfnNodes.size()-1];
for (uint i=0;i<DefaultNode.Data.size();++i)
curNode->Data.push_back(DefaultNode.Data[i]);
// add a set_slot action with value uint slot id = CurrentManager
std::vector <CAIActions::CArg> args;
args.push_back(CAIActions::CArg(CurrentManager));
curNode->Data.push_back(CAIManager::SMgrDfnElm(*(uint64*)"SET_SLOT",args));
}
else
{
CAIManager::SMgrDfnNode *curNode=CurrentMgrDfnNodes[CurrentMgrDfnNodes.size()-1];
// try to find a node with the name matching contextName
// if there are a number of nodes with the same name then this code should work ok as
// it uses the 'visited' flags to avoid multi-use of same node slot
CAIManager::SMgrDfnNode *node=NULL;
for (i=0;i<curNode->Child.size();++i)
if ((curNode->Child[i]->Name.empty() || curNode->Child[i]->Name==contextName) && !curNode->Child[i]->Visited)
{
node=(curNode->Child[i]);
break;
}
// if need be allocate a new data node
if (i==curNode->Child.size())
{
curNode->Child.push_back(new CAIManager::SMgrDfnNode(contextName));
node=curNode->Child[i];
}
// add a set_slot action with value uint slot id = i
std::vector <CAIActions::CArg> args;
args.push_back(CAIActions::CArg(i));
curNode->Child[i]->Data.push_back(CAIManager::SMgrDfnElm(*(uint64*)"SET_SLOT",args));
// update variables used in this source file (AIDS_ACTIONS.CPP)
CurrentMgrDfnNodes.push_back(node);
node->Visited=true;
}
}
void CAIDSActions::end(const std::string &contextName)
{
LOG("%s} // %s",TAB1,contextName.c_str());
// if we've encountered a parse problem just count levels of indentation
if (BadParseDepth)
{
--BadParseDepth;
return;
}
// make sure the name of the context that we're closing matches the name of the context that we opened
CAIManager::SMgrDfnNode *curNode=CurrentMgrDfnNodes[CurrentMgrDfnNodes.size()-1];
nlassert(contextName==curNode->Name);
// close this context
CurrentMgrDfnNodes.pop_back();
// if we've finished then do some housekeeping
if (CurrentMgrDfnNodes.empty())
{
// run back through tree stripping out unvisitted entries
Clean(*curNode);
}
}
void CAIDSActions::execute(uint64 action,const std::vector <CAIActions::CArg> &args)
{
// if we've encountered a parse problem don't execute...
if (BadParseDepth)
{
return;
}
// generate a string to describe the action
std::string txt;
txt+=toString("%-8.8s",&action);
txt+='(';
for (uint i=0;i<args.size();++i)
{
txt+=args[i].toString();
if (i<args.size()-1) txt+=", ";
}
txt+=')';
LOG("%s%s",TAB,txt.c_str());
CAIManager::SMgrDfnNode *curNode;
// if we havent yet opened our first context then store this data record in the default node
// otherwise store it in the node on the top of the CurrentMgrDfnNodes vector
if (CurrentMgrDfnNodes.empty())
curNode=&DefaultNode;
else
curNode=CurrentMgrDfnNodes[CurrentMgrDfnNodes.size()-1];
// add the data record to the top node on the CurrentMgrDfnNodes vector
curNode->Data.push_back(CAIManager::SMgrDfnElm(action,args));
}

@ -1,78 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef RYAI_AIDS_ACTIONS_H
#define RYAI_AIDS_ACTIONS_H
#include "ai_share/ai_actions.h"
#include "ai_manager.h"
#include <vector>
class CAIDSActions: public CAIActions::IExecutor
{
public:
//----------------------------------------------------------------------------
// init & release
static void init()
{
if (Instance==NULL)
Instance=new CAIDSActions;
CAIActions::init(Instance);
}
static void release()
{
if (Instance!=NULL)
{
CAIActions::release();
delete Instance;
Instance=NULL;
}
}
//----------------------------------------------------------------------------
// inheritted virtual interface
virtual void openFile(const std::string &fileName);
virtual void closeFile(const std::string &fileName);
virtual void begin(const std::string &contextName);
virtual void end(const std::string &contextName);
virtual void execute(uint64 action,const std::vector <CAIActions::CArg> &args);
virtual void begin(uint32 context) {}
virtual void end(uint32 context) {}
//----------------------------------------------------------------------------
// public singleton data
static uint CurrentManager;
private:
//----------------------------------------------------------------------------
// This is a singleton class so make constructor private
CAIDSActions() {}
~CAIDSActions() {}
//----------------------------------------------------------------------------
// the singleton class instance
static CAIDSActions *Instance;
};
#endif

@ -1,136 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//-------------------------------------------------------------------------
// Includes & namespaces
#include "ai_share/ai_spawn_commands.h"
using namespace NLMISC;
using namespace std;
// remove stupid VC6 warnings
void foo_aids_spawn_ctrl_cpp() {}
//-------------------------------------------------------------------------
// The CAISpawnCtrl sub-class
/*
class CAIDSSpawnCtrl: public CAISpawnCtrl
{
protected:
virtual bool _spawn(const std::string &name);
virtual bool _spawnMap(const std::string &name);
virtual bool _spawnMgr(const std::string &name);
virtual bool _spawnGrp(const std::string &name);
virtual bool _spawnAll();
virtual bool _despawn(const std::string &name);
virtual bool _despawnMap(const std::string &name);
virtual bool _despawnMgr(const std::string &name);
virtual bool _despawnGrp(const std::string &name);
virtual bool _despawnAll();
} AIServiceSpawnCtrl;
*/
//-------------------------------------------------------------------------
// The CAISpawnCtrl singleton data
//CAISpawnCtrl *CAISpawnCtrl::_instance=&AIServiceSpawnCtrl;
//-------------------------------------------------------------------------
// SPAWNING
/*
bool CAIDSSpawnCtrl::_spawn(const std::string &name)
{
if (_spawnMap(name)) return true;
if (_spawnMgr(name)) return true;
if (_spawnGrp(name)) return true;
return false;
}
bool CAIDSSpawnCtrl::_spawnGrp(const std::string &name)
{
nlinfo("*** spawnGrp(%s) NOT IMPLEMENTED YET ***",name.c_str());
return true;
}
bool CAIDSSpawnCtrl::_spawnMgr(const std::string &name)
{
nlinfo("*** spawnMgr(%s) NOT IMPLEMENTED YET ***",name.c_str());
return true;
}
bool CAIDSSpawnCtrl::_spawnMap(const std::string &name)
{
nlinfo("*** spawnMap(%s) NOT IMPLEMENTED YET ***",name.c_str());
return true;
}
bool CAIDSSpawnCtrl::_spawnAll()
{
nlinfo("*** spawnAll() NOT IMPLEMENTED YET ***");
return true;
}
//-------------------------------------------------------------------------
// DESPAWNING
bool CAIDSSpawnCtrl::_despawn(const std::string &name)
{
if (_despawnMap(name)) return true;
if (_despawnMgr(name)) return true;
if (_despawnGrp(name)) return true;
return false;
}
bool CAIDSSpawnCtrl::_despawnGrp(const std::string &name)
{
nlinfo("*** despawnGrp(%s) NOT IMPLEMENTED YET ***",name.c_str());
return true;
}
bool CAIDSSpawnCtrl::_despawnMgr(const std::string &name)
{
nlinfo("*** despawnMgr(%s) NOT IMPLEMENTED YET ***",name.c_str());
return true;
}
bool CAIDSSpawnCtrl::_despawnMap(const std::string &name)
{
// for each manager if map's name found in the command arguments then spawn()
nlinfo("*** despawnMap(%s) NOT IMPLEMENTED YET ***",name.c_str());
return true;
}
bool CAIDSSpawnCtrl::_despawnAll()
{
nlinfo("*** despawnAll() NOT IMPLEMENTED YET ***");
return true;
}
*/

@ -1,258 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// Nel Misc
#include "nel/net/service.h"
#include "nel/misc/command.h"
// Game share
#include "game_share/macro_manager.h"
// locals
#include "ai_files.h"
#include "ai_manager.h"
#include "ai_service.h"
using namespace NLMISC;
using namespace NLNET;
using namespace std;
//-------------------------------------------------------------------------
// utility routines
static void argsToManagerVector(const vector<string> &args, vector<CAIManager *> &theManagers)
{
if(args.size()==0)
{
for (uint i=0;i<CAIManager::numManagers();++i)
theManagers.push_back(CAIManager::getManagerByIdx(i));
}
else
{
for (uint i=0;i<args.size();++i)
{
int id=CAIManager::nameToId(args[i]);
if (i==-1)
nlwarning("Can't find a manger record for: %s",args[i].c_str());
else
theManagers.push_back(CAIManager::getManagerById(id));
}
}
}
//-------------------------------------------------------------------------
// scanning the hard disk for interesting files, compiling
// where nessessary and allerting ai_service(s) of data file changes
NLMISC_COMMAND(aiRescanDirectories,"Rescan disk file directories","")
{
if(args.size()!=0) return false;
COMMAND_MACRO_RECORD_TEST
CAIFiles::scan();
return true;
}
NLMISC_COMMAND(aiMake,"scan the hard disk for interesting files, recompile as necessary and allert services","")
{
COMMAND_MACRO_RECORD_TEST
// rescan the source and object directories for files
CAIFiles::scan();
// build the list of ai managers to act on
vector<CAIManager *> theManagers;
argsToManagerVector(args,theManagers);
// do the work
for (uint i=0;i<theManagers.size();++i)
{
if (theManagers[i]->needCompile())
{
//nlinfo("Compiling manager: %04d: %s",theManagers[i]->id(),theManagers[i]->name());
theManagers[i]->compile();
}
else
nlinfo("Manager is up to date: %04d: %s",theManagers[i]->id(),theManagers[i]->name().c_str());
}
return true;
}
NLMISC_COMMAND(aiClean,"delete all generated files on the hard disk (next 'make' will rebuild everything)","")
{
COMMAND_MACRO_RECORD_TEST
// rescan the source and object directories for files
CAIFiles::scan();
// build the list of ai managers to act on
vector<CAIManager *> theManagers;
argsToManagerVector(args,theManagers);
// do the work
for (uint i=0;i<theManagers.size();++i)
{
nlinfo("Cleaning: %04d: %s",theManagers[i]->id(),theManagers[i]->name().c_str());
theManagers[i]->clean();
}
return true;
}
//-------------------------------------------------------------------------
NLMISC_COMMAND(aiDisplayServices,"list the ai services, their parameters and their lists of running managers","[<service id>[...]]")
{
if(args.size()!=0) return false;
COMMAND_MACRO_RECORD_TEST
return true;
}
NLMISC_COMMAND(aiDisplayManagers,"Display the known ai manager list","[<manager name|id>[...]]")
{
COMMAND_MACRO_RECORD_TEST
// build the list of ai managers to act on
vector<CAIManager *> theManagers;
argsToManagerVector(args,theManagers);
// do the work
for (uint i=0;i<theManagers.size();++i)
theManagers[i]->display();
return true;
}
//-------------------------------------------------------------------------
NLMISC_COMMAND(aiOpenAllManagers,"Open all managers and automatically assign to ai services","")
{
if(args.size()!=0) return false;
COMMAND_MACRO_RECORD_TEST
for (uint i=0;i<CAIManager::numManagers();++i)
if (!CAIManager::getManagerByIdx(i)->isOpen())
CAIManager::getManagerByIdx(i)->open();
return true;
}
NLMISC_COMMAND(aiOpenManagers,"Open managers and automatically assign to ai services","<manager name|id>[...]")
{
if(args.size()<1) return false;
COMMAND_MACRO_RECORD_TEST
for (uint i=0;i<args.size();++i)
{
int id=CAIManager::nameToId(args[i]);
if (i==-1)
nlwarning("Can't find a manger record for: %s",args[i].c_str());
else
CAIManager::getManagerById(id)->open();
}
return true;
}
NLMISC_COMMAND(aiAssignManagers,"Open managers and assign to specified ai service","<service><manager name|id>[...]")
{
if(args.size()<2) return false;
COMMAND_MACRO_RECORD_TEST
// convert args[0] to service id and verify existance in services list
NLNET::TServiceId service(atoi(args[0].c_str()));
if (service.get()==0 && args[0]!="0")
{
nlwarning("Invalid service id: %s",args[0].c_str());
return false;
}
// iterate through args assigning managers to service
for (uint i=1;i<args.size();++i)
{
int id=CAIManager::nameToId(args[i]);
if (i==-1)
nlwarning("Can't find a manger record for: %s",args[i].c_str());
else
CAIManager::getManagerById(id)->assign(service);
}
return true;
}
NLMISC_COMMAND(aiReassignManagers,"Save & close managers on existing services and open on specified ai service","<service><manager name|id>[...]")
{
if(args.size()<2) return false;
COMMAND_MACRO_RECORD_TEST
// convert args[0] to service id and verify existance in services list
NLNET::TServiceId service(atoi(args[0].c_str()));
if (service.get()==0 && args[0]!="0")
{
nlwarning("Invalid service id: %s",args[0].c_str());
return false;
}
// iterate through args reassigning managers to service
for (uint i=1;i<args.size();++i)
{
int id=CAIManager::nameToId(args[i]);
if (i==-1)
nlwarning("Can't find a manger record for: %s",args[i].c_str());
else
CAIManager::getManagerById(id)->reassign(service);
}
return true;
}
//-------------------------------------------------------------------------
NLMISC_COMMAND(aiCloseAllManagers,"Close all managers across all ai services on the shard","")
{
if(args.size()!=0) return false;
COMMAND_MACRO_RECORD_TEST
for (uint i=0;i<CAIManager::numManagers();++i)
if (CAIManager::getManagerByIdx(i)->isOpen())
CAIManager::getManagerByIdx(i)->close();
return true;
}
NLMISC_COMMAND(aiCloseManagers,"Close listed managers","<manager name|id>[...]")
{
if(args.size()<1) return false;
COMMAND_MACRO_RECORD_TEST
for (uint i=0;i<args.size();++i)
{
int id=CAIManager::nameToId(args[i]);
if (i==-1)
nlwarning("Can't find a manger record for: %s",args[i].c_str());
else
CAIManager::getManagerById(id)->close();
}
return true;
}
//-------------------------------------------------------------------------

@ -1,253 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "nel/misc/command.h"
#include "game_share/bmp4image.h"
#include <vector>
using namespace std;
using namespace NLMISC;
#include <stack>
class CNeighbour
{
uint SurfaceCell;
uint CellSurfaceIdx;
uint8 Heading[16][16];
};
class CSurface
{
public:
CSurface()
{
memset(Points,0,sizeof(Points));
}
void addPoint(uint x,uint y)
{
Points[y]|=(1<<x);
}
void displayPoints()
{
char txt[]="0123456789abcdef";
nlinfo("Surface Points: ",txt);
for (uint j=0;j<16;++j)
{
for (uint i=0;i<16;++i)
txt[i]=(Points[j]&(1<<i))? ' ': '#';
nlinfo("- %s",txt);
}
}
sint16 Points[16]; // boolean map of surface shape
uint8 XNeighbours[16][16];
uint8 YNeighbours[16][16];
std::vector<CNeighbour> Neighbours;
};
class CCell
{
public:
sint8 Points[16][16]; // ends up with set of surface ids
std::vector <CSurface *> Surfaces;
};
void generateSurfaces(char *topLeft,uint lineLen,CCell &cell)
{
std::stack<uint> stack;
uint i,j;
// fill the points grid with -1 where accessible and -2 where inaccessible
uint goodCount=0, badCount=0;
for (j=0;j<16;++j)
for (i=0;i<16;++i)
if (*(topLeft+i+lineLen*j)==' ')
{
cell.Points[j][i]= -1;
++goodCount;
}
else
{
cell.Points[j][i]= -2;
++badCount;
}
// flood fill to convert -1s to surface ids
uint surfaceCount=~0u;
for (j=0;j<16;++j)
for (i=0;i<16;++i)
if (cell.Points[j][i]==-1)
{
CSurface *surface=new CSurface;
cell.Surfaces.push_back(surface);
++surfaceCount;
cell.Points[j][i]=surfaceCount;
stack.push(16*j+i);
while (!stack.empty())
{
// pop the coordinate off the stack
uint x=stack.top()&0xf;
uint y=stack.top()/16;
stack.pop();
// add the point to the surface
surface->addPoint(x,y);
// look for neighbouring points to add to the same surface
if (x<15 && cell.Points[y][x+1]==-1) { cell.Points[y][x+1]=surfaceCount; stack.push(16*y+ x+1); }
if (x>0 && cell.Points[y][x-1]==-1) { cell.Points[y][x-1]=surfaceCount; stack.push(16*y+ x-1); }
if (y<15 && cell.Points[y+1][x]==-1) { cell.Points[y+1][x]=surfaceCount; stack.push(16*y+16+ x); }
if (y>0 && cell.Points[y-1][x]==-1) { cell.Points[y-1][x]=surfaceCount; stack.push(16*y-16+ x); }
}
surface->displayPoints();
}
nlinfo("Generated %i surfaces, %i accessible cell.Points, %i inaccessible cell.Points",surfaceCount+1,goodCount,badCount);
for (j=0;j<16;++j)
{
char txt[17];
for (i=0;i<16;++i)
txt[i]=(cell.Points[j][i]>=0 && cell.Points[j][i]<=9)? cell.Points[j][i]+'0': '#';
txt[16]=0;
nlinfo("- surfaces: %s", txt);
}
}
static void generateSurfaceNeighbourhoods(
CCell *tl, CCell *tm, CCell *tr,
CCell *ml, CCell *mm, CCell *mr,
CCell *bl, CCell *bm, CCell *br)
{
// todo here!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// generate horizontal neighbours
// generate vertical neighbours
// * add propagation maps to the surfaces
// for each surface propagate out following neighbour map
}
NLMISC_COMMAND(dummyCrunch,"Run a test of pacs crunch","")
{
if(args.size()!=0)
return false;
char testMap[]=
"0000000000000000111111111111111100000000000000001111111111111111"
"0000000000000000111111111111111100000000000000001111111111111111"
"0000000000000000111111111111111100000000000000001111111111111111"
"000 111000 111"
"000 111"
"000 111000 111"
"000 00000000001111111111 111000 00000000001111111111 111"
"000 1 111000 1 111"
"000 1 111000 1 111"
"000 1 111000 1 111"
"000 1 111000 1 111"
"000 1 111000 1 111"
"000 1 111000 1 111"
"000 1 111000 1 111"
"000 000000000011111 1 111000 000000000011111 1 111"
"000 000000011111 1 111000 000000011111 1 111"
"222 222222233333 3 333222 222222233333 3 333"
"222222222222222233333 3 333222222222222222233333 3 333"
"222 3 333222 3 333"
"222 3 3 333"
"222 2222222222223333333333 333222 2222222222223333333333 333"
"22222 33322222 333"
"222 333222 333"
"222 333222 333"
"222222222222222233333333333333332222222222 22223333333333333333"
"22222222222222223 32222222222 22223333333333333333"
"22222222222222223 333333333333 32222222222 22223333333333333333"
"22222222222222223 33 33 32222222222 22223333333333333333"
"22222222222222223 33 32222222222 22223333333333333333"
"22222222222222223333 33 32222222222 22223333333333333333"
"222222222222222233333 333 2222 22223333333333333333"
"222222222222222233333333 33333322222 2222 22223333333333333333"
"0000000000000000111111111 1111100000 0000 00001111111111111111"
"00000000000000001111111111 111100000 0000 00001111111111111111"
"000000000000000011111111111 11100000 0000 00001111111111111111"
"000 11000 111"
"000 1000 111"
"000 1 000 111"
"000 00000000001111111111 11 00 00000000001111111111 111"
"000 1 111 0 1 111"
"000 1 1110 1 111"
"000 1 11100 1 111"
"000 1 111000 1 111"
"000 1 111000 1 111"
"000 1 111000 1 111"
"000 1 111000 1 111"
"000 000000000011111 1 111000 000000000011111 1 111"
"000 000000011111 1 111000 000000011111 1 111"
"222 222222233333 3 333222 222222233333 3 333"
"222222222222222233333 3 333222222222222222233333 3 333"
"222 3 333222 3 333"
"222 3 333222 3 333"
"222 2222222222223333333333 333222 2222222222223333333333 333"
"22222 33322222 333"
"222 333222 333"
"222 333222 333"
"2222222222222222333333333333333322222222222222223333333333333333"
"2222 222222222333 333333322 2222233 333"
"22222 22222222223333 33 33333333222 22 22 222222333 3 33333 3333"
"22222 22222222223333 33 33333333222 22 22 222222333 33 333 33333"
"22222 22222222223333 33 33333333222 22 22 222222333 333 3 333333"
"22222 22222222223333 33 33333333222 22 22 222222333 3333 3333333"
"2222 222222222333 333333322 2222233 333"
"2222222222222222333333333333333322222222222222223333333333333333";
int i,j;
// need to create a dummy cell that links into the cell grid in all slots as
// default value
// *** here ***
// setup a 4x4 cell grid in a 6x6 grid surrounded by NULLs
typedef CCell *TCellRef;
TCellRef cells[6][6];
memset (cells,0,sizeof(cells));
for (j=0;j<4;++j)
for (i=0;i<4;++i)
cells[j+1][i+1]=new CCell;
// generate surfaces
for (j=0;j<4;++j)
for (i=0;i<4;++i)
generateSurfaces(testMap+i*16+j*64*16,64,*cells[j+1][i+1]);
// generate surface neighbourhoods
for (j=0;j<4;++j)
for (i=0;i<4;++i)
generateSurfaceNeighbourhoods(
cells[1+j-1][1+i-1], cells[1+j-1][1+i+0], cells[1+j-1][1+i+1],
cells[1+j+0][1+i-1], cells[1+j+0][1+i+0], cells[1+j+0][1+i+1],
cells[1+j+1][1+i-1], cells[1+j+1][1+i+0], cells[1+j+1][1+i+1]
);
return true;
}

@ -1,73 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// include files
#include "nel/misc/types_nl.h"
#include "messages.h"
//#include "actor_manager.h"
using namespace NLMISC;
using namespace NLNET;
//-------------------------------------------------------------------------
// singleton initialisation and release
void CMessages::init()
{
// incoming messages
TRANSPORT_CLASS_REGISTER( CMsgAIServiceUp );
TRANSPORT_CLASS_REGISTER( CMsgAIManagerUp );
TRANSPORT_CLASS_REGISTER( CMsgAIFeedback );
TRANSPORT_CLASS_REGISTER( CMsgAICloseMgrs );
TRANSPORT_CLASS_REGISTER( CMsgAIBackupMgrs );
}
void CMessages::release()
{
}
//-------------------------------------------------------------------------
// incoming message callbacks
void CMsgAIServiceUp::callback (const std::string &serviceName, NLNET::TServiceId sid)
{
nlinfo("AI Service Up: %02d (CPU rating: %f RAMrating %f)", sid.get(), ProcessorAllocation,RamAllocation);
for (uint i=0;i<ManagersRunning.size();i++)
nlinfo("-- Running Manager: %04d",ManagersRunning[i]);
}
void CMsgAIManagerUp::callback (const std::string &serviceName, NLNET::TServiceId sid)
{
nlinfo("Service %d: Manager Up: %04d",sid.get(), MgrId);
}
void CMsgAIFeedback::callback (const std::string &serviceName, NLNET::TServiceId sid)
{
nlinfo("AI Manager %d: %s",Message.c_str());
}
//-------------------------------------------------------------------------
// stub outgoing message callbacks
void CMsgAICloseMgrs::callback(const std::string &serviceName, NLNET::TServiceId sid) {}
void CMsgAIBackupMgrs::callback(const std::string &serviceName, NLNET::TServiceId sid) {}

@ -1,34 +0,0 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef RYAI_MESSAGES_H
#define RYAI_MESSAGES_H
#include "ai_share/aids_messages.h"
#include "ai_share/ais_messages.h"
class CMessages
{
public:
// singleton initialisation and release
static void init();
static void release();
};
#endif

@ -1,9 +0,0 @@
x1. make: identify primitive files and display 'compile (%s)'
x2. link up the compiler - dump contents of the primitive file to console
3. create the binary file to send to the ais & save to disk (with hierachy)
4. setup messages between AIS & AIDS ( & remote ctrl )
static file name ids?
*** 2 places ais creates gpms message

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save