From 26af8ac65a86714792fdd054d7066542c4d5daa2 Mon Sep 17 00:00:00 2001 From: Kandera Date: Tue, 4 Sep 2012 12:07:20 -0400 Subject: Core/Gameobject: another attempt at fixing collision. chest gameobject initial collision provided by vincent-michael --- src/server/collision/Models/GameObjectModel.h | 2 ++ src/server/game/Entities/GameObject/GameObject.cpp | 14 ++++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/server/collision/Models/GameObjectModel.h b/src/server/collision/Models/GameObjectModel.h index 0bb6c0f47bc..78a0e876676 100644 --- a/src/server/collision/Models/GameObjectModel.h +++ b/src/server/collision/Models/GameObjectModel.h @@ -61,6 +61,8 @@ public: void disable() { phasemask = 0;} void enable(uint32 ph_mask) { phasemask = ph_mask;} + bool isEnabled() const {return phasemask != 0;} + bool intersectRay(const G3D::Ray& Ray, float& MaxDist, bool StopAtFirstHit, uint32 ph_mask) const; static GameObjectModel* Create(const GameObject& go); diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 751107ac011..ba7087b6b18 100755 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -135,7 +135,7 @@ void GameObject::AddToWorld() sObjectAccessor->AddObject(this); bool startOpen = (GetGoType() == GAMEOBJECT_TYPE_DOOR || GetGoType() == GAMEOBJECT_TYPE_BUTTON ? GetGOInfo()->door.startOpen : false); // The state can be changed after GameObject::Create but before GameObject::AddToWorld - bool toggledState = GetGOData() ? GetGOData()->go_state != GO_STATE_READY : false; + bool toggledState = GetGoType == GAMEOBJECT_TYPE_CHEST ? getLootState () == GO_READY : GetGoState() != GO_STATE_READY; if (m_model) GetMap()->InsertGameObjectModel(*m_model); @@ -1930,13 +1930,10 @@ void GameObject::SetLootState(LootState state, Unit* unit) bool startOpen = (GetGoType() == GAMEOBJECT_TYPE_DOOR || GetGoType() == GAMEOBJECT_TYPE_BUTTON ? GetGOInfo()->door.startOpen : false); // Use the current go state - if (GetGoState() != GO_STATE_READY) + if ((GetGoState() != GO_STATE_READY && (state == GO_ACTIVATED || state == GO_JUST_DEACTIVATED)) || state == GO_READY) startOpen = !startOpen; - - if (state == GO_ACTIVATED || state == GO_JUST_DEACTIVATED) - EnableCollision(startOpen); - else if (state == GO_READY) - EnableCollision(!startOpen); + + EnableCollision(startOpen); } } @@ -1968,7 +1965,8 @@ void GameObject::SetDisplayId(uint32 displayid) void GameObject::SetPhaseMask(uint32 newPhaseMask, bool update) { WorldObject::SetPhaseMask(newPhaseMask, update); - EnableCollision(true); + if (m_model && m_model->isEnabled()) + EnableCollision(true); } void GameObject::EnableCollision(bool enable) -- cgit v1.2.3 From a4c115a494135d2cda4abc99195bfbe238a06412 Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Tue, 4 Sep 2012 18:21:00 +0200 Subject: Core: Fix build --- src/server/game/Entities/GameObject/GameObject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index ba7087b6b18..e686e46c41d 100755 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -135,7 +135,7 @@ void GameObject::AddToWorld() sObjectAccessor->AddObject(this); bool startOpen = (GetGoType() == GAMEOBJECT_TYPE_DOOR || GetGoType() == GAMEOBJECT_TYPE_BUTTON ? GetGOInfo()->door.startOpen : false); // The state can be changed after GameObject::Create but before GameObject::AddToWorld - bool toggledState = GetGoType == GAMEOBJECT_TYPE_CHEST ? getLootState () == GO_READY : GetGoState() != GO_STATE_READY; + bool toggledState = GetGoType() == GAMEOBJECT_TYPE_CHEST ? getLootState () == GO_READY : GetGoState() != GO_STATE_READY; if (m_model) GetMap()->InsertGameObjectModel(*m_model); -- cgit v1.2.3 From 1e2ee2d680489ebac307d8356e84de70193f5143 Mon Sep 17 00:00:00 2001 From: e Date: Tue, 4 Sep 2012 13:00:08 -0400 Subject: [Unit::SetCharm] Restore original walking state when removing charm. Fixes mind control + walk bug. --- src/server/game/Entities/Unit/Unit.cpp | 13 ++++++++++--- src/server/game/Entities/Unit/Unit.h | 3 ++- 2 files changed, 12 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 33f8828997d..9aca7b8c023 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -9978,7 +9978,8 @@ void Unit::SetCharm(Unit* charm, bool apply) if (!charm->AddUInt64Value(UNIT_FIELD_CHARMEDBY, GetGUID())) sLog->outFatal(LOG_FILTER_UNITS, "Unit %u is being charmed, but it already has a charmer " UI64FMTD "", charm->GetEntry(), charm->GetCharmerGUID()); - if (charm->HasUnitMovementFlag(MOVEMENTFLAG_WALKING)) + m_isWalkingBeforeCharm = charm->IsWalking(); + if (m_isWalkingBeforeCharm) { charm->SetWalk(false); charm->SendMovementFlagUpdate(); @@ -10015,6 +10016,12 @@ void Unit::SetCharm(Unit* charm, bool apply) charm->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0); } + + if (charm->IsWalking() != m_isWalkingBeforeCharm) + { + charm->SetWalk(m_isWalkingBeforeCharm); + charm->SendMovementFlagUpdate(true); // send packet to self, to update movement state on player. + } if (charm->GetTypeId() == TYPEID_PLAYER || !charm->ToCreature()->HasUnitTypeMask(UNIT_MASK_MINION) @@ -14763,11 +14770,11 @@ void Unit::StopMoving() init.Launch(); } -void Unit::SendMovementFlagUpdate() +void Unit::SendMovementFlagUpdate(bool self /* = false */) { WorldPacket data; BuildHeartBeatMsg(&data); - SendMessageToSet(&data, false); + SendMessageToSet(&data, self); } bool Unit::IsSitState() const diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 2ec3ffec8ef..ff4832e043e 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1606,7 +1606,7 @@ class Unit : public WorldObject void MonsterMoveWithSpeed(float x, float y, float z, float speed); //void SetFacing(float ori, WorldObject* obj = NULL); //void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL); - void SendMovementFlagUpdate(); + void SendMovementFlagUpdate(bool self = false); /*! These methods send the same packet to the client in apply and unapply case. The client-side interpretation of this packet depends on the presence of relevant movementflags @@ -2356,6 +2356,7 @@ class Unit : public WorldObject Spell const* _focusSpell; bool _targetLocked; // locks the target during spell cast for proper facing + bool m_isWalkingBeforeCharm; // Are we walking before we were charmed? }; namespace Trinity -- cgit v1.2.3 From 1695f78c9f05d0516b6ac79c2404a98a9d94192a Mon Sep 17 00:00:00 2001 From: e Date: Tue, 4 Sep 2012 13:04:30 -0400 Subject: Fix codestyle per Vincent-Michael --- src/server/game/Entities/Unit/Unit.cpp | 8 ++++---- src/server/game/Entities/Unit/Unit.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9aca7b8c023..1657fb8c679 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -9978,8 +9978,8 @@ void Unit::SetCharm(Unit* charm, bool apply) if (!charm->AddUInt64Value(UNIT_FIELD_CHARMEDBY, GetGUID())) sLog->outFatal(LOG_FILTER_UNITS, "Unit %u is being charmed, but it already has a charmer " UI64FMTD "", charm->GetEntry(), charm->GetCharmerGUID()); - m_isWalkingBeforeCharm = charm->IsWalking(); - if (m_isWalkingBeforeCharm) + _isWalkingBeforeCharm = charm->IsWalking(); + if (_isWalkingBeforeCharm) { charm->SetWalk(false); charm->SendMovementFlagUpdate(); @@ -10017,9 +10017,9 @@ void Unit::SetCharm(Unit* charm, bool apply) charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0); } - if (charm->IsWalking() != m_isWalkingBeforeCharm) + if (charm->IsWalking() != _isWalkingBeforeCharm) { - charm->SetWalk(m_isWalkingBeforeCharm); + charm->SetWalk(_isWalkingBeforeCharm); charm->SendMovementFlagUpdate(true); // send packet to self, to update movement state on player. } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index ff4832e043e..013b5244e2a 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2356,7 +2356,7 @@ class Unit : public WorldObject Spell const* _focusSpell; bool _targetLocked; // locks the target during spell cast for proper facing - bool m_isWalkingBeforeCharm; // Are we walking before we were charmed? + bool _isWalkingBeforeCharm; // Are we walking before we were charmed? }; namespace Trinity -- cgit v1.2.3 From 8afecc657293fd16922955d048a974efc95bf219 Mon Sep 17 00:00:00 2001 From: Kandera Date: Tue, 4 Sep 2012 14:04:47 -0400 Subject: Core/Gameobject: fix collision for gameobjects --- src/server/game/Entities/GameObject/GameObject.cpp | 23 ++++++++++------------ 1 file changed, 10 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index e686e46c41d..6ef62519f40 100755 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -133,13 +133,13 @@ void GameObject::AddToWorld() m_zoneScript->OnGameObjectCreate(this); sObjectAccessor->AddObject(this); - bool startOpen = (GetGoType() == GAMEOBJECT_TYPE_DOOR || GetGoType() == GAMEOBJECT_TYPE_BUTTON ? GetGOInfo()->door.startOpen : false); + // The state can be changed after GameObject::Create but before GameObject::AddToWorld - bool toggledState = GetGoType() == GAMEOBJECT_TYPE_CHEST ? getLootState () == GO_READY : GetGoState() != GO_STATE_READY; + bool toggledState = GetGoType() == GAMEOBJECT_TYPE_CHEST ? getLootState () == GO_READY : GetGoState() == GO_STATE_READY; if (m_model) GetMap()->InsertGameObjectModel(*m_model); - EnableCollision(startOpen ^ toggledState); + EnableCollision(toggledState); WorldObject::AddToWorld(); } } @@ -1926,14 +1926,12 @@ void GameObject::SetLootState(LootState state, Unit* unit) sScriptMgr->OnGameObjectLootStateChanged(this, state, unit); if (m_model) { - // startOpen determines whether we are going to add or remove the LoS on activation - bool startOpen = (GetGoType() == GAMEOBJECT_TYPE_DOOR || GetGoType() == GAMEOBJECT_TYPE_BUTTON ? GetGOInfo()->door.startOpen : false); - + bool collision = false; // Use the current go state if ((GetGoState() != GO_STATE_READY && (state == GO_ACTIVATED || state == GO_JUST_DEACTIVATED)) || state == GO_READY) - startOpen = !startOpen; + collision = !collision; - EnableCollision(startOpen); + EnableCollision(collision); } } @@ -1947,12 +1945,11 @@ void GameObject::SetGoState(GOState state) return; // startOpen determines whether we are going to add or remove the LoS on activation - bool startOpen = (GetGoType() == GAMEOBJECT_TYPE_DOOR || GetGoType() == GAMEOBJECT_TYPE_BUTTON ? GetGOInfo()->door.startOpen : false); - - if (state != GO_STATE_READY) - startOpen = !startOpen; + bool collision = false; + if (state == GO_STATE_READY) + collision = !collision; - EnableCollision(startOpen); + EnableCollision(collision); } } -- cgit v1.2.3 From b4bc78e24b0e2723177f8541589739cf73a7ba21 Mon Sep 17 00:00:00 2001 From: Nay Date: Tue, 4 Sep 2012 19:48:29 +0100 Subject: Corrections to previous merged in PR --- src/server/game/Entities/GameObject/GameObject.cpp | 4 ++-- src/server/game/Entities/Player/Player.cpp | 2 ++ src/server/game/Entities/Unit/Unit.cpp | 2 +- src/server/game/Entities/Unit/Unit.h | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 6ef62519f40..a9effa855df 100755 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1930,7 +1930,7 @@ void GameObject::SetLootState(LootState state, Unit* unit) // Use the current go state if ((GetGoState() != GO_STATE_READY && (state == GO_ACTIVATED || state == GO_JUST_DEACTIVATED)) || state == GO_READY) collision = !collision; - + EnableCollision(collision); } } @@ -1947,7 +1947,7 @@ void GameObject::SetGoState(GOState state) // startOpen determines whether we are going to add or remove the LoS on activation bool collision = false; if (state == GO_STATE_READY) - collision = !collision; + collision = !collision; EnableCollision(collision); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 65f6588f80e..4ef4d248de0 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -863,6 +863,8 @@ Player::Player(WorldSession* session): Unit(true), m_achievementMgr(this), m_rep SetPendingBind(0, 0); _activeCheats = CHEAT_NONE; + + _isWalkingBeforeCharm = false; } Player::~Player() diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 1657fb8c679..1140382dc34 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10016,7 +10016,7 @@ void Unit::SetCharm(Unit* charm, bool apply) charm->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0); } - + if (charm->IsWalking() != _isWalkingBeforeCharm) { charm->SetWalk(_isWalkingBeforeCharm); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 013b5244e2a..98d7bbcdcde 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2356,7 +2356,7 @@ class Unit : public WorldObject Spell const* _focusSpell; bool _targetLocked; // locks the target during spell cast for proper facing - bool _isWalkingBeforeCharm; // Are we walking before we were charmed? + bool _isWalkingBeforeCharm; // Are we walking before we were charmed? }; namespace Trinity -- cgit v1.2.3 From cf711ffbe5235a62e40c2a40a1769901afcb8d8e Mon Sep 17 00:00:00 2001 From: kaelima Date: Tue, 4 Sep 2012 22:37:12 +0200 Subject: Core/BG: Prevent players from using macro to exploit leaving BG queues when they already have entered. - Cleanup and add some comments to MSG_BATTLEGROUND_PLAYER_POSITIONS Closes #7633 --- src/server/game/Handlers/BattleGroundHandler.cpp | 50 ++++++++++++++---------- 1 file changed, 29 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 475c1c42fca..ba0415ef1ec 100755 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -244,7 +244,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket & recv_data) sBattlegroundMgr->ScheduleQueueUpdate(0, 0, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId()); } -void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPacket & /*recv_data*/) +void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPacket& /*recv_data*/) { sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd MSG_BATTLEGROUND_PLAYER_POSITIONS Message"); @@ -252,39 +252,44 @@ void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPacket & /*recv_ if (!bg) // can't be received if player not in battleground return; - uint32 count = 0; - Player* aplr = NULL; - Player* hplr = NULL; + uint32 flagCarrierCount = 0; + Player* allianceFlagCarrier = NULL; + Player* hordeFlagCarrier = NULL; if (uint64 guid = bg->GetFlagPickerGUID(BG_TEAM_ALLIANCE)) { - aplr = ObjectAccessor::FindPlayer(guid); - if (aplr) - ++count; + allianceFlagCarrier = ObjectAccessor::FindPlayer(guid); + if (allianceFlagCarrier) + ++flagCarrierCount; } if (uint64 guid = bg->GetFlagPickerGUID(BG_TEAM_HORDE)) { - hplr = ObjectAccessor::FindPlayer(guid); - if (hplr) - ++count; + hordeFlagCarrier = ObjectAccessor::FindPlayer(guid); + if (hordeFlagCarrier) + ++flagCarrierCount; } - WorldPacket data(MSG_BATTLEGROUND_PLAYER_POSITIONS, 4 + 4 + 16 * count); - data << 0; - data << count; - if (aplr) + WorldPacket data(MSG_BATTLEGROUND_PLAYER_POSITIONS, 4 + 4 + 16 * flagCarrierCount); + // Used to send several player positions (found used in AV) + data << 0; // CGBattlefieldInfo__m_numPlayerPositions + /* + for (CGBattlefieldInfo__m_numPlayerPositions) + data << guid << posx << posy; + */ + data << flagCarrierCount; + if (allianceFlagCarrier) { - data << uint64(aplr->GetGUID()); - data << float(aplr->GetPositionX()); - data << float(aplr->GetPositionY()); + data << uint64(allianceFlagCarrier->GetGUID()); + data << float(allianceFlagCarrier->GetPositionX()); + data << float(allianceFlagCarrier->GetPositionY()); } - if (hplr) + if (hordeFlagCarrier) { - data << uint64(hplr->GetGUID()); - data << float(hplr->GetPositionX()); - data << float(hplr->GetPositionY()); + data << uint64(hordeFlagCarrier->GetGUID()); + data << float(hordeFlagCarrier->GetPositionX()); + data << float(hordeFlagCarrier->GetPositionY()); } SendPacket(&data); @@ -457,6 +462,9 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recv_data) sLog->outDebug(LOG_FILTER_BATTLEGROUND, "Battleground: player %s (%u) joined battle for bg %u, bgtype %u, queue type %u.", _player->GetName(), _player->GetGUIDLow(), bg->GetInstanceID(), bg->GetTypeID(), bgQueueTypeId); break; case 0: // leave queue + if (bg->GetStatus() != STATUS_WAIT_QUEUE) + return; + // if player leaves rated arena match before match start, it is counted as he played but he lost if (ginfo.IsRated && ginfo.IsInvitedToBGInstanceGUID) { -- cgit v1.2.3 From de15f7050142ab1c4b537d51185bf78e310ee918 Mon Sep 17 00:00:00 2001 From: Vincent-Michael Date: Tue, 4 Sep 2012 22:38:07 +0200 Subject: Core: Fix build --- src/server/game/Entities/GameObject/GameObject.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 2 -- src/server/game/Entities/Unit/Unit.cpp | 1 + 3 files changed, 2 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index a9effa855df..808cbd9a5e4 100755 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -135,7 +135,7 @@ void GameObject::AddToWorld() sObjectAccessor->AddObject(this); // The state can be changed after GameObject::Create but before GameObject::AddToWorld - bool toggledState = GetGoType() == GAMEOBJECT_TYPE_CHEST ? getLootState () == GO_READY : GetGoState() == GO_STATE_READY; + bool toggledState = GetGoType() == GAMEOBJECT_TYPE_CHEST ? getLootState() == GO_READY : GetGoState() == GO_STATE_READY; if (m_model) GetMap()->InsertGameObjectModel(*m_model); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 4ef4d248de0..65f6588f80e 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -863,8 +863,6 @@ Player::Player(WorldSession* session): Unit(true), m_achievementMgr(this), m_rep SetPendingBind(0, 0); _activeCheats = CHEAT_NONE; - - _isWalkingBeforeCharm = false; } Player::~Player() diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 1140382dc34..b4be74cd3c4 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -256,6 +256,7 @@ m_HostileRefManager(this), m_TempSpeed(0.0f), m_AutoRepeatFirstCast(false) _focusSpell = NULL; _targetLocked = false; _lastLiquid = NULL; + _isWalkingBeforeCharm = false; } //////////////////////////////////////////////////////////// -- cgit v1.2.3 From ed6b58b17db7d00ee3ef5dd6f2cce50f72b8871f Mon Sep 17 00:00:00 2001 From: Shocker Date: Wed, 5 Sep 2012 00:13:43 +0300 Subject: Core/Spells: Avoid unnecessary code execution for SPELL_ATTR3_NO_DONE_BONUS --- src/server/game/Entities/Unit/Unit.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b4be74cd3c4..5d397790b44 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10298,6 +10298,10 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin if (!spellProto || !victim || damagetype == DIRECT_DAMAGE) return pdamage; + // Some spells don't benefit from done mods + if (spellProto->AttributesEx3 & SPELL_ATTR3_NO_DONE_BONUS) + return pdamage; + // small exception for Deep Wounds, can't find any general rule // should ignore ALL damage mods, they already calculated in trigger spell if (spellProto->Id == 12721) // Deep Wounds @@ -10699,13 +10703,6 @@ uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uin DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod); } - // Some spells don't benefit from done mods - if (spellProto->AttributesEx3 & SPELL_ATTR3_NO_DONE_BONUS) - { - DoneTotal = 0; - DoneTotalMod = 1.0f; - } - float tmpDamage = (int32(pdamage) + DoneTotal) * DoneTotalMod; // apply spellmod to Done damage (flat and pct) if (Player* modOwner = GetSpellModOwner()) -- cgit v1.2.3