Core/Movement: Allow using walk when chasing v2
Port From (https://github.com/TrinityCore/TrinityCore/commit/956158d299b3264f883f49ac647154179182fbea)
This commit is contained in:
@@ -398,6 +398,15 @@ namespace Framework.Constants
|
|||||||
Max
|
Max
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum CreatureChaseMovementType
|
||||||
|
{
|
||||||
|
Run,
|
||||||
|
CanWalk,
|
||||||
|
AlwaysWalk,
|
||||||
|
|
||||||
|
Max
|
||||||
|
}
|
||||||
|
|
||||||
public enum VendorInventoryReason
|
public enum VendorInventoryReason
|
||||||
{
|
{
|
||||||
None = 0,
|
None = 0,
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ namespace Framework.Database
|
|||||||
PrepareStatement(WorldStatements.SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?");
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?");
|
||||||
PrepareStatement(WorldStatements.DEL_CREATURE, "DELETE FROM creature WHERE guid = ?");
|
PrepareStatement(WorldStatements.DEL_CREATURE, "DELETE FROM creature WHERE guid = ?");
|
||||||
PrepareStatement(WorldStatements.SEL_COMMANDS, "SELECT name, permission, help FROM command");
|
PrepareStatement(WorldStatements.SEL_COMMANDS, "SELECT name, permission, help FROM command");
|
||||||
PrepareStatement(WorldStatements.SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, name, femaleName, subname, TitleAlt, IconName, gossip_menu_id, minlevel, maxlevel, HealthScalingExpansion, RequiredExpansion, VignetteID, faction, npcflag, speed_walk, speed_run, scale, `rank`, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, unit_flags3, dynamicflags, family, trainer_class, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, CreatureDifficultyID, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName FROM creature_template ct LEFT JOIN creature_template_movement ctm ON ct.entry = ctm.CreatureId WHERE entry = ? OR 1 = ?");
|
PrepareStatement(WorldStatements.SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, name, femaleName, subname, TitleAlt, IconName, gossip_menu_id, minlevel, maxlevel, HealthScalingExpansion, RequiredExpansion, VignetteID, faction, npcflag, speed_walk, speed_run, scale, `rank`, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, unit_flags3, dynamicflags, family, trainer_class, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, ctm.Ground, ctm.Swim, ctm.Flight, ctm.Rooted, ctm.Chase, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, CreatureDifficultyID, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, spell_school_immune_mask, flags_extra, ScriptName FROM creature_template ct LEFT JOIN creature_template_movement ctm ON ct.entry = ctm.CreatureId WHERE entry = ? OR 1 = ?");
|
||||||
PrepareStatement(WorldStatements.SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?");
|
PrepareStatement(WorldStatements.SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?");
|
||||||
PrepareStatement(WorldStatements.SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?");
|
PrepareStatement(WorldStatements.SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?");
|
||||||
PrepareStatement(WorldStatements.SEL_GAMEOBJECT_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM gameobject WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_");
|
PrepareStatement(WorldStatements.SEL_GAMEOBJECT_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM gameobject WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_");
|
||||||
|
|||||||
@@ -352,6 +352,7 @@ namespace Game.Entities
|
|||||||
public CreatureFlightMovementType Flight;
|
public CreatureFlightMovementType Flight;
|
||||||
public bool Swim;
|
public bool Swim;
|
||||||
public bool Rooted;
|
public bool Rooted;
|
||||||
|
public CreatureChaseMovementType Chase;
|
||||||
|
|
||||||
public CreatureMovementData()
|
public CreatureMovementData()
|
||||||
{
|
{
|
||||||
@@ -366,9 +367,11 @@ namespace Game.Entities
|
|||||||
public bool IsFlightAllowed() { return Flight != CreatureFlightMovementType.None; }
|
public bool IsFlightAllowed() { return Flight != CreatureFlightMovementType.None; }
|
||||||
public bool IsRooted() { return Rooted; }
|
public bool IsRooted() { return Rooted; }
|
||||||
|
|
||||||
|
public CreatureChaseMovementType GetChase() { return Chase; }
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return $"Ground: {Ground}, Swim: {Swim}, Flight: {Flight} {(Rooted ? ", Rooted" : "")}";
|
return $"Ground: {Ground}, Swim: {Swim}, Flight: {Flight} {(Rooted ? ", Rooted" : "")}, Chase: {Chase}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1829,24 +1829,27 @@ namespace Game
|
|||||||
if (!fields.IsNull(63))
|
if (!fields.IsNull(63))
|
||||||
creature.Movement.Rooted = fields.Read<bool>(63);
|
creature.Movement.Rooted = fields.Read<bool>(63);
|
||||||
|
|
||||||
creature.HoverHeight = fields.Read<float>(64);
|
if (!fields.IsNull(64))
|
||||||
creature.ModHealth = fields.Read<float>(65);
|
creature.Movement.Chase = (CreatureChaseMovementType)fields.Read<byte>(64);
|
||||||
creature.ModHealthExtra = fields.Read<float>(66);
|
|
||||||
creature.ModMana = fields.Read<float>(67);
|
creature.HoverHeight = fields.Read<float>(65);
|
||||||
creature.ModManaExtra = fields.Read<float>(68);
|
creature.ModHealth = fields.Read<float>(66);
|
||||||
creature.ModArmor = fields.Read<float>(69);
|
creature.ModHealthExtra = fields.Read<float>(67);
|
||||||
creature.ModDamage = fields.Read<float>(70);
|
creature.ModMana = fields.Read<float>(68);
|
||||||
creature.ModExperience = fields.Read<float>(71);
|
creature.ModManaExtra = fields.Read<float>(69);
|
||||||
creature.RacialLeader = fields.Read<bool>(72);
|
creature.ModArmor = fields.Read<float>(70);
|
||||||
creature.MovementId = fields.Read<uint>(73);
|
creature.ModDamage = fields.Read<float>(71);
|
||||||
creature.CreatureDifficultyID = fields.Read<int>(74);
|
creature.ModExperience = fields.Read<float>(72);
|
||||||
creature.WidgetSetID = fields.Read<int>(75);
|
creature.RacialLeader = fields.Read<bool>(73);
|
||||||
creature.WidgetSetUnitConditionID = fields.Read<int>(76);
|
creature.MovementId = fields.Read<uint>(74);
|
||||||
creature.RegenHealth = fields.Read<bool>(77);
|
creature.CreatureDifficultyID = fields.Read<int>(75);
|
||||||
creature.MechanicImmuneMask = fields.Read<uint>(78);
|
creature.WidgetSetID = fields.Read<int>(76);
|
||||||
creature.SpellSchoolImmuneMask = fields.Read<uint>(79);
|
creature.WidgetSetUnitConditionID = fields.Read<int>(77);
|
||||||
creature.FlagsExtra = (CreatureFlagsExtra)fields.Read<uint>(80);
|
creature.RegenHealth = fields.Read<bool>(78);
|
||||||
creature.ScriptID = GetScriptId(fields.Read<string>(81));
|
creature.MechanicImmuneMask = fields.Read<uint>(79);
|
||||||
|
creature.SpellSchoolImmuneMask = fields.Read<uint>(80);
|
||||||
|
creature.FlagsExtra = (CreatureFlagsExtra)fields.Read<uint>(81);
|
||||||
|
creature.ScriptID = GetScriptId(fields.Read<string>(82));
|
||||||
|
|
||||||
creatureTemplateStorage[entry] = creature;
|
creatureTemplateStorage[entry] = creature;
|
||||||
}
|
}
|
||||||
@@ -2249,7 +2252,7 @@ namespace Game
|
|||||||
|
|
||||||
creatureMovementOverrides.Clear();
|
creatureMovementOverrides.Clear();
|
||||||
|
|
||||||
SQLResult result = DB.World.Query("SELECT SpawnId, Ground, Swim, Flight, Rooted from creature_movement_override");
|
SQLResult result = DB.World.Query("SELECT SpawnId, Ground, Swim, Flight, Rooted, Chase from creature_movement_override");
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
{
|
{
|
||||||
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 creature movement overrides. DB table `creature_movement_override` is empty!");
|
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 creature movement overrides. DB table `creature_movement_override` is empty!");
|
||||||
@@ -2270,6 +2273,7 @@ namespace Game
|
|||||||
movement.Swim = result.Read<bool>(2);
|
movement.Swim = result.Read<bool>(2);
|
||||||
movement.Flight = (CreatureFlightMovementType)result.Read<byte>(3);
|
movement.Flight = (CreatureFlightMovementType)result.Read<byte>(3);
|
||||||
movement.Rooted = result.Read<bool>(4);
|
movement.Rooted = result.Read<bool>(4);
|
||||||
|
movement.Chase = (CreatureChaseMovementType)result.Read<byte>(5);
|
||||||
|
|
||||||
CheckCreatureMovement("creature_movement_override", spawnId, movement);
|
CheckCreatureMovement("creature_movement_override", spawnId, movement);
|
||||||
|
|
||||||
@@ -2740,6 +2744,12 @@ namespace Game
|
|||||||
Log.outError(LogFilter.Sql, $"`{table}`.`Flight` wrong value ({creatureMovement.Flight}) for Id {id}, setting to None.");
|
Log.outError(LogFilter.Sql, $"`{table}`.`Flight` wrong value ({creatureMovement.Flight}) for Id {id}, setting to None.");
|
||||||
creatureMovement.Flight = CreatureFlightMovementType.None;
|
creatureMovement.Flight = CreatureFlightMovementType.None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (creatureMovement.Chase >= CreatureChaseMovementType.Max)
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Sql, $"`{table}`.`Chase` wrong value ({creatureMovement.Chase}) for Id {id}, setting to Run.");
|
||||||
|
creatureMovement.Chase = CreatureChaseMovementType.Run;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public void LoadLinkedRespawn()
|
public void LoadLinkedRespawn()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ namespace Game.Movement
|
|||||||
|
|
||||||
ChaseRange? _range;
|
ChaseRange? _range;
|
||||||
ChaseAngle? _angle;
|
ChaseAngle? _angle;
|
||||||
bool _walk;
|
|
||||||
|
|
||||||
PathGenerator _path;
|
PathGenerator _path;
|
||||||
Position _lastTargetPosition;
|
Position _lastTargetPosition;
|
||||||
@@ -38,12 +37,11 @@ namespace Game.Movement
|
|||||||
|
|
||||||
AbstractFollower _abstractFollower;
|
AbstractFollower _abstractFollower;
|
||||||
|
|
||||||
public ChaseMovementGenerator(Unit target, ChaseRange? range, ChaseAngle? angle, bool walk = false)
|
public ChaseMovementGenerator(Unit target, ChaseRange? range, ChaseAngle? angle)
|
||||||
{
|
{
|
||||||
_abstractFollower = new AbstractFollower(target);
|
_abstractFollower = new AbstractFollower(target);
|
||||||
_range = range;
|
_range = range;
|
||||||
_angle = angle;
|
_angle = angle;
|
||||||
_walk = walk;
|
|
||||||
|
|
||||||
Mode = MovementGeneratorMode.Default;
|
Mode = MovementGeneratorMode.Default;
|
||||||
Priority = MovementGeneratorPriority.Normal;
|
Priority = MovementGeneratorPriority.Normal;
|
||||||
@@ -56,7 +54,6 @@ namespace Game.Movement
|
|||||||
RemoveFlag(MovementGeneratorFlags.InitializationPending | MovementGeneratorFlags.Deactivated);
|
RemoveFlag(MovementGeneratorFlags.InitializationPending | MovementGeneratorFlags.Deactivated);
|
||||||
AddFlag(MovementGeneratorFlags.Initialized);
|
AddFlag(MovementGeneratorFlags.Initialized);
|
||||||
|
|
||||||
owner.SetWalk(_walk);
|
|
||||||
_path = null;
|
_path = null;
|
||||||
_lastTargetPosition = null;
|
_lastTargetPosition = null;
|
||||||
}
|
}
|
||||||
@@ -186,11 +183,29 @@ namespace Game.Movement
|
|||||||
|
|
||||||
if (cOwner)
|
if (cOwner)
|
||||||
cOwner.SetCannotReachTarget(false);
|
cOwner.SetCannotReachTarget(false);
|
||||||
|
|
||||||
owner.AddUnitState(UnitState.ChaseMove);
|
owner.AddUnitState(UnitState.ChaseMove);
|
||||||
|
|
||||||
|
bool walk = false;
|
||||||
|
if (cOwner && !cOwner.IsPet())
|
||||||
|
{
|
||||||
|
switch (cOwner.GetMovementTemplate().GetChase())
|
||||||
|
{
|
||||||
|
case CreatureChaseMovementType.CanWalk:
|
||||||
|
if (owner.IsWalking())
|
||||||
|
walk = true;
|
||||||
|
break;
|
||||||
|
case CreatureChaseMovementType.AlwaysWalk:
|
||||||
|
walk = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
MoveSplineInit init = new(owner);
|
MoveSplineInit init = new(owner);
|
||||||
init.MovebyPath(_path.GetPath());
|
init.MovebyPath(_path.GetPath());
|
||||||
init.SetWalk(_walk);
|
init.SetWalk(walk);
|
||||||
init.SetFacing(target);
|
init.SetFacing(target);
|
||||||
|
|
||||||
init.Launch();
|
init.Launch();
|
||||||
|
|||||||
@@ -533,13 +533,13 @@ namespace Game.Movement
|
|||||||
|
|
||||||
public void MoveChase(Unit target, float dist, float angle = 0.0f) { MoveChase(target, new ChaseRange(dist), new ChaseAngle(angle)); }
|
public void MoveChase(Unit target, float dist, float angle = 0.0f) { MoveChase(target, new ChaseRange(dist), new ChaseAngle(angle)); }
|
||||||
public void MoveChase(Unit target, float dist) { MoveChase(target, new ChaseRange(dist)); }
|
public void MoveChase(Unit target, float dist) { MoveChase(target, new ChaseRange(dist)); }
|
||||||
public void MoveChase(Unit target, ChaseRange? dist = null, ChaseAngle? angle = null, bool walk = false)
|
public void MoveChase(Unit target, ChaseRange? dist = null, ChaseAngle? angle = null)
|
||||||
{
|
{
|
||||||
// Ignore movement request if target not exist
|
// Ignore movement request if target not exist
|
||||||
if (!target || target == _owner)
|
if (!target || target == _owner)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Add(new ChaseMovementGenerator(target, dist, angle, walk));
|
Add(new ChaseMovementGenerator(target, dist, angle));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MoveConfused()
|
public void MoveConfused()
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
ALTER TABLE `creature_template_movement` ADD `Chase` tinyint(3) UNSIGNED NOT NULL DEFAULT '0';
|
||||||
|
ALTER TABLE `creature_movement_override` ADD `Chase` tinyint(3) UNSIGNED NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
DELETE FROM `creature_template_movement` WHERE `CreatureID` IN (20064,28654);
|
||||||
|
INSERT INTO `creature_template_movement` (`CreatureID`,`Ground`,`Swim`,`Flight`,`Rooted`,`Chase`) VALUES
|
||||||
|
(20064,1,0,0,0,2),
|
||||||
|
(28654,1,0,0,0,2);
|
||||||
Reference in New Issue
Block a user