From 3cc4aeec47e1eccceee84de813036d36dc791f34 Mon Sep 17 00:00:00 2001 From: Stepan Goremykin Date: Sun, 29 Jan 2023 01:45:04 +0100 Subject: [PATCH] Some refactoring --- .../Core/Helpers/Math/RandomHelper.cs | 183 +++++++++--------- .../Implementations/Hirelings/Hireling.cs | 12 +- .../GeneratorsSystem/WorldGenerator.cs | 14 +- .../GSSystem/PlayerSystem/Inventory.cs | 34 ++-- 4 files changed, 118 insertions(+), 125 deletions(-) diff --git a/src/DiIiS-NA/Core/Helpers/Math/RandomHelper.cs b/src/DiIiS-NA/Core/Helpers/Math/RandomHelper.cs index bbbebd0..498575b 100644 --- a/src/DiIiS-NA/Core/Helpers/Math/RandomHelper.cs +++ b/src/DiIiS-NA/Core/Helpers/Math/RandomHelper.cs @@ -1,112 +1,105 @@ -//Blizzless Project 2022 -using System; +using System; using System.Linq; using System.Collections.Generic; using DiIiS_NA.Core.Logging; -namespace DiIiS_NA.Core.Helpers.Math +namespace DiIiS_NA.Core.Helpers.Math; + +public static class RandomHelper { - public class RandomHelper + private static readonly Random Random = new(); + + public static int Next() { - private readonly static Random _random; - - static RandomHelper() - { - _random = new Random(); - } - - public static int Next() - { - return _random.Next(); - } - - public static int Next(Int32 maxValue) - { - return _random.Next(maxValue); - } - - public static int Next(Int32 minValue, Int32 maxValue) - { - return _random.Next(minValue, maxValue); - } - - public static void NextBytes(byte[] buffer) - { - _random.NextBytes(buffer); - } - - public static double NextDouble() - { - return _random.NextDouble(); - } - - /*IEnumerable*/ - public static TValue RandomValue(IDictionary dictionary) - { - List values = Enumerable.ToList(dictionary.Values); - int size = dictionary.Count; - /*while (true) - { - yield return values[_random.Next(size)]; - }*/ - return values[_random.Next(size)]; - } - - /// - /// Picks a random item from a list - /// - /// - /// - /// A function that assigns each item a probability. If the probabilities dont sum up to 1, they are normalized - /// - public static T RandomItem(IEnumerable list, Func probability) - { - int cumulative = (int)list.Select(x => probability(x)).Sum(); - - int randomRoll = RandomHelper.Next(cumulative); - float cumulativePercentages = 0; - - foreach (T element in list) - { - cumulativePercentages += probability(element); - if (cumulativePercentages > randomRoll) - return element; - } - - return list.First(); - } - + return Random.Next(); } - public class ItemRandomHelper + public static int Next(int maxValue) { - private static readonly Logger Logger = LogManager.CreateLogger("RH"); - uint a; - uint b; - public ItemRandomHelper(int seed) + return Random.Next(maxValue); + } + + public static int Next(int minValue, int maxValue) + { + return Random.Next(minValue, maxValue); + } + + public static void NextBytes(byte[] buffer) + { + Random.NextBytes(buffer); + } + + public static double NextDouble() + { + return Random.NextDouble(); + } + + public static T RandomItem(IEnumerable source) + { + var collection = source as IReadOnlyCollection ?? source?.ToArray(); + if (collection == null || collection.Count == 0) { - a = (uint)seed; - b = 666; + throw new ArgumentException("Cannot be null or empty", nameof(source)); } - public void ReinitSeed() + var randomIndex = Next(collection.Count); + return collection.ElementAt(randomIndex); + } + + /// + /// Picks a random item from a list + /// + /// + /// + /// A function that assigns each item a probability. If the probabilities dont sum up to 1, they are normalized + /// + public static T RandomItem(IEnumerable source, Func probability) + { + var collection = source as IReadOnlyCollection ?? source.ToArray(); + int cumulative = (int)collection.Select(probability).Sum(); + + int randomRoll = Next(cumulative); + float cumulativePercentages = 0; + + foreach (T element in collection) { - b = 666; + cumulativePercentages += probability(element); + if (cumulativePercentages > randomRoll) + return element; } - public uint Next() - { - ulong temp = 1791398085UL * (ulong)a + (ulong)b; - a = (uint)temp; - b = (uint)(temp >> 32); - - //Logger.Debug("Next(): a {0}, b {1}", a, b); - return (uint)a; - } - - public float Next(float min, float max) - { - return min + (Next() % (uint)(max - min + 1)); - } + return collection.First(); } } + +public class ItemRandomHelper +{ + private static readonly Logger Logger = LogManager.CreateLogger("RH"); + uint a; + uint b; + public ItemRandomHelper(int seed) + { + a = (uint)seed; + b = 666; + } + + public void ReinitSeed() + { + b = 666; + } + + public uint Next() + { + ulong temp = 1791398085UL * a + b; + a = (uint)temp; + b = (uint)(temp >> 32); + + //Logger.Debug("Next(): a {0}, b {1}", a, b); + return a; + } + + public float Next(float min, float max) + { + return min + (Next() % (uint)(max - min + 1)); + } +} \ No newline at end of file diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Hirelings/Hireling.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Hirelings/Hireling.cs index b57218c..9b5803b 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Hirelings/Hireling.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Hirelings/Hireling.cs @@ -510,12 +510,12 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings UnequipItem(owner, slot, item); } - public Item GetItemByDynId(Player player, uint DynamicId) + public Item GetItemByDynId(Player player, uint dynamicId) { - if (_equipment[player].Values.Where(it => it.IsRevealedToPlayer(player) && it.DynamicID(player) == DynamicId).Count() > 0) - return _equipment[player].Values.Single(it => it.IsRevealedToPlayer(player) && it.DynamicID(player) == DynamicId); - else - return null; + if (_equipment[player].Values.Any(it => it.IsRevealedToPlayer(player) && it.DynamicID(player) == dynamicId)) + return _equipment[player].Values.Single(it => it.IsRevealedToPlayer(player) && it.DynamicID(player) == dynamicId); + + return null; } public void RefreshEquipment(Player player) @@ -552,7 +552,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings public bool GetItemBonus(GameAttributeB attributeB) { - return GetEquippedItems(owner).Where(item => item.Attributes[attributeB] == true).Count() > 0; + return GetEquippedItems(owner).Any(item => item.Attributes[attributeB]); } public float GetItemBonus(GameAttributeF attributeF, int attributeKey) diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/WorldGenerator.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/WorldGenerator.cs index 16288e1..2718523 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/WorldGenerator.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/WorldGenerator.cs @@ -306,7 +306,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem if (entries.Count > 0) { - subSceneEntry = RandomHelper.RandomItem(entries, entry => 1); + subSceneEntry = RandomHelper.RandomItem(entries); entries.Remove(subSceneEntry); } else @@ -1975,7 +1975,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem for (int i = 0; i < count; i++) { //Chose a random exit to test - Vector3D chosenExitPosition = RandomHelper.RandomValue(exitTypes); + Vector3D chosenExitPosition = RandomHelper.RandomItem(exitTypes).Value; var chosenExitDirection = (from pair in exitTypes where pair.Value == chosenExitPosition select pair.Key).FirstOrDefault(); @@ -2077,7 +2077,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem //return filler return GetTileInfo(tiles, TileTypes.Filler); } - List tilesWithRightDirection = (from pair in tiles where ((pair.Value.ExitDirectionBits & exitDirectionBits) > 0) select pair.Value).ToList(); + List tilesWithRightDirection = (from pair in tiles where ((pair.Value.ExitDirectionBits & exitDirectionBits) > 0) select pair.Value).ToList(); if (tilesWithRightDirection.Count == 0) { @@ -2087,7 +2087,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem return null; } - return RandomHelper.RandomItem(tilesWithRightDirection, x => 1.0f); + return RandomHelper.RandomItem(tilesWithRightDirection); } private TileInfo GetTile(Dictionary tiles, int snoId) @@ -2100,12 +2100,12 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem /// Returns a tileinfo from a list of tiles that has a specific type /// /// - /// + /// /// private TileInfo GetTileInfo(Dictionary tiles, TileTypes tileType) { - var tilesWithRightType = (from pair in tiles where (pair.Value.TileType == (int)tileType) select pair.Value); - return RandomHelper.RandomItem(tilesWithRightType, x => 1); + var tilesWithRightType = tiles.Values.Where(tile => tile.TileType == (int)tileType); + return RandomHelper.RandomItem(tilesWithRightType); } private TileInfo GetTileInfo(Dictionary tiles, TileTypes tileType, int exitDirectionBits) diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Inventory.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Inventory.cs index d439b7c..053e180 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Inventory.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Inventory.cs @@ -1099,23 +1099,23 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem { if (client.Game.PvP) return; if (_owner.IsCasting) _owner.StopCasting(); - if (message is InventoryRequestMoveMessage) HandleInventoryRequestMoveMessage(message as InventoryRequestMoveMessage); - else if (message is InventoryRequestQuickMoveMessage) HandleInventoryRequestQuickMoveMessage(message as InventoryRequestQuickMoveMessage); - else if (message is InventorySplitStackMessage) OnInventorySplitStackMessage(message as InventorySplitStackMessage); - else if (message is InventoryStackTransferMessage) OnInventoryStackTransferMessage(message as InventoryStackTransferMessage); - else if (message is InventoryDropItemMessage) OnInventoryDropItemMessage(message as InventoryDropItemMessage); - else if (message is InventoryRequestUseMessage) OnInventoryRequestUseMessage(message as InventoryRequestUseMessage); - else if (message is InventoryRequestSocketMessage) OnSocketMessage(message as InventoryRequestSocketMessage); - else if (message is InventoryGemsExtractMessage) OnGemsExtractMessage(message as InventoryGemsExtractMessage); - else if (message is RequestBuySharedStashSlotsMessage) OnBuySharedStashSlots(message as RequestBuySharedStashSlotsMessage); - else if (message is InventoryIdentifyItemMessage) OnInventoryIdentifyItemMessage(message as InventoryIdentifyItemMessage); - else if (message is InventoryUseIdentifyItemMessage) OnInventoryUseIdentifyItemMessage(message as InventoryUseIdentifyItemMessage); - else if (message is TrySalvageMessage) OnTrySalvageMessage(message as TrySalvageMessage); - else if (message is TrySalvageAllMessage) OnTrySalvageAllMessage(message as TrySalvageAllMessage); - else if (message is CraftItemsMessage) OnCraftItemMessage(client, message as CraftItemsMessage); - else if (message is EnchantAffixMessage) OnEnchantAffixMessage(client, message as EnchantAffixMessage); - else if (message is TryTransmogItemMessage) OnTryTransmogItemMessage(client, message as TryTransmogItemMessage); - else if (message is DyeItemMessage) OnDyeItemMessage(client, message as DyeItemMessage); + if (message is InventoryRequestMoveMessage moveMessage) HandleInventoryRequestMoveMessage(moveMessage); + else if (message is InventoryRequestQuickMoveMessage quickMoveMessage) HandleInventoryRequestQuickMoveMessage(quickMoveMessage); + else if (message is InventorySplitStackMessage stackMessage) OnInventorySplitStackMessage(stackMessage); + else if (message is InventoryStackTransferMessage transferMessage) OnInventoryStackTransferMessage(transferMessage); + else if (message is InventoryDropItemMessage dropItemMessage) OnInventoryDropItemMessage(dropItemMessage); + else if (message is InventoryRequestUseMessage useMessage) OnInventoryRequestUseMessage(useMessage); + else if (message is InventoryRequestSocketMessage socketMessage) OnSocketMessage(socketMessage); + else if (message is InventoryGemsExtractMessage extractMessage) OnGemsExtractMessage(extractMessage); + else if (message is RequestBuySharedStashSlotsMessage slotsMessage) OnBuySharedStashSlots(slotsMessage); + else if (message is InventoryIdentifyItemMessage identifyItemMessage) OnInventoryIdentifyItemMessage(identifyItemMessage); + else if (message is InventoryUseIdentifyItemMessage itemMessage) OnInventoryUseIdentifyItemMessage(itemMessage); + else if (message is TrySalvageMessage salvageMessage) OnTrySalvageMessage(salvageMessage); + else if (message is TrySalvageAllMessage allMessage) OnTrySalvageAllMessage(allMessage); + else if (message is CraftItemsMessage itemsMessage) OnCraftItemMessage(client, itemsMessage); + else if (message is EnchantAffixMessage affixMessage) OnEnchantAffixMessage(client, affixMessage); + else if (message is TryTransmogItemMessage transmogItemMessage) OnTryTransmogItemMessage(client, transmogItemMessage); + else if (message is DyeItemMessage dyeItemMessage) OnDyeItemMessage(client, dyeItemMessage); else if (message is InventoryRepairAllMessage) RepairAll(); else if (message is InventoryRepairEquippedMessage) RepairEquipment();