diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | configure.ac | 3 | ||||
-rw-r--r-- | src/game-server/command.cpp | 59 | ||||
-rw-r--r-- | src/game-server/itemmanager.cpp | 30 | ||||
-rw-r--r-- | src/game-server/itemmanager.hpp | 5 | ||||
-rw-r--r-- | src/game-server/monstermanager.cpp | 38 | ||||
-rw-r--r-- | src/game-server/monstermanager.hpp | 5 |
7 files changed, 125 insertions, 26 deletions
@@ -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(); |