summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErik Schilling <ablu.erikschilling@googlemail.com>2013-04-15 21:16:11 +0200
committerErik Schilling <ablu.erikschilling@googlemail.com>2013-05-08 14:02:51 +0200
commit7b289c333a6c5735dffa504c8482aee3b648b6cd (patch)
treefb2cefe9c725a61a56c469be21a7c9806fcc8fae
parentc988f165e83a4fe21dd3d26bc89a9d618b329928 (diff)
downloadmanaserv-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.cpp30
-rw-r--r--src/game-server/character.h2
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. */