Some refactoring
This commit is contained in:
parent
66d94d0c3f
commit
3cc4aeec47
@ -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<TValue>*/
|
||||
public static TValue RandomValue<TKey, TValue>(IDictionary<TKey, TValue> dictionary)
|
||||
{
|
||||
List<TValue> values = Enumerable.ToList(dictionary.Values);
|
||||
int size = dictionary.Count;
|
||||
/*while (true)
|
||||
{
|
||||
yield return values[_random.Next(size)];
|
||||
}*/
|
||||
return values[_random.Next(size)];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Picks a random item from a list
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="list"></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)
|
||||
{
|
||||
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<T>(IEnumerable<T> source)
|
||||
{
|
||||
var collection = source as IReadOnlyCollection<T> ?? 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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Picks a random item from a list
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <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> source, Func<T, float> probability)
|
||||
{
|
||||
var collection = source as IReadOnlyCollection<T> ?? 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));
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
user.block.title