diff options
author | Erik Schilling <ablu.erikschilling@googlemail.com> | 2013-04-15 21:16:11 +0200 |
---|---|---|
committer | Erik Schilling <ablu.erikschilling@googlemail.com> | 2013-08-26 22:56:46 +0200 |
commit | 3598685c0fcbb9b5fdbcdbbaee258e2b55d5c98a (patch) | |
tree | f1ca3741ed9b209223fe099c19f3a6923c889915 /src/game-server/character.cpp | |
parent | aaafcbbad4bca55f1cb27fb91d103ebcd64e666e (diff) | |
download | manaserv-3598685c0fcbb9b5fdbcdbbaee258e2b55d5c98a.tar.gz manaserv-3598685c0fcbb9b5fdbcdbbaee258e2b55d5c98a.tar.bz2 manaserv-3598685c0fcbb9b5fdbcdbbaee258e2b55d5c98a.tar.xz manaserv-3598685c0fcbb9b5fdbcdbbaee258e2b55d5c98a.zip |
[Abilities] Only send status for actually changed abilities
Previously *every* ability was spammed over the network regardless
whether it was changed or not.
Diffstat (limited to 'src/game-server/character.cpp')
-rw-r--r-- | src/game-server/character.cpp | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/src/game-server/character.cpp b/src/game-server/character.cpp index d9462ca4..9299f718 100644 --- a/src/game-server/character.cpp +++ b/src/game-server/character.cpp @@ -75,7 +75,6 @@ CharacterComponent::CharacterComponent(Entity &entity, MessageIn &msg): mClient(nullptr), mConnected(true), mTransactionHandler(nullptr), - mAbilitiesUpdateNeeded(false), mDatabaseID(-1), mHairStyle(0), mHairColor(0), @@ -140,6 +139,9 @@ CharacterComponent::CharacterComponent(Entity &entity, MessageIn &msg): beingComponent->signal_attribute_changed.connect(sigc::mem_fun( this, &CharacterComponent::attributeChanged)); + + for (auto &abilityIt : mAbilities) + mModifiedAbilities.insert(abilityIt.first); } CharacterComponent::~CharacterComponent() @@ -181,11 +183,8 @@ void CharacterComponent::update(Entity &entity) } } - if (mAbilitiesUpdateNeeded) - { + if (!mModifiedAbilities.empty()) sendAbilityUpdate(); - mAbilitiesUpdateNeeded = false; - } } void CharacterComponent::characterDied(Entity *being) @@ -308,7 +307,8 @@ bool CharacterComponent::giveAbility(int id, int currentPoints) } mAbilities.insert(std::pair<int, AbilityValue>( id, AbilityValue(currentPoints, abilityInfo))); - mAbilitiesUpdateNeeded = true; + + mModifiedAbilities.insert(id); return true; } return false; @@ -320,7 +320,7 @@ bool CharacterComponent::setAbilityMana(int id, int mana) if (it != mAbilities.end()) { it->second.currentPoints = mana; - mAbilitiesUpdateNeeded = true; + mModifiedAbilities.insert(id); return true; } return false; @@ -332,7 +332,7 @@ bool CharacterComponent::setAbilityRechargeSpeed(int id, int speed) if (it != mAbilities.end()) { it->second.rechargeSpeed = speed; - mAbilitiesUpdateNeeded = true; + mModifiedAbilities.insert(id); return true; } return false; @@ -340,18 +340,20 @@ bool CharacterComponent::setAbilityRechargeSpeed(int id, int speed) void CharacterComponent::sendAbilityUpdate() { - //GPMSG_ABILITY_STATUS = 0x0293, - // { B abilityID, L current, L max, L recharge } - MessageOut msg(GPMSG_ABILITY_STATUS); - for (AbilityMap::iterator it = mAbilities.begin(), it_end = mAbilities.end(); - it != it_end; ++it) + for (unsigned id : mModifiedAbilities) { - msg.writeInt8(it->first); + auto it = mAbilities.find(id); + if (it == mAbilities.end()) + continue; // got deleted + + msg.writeInt8(id); msg.writeInt32(it->second.currentPoints); msg.writeInt32(it->second.abilityInfo->neededPoints); msg.writeInt32(it->second.rechargeSpeed); } + + mModifiedAbilities.clear(); gameHandler->sendTo(mClient, msg); } |