summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-08-31 06:44:06 +0000
committerGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-08-31 06:44:06 +0000
commit4b43c8653a267ff3ac7224805f4522a94be9fab7 (patch)
treeadd08caeb5778cef86fccf8272a8e86c29ee3aaf
parent9f930eb2a24dd811633a9f6f7eb3a36310ebc8d5 (diff)
downloadmanaserv-4b43c8653a267ff3ac7224805f4522a94be9fab7.tar.gz
manaserv-4b43c8653a267ff3ac7224805f4522a94be9fab7.tar.xz
manaserv-4b43c8653a267ff3ac7224805f4522a94be9fab7.zip
Implemented "reload" remote command.
-rw-r--r--ChangeLog11
-rw-r--r--configure.ac3
-rw-r--r--src/game-server/command.cpp59
-rw-r--r--src/game-server/itemmanager.cpp30
-rw-r--r--src/game-server/itemmanager.hpp5
-rw-r--r--src/game-server/monstermanager.cpp38
-rw-r--r--src/game-server/monstermanager.hpp5
7 files changed, 125 insertions, 26 deletions
diff --git a/ChangeLog b/ChangeLog
index f3a691d..f47318f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,13 @@
-2007-08-29 Guillaume Melquiond <guillaume.melquiond@gmail.com>
+2007-08-31 Guillaume Melquiond <guillaume.melquiond@gmail.com>
+
+ * configure.ac: Fixed detection of generic lua.pc file.
+ * src/game-server/itemmanager.cpp, src/game-server/itemmanager.hpp,
+ src/game-server/monstermanager.cpp, src/game-server/monstermanager.hpp:
+ Modified loading of reference files, so that it is possible to reload
+ them.
+ * src/game-server/command.cpp: Implemented "reload" remote command.
+
+2007-08-30 Guillaume Melquiond <guillaume.melquiond@gmail.com>
* src/account-server/storage.hpp, src/account-server/storage.cpp,
src/account-server/main-account.cpp: Removed abstract Storage. Relied
diff --git a/configure.ac b/configure.ac
index 4aebed8..e73c9db 100644
--- a/configure.ac
+++ b/configure.ac
@@ -100,7 +100,8 @@ AC_ARG_ENABLE(
)
if test "$enable_lua_engine" = "yes"; then
- PKG_CHECK_MODULES(LUA, [lua5.1 >= 5.1])
+ PKG_CHECK_MODULES(LUA, [lua >= 5.1], ,
+ [PKG_CHECK_MODULES(LUA, [lua5.1 >= 5.1])])
CXXFLAGS="$CXXFLAGS $LUA_CFLAGS"
LIBS="$LIBS $LUA_LIBS"
fi
diff --git a/src/game-server/command.cpp b/src/game-server/command.cpp
index 41bee29..dfb218f 100644
--- a/src/game-server/command.cpp
+++ b/src/game-server/command.cpp
@@ -34,32 +34,42 @@
#include "game-server/monstermanager.hpp"
#include "game-server/state.hpp"
+template< typename T >
+static T proxy_cast(intptr_t v)
+{ return (T)v; }
+
+template<>
+static std::string const &proxy_cast(intptr_t v)
+{ return *(std::string const *)v; }
+
template< typename T1 >
-static void proxy(void (*f)(), Character *from, intptr_t args[1])
+static void proxy(void (*f)(), Character *from, intptr_t const args[1])
{
((void (*)(Character *, T1))f)
- (from, (T1)args[0]);
+ (from, proxy_cast<T1>(args[0]));
}
template< typename T1, typename T2 >
-static void proxy(void (*f)(), Character *from, intptr_t args[2])
+static void proxy(void (*f)(), Character *from, intptr_t const args[2])
{
((void (*)(Character *, T1, T2))f)
- (from, (T1)args[0], (T2)args[1]);
+ (from, proxy_cast<T1>(args[0]), proxy_cast<T2>(args[1]));
}
template< typename T1, typename T2, typename T3 >
-static void proxy(void (*f)(), Character *from, intptr_t args[3])
+static void proxy(void (*f)(), Character *from, intptr_t const args[3])
{
((void (*)(Character *, T1, T2, T3))f)
- (from, (T1)args[0], (T2)args[1], (T3)args[2]);
+ (from, proxy_cast<T1>(args[0]), proxy_cast<T2>(args[1]),
+ proxy_cast<T3>(args[2]));
}
template< typename T1, typename T2, typename T3, typename T4 >
-static void proxy(void (*f)(), Character *from, intptr_t args[4])
+static void proxy(void (*f)(), Character *from, intptr_t const args[4])
{
((void (*)(Character *, T1, T2, T3, T4))f)
- (from, (T1)args[0], (T2)args[1], (T3)args[2], (T4)args[3]);
+ (from, proxy_cast<T1>(args[0]), proxy_cast<T2>(args[1]),
+ proxy_cast<T3>(args[2]), proxy_cast<T4>(args[3]));
}
/**
@@ -70,6 +80,8 @@ template< typename T > struct Argument;
template<> struct Argument< int >
{ static char const type = 'n'; };
+template<> struct Argument< std::string const & >
+{ static char const type = 's'; };
template<> struct Argument< Character * >
{ static char const type = 'c'; };
template<> struct Argument< MapComposite * >
@@ -85,7 +97,7 @@ template<> struct Argument< MonsterClass * >
struct Command
{
char const *name;
- void (*handler)(void (*f)(), Character *, intptr_t[]);
+ void (*handler)(void (*f)(), Character *, intptr_t const[]);
void (*target)();
char type[4];
unsigned char level;
@@ -221,6 +233,18 @@ static void recall(Character *from, Character *ch)
GameState::enqueueEvent(ch, e);
}
+static void reload(Character *from, std::string const &db)
+{
+ if (db == "items")
+ {
+ ItemManager::reload();
+ }
+ else if (db == "monsters")
+ {
+ MonsterManager::reload();
+ }
+}
+
/**
* List of remote commands.
*/
@@ -233,6 +257,7 @@ static Command const commands[] =
handle("spawn", AL_GM, spawn),
handle("goto", AL_GM, goto_),
handle("recall", AL_GM, recall),
+ handle("reload", AL_ADMIN, reload),
};
/**
@@ -348,8 +373,24 @@ void runCommand(Character *ch, std::string const &text)
return;
}
break;
+
+ case 's':
+ args[i] = (intptr_t)new std::string(arg);
+ break;
+
}
pos = pos2;
}
+
+ // Call the command handler.
c->handler(c->target, ch, args);
+
+ // Delete dynamic arguments.
+ for (int i = 0; i < 4 && c->type[i]; ++i)
+ {
+ if (c->type[i] == 's')
+ {
+ delete (std::string *)args[i];
+ }
+ }
}
diff --git a/src/game-server/itemmanager.cpp b/src/game-server/itemmanager.cpp
index 2df0df7..232d427 100644
--- a/src/game-server/itemmanager.cpp
+++ b/src/game-server/itemmanager.cpp
@@ -23,17 +23,25 @@
#include <map>
+#include "game-server/itemmanager.hpp"
+
#include "defines.h"
#include "resourcemanager.h"
#include "game-server/item.hpp"
-#include "game-server/itemmanager.hpp"
#include "utils/logger.h"
#include "utils/xml.hpp"
typedef std::map< int, ItemClass * > ItemClasses;
static ItemClasses itemClasses; /**< Item reference */
+static std::string itemReferenceFile;
-void ItemManager::initialize(std::string const &itemReferenceFile)
+void ItemManager::initialize(std::string const &file)
+{
+ itemReferenceFile = file;
+ reload();
+}
+
+void ItemManager::reload()
{
ResourceManager *resman = ResourceManager::getInstance();
int size;
@@ -73,7 +81,8 @@ void ItemManager::initialize(std::string const &itemReferenceFile)
continue;
}
- unsigned id = XML::getProperty(node, "id", 0);
+ int id = XML::getProperty(node, "id", 0);
+ int itemType = XML::getProperty(node, "type", 0);
if (id == 0)
{
@@ -82,7 +91,18 @@ void ItemManager::initialize(std::string const &itemReferenceFile)
continue;
}
- int itemType = XML::getProperty(node, "type", 0);
+ ItemClass *item;
+ ItemClasses::iterator i = itemClasses.find(id);
+ if (i == itemClasses.end())
+ {
+ item = new ItemClass(id, itemType);
+ itemClasses[id] = item;
+ }
+ else
+ {
+ item = i->second;
+ }
+
int weight = XML::getProperty(node, "weight", 0);
int value = XML::getProperty(node, "value", 0);
int maxPerSlot = XML::getProperty(node, "max_per_slot", 0);
@@ -130,14 +150,12 @@ void ItemManager::initialize(std::string const &itemReferenceFile)
weight = 1;
}
- ItemClass *item = new ItemClass(id, itemType);
item->setWeight(weight);
item->setCost(value);
item->setMaxPerSlot(maxPerSlot);
//item->setScriptName(scriptName);
item->setModifiers(modifiers);
item->setSpriteID(sprite ? sprite : id);
- itemClasses[id] = item;
++nbItems;
LOG_DEBUG("Item: ID: " << id << ", itemType: " << itemType
diff --git a/src/game-server/itemmanager.hpp b/src/game-server/itemmanager.hpp
index 25e3e94..a4743d6 100644
--- a/src/game-server/itemmanager.hpp
+++ b/src/game-server/itemmanager.hpp
@@ -36,6 +36,11 @@ namespace ItemManager
void initialize(std::string const &);
/**
+ * Reloads item reference file.
+ */
+ void reload();
+
+ /**
* Destroy item classes.
*/
void deinitialize();
diff --git a/src/game-server/monstermanager.cpp b/src/game-server/monstermanager.cpp
index 36ee1ee..31c00ad 100644
--- a/src/game-server/monstermanager.cpp
+++ b/src/game-server/monstermanager.cpp
@@ -23,25 +23,34 @@
#include <map>
+#include "game-server/monstermanager.hpp"
+
#include "defines.h"
#include "resourcemanager.h"
#include "game-server/itemmanager.hpp"
#include "game-server/monster.hpp"
-#include "game-server/monstermanager.hpp"
#include "utils/logger.h"
#include "utils/xml.hpp"
typedef std::map< int, MonsterClass * > MonsterClasses;
static MonsterClasses monsterClasses; /**< Monster reference */
+static std::string monsterReferenceFile;
void MonsterManager::initialize(std::string const &file)
{
+ monsterReferenceFile = file;
+ reload();
+}
+
+void MonsterManager::reload()
+{
ResourceManager *resman = ResourceManager::getInstance();
int size;
- char *data = (char *)resman->loadFile(file, size);
+ char *data = (char *)resman->loadFile(monsterReferenceFile, size);
if (!data) {
- LOG_ERROR("Monster Manager: Could not find " << file << "!");
+ LOG_ERROR("Monster Manager: Could not find "
+ << monsterReferenceFile << "!");
free(data);
return;
}
@@ -52,14 +61,14 @@ void MonsterManager::initialize(std::string const &file)
if (!doc)
{
LOG_ERROR("Monster Manager: Error while parsing item database ("
- << file << ")!");
+ << monsterReferenceFile << ")!");
return;
}
xmlNodePtr node = xmlDocGetRootElement(doc);
if (!node || !xmlStrEqual(node->name, BAD_CAST "monsters"))
{
- LOG_ERROR("Monster Manager: " << file
+ LOG_ERROR("Monster Manager: " << monsterReferenceFile
<< " is not a valid database file!");
xmlFreeDoc(doc);
return;
@@ -79,10 +88,22 @@ void MonsterManager::initialize(std::string const &file)
if (id == 0)
{
LOG_WARN("Monster Manager: There is a monster without ID in "
- << file << "! It has been ignored.");
+ << monsterReferenceFile << "! It has been ignored.");
continue;
}
+ MonsterClass *monster;
+ MonsterClasses::iterator i = monsterClasses.find(id);
+ if (i == monsterClasses.end())
+ {
+ monster = new MonsterClass(id);
+ monsterClasses[id] = monster;
+ }
+ else
+ {
+ monster = i->second;
+ }
+
MonsterDrops drops;
for (xmlNodePtr subnode = node->xmlChildrenNode; subnode != NULL;
@@ -100,13 +121,12 @@ void MonsterManager::initialize(std::string const &file)
}
}
- MonsterClass *monster = new MonsterClass(id);
monster->setDrops(drops);
- monsterClasses[id] = monster;
++nbMonsters;
}
- LOG_INFO("Loaded " << nbMonsters << " monsters from " << file << '.');
+ LOG_INFO("Loaded " << nbMonsters << " monsters from "
+ << monsterReferenceFile << '.');
xmlFreeDoc(doc);
}
diff --git a/src/game-server/monstermanager.hpp b/src/game-server/monstermanager.hpp
index adfaf5e..a4de99c 100644
--- a/src/game-server/monstermanager.hpp
+++ b/src/game-server/monstermanager.hpp
@@ -36,6 +36,11 @@ namespace MonsterManager
void initialize(std::string const &);
/**
+ * Reloads monster reference file.
+ */
+ void reload();
+
+ /**
* Destroy monster classes.
*/
void deinitialize();