From 5ae62661c90389d6456e5be75d240fb95b68b2cb Mon Sep 17 00:00:00 2001 From: Philipp Sehmisch Date: Thu, 17 Sep 2009 22:18:59 +0200 Subject: Added the possibility to define a monster script for a whole monster class in monsters.xml --- src/game-server/monster.cpp | 17 ++++++++++++++++- src/game-server/monster.hpp | 13 +++++++++++-- src/game-server/monstermanager.cpp | 6 ++++++ 3 files changed, 33 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/game-server/monster.cpp b/src/game-server/monster.cpp index f7d2bac6..1cb6806b 100644 --- a/src/game-server/monster.cpp +++ b/src/game-server/monster.cpp @@ -93,6 +93,9 @@ Monster::Monster(MonsterClass *specy): mAttackPositions.push_back(AttackPosition(-dist, 0, DIRECTION_RIGHT)); mAttackPositions.push_back(AttackPosition(0, dist, DIRECTION_DOWN)); mAttackPositions.push_back(AttackPosition(0, -dist, DIRECTION_UP)); + + //load default script + loadScript(specy->getScript()); } Monster::~Monster() @@ -293,7 +296,19 @@ void Monster::update() void Monster::loadScript(std::string &scriptName) { if (mScript) - return; // A script has already been loaded for this monster + { + delete mScript;// A script has already been loaded for this monster + } + + if (scriptName.length() == 0) + { + if (mScript) + { + delete mScript; + mScript = NULL; + } + return; + } std::stringstream filename; filename << "scripts/monster/" << scriptName; diff --git a/src/game-server/monster.hpp b/src/game-server/monster.hpp index 8dc2102b..d99f77d3 100644 --- a/src/game-server/monster.hpp +++ b/src/game-server/monster.hpp @@ -76,7 +76,8 @@ class MonsterClass mTrackRange(1), mStrollRange(0), mMutation(0), - mAttackDistance(0) + mAttackDistance(0), + mScript("") {} /** @@ -163,6 +164,12 @@ class MonsterClass /** Returns all attacks of the monster. */ const MonsterAttacks &getAttacks() const { return mAttacks; } + /** sets the script file for the monster */ + void setScript(std::string& filename) { mScript = filename; } + + /** Returns script filename */ + std::string &getScript() { return mScript; } + /** * Randomly selects a monster drop (may return NULL). */ @@ -182,6 +189,7 @@ class MonsterClass unsigned mMutation; unsigned mAttackDistance; MonsterAttacks mAttacks; + std::string mScript; }; /** @@ -284,7 +292,8 @@ class Monster : public Being MonsterClass *mSpecy; /** - * Stores script for the monster, null if no script exist + * Stores individual script for the monster, when NULL the script + * from mSpecy is used. */ Script *mScript; diff --git a/src/game-server/monstermanager.cpp b/src/game-server/monstermanager.cpp index 426a2249..080dcbfc 100644 --- a/src/game-server/monstermanager.cpp +++ b/src/game-server/monstermanager.cpp @@ -259,6 +259,12 @@ void MonsterManager::reload() } } + else if (xmlStrEqual(subnode->name, BAD_CAST "script")) + { + xmlChar *filename = subnode->xmlChildrenNode->content; + std::string val = (char *)filename; + monster->setScript(val); + } } monster->setDrops(drops); -- cgit v1.2.3-60-g2f50