Skip to content

Instantly share code, notes, and snippets.

@Langerz82
Created July 22, 2018 06:42
Show Gist options
  • Save Langerz82/0021841298b5240db7c489bf722cb7c0 to your computer and use it in GitHub Desktop.
Save Langerz82/0021841298b5240db7c489bf722cb7c0 to your computer and use it in GitHub Desktop.
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())
Copy link

ghost commented Jul 22, 2018

"C:\Program Files\Git\bin\git.exe" apply --ignore-whitespace 20769.diff

20769.diff:37: trailing whitespace.
20769.diff:81: trailing whitespace.

warning: 2 lines add whitespace errors.
Done

Press Enter or Esc to close console...

When testing this patch, notice that the diff will not apply without using --ignore-whitespace
(select the option [_] ignore Wh.spc. in Git Extensions)

Copy link

ghost commented Jul 22, 2018

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