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.Collections.Generic;
using DiIiS_NA.Core.Logging;
namespace DiIiS_NA.Core.Helpers.Math
{
public class RandomHelper
{
private readonly static Random _random;
namespace DiIiS_NA.Core.Helpers.Math;
static RandomHelper()
{
_random = new Random();
}
public static class RandomHelper
{
private static readonly Random Random = new();
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)
{
_random.NextBytes(buffer);
Random.NextBytes(buffer);
}
public static double NextDouble()
{
return _random.NextDouble();
return Random.NextDouble();
}
/*IEnumerable<TValue>*/
public static TValue RandomValue<TKey, TValue>(IDictionary<TKey, TValue> dictionary)
public static T RandomItem<T>(IEnumerable<T> source)
{
List<TValue> values = Enumerable.ToList(dictionary.Values);
int size = dictionary.Count;
/*while (true)
var collection = source as IReadOnlyCollection<T> ?? source?.ToArray();
if (collection == null || collection.Count == 0)
{
yield return values[_random.Next(size)];
}*/
return values[_random.Next(size)];
throw new ArgumentException("Cannot be null or empty", nameof(source));
}
var randomIndex = Next(collection.Count);
return collection.ElementAt(randomIndex);
}
/// <summary>
/// Picks a random item from a list
/// </summary>
/// <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>
/// <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;
foreach (T element in list)
foreach (T element in collection)
{
cumulativePercentages += probability(element);
if (cumulativePercentages > randomRoll)
return element;
}
return list.First();
return collection.First();
}
}
}
public class ItemRandomHelper
{
public class ItemRandomHelper
{
private static readonly Logger Logger = LogManager.CreateLogger("RH");
uint a;
uint b;
@ -96,17 +90,16 @@ namespace DiIiS_NA.Core.Helpers.Math
public uint Next()
{
ulong temp = 1791398085UL * (ulong)a + (ulong)b;
ulong temp = 1791398085UL * a + b;
a = (uint)temp;
b = (uint)(temp >> 32);
//Logger.Debug("Next(): a {0}, b {1}", a, b);
return (uint)a;
return a;
}
public float Next(float min, float max)
{
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);
}
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
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;
}
@ -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)

View File

@ -306,7 +306,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem
if (entries.Count > 0)
{
subSceneEntry = RandomHelper.RandomItem<SubSceneEntry>(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<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)
{
@ -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<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
/// </summary>
/// <param name="tiles"></param>
/// <param name="exitDirectionBits"></param>
/// <param name="tileType"></param>
/// <returns></returns>
private TileInfo GetTileInfo(Dictionary<int, TileInfo> 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<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 (_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();