From d977ed01e785ef765011464163e53074552ffd4a Mon Sep 17 00:00:00 2001 From: Rat Date: Sun, 27 Nov 2011 19:08:42 +0100 Subject: [PATCH] Core/Units: fixed power update (yes you are now alive ingame) --- src/server/game/Entities/Unit/Unit.cpp | 39 ++++++++++++++++----- src/server/game/Entities/Unit/Unit.h | 4 ++- src/server/game/Server/Protocol/Opcodes.cpp | 2 +- 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 df8ee5be2e..f912fd92ce 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 a86361e8d2..2f85248648 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 be6d568cc7..bb5d1ec8d2 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 );