diff options
author | Roderic Morris <roderic@ccs.neu.edu> | 2008-10-22 17:40:42 +0000 |
---|---|---|
committer | Roderic Morris <roderic@ccs.neu.edu> | 2008-10-22 17:40:42 +0000 |
commit | 5a4e1ac688d83a46b6c6cb5c4945535f1ae4151f (patch) | |
tree | e608f83b2813e0f0d727fb3dac21096ef35fa03e /src | |
parent | dbc83dae37dff1338e1ee6358a0a8d10103278b0 (diff) | |
download | manaserv-5a4e1ac688d83a46b6c6cb5c4945535f1ae4151f.tar.gz manaserv-5a4e1ac688d83a46b6c6cb5c4945535f1ae4151f.tar.bz2 manaserv-5a4e1ac688d83a46b6c6cb5c4945535f1ae4151f.tar.xz manaserv-5a4e1ac688d83a46b6c6cb5c4945535f1ae4151f.zip |
added on use scripts (by Kage_Jittai)
Diffstat (limited to 'src')
-rw-r--r-- | src/game-server/item.cpp | 10 | ||||
-rw-r--r-- | src/game-server/item.hpp | 14 | ||||
-rw-r--r-- | src/game-server/itemmanager.cpp | 17 |
3 files changed, 37 insertions, 4 deletions
diff --git a/src/game-server/item.cpp b/src/game-server/item.cpp index 4d0530f8..5a5c3da0 100644 --- a/src/game-server/item.cpp +++ b/src/game-server/item.cpp @@ -29,6 +29,7 @@ #include "game-server/attackzone.hpp" #include "game-server/being.hpp" +#include "scripting/script.hpp" WeaponType weaponTypeFromString (const std::string &name) { @@ -140,12 +141,19 @@ void ItemModifiers::cancelAttributes(Being *b) const ItemClass::~ItemClass() { if (mAttackZone) delete mAttackZone; + if (mScript) delete mScript; } bool ItemClass::use(Being *itemUser) { if (mType != ITEM_USABLE) return false; - + if (mScript) + { + mScript->prepare("item_use"); + mScript->push(mDatabaseID); + mScript->push(itemUser); + mScript->execute(); + } mModifiers.applyAttributes(itemUser); return true; } diff --git a/src/game-server/item.hpp b/src/game-server/item.hpp index e0d8943f..3878755e 100644 --- a/src/game-server/item.hpp +++ b/src/game-server/item.hpp @@ -27,6 +27,8 @@ #include <vector> #include "game-server/object.hpp" +#include "scripting/script.hpp" + class AttackZone; class Being; @@ -175,8 +177,8 @@ class ItemModifiers class ItemClass { public: - ItemClass(int id, ItemType type) - : mDatabaseID(id), mType(type), mAttackZone(NULL) + ItemClass(int id, ItemType type, Script *s = NULL) + : mDatabaseID(id), mType(type), mAttackZone(NULL), mScript(NULL) {} ~ItemClass(); @@ -260,6 +262,12 @@ class ItemClass { return mSpriteID; } /** + * Sets the script that is to be used + */ + void setScript(Script *s) + { mScript = s; } + + /** * Set attack zone (only needed when the item is a weapon) */ void setAttackZone(AttackZone* attackZone) { mAttackZone = attackZone; } @@ -272,6 +280,8 @@ class ItemClass private: + //Script for using items + Script *mScript; // Item reference information unsigned short mDatabaseID; diff --git a/src/game-server/itemmanager.cpp b/src/game-server/itemmanager.cpp index 159b8356..65419011 100644 --- a/src/game-server/itemmanager.cpp +++ b/src/game-server/itemmanager.cpp @@ -33,6 +33,8 @@ #include "utils/logger.h" #include "utils/xml.hpp" +#include <sstream> + typedef std::map< int, ItemClass * > ItemClasses; static ItemClasses itemClasses; /**< Item reference */ static std::string itemReferenceFile; @@ -179,10 +181,23 @@ void ItemManager::reload() weight = 1; } + Script *s; + //TODO: Clean this up some + std::stringstream filename; + filename << "scripts/items/" << id << ".lua"; + + if(ResourceManager::exists(filename.str())) //file exists! + { + LOG_INFO("Loading item script: " + filename.str()); + s = Script::create("lua"); + s->loadFile(filename.str()); + } + + item->setWeight(weight); item->setCost(value); item->setMaxPerSlot(maxPerSlot); - //item->setScriptName(scriptName); + item->setScript(s); item->setModifiers(modifiers); item->setSpriteID(sprite ? sprite : id); ++nbItems; |