diff --git a/src/DiIiS-NA/BGS-Server/AccountsSystem/GameAccountManager.cs b/src/DiIiS-NA/BGS-Server/AccountsSystem/GameAccountManager.cs index cb1e8ff..431cc44 100644 --- a/src/DiIiS-NA/BGS-Server/AccountsSystem/GameAccountManager.cs +++ b/src/DiIiS-NA/BGS-Server/AccountsSystem/GameAccountManager.cs @@ -1,4 +1,6 @@ //Blizzless Project 2022 + +using System; using DiIiS_NA.Core.Logging; using DiIiS_NA.Core.Storage; using DiIiS_NA.Core.Storage.AccountDataBase.Entities; @@ -167,7 +169,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem crafting.DBGameAccount = dbGAcc; crafting.isHardcore = hardcore; crafting.isSeasoned = seasoned; - crafting.LearnedRecipes = new byte[0]; + crafting.LearnedRecipes = Array.Empty(); crafting.Level = 1; DBSessions.SessionSave(crafting); } diff --git a/src/DiIiS-NA/BGS-Server/Toons/ToonManager.cs b/src/DiIiS-NA/BGS-Server/Toons/ToonManager.cs index 195b035..e8b9d55 100644 --- a/src/DiIiS-NA/BGS-Server/Toons/ToonManager.cs +++ b/src/DiIiS-NA/BGS-Server/Toons/ToonManager.cs @@ -263,7 +263,7 @@ namespace DiIiS_NA.LoginServer.Toons CurrentQuestId = 87700, CurrentQuestStepId = -1, CurrentDifficulty = 0, - Lore = new byte[0], + Lore = Array.Empty(), Stats = "0;0;0;0;0;0", DBGameAccount = dbGameAccount, Cosmetic1 = -1, @@ -424,7 +424,7 @@ namespace DiIiS_NA.LoginServer.Toons DBGameAccount = gaccount, TimePlayed = 0, Stats = "", - Lore = new byte[0], + Lore = Array.Empty(), Deleted = false, Archieved = false, Cosmetic1 = -1, diff --git a/src/DiIiS-NA/Core/Discord/Bot.cs b/src/DiIiS-NA/Core/Discord/Bot.cs index c713b82..5a19831 100644 --- a/src/DiIiS-NA/Core/Discord/Bot.cs +++ b/src/DiIiS-NA/Core/Discord/Bot.cs @@ -9,6 +9,7 @@ using Discord; using Discord.Commands; using Discord.WebSocket; using DiIiS_NA.Core.Discord.Services; +using DiIiS_NA.Core.Extensions; using DiIiS_NA.LoginServer.AccountsSystem; using DiIiS_NA.Core.Logging; using DiIiS_NA.Core.Storage; @@ -225,10 +226,9 @@ namespace DiIiS_NA.Core.Discord var message = await guild.GetTextChannel(channelId).GetMessageAsync(param.First().Value); var reactedUsers = await (message as IUserMessage).GetReactionUsersAsync(Emote.Parse("<:wolfRNG:607868292979490816>"), 100).FlattenAsync(); var contestants = reactedUsers.Where(u => !u.IsBot).ToArray(); - - if (contestants.Length > 0) + + if (contestants.TryPickRandom(out var winner)) { - var winner = contestants[Helpers.Math.FastRandom.Instance.Next(0, contestants.Length - 1)]; winnerName = guild.GetUser(winner.Id).Nickname; await winner.SendMessageAsync("Congratulations! You have won **7 days of D3 Reflection Premium**!.\nYour account has already had its Premium prolonged. Have a nice game!"); var acc = AccountManager.GetAccountByDiscordId(winner.Id); diff --git a/src/DiIiS-NA/D3-GameServer/AchievementSystem/AchievementManager.cs b/src/DiIiS-NA/D3-GameServer/AchievementSystem/AchievementManager.cs index c5b5112..d73eb11 100644 --- a/src/DiIiS-NA/D3-GameServer/AchievementSystem/AchievementManager.cs +++ b/src/DiIiS-NA/D3-GameServer/AchievementSystem/AchievementManager.cs @@ -195,7 +195,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem { DBGameAccount = client.Account.GameAccount.DBGameAccount, AchievementId = achievementId, - Criteria = new byte[0], + Criteria = Array.Empty(), IsHardcore = IsHardcore(achievementId), CompleteTime = (int)DateTime.Now.ToUnixTime() }; diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/AggressiveNPCBrain.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/AggressiveNPCBrain.cs index e502218..066c852 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/AggressiveNPCBrain.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/AggressiveNPCBrain.cs @@ -71,7 +71,7 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains { _target = monsters[0]; int powerToUse = PickPowerToUse(); - if (powerToUse > 0) // FIXME: probably >= 0 as 0 can be a valid power? + if (powerToUse > 0) { PowerSystem.PowerScript power = PowerSystem.PowerLoader.CreateImplementationForPowerSNO(powerToUse); power.User = Body; @@ -107,16 +107,10 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains protected virtual int PickPowerToUse() { - if (PresetPowers.Count > 0) - { - var randomPower = PresetPowers.PickRandom(); - - // should we try several times or pick random from implemented only powers? - if (PowerSystem.PowerLoader.HasImplementationForPowerSNO(randomPower)) - return randomPower; - } - - return -1; + var implementedPowers = PresetPowers.Where(PowerSystem.PowerLoader.HasImplementationForPowerSNO); + return implementedPowers.TryPickRandom(out var randomPower) + ? randomPower + : -1; } public void AddPresetPower(int powerSNO) diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/HirelingBrain.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/HirelingBrain.cs index b4cb9a9..171f3a7 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/HirelingBrain.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/HirelingBrain.cs @@ -103,7 +103,7 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains if (targets.Count != 0 && PowerMath.Distance2D(Body.Position, Owner.Position) < 80f) { int powerToUse = PickPowerToUse(); - if (powerToUse > 0) // maybe >= 0 as 0 can be a valid power??? + if (powerToUse > 0) { var elite = targets.FirstOrDefault(t => t is Champion or Rare or RareMinion); _target = elite ?? targets.First(); @@ -151,17 +151,10 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains protected virtual int PickPowerToUse() { // randomly used an implemented power - if (PresetPowers.Count > 0) - { - var randomPower = PresetPowers.PickRandom(); - - // should we try several times or pick random from implemented only powers? - if (PowerLoader.HasImplementationForPowerSNO(randomPower)) - return randomPower; - } - - // no usable power - return -1; + var implementedPowers = PresetPowers.Where(PowerLoader.HasImplementationForPowerSNO); + return implementedPowers.TryPickRandom(out var randomPower) + ? randomPower + : -1; } public void AddPresetPower(int powerSNO) diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/StayAggressiveNPCBrain.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/StayAggressiveNPCBrain.cs index d7c9fa1..e0c96a8 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/StayAggressiveNPCBrain.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/StayAggressiveNPCBrain.cs @@ -83,7 +83,7 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains //System.Console.Out.WriteLine("Enemy in range, use powers"); //This will only attack when you and your minions are not moving..TODO: FIX. int powerToUse = PickPowerToUse(); - if (powerToUse > 0) // maybe >= 0 as 0 can be a valid power? + if (powerToUse > 0) { PowerScript power = PowerLoader.CreateImplementationForPowerSNO(powerToUse); power.User = Body; @@ -116,17 +116,10 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains protected virtual int PickPowerToUse() { // randomly used an implemented power - if (PresetPowers.Count > 0) - { - var randomPower = PresetPowers.PickRandom(); - - // should we try several times or pick from implemented only? - if (PowerLoader.HasImplementationForPowerSNO(randomPower)) - return randomPower; - } - - // no usable power - return -1; + var implementedPowers = PresetPowers.Where(PowerLoader.HasImplementationForPowerSNO); + return implementedPowers.TryPickRandom(out var randomPower) + ? randomPower + : -1; } public void AddPresetPower(int powerSNO) diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/CursedChest.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/CursedChest.cs index 4bcc12b..1a08ae7 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/CursedChest.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/CursedChest.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using DiIiS_NA.Core.Extensions; namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations { @@ -31,7 +32,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations _collapsed = true; World.Game.SideQuestGizmo = this; - World.Game.QuestManager.LaunchSideQuest(eventIds[DiIiS_NA.Core.Helpers.Math.FastRandom.Instance.Next(0, eventIds.Count)], true); + World.Game.QuestManager.LaunchSideQuest(eventIds.PickRandom(), true); } } catch { } diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/CursedShrine.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/CursedShrine.cs index 808f2d1..1e57e58 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/CursedShrine.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/CursedShrine.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using DiIiS_NA.Core.Extensions; using DiIiS_NA.GameServer.Core.Types.TagMap; using DiIiS_NA.GameServer.MessageSystem; using DiIiS_NA.GameServer.GSSystem.TickerSystem; @@ -35,7 +36,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations _collapsed = true; World.Game.SideQuestGizmo = this; - World.Game.QuestManager.LaunchSideQuest(eventIds[DiIiS_NA.Core.Helpers.Math.FastRandom.Instance.Next(0, eventIds.Count)], true); + World.Game.QuestManager.LaunchSideQuest(eventIds.PickRandom(), true); } } catch { } diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/InteractiveNPC.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/InteractiveNPC.cs index e34dbed..0346893 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/InteractiveNPC.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/InteractiveNPC.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using DiIiS_NA.Core.Extensions; using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Pet; using DiIiS_NA.GameServer.GSSystem.PlayerSystem; using DiIiS_NA.GameServer.MessageSystem; @@ -207,10 +208,10 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem { if (ConversationList != null) { - var suitable_entries = ConversationList.AmbientConversationListEntries.Where(entry => entry.SpecialEventFlag == World.Game.CurrentAct).ToList(); - if (suitable_entries.Count > 0) + var suitableEntries = ConversationList.AmbientConversationListEntries.Where(entry => entry.SpecialEventFlag == World.Game.CurrentAct).ToList(); + if (suitableEntries.Count > 0) { - var random_conv = suitable_entries[FastRandom.Instance.Next(suitable_entries.Count)]; + var random_conv = suitableEntries.PickRandom(); player.Conversations.StartConversation(random_conv.SNOConversation); if (ForceConversationSNO == Conversations[0].ConversationSNO) ForceConversationSNO = -1; } diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Portal.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Portal.cs index 81b4de0..7f164e6 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Portal.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Portal.cs @@ -21,6 +21,7 @@ using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; +using DiIiS_NA.Core.Extensions; namespace DiIiS_NA.GameServer.GSSystem.ActorSystem { @@ -1126,16 +1127,16 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem var portals = GetActorsInRange(5f).Where(p => p.Destination != null && p.Destination.DestLevelAreaSNO != -1).ToList(); if (portals.Count >= 2) { - var random_portal = portals[FastRandom.Instance.Next(portals.Count)]; + var randomPortal = portals.PickRandom(); var bounty_portals = World.Game.QuestManager.Bounties.Where(b => !b.PortalSpawned).SelectMany(b => b.LevelAreaChecks).Intersect(portals.Select(p => p.Destination.DestLevelAreaSNO)); if (bounty_portals.Any()) { - random_portal = portals.First(p => World.Game.QuestManager.Bounties.SelectMany(b => b.LevelAreaChecks).Where(w => w != -1).Contains(p.Destination.DestLevelAreaSNO)); - World.Game.QuestManager.Bounties.First(b => b.LevelAreaChecks.Contains(random_portal.Destination.DestLevelAreaSNO)).PortalSpawned = true; + randomPortal = portals.First(p => World.Game.QuestManager.Bounties.SelectMany(b => b.LevelAreaChecks).Where(w => w != -1).Contains(p.Destination.DestLevelAreaSNO)); + World.Game.QuestManager.Bounties.First(b => b.LevelAreaChecks.Contains(randomPortal.Destination.DestLevelAreaSNO)).PortalSpawned = true; } foreach (var portal in portals) portal.randomed = false; - random_portal.randomed = true; + randomPortal.randomed = true; } } diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/QuestManager.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/QuestManager.cs index 5676e33..6e37abb 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/QuestManager.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/QuestManager.cs @@ -948,7 +948,7 @@ namespace DiIiS_NA.D3_GameServer.GSSystem.GameSystem if (QuestManager.Game.GetWorld(world).CheckLocationForFlag(point, Scene.NavCellFlags.AllowWalk)) break; } - QuestManager.Game.GetWorld(world).SpawnMonster((ActorSno)GameServer.GSSystem.GeneratorsSystem.SpawnGenerator.Spawns[LevelArea].melee[FastRandom.Instance.Next(GameServer.GSSystem.GeneratorsSystem.SpawnGenerator.Spawns[LevelArea].melee.Count)], point); + QuestManager.Game.GetWorld(world).SpawnMonster((ActorSno)GameServer.GSSystem.GeneratorsSystem.SpawnGenerator.Spawns[LevelArea].melee.PickRandom(), point); monsterCount++; } } // Need additional monster spawn, there are few of them @@ -978,8 +978,7 @@ namespace DiIiS_NA.D3_GameServer.GSSystem.GameSystem scenes.Add(scene); } - // FIXME: Probably RandomHelper.Next(0, scenes.Count)??? - GameServer.Core.Types.Math.Vector3D scenePoint = scenes[RandomHelper.Next(0, scenes.Count - 1)].Position; + GameServer.Core.Types.Math.Vector3D scenePoint = scenes.PickRandom().Position; GameServer.Core.Types.Math.Vector3D point = null; while (true) { diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/WorldGenerator.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/WorldGenerator.cs index 6f0fa6c..abef534 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/WorldGenerator.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/GeneratorsSystem/WorldGenerator.cs @@ -563,8 +563,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem List scenes = world.Scenes.Values.ToList(); if (levelArea != -1) scenes = scenes.Where(sc => sc.Specification.SNOLevelAreas[0] == levelArea && !sc.SceneSNO.Name.ToLower().Contains("filler")).ToList(); else scenes = scenes.Where(sc => !sc.SceneSNO.Name.ToLower().Contains("filler")).ToList(); - int randomScene = RandomHelper.Next(0, scenes.Count - 1); // FIXME: probably RandomHelper.Next(0, scenes.Count)??? - Vector3D SSV = scenes[randomScene].Position; + Vector3D SSV = scenes.PickRandom().Position; Vector3D startingPoint = null; while (true) @@ -583,10 +582,10 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem if (waypoints.Count > 1) { - int RandomPoint = RandomHelper.Next(0, waypoints.Count - 1); + int randomPoint = RandomHelper.Next(0, waypoints.Count); for (int i = 0; i < waypoints.Count; i++) { - if (i != RandomPoint) + if (i != randomPoint) waypoints[i].Destroy(); } } @@ -1675,7 +1674,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem if (DRLGTemplate.Templates.ContainsKey(worldSNO)) { - DRLGTemplate.DRLGLayout world_layout = DRLGTemplate.Templates[worldSNO][FastRandom.Instance.Next(DRLGTemplate.Templates[worldSNO].Count)]; + DRLGTemplate.DRLGLayout world_layout = DRLGTemplate.Templates[worldSNO].PickRandom(); int coordY = 0; foreach (List row in world_layout.map) @@ -2271,7 +2270,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem { var handle = new SNOHandle(207706); if (handle == null || gizmoLocations.Count == 0) continue; - LazyLoadActor(handle, gizmoLocations[FastRandom.Instance.Next(gizmoLocations.Count)], world, ((DiIiS_NA.Core.MPQ.FileFormats.Actor)handle.Target).TagMap); + LazyLoadActor(handle, gizmoLocations.PickRandom(), world, ((DiIiS_NA.Core.MPQ.FileFormats.Actor)handle.Target).TagMap); } else foreach (var location in gizmoLocations) @@ -2297,11 +2296,11 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem if (gizmoLocations.Count > 0 && world.Game.MonsterLevel >= Program.MaxLevel && FastRandom.Instance.Next(100) < 30) { - var handle_chest = new SNOHandle(96993); //leg chest - if (handle_chest == null) continue; - var golden_chest = LoadActor(handle_chest, gizmoLocations[FastRandom.Instance.Next(0, gizmoLocations.Count - 1)], world, ((DiIiS_NA.Core.MPQ.FileFormats.Actor)handle_chest.Target).TagMap); - if (golden_chest > 0) - (world.GetActorByGlobalId(golden_chest) as LegendaryChest).ChestActive = true; + var handleChest = new SNOHandle(96993); //leg chest + if (handleChest == null) continue; + var goldenChest = LoadActor(handleChest, gizmoLocations.PickRandom(), world, ((DiIiS_NA.Core.MPQ.FileFormats.Actor)handleChest.Target).TagMap); + if (goldenChest > 0) + (world.GetActorByGlobalId(goldenChest) as LegendaryChest).ChestActive = true; } if (world.DRLGEmuActive) @@ -2323,8 +2322,8 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem //unique spawn if (SpawnGenerator.Spawns.ContainsKey(wid) && SpawnGenerator.Spawns[wid].dangerous.Count > 0 && FastRandom.Instance.NextDouble() < 0.5) { - var randomUnique = new SNOHandle(SpawnGenerator.Spawns[wid].dangerous[FastRandom.Instance.Next(SpawnGenerator.Spawns[wid].dangerous.Count)]); - var scene = levelAreas.First().Value[FastRandom.Instance.Next(levelAreas.First().Value.Count)]; + var randomUnique = new SNOHandle(SpawnGenerator.Spawns[wid].dangerous.PickRandom()); + var scene = levelAreas.First().Value.PickRandom(); int x = FastRandom.Instance.Next(scene.NavMesh.SquaresCountX); int y = FastRandom.Instance.Next(scene.NavMesh.SquaresCountY); int threshold = 0; @@ -2365,9 +2364,9 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem //goblin spawn if (SpawnGenerator.Spawns.ContainsKey(wid) && SpawnGenerator.Spawns[wid].can_spawn_goblin && FastRandom.Instance.NextDouble() < 0.5) { - var randomGoblin = new SNOHandle(Goblins[FastRandom.Instance.Next(Goblins.Count)]); + var randomGoblin = new SNOHandle(Goblins.PickRandom()); if (world.Game.IsHardcore) randomGoblin = new SNOHandle(3852); - var scene = levelAreas.First().Value[FastRandom.Instance.Next(levelAreas.First().Value.Count)]; + var scene = levelAreas.First().Value.PickRandom(); int x = FastRandom.Instance.Next(scene.NavMesh.SquaresCountX); int y = FastRandom.Instance.Next(scene.NavMesh.SquaresCountY); int threshold = 0; @@ -2420,8 +2419,8 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem //unique spawn if (SpawnGenerator.Spawns.ContainsKey(la) && SpawnGenerator.Spawns[la].dangerous.Count > 0 && FastRandom.Instance.NextDouble() < 0.5) { - var randomUnique = new SNOHandle(SpawnGenerator.Spawns[la].dangerous[FastRandom.Instance.Next(SpawnGenerator.Spawns[la].dangerous.Count)]); - var scene = levelAreas[la][FastRandom.Instance.Next(levelAreas[la].Count)]; + var randomUnique = new SNOHandle(SpawnGenerator.Spawns[la].dangerous.PickRandom()); + var scene = levelAreas[la].PickRandom(); int x = FastRandom.Instance.Next(scene.NavMesh.SquaresCountX); int y = FastRandom.Instance.Next(scene.NavMesh.SquaresCountY); int threshold = 0; @@ -2462,9 +2461,9 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem //goblin spawn if (SpawnGenerator.Spawns.ContainsKey(la) && SpawnGenerator.Spawns[la].can_spawn_goblin && FastRandom.Instance.NextDouble() < 0.5) { - var randomGoblin = new SNOHandle(Goblins[FastRandom.Instance.Next(Goblins.Count)]); + var randomGoblin = new SNOHandle(Goblins.PickRandom()); if (world.Game.IsHardcore) randomGoblin = new SNOHandle(3852); - var scene = levelAreas[la][FastRandom.Instance.Next(levelAreas[la].Count)]; + var scene = levelAreas[la].PickRandom(); int x = FastRandom.Instance.Next(scene.NavMesh.SquaresCountX); int y = FastRandom.Instance.Next(scene.NavMesh.SquaresCountY); int threshold = 0; @@ -2540,8 +2539,8 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem #region elite spawn int randomMeleeMonsterId = -1; int randomRangedMonsterId = -1; - if (SpawnGenerator.Spawns[la].melee.Count > 0) randomMeleeMonsterId = SpawnGenerator.Spawns[la].melee[FastRandom.Instance.Next(SpawnGenerator.Spawns[la].melee.Count)]; - if (SpawnGenerator.Spawns[la].range.Count > 0) randomRangedMonsterId = SpawnGenerator.Spawns[la].range[FastRandom.Instance.Next(SpawnGenerator.Spawns[la].range.Count)]; + if (SpawnGenerator.Spawns[la].melee.Count > 0) randomMeleeMonsterId = SpawnGenerator.Spawns[la].melee.PickRandom(); + if (SpawnGenerator.Spawns[la].range.Count > 0) randomRangedMonsterId = SpawnGenerator.Spawns[la].range.PickRandom(); SNOHandle meleeMonsterHandle = (randomMeleeMonsterId == -1 ? null : new SNOHandle(randomMeleeMonsterId)); SNOHandle rangedMonsterHandle = (randomRangedMonsterId == -1 ? null : new SNOHandle(randomRangedMonsterId)); if (rangedMonsterHandle == null) rangedMonsterHandle = meleeMonsterHandle; @@ -2585,8 +2584,8 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem { int randomMeleeMonsterId = -1; int randomRangedMonsterId = -1; - if (SpawnGenerator.Spawns[la].melee.Count > 0) randomMeleeMonsterId = SpawnGenerator.Spawns[la].melee[FastRandom.Instance.Next(SpawnGenerator.Spawns[la].melee.Count)]; - if (SpawnGenerator.Spawns[la].range.Count > 0) randomRangedMonsterId = SpawnGenerator.Spawns[la].range[FastRandom.Instance.Next(SpawnGenerator.Spawns[la].range.Count)]; + if (SpawnGenerator.Spawns[la].melee.Count > 0) randomMeleeMonsterId = SpawnGenerator.Spawns[la].melee.PickRandom(); + if (SpawnGenerator.Spawns[la].range.Count > 0) randomRangedMonsterId = SpawnGenerator.Spawns[la].range.PickRandom(); SNOHandle meleeMonsterHandle = (randomMeleeMonsterId == -1 ? null : new SNOHandle(randomMeleeMonsterId)); SNOHandle rangedMonsterHandle = (randomRangedMonsterId == -1 ? null : new SNOHandle(randomRangedMonsterId)); //int maxMobsInStack = (SpawnGenerator.IsMelee(la, randomMonsterId) ? 6 : (SpawnGenerator.IsDangerous(la, randomMonsterId) ? 1 : 3)); @@ -2617,7 +2616,7 @@ namespace DiIiS_NA.GameServer.GSSystem.GeneratorsSystem else //spawn champions #region champion spawn { - SNOHandle championHandle = new SNOHandle(SpawnGenerator.Spawns[la].melee[FastRandom.Instance.Next(SpawnGenerator.Spawns[la].melee.Count)]); + SNOHandle championHandle = new SNOHandle(SpawnGenerator.Spawns[la].melee.PickRandom()); groupId = FastRandom.Instance.Next(); for (int n = 0; n < 4; n++) { diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/AffixGenerator.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/AffixGenerator.cs index 951378b..f84aef0 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/AffixGenerator.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/AffixGenerator.cs @@ -226,7 +226,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem if (item.AffixFamilies.Contains(affix_group.First().AffixFamily0)) continue; int s = item.ItemDefinition.RequiredLevel; - bestDefinitions[affix_group.First().AffixFamily0] = affix_group.ToList()[FastRandom.Instance.Next(0, affix_group.Count())]; + bestDefinitions[affix_group.First().AffixFamily0] = affix_group.PickRandom(); } //if (bestDefinitions.Values.Where(a => a.Name.Contains("PoisonD")).Count() > 0) Logger.Debug("PoisonD in bestDefinitions"); @@ -363,8 +363,8 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem if (suitable.Count() > 1 && i18 && !secondGroup && suitable.Where(a => a.Name.Contains("Secondary")).Count() > 0) suitable = suitable.Where(a => a.Name.Contains("Secondary"));*/ - if (suitable.Any()) - return suitable[FastRandom.Instance.Next(0, suitable.Length)].Hash; + if (suitable.TryPickRandom(out var randomAffix)) + return randomAffix.Hash; return -1; } @@ -504,7 +504,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem bool itemIsPrefix = (FastRandom.Instance.Next(0, 2) > 0); var randomName = D3.Items.RareItemName.CreateBuilder() .SetItemNameIsPrefix(itemIsPrefix) - .SetSnoAffixStringList(itemIsPrefix ? SuffixAffixLists[FastRandom.Instance.Next(0, SuffixAffixLists.Count)] : PrefixAffixLists[FastRandom.Instance.Next(0, PrefixAffixLists.Count)]) + .SetSnoAffixStringList(itemIsPrefix ? SuffixAffixLists.PickRandom() : PrefixAffixLists.PickRandom()) .SetAffixStringListIndex(FastRandom.Instance.Next(0, 6)) .SetItemStringListIndex(FastRandom.Instance.Next(0, 6)); return randomName.Build(); diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/Item.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/Item.cs index 769a739..16db713 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/Item.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/Item.cs @@ -1088,7 +1088,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem break; } - it = items[RandomHelper.Next(@base, @base + 1)]; // FIXME: this random always returns @base + it = items[RandomHelper.Next(@base, @base + 2)]; player.Inventory.PickUp(ItemGenerator.Cook(player, it)); break; case -1249067448: @@ -1102,7 +1102,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem "Unique_Shoulder_Set_09_x1", "Unique_Boots_Set_09_x1", "Unique_Shoulder_Set_06_x1", "Unique_Boots_Set_06_x1" }; - it = items[RandomHelper.Next(@base, @base + 1)]; // FIXME: this random always returns @base + it = items[RandomHelper.Next(@base, @base + 2)]; player.Inventory.PickUp(ItemGenerator.Cook(player, it)); break; case -1249067447: @@ -1116,7 +1116,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem "Unique_Chest_Set_09_x1", "Unique_Pants_Set_09_x1", "Unique_Chest_Set_06_x1", "Unique_Pants_Set_06_x1" }; - it = items[RandomHelper.Next(@base, @base + 1)]; // FIXME: this random always returns @base + it = items[RandomHelper.Next(@base, @base + 2)]; player.Inventory.PickUp(ItemGenerator.Cook(player, it)); break; diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs index 4c54ff8..fb418e7 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs @@ -3,6 +3,7 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Reflection; +using DiIiS_NA.Core.Extensions; using NHibernate.Linq; using DiIiS_NA.Core.Logging; using DiIiS_NA.Core.Storage; @@ -1143,7 +1144,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem public static Item GenerateRandomGem(ActorSystem.Actor player, int level, bool is_goblin) { - string gemName = GemNames[FastRandom.Instance.Next(GemNames.Count)]; + string gemName = GemNames.PickRandom(); int lvl = Math.Max(player.Attributes[GameAttribute.Level], 20); int gem_grade = ((lvl - 10) / 8) + 1; @@ -1225,7 +1226,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem if (pool_filtered.Count == 0) return null; - ItemTable selected = pool_filtered[FastRandom.Instance.Next(0, pool_filtered.Count() - 1)]; + ItemTable selected = pool_filtered.PickRandom(); return selected; } @@ -1264,7 +1265,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem ).ToList(); if (pool_filtered.Count == 0) return null; - ItemTable selected = pool_filtered[FastRandom.Instance.Next(0, pool_filtered.Count() - 1)]; + ItemTable selected = pool_filtered.PickRandom(); return selected; } diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/Scene.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/Scene.cs index 4eb02f5..2e7b8fc 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/Scene.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/Scene.cs @@ -187,8 +187,8 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem Parent = parent; Subscenes = new List(); Scale = 1.0f; - AppliedLabels = new int[0]; - Field8 = new int[0]; + AppliedLabels = Array.Empty(); + Field8 = Array.Empty(); Size = new Size(NavZone.V0.X * (int)NavZone.Float0, NavZone.V0.Y * (int)NavZone.Float0); Position = position; World.AddScene(this); // add scene to the world. diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs index 51e2327..9b274c1 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Reflection; +using DiIiS_NA.Core.Extensions; using DiIiS_NA.Core.Helpers.Hash; using DiIiS_NA.Core.Helpers.Math; using DiIiS_NA.Core.Logging; @@ -240,7 +241,7 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem var scenes = new List { 265624, 265655, 265678, 265693 }; foreach (var scene in scenes) { - var wld = worlds[FastRandom.Instance.Next(worlds.Count)]; + var wld = worlds.PickRandom(); PortalOverrides.Add(scene, wld); worlds.Remove(wld); } diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Inventory.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Inventory.cs index 4352d2c..31482d5 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Inventory.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Inventory.cs @@ -286,9 +286,9 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem { string itemType = originalItem.ItemDefinition.Name.Substring(3); if (itemType.Contains("1HWeapon")) - itemType = OneHandedWeapons[FastRandom.Instance.Next(OneHandedWeapons.Count)]; + itemType = OneHandedWeapons.PickRandom(); if (itemType.Contains("2HWeapon")) - itemType = TwoHandedWeapons[FastRandom.Instance.Next(TwoHandedWeapons.Count)]; + itemType = TwoHandedWeapons.PickRandom(); if (itemType.Contains("Pants")) itemType = "Legs"; _inventoryGrid.AddItem(ItemGenerator.GetRandomItemOfType(_owner, ItemGroup.FromString(itemType))); @@ -1212,7 +1212,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem if (Item.AffixFamilies.Contains(affix_group.First().AffixFamily0)) continue; int s = Item.ItemDefinition.RequiredLevel; - bestDefinitions[affix_group.First().AffixFamily0] = affix_group.ToList()[FastRandom.Instance.Next(0, 1)]; + bestDefinitions[affix_group.First().AffixFamily0] = affix_group.ToList()[FastRandom.Instance.Next(0, 1)]; // FIXME: random always returns 0 } var SocketsAffixs = AffixGenerator.AllAffix.Where(a => a.Name.ToLower().Contains("1xx_socket") && itemTypes.ContainsAtLeastOne(a.ItemGroup)).ToList(); diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Player.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Player.cs index 40eb391..7d76bc5 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Player.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Player.cs @@ -5681,13 +5681,10 @@ public class Player : Actor, IMessageConsumer, IUpdateable public Actor SpawnNephalemBoss(World world) { - var Boss = world.SpawnMonster( - ActorSnoExtensions.nephalemPortalBosses[ - RandomHelper.Next(0, ActorSnoExtensions.nephalemPortalBosses.Length - 1)], Position); - Boss.Attributes[GameAttribute.Bounty_Objective] = true; - Boss.Attributes[GameAttribute.Is_Loot_Run_Boss] = true; - Boss.Attributes.BroadcastChangedIfRevealed(); - + var boss = world.SpawnMonster(ActorSnoExtensions.nephalemPortalBosses.PickRandom(), Position); + boss.Attributes[GameAttribute.Bounty_Objective] = true; + boss.Attributes[GameAttribute.Is_Loot_Run_Boss] = true; + boss.Attributes.BroadcastChangedIfRevealed(); foreach (var plr in world.Players.Values) plr.InGameClient.SendMessage(new WorldSyncedDataMessage() @@ -5702,7 +5699,7 @@ public class Player : Actor, IMessageConsumer, IUpdateable }); - return Boss; + return boss; } public bool StartConversation(World world, int conversationId) diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/General/ActorGhostedBuff.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/General/ActorGhostedBuff.cs index 5aa9ccb..65b6707 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/General/ActorGhostedBuff.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/General/ActorGhostedBuff.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using DiIiS_NA.Core.Extensions; namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations { @@ -127,7 +128,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations if (_tickTimer == null || _tickTimer.TimedOut) { - var monster = ActorFactory.Create(Target.World, Monsters[DiIiS_NA.Core.Helpers.Math.FastRandom.Instance.Next(0, Monsters.Count())], new TagMap()); + var monster = ActorFactory.Create(Target.World, Monsters.PickRandom(), new TagMap()); monster.EnterWorld(RandomDirection(Target.Position, 5f, Radius)); monster.HasLoot = (Target.World.Game.CurrentAct == 3000); monster.Unstuck(); @@ -210,7 +211,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations { for (int i = 0; i < 10; i++) { - var monster = ActorFactory.Create(Target.World, Monsters[DiIiS_NA.Core.Helpers.Math.FastRandom.Instance.Next(0, Monsters.Count())], new TagMap()); + var monster = ActorFactory.Create(Target.World, Monsters.PickRandom(), new TagMap()); monster.EnterWorld(RandomDirection(Target.Position, 5f, Radius)); monster.HasLoot = (Target.World.Game.CurrentAct == 3000); monster.Unstuck(); diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Barbarian.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Barbarian.cs index bc22f68..150fdfb 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Barbarian.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Barbarian.cs @@ -16,6 +16,7 @@ using System.Collections.Generic; using System.Linq; //Blizzless Project 2022 using System.Threading.Tasks; +using DiIiS_NA.Core.Extensions; namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations { @@ -1098,20 +1099,21 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations //once collision with target, RopeEffect up to ScriptFromula(5) times. Actor curSource = hit; var enemies = GetEnemiesInRadius(curSource.Position, ScriptFormula(12)).Actors.Where(actor => actor != curSource).ToList(); - Actor curTarget = (enemies.Count > 0 ? enemies[DiIiS_NA.Core.Helpers.Math.FastRandom.Instance.Next(0, enemies.Count)] : null); + enemies.TryPickRandom(out var curTarget); + for (int i = 0; i <= ScriptFormula(5); i++) { if (curTarget == null) break; curSource.AddRopeEffect(166450, curTarget); curSource = curTarget; - AttackPayload ricochet_attack = new AttackPayload(this); - ricochet_attack.AddWeaponDamage(ScriptFormula(15), DamageType.Physical); - ricochet_attack.SetSingleTarget(curTarget); - ricochet_attack.Apply(); + AttackPayload ricochetAttack = new AttackPayload(this); + ricochetAttack.AddWeaponDamage(ScriptFormula(15), DamageType.Physical); + ricochetAttack.SetSingleTarget(curTarget); + ricochetAttack.Apply(); - var next_enemies = GetEnemiesInRadius(curSource.Position, ScriptFormula(12)).Actors.Where(actor => actor != curSource).ToList(); - curTarget = (next_enemies.Count > 0 ? next_enemies[DiIiS_NA.Core.Helpers.Math.FastRandom.Instance.Next(0, next_enemies.Count)] : null); + var nextEnemies = GetEnemiesInRadius(curSource.Position, ScriptFormula(12)).Actors.Where(actor => actor != curSource).ToList(); + nextEnemies.TryPickRandom(out curTarget); } } if (Rune_D > 0) diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/DemonHunter.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/DemonHunter.cs index d0b7ab9..a67ebff 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/DemonHunter.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/DemonHunter.cs @@ -1648,7 +1648,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations Vector3D targetPosition = RandomDirection(Target.Position, ScriptFormula(2)); var enemies = GetEnemiesInRadius(Target.Position, ScriptFormula(2)).Actors; if (enemies.Count > 0) - targetPosition = enemies[FastRandom.Instance.Next(0, enemies.Count)].Position; + targetPosition = enemies.PickRandom().Position; if (_damageTimer == null || _damageTimer.TimedOut) { _damageTimer = WaitSeconds(1f / 4f); @@ -1698,11 +1698,11 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations var targets = GetEnemiesInRadius(Target.Position, ScriptFormula(2)); if (targets.Actors.Count > 0) { - Vector3D nearby_position = targets.Actors[FastRandom.Instance.Next(0, targets.Actors.Count)].Position; + Vector3D nearbyPosition = targets.Actors.PickRandom().Position; // TODO: check projectile actor var rocket = new Projectile(this, ActorSno._dh_straferune_knives_knife, User.Position); rocket.Position.Z += 6f; - rocket.Launch(nearby_position, ScriptFormula(10)); + rocket.Launch(nearbyPosition, ScriptFormula(10)); rocket.OnCollision = (hit) => { SpawnEffect(ActorSno._dh_strafe_sphereexplode, new Vector3D(hit.Position.X, hit.Position.Y, hit.Position.Z + 6f)); // impact effect (fix height) diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Necromancer.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Necromancer.cs index 80a6e2e..eb171e3 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Necromancer.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Necromancer.cs @@ -2588,8 +2588,8 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations { if (Rune_C > 0) { - int[] Effects = { 47400, 474402, 474435, 474437, 474453, 474455, 474464, 474466 }; - Tar.PlayEffectGroup(Effects[RandomHelper.Next(0, 7)]); // FIXME: looks like we can't pick the last effect + int[] effects = { 47400, 474402, 474435, 474437, 474453, 474455, 474464, 474466 }; + Tar.PlayEffectGroup(effects.PickRandom()); yield return WaitSeconds(0.5f); WeaponDamage(Tar, Damage, DType); diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/WitchDoctor.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/WitchDoctor.cs index 2d1c157..e6dbb70 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/WitchDoctor.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/WitchDoctor.cs @@ -15,6 +15,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using DiIiS_NA.Core.Extensions; namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations { @@ -236,7 +237,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations for (int i = 0; i < frogs.Length; ++i) { if (frogs[i] == null) continue; - var target = PowerMath.GenerateSpreadPositions(frogs[i].Position, PowerMath.TranslateDirection2D(User.Position, TargetPosition, frogs[i].Position, 10f), 30f, 3)[FastRandom.Instance.Next(0, 3)]; + var target = PowerMath.GenerateSpreadPositions(frogs[i].Position, PowerMath.TranslateDirection2D(User.Position, TargetPosition, frogs[i].Position, 10f), 30f, 3).PickRandom(); //frogs[i].LaunchArc(new Vector3D(RandomDirection(frogs[i].Position, 5f, 10f)), 3f, -0.03f); frogs[i].LaunchArc(target, 3f, -0.03f); } @@ -1035,7 +1036,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations var targets = GetEnemiesInRadius(grenadeN.Position, ScriptFormula(11)); if (targets.Actors.Count > 0) { - var target = targets.Actors[FastRandom.Instance.Next(0, targets.Actors.Count)]; + var target = targets.Actors.PickRandom(); grenadeN.LaunchArc(PowerMath.TranslateDirection2D(grenadeN.Position, target.Position, grenadeN.Position, PowerMath.Distance2D(grenadeN.Position, target.Position)), height, ScriptFormula(2)); yield return grenadeN.ArrivalTime; diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Wizard.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Wizard.cs index 03d70fa..ab013a8 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Wizard.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Implementations/HeroSkills/Wizard.cs @@ -17,6 +17,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using DiIiS_NA.Core.Extensions; namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations { @@ -1270,7 +1271,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations SnapFacing = true, AnimationTag = 69728, }); - TargetPosition = PowerMath.GenerateSpreadPositions(Twister.Position, TargetPosition, 20f, 3)[FastRandom.Instance.Next(0, 3)]; + TargetPosition = PowerMath.GenerateSpreadPositions(Twister.Position, TargetPosition, 20f, 3).PickRandom(); if (Rune_B > 0) //Raging Storm { @@ -1299,7 +1300,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations SnapFacing = true, AnimationTag = 69728, }); - TargetPosition = PowerMath.GenerateSpreadPositions(bigTwister.Position, TargetPosition, 20f, 3)[FastRandom.Instance.Next(0, 3)]; + TargetPosition = PowerMath.GenerateSpreadPositions(bigTwister.Position, TargetPosition, 20f, 3).PickRandom(); WeaponDamage(GetEnemiesInRadius(bigTwister.Position, 12f), bigMultiplier, DamageType.Arcane); }; Twister.Destroy(); @@ -2816,7 +2817,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Implementations if (!(Rune_B > 0 || Rune_C > 0)) proj.Destroy(); }; - var destination = ((Rune_B > 0 || Rune_C > 0) ? TargetPosition : PowerMath.GenerateSpreadPositions(User.Position, TargetPosition, 5f, 9)[FastRandom.Instance.Next(0, 9)]); + var destination = ((Rune_B > 0 || Rune_C > 0) ? TargetPosition : PowerMath.GenerateSpreadPositions(User.Position, TargetPosition, 5f, 9).PickRandom()); proj.Launch(destination, ScriptFormula(6)); //WaitSeconds(ScriptFormula(25)); } diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/Events.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/Events.cs index 33507fc..6d6d639 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/Events.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/Events.cs @@ -9,6 +9,7 @@ using DiIiS_NA.GameServer.MessageSystem; using System; using System.Collections.Generic; using System.Linq; +using DiIiS_NA.Core.Extensions; namespace DiIiS_NA.GameServer.GSSystem.QuestSystem { @@ -380,7 +381,7 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem var world = Game.GetWorld(WorldSno.a2dun_aqd_oasis_randomfacepuzzle_large); SetActorOperable(world, ActorSno._a2dun_aqd_godhead_door_largepuzzle, false); var spots = world.GetActorsBySNO(ActorSno._boxtrigger__one_shot_); - world.SpawnMonster(ActorSno._a2dun_aqd_act_lever_facepuzzle_01, spots[FastRandom.Instance.Next(spots.Count)].Position); + world.SpawnMonster(ActorSno._a2dun_aqd_act_lever_facepuzzle_01, spots.PickRandom().Position); ListenInteract(ActorSno._a2dun_aqd_act_lever_facepuzzle_01, 1, new SideAdvance()); }) }); @@ -460,7 +461,7 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem var world = Game.GetWorld(WorldSno.a2dun_aqd_oasis_randomfacepuzzle_small); SetActorOperable(world, ActorSno._a2dun_aqd_godhead_door, false); var spots = world.GetActorsBySNO(ActorSno._boxtrigger__one_shot_); - world.SpawnMonster(ActorSno._a2dun_aqd_act_lever_facepuzzle_01, spots[FastRandom.Instance.Next(spots.Count)].Position); + world.SpawnMonster(ActorSno._a2dun_aqd_act_lever_facepuzzle_01, spots.PickRandom().Position); ListenInteract(ActorSno._a2dun_aqd_act_lever_facepuzzle_01, 1, new SideAdvance()); }) }); diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestEvents/Implementations/Act I/CryptPortals.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestEvents/Implementations/Act I/CryptPortals.cs index 566925f..b63c296 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestEvents/Implementations/Act I/CryptPortals.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestEvents/Implementations/Act I/CryptPortals.cs @@ -7,6 +7,7 @@ using DiIiS_NA.GameServer.MessageSystem; using System.Linq; using System; using System.Collections.Generic; +using DiIiS_NA.Core.Extensions; using DiIiS_NA.LoginServer.AccountsSystem; using DiIiS_NA.GameServer.GSSystem.QuestSystem.QuestEvents; using DiIiS_NA.GameServer.Core.Types.Math; @@ -47,10 +48,10 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem.QuestEvents.Implementations if (portals.Count == 0) return; foreach (var dest in PortalDests) { - var random_portal = portals[FastRandom.Instance.Next(0, portals.Count - 1)]; - random_portal.Destination = dest; + var randomPortal = portals.PickRandom(); + randomPortal.Destination = dest; //portal.EnterWorld(random_spot); - portals.Remove(random_portal); + portals.Remove(randomPortal); } } } diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestEvents/Implementations/Act I/SpawnSouls.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestEvents/Implementations/Act I/SpawnSouls.cs index 2d7a482..41b2425 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestEvents/Implementations/Act I/SpawnSouls.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/QuestEvents/Implementations/Act I/SpawnSouls.cs @@ -7,6 +7,7 @@ using DiIiS_NA.GameServer.MessageSystem; using System.Linq; using System; using System.Collections.Generic; +using DiIiS_NA.Core.Extensions; using DiIiS_NA.LoginServer.AccountsSystem; using DiIiS_NA.GameServer.GSSystem.QuestSystem.QuestEvents; using DiIiS_NA.GameServer.Core.Types.Math; @@ -56,9 +57,9 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem.QuestEvents.Implementations for (int i = 0; i < 6; i++) { - var rand_pos = ActorsVector3D[FastRandom.Instance.Next(ActorsVector3D.Count)]; - world.SpawnMonster(ActorSno._ghost_jail_prisoner, rand_pos); - ActorsVector3D.Remove(rand_pos); + var randPos = ActorsVector3D.PickRandom(); + world.SpawnMonster(ActorSno._ghost_jail_prisoner, randPos); + ActorsVector3D.Remove(randPos); } } diff --git a/src/DiIiS-NA/REST/Extensions/Singleton.cs b/src/DiIiS-NA/REST/Extensions/Singleton.cs index 536e514..87b6b1d 100644 --- a/src/DiIiS-NA/REST/Extensions/Singleton.cs +++ b/src/DiIiS-NA/REST/Extensions/Singleton.cs @@ -23,7 +23,7 @@ namespace DiIiS_NA.REST.Extensions if (instance == null) { ConstructorInfo constructorInfo = typeof(T).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null); - instance = (T)constructorInfo.Invoke(new object[0]); + instance = (T)constructorInfo.Invoke(Array.Empty()); } } }