diff options
author | Erik Schilling <ablu.erikschilling@googlemail.com> | 2013-04-15 21:16:11 +0200 |
---|---|---|
committer | Erik Schilling <ablu.erikschilling@googlemail.com> | 2013-05-08 14:02:51 +0200 |
commit | 7b289c333a6c5735dffa504c8482aee3b648b6cd (patch) | |
tree | fb2cefe9c725a61a56c469be21a7c9806fcc8fae | |
parent | c988f165e83a4fe21dd3d26bc89a9d618b329928 (diff) | |
download | manaserv-7b289c333a6c5735dffa504c8482aee3b648b6cd.tar.gz manaserv-7b289c333a6c5735dffa504c8482aee3b648b6cd.tar.xz manaserv-7b289c333a6c5735dffa504c8482aee3b648b6cd.zip |
[Abilities] Only send status for actually changed abilities
Previously *every* ability was spammed over the network regardless
whether it was changed or not.
-rw-r--r-- | src/game-server/character.cpp | 30 | ||||
-rw-r--r-- | src/game-server/character.h | 2 |
2 files changed, 17 insertions, 15 deletions
diff --git a/src/game-server/character.cpp b/src/game-server/character.cpp index d9462ca..9299f71 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); } diff --git a/src/game-server/character.h b/src/game-server/character.h index d4dd0fd..9b17969 100644 --- a/src/game-server/character.h +++ b/src/game-server/character.h @@ -536,7 +536,7 @@ class CharacterComponent : public Component std::map<int, int> mExperience; /**< experience collected for each skill.*/ AbilityMap mAbilities; - bool mAbilitiesUpdateNeeded; + std::set<unsigned> mModifiedAbilities; int mDatabaseID; /**< Character's database ID. */ unsigned char mHairStyle; /**< Hair Style of the character. */ |