feat: seed move speeds for pre-v22 creatures on load
A creature deserialized from a pre-v22 save whose think speeds still match what it would spawn with today was never hand-tuned: adopt today's table move values, so existing worlds and pets pick up npc-speeds pacing without a respawn. A creature with tuned think speeds no longer matches and keeps movement inheriting its think clock. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
6c9d603ae4
commit
5bf9fbefb6
2 changed files with 55 additions and 1 deletions
|
|
@ -24,16 +24,25 @@ public class MoveSpeedTests : IDisposable
|
||||||
|
|
||||||
private sealed class SpeedStub : BaseCreature
|
private sealed class SpeedStub : BaseCreature
|
||||||
{
|
{
|
||||||
|
// Stands in for the npc-speeds table (unconfigured in the test fixture).
|
||||||
|
public double TableActiveMove;
|
||||||
|
public double TablePassiveMove;
|
||||||
|
|
||||||
public SpeedStub() : base(AIType.AI_Animal) => Body = 0xC9;
|
public SpeedStub() : base(AIType.AI_Animal) => Body = 0xC9;
|
||||||
|
|
||||||
public SpeedStub(Serial serial) : base(serial) => Body = 0xC9;
|
public SpeedStub(Serial serial) : base(serial) => Body = 0xC9;
|
||||||
|
|
||||||
// NPCSpeeds isn't configured in the test fixture; provide fixed think speeds.
|
|
||||||
public override void GetSpeeds(out double activeSpeed, out double passiveSpeed)
|
public override void GetSpeeds(out double activeSpeed, out double passiveSpeed)
|
||||||
{
|
{
|
||||||
activeSpeed = 0.3;
|
activeSpeed = 0.3;
|
||||||
passiveSpeed = 0.6;
|
passiveSpeed = 0.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void GetMoveSpeeds(out double activeMoveSpeed, out double passiveMoveSpeed)
|
||||||
|
{
|
||||||
|
activeMoveSpeed = TableActiveMove;
|
||||||
|
passiveMoveSpeed = TablePassiveMove;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private SpeedStub NewCreature()
|
private SpeedStub NewCreature()
|
||||||
|
|
@ -103,6 +112,33 @@ public class MoveSpeedTests : IDisposable
|
||||||
Assert.Equal(0.9, bc.PassiveMoveSpeed); // other override untouched
|
Assert.Equal(0.9, bc.PassiveMoveSpeed); // other override untouched
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Migration_MatchingThinkSpeeds_AdoptTableMoveValues()
|
||||||
|
{
|
||||||
|
var bc = NewCreature(); // think 0.3/0.6, matching its table entry
|
||||||
|
bc.TableActiveMove = 0.45;
|
||||||
|
bc.TablePassiveMove = 0.9;
|
||||||
|
|
||||||
|
bc.MigrateMoveSpeeds();
|
||||||
|
|
||||||
|
Assert.Equal(0.45, bc.ActiveMoveSpeed);
|
||||||
|
Assert.Equal(0.9, bc.PassiveMoveSpeed);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Migration_TunedThinkSpeeds_KeepInheriting()
|
||||||
|
{
|
||||||
|
var bc = NewCreature();
|
||||||
|
bc.SetSpeed(0.35, 0.6); // hand-tuned: no longer matches the table entry
|
||||||
|
bc.TableActiveMove = 0.45;
|
||||||
|
bc.TablePassiveMove = 0.9;
|
||||||
|
|
||||||
|
bc.MigrateMoveSpeeds();
|
||||||
|
|
||||||
|
Assert.Equal(0.35, bc.ActiveMoveSpeed);
|
||||||
|
Assert.Equal(0.6, bc.PassiveMoveSpeed);
|
||||||
|
}
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
[InlineData(true)]
|
[InlineData(true)]
|
||||||
[InlineData(false)]
|
[InlineData(false)]
|
||||||
|
|
|
||||||
|
|
@ -2230,6 +2230,10 @@ namespace Server.Mobiles
|
||||||
_activeMoveSpeed = reader.ReadDouble();
|
_activeMoveSpeed = reader.ReadDouble();
|
||||||
_passiveMoveSpeed = reader.ReadDouble();
|
_passiveMoveSpeed = reader.ReadDouble();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MigrateMoveSpeeds();
|
||||||
|
}
|
||||||
|
|
||||||
if (version <= 14 && m_Paragon && Hue == 0x31)
|
if (version <= 14 && m_Paragon && Hue == 0x31)
|
||||||
{
|
{
|
||||||
|
|
@ -4988,6 +4992,20 @@ namespace Server.Mobiles
|
||||||
NPCSpeeds.GetMoveSpeeds(this, out activeMoveSpeed, out passiveMoveSpeed);
|
NPCSpeeds.GetMoveSpeeds(this, out activeMoveSpeed, out passiveMoveSpeed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Pre-v22 saves carry no movement clock. A creature whose serialized think speeds
|
||||||
|
// still match what it would spawn with today was never hand-tuned: adopt today's
|
||||||
|
// move values so existing worlds (and pets) pick up npc-speeds pacing without a
|
||||||
|
// respawn. Tuned creatures keep movement inheriting their think clock.
|
||||||
|
internal void MigrateMoveSpeeds()
|
||||||
|
{
|
||||||
|
GetSpeeds(out var activeSpeed, out var passiveSpeed);
|
||||||
|
|
||||||
|
if (_activeSpeed == activeSpeed && _passiveSpeed == passiveSpeed)
|
||||||
|
{
|
||||||
|
GetMoveSpeeds(out _activeMoveSpeed, out _passiveMoveSpeed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public virtual void DropBackpack()
|
public virtual void DropBackpack()
|
||||||
{
|
{
|
||||||
var backpack = Backpack;
|
var backpack = Backpack;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue