Core/Movement: MotionMaster reimplementation

Port From (https://github.com/TrinityCore/TrinityCore/commit/426f9f2f92b26fbb68e7cda9290ccbd586c6af4e)
This commit is contained in:
hondacrx
2021-09-29 18:24:37 -04:00
parent cf13f32062
commit a968772bad
47 changed files with 1954 additions and 1227 deletions
+41 -70
View File
@@ -354,13 +354,9 @@ namespace Game.Chat
// stop flight if need
if (_player.IsInFlight())
{
_player.GetMotionMaster().MovementExpired();
_player.CleanupAfterTaxiFlight();
}
// save only in non-flight case
_player.FinishTaxiFlight();
else
_player.SaveRecallPosition();
_player.SaveRecallPosition(); // save only in non-flight case
// to point to see at target with same orientation
float x, y, z;
@@ -387,13 +383,9 @@ namespace Game.Chat
// stop flight if need
if (_player.IsInFlight())
{
_player.GetMotionMaster().MovementExpired();
_player.CleanupAfterTaxiFlight();
}
// save only in non-flight case
_player.FinishTaxiFlight();
else
_player.SaveRecallPosition();
_player.SaveRecallPosition(); // save only in non-flight case
loc.SetOrientation(_player.GetOrientation());
_player.TeleportTo(loc);
@@ -1216,20 +1208,19 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.MovegensList, (unit.IsTypeId(TypeId.Player) ? "Player" : "Creature"), unit.GetGUID().ToString());
MotionMaster motionMaster = unit.GetMotionMaster();
float x, y, z;
motionMaster.GetDestination(out x, out y, out z);
for (byte i = 0; i < (int)MovementSlot.Max; ++i)
if (unit.GetMotionMaster().Empty())
{
IMovementGenerator movementGenerator = motionMaster.GetMotionSlot(i);
if (movementGenerator == null)
{
handler.SendSysMessage("Empty");
continue;
}
handler.SendSysMessage("Empty");
return true;
}
switch (movementGenerator.GetMovementGeneratorType())
float x, y, z;
unit.GetMotionMaster().GetDestination(out x, out y, out z);
var list = unit.GetMotionMaster().GetMovementGeneratorsInformation();
foreach (MovementGeneratorInformation info in list)
{
switch (info.Type)
{
case MovementGeneratorType.Idle:
handler.SendSysMessage(CypherStrings.MovegensIdle);
@@ -1244,45 +1235,33 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.MovegensConfused);
break;
case MovementGeneratorType.Chase:
{
Unit target = ((ChaseMovementGenerator)movementGenerator).GetTarget();
if (!target)
handler.SendSysMessage(CypherStrings.MovegensChaseNull);
else if (target.IsTypeId(TypeId.Player))
handler.SendSysMessage(CypherStrings.MovegensChasePlayer, target.GetName(), target.GetGUID().ToString());
else
handler.SendSysMessage(CypherStrings.MovegensChaseCreature, target.GetName(), target.GetGUID().ToString());
break;
}
if (info.TargetGUID.IsEmpty())
handler.SendSysMessage(CypherStrings.MovegensChaseNull);
else if (info.TargetGUID.IsPlayer())
handler.SendSysMessage(CypherStrings.MovegensChasePlayer, info.TargetName, info.TargetGUID.ToString());
else
handler.SendSysMessage(CypherStrings.MovegensChaseCreature, info.TargetName, info.TargetGUID.ToString());
break;
case MovementGeneratorType.Follow:
{
Unit target = ((FollowMovementGenerator)movementGenerator).GetTarget();
if (!target)
handler.SendSysMessage(CypherStrings.MovegensFollowNull);
else if (target.IsTypeId(TypeId.Player))
handler.SendSysMessage(CypherStrings.MovegensFollowPlayer, target.GetName(), target.GetGUID().ToString());
else
handler.SendSysMessage(CypherStrings.MovegensFollowCreature, target.GetName(), target.GetGUID().ToString());
break;
}
if (info.TargetGUID.IsEmpty())
handler.SendSysMessage(CypherStrings.MovegensFollowNull);
else if (info.TargetGUID.IsPlayer())
handler.SendSysMessage(CypherStrings.MovegensFollowPlayer, info.TargetName, info.TargetGUID.ToString());
else
handler.SendSysMessage(CypherStrings.MovegensFollowCreature, info.TargetName, info.TargetGUID.ToString());
break;
case MovementGeneratorType.Home:
{
if (unit.IsTypeId(TypeId.Unit))
handler.SendSysMessage(CypherStrings.MovegensHomeCreature, x, y, z);
else
handler.SendSysMessage(CypherStrings.MovegensHomePlayer);
break;
}
if (unit.IsTypeId(TypeId.Unit))
handler.SendSysMessage(CypherStrings.MovegensHomeCreature, x, y, z);
else
handler.SendSysMessage(CypherStrings.MovegensHomePlayer);
break;
case MovementGeneratorType.Flight:
handler.SendSysMessage(CypherStrings.MovegensFlight);
break;
case MovementGeneratorType.Point:
{
handler.SendSysMessage(CypherStrings.MovegensPoint, x, y, z);
break;
}
handler.SendSysMessage(CypherStrings.MovegensPoint, x, y, z);
break;
case MovementGeneratorType.Fleeing:
handler.SendSysMessage(CypherStrings.MovegensFear);
break;
@@ -1293,7 +1272,7 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.MovegensEffect);
break;
default:
handler.SendSysMessage(CypherStrings.MovegensUnknown, movementGenerator.GetMovementGeneratorType());
handler.SendSysMessage(CypherStrings.MovegensUnknown, info.Type);
break;
}
}
@@ -1915,11 +1894,7 @@ namespace Game.Chat
}
// stop flight if need
if (target.IsInFlight())
{
target.GetMotionMaster().MovementExpired();
target.CleanupAfterTaxiFlight();
}
target.FinishTaxiFlight();
target.Recall();
return true;
@@ -2162,14 +2137,10 @@ namespace Game.Chat
target.SendSysMessage(CypherStrings.SummonedBy, handler.PlayerLink(_player.GetName()));
// stop flight if need
if (target.IsInFlight())
{
target.GetMotionMaster().MovementExpired();
target.CleanupAfterTaxiFlight();
}
// save only in non-flight case
if (_player.IsInFlight())
_player.FinishTaxiFlight();
else
target.SaveRecallPosition();
_player.SaveRecallPosition(); // save only in non-flight case
// before GM
float x, y, z;