diff --git a/AfkSwap/AfkSwap.cs b/AfkSwap/AfkSwap.cs index c7602a6..c635799 100644 --- a/AfkSwap/AfkSwap.cs +++ b/AfkSwap/AfkSwap.cs @@ -1,36 +1,36 @@ -using System.Collections; -using LabApi.Features; -using LabApi.Loader.Features.Plugins; -using LabApi.Events.Arguments.PlayerEvents; +using LabApi.Events.Arguments.PlayerEvents; using LabApi.Events.Handlers; +using LabApi.Features; using LabApi.Features.Wrappers; -using PlayerRoles; -using Logger = LabApi.Features.Console.Logger; -using Version = System.Version; +using LabApi.Loader.Features.Plugins; using MEC; +using PlayerRoles; using UnityEngine; +using Logger = LabApi.Features.Console.Logger; +using Random = UnityEngine.Random; +using Version = System.Version; namespace AfkSwap; public class AfkSwap : Plugin { + private const float AfkTimeLimit = 60; // 1 minute in seconds + private readonly Dictionary _afkPlayers = new(); + + private readonly object _lock = new(); + private readonly Dictionary _playerPositions = new(); + + private readonly Dictionary _playerSpawnTimes = new(); public override string Name => "AfkSwap"; public override string Author => "Code002Lover"; public override Version Version { get; } = new(1, 0, 0); public override string Description => "Swaps AFK players with spectators after one minute."; public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); - - private readonly Dictionary _playerSpawnTimes = new(); - private readonly Dictionary _playerPositions = new(); - private readonly Dictionary _afkPlayers = new(); - private const float AfkTimeLimit = 60; // 1 minute in seconds - - private readonly object _lock = new(); - + public override void Enable() { PlayerEvents.Spawned += OnPlayerSpawned; - + Timing.RunCoroutine(CheckAfkPlayers()); } @@ -45,7 +45,7 @@ public class AfkSwap : Plugin _afkPlayers.Clear(); } } - + private void OnPlayerSpawned(PlayerSpawnedEventArgs ev) { var player = ev.Player; @@ -60,9 +60,8 @@ public class AfkSwap : Plugin Logger.Debug($"Player {player.DisplayName} spawned"); }); - } - + private IEnumerator CheckAfkPlayers() { Logger.Debug("Starting Afk Checking"); @@ -70,14 +69,17 @@ public class AfkSwap : Plugin { lock (_lock) { - foreach (var playerTime in _playerSpawnTimes.ToList().Where(playerTime => (DateTime.Now - playerTime.Value).TotalSeconds >= AfkTimeLimit)) + foreach (var playerTime in _playerSpawnTimes.ToList().Where(playerTime => + (DateTime.Now - playerTime.Value).TotalSeconds >= AfkTimeLimit)) { - if (playerTime.Key.Role is RoleTypeId.Spectator or RoleTypeId.Destroyed or RoleTypeId.Overwatch or RoleTypeId.Tutorial) + if (playerTime.Key.Role is RoleTypeId.Spectator or RoleTypeId.Destroyed or RoleTypeId.Overwatch + or RoleTypeId.Tutorial) { _playerSpawnTimes.Remove(playerTime.Key); _playerPositions.Remove(playerTime.Key); continue; } + if (!_playerPositions[playerTime.Key].Equals(playerTime.Key.Position)) { _playerSpawnTimes.Remove(playerTime.Key); @@ -94,35 +96,37 @@ public class AfkSwap : Plugin } // ReSharper disable once IteratorNeverReturns } - + private void SwapWithSpectator(Player afkPlayer) { - var spectators = Player.ReadyList.Where(p => p.Role == RoleTypeId.Spectator && (DateTime.Now - _afkPlayers[p]).TotalSeconds > 10).ToList(); + var spectators = Player.ReadyList + .Where(p => p.Role == RoleTypeId.Spectator && (DateTime.Now - _afkPlayers[p]).TotalSeconds > 10).ToList(); if (!spectators.Any()) { Logger.Warn("No spectators to swap to"); return; } - var randomSpectator = spectators[UnityEngine.Random.Range(0, spectators.Count)]; + + var randomSpectator = spectators[Random.Range(0, spectators.Count)]; Logger.Debug($"Swapping {afkPlayer.DisplayName} with {randomSpectator.DisplayName}"); - + // Store the AFK player's position and role var afkPosition = afkPlayer.Position; var afkRole = afkPlayer.Role; - + // Give the spectator the AFK player's role and position randomSpectator.Role = afkRole; randomSpectator.Position = afkPosition; - + // Make the AFK player a spectator afkPlayer.Role = RoleTypeId.Spectator; - + // Remove the AFK player from tracking _playerSpawnTimes.Remove(afkPlayer); _playerPositions.Remove(afkPlayer); _playerSpawnTimes[randomSpectator] = DateTime.Now; _playerPositions[randomSpectator] = randomSpectator.Position; - + // Broadcast the swap afkPlayer.SendBroadcast($"You were swapped with {randomSpectator.DisplayName} due to inactivity.", 10); randomSpectator.SendBroadcast($"You were swapped with {afkPlayer.DisplayName} due to them being AFK.", 5); diff --git a/AfkSwap/AfkSwap.csproj b/AfkSwap/AfkSwap.csproj index 1883080..e32c119 100644 --- a/AfkSwap/AfkSwap.csproj +++ b/AfkSwap/AfkSwap.csproj @@ -24,13 +24,7 @@ ..\dependencies\Assembly-CSharp.dll - ..\dependencies\Assembly-CSharp-firstpass.dll - - - ..\dependencies\Mirror.dll - - - ..\dependencies\Pooling.dll + ..\dependencies\Assembly-CSharp-firstpass.dll ..\dependencies\UnityEngine.CoreModule.dll @@ -38,6 +32,6 @@ - + diff --git a/CandySetting/CandySetting.csproj b/CandySetting/CandySetting.csproj index 1be96ee..06779cb 100644 --- a/CandySetting/CandySetting.csproj +++ b/CandySetting/CandySetting.csproj @@ -20,21 +20,6 @@ - - ..\dependencies\Assembly-CSharp.dll - - - ..\dependencies\Mirror.dll - - - ..\dependencies\Pooling.dll - - - ..\dependencies\UnityEngine.CoreModule.dll - - - - - + diff --git a/CandySetting/Class1.cs b/CandySetting/Class1.cs index 580181e..d5c3c1b 100644 --- a/CandySetting/Class1.cs +++ b/CandySetting/Class1.cs @@ -14,12 +14,12 @@ public class CandySetting : Plugin public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); public int MaxUses { get; set; } = 6; - + public override void Enable() { PlayerEvents.InteractingScp330 += TakingCandy; } - + public override void Disable() { PlayerEvents.InteractingScp330 -= TakingCandy; diff --git a/CuffedFrenemies/CuffedFrenemies.cs b/CuffedFrenemies/CuffedFrenemies.cs index 29fbe0d..9514852 100644 --- a/CuffedFrenemies/CuffedFrenemies.cs +++ b/CuffedFrenemies/CuffedFrenemies.cs @@ -1,5 +1,4 @@ -using CustomPlayerEffects; -using LabApi.Events.Arguments.PlayerEvents; +using LabApi.Events.Arguments.PlayerEvents; using LabApi.Events.Handlers; using LabApi.Features; using LabApi.Features.Console; @@ -7,8 +6,6 @@ using LabApi.Features.Wrappers; using LabApi.Loader.Features.Plugins; using Mirror; using PlayerRoles; -using PlayerRoles.PlayableScps.Scp3114; -using PlayerRoles.Ragdolls; namespace CuffedFrenemies; @@ -16,16 +13,16 @@ public class CuffedFrenemies : Plugin { public override string Name => "CuffedFrenemies"; public override string Author => "Code002Lover"; - public override Version Version { get; } = new(1, 0, 0); + public override Version Version { get; } = new(1, 0, 0); public override string Description => "Cuff your enemies"; - public override Version RequiredApiVersion { get; } = new (LabApiProperties.CompiledVersion); - + public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); + public override void Enable() { Logger.Debug("Loading"); PlayerEvents.Cuffed += OnCuff; } - + public override void Disable() { PlayerEvents.Cuffed -= OnCuff; @@ -33,10 +30,7 @@ public class CuffedFrenemies : Plugin private static void OnCuff(PlayerCuffedEventArgs ev) { - if (ev.Target.Team is Team.ClassD or Team.Scientists) - { - return; - } + if (ev.Target.Team is Team.ClassD or Team.Scientists) return; if (ev.Target.Team == ev.Player.Team) { @@ -44,30 +38,23 @@ public class CuffedFrenemies : Plugin return; } - if (ev.Target.Team is Team.SCPs or Team.Dead) - { - return; - } + if (ev.Target.Team is Team.SCPs or Team.Dead) return; var newRole = ev.Target.Team == Team.ChaosInsurgency ? RoleTypeId.NtfPrivate : RoleTypeId.ChaosConscript; Logger.Debug($"Setting role to {newRole}"); var newItems = new List(); ev.Target.Items.CopyTo(newItems); newItems.Reverse(); - + var newPos = ev.Target.Position; - + ev.Target.Inventory.UserInventory.Items.Clear(); - + ev.Target.SetRole(newRole); ev.Target.ClearItems(); - - foreach (var newItem in newItems) - { - ev.Target.Inventory.UserInventory.Items.Add(newItem.Serial,newItem.Base); - } + + foreach (var newItem in newItems) ev.Target.Inventory.UserInventory.Items.Add(newItem.Serial, newItem.Base); ev.Target.Position = newPos; - } } \ No newline at end of file diff --git a/CuffedFrenemies/CuffedFrenemies.csproj b/CuffedFrenemies/CuffedFrenemies.csproj index ede44b7..23e061e 100644 --- a/CuffedFrenemies/CuffedFrenemies.csproj +++ b/CuffedFrenemies/CuffedFrenemies.csproj @@ -26,15 +26,12 @@ ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Pooling.dll - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll - + diff --git a/CustomClasses/CustomClasses.cs b/CustomClasses/CustomClasses.cs index 87d8aa9..cefe01b 100644 --- a/CustomClasses/CustomClasses.cs +++ b/CustomClasses/CustomClasses.cs @@ -1,35 +1,34 @@ -using System.Drawing; -using CommandSystem.Commands.RemoteAdmin.Inventory; -using Interactables.Interobjects.DoorUtils; +using Interactables.Interobjects.DoorUtils; using InventorySystem.Items; using LabApi.Events.Arguments.PlayerEvents; using LabApi.Events.Arguments.ServerEvents; using LabApi.Events.Handlers; using LabApi.Features; -using LabApi.Features.Console; -using LabApi.Loader.Features.Plugins; -using PlayerRoles; using LabApi.Features.Wrappers; +using LabApi.Loader.Features.Plugins; using MapGeneration; -using Vector3 = UnityEngine.Vector3; using MEC; +using PlayerRoles; +using UnityEngine; +using Logger = LabApi.Features.Console.Logger; +using Random = System.Random; +using Vector3 = UnityEngine.Vector3; namespace CustomClasses; public class CustomClasses : Plugin { + private readonly CustomClassManager _classManager = new(); public override string Name => "CustomClasses"; public override string Author => "Code002Lover"; public override Version Version { get; } = new(1, 0, 0); public override string Description => "Adds custom classes to the game"; public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); - + public JanitorConfig JanitorConfig { get; set; } = new(); public ResearchSubjectConfig ResearchSubjectConfig { get; set; } = new(); public HeadGuardConfig HeadGuardConfig { get; set; } = new(); - - private readonly CustomClassManager _classManager = new(); - + public override void Enable() { PlayerEvents.Spawned += OnPlayerSpawned; @@ -46,21 +45,21 @@ public class CustomClasses : Plugin { _classManager.ResetSpawnStates(); } - + private void OnPlayerSpawned(PlayerSpawnedEventArgs ev) { - if(_classManager.TryHandleSpawn(ev.Player, JanitorConfig, typeof(JanitorConfig))) return; - if(_classManager.TryHandleSpawn(ev.Player, ResearchSubjectConfig, typeof(ResearchSubjectConfig))) return; - if(_classManager.TryHandleSpawn(ev.Player, HeadGuardConfig, typeof(HeadGuardConfig))) return; + if (_classManager.TryHandleSpawn(ev.Player, JanitorConfig, typeof(JanitorConfig))) return; + if (_classManager.TryHandleSpawn(ev.Player, ResearchSubjectConfig, typeof(ResearchSubjectConfig))) return; + if (_classManager.TryHandleSpawn(ev.Player, HeadGuardConfig, typeof(HeadGuardConfig))) return; } } public class CustomClassManager { + private readonly Dictionary _handlers = new(); private readonly object _lock = new(); private readonly Random _random = new(); private readonly Dictionary _spawnStates = new(); - private readonly Dictionary _handlers = new(); public CustomClassManager() { @@ -69,10 +68,10 @@ public class CustomClassManager RegisterHandler(new ResearchSubjectHandler(this)); RegisterHandler(new HeadGuardHandler(this)); } - + public void TeleportPlayerToAround(Player player, Vector3 position) { - player.Position = position + new Vector3(0,1,0) + new Vector3((float)(_random.NextDouble() * 2), 0, + player.Position = position + new Vector3(0, 1, 0) + new Vector3((float)(_random.NextDouble() * 2), 0, (float)(_random.NextDouble() * 2)); } @@ -90,10 +89,7 @@ public class CustomClassManager { lock (_lock) { - foreach (var key in _spawnStates.Keys.ToList()) - { - _spawnStates[key] = new SpawnState(); - } + foreach (var key in _spawnStates.Keys.ToList()) _spawnStates[key] = new SpawnState(); } } @@ -118,13 +114,10 @@ public class CustomClassManager } state.Spawns++; - + Logger.Debug($"Player spawning {configType} - {player.Nickname} - {state.Spawns} / {config.MaxSpawns}"); - - if (_handlers.TryGetValue(configType, out var handler)) - { - return handler.HandleSpawn(player, config, _random); - } + + if (_handlers.TryGetValue(configType, out var handler)) return handler.HandleSpawn(player, config, _random); } return false; @@ -144,12 +137,13 @@ public class JanitorHandler(CustomClassManager manager) : ICustomClassHandler Timing.CallDelayed(0.5f, () => { manager.TeleportPlayerToAround(player, scp914.Position); - + foreach (var spawnItem in config.Items) { player.AddItem(spawnItem, ItemAddReason.StartingItem); Logger.Debug($"Gave player {player.Nickname} spawn item {spawnItem}"); } + player.SendBroadcast("You're a Janitor!", 3); }); @@ -165,12 +159,13 @@ public class ResearchSubjectHandler(CustomClassManager manager) : ICustomClassHa Timing.CallDelayed(0.5f, () => { manager.TeleportPlayerToAround(player, scientist.Position); - + foreach (var spawnItem in config.Items) { player.AddItem(spawnItem, ItemAddReason.StartingItem); Logger.Debug($"Gave player {player.Nickname} spawn item {spawnItem}"); } + player.SendBroadcast("You're a Research Subject!", 3); }); @@ -185,20 +180,21 @@ public class HeadGuardHandler(CustomClassManager manager) : ICustomClassHandler Timing.CallDelayed(0.5f, () => { player.RemoveItem(ItemType.KeycardGuard); - - KeycardItem.CreateCustomKeycardTaskForce(player, "Head Guard Keycard", $"HG. {player.Nickname}", new KeycardLevels(1,1,2),UnityEngine.Color.blue,UnityEngine.Color.cyan, "1", 0); + + KeycardItem.CreateCustomKeycardTaskForce(player, "Head Guard Keycard", $"HG. {player.Nickname}", + new KeycardLevels(1, 1, 2), Color.blue, Color.cyan, "1", 0); player.AddItem(ItemType.Adrenaline, ItemAddReason.StartingItem); - + player.RemoveItem(ItemType.ArmorLight); player.AddItem(ItemType.ArmorCombat, ItemAddReason.StartingItem); - + player.RemoveItem(ItemType.GunFSP9); var pickup = Pickup.Create(ItemType.GunCrossvec, Vector3.one); if (pickup != null) player.AddItem(pickup); - + player.SetAmmo(ItemType.Ammo9x19, 120); player.SendBroadcast("You're a Head Guard!", 3); diff --git a/CustomClasses/CustomClasses.csproj b/CustomClasses/CustomClasses.csproj index bdccf6e..a0ec31e 100644 --- a/CustomClasses/CustomClasses.csproj +++ b/CustomClasses/CustomClasses.csproj @@ -30,10 +30,7 @@ ..\dependencies\Mirror.dll - ..\dependencies\NorthwoodLib.dll - - - ..\dependencies\Pooling.dll + ..\dependencies\NorthwoodLib.dll ..\dependencies\UnityEngine.CoreModule.dll @@ -41,6 +38,6 @@ - + diff --git a/CustomItemSpawn/CustomItemSpawn.cs b/CustomItemSpawn/CustomItemSpawn.cs index 0ca49f9..dc7d8a7 100644 --- a/CustomItemSpawn/CustomItemSpawn.cs +++ b/CustomItemSpawn/CustomItemSpawn.cs @@ -11,14 +11,13 @@ namespace CustomItemSpawn; public class CustomItemSpawn : Plugin { + private static CustomItemSpawn _singleton; public override string Name => "CustomItemSpawn"; public override string Author => "Code002Lover"; public override Version Version { get; } = new(1, 0, 0); public override string Description => "Spawns items in a custom location."; public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); - private static CustomItemSpawn _singleton; - public override void Enable() { _singleton = this; @@ -33,7 +32,7 @@ public class CustomItemSpawn : Plugin private static void OnRoundStart() { - Timing.CallDelayed(10,SpawnItems); + Timing.CallDelayed(10, SpawnItems); } private static void SpawnItems() diff --git a/CustomItemSpawn/CustomItemSpawn.csproj b/CustomItemSpawn/CustomItemSpawn.csproj index 1883080..9b2b4fc 100644 --- a/CustomItemSpawn/CustomItemSpawn.csproj +++ b/CustomItemSpawn/CustomItemSpawn.csproj @@ -24,20 +24,17 @@ ..\dependencies\Assembly-CSharp.dll - ..\dependencies\Assembly-CSharp-firstpass.dll + ..\dependencies\Assembly-CSharp-firstpass.dll ..\dependencies\Mirror.dll - - ..\dependencies\Pooling.dll - ..\dependencies\UnityEngine.CoreModule.dll - + diff --git a/GamblingCoin/GamblingCoin.cs b/GamblingCoin/GamblingCoin.cs index 03636a8..e2ce072 100644 --- a/GamblingCoin/GamblingCoin.cs +++ b/GamblingCoin/GamblingCoin.cs @@ -3,46 +3,43 @@ using LabApi.Features; using LabApi.Features.Console; using LabApi.Loader; -namespace GamblingCoin +namespace GamblingCoin; + +public class Plugin : LabApi.Loader.Features.Plugins.Plugin { - public class Plugin : LabApi.Loader.Features.Plugins.Plugin + public static Plugin Singleton; + private GamblingCoinEventHandler _eventHandler; + public GamblingCoinChancesConfig ConfigChances; + + public GamblingCoinGameplayConfig ConfigGameplay; + public GamblingCoinMessages ConfigMessages; + public override string Name => "GamblingCoin"; + public override string Author => "Code002Lover"; + public override Version Version { get; } = new(1, 0, 0); + public override string Description => "Gamble your life away"; + public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); + + public override void LoadConfigs() { - public override string Name => "GamblingCoin"; - public override string Author => "Code002Lover"; - public override Version Version { get; } = new(1, 0, 0); - public override string Description => "Gamble your life away"; - public override Version RequiredApiVersion { get; } = new (LabApiProperties.CompiledVersion); - - public GamblingCoinGameplayConfig ConfigGameplay; - public GamblingCoinMessages ConfigMessages; - public GamblingCoinChancesConfig ConfigChances; + base.LoadConfigs(); - public override void LoadConfigs() - { - base.LoadConfigs(); + ConfigGameplay = this.LoadConfig("gameplay.yml"); + ConfigMessages = this.LoadConfig("messages.yml"); + ConfigChances = this.LoadConfig("chances.yml"); + } - ConfigGameplay = this.LoadConfig< GamblingCoinGameplayConfig > ("gameplay.yml"); - ConfigMessages = this.LoadConfig< GamblingCoinMessages > ("messages.yml"); - ConfigChances = this.LoadConfig< GamblingCoinChancesConfig > ("chances.yml"); - } - - - public static Plugin Singleton; - private GamblingCoinEventHandler _eventHandler; - - public override void Enable() + public override void Enable() { - Logger.Debug("starting..."); - Singleton = this; - _eventHandler = new GamblingCoinEventHandler(); - PlayerEvents.FlippedCoin += _eventHandler.OnFlippedCoin; - } + Logger.Debug("starting..."); + Singleton = this; + _eventHandler = new GamblingCoinEventHandler(); + PlayerEvents.FlippedCoin += _eventHandler.OnFlippedCoin; + } - public override void Disable() - { - Logger.Debug("unloading..."); - Singleton = null; - PlayerEvents.FlippedCoin -= _eventHandler.OnFlippedCoin; - } + public override void Disable() + { + Logger.Debug("unloading..."); + Singleton = null; + PlayerEvents.FlippedCoin -= _eventHandler.OnFlippedCoin; } } \ No newline at end of file diff --git a/GamblingCoin/GamblingCoin.csproj b/GamblingCoin/GamblingCoin.csproj index 41fbf5a..23e061e 100644 --- a/GamblingCoin/GamblingCoin.csproj +++ b/GamblingCoin/GamblingCoin.csproj @@ -1,37 +1,37 @@  - - net48 - enable - disable - 10 - + + net48 + enable + disable + 10 + - - true - true - full - + + true + true + full + - - true - false - none - + + true + false + none + - - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll - - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll - - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll - - + + + ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll + + + ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll + + + ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll + + - - - + + + diff --git a/GamblingCoin/GamblingCoinConfig.cs b/GamblingCoin/GamblingCoinConfig.cs index 6ef1f3c..a6fba76 100644 --- a/GamblingCoin/GamblingCoinConfig.cs +++ b/GamblingCoin/GamblingCoinConfig.cs @@ -1,184 +1,190 @@ using CustomPlayerEffects; -namespace GamblingCoin +namespace GamblingCoin; + +public class GamblingCoinChancesConfig { - - public class GamblingCoinChancesConfig + public int NukeChance { get; set; } = 10; + public int SpawnWaveChance { get; set; } = 150; + public int CommonItemChance { get; set; } = 600; + public int UncommonItemChance { get; set; } = 400; + public int RareItemChance { get; set; } = 250; + public int EpicItemChance { get; set; } = 100; + public int LegendaryItemChance { get; set; } = 30; + public int RandomTeleportChance { get; set; } = 200; + public int StealItemChance { get; set; } = 100; + public int ExplosionChance { get; set; } = 40; + public int AntiMicroChance { get; set; } = 10; + public int GrenadeChance { get; set; } = 50; + public int PocketDimensionChance { get; set; } = 30; + public int SwitchInventoryChance { get; set; } = 150; + public int PositiveEffectChance { get; set; } = 300; + public int NegativeEffectChance { get; set; } = 350; + public int AdvancedPositiveEffectChance { get; set; } = 150; + public int AdvancedNegativeEffectChance { get; set; } = 250; + public int RemoveCoinChance { get; set; } = 300; +} + +public class GamblingCoinMessages +{ + public string SpawnWaveMessage { get; set; } = "Did someone just enter the Site...?"; + public string ItemSpawnMessage { get; set; } = "*plop*"; + public string UncommonItemSpawnMessage { get; set; } = "*bump*"; + public string RareItemSpawnMessage { get; set; } = "*badunk*"; + public string EpicItemSpawnMessage { get; set; } = "*katong*"; + public string LegendaryItemSpawnMessage { get; set; } = "*sounds of monetary loss*"; + public string RandomTeleportMessage { get; set; } = "Where did you go?"; + public string StealItemMessage { get; set; } = "Be careful, the coin is slippery!"; + public string ExplosionMessage { get; set; } = "How did you even die '-'"; + public string AntiMicroMessage { get; set; } = "Where did all the micros go..."; + public string GrenadeMessage { get; set; } = "Watch out!"; + public string PocketDimensionMessage { get; set; } = "I hear he likes to see people suffer..."; + public string PositiveEffectMessage { get; set; } = "You feel slightly better"; + public string AdvancedPositiveEffectMessage { get; set; } = "You feel better"; + public string NegativeEffectMessage { get; set; } = "You feel worse"; + public string AdvancedNegativeEffectMessage { get; set; } = "You feel like you could die any second"; + public string SwitchInventoryMessage { get; set; } = "Whoops... looks like something happened to your items!"; +} + +public class GamblingCoinGameplayConfig +{ + public float WarheadTimeIncrease { get; set; } = 20f; + public ushort BroadcastDuration { get; set; } = 3; + public float TeleportHeightOffset { get; set; } = 1f; + public int MaxMicrosToRemove { get; set; } = 8; + + public ItemPoolConfig Items { get; set; } = new(); + public EffectConfig Effects { get; set; } = new(); +} + +public class ItemPoolConfig +{ + public ItemType[] CommonItems { get; set; } = { - public int NukeChance { get; set; } = 10; - public int SpawnWaveChance { get; set; } = 150; - public int CommonItemChance { get; set; } = 600; - public int UncommonItemChance { get; set; } = 400; - public int RareItemChance { get; set; } = 250; - public int EpicItemChance { get; set; } = 100; - public int LegendaryItemChance { get; set; } = 30; - public int RandomTeleportChance { get; set; } = 200; - public int StealItemChance { get; set; } = 100; - public int ExplosionChance { get; set; } = 40; - public int AntiMicroChance { get; set; } = 10; - public int GrenadeChance { get; set; } = 50; - public int PocketDimensionChance { get; set; } = 30; - public int SwitchInventoryChance { get; set; } = 150; - public int PositiveEffectChance { get; set; } = 300; - public int NegativeEffectChance { get; set; } = 350; - public int AdvancedPositiveEffectChance { get; set; } = 150; - public int AdvancedNegativeEffectChance { get; set; } = 250; - public int RemoveCoinChance { get; set; } = 300; - } - - public class GamblingCoinMessages + ItemType.KeycardJanitor, + ItemType.KeycardScientist, + ItemType.Medkit, + ItemType.Painkillers, + ItemType.Radio, + ItemType.Flashlight + }; + + public ItemType[] UncommonItems { get; set; } = { - public string SpawnWaveMessage { get; set; } = "Did someone just enter the Site...?"; - public string ItemSpawnMessage { get; set; } = "*plop*"; - public string UncommonItemSpawnMessage { get; set; } = "*bump*"; - public string RareItemSpawnMessage { get; set; } = "*badunk*"; - public string EpicItemSpawnMessage { get; set; } = "*katong*"; - public string LegendaryItemSpawnMessage { get; set; } = "*sounds of monetary loss*"; - public string RandomTeleportMessage { get; set; } = "Where did you go?"; - public string StealItemMessage { get; set; } = "Be careful, the coin is slippery!"; - public string ExplosionMessage { get; set; } = "How did you even die '-'"; - public string AntiMicroMessage { get; set; } = "Where did all the micros go..."; - public string GrenadeMessage { get; set; } = "Watch out!"; - public string PocketDimensionMessage { get; set; } = "I hear he likes to see people suffer..."; - public string PositiveEffectMessage { get; set; } = "You feel slightly better"; - public string AdvancedPositiveEffectMessage { get; set; } = "You feel better"; - public string NegativeEffectMessage { get; set; } = "You feel worse"; - public string AdvancedNegativeEffectMessage { get; set; } = "You feel like you could die any second"; - public string SwitchInventoryMessage { get; set; } = "Whoops... looks like something happened to your items!"; - } + ItemType.KeycardZoneManager, + ItemType.KeycardGuard, + ItemType.KeycardResearchCoordinator, + ItemType.Adrenaline, + ItemType.ArmorLight, + ItemType.GrenadeFlash + }; - public class GamblingCoinGameplayConfig + public ItemType[] RareItems { get; set; } = { - public float WarheadTimeIncrease { get; set; } = 20f; - public ushort BroadcastDuration { get; set; } = 3; - public float TeleportHeightOffset { get; set; } = 1f; - public int MaxMicrosToRemove { get; set; } = 8; - - public ItemPoolConfig Items { get; set; } = new(); - public EffectConfig Effects { get; set; } = new(); - } - - public class ItemPoolConfig + ItemType.KeycardMTFPrivate, + ItemType.KeycardContainmentEngineer, + ItemType.KeycardMTFOperative, + ItemType.ArmorCombat, + ItemType.ArmorHeavy, + ItemType.SCP330, + ItemType.Lantern, + ItemType.GrenadeHE + }; + + public ItemType[] EpicItems { get; set; } = { - public ItemType[] CommonItems { get; set; } = { - ItemType.KeycardJanitor, - ItemType.KeycardScientist, - ItemType.Medkit, - ItemType.Painkillers, - ItemType.Radio, - ItemType.Flashlight - }; + ItemType.KeycardFacilityManager, + ItemType.KeycardChaosInsurgency, + ItemType.KeycardMTFCaptain, + ItemType.SCP500 + }; - public ItemType[] UncommonItems { get; set; } = { - ItemType.KeycardZoneManager, - ItemType.KeycardGuard, - ItemType.KeycardResearchCoordinator, - ItemType.Adrenaline, - ItemType.ArmorLight, - ItemType.GrenadeFlash - }; - - public ItemType[] RareItems { get; set; } = { - ItemType.KeycardMTFPrivate, - ItemType.KeycardContainmentEngineer, - ItemType.KeycardMTFOperative, - ItemType.ArmorCombat, - ItemType.ArmorHeavy, - ItemType.SCP330, - ItemType.Lantern, - ItemType.GrenadeHE - }; - - public ItemType[] EpicItems { get; set; } = { - ItemType.KeycardFacilityManager, - ItemType.KeycardChaosInsurgency, - ItemType.KeycardMTFCaptain, - ItemType.SCP500 - }; - - public ItemType[] LegendaryItems { get; set; } = { - ItemType.KeycardO5, - ItemType.MicroHID, - ItemType.Jailbird, - ItemType.GunCom45, - ItemType.Coin - }; - } - - public class EffectConfig + public ItemType[] LegendaryItems { get; set; } = { - public AdvancedEffectSettings AdvancedPositive { get; set; } = new() + ItemType.KeycardO5, + ItemType.MicroHID, + ItemType.Jailbird, + ItemType.GunCom45, + ItemType.Coin + }; +} + +public class EffectConfig +{ + public AdvancedEffectSettings AdvancedPositive { get; set; } = new() + { + Effects = new[] { nameof(Invisible), nameof(DamageReduction), nameof(MovementBoost) }, + Settings = new Dictionary { - Effects = new[] { nameof(Invisible), nameof(DamageReduction), nameof(MovementBoost) }, - Settings = new Dictionary - { - { nameof(Invisible), new EffectSettings(1, 5f, true) }, - { nameof(DamageReduction), new EffectSettings(100, 8f, false) }, - { nameof(MovementBoost), new EffectSettings(40, 2f, false) } - } - }; - - public AdvancedEffectSettings Positive { get; set; } = new() - { - Effects = new[] { nameof(Invigorated), nameof(RainbowTaste), nameof(Vitality), nameof(BodyshotReduction) }, - Settings = new Dictionary - { - { nameof(Invigorated), new EffectSettings(1, 5f, true) }, - { nameof(RainbowTaste), new EffectSettings(2, 10f, true) }, - { nameof(Vitality), new EffectSettings(1, 10f, true) }, - { nameof(BodyshotReduction), new EffectSettings(4, 5f, true) } - } - }; - - public AdvancedEffectSettings Negative { get; set; } = new() - { - Effects = new[] { nameof(Asphyxiated), nameof(AmnesiaVision), nameof(Bleeding), nameof(Blurred), - nameof(Concussed), nameof(Deafened), nameof(Disabled) }, - Settings = new Dictionary - { - { nameof(Asphyxiated), new EffectSettings(1, 10f, true) }, - { nameof(AmnesiaVision), new EffectSettings(1, 5f, true) }, - { nameof(Bleeding), new EffectSettings(1, 5f, true) }, - { nameof(Blurred), new EffectSettings(1, 5f, true) }, - { nameof(Concussed), new EffectSettings(1, 5f, true) }, - { nameof(Deafened), new EffectSettings(1, 5f, true) }, - { nameof(Disabled), new EffectSettings(1, 5f, true) } - } - }; - - public AdvancedEffectSettings AdvancedNegative { get; set; } = new() - { - Effects = new[] { nameof(InsufficientLighting), nameof(AmnesiaVision), nameof(Burned) }, - Settings = new Dictionary - { - { nameof(InsufficientLighting), new EffectSettings(1, 30f, true) }, - { nameof(AmnesiaVision), new EffectSettings(3, 30f, true) }, - { nameof(Burned), new EffectSettings(3, 60f, true) }, - } - }; - } - - public class AdvancedEffectSettings - { - public string[] Effects { get; set; } - public Dictionary Settings { get; set; } - - public AdvancedEffectSettings(){} - } - - public class EffectSettings - { - public byte Intensity { get; set; } - public float Duration { get; set; } - public bool AddDuration { get; set; } - - public EffectSettings(byte intensity, float duration, bool addDuration) - { - Intensity = intensity; - Duration = duration; - AddDuration = addDuration; + { nameof(Invisible), new EffectSettings(1, 5f, true) }, + { nameof(DamageReduction), new EffectSettings(100, 8f, false) }, + { nameof(MovementBoost), new EffectSettings(40, 2f, false) } } - - public EffectSettings(){} + }; + + public AdvancedEffectSettings Positive { get; set; } = new() + { + Effects = new[] { nameof(Invigorated), nameof(RainbowTaste), nameof(Vitality), nameof(BodyshotReduction) }, + Settings = new Dictionary + { + { nameof(Invigorated), new EffectSettings(1, 5f, true) }, + { nameof(RainbowTaste), new EffectSettings(2, 10f, true) }, + { nameof(Vitality), new EffectSettings(1, 10f, true) }, + { nameof(BodyshotReduction), new EffectSettings(4, 5f, true) } + } + }; + + public AdvancedEffectSettings Negative { get; set; } = new() + { + Effects = new[] + { + nameof(Asphyxiated), nameof(AmnesiaVision), nameof(Bleeding), nameof(Blurred), + nameof(Concussed), nameof(Deafened), nameof(Disabled) + }, + Settings = new Dictionary + { + { nameof(Asphyxiated), new EffectSettings(1, 10f, true) }, + { nameof(AmnesiaVision), new EffectSettings(1, 5f, true) }, + { nameof(Bleeding), new EffectSettings(1, 5f, true) }, + { nameof(Blurred), new EffectSettings(1, 5f, true) }, + { nameof(Concussed), new EffectSettings(1, 5f, true) }, + { nameof(Deafened), new EffectSettings(1, 5f, true) }, + { nameof(Disabled), new EffectSettings(1, 5f, true) } + } + }; + + public AdvancedEffectSettings AdvancedNegative { get; set; } = new() + { + Effects = new[] { nameof(InsufficientLighting), nameof(AmnesiaVision), nameof(Burned) }, + Settings = new Dictionary + { + { nameof(InsufficientLighting), new EffectSettings(1, 30f, true) }, + { nameof(AmnesiaVision), new EffectSettings(3, 30f, true) }, + { nameof(Burned), new EffectSettings(3, 60f, true) } + } + }; +} + +public class AdvancedEffectSettings +{ + public string[] Effects { get; set; } + public Dictionary Settings { get; set; } +} + +public class EffectSettings +{ + public EffectSettings(byte intensity, float duration, bool addDuration) + { + Intensity = intensity; + Duration = duration; + AddDuration = addDuration; } + + public EffectSettings() + { + } + + public byte Intensity { get; set; } + public float Duration { get; set; } + public bool AddDuration { get; set; } } \ No newline at end of file diff --git a/GamblingCoin/GamblingCoinEventHandler.cs b/GamblingCoin/GamblingCoinEventHandler.cs index 2a5e4a8..83504ad 100644 --- a/GamblingCoin/GamblingCoinEventHandler.cs +++ b/GamblingCoin/GamblingCoinEventHandler.cs @@ -1,240 +1,227 @@ -using System.Diagnostics; -using System.Numerics; -using CustomPlayerEffects; -using InventorySystem.Items; using LabApi.Events.Arguments.PlayerEvents; using LabApi.Features.Wrappers; using MapGeneration; using Mirror; using PlayerRoles; -using Respawning.Waves; -using Utils; -using Logger = LabApi.Features.Console.Logger; +using Respawning; +using UnityEngine; using MicroHIDItem = InventorySystem.Items.MicroHID.MicroHIDItem; using Random = UnityEngine.Random; -namespace GamblingCoin +namespace GamblingCoin; + +public class GamblingCoinEventHandler { - public class GamblingCoinEventHandler + private readonly WeightedRandomExecutor _executor; + + public GamblingCoinEventHandler() { - private readonly WeightedRandomExecutor _executor; + var configMessages = Plugin.Singleton.ConfigMessages; + var configGameplay = Plugin.Singleton.ConfigGameplay; + var configChances = Plugin.Singleton.ConfigChances; - public GamblingCoinEventHandler() - { - var configMessages = Plugin.Singleton.ConfigMessages; - var configGameplay = Plugin.Singleton.ConfigGameplay; - var configChances = Plugin.Singleton.ConfigChances; + _executor = new WeightedRandomExecutor(); - _executor = new WeightedRandomExecutor(); - - _executor - .AddAction(_ => - { - Warhead.DetonationTime += configGameplay.WarheadTimeIncrease; - Warhead.Start(suppressSubtitles: true); - }, configChances.NukeChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.SpawnWaveMessage, configGameplay.BroadcastDuration); - - if(GetPlayers().Any(player=>player.Role == RoleTypeId.Spectator)) { - Respawning.WaveManager.InitiateRespawn(Respawning.WaveManager.Waves[Random.Range(0, Respawning.WaveManager.Waves.Count)]); - } - }, configChances.SpawnWaveChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.ItemSpawnMessage, configGameplay.BroadcastDuration); - SpawnRandomItemAtPlayer(x.Player, configGameplay.Items.CommonItems); - }, configChances.CommonItemChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.UncommonItemSpawnMessage, configGameplay.BroadcastDuration); - SpawnRandomItemAtPlayer(x.Player, configGameplay.Items.UncommonItems); - }, configChances.UncommonItemChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.RareItemSpawnMessage, configGameplay.BroadcastDuration); - SpawnRandomItemAtPlayer(x.Player, configGameplay.Items.RareItems); - }, configChances.RareItemChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.EpicItemSpawnMessage, configGameplay.BroadcastDuration); - SpawnRandomItemAtPlayer(x.Player, configGameplay.Items.EpicItems); - }, configChances.EpicItemChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.LegendaryItemSpawnMessage, configGameplay.BroadcastDuration); - - var player = x.Player; - var items = configGameplay.Items.LegendaryItems; - - var itemIndex = Random.Range(0, items.Length); - var item = items[itemIndex]; - - var pickup = Pickup.Create(item, player.Position + new UnityEngine.Vector3(0,1,0)); - if (pickup == null) return; - - if (item is ItemType.MicroHID) - { - var host = Player.List.First(player1 => player1.IsHost); - var micro = host.AddItem(pickup)!.Base; - - var microItem = (MicroHIDItem)micro; - microItem.EnergyManager.ServerSetEnergy(microItem.ItemId.SerialNumber, 100); - - var newPickup = host.DropItem(micro); - newPickup.Position = player.Position + new UnityEngine.Vector3(0, 1, 0); - return; - } - - pickup.Spawn(); - }, configChances.LegendaryItemChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.RandomTeleportMessage, configGameplay.BroadcastDuration); - var randomRoom = Map.GetRandomRoom(); - if(randomRoom == null) return; - - var isInOtherZone = randomRoom is { Zone: FacilityZone.Other }; - var isDetonated = Warhead.IsDetonated; - var isDecontaminating = Decontamination.IsDecontaminating; - - var isInDetonatedZone = isDetonated && randomRoom.Zone is FacilityZone.HeavyContainment - or FacilityZone.LightContainment or FacilityZone.Entrance; - var isInDecontaminatedZone = isDecontaminating && randomRoom.Zone is FacilityZone.LightContainment; - while (isInOtherZone || isInDetonatedZone || isInDecontaminatedZone) - { - randomRoom = Map.GetRandomRoom(); - if(randomRoom == null) return; - - isInOtherZone = randomRoom is { Zone: FacilityZone.Other }; - isInDetonatedZone = isDetonated && randomRoom.Zone is FacilityZone.HeavyContainment - or FacilityZone.LightContainment or FacilityZone.Entrance; - isInDecontaminatedZone = isDecontaminating && randomRoom.Zone is FacilityZone.LightContainment; - } - - var newPos = randomRoom.Position; - - x.Player.Position = newPos + new UnityEngine.Vector3(0, configGameplay.TeleportHeightOffset, 0);; - }, configChances.RandomTeleportChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.StealItemMessage, configGameplay.BroadcastDuration); - - if (x.Player.CurrentItem != null) x.Player.DropItem(x.Player.CurrentItem); - }, configChances.StealItemChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.ExplosionMessage, configGameplay.BroadcastDuration); - - x.Player.ClearInventory(); - - TimedGrenadeProjectile.SpawnActive(x.Player.Position, ItemType.GrenadeHE, x.Player); - }, configChances.ExplosionChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.AntiMicroMessage, configGameplay.BroadcastDuration); - GetPlayers().ForEach(p => { p.RemoveItem(ItemType.MicroHID, configGameplay.MaxMicrosToRemove); }); - //TODO: remove *all* micros - }, configChances.AntiMicroChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.GrenadeMessage, configGameplay.BroadcastDuration); - - TimedGrenadeProjectile.SpawnActive(x.Player.Position, ItemType.GrenadeHE, x.Player, 2); - }, configChances.GrenadeChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.PocketDimensionMessage, configGameplay.BroadcastDuration); - - PocketDimension.ForceInside(x.Player); - }, - configChances.PocketDimensionChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.AdvancedPositiveEffectMessage, configGameplay.BroadcastDuration); - ApplyRandomEffect(x.Player, configGameplay.Effects.AdvancedPositive); - }, configChances.AdvancedPositiveEffectChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.PositiveEffectMessage, configGameplay.BroadcastDuration); - ApplyRandomEffect(x.Player, configGameplay.Effects.Positive); - }, configChances.PositiveEffectChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.NegativeEffectMessage, configGameplay.BroadcastDuration); - ApplyRandomEffect(x.Player, configGameplay.Effects.Negative); - }, configChances.NegativeEffectChance) - .AddAction(x => - { - x.Player.SendBroadcast(configMessages.AdvancedNegativeEffectMessage, configGameplay.BroadcastDuration); - ApplyRandomEffect(x.Player, configGameplay.Effects.AdvancedNegative); - }, configChances.AdvancedNegativeEffectChance) - .AddAction(x => - { - var players = GetPlayers(); - - var randomPlayer = players[Random.Range(0,GetPlayers().Length)]; - - while(randomPlayer.RoleBase.Team is Team.Dead or Team.SCPs) randomPlayer = players[Random.Range(0,GetPlayers().Length)]; - - x.Player.SendBroadcast(configMessages.SwitchInventoryMessage, configGameplay.BroadcastDuration); - randomPlayer.SendBroadcast(configMessages.SwitchInventoryMessage, configGameplay.BroadcastDuration); - - var randomPlayerItems = new List(); - randomPlayer.Items.CopyTo(randomPlayerItems); - var items = x.Player.Items; - - randomPlayer.ClearInventory(); - foreach (var itemBase in items) - { - randomPlayer.AddItem(itemBase.Type); - } - - x.Player.ClearInventory(); - foreach (var randomPlayerItem in randomPlayerItems) - { - x.Player.AddItem(randomPlayerItem.Type); - } - }, configChances.SwitchInventoryChance) - .AddAction(x => - { - x.Player.CurrentItem?.DropItem().Destroy(); - }, configChances.RemoveCoinChance); - - return; - - void ApplyRandomEffect(Player player, AdvancedEffectSettings settings) + _executor + .AddAction(_ => { - var effectChosen = settings.Effects[Random.Range(0, settings.Effects.Length)]; - var effectSettings = settings.Settings[effectChosen]; - - player.ReferenceHub.playerEffectsController.ChangeState(effectChosen, effectSettings.Intensity, effectSettings.Duration, effectSettings.AddDuration); - } - - void SpawnItemAtPlayer(Player player, ItemType item) + Warhead.DetonationTime += configGameplay.WarheadTimeIncrease; + Warhead.Start(suppressSubtitles: true); + }, configChances.NukeChance) + .AddAction(x => { - var pickup = Pickup.Create(item, player.Position + new UnityEngine.Vector3(0,1,0)); - if (pickup == null) return; - - pickup.Spawn(); - } + x.Player.SendBroadcast(configMessages.SpawnWaveMessage, configGameplay.BroadcastDuration); - void SpawnRandomItemAtPlayer(Player player, ItemType[] items) + if (GetPlayers().Any(player => player.Role == RoleTypeId.Spectator)) + WaveManager.InitiateRespawn(WaveManager.Waves[Random.Range(0, WaveManager.Waves.Count)]); + }, configChances.SpawnWaveChance) + .AddAction(x => { + x.Player.SendBroadcast(configMessages.ItemSpawnMessage, configGameplay.BroadcastDuration); + SpawnRandomItemAtPlayer(x.Player, configGameplay.Items.CommonItems); + }, configChances.CommonItemChance) + .AddAction(x => + { + x.Player.SendBroadcast(configMessages.UncommonItemSpawnMessage, configGameplay.BroadcastDuration); + SpawnRandomItemAtPlayer(x.Player, configGameplay.Items.UncommonItems); + }, configChances.UncommonItemChance) + .AddAction(x => + { + x.Player.SendBroadcast(configMessages.RareItemSpawnMessage, configGameplay.BroadcastDuration); + SpawnRandomItemAtPlayer(x.Player, configGameplay.Items.RareItems); + }, configChances.RareItemChance) + .AddAction(x => + { + x.Player.SendBroadcast(configMessages.EpicItemSpawnMessage, configGameplay.BroadcastDuration); + SpawnRandomItemAtPlayer(x.Player, configGameplay.Items.EpicItems); + }, configChances.EpicItemChance) + .AddAction(x => + { + x.Player.SendBroadcast(configMessages.LegendaryItemSpawnMessage, configGameplay.BroadcastDuration); + + var player = x.Player; + var items = configGameplay.Items.LegendaryItems; + var itemIndex = Random.Range(0, items.Length); - SpawnItemAtPlayer(player, items[itemIndex]); - } + var item = items[itemIndex]; - Player[] GetPlayers() + var pickup = Pickup.Create(item, player.Position + new Vector3(0, 1, 0)); + if (pickup == null) return; + + if (item is ItemType.MicroHID) + { + var host = Player.List.First(player1 => player1.IsHost); + var micro = host.AddItem(pickup)!.Base; + + var microItem = (MicroHIDItem)micro; + microItem.EnergyManager.ServerSetEnergy(microItem.ItemId.SerialNumber, 100); + + var newPickup = host.DropItem(micro); + newPickup.Position = player.Position + new Vector3(0, 1, 0); + return; + } + + pickup.Spawn(); + }, configChances.LegendaryItemChance) + .AddAction(x => { - return Player.ReadyList.ToArray(); - } + x.Player.SendBroadcast(configMessages.RandomTeleportMessage, configGameplay.BroadcastDuration); + var randomRoom = Map.GetRandomRoom(); + if (randomRoom == null) return; + + var isInOtherZone = randomRoom is { Zone: FacilityZone.Other }; + var isDetonated = Warhead.IsDetonated; + var isDecontaminating = Decontamination.IsDecontaminating; + + var isInDetonatedZone = isDetonated && randomRoom.Zone is FacilityZone.HeavyContainment + or FacilityZone.LightContainment or FacilityZone.Entrance; + var isInDecontaminatedZone = isDecontaminating && randomRoom.Zone is FacilityZone.LightContainment; + while (isInOtherZone || isInDetonatedZone || isInDecontaminatedZone) + { + randomRoom = Map.GetRandomRoom(); + if (randomRoom == null) return; + + isInOtherZone = randomRoom is { Zone: FacilityZone.Other }; + isInDetonatedZone = isDetonated && randomRoom.Zone is FacilityZone.HeavyContainment + or FacilityZone.LightContainment or FacilityZone.Entrance; + isInDecontaminatedZone = isDecontaminating && randomRoom.Zone is FacilityZone.LightContainment; + } + + var newPos = randomRoom.Position; + + x.Player.Position = newPos + new Vector3(0, configGameplay.TeleportHeightOffset, 0); + ; + }, configChances.RandomTeleportChance) + .AddAction(x => + { + x.Player.SendBroadcast(configMessages.StealItemMessage, configGameplay.BroadcastDuration); + + if (x.Player.CurrentItem != null) x.Player.DropItem(x.Player.CurrentItem); + }, configChances.StealItemChance) + .AddAction(x => + { + x.Player.SendBroadcast(configMessages.ExplosionMessage, configGameplay.BroadcastDuration); + + x.Player.ClearInventory(); + + TimedGrenadeProjectile.SpawnActive(x.Player.Position, ItemType.GrenadeHE, x.Player); + }, configChances.ExplosionChance) + .AddAction(x => + { + x.Player.SendBroadcast(configMessages.AntiMicroMessage, configGameplay.BroadcastDuration); + GetPlayers().ForEach(p => { p.RemoveItem(ItemType.MicroHID, configGameplay.MaxMicrosToRemove); }); + //TODO: remove *all* micros + }, configChances.AntiMicroChance) + .AddAction(x => + { + x.Player.SendBroadcast(configMessages.GrenadeMessage, configGameplay.BroadcastDuration); + + TimedGrenadeProjectile.SpawnActive(x.Player.Position, ItemType.GrenadeHE, x.Player, 2); + }, configChances.GrenadeChance) + .AddAction(x => + { + x.Player.SendBroadcast(configMessages.PocketDimensionMessage, configGameplay.BroadcastDuration); + + PocketDimension.ForceInside(x.Player); + }, + configChances.PocketDimensionChance) + .AddAction(x => + { + x.Player.SendBroadcast(configMessages.AdvancedPositiveEffectMessage, configGameplay.BroadcastDuration); + ApplyRandomEffect(x.Player, configGameplay.Effects.AdvancedPositive); + }, configChances.AdvancedPositiveEffectChance) + .AddAction(x => + { + x.Player.SendBroadcast(configMessages.PositiveEffectMessage, configGameplay.BroadcastDuration); + ApplyRandomEffect(x.Player, configGameplay.Effects.Positive); + }, configChances.PositiveEffectChance) + .AddAction(x => + { + x.Player.SendBroadcast(configMessages.NegativeEffectMessage, configGameplay.BroadcastDuration); + ApplyRandomEffect(x.Player, configGameplay.Effects.Negative); + }, configChances.NegativeEffectChance) + .AddAction(x => + { + x.Player.SendBroadcast(configMessages.AdvancedNegativeEffectMessage, configGameplay.BroadcastDuration); + ApplyRandomEffect(x.Player, configGameplay.Effects.AdvancedNegative); + }, configChances.AdvancedNegativeEffectChance) + .AddAction(x => + { + var players = GetPlayers(); + + var randomPlayer = players[Random.Range(0, GetPlayers().Length)]; + + while (randomPlayer.RoleBase.Team is Team.Dead or Team.SCPs) + randomPlayer = players[Random.Range(0, GetPlayers().Length)]; + + x.Player.SendBroadcast(configMessages.SwitchInventoryMessage, configGameplay.BroadcastDuration); + randomPlayer.SendBroadcast(configMessages.SwitchInventoryMessage, configGameplay.BroadcastDuration); + + var randomPlayerItems = new List(); + randomPlayer.Items.CopyTo(randomPlayerItems); + var items = x.Player.Items; + + randomPlayer.ClearInventory(); + foreach (var itemBase in items) randomPlayer.AddItem(itemBase.Type); + + x.Player.ClearInventory(); + foreach (var randomPlayerItem in randomPlayerItems) x.Player.AddItem(randomPlayerItem.Type); + }, configChances.SwitchInventoryChance) + .AddAction(x => { x.Player.CurrentItem?.DropItem().Destroy(); }, configChances.RemoveCoinChance); + + return; + + void ApplyRandomEffect(Player player, AdvancedEffectSettings settings) + { + var effectChosen = settings.Effects[Random.Range(0, settings.Effects.Length)]; + var effectSettings = settings.Settings[effectChosen]; + + player.ReferenceHub.playerEffectsController.ChangeState(effectChosen, effectSettings.Intensity, + effectSettings.Duration, effectSettings.AddDuration); } - public void OnFlippedCoin(PlayerFlippedCoinEventArgs ev) + void SpawnItemAtPlayer(Player player, ItemType item) { - _executor.Execute(ev); + var pickup = Pickup.Create(item, player.Position + new Vector3(0, 1, 0)); + if (pickup == null) return; + + pickup.Spawn(); + } + + void SpawnRandomItemAtPlayer(Player player, ItemType[] items) + { + var itemIndex = Random.Range(0, items.Length); + SpawnItemAtPlayer(player, items[itemIndex]); + } + + Player[] GetPlayers() + { + return Player.ReadyList.ToArray(); } } + + public void OnFlippedCoin(PlayerFlippedCoinEventArgs ev) + { + _executor.Execute(ev); + } } \ No newline at end of file diff --git a/GamblingCoin/WeightedRandom.cs b/GamblingCoin/WeightedRandom.cs index 48c6e6f..e6dd9a6 100644 --- a/GamblingCoin/WeightedRandom.cs +++ b/GamblingCoin/WeightedRandom.cs @@ -2,30 +2,12 @@ namespace GamblingCoin; public class WeightedRandomExecutor { - private class WeightedAction - { - public Action Action { get; } - public double Weight { get; } - - public WeightedAction(Action action, double weight) - { - if (weight <= 0) - throw new ArgumentOutOfRangeException( - nameof(weight), - "Weight must be positive." - ); - - Action = action ?? throw new ArgumentNullException(nameof(action)); - Weight = weight; - } - } - private readonly List _actions = new(); private readonly Random _random = new(); private double _totalWeight; /// - /// Adds a function to be potentially executed, along with its weight. + /// Adds a function to be potentially executed, along with its weight. /// /// The function to add. It must accept an argument of type TEvent. /// The positive weight for this function. Higher weights mean higher probability. @@ -34,31 +16,27 @@ public class WeightedRandomExecutor var weightedAction = new WeightedAction(action, weight); _actions.Add(weightedAction); _totalWeight += weight; - + return this; } /// - /// Executes one of the added functions randomly based on their weights. - /// The chosen function will be called with the provided 'ev' argument. + /// Executes one of the added functions randomly based on their weights. + /// The chosen function will be called with the provided 'ev' argument. /// /// The event argument to pass to the chosen function. /// Thrown if no actions have been added. public void Execute(TEvent ev) { if (_actions.Count == 0) - { throw new InvalidOperationException( "No actions have been added to execute." ); - } if (_totalWeight <= 0) // Should not happen if AddAction validates weight > 0 - { throw new InvalidOperationException( "Total weight is zero or negative, cannot execute." ); - } var randomNumber = _random.NextDouble() * _totalWeight; double cumulativeWeight = 0; @@ -74,9 +52,24 @@ public class WeightedRandomExecutor // Fallback in case of floating point inaccuracies, // or if somehow randomNumber was exactly _totalWeight (NextDouble is < 1.0) // This should ideally pick the last item if all weights were summed up. - if (_actions.Any()) + if (_actions.Any()) _actions.Last().Action(ev); + } + + private class WeightedAction + { + public WeightedAction(Action action, double weight) { - _actions.Last().Action(ev); + if (weight <= 0) + throw new ArgumentOutOfRangeException( + nameof(weight), + "Weight must be positive." + ); + + Action = action ?? throw new ArgumentNullException(nameof(action)); + Weight = weight; } + + public Action Action { get; } + public double Weight { get; } } } \ No newline at end of file diff --git a/GrowingZombies/GrowingZombies.cs b/GrowingZombies/GrowingZombies.cs index 1d29fbc..7c1b63c 100644 --- a/GrowingZombies/GrowingZombies.cs +++ b/GrowingZombies/GrowingZombies.cs @@ -1,25 +1,24 @@ using CustomPlayerEffects; -using LabApi.Events.Arguments.Scp0492Events; -using LabApi.Events.Handlers; -using LabApi.Features; -using LabApi.Loader.Features.Plugins; using InventorySystem.Items.Usables.Scp330; using LabApi.Events.Arguments.PlayerEvents; +using LabApi.Events.Arguments.Scp0492Events; using LabApi.Events.Arguments.ServerEvents; +using LabApi.Events.Handlers; +using LabApi.Features; using LabApi.Features.Wrappers; +using LabApi.Loader.Features.Plugins; namespace GrowingZombies; public class GrowingZombies : Plugin { + private readonly Dictionary _zombieCorpseCount = new(); public override string Name => "GrowingZombies"; public override string Author => "Code002Lover"; public override Version Version { get; } = new(1, 0, 0); public override string Description => "Makes zombies grow stronger as they eat more"; public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); - private readonly Dictionary _zombieCorpseCount = new(); - public override void Enable() { Scp0492Events.ConsumedCorpse += OnZombieEat; @@ -65,9 +64,7 @@ public class GrowingZombies : Plugin // Add damage resistance after eating multiple corpses var damageResistance = (byte)Math.Min(0.5 - corpsesEaten * 0.5f, 2f); if (corpsesEaten >= 3) - { ev.Player.ReferenceHub.playerEffectsController.ChangeState(damageResistance, 20); - } // Add regeneration effect after eating multiple corpses if (corpsesEaten < 5) return; diff --git a/GrowingZombies/GrowingZombies.csproj b/GrowingZombies/GrowingZombies.csproj index bb5e31b..753ceeb 100644 --- a/GrowingZombies/GrowingZombies.csproj +++ b/GrowingZombies/GrowingZombies.csproj @@ -23,24 +23,18 @@ ..\dependencies\Assembly-CSharp.dll - - ..\dependencies\Assembly-CSharp-firstpass.dll - ..\dependencies\Mirror.dll ..\dependencies\NorthwoodLib.dll - - ..\dependencies\Pooling.dll - ..\dependencies\UnityEngine.CoreModule.dll - + diff --git a/KeycardButModern/DoorLockConfiguration.cs b/KeycardButModern/DoorLockConfiguration.cs index 781df3d..913201f 100644 --- a/KeycardButModern/DoorLockConfiguration.cs +++ b/KeycardButModern/DoorLockConfiguration.cs @@ -12,13 +12,13 @@ public enum DoorType public class DoorLockConfiguration { - public Dictionary LockDurations { get; set; }= new() + public Dictionary LockDurations { get; set; } = new() { { DoorType.Normal, 5f }, { DoorType.Gate, 8f }, { DoorType.Checkpoint, 3f } }; - + public static DoorType GetDoorType(DoorVariant door) { Logger.Debug("Door name: " + door.name); diff --git a/KeycardButModern/KeycardButModern.cs b/KeycardButModern/KeycardButModern.cs index c1ced0a..fbcdc04 100644 --- a/KeycardButModern/KeycardButModern.cs +++ b/KeycardButModern/KeycardButModern.cs @@ -1,5 +1,4 @@ using System.Collections; -using Interactables.Interobjects; using Interactables.Interobjects.DoorButtons; using Interactables.Interobjects.DoorUtils; using LabApi.Events.Arguments.PlayerEvents; @@ -10,224 +9,175 @@ using UnityEngine; using KeycardItem = InventorySystem.Items.Keycards.KeycardItem; using Logger = LabApi.Features.Console.Logger; -namespace KeycardButModern +namespace KeycardButModern; + +public class Plugin : LabApi.Loader.Features.Plugins.Plugin { - public class Plugin: LabApi.Loader.Features.Plugins.Plugin + public static Plugin Singleton; + + public DoorLockConfiguration DoorLockConfiguration; + public override string Name => "KeycardButModern"; + public override string Description => "Ever thought you wanted your keycard implanted in your body? No? Same."; + public override string Author => "Code002Lover"; + public override Version Version { get; } = new(1, 0, 0); + public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); + + public override void LoadConfigs() { - public override string Name => "KeycardButModern"; - public override string Description => "Ever thought you wanted your keycard implanted in your body? No? Same."; - public override string Author => "Code002Lover"; - public override Version Version { get; } = new(1, 0, 0); - public override Version RequiredApiVersion { get; } = new (LabApiProperties.CompiledVersion); + base.LoadConfigs(); - public DoorLockConfiguration DoorLockConfiguration; - public static Plugin Singleton; + DoorLockConfiguration = this.LoadConfig("door_locks.yml"); + } - public override void LoadConfigs() + private void OnInteractingDoor(PlayerInteractingDoorEventArgs ev) + { + if (ev.CanOpen) return; + + if (ev.Door.IsLocked) return; + + foreach (var playerItem in ev.Player.Items) { - base.LoadConfigs(); - - DoorLockConfiguration = this.LoadConfig< DoorLockConfiguration > ("door_locks.yml"); - } + //is keycard? + if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue; + if (playerItem.Base is not KeycardItem keycardItem) continue; - private void OnInteractingDoor(PlayerInteractingDoorEventArgs ev) - { - if (ev.CanOpen) - { - return; - } + if (!ev.Door.Base.CheckPermissions(keycardItem, out _)) continue; + ev.Door.IsOpened = !ev.Door.IsOpened; - if (ev.Door.IsLocked) - { - return; - } - - foreach (var playerItem in ev.Player.Items) - { - //is keycard? - if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue; - if (playerItem.Base is not KeycardItem keycardItem) - { - continue; - } - - if (!ev.Door.Base.CheckPermissions(keycardItem, out _)) continue; - ev.Door.IsOpened = !ev.Door.IsOpened; - - return; - } - } - - private void OnInteractingGenerator(PlayerInteractingGeneratorEventArgs ev) - { - if (!ev.IsAllowed) - { - return; - } - - if (ev.Player.CurrentItem?.Base is KeycardItem keycard) - { - if (ev.Generator.Base.CheckPermissions(keycard, out _)) - { - ev.Generator.IsUnlocked = true; - return; - } - } - - if (ev.Generator.IsUnlocked) - { - return; - } - - - foreach (var playerItem in ev.Player.Items) - { - //is keycard? - if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue; - if (playerItem.Base is not KeycardItem keycardItem) - { - continue; - } - - if (!ev.Generator.Base.CheckPermissions(keycardItem, out _)) continue; - ev.Generator.IsOpen = !ev.Generator.IsOpen; - ev.Generator.IsUnlocked = true; - - return; - } - } - - private void OnInteractingLocker(PlayerInteractingLockerEventArgs ev) - { - if (!ev.IsAllowed) - { - return; - } - - if (ev.Chamber.Base.RequiredPermissions == DoorPermissionFlags.None) - { - return; - } - - if (ev.Player.CurrentItem?.Base is KeycardItem keycard) - { - if (ev.Chamber.Base.CheckPermissions(keycard, out _)) return; - } - - foreach (var playerItem in ev.Player.Items) - { - //is keycard? - if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue; - if (playerItem.Base is not KeycardItem keycardItem) - { - continue; - } - - if (!ev.Chamber.Base.CheckPermissions(keycardItem, out _)) continue; - ev.Chamber.IsOpen = !ev.Chamber.IsOpen; - - return; - } - } - - private void OnUnlockingWarhead(PlayerUnlockingWarheadButtonEventArgs ev) - { - if (ev.IsAllowed) - { - return; - } - - foreach (var playerItem in ev.Player.Items) - { - //is keycard? - if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue; - if (playerItem.Base is not KeycardItem keycardItem) - { - continue; - } - - if (!AlphaWarheadActivationPanel.Instance.CheckPermissions(keycardItem, out _)) continue; - ev.IsAllowed = true; - return; - } - } - - private static void OnBulletHole(PlayerPlacedBulletHoleEventArgs ev) - { - var direction = (ev.HitPosition - ev.RaycastStart).normalized; - var distance = Vector3.Distance(ev.RaycastStart, ev.HitPosition); - - var hits = Physics.RaycastAll(ev.RaycastStart, direction, distance); - foreach (var hit in hits) - { - ButtonVariant doorButton = hit.collider.GetComponent(); - if (!doorButton) - { - doorButton = hit.collider.GetComponent(); - } - if (!doorButton) - { - doorButton = hit.collider.GetComponent(); - } - if (!doorButton) - { - doorButton = hit.collider.GetComponent(); - } - - if (!doorButton) - { - continue; - } - - var doorVariant = DoorVariant.AllDoors.AsEnumerable()!.First(x => x.Buttons.Any(c=>c.GetInstanceID() == doorButton.GetInstanceID())); - - doorVariant.ServerInteract(ev.Player.ReferenceHub, doorButton.ColliderId); - StartDoorLockCoroutine(doorVariant); - - return; - } - } - - public override void Enable() - { - Logger.Debug("starting..."); - Singleton = this; - - PlayerEvents.InteractingDoor += OnInteractingDoor; - PlayerEvents.InteractingGenerator += OnInteractingGenerator; - PlayerEvents.InteractingLocker += OnInteractingLocker; - PlayerEvents.UnlockingWarheadButton += OnUnlockingWarhead; - - PlayerEvents.PlacedBulletHole += OnBulletHole; - - } - - private static void StartDoorLockCoroutine(DoorVariant door) - { - door.StartCoroutine(LockDoorCoroutine(door)); - } - - private static IEnumerator LockDoorCoroutine(DoorVariant door) - { - var doorType = DoorLockConfiguration.GetDoorType(door); - var lockDuration = Singleton.DoorLockConfiguration.LockDurations[doorType]; - - door.ServerChangeLock(DoorLockReason.SpecialDoorFeature, true); - yield return new WaitForSeconds(lockDuration); - door.ServerChangeLock(DoorLockReason.SpecialDoorFeature, false); - } - - public override void Disable() - { - PlayerEvents.InteractingDoor -= OnInteractingDoor; - PlayerEvents.InteractingGenerator -= OnInteractingGenerator; - PlayerEvents.InteractingLocker -= OnInteractingLocker; - PlayerEvents.UnlockingWarheadButton -= OnUnlockingWarhead; - - PlayerEvents.PlacedBulletHole -= OnBulletHole; - Logger.Debug("unloading..."); - - Singleton = null; + return; } } + + private void OnInteractingGenerator(PlayerInteractingGeneratorEventArgs ev) + { + if (!ev.IsAllowed) return; + + if (ev.Player.CurrentItem?.Base is KeycardItem keycard) + if (ev.Generator.Base.CheckPermissions(keycard, out _)) + { + ev.Generator.IsUnlocked = true; + return; + } + + if (ev.Generator.IsUnlocked) return; + + + foreach (var playerItem in ev.Player.Items) + { + //is keycard? + if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue; + if (playerItem.Base is not KeycardItem keycardItem) continue; + + if (!ev.Generator.Base.CheckPermissions(keycardItem, out _)) continue; + ev.Generator.IsOpen = !ev.Generator.IsOpen; + ev.Generator.IsUnlocked = true; + + return; + } + } + + private void OnInteractingLocker(PlayerInteractingLockerEventArgs ev) + { + if (!ev.IsAllowed) return; + + if (ev.Chamber.Base.RequiredPermissions == DoorPermissionFlags.None) return; + + if (ev.Player.CurrentItem?.Base is KeycardItem keycard) + if (ev.Chamber.Base.CheckPermissions(keycard, out _)) + return; + + foreach (var playerItem in ev.Player.Items) + { + //is keycard? + if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue; + if (playerItem.Base is not KeycardItem keycardItem) continue; + + if (!ev.Chamber.Base.CheckPermissions(keycardItem, out _)) continue; + ev.Chamber.IsOpen = !ev.Chamber.IsOpen; + + return; + } + } + + private void OnUnlockingWarhead(PlayerUnlockingWarheadButtonEventArgs ev) + { + if (ev.IsAllowed) return; + + foreach (var playerItem in ev.Player.Items) + { + //is keycard? + if (playerItem.Type is > ItemType.KeycardO5 and < ItemType.KeycardCustomTaskForce) continue; + if (playerItem.Base is not KeycardItem keycardItem) continue; + + if (!AlphaWarheadActivationPanel.Instance.CheckPermissions(keycardItem, out _)) continue; + ev.IsAllowed = true; + return; + } + } + + private static void OnBulletHole(PlayerPlacedBulletHoleEventArgs ev) + { + var direction = (ev.HitPosition - ev.RaycastStart).normalized; + var distance = Vector3.Distance(ev.RaycastStart, ev.HitPosition); + + var hits = Physics.RaycastAll(ev.RaycastStart, direction, distance); + foreach (var hit in hits) + { + ButtonVariant doorButton = hit.collider.GetComponent(); + if (!doorButton) doorButton = hit.collider.GetComponent(); + if (!doorButton) doorButton = hit.collider.GetComponent(); + if (!doorButton) doorButton = hit.collider.GetComponent(); + + if (!doorButton) continue; + + var doorVariant = DoorVariant.AllDoors.AsEnumerable()!.First(x => + x.Buttons.Any(c => c.GetInstanceID() == doorButton.GetInstanceID())); + + doorVariant.ServerInteract(ev.Player.ReferenceHub, doorButton.ColliderId); + StartDoorLockCoroutine(doorVariant); + + return; + } + } + + public override void Enable() + { + Logger.Debug("starting..."); + Singleton = this; + + PlayerEvents.InteractingDoor += OnInteractingDoor; + PlayerEvents.InteractingGenerator += OnInteractingGenerator; + PlayerEvents.InteractingLocker += OnInteractingLocker; + PlayerEvents.UnlockingWarheadButton += OnUnlockingWarhead; + + PlayerEvents.PlacedBulletHole += OnBulletHole; + } + + private static void StartDoorLockCoroutine(DoorVariant door) + { + door.StartCoroutine(LockDoorCoroutine(door)); + } + + private static IEnumerator LockDoorCoroutine(DoorVariant door) + { + var doorType = DoorLockConfiguration.GetDoorType(door); + var lockDuration = Singleton.DoorLockConfiguration.LockDurations[doorType]; + + door.ServerChangeLock(DoorLockReason.SpecialDoorFeature, true); + yield return new WaitForSeconds(lockDuration); + door.ServerChangeLock(DoorLockReason.SpecialDoorFeature, false); + } + + public override void Disable() + { + PlayerEvents.InteractingDoor -= OnInteractingDoor; + PlayerEvents.InteractingGenerator -= OnInteractingGenerator; + PlayerEvents.InteractingLocker -= OnInteractingLocker; + PlayerEvents.UnlockingWarheadButton -= OnUnlockingWarhead; + + PlayerEvents.PlacedBulletHole -= OnBulletHole; + Logger.Debug("unloading..."); + + Singleton = null; + } } \ No newline at end of file diff --git a/KeycardButModern/KeycardButModern.csproj b/KeycardButModern/KeycardButModern.csproj index 8ce252b..7639fa8 100644 --- a/KeycardButModern/KeycardButModern.csproj +++ b/KeycardButModern/KeycardButModern.csproj @@ -1,40 +1,40 @@  - - net48 - enable - disable - 10 - + + net48 + enable + disable + 10 + - - true - true - full - + + true + true + full + - - true - false - none - + + true + false + none + - - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll - - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll - - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll - - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PhysicsModule.dll - - + + + ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll + + + ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll + + + ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll + + + ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PhysicsModule.dll + + - - - + + + diff --git a/LogEvents/Class1.cs b/LogEvents/Class1.cs index 1840a66..6aaa865 100644 --- a/LogEvents/Class1.cs +++ b/LogEvents/Class1.cs @@ -2,30 +2,29 @@ using LabApi.Features; using LabApi.Loader.Features.Plugins; -namespace LogEvents +namespace LogEvents; + +internal class LogPlugin : Plugin { - internal class LogPlugin : Plugin + public override string Name { get; } = "LogPlugin"; + + public override string Description { get; } = "Example Plugin that logs (almost) all events."; + + public override string Author { get; } = "Northwood"; + + public override Version Version { get; } = new(1, 0, 0, 0); + + public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); + + public MyCustomEventsHandler Events { get; } = new(); + + public override void Enable() { - public override string Name { get; } = "LogPlugin"; + CustomHandlersManager.RegisterEventsHandler(Events); + } - public override string Description { get; } = "Example Plugin that logs (almost) all events."; - - public override string Author { get; } = "Northwood"; - - public override Version Version { get; } = new Version(1, 0, 0, 0); - - public override Version RequiredApiVersion { get; } = new Version(LabApiProperties.CompiledVersion); - - public MyCustomEventsHandler Events { get; } = new(); - - public override void Enable() - { - CustomHandlersManager.RegisterEventsHandler(Events); - } - - public override void Disable() - { - CustomHandlersManager.UnregisterEventsHandler(Events); - } + public override void Disable() + { + CustomHandlersManager.UnregisterEventsHandler(Events); } } \ No newline at end of file diff --git a/LogEvents/LogEvents.cs b/LogEvents/LogEvents.cs index 951a291..941adfe 100644 --- a/LogEvents/LogEvents.cs +++ b/LogEvents/LogEvents.cs @@ -25,7 +25,7 @@ internal class MyCustomEventsHandler : CustomEventsHandler { Logger.Info($"{nameof(OnPlayerActivatedGenerator)} triggered by {ev.Player.UserId}"); } - + public override void OnPlayerUnlockingGenerator(PlayerUnlockingGeneratorEventArgs ev) { Logger.Info($"{nameof(OnPlayerUnlockingGenerator)} triggered by {ev.Player.UserId}"); @@ -35,7 +35,7 @@ internal class MyCustomEventsHandler : CustomEventsHandler { Logger.Info($"{nameof(OnPlayerUnlockedGenerator)} triggered by {ev.Player.UserId}"); } - + public override void OnPlayerUnlockingWarheadButton(PlayerUnlockingWarheadButtonEventArgs ev) { Logger.Info($"{nameof(OnPlayerUnlockingWarheadButton)} triggered by {ev.Player.UserId}"); @@ -723,7 +723,8 @@ internal class MyCustomEventsHandler : CustomEventsHandler public override void OnPlayerStayingInHazard(PlayersStayingInHazardEventArgs ev) { - Logger.Info($"{nameof(OnPlayerStayingInHazard)} triggered by {string.Join(", ", ev.AffectedPlayers.Select(x => x.UserId))}"); + Logger.Info( + $"{nameof(OnPlayerStayingInHazard)} triggered by {string.Join(", ", ev.AffectedPlayers.Select(x => x.UserId))}"); } public override void OnPlayerLeavingHazard(PlayerLeavingHazardEventArgs ev) @@ -1310,7 +1311,7 @@ internal class MyCustomEventsHandler : CustomEventsHandler { Logger.Info($"{nameof(OnServerCassieQueuingScpTermination)} triggered"); } - + public override void OnServerCassieQueuedScpTermination(CassieQueuedScpTerminationEventArgs ev) { Logger.Info($"{nameof(OnServerCassieQueuedScpTermination)} triggered"); @@ -1375,8 +1376,8 @@ internal class MyCustomEventsHandler : CustomEventsHandler { Logger.Info($"{nameof(OnWarheadDetonated)} triggered by {ev.Player.UserId}"); } - - + + #region Excluded Events // The following events spam the console and are therefore excluded from this example: @@ -1397,5 +1398,4 @@ internal class MyCustomEventsHandler : CustomEventsHandler // } #endregion - } \ No newline at end of file diff --git a/LogEvents/LogEvents.csproj b/LogEvents/LogEvents.csproj index 3b316ca..0e44902 100644 --- a/LogEvents/LogEvents.csproj +++ b/LogEvents/LogEvents.csproj @@ -23,21 +23,9 @@ ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll - - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll - - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.Physics2DModule.dll - - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PhysicsModule.dll - - + diff --git a/RangeBan.Tests/RangeBan.Tests.csproj b/RangeBan.Tests/RangeBan.Tests.csproj index c641004..8598497 100644 --- a/RangeBan.Tests/RangeBan.Tests.csproj +++ b/RangeBan.Tests/RangeBan.Tests.csproj @@ -11,7 +11,7 @@ - + @@ -21,7 +21,7 @@ - + diff --git a/RangeBan/RangeBan.cs b/RangeBan/RangeBan.cs index 77418f5..a183b94 100644 --- a/RangeBan/RangeBan.cs +++ b/RangeBan/RangeBan.cs @@ -1,5 +1,4 @@ -using System.Runtime.Serialization; -using LabApi.Events.Arguments.PlayerEvents; +using LabApi.Events.Arguments.PlayerEvents; using LabApi.Events.Handlers; using LabApi.Features; using LabApi.Features.Console; @@ -7,9 +6,14 @@ using LabApi.Loader.Features.Plugins; namespace RangeBan; -public class RangeBan: Plugin +public class RangeBan : Plugin { - + public override string Name => "RangeBan"; + public override string Author => "Code002Lover"; + public override Version Version { get; } = new(1, 0, 0); + public override string Description => "Ban IP Ranges with ease"; + public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); + public override void Enable() { Logger.Debug("Loading..."); @@ -26,16 +30,11 @@ public class RangeBan: Plugin { Logger.Debug($"Ranges: {string.Join(" ; ", Config!.IpRanges)}"); if (!Config!.IpRanges.Any(configIpRange => IsInRange(configIpRange, ev.IpAddress))) return; - ev.RejectCustom("Your IP belongs to a banned player, please contact the server administrator for more information."); + ev.RejectCustom( + "Your IP belongs to a banned player, please contact the server administrator for more information."); Logger.Warn($"Player with IP {ev.IpAddress} got kicked. UserId: {ev.UserId}"); } - public override string Name => "RangeBan"; - public override string Author => "Code002Lover"; - public override Version Version { get; } = new(1, 0, 0); - public override string Description => "Ban IP Ranges with ease"; - public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); - public static bool IsInRange(string range, string ip) { @@ -46,29 +45,24 @@ public class RangeBan: Plugin if (!range.Contains("/")) { //We only handle direct IPs and CIDR - if (range.Split('.').Length != 4) - { - return false; - } - + if (range.Split('.').Length != 4) return false; + return ip == range; - }; - + } + + ; + var parts = range.Split('/'); if (parts.Length != 2 || !int.TryParse(parts[1], out var cidrBits)) return false; - if (cidrBits > 32) - { - return false; - } + if (cidrBits > 32) return false; var networkAddress = IPToUInt32(parts[0]); var mask = uint.MaxValue << (32 - cidrBits); var ipAddress = IPToUInt32(ip); return (ipAddress & mask) == (networkAddress & mask); - } private static uint IPToUInt32(string ipAddress) @@ -84,11 +78,12 @@ public class RangeBan: Plugin throw new ArgumentException("Invalid IP address segment"); result = (result << 8) | part; } + return result; } } public class RangeBanConfig { - public string[] IpRanges { get; set; } = {}; -} + public string[] IpRanges { get; set; } = { }; +} \ No newline at end of file diff --git a/RangeBan/RangeBan.csproj b/RangeBan/RangeBan.csproj index 56e256b..06779cb 100644 --- a/RangeBan/RangeBan.csproj +++ b/RangeBan/RangeBan.csproj @@ -20,18 +20,6 @@ - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll - - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll - - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll - - - - - + diff --git a/SCPTeamHint/SCPTeamHint.cs b/SCPTeamHint/SCPTeamHint.cs index a9ecaf8..f4a3375 100644 --- a/SCPTeamHint/SCPTeamHint.cs +++ b/SCPTeamHint/SCPTeamHint.cs @@ -12,144 +12,138 @@ using PlayerRoles.PlayableScps.Scp096; using PlayerRoles.PlayableScps.Scp3114; using Timer = System.Timers.Timer; -namespace SCPTeamHint +namespace SCPTeamHint; + +public class Plugin : LabApi.Loader.Features.Plugins.Plugin { - public class Plugin : LabApi.Loader.Features.Plugins.Plugin + private readonly object _hintsLock = new(); + private readonly Dictionary _spectatorHints = new(); + + private Timer _timer; + public override string Name => "SCPTeamHint"; + public override string Author => "HoherGeist, Code002Lover"; + public override Version Version { get; } = new(1, 0, 0); + public override string Description => "Displays information about your SCP Teammates"; + public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); + + public override void Enable() { - public override string Name => "SCPTeamHint"; - public override string Author => "HoherGeist, Code002Lover"; - public override Version Version { get; } = new(1, 0, 0); - public override string Description => "Displays information about your SCP Teammates"; - public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); - - private Timer _timer; - private readonly object _hintsLock = new(); - private readonly Dictionary _spectatorHints = new(); - - public override void Enable() + Logger.Debug("Apple juice"); + PlayerEvents.Joined += OnJoin; + PlayerEvents.Left += OnLeft; + + _timer = new Timer(1000); + _timer.Elapsed += (_, _) => UpdateHints(); + _timer.Start(); + } + + public override void Disable() + { + PlayerEvents.Joined -= OnJoin; + PlayerEvents.Left -= OnLeft; + _timer?.Stop(); + _timer?.Dispose(); + _timer = null; + } + + private void UpdateHints() + { + var hintTexts = new List(); + + lock (_hintsLock) { - Logger.Debug("Apple juice"); - PlayerEvents.Joined += OnJoin; - PlayerEvents.Left += OnLeft; - - _timer = new Timer(1000); - _timer.Elapsed += (_,_) => UpdateHints(); - _timer.Start(); - } - - public override void Disable() - { - PlayerEvents.Joined -= OnJoin; - PlayerEvents.Left -= OnLeft; - _timer?.Stop(); - _timer?.Dispose(); - _timer = null; - } - - private void UpdateHints() - { - var hintTexts = new List(); - - lock (_hintsLock) + foreach (var player in Player.ReadyList.Where(x => !x.IsHost && !x.IsDummy && x.IsSCP)) { + var text = + $" {player.RoleBase.RoleName} | {player.HumeShield} | {player.Health} | {player.Zone} "; - - foreach (var player in Player.ReadyList.Where(x => !x.IsHost && !x.IsDummy && x.IsSCP)) + switch (player.RoleBase) { - var text = - $" {player.RoleBase.RoleName} | {player.HumeShield} | {player.Health} | {player.Zone} "; + case Scp096Role scp: + text += "\n"; - switch (player.RoleBase) + scp.SubroutineModule.TryGetSubroutine(out Scp096TargetsTracker tracker); + + if (!tracker) break; + + text += $"Targets: {tracker.Targets.Count}"; + break; + case Scp3114Role scp3114: { - case Scp096Role scp: - text += "\n"; + text += "\n"; - scp.SubroutineModule.TryGetSubroutine(out Scp096TargetsTracker tracker); - - if(!tracker) break; + var stolenRole = scp3114.CurIdentity.StolenRole; - text += $"Targets: {tracker.Targets.Count}"; - break; - case Scp3114Role scp3114: - { - text += "\n"; - - var stolenRole = scp3114.CurIdentity.StolenRole; - - text += $" {stolenRole}"; - break; - } - case Scp079Role scp079: - text = - $" {player.RoleBase.RoleName} | {scp079.CurrentCamera.Room.Zone} "; - text += "\n"; - - scp079.SubroutineModule.TryGetSubroutine(out Scp079AuxManager auxManager); - scp079.SubroutineModule.TryGetSubroutine(out Scp079TierManager tierManager); - - if(!auxManager || !tierManager) break; - - text += - $" AUX: {auxManager.CurrentAuxFloored} / {auxManager.MaxAux} | Level {tierManager.AccessTierLevel}"; - break; + text += $" {stolenRole}"; + break; } + case Scp079Role scp079: + text = + $" {player.RoleBase.RoleName} | {scp079.CurrentCamera.Room.Zone} "; + text += "\n"; - hintTexts.Add(text); + scp079.SubroutineModule.TryGetSubroutine(out Scp079AuxManager auxManager); + scp079.SubroutineModule.TryGetSubroutine(out Scp079TierManager tierManager); + + if (!auxManager || !tierManager) break; + + text += + $" AUX: {auxManager.CurrentAuxFloored} / {auxManager.MaxAux} | Level {tierManager.AccessTierLevel}"; + break; } - var hintText = string.Join("\n", hintTexts); - - foreach (var player in Player.ReadyList.Where(x => !x.IsHost && !x.IsDummy)) - { - Logger.Debug($"Updating hint for {player.DisplayName}"); - UpdateHint(player, hintText); - } - } - } - - private void UpdateHint(Player player, string hintText) - { - if (!_spectatorHints.TryGetValue(player, out var hint)) - { - Logger.Debug($"No hint found for player {player.DisplayName}"); - return; + hintTexts.Add(text); } - Logger.Debug($"Player {player.Nickname} is on team {player.RoleBase.Team} | hide: {player.RoleBase.Team != Team.SCPs}"); - hint.Hide = player.RoleBase.Team != Team.SCPs; - if (!hint.Hide) + var hintText = string.Join("\n", hintTexts); + + foreach (var player in Player.ReadyList.Where(x => !x.IsHost && !x.IsDummy)) { - hint.Text = hintText; - } - } - - private void OnJoin(PlayerJoinedEventArgs ev) - { - if(ev.Player.IsDummy || ev.Player.IsHost) return; - - var hint = new Hint - { - Text = "", Alignment = HintAlignment.Left, YCoordinate = 100, Hide = true - }; - - var playerDisplay = PlayerDisplay.Get(ev.Player); - playerDisplay.AddHint(hint); - - lock (_hintsLock) - { - _spectatorHints[ev.Player] = hint; - } - - } - - private void OnLeft(PlayerLeftEventArgs ev) - { - if(ev.Player.IsDummy || ev.Player.IsHost) return; - - lock (_hintsLock) - { - _spectatorHints.Remove(ev.Player); + Logger.Debug($"Updating hint for {player.DisplayName}"); + UpdateHint(player, hintText); } } } + + private void UpdateHint(Player player, string hintText) + { + if (!_spectatorHints.TryGetValue(player, out var hint)) + { + Logger.Debug($"No hint found for player {player.DisplayName}"); + return; + } + + Logger.Debug( + $"Player {player.Nickname} is on team {player.RoleBase.Team} | hide: {player.RoleBase.Team != Team.SCPs}"); + hint.Hide = player.RoleBase.Team != Team.SCPs; + if (!hint.Hide) hint.Text = hintText; + } + + private void OnJoin(PlayerJoinedEventArgs ev) + { + if (ev.Player.IsDummy || ev.Player.IsHost) return; + + var hint = new Hint + { + Text = "", Alignment = HintAlignment.Left, YCoordinate = 100, Hide = true + }; + + var playerDisplay = PlayerDisplay.Get(ev.Player); + playerDisplay.AddHint(hint); + + lock (_hintsLock) + { + _spectatorHints[ev.Player] = hint; + } + } + + private void OnLeft(PlayerLeftEventArgs ev) + { + if (ev.Player.IsDummy || ev.Player.IsHost) return; + + lock (_hintsLock) + { + _spectatorHints.Remove(ev.Player); + } + } } \ No newline at end of file diff --git a/SCPTeamHint/SCPTeamHint.csproj b/SCPTeamHint/SCPTeamHint.csproj index 80a17c3..18fe8db 100644 --- a/SCPTeamHint/SCPTeamHint.csproj +++ b/SCPTeamHint/SCPTeamHint.csproj @@ -19,32 +19,27 @@ none - - + - - - ..\dependencies\0Harmony.dll - - - ..\dependencies\Assembly-CSharp.dll - - - ..\dependencies\HintServiceMeow-LabAPI.dll - - - ..\dependencies\Mirror.dll - - - ..\dependencies\Pooling.dll - - - ..\dependencies\UnityEngine.CoreModule.dll - + + ..\dependencies\Assembly-CSharp.dll + + + ..\dependencies\HintServiceMeow-LabAPI.dll + + + ..\dependencies\Mirror.dll + + + ..\dependencies\Pooling.dll + + + ..\dependencies\UnityEngine.CoreModule.dll + diff --git a/ScpSwap/ScpSwap.cs b/ScpSwap/ScpSwap.cs index 858c3a2..2f739b9 100644 --- a/ScpSwap/ScpSwap.cs +++ b/ScpSwap/ScpSwap.cs @@ -1,5 +1,4 @@ -using LabApi.Events.Handlers; -using LabApi.Features; +using LabApi.Features; using LabApi.Loader.Features.Plugins; namespace ScpSwap; @@ -11,13 +10,12 @@ public class ScpSwap : Plugin public override Version Version { get; } = new(1, 0, 0); public override string Description => "Swap SCPs."; public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); - + public override void Enable() { } public override void Disable() { - } } \ No newline at end of file diff --git a/ScpSwap/ScpSwap.csproj b/ScpSwap/ScpSwap.csproj index c0290e1..b397ccb 100644 --- a/ScpSwap/ScpSwap.csproj +++ b/ScpSwap/ScpSwap.csproj @@ -24,7 +24,7 @@ ..\dependencies\Assembly-CSharp.dll - ..\dependencies\CommandSystem.Core.dll + ..\dependencies\CommandSystem.Core.dll ..\dependencies\Mirror.dll @@ -38,6 +38,6 @@ - + diff --git a/ScpSwap/SwapCommand.cs b/ScpSwap/SwapCommand.cs index a8edf3f..9b0b47a 100644 --- a/ScpSwap/SwapCommand.cs +++ b/ScpSwap/SwapCommand.cs @@ -40,18 +40,19 @@ public class SwapCommand : ICommand "096", "106", "173", - "939", + "939" ]; var arg = arguments.First(); - + if (!validScp.Contains(arg)) { response = "Invalid SCP number."; return false; } - - if (Player.List.Where(x=>x.IsSCP).Select(x=>x.RoleBase).Any(playerRole => playerRole.RoleName == "SCP-" + arg)) + + if (Player.List.Where(x => x.IsSCP).Select(x => x.RoleBase) + .Any(playerRole => playerRole.RoleName == "SCP-" + arg)) { response = "Already exists"; return false; @@ -69,7 +70,7 @@ public class SwapCommand : ICommand }; player.SetRole(role); - + response = "Swapping..."; return true; @@ -77,5 +78,5 @@ public class SwapCommand : ICommand public string Command { get; } = "scpswap"; public string[] Aliases { get; } = ["ss"]; - public string Description { get; } = "Swaps SCPs"; + public string Description { get; } = "Swaps SCPs"; } \ No newline at end of file diff --git a/SensitiveGrenades/SensitiveGrenades.cs b/SensitiveGrenades/SensitiveGrenades.cs index d029a2c..d86b151 100644 --- a/SensitiveGrenades/SensitiveGrenades.cs +++ b/SensitiveGrenades/SensitiveGrenades.cs @@ -8,46 +8,45 @@ using UnityEngine; using Logger = LabApi.Features.Console.Logger; using TimedGrenadePickup = InventorySystem.Items.ThrowableProjectiles.TimedGrenadePickup; -namespace SensitiveGrenades +namespace SensitiveGrenades; + +public class SensitiveGrenades : Plugin { - public class SensitiveGrenades : Plugin + public override string Name => "SensitiveGrenades"; + public override string Author => "Code002Lover"; + public override Version Version { get; } = new(1, 0, 0); + public override string Description => "Shoot grenades to blow them up!"; + public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); + + public override void Enable() { - public override string Name => "SensitiveGrenades"; - public override string Author => "Code002Lover"; - public override Version Version { get; } = new(1, 0, 0); - public override string Description => "Shoot grenades to blow them up!"; - public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); + Logger.Debug("starting..."); - public override void Enable() + PlayerEvents.PlacedBulletHole += ShotWeapon; + } + + private static void ShotWeapon(PlayerPlacedBulletHoleEventArgs ev) + { + var direction = (ev.HitPosition - ev.RaycastStart).normalized; + var distance = Vector3.Distance(ev.RaycastStart, ev.HitPosition); + + var hits = Physics.RaycastAll(ev.RaycastStart, direction, distance); + foreach (var hit in hits) { - Logger.Debug("starting..."); + var itemPickup = hit.collider.GetComponent(); - PlayerEvents.PlacedBulletHole += ShotWeapon; - } + var grenade = itemPickup as TimedGrenadePickup; - private static void ShotWeapon(PlayerPlacedBulletHoleEventArgs ev) - { - var direction = (ev.HitPosition - ev.RaycastStart).normalized; - var distance = Vector3.Distance(ev.RaycastStart, ev.HitPosition); + if (!grenade) continue; - var hits = Physics.RaycastAll(ev.RaycastStart, direction, distance); - foreach (var hit in hits) - { - var itemPickup = hit.collider.GetComponent(); - - var grenade = itemPickup as TimedGrenadePickup; - - if (!grenade) continue; - - itemPickup.DestroySelf(); - TimedGrenadeProjectile.SpawnActive(itemPickup.Position, itemPickup.Info.ItemId, ev.Player); - break; - } - } - - public override void Disable() - { - Logger.Debug("unloading..."); + itemPickup.DestroySelf(); + TimedGrenadeProjectile.SpawnActive(itemPickup.Position, itemPickup.Info.ItemId, ev.Player); + break; } } + + public override void Disable() + { + Logger.Debug("unloading..."); + } } \ No newline at end of file diff --git a/SensitiveGrenades/SensitiveGrenades.csproj b/SensitiveGrenades/SensitiveGrenades.csproj index 2d5f9af..e41835d 100644 --- a/SensitiveGrenades/SensitiveGrenades.csproj +++ b/SensitiveGrenades/SensitiveGrenades.csproj @@ -30,15 +30,12 @@ ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.Physics2DModule.dll - - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PhysicsModule.dll + ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PhysicsModule.dll - + diff --git a/ServerHints/ServerHints.cs b/ServerHints/ServerHints.cs index b29fec4..a1c6f65 100644 --- a/ServerHints/ServerHints.cs +++ b/ServerHints/ServerHints.cs @@ -6,7 +6,7 @@ using MEC; namespace ServerHints; -public class ServerHints: Plugin +public class ServerHints : Plugin { public override string Name => "ServerHints"; public override string Author => "Code002Lover"; @@ -25,7 +25,7 @@ public class ServerHints: Plugin "Man kann Türen aufschießen", "Wenn man Granaten anschießt, explodieren sie sofort." ]; - + public override void Enable() { ServerEvents.RoundStarted += OnRoundStarted; @@ -36,16 +36,14 @@ public class ServerHints: Plugin { ServerEvents.RoundStarted -= OnRoundStarted; } + private void OnRoundStarted() { var random = new Random(); var hint = Hints[random.Next(Hints.Length)]; Timing.CallDelayed(1, () => { - foreach (var player in Player.ReadyList) - { - player.SendBroadcast($"{hint}", 3); - } + foreach (var player in Player.ReadyList) player.SendBroadcast($"{hint}", 3); }); } } \ No newline at end of file diff --git a/ServerHints/ServerHints.csproj b/ServerHints/ServerHints.csproj index de77391..0f3714e 100644 --- a/ServerHints/ServerHints.csproj +++ b/ServerHints/ServerHints.csproj @@ -26,21 +26,15 @@ ..\dependencies\Assembly-CSharp-firstpass.dll - - ..\dependencies\Mirror.dll - ..\dependencies\NorthwoodLib.dll - - ..\dependencies\Pooling.dll - ..\dependencies\UnityEngine.CoreModule.dll - + diff --git a/VisibleSpectators/VisibleSpectators.cs b/VisibleSpectators/VisibleSpectators.cs index 8f7b7e0..5a77a8e 100644 --- a/VisibleSpectators/VisibleSpectators.cs +++ b/VisibleSpectators/VisibleSpectators.cs @@ -1,5 +1,4 @@ using HintServiceMeow.Core.Enum; -using HintServiceMeow.Core.Models.HintContent; using HintServiceMeow.Core.Models.Hints; using HintServiceMeow.Core.Utilities; using LabApi.Events.Arguments.PlayerEvents; @@ -9,195 +8,187 @@ using LabApi.Features.Console; using LabApi.Features.Wrappers; using LabApi.Loader.Features.Plugins; using PlayerRoles; -using PlayerRoles.Spectating; using Timer = System.Timers.Timer; -namespace VisibleSpectators +namespace VisibleSpectators; + +public class Plugin : Plugin { - public class Plugin : Plugin + private static Plugin _singleton; + + private static readonly Dictionary GetColorMap = new() { - public override string Name => "VisibleSpectators"; - public override string Author => "Code002Lover"; - public override Version Version { get; } = new(1, 0, 0); - public override string Description => "See your spectators"; - public override Version RequiredApiVersion { get; } = new (LabApiProperties.CompiledVersion); + { "DEFAULT", "FFFFFF" }, + { "PUMPKIN", "EE7600" }, + { "ARMY_GREEN", "4B5320" }, + { "MINT", "98FB98" }, + { "NICKEL", "727472" }, + { "CARMINE", "960018" }, + { "EMERALD", "50C878" }, + { "GREEN", "228B22" }, + { "LIME", "BFFF00" }, + { "POLICE_BLUE", "002DB3" }, + { "ORANGE", "FF9966" }, + { "SILVER_BLUE", "666699" }, + { "BLUE_GREEN", "4DFFB8" }, + { "MAGENTA", "FF0090" }, + { "YELLOW", "FAFF86" }, + { "TOMATO", "FF6448" }, + { "DEEP_PINK", "FF1493" }, + { "AQUA", "00FFFF" }, + { "CYAN", "00B7EB" }, + { "CRIMSON", "DC143C" }, + { "LIGHT_GREEN", "32CD32" }, + { "SILVER", "A0A0A0" }, + { "BROWN", "944710" }, + { "RED", "C50000" }, + { "PINK", "FF96DE" }, + { "LIGHT_RED", "FD8272" }, + { "PURPLE", "8137CE" }, + { "BLUE", "005EBC" }, + { "TEAL", "008080" }, + { "GOLD", "EFC01A" } + }; - public int YCoordinate { get; set; } = 100; + private readonly Dictionary _spectatorHints = new(); + private Timer _timer; + public override string Name => "VisibleSpectators"; + public override string Author => "Code002Lover"; + public override Version Version { get; } = new(1, 0, 0); + public override string Description => "See your spectators"; + public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); - private static Plugin _singleton; - private Timer _timer; - private readonly Dictionary _spectatorHints = new(); + public int YCoordinate { get; set; } = 100; - public override void Enable() + public override void Enable() + { + Logger.Debug("starting..."); + _singleton = this; + + PlayerEvents.ChangedSpectator += OnSpectate; + PlayerEvents.Joined += OnJoin; + + _timer = new Timer(1000); + _timer.Elapsed += (_, _) => UpdateSpectators(); + _timer.Start(); + } + + public override void Disable() + { + Logger.Debug("unloading..."); + + _timer.Stop(); + _timer.Dispose(); + _timer = null; + + PlayerEvents.Joined -= OnJoin; + PlayerEvents.ChangedSpectator -= OnSpectate; + + _singleton = null; + } + + private void UpdateSpectators() + { + foreach (var player in GetPlayers()) UpdateSpectators(player); + } + + private void AddPlayerHint(Player player) + { + var hint = new Hint { - Logger.Debug("starting..."); - _singleton = this; - - PlayerEvents.ChangedSpectator += OnSpectate; - PlayerEvents.Joined += OnJoin; - - _timer = new Timer(1000); - _timer.Elapsed += (_, _) => UpdateSpectators(); - _timer.Start(); - } - - public override void Disable() - { - Logger.Debug("unloading..."); - - _timer.Stop(); - _timer.Dispose(); - _timer = null; - - PlayerEvents.Joined -= OnJoin; - PlayerEvents.ChangedSpectator -= OnSpectate; - - _singleton = null; - } - - private void UpdateSpectators() - { - foreach (var player in GetPlayers()) - { - UpdateSpectators(player); - } - } - - private void AddPlayerHint(Player player) - { - var hint = new Hint - { - Text = $"{Config!.HeaderMessage}\n{Config!.NoSpectatorsMessage}", - Alignment = HintAlignment.Right, - YCoordinate = YCoordinate, - Hide = true - }; - - var playerDisplay = PlayerDisplay.Get(player); - playerDisplay.AddHint(hint); - - _spectatorHints[player] = hint; - } - - private static readonly Dictionary GetColorMap = new() - { - { "DEFAULT", "FFFFFF" }, - { "PUMPKIN", "EE7600" }, - { "ARMY_GREEN", "4B5320" }, - { "MINT", "98FB98" }, - { "NICKEL", "727472" }, - { "CARMINE", "960018" }, - { "EMERALD", "50C878" }, - { "GREEN", "228B22" }, - { "LIME", "BFFF00" }, - { "POLICE_BLUE", "002DB3" }, - { "ORANGE", "FF9966" }, - { "SILVER_BLUE", "666699" }, - { "BLUE_GREEN", "4DFFB8" }, - { "MAGENTA", "FF0090" }, - { "YELLOW", "FAFF86" }, - { "TOMATO", "FF6448" }, - { "DEEP_PINK", "FF1493" }, - { "AQUA", "00FFFF" }, - { "CYAN", "00B7EB" }, - { "CRIMSON", "DC143C" }, - { "LIGHT_GREEN", "32CD32" }, - { "SILVER", "A0A0A0" }, - { "BROWN", "944710" }, - { "RED", "C50000" }, - { "PINK", "FF96DE" }, - { "LIGHT_RED", "FD8272" }, - { "PURPLE", "8137CE" }, - { "BLUE", "005EBC" }, - { "TEAL", "008080" }, - { "GOLD", "EFC01A" } + Text = $"{Config!.HeaderMessage}\n{Config!.NoSpectatorsMessage}", + Alignment = HintAlignment.Right, + YCoordinate = YCoordinate, + Hide = true }; - private static string PlayerToDisplay(Player player) - { - if (player == null) return ""; - if (!player.IsReady) return ""; - - // Default color if GroupColor is null or not found in the map - const string defaultColor = "FFFFFF"; - - try - { - var groupColor = player.GroupColor; - if (string.IsNullOrEmpty(groupColor)) - return $"{player.DisplayName}"; - - return GetColorMap.TryGetValue(groupColor.ToUpper(), out var color) ? $"{player.DisplayName}" : $"{player.DisplayName}"; - } - catch - { - return $"{player.DisplayName}"; - } - } + var playerDisplay = PlayerDisplay.Get(player); + playerDisplay.AddHint(hint); - private static bool IsNotOverwatch(Player player) - { - return player != null && player.Role != RoleTypeId.Overwatch; - } - - private void UpdateSpectators(Player player) - { - // Safety check - if player doesn't have a hint, create one - if (!_spectatorHints.ContainsKey(player)) - { - AddPlayerHint(player); - } - - var spectators = Config!.NoSpectatorsMessage; - - try - { - spectators = string.Join("\n",player.CurrentSpectators.Where(IsNotOverwatch).Select(PlayerToDisplay)); - if (player.Role == RoleTypeId.Spectator) - spectators = player.CurrentlySpectating == null - ? Config!.NoSpectatorsMessage - : string.Join("\n", - player.CurrentlySpectating?.CurrentSpectators.Where(IsNotOverwatch) - .Select(PlayerToDisplay) ?? Array.Empty()); - } catch (Exception e) - { - Logger.Error(e); - } - - if (spectators.Length < 2) - { - spectators = Config!.NoSpectatorsMessage; - } - - - _spectatorHints[player].Text = $"{Config!.HeaderMessage}\n{spectators}"; - - _spectatorHints[player].Hide = player.Role is RoleTypeId.Destroyed or RoleTypeId.None; - - _spectatorHints[player].YCoordinate = YCoordinate + player.CurrentSpectators.Count * 10; - } - - private static Player[] GetPlayers() - { - return Player.ReadyList.Where(IsNotOverwatch).ToArray(); - } - - private static void OnSpectate(PlayerChangedSpectatorEventArgs ev) - { - _singleton.UpdateSpectators(ev.OldTarget); - _singleton.UpdateSpectators(ev.NewTarget); - _singleton.UpdateSpectators(ev.Player); - } - - private void OnJoin(PlayerJoinedEventArgs ev) - { - AddPlayerHint(ev.Player); - } + _spectatorHints[player] = hint; } - public class SpectatorConfig + private static string PlayerToDisplay(Player player) { - public string HeaderMessage { get; set; } = "Spectators:"; - public string NoSpectatorsMessage { get; set; } = "No spectators"; + if (player == null) return ""; + if (!player.IsReady) return ""; + + // Default color if GroupColor is null or not found in the map + const string defaultColor = "FFFFFF"; + + try + { + var groupColor = player.GroupColor; + if (string.IsNullOrEmpty(groupColor)) + return $"{player.DisplayName}"; + + return GetColorMap.TryGetValue(groupColor.ToUpper(), out var color) + ? $"{player.DisplayName}" + : $"{player.DisplayName}"; + } + catch + { + return $"{player.DisplayName}"; + } } + + private static bool IsNotOverwatch(Player player) + { + return player != null && player.Role != RoleTypeId.Overwatch; + } + + private void UpdateSpectators(Player player) + { + // Safety check - if player doesn't have a hint, create one + if (!_spectatorHints.ContainsKey(player)) AddPlayerHint(player); + + var spectators = Config!.NoSpectatorsMessage; + + try + { + spectators = string.Join("\n", player.CurrentSpectators.Where(IsNotOverwatch).Select(PlayerToDisplay)); + if (player.Role == RoleTypeId.Spectator) + spectators = player.CurrentlySpectating == null + ? Config!.NoSpectatorsMessage + : string.Join("\n", + player.CurrentlySpectating?.CurrentSpectators.Where(IsNotOverwatch) + .Select(PlayerToDisplay) ?? Array.Empty()); + } + catch (Exception e) + { + Logger.Error(e); + } + + if (spectators.Length < 2) spectators = Config!.NoSpectatorsMessage; + + + _spectatorHints[player].Text = $"{Config!.HeaderMessage}\n{spectators}"; + + _spectatorHints[player].Hide = player.Role is RoleTypeId.Destroyed or RoleTypeId.None; + + _spectatorHints[player].YCoordinate = YCoordinate + player.CurrentSpectators.Count * 10; + } + + private static Player[] GetPlayers() + { + return Player.ReadyList.Where(IsNotOverwatch).ToArray(); + } + + private static void OnSpectate(PlayerChangedSpectatorEventArgs ev) + { + _singleton.UpdateSpectators(ev.OldTarget); + _singleton.UpdateSpectators(ev.NewTarget); + _singleton.UpdateSpectators(ev.Player); + } + + private void OnJoin(PlayerJoinedEventArgs ev) + { + AddPlayerHint(ev.Player); + } +} + +public class SpectatorConfig +{ + public string HeaderMessage { get; set; } = "Spectators:"; + public string NoSpectatorsMessage { get; set; } = "No spectators"; } \ No newline at end of file diff --git a/VisibleSpectators/VisibleSpectators.csproj b/VisibleSpectators/VisibleSpectators.csproj index 00a537d..8b311cd 100644 --- a/VisibleSpectators/VisibleSpectators.csproj +++ b/VisibleSpectators/VisibleSpectators.csproj @@ -20,14 +20,11 @@ - - ..\dependencies\0Harmony.dll - ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll - ..\dependencies\HintServiceMeow-LabAPI.dll + ..\dependencies\HintServiceMeow-LabAPI.dll ..\..\.local\share\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll @@ -38,6 +35,6 @@ - + diff --git a/WarheadEvents/WarheadEvents.cs b/WarheadEvents/WarheadEvents.cs index 991fc8b..e72421e 100644 --- a/WarheadEvents/WarheadEvents.cs +++ b/WarheadEvents/WarheadEvents.cs @@ -18,15 +18,14 @@ public class WarheadEvents : Plugin { LabApi.Events.Handlers.WarheadEvents.Detonated += OnExplode; } - + public override void Disable() { - } private static void OnExplode(WarheadDetonatedEventArgs ev) { - var door = Door.Get(DoorVariant.AllDoors.First(x=>x.DoorName.ToUpper() == "ESCAPE_FINAL")); + var door = Door.Get(DoorVariant.AllDoors.First(x => x.DoorName.ToUpper() == "ESCAPE_FINAL")); door.IsOpened = true; } diff --git a/WarheadEvents/WarheadEvents.csproj b/WarheadEvents/WarheadEvents.csproj index 085e80b..a4ef62c 100644 --- a/WarheadEvents/WarheadEvents.csproj +++ b/WarheadEvents/WarheadEvents.csproj @@ -23,21 +23,15 @@ ..\dependencies\Assembly-CSharp.dll - - ..\dependencies\Assembly-CSharp-firstpass.dll - ..\dependencies\Mirror.dll - - ..\dependencies\Pooling.dll - ..\dependencies\UnityEngine.CoreModule.dll - +