modernuo/Projects/Server/Network/NetState/NetState.Fastwalk.cs

122 lines
3.6 KiB
C#
Raw Permalink Normal View History

Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
/*************************************************************************
* ModernUO *
* Copyright 2019-2020 - ModernUO Development Team *
* Email: hi@modernuo.com *
* File: NetState.Fastwalk.cs *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
*************************************************************************/
using System.Runtime.CompilerServices;
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
using CalcMoves = Server.Movement.Movement;
namespace Server.Network;
public partial class NetState
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
{
// The next step
private int _stepIndex;
// The last index to expire
private int _expiredIndex;
private long[] _steps;
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
public bool AddStep(Direction d)
{
if (Mobile == null)
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
{
return false;
}
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
_steps ??= new long[CalcMoves.MaxSteps + 1]; // Extra index as a sentinel
var stepsLength = _steps.Length;
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
var now = Core.TickCount;
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
var lastIndex = -1;
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
// Expire old steps
while (_expiredIndex != _stepIndex)
{
var step = _steps[_expiredIndex];
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
// Is the step ahead of us, or the next step rolled over and we didn't yet
if (step > now || lastIndex > -1 && _steps[lastIndex] > step)
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
{
break;
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
}
lastIndex = _expiredIndex++;
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
if (_expiredIndex == stepsLength)
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
{
_expiredIndex -= stepsLength;
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
}
}
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
var stepsTaken = (_stepIndex < _expiredIndex ? _stepIndex + stepsLength : _stepIndex) - _expiredIndex;
var maxSteps = _steps.Length - 1;
// Can we take a step?
if (stepsTaken >= maxSteps)
{
return false;
}
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
var delay = Mobile.ComputeMovementSpeed(d);
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
var prev = _stepIndex - 1;
if (prev < 0)
{
prev += stepsLength;
}
// Give a 5% buffer on the first step
_steps[_stepIndex++] = stepsTaken > 0 ? _steps[prev] + delay : now + delay * 950 / 1000;
if (_stepIndex == stepsLength)
{
_stepIndex -= stepsLength;
}
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
// If CalcMoves.MaxSteps is modified, we need to adjust accordingly
AdjustSteps(CalcMoves.MaxSteps);
return true;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void AdjustSteps(int maxSteps)
{
var stepsLength = maxSteps + 1;
if (_steps.Length == stepsLength)
{
return;
}
var oldSteps = _steps;
_steps = new long[stepsLength];
var expiredIndex = _expiredIndex;
var newStepIndex = 0;
while (newStepIndex < maxSteps && expiredIndex != _stepIndex)
{
_steps[newStepIndex++] = oldSteps[expiredIndex++];
if (expiredIndex >= oldSteps.Length)
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
{
expiredIndex -= oldSteps.Length;
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
}
}
_expiredIndex = 0;
_stepIndex = newStepIndex;
Updates movement packets & Fastwalk (#324) - [X] Updates Movement packets - [X] Adds OSI fastwalk packets. These aren't used on OSi anymore. - [X] Adds new movement handling, but looks like the client doesn't use it. (Also leaving the 0x4000 Character List Flag off) - [X] Adds time sync request handler, but also looks like the client doesn't use it. - [X] Adds time sync response for time sync, just in case, but it isn't used, so not sure about the arguments. - [X] Reimplements RunUO's fastwalk to use a circular array on the netstate instead of every mobile - [X] Removes ClearFastwalkStack from RunUO implementation. This shouldn't be needed anymore Changed fastwalk settings: ```cs public static int WalkFootDelay { get; set; } = 440; public static int RunFootDelay { get; set; } = 220; public static int WalkMountDelay { get; set; } = 220; public static int RunMountDelay { get; set; } = 110; public static bool EnableFastwalkPrevention { get; set; } = true; public static AccessLevel FastwalkExemptionLevel { get; set; } = AccessLevel.Counselor; // If this is changed during runtime, then the steps array needs resizing. public static int MaxSteps { get; private set; } = 4; ``` modernuo.json ```json { "settings": { "movement.delay.runFoot": "220", "movement.delay.runMount": "110", "movement.delay.walkFoot": "440", "movement.delay.walkMount": "220", "movement.enableFastWalkPrevention": "True", "movement.fastwalkExemptionLevel": "Counselor", "movement.maxSteps": "4" } } ``` Notes about OSI fastwalk: While it does work, I can't find a benefit in using it because of the variable speeds. If players moved at a single speed then we could refill the stack every X milliseconds with 6 keys and use a naive token bucket implementation. Unfortunately variable speeds mount/run/walk/etc means we would have to use a leaky bucket algorithm. If we are using a leaky bucket algorithm with a variable leak, then we don't need to send tokens because we are already tracking it on the server side. ModernUO vs OSI Fastwalk: When the fastwalk was implemented on OSI, it used up to 6 tokens. These tokens were probably distributed every 600-750 milliseconds. To get the same effect, the new fastwalk settings might need to be adjusted. I would tweak them and feel free to let me know what worked for you! Bumps release version
2020-11-26 23:53:47 -08:00
}
}