Created
July 22, 2018 06:42
-
-
Save Langerz82/0021841298b5240db7c489bf722cb7c0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp | |
index 1dd66d7699..5ed1f4e232 100644 | |
--- a/src/server/game/AI/CreatureAI.cpp | |
+++ b/src/server/game/AI/CreatureAI.cpp | |
@@ -40,6 +40,11 @@ void CreatureAI::OnCharmed(bool apply) | |
me->NeedChangeAI = true; | |
me->IsAIEnabled = false; | |
} | |
+ else | |
+ { | |
+ me->NeedChangeAI = false; | |
+ me->IsAIEnabled = true; | |
+ } | |
} | |
AISpellInfoType* UnitAI::AISpellInfo; | |
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp | |
index 266adf32dd..429f5e1264 100644 | |
--- a/src/server/game/Entities/Player/Player.cpp | |
+++ b/src/server/game/Entities/Player/Player.cpp | |
@@ -20558,14 +20558,19 @@ void Player::StopCastingCharm() | |
if (GetCharmGUID()) | |
{ | |
- TC_LOG_FATAL("entities.player", "Player::StopCastingCharm: Player '%s' (%s) is not able to uncharm unit (%s)", GetName().c_str(), GetGUID().ToString().c_str(), GetCharmGUID().ToString().c_str()); | |
- if (!charm->GetCharmerGUID().IsEmpty()) | |
+ if (charm->GetCharmerGUID() != GetGUID()) | |
+ TC_LOG_FATAL("entities.player", "Player::StopCastingCharm: Player '%s' (%s) is not able to uncharm unit (%s)", GetName().c_str(), GetGUID().ToString().c_str(), GetCharmGUID().ToString().c_str()); | |
+ if (!charm->GetCharmGUID().IsEmpty()) | |
{ | |
TC_LOG_FATAL("entities.player", "Player::StopCastingCharm: Charmed unit has charmer %s", charm->GetCharmerGUID().ToString().c_str()); | |
ABORT(); | |
} | |
+ charm->RemoveCharmAuras(); | |
SetCharm(charm, false); | |
+ | |
+ SetCharmerGUID(ObjectGuid::Empty); // Needed so AI will revert to default. | |
+ charm->UpdateCharmAI(); | |
} | |
} | |
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp | |
index 09f5ef01a5..73335bf1e5 100644 | |
--- a/src/server/game/Entities/Unit/Unit.cpp | |
+++ b/src/server/game/Entities/Unit/Unit.cpp | |
@@ -6044,11 +6044,11 @@ void Unit::SetCharm(Unit* charm, bool apply) | |
if (GetTypeId() == TYPEID_PLAYER) | |
{ | |
- if (!RemoveGuidValue(UNIT_FIELD_CHARM, charm->GetGUID())) | |
+ if (GetCharmGUID() && !RemoveGuidValue(UNIT_FIELD_CHARM, GetCharmGUID())) | |
TC_LOG_FATAL("entities.unit", "Player %s is trying to uncharm unit %u, but it has another charmed unit %s", GetName().c_str(), charm->GetEntry(), GetCharmGUID().ToString().c_str()); | |
} | |
- if (!charm->RemoveGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID())) | |
+ if (charm->GetCharmerGUID() && !charm->RemoveGuidValue(UNIT_FIELD_CHARMEDBY, charm->GetCharmerGUID())) | |
TC_LOG_FATAL("entities.unit", "Unit %u is being uncharmed, but it has another charmer %s", charm->GetEntry(), charm->GetCharmerGUID().ToString().c_str()); | |
if (charm->GetTypeId() == TYPEID_PLAYER) | |
@@ -6068,6 +6068,15 @@ void Unit::SetCharm(Unit* charm, bool apply) | |
charm->m_ControlledByPlayer = false; | |
charm->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); | |
charm->SetByteValue(UNIT_FIELD_BYTES_2, UNIT_BYTES_2_OFFSET_PVP_FLAG, 0); | |
+ charm->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); | |
+ charm->GetCharmInfo()->SetIsFollowing(false); | |
+ if (charm->ToPet()) | |
+ { | |
+ charm->AttackStop(); | |
+ charm->CastStop(); | |
+ charm->ToPet()->SetReactState(charm->GetCharmInfo()->GetOldReactState()); | |
+ charm->ToCreature()->Respawn(true); | |
+ } | |
} | |
if (charm->IsWalking() != _isWalkingBeforeCharm) | |
@@ -9592,6 +9601,7 @@ void Unit::DeleteCharmInfo() | |
return; | |
m_charmInfo->RestoreState(); | |
+ | |
delete m_charmInfo; | |
m_charmInfo = nullptr; | |
} | |
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h | |
index dfd1c1e020..7bc1772064 100644 | |
--- a/src/server/game/Entities/Unit/Unit.h | |
+++ b/src/server/game/Entities/Unit/Unit.h | |
@@ -680,6 +680,7 @@ struct TC_GAME_API CharmInfo | |
bool IsReturning(); | |
void SaveStayPosition(); | |
void GetStayPosition(float &x, float &y, float &z); | |
+ ReactStates GetOldReactState() { return _oldReactState; } | |
private: | |
@@ -1143,6 +1144,7 @@ class TC_GAME_API Unit : public WorldObject | |
ObjectGuid GetCharmerGUID() const { return GetGuidValue(UNIT_FIELD_CHARMEDBY); } | |
void SetCharmerGUID(ObjectGuid owner) { SetGuidValue(UNIT_FIELD_CHARMEDBY, owner); } | |
ObjectGuid GetCharmGUID() const { return GetGuidValue(UNIT_FIELD_CHARM); } | |
+ void SetCharmGUID(ObjectGuid owner) { SetGuidValue(UNIT_FIELD_CHARM, owner); } | |
void SetPetGUID(ObjectGuid guid) { m_SummonSlot[SUMMON_SLOT_PET] = guid; } | |
ObjectGuid GetPetGUID() const { return m_SummonSlot[SUMMON_SLOT_PET]; } | |
void SetCritterGUID(ObjectGuid guid) { SetGuidValue(UNIT_FIELD_CRITTER, guid); } | |
diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp | |
index d266fef5a4..79e786af47 100644 | |
--- a/src/server/game/Handlers/PetHandler.cpp | |
+++ b/src/server/game/Handlers/PetHandler.cpp | |
@@ -249,7 +249,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe | |
case COMMAND_ABANDON: // abandon (hunter pet) or dismiss (summoned pet) | |
if (pet->GetCharmerGUID() == GetPlayer()->GetGUID()) | |
_player->StopCastingCharm(); | |
- else if (pet->GetOwnerGUID() == GetPlayer()->GetGUID()) | |
+ if (pet->GetOwnerGUID() == GetPlayer()->GetGUID() || pet->GetCharmerGUID() == ObjectGuid::Empty) | |
{ | |
ASSERT(pet->GetTypeId() == TYPEID_UNIT); | |
if (pet->IsPet()) |
I am guessing that the blank line on Line 81 (Line 9604 in Unit.cpp
) - https://gist.github.com/Langerz82/0021841298b5240db7c489bf722cb7c0#file-20769-diff-L81 is cosmetic or added for readability.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
When testing this patch, notice that the diff will not apply without using
--ignore-whitespace
(select the option [_] ignore Wh.spc. in Git Extensions)