summaryrefslogtreecommitdiff
path: root/src/game-server/item.cpp
diff options
context:
space:
mode:
authorErik Schilling <ablu.erikschilling@googlemail.com>2012-06-10 15:11:01 +0200
committerErik Schilling <ablu.erikschilling@googlemail.com>2013-01-08 16:58:57 +0100
commit6f287f239e9d94707735b183d6c6b89eea9fef20 (patch)
tree694427dbff77f73a1a3a4f84b4f53269a4763f74 /src/game-server/item.cpp
parent0f0004ff3e286270c0425642a5669661ef6cb592 (diff)
downloadmanaserv-6f287f239e9d94707735b183d6c6b89eea9fef20.tar.gz
manaserv-6f287f239e9d94707735b183d6c6b89eea9fef20.tar.bz2
manaserv-6f287f239e9d94707735b183d6c6b89eea9fef20.tar.xz
manaserv-6f287f239e9d94707735b183d6c6b89eea9fef20.zip
Work on (Auto)Attack system.
During the implementation bjorn and I agreed to limit the number of attacks that can be used in the same tick to one. This makes a lot of stuff easier and the client cannot display two frames at the same time Things done: - Implemented setting of attacks when equipping/unequipping items - Single place where the xml attack node is parsed - Finished attack logic - Unified the attack handling of monsters and characters - Added a global cooldown after attack use (not only for next use of same attack) - Removed the temponary attributes for the monster attack values - Priorities for all attacks - Rewrote the attack core: - Attacks now have this attributes: - warmup -> time a attack needs after starting it to actually deal the damage - cooldown -> time a attack needs after dealing damage before another attack can be used - reuse -> time before the same attack can be used again - If no attack is performed at the moment the following is done: - make a list with all ready attacks - check for attack that has the necessarily range and highest priority - start this attack (inform client about it) - when warmup is finished -> trigger damage - when cooldown is finished -> allow to use other (or the same if reusetimer allows) attacks TODO: - sync client with this to allow better timed animations
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 15041ad2..1ca64619 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)