aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp39
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.h4
-rwxr-xr-xsrc/server/game/Server/Protocol/Opcodes.cpp2
3 files changed, 35 insertions, 10 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index df8ee5be2ec..f912fd92cea 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -13608,22 +13608,45 @@ void Unit::SetMaxHealth(uint32 val)
SetHealth(val);
}
-void Unit::SetPower(Powers power, int32 val)
+uint32 Unit::GetPowerIndexByClass(uint32 powerId, uint32 classId) const
{
- if (GetPower(power) == val)
- return;
+ ChrClassesEntry const* m_class = sChrClassesStore.LookupEntry(classId);
- int32 maxPower = (int32)GetMaxPower(power);
+ ASSERT(m_class && "Class not found");
+
+ uint32 index = 0;
+
+ for (uint32 i = 0; i <= sChrPowerTypesStore.GetNumRows(); i++)
+ {
+ ChrPowerTypesEntry const* cEntry = sChrPowerTypesStore.LookupEntry(i);
+
+ if (!cEntry)
+ continue;
+
+ if (classId != cEntry->classId)
+ continue;
+
+ if (powerId == cEntry->power)
+ return index;
+
+ index++;
+ }
+ return 0;
+};
+
+void Unit::SetPower(Powers power, uint32 val)
+{
+ uint32 maxPower = GetMaxPower(power);
if (maxPower < val)
val = maxPower;
- SetStatInt32Value(UNIT_FIELD_POWER1 + power, val);
+ SetStatInt32Value(UNIT_FIELD_POWER1 + GetPowerIndexByClass(power, getClass()), val);
WorldPacket data(SMSG_POWER_UPDATE);
data.append(GetPackGUID());
- data << int32(1); // Unk
- data << uint8(power);
- data << int32(val);
+ data << uint32(1);//unk
+ data << uint8(GetPowerIndexByClass(power, getClass()));
+ data << uint32(val);
SendMessageToSet(&data, GetTypeId() == TYPEID_PLAYER ? true : false);
// group update
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index a86361e8d21..2f85248648f 100755
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1371,12 +1371,14 @@ class Unit : public WorldObject
void setPowerType(Powers power);
int32 GetPower(Powers power) const { return GetUInt32Value(UNIT_FIELD_POWER1+power); }
uint32 GetMaxPower(Powers power) const { return GetUInt32Value(UNIT_FIELD_MAXPOWER1+power); }
- void SetPower(Powers power, int32 val);
+ void SetPower(Powers power, uint32 val);
void SetMaxPower(Powers power, int32 val);
// returns the change in power
int32 ModifyPower(Powers power, int32 val);
int32 ModifyPowerPct(Powers power, float pct, bool apply = true);
+ uint32 GetPowerIndexByClass(uint32 powerId, uint32 classId) const;
+
uint32 GetAttackTime(WeaponAttackType att) const
{
float f_BaseAttackTime = GetFloatValue(UNIT_FIELD_BASEATTACKTIME+att) / m_modAttackSpeedPct[att];
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index be6d568cc78..bb5d1ec8d2c 100755
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -1193,7 +1193,7 @@ void InitOpcodes()
//DEFINE_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(CMSG_FORCE_SAY_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//DEFINE_OPCODE_HANDLER(SMSG_HEALTH_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
- //DEFINE_OPCODE_HANDLER(SMSG_POWER_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
+ DEFINE_OPCODE_HANDLER(SMSG_POWER_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(CMSG_GAMEOBJ_REPORT_USE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGameobjectReportUse );
//DEFINE_OPCODE_HANDLER(SMSG_HIGHEST_THREAT_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//DEFINE_OPCODE_HANDLER(SMSG_THREAT_UPDATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );