Some refactoring

This commit is contained in:
Stepan Goremykin 2023-01-29 01:45:04 +01:00
parent 66d94d0c3f
commit 3cc4aeec47
4 changed files with 118 additions and 125 deletions

View File

@ -1,85 +1,79 @@
//Blizzless Project 2022 using System;
using System;
using System.Linq; using System.Linq;
using System.Collections.Generic; using System.Collections.Generic;
using DiIiS_NA.Core.Logging; using DiIiS_NA.Core.Logging;
namespace DiIiS_NA.Core.Helpers.Math namespace DiIiS_NA.Core.Helpers.Math;
{
public class RandomHelper
{
private readonly static Random _random;
static RandomHelper() public static class RandomHelper
{ {
_random = new Random(); private static readonly Random Random = new();
}
public static int Next() public static int Next()
{ {
return _random.Next(); return Random.Next();
} }
public static int Next(Int32 maxValue) public static int Next(int maxValue)
{ {
return _random.Next(maxValue); return Random.Next(maxValue);
} }
public static int Next(Int32 minValue, Int32 maxValue) public static int Next(int minValue, int maxValue)
{ {
return _random.Next(minValue, maxValue); return Random.Next(minValue, maxValue);
} }
public static void NextBytes(byte[] buffer) public static void NextBytes(byte[] buffer)
{ {
_random.NextBytes(buffer); Random.NextBytes(buffer);
} }
public static double NextDouble() public static double NextDouble()
{ {
return _random.NextDouble(); return Random.NextDouble();
} }
/*IEnumerable<TValue>*/ public static T RandomItem<T>(IEnumerable<T> source)
public static TValue RandomValue<TKey, TValue>(IDictionary<TKey, TValue> dictionary)
{ {
List<TValue> values = Enumerable.ToList(dictionary.Values); var collection = source as IReadOnlyCollection<T> ?? source?.ToArray();
int size = dictionary.Count; if (collection == null || collection.Count == 0)
/*while (true)
{ {
yield return values[_random.Next(size)]; throw new ArgumentException("Cannot be null or empty", nameof(source));
}*/ }
return values[_random.Next(size)];
var randomIndex = Next(collection.Count);
return collection.ElementAt(randomIndex);
} }
/// <summary> /// <summary>
/// Picks a random item from a list /// Picks a random item from a list
/// </summary> /// </summary>
/// <typeparam name="T"></typeparam> /// <typeparam name="T"></typeparam>
/// <param name="list"></param> /// <param name="source"></param>
/// <param name="probability">A function that assigns each item a probability. If the probabilities dont sum up to 1, they are normalized</param> /// <param name="probability">A function that assigns each item a probability. If the probabilities dont sum up to 1, they are normalized</param>
/// <returns></returns> /// <returns></returns>
public static T RandomItem<T>(IEnumerable<T> list, Func<T, float> probability) public static T RandomItem<T>(IEnumerable<T> source, Func<T, float> probability)
{ {
int cumulative = (int)list.Select(x => probability(x)).Sum(); var collection = source as IReadOnlyCollection<T> ?? source.ToArray();
int cumulative = (int)collection.Select(probability).Sum();
int randomRoll = RandomHelper.Next(cumulative); int randomRoll = Next(cumulative);
float cumulativePercentages = 0; float cumulativePercentages = 0;
foreach (T element in list) foreach (T element in collection)
{ {
cumulativePercentages += probability(element); cumulativePercentages += probability(element);
if (cumulativePercentages > randomRoll) if (cumulativePercentages > randomRoll)
return element; return element;
} }
return list.First(); return collection.First();
} }
}
} public class ItemRandomHelper
{
public class ItemRandomHelper
{
private static readonly Logger Logger = LogManager.CreateLogger("RH"); private static readonly Logger Logger = LogManager.CreateLogger("RH");
uint a; uint a;
uint b; uint b;
@ -96,17 +90,16 @@ namespace DiIiS_NA.Core.Helpers.Math
public uint Next() public uint Next()
{ {
ulong temp = 1791398085UL * (ulong)a + (ulong)b; ulong temp = 1791398085UL * a + b;
a = (uint)temp; a = (uint)temp;
b = (uint)(temp >> 32); b = (uint)(temp >> 32);
//Logger.Debug("Next(): a {0}, b {1}", a, b); //Logger.Debug("Next(): a {0}, b {1}", a, b);
return (uint)a; return a;
} }
public float Next(float min, float max) public float Next(float min, float max)
{ {
return min + (Next() % (uint)(max - min + 1)); return min + (Next() % (uint)(max - min + 1));
} }
}
} }

View File

@ -510,11 +510,11 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
UnequipItem(owner, slot, item); 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) 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 _equipment[player].Values.Single(it => it.IsRevealedToPlayer(player) && it.DynamicID(player) == dynamicId);
else
return null; return null;
} }
@ -552,7 +552,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings
public bool GetItemBonus(GameAttributeB attributeB) 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) public float GetItemBonus(GameAttributeF attributeF, int attributeKey)

View File

@ -306,7 +306,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
if (entries.Count > 0) if (entries.Count > 0)
{ {
subSceneEntry = RandomHelper.RandomItem<SubSceneEntry>(entries, entry => 1); subSceneEntry = RandomHelper.RandomItem(entries);
entries.Remove(subSceneEntry); entries.Remove(subSceneEntry);
} }
else else
@ -1975,7 +1975,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
//Chose a random exit to test //Chose a random exit to test
Vector3D chosenExitPosition = RandomHelper.RandomValue(exitTypes); Vector3D chosenExitPosition = RandomHelper.RandomItem(exitTypes).Value;
var chosenExitDirection = (from pair in exitTypes var chosenExitDirection = (from pair in exitTypes
where pair.Value == chosenExitPosition where pair.Value == chosenExitPosition
select pair.Key).FirstOrDefault(); select pair.Key).FirstOrDefault();
@ -2077,7 +2077,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
//return filler //return filler
return GetTileInfo(tiles, TileTypes.Filler); return GetTileInfo(tiles, TileTypes.Filler);
} }
List<TileInfo> tilesWithRightDirection = (from pair in tiles where ((pair.Value.ExitDirectionBits & exitDirectionBits) > 0) select pair.Value).ToList<TileInfo>(); List<TileInfo> tilesWithRightDirection = (from pair in tiles where ((pair.Value.ExitDirectionBits & exitDirectionBits) > 0) select pair.Value).ToList();
if (tilesWithRightDirection.Count == 0) if (tilesWithRightDirection.Count == 0)
{ {
@ -2087,7 +2087,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
return null; return null;
} }
return RandomHelper.RandomItem(tilesWithRightDirection, x => 1.0f); return RandomHelper.RandomItem(tilesWithRightDirection);
} }
private TileInfo GetTile(Dictionary<int, TileInfo> tiles, int snoId) private TileInfo GetTile(Dictionary<int, TileInfo> 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 /// Returns a tileinfo from a list of tiles that has a specific type
/// </summary> /// </summary>
/// <param name="tiles"></param> /// <param name="tiles"></param>
/// <param name="exitDirectionBits"></param> /// <param name="tileType"></param>
/// <returns></returns> /// <returns></returns>
private TileInfo GetTileInfo(Dictionary<int, TileInfo> tiles, TileTypes tileType) private TileInfo GetTileInfo(Dictionary<int, TileInfo> tiles, TileTypes tileType)
{ {
var tilesWithRightType = (from pair in tiles where (pair.Value.TileType == (int)tileType) select pair.Value); var tilesWithRightType = tiles.Values.Where(tile => tile.TileType == (int)tileType);
return RandomHelper.RandomItem(tilesWithRightType, x => 1); return RandomHelper.RandomItem(tilesWithRightType);
} }
private TileInfo GetTileInfo(Dictionary<int, TileInfo> tiles, TileTypes tileType, int exitDirectionBits) private TileInfo GetTileInfo(Dictionary<int, TileInfo> tiles, TileTypes tileType, int exitDirectionBits)

View File

@ -1099,23 +1099,23 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem
{ {
if (client.Game.PvP) return; if (client.Game.PvP) return;
if (_owner.IsCasting) _owner.StopCasting(); if (_owner.IsCasting) _owner.StopCasting();
if (message is InventoryRequestMoveMessage) HandleInventoryRequestMoveMessage(message as InventoryRequestMoveMessage); if (message is InventoryRequestMoveMessage moveMessage) HandleInventoryRequestMoveMessage(moveMessage);
else if (message is InventoryRequestQuickMoveMessage) HandleInventoryRequestQuickMoveMessage(message as InventoryRequestQuickMoveMessage); else if (message is InventoryRequestQuickMoveMessage quickMoveMessage) HandleInventoryRequestQuickMoveMessage(quickMoveMessage);
else if (message is InventorySplitStackMessage) OnInventorySplitStackMessage(message as InventorySplitStackMessage); else if (message is InventorySplitStackMessage stackMessage) OnInventorySplitStackMessage(stackMessage);
else if (message is InventoryStackTransferMessage) OnInventoryStackTransferMessage(message as InventoryStackTransferMessage); else if (message is InventoryStackTransferMessage transferMessage) OnInventoryStackTransferMessage(transferMessage);
else if (message is InventoryDropItemMessage) OnInventoryDropItemMessage(message as InventoryDropItemMessage); else if (message is InventoryDropItemMessage dropItemMessage) OnInventoryDropItemMessage(dropItemMessage);
else if (message is InventoryRequestUseMessage) OnInventoryRequestUseMessage(message as InventoryRequestUseMessage); else if (message is InventoryRequestUseMessage useMessage) OnInventoryRequestUseMessage(useMessage);
else if (message is InventoryRequestSocketMessage) OnSocketMessage(message as InventoryRequestSocketMessage); else if (message is InventoryRequestSocketMessage socketMessage) OnSocketMessage(socketMessage);
else if (message is InventoryGemsExtractMessage) OnGemsExtractMessage(message as InventoryGemsExtractMessage); else if (message is InventoryGemsExtractMessage extractMessage) OnGemsExtractMessage(extractMessage);
else if (message is RequestBuySharedStashSlotsMessage) OnBuySharedStashSlots(message as RequestBuySharedStashSlotsMessage); else if (message is RequestBuySharedStashSlotsMessage slotsMessage) OnBuySharedStashSlots(slotsMessage);
else if (message is InventoryIdentifyItemMessage) OnInventoryIdentifyItemMessage(message as InventoryIdentifyItemMessage); else if (message is InventoryIdentifyItemMessage identifyItemMessage) OnInventoryIdentifyItemMessage(identifyItemMessage);
else if (message is InventoryUseIdentifyItemMessage) OnInventoryUseIdentifyItemMessage(message as InventoryUseIdentifyItemMessage); else if (message is InventoryUseIdentifyItemMessage itemMessage) OnInventoryUseIdentifyItemMessage(itemMessage);
else if (message is TrySalvageMessage) OnTrySalvageMessage(message as TrySalvageMessage); else if (message is TrySalvageMessage salvageMessage) OnTrySalvageMessage(salvageMessage);
else if (message is TrySalvageAllMessage) OnTrySalvageAllMessage(message as TrySalvageAllMessage); else if (message is TrySalvageAllMessage allMessage) OnTrySalvageAllMessage(allMessage);
else if (message is CraftItemsMessage) OnCraftItemMessage(client, message as CraftItemsMessage); else if (message is CraftItemsMessage itemsMessage) OnCraftItemMessage(client, itemsMessage);
else if (message is EnchantAffixMessage) OnEnchantAffixMessage(client, message as EnchantAffixMessage); else if (message is EnchantAffixMessage affixMessage) OnEnchantAffixMessage(client, affixMessage);
else if (message is TryTransmogItemMessage) OnTryTransmogItemMessage(client, message as TryTransmogItemMessage); else if (message is TryTransmogItemMessage transmogItemMessage) OnTryTransmogItemMessage(client, transmogItemMessage);
else if (message is DyeItemMessage) OnDyeItemMessage(client, message as DyeItemMessage); else if (message is DyeItemMessage dyeItemMessage) OnDyeItemMessage(client, dyeItemMessage);
else if (message is InventoryRepairAllMessage) RepairAll(); else if (message is InventoryRepairAllMessage) RepairAll();
else if (message is InventoryRepairEquippedMessage) RepairEquipment(); else if (message is InventoryRepairEquippedMessage) RepairEquipment();