aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp9
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp69
-rw-r--r--src/server/game/Entities/Unit/UnitDefines.h2
-rw-r--r--src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp2
-rw-r--r--src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp2
5 files changed, 39 insertions, 45 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index 76b3778b060..39657dc78bd 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -681,8 +681,13 @@ void SmartAI::OnCharmed(bool /*isNew*/)
else
me->SetWalk(!mRun);
- if (Unit* charmer = me->GetCharmer())
- AttackStart(charmer);
+ if (!me->LastCharmerGUID.IsEmpty())
+ {
+ if (!me->HasReactState(REACT_PASSIVE))
+ if (Unit* lastCharmer = ObjectAccessor::GetUnit(*me, me->LastCharmerGUID))
+ me->EngageWithTarget(lastCharmer);
+ me->LastCharmerGUID.Clear();
+ }
}
GetScript()->ProcessEventsFor(SMART_EVENT_CHARMED, nullptr, 0, 0, charmed);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 6f738188dc6..c507376f0be 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -9234,10 +9234,10 @@ CharmInfo::CharmInfo(Unit* unit)
for (uint8 i = 0; i < MAX_SPELL_CHARM; ++i)
_charmspells[i].SetActionAndType(0, ACT_DISABLED);
- if (_unit->GetTypeId() == TYPEID_UNIT)
+ if (Creature* creature = _unit->ToCreature())
{
- _oldReactState = _unit->ToCreature()->GetReactState();
- _unit->ToCreature()->SetReactState(REACT_PASSIVE);
+ _oldReactState = creature->GetReactState();
+ creature->SetReactState(REACT_PASSIVE);
}
}
@@ -10885,26 +10885,12 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au
GetMotionMaster()->Clear(MOTION_PRIORITY_NORMAL);
StopMoving();
-
- // AI will schedule its own change if appropriate
- if (UnitAI* ai = GetAI())
- ai->OnCharmed(false);
- else
- ScheduleAIChange();
}
else if (Player* player = ToPlayer())
{
if (player->isAFK())
player->ToggleAFK();
- if (charmer->GetTypeId() == TYPEID_UNIT) // we are charmed by a creature
- {
- // change AI to charmed AI on next Update tick
- if (UnitAI* ai = GetAI())
- ai->OnCharmed(false);
- else
- player->ScheduleAIChange();
- }
player->SetClientControl(this, false);
}
@@ -10965,6 +10951,15 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au
}
AddUnitState(UNIT_STATE_CHARMED);
+
+ if ((GetTypeId() != TYPEID_PLAYER) || (charmer->GetTypeId() != TYPEID_PLAYER))
+ {
+ // AI will schedule its own change if appropriate
+ if (UnitAI* ai = GetAI())
+ ai->OnCharmed(false);
+ else
+ ScheduleAIChange();
+ }
return true;
}
@@ -10973,15 +10968,12 @@ void Unit::RemoveCharmedBy(Unit* charmer)
if (!IsCharmed())
return;
- if (!charmer)
+ if (charmer)
+ ASSERT(charmer == GetCharmer());
+ else
charmer = GetCharmer();
- if (charmer != GetCharmer()) // one aura overrides another?
- {
-// TC_LOG_FATAL("entities.unit", "Unit::RemoveCharmedBy: this: " UI64FMTD " true charmer: " UI64FMTD " false charmer: " UI64FMTD,
-// GetGUID(), GetCharmerGUID(), charmer->GetGUID());
-// ABORT();
- return;
- }
+
+ ASSERT(charmer);
CharmType type;
if (HasUnitState(UNIT_STATE_POSSESSED))
@@ -11007,11 +10999,7 @@ void Unit::RemoveCharmedBy(Unit* charmer)
// Vehicle should not attack its passenger after he exists the seat
if (type != CHARM_TYPE_VEHICLE)
- LastCharmerGUID = ASSERT_NOTNULL(charmer)->GetGUID();
-
- // If charmer still exists
- if (!charmer)
- return;
+ LastCharmerGUID = charmer->GetGUID();
ASSERT(type != CHARM_TYPE_POSSESS || charmer->GetTypeId() == TYPEID_PLAYER);
ASSERT(type != CHARM_TYPE_VEHICLE || (GetTypeId() == TYPEID_UNIT && IsVehicle()));
@@ -11054,25 +11042,26 @@ void Unit::RemoveCharmedBy(Unit* charmer)
}
}
- if (GetTypeId() != TYPEID_PLAYER || charmer->GetTypeId() == TYPEID_UNIT)
- {
- if (UnitAI* charmedAI = GetAI())
- charmedAI->OnCharmed(false); // AI will potentially schedule a charm ai update
- else
- ScheduleAIChange();
- }
-
if (Player* player = ToPlayer())
player->SetClientControl(this, true);
- // a guardian should always have charminfo
if (playerCharmer && this != charmer->GetFirstControlled())
playerCharmer->SendRemoveControlBar();
- else if (GetTypeId() == TYPEID_PLAYER || (GetTypeId() == TYPEID_UNIT && !IsGuardian()))
+
+ // a guardian should always have charminfo
+ if (!IsGuardian())
DeleteCharmInfo();
// reset confused movement for example
ApplyControlStatesIfNeeded();
+
+ if (GetTypeId() != TYPEID_PLAYER || charmer->GetTypeId() == TYPEID_UNIT)
+ {
+ if (UnitAI* charmedAI = GetAI())
+ charmedAI->OnCharmed(false); // AI will potentially schedule a charm ai update
+ else
+ ScheduleAIChange();
+ }
}
void Unit::RestoreFaction()
diff --git a/src/server/game/Entities/Unit/UnitDefines.h b/src/server/game/Entities/Unit/UnitDefines.h
index c87d1afb91b..c9cdaaa195a 100644
--- a/src/server/game/Entities/Unit/UnitDefines.h
+++ b/src/server/game/Entities/Unit/UnitDefines.h
@@ -373,7 +373,7 @@ enum ReactStates
REACT_ASSIST = 3
};
-static char const* DescribeReactState(ReactStates state)
+inline char const* DescribeReactState(ReactStates state)
{
switch (state)
{
diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
index fd596671933..6599b127039 100644
--- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
@@ -85,7 +85,7 @@ void RandomMovementGenerator<Creature>::SetRandomLocation(Creature* owner)
if (!owner)
return;
- if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting())
+ if (owner->HasUnitState(UNIT_STATE_NOT_MOVE | UNIT_STATE_LOST_CONTROL) || owner->IsMovementPreventedByCasting())
{
AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED);
owner->StopMoving();
diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
index c6056806c8e..863b7656da4 100644
--- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp
@@ -138,7 +138,7 @@ bool WaypointMovementGenerator<Creature>::DoUpdate(Creature* owner, uint32 diff)
if (HasFlag(MOVEMENTGENERATOR_FLAG_FINALIZED | MOVEMENTGENERATOR_FLAG_PAUSED) || !_path || _path->nodes.empty())
return true;
- if (owner->HasUnitState(UNIT_STATE_NOT_MOVE) || owner->IsMovementPreventedByCasting())
+ if (owner->HasUnitState(UNIT_STATE_NOT_MOVE | UNIT_STATE_LOST_CONTROL) || owner->IsMovementPreventedByCasting())
{
AddFlag(MOVEMENTGENERATOR_FLAG_INTERRUPTED);
owner->StopMoving();