diff options
author | Erik Schilling <ablu.erikschilling@googlemail.com> | 2012-06-10 15:11:01 +0200 |
---|---|---|
committer | Erik Schilling <ablu.erikschilling@googlemail.com> | 2013-01-08 16:58:57 +0100 |
commit | 6f287f239e9d94707735b183d6c6b89eea9fef20 (patch) | |
tree | 694427dbff77f73a1a3a4f84b4f53269a4763f74 /src/game-server/item.cpp | |
parent | 0f0004ff3e286270c0425642a5669661ef6cb592 (diff) | |
download | manaserv-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.cpp | 42 |
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) |