summaryrefslogtreecommitdiffstats
path: root/src/game-server/item.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game-server/item.cpp')
-rw-r--r--src/game-server/item.cpp42
1 files changed, 28 insertions, 14 deletions
diff --git a/src/game-server/item.cpp b/src/game-server/item.cpp
index 15041ad..1ca6461 100644
--- a/src/game-server/item.cpp
+++ b/src/game-server/item.cpp
@@ -47,15 +47,15 @@ void ItemEffectAttrMod::dispell(Being *itemUser)
mId, !mDuration);
}
-bool ItemEffectAttack::apply(Being * /* itemUser */)
+bool ItemEffectAttack::apply(Being *itemUser)
{
- // TODO - STUB
+ itemUser->addAttack(mAttackInfo);
return false;
}
-void ItemEffectAttack::dispell(Being * /* itemUser */)
+void ItemEffectAttack::dispell(Being *itemUser)
{
- // TODO
+ itemUser->removeAttack(mAttackInfo);
}
ItemEffectScript::~ItemEffectScript()
@@ -105,12 +105,18 @@ ItemClass::~ItemClass()
delete mEffects.begin()->second;
mEffects.erase(mEffects.begin());
}
+
+ for (std::vector<AttackInfo *>::iterator it = mAttackInfos.begin(),
+ it_end = mAttackInfos.end();
+ it != it_end; ++it)
+ {
+ delete *it;
+ }
}
void ItemClass::addEffect(ItemEffectInfo *effect,
ItemTriggerType id,
ItemTriggerType dispell)
-{
mEffects.insert(std::make_pair(id, effect));
if (dispell)
mDispells.insert(std::make_pair(dispell, effect));
@@ -121,21 +127,29 @@ bool ItemClass::useTrigger(Being *itemUser, ItemTriggerType trigger)
if (!trigger)
return false;
- std::pair<std::multimap< ItemTriggerType, ItemEffectInfo * >::iterator,
- std::multimap< ItemTriggerType, ItemEffectInfo * >::iterator>
- rn = mEffects.equal_range(trigger);
+ std::multimap<ItemTriggerType, ItemEffectInfo *>::iterator it, it_end;
+
bool ret = false;
- while (rn.first != rn.second)
- if (rn.first++->second->apply(itemUser))
- ret = true;
+ for (it = mEffects.begin(), it_end = mEffects.end(); it != it_end; ++it)
+ if (it->first == trigger)
+ if (it->second->apply(itemUser))
+ ret = true;
- rn = mDispells.equal_range(trigger);
- while (rn.first != rn.second)
- rn.first++->second->dispell(itemUser);
+ for (it = mDispells.begin(), it_end = mDispells.end(); it != it_end; ++it)
+ if (it->first == trigger)
+ it->second->dispell(itemUser);
return ret;
}
+void ItemClass::addAttack(AttackInfo *attackInfo,
+ ItemTriggerType applyTrigger,
+ ItemTriggerType dispellTrigger)
+{
+ mAttackInfos.push_back(attackInfo);
+ addEffect(new ItemEffectAttack(attackInfo), applyTrigger, dispellTrigger);
+}
+
Item::Item(ItemClass *type, int amount)
: Actor(OBJECT_ITEM), mType(type), mAmount(amount)