From 24e269651069e5f13fcde8e467acfa9e96edea62 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Sat, 22 Oct 2022 14:46:23 -0700 Subject: [PATCH] fix: Adds reset RNG command (#1201) --- Projects/Server/Random/Xoshiro256PlusPlus.cs | 13 ++++++++++--- Projects/UOContent/Commands/ResetRng.cs | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 Projects/UOContent/Commands/ResetRng.cs diff --git a/Projects/Server/Random/Xoshiro256PlusPlus.cs b/Projects/Server/Random/Xoshiro256PlusPlus.cs index 205196f66..a19410b76 100644 --- a/Projects/Server/Random/Xoshiro256PlusPlus.cs +++ b/Projects/Server/Random/Xoshiro256PlusPlus.cs @@ -14,6 +14,7 @@ *************************************************************************/ using System; +using System.Buffers.Binary; using System.Runtime.CompilerServices; namespace Server.Random; @@ -28,14 +29,20 @@ public class Xoshiro256PlusPlus : BaseRandomSource private ulong _s0, _s1, _s2, _s3; - public Xoshiro256PlusPlus() : this((ulong)Environment.TickCount64) + public Xoshiro256PlusPlus() { + Span states = stackalloc byte[32]; + RandomSources.SecureSource.NextBytes(states); + _s0 = BinaryPrimitives.ReadUInt64LittleEndian(states[..8]); + _s1 = BinaryPrimitives.ReadUInt64LittleEndian(states[8..16]); + _s2 = BinaryPrimitives.ReadUInt64LittleEndian(states[16..24]); + _s3 = BinaryPrimitives.ReadUInt64LittleEndian(states[24..32]); } public Xoshiro256PlusPlus(ulong seed) { var mix = new SplitMix64(seed); - var state = new ulong[4]; + Span state = stackalloc ulong[4]; mix.FillArray(state); _s0 = state[0]; _s1 = state[1]; @@ -205,7 +212,7 @@ public class SplitMix64 } [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void FillArray(ulong[] arr) + public void FillArray(Span arr) { for (var i = 0; i < arr.Length; i++) { diff --git a/Projects/UOContent/Commands/ResetRng.cs b/Projects/UOContent/Commands/ResetRng.cs new file mode 100644 index 000000000..9b28d19fc --- /dev/null +++ b/Projects/UOContent/Commands/ResetRng.cs @@ -0,0 +1,20 @@ +using Server.Random; + +namespace Server.Commands; + +public class ResetRng +{ + public static void Initialize() + { + CommandSystem.Register("RestRng", AccessLevel.Administrator, ResetRng_OnCommand); + } + + [Usage("RestRng")] + [Description( + "Resets the global RNG. Use with care! Do not reset often as this will affect the over-all distribution." + )] + private static void ResetRng_OnCommand(CommandEventArgs e) + { + RandomSources.SetRng(new Xoshiro256PlusPlus()); + } +}