From 1eaa3d0e7657fe2c8e2f89b7fa9283234c5742ba Mon Sep 17 00:00:00 2001 From: Noobest1001 Date: Sat, 11 Jul 2026 19:44:08 -0400 Subject: [PATCH 1/9] Removed AA.cs, Added a cooldown to Coin, Started the process of adding an option to nerf Explosives, and more --- Config.cs | 5 ++- EventHandler.cs | 17 +++++++ ExtendedItems.csproj | 3 +- Items/AdminAbuse.cs | 80 --------------------------------- Items/Coin.cs | 6 +++ Items/GLShot.cs | 21 +++++++++ Items/GrenadeLauncher.cs | 96 ++++++++++++++++++++++------------------ Items/Plastic.cs | 4 +- Items/Scp1499.cs | 12 ++--- Items/Sniper.cs | 25 +++++++---- Plugin.cs | 6 ++- Utils.cs | 68 +++++++++++++++++++--------- packages.lock.json | 6 +-- 13 files changed, 180 insertions(+), 169 deletions(-) create mode 100644 EventHandler.cs delete mode 100644 Items/AdminAbuse.cs create mode 100644 Items/GLShot.cs diff --git a/Config.cs b/Config.cs index 2853293..663a23b 100644 --- a/Config.cs +++ b/Config.cs @@ -1,6 +1,7 @@ using System.ComponentModel; using Exiled.API.Interfaces; using ExtendedItems.Items; +using InventorySystem.Items.Firearms.Attachments; namespace ExtendedItems { @@ -15,7 +16,7 @@ public class Config : IConfig public bool EffectiveOnTutorials { get; set; } = false; [Description("Weather the Tranq is still useable when Nuke is on")] - public bool NukeTranq { get; set; } = true; + public AttachmentName[] ForcedSniperAttch { get; set; } = [AttachmentName.MuzzleBrake, AttachmentName.RecoilReducingStock, AttachmentName.RifleBody]; [Description("The Distance from Larry a player can be before they can no longer use SCP-1499")] public float LarryDistance { get; set; } = 10f; @@ -57,7 +58,7 @@ public class Config : IConfig public Sniper Sniper { get; set; } = new(); public Tranquilizer Tranquilizer { get; set; } = new(); public Plastic Plastic { get; set; } = new(); - public AdminAbuse AdminAbuse { get; set; } = new(); + public GLShot GLShot { get; set; } = new(); #endregion } diff --git a/EventHandler.cs b/EventHandler.cs new file mode 100644 index 0000000..8afd176 --- /dev/null +++ b/EventHandler.cs @@ -0,0 +1,17 @@ +using Exiled.API.Features; +using Exiled.Events.EventArgs.Map; + +namespace ExtendedItems; + +public class EventHandler (Plugin plugin) +{ + protected void OnGrenadeExploding(ExplodingGrenadeEventArgs ev) + { + foreach (Player player in ev.TargetsToAffect.ToArray()) + { + Utils.Grenade_Damage(ev.Projectile, player); + } + } + + +} \ No newline at end of file diff --git a/ExtendedItems.csproj b/ExtendedItems.csproj index a9168a1..958f602 100644 --- a/ExtendedItems.csproj +++ b/ExtendedItems.csproj @@ -5,6 +5,7 @@ enable enable preview + Library true @@ -13,7 +14,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Items/AdminAbuse.cs b/Items/AdminAbuse.cs deleted file mode 100644 index 697e741..0000000 --- a/Items/AdminAbuse.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System.ComponentModel; -using Exiled.API.Enums; -using Exiled.API.Features; -using Exiled.API.Features.Attributes; -using Exiled.API.Features.Components; -using Exiled.API.Features.Spawn; -using Exiled.CustomItems.API.Features; -using Exiled.Events.EventArgs.Item; -using Exiled.Events.EventArgs.Player; -using InventorySystem.Items.Firearms.Attachments; -using ItemEvents = Exiled.Events.Handlers.Item; - -namespace ExtendedItems.Items -{ - [CustomItem(ItemType.GunRevolver)] - public class AdminAbuse : CustomWeapon - { - [Description("thanks to hayden for the idea on buckshot or else it wouldnt have worked")] - public override uint Id { get; set; } = 20; - - public override ItemType Type { get; set; } = ItemType.GunRevolver; - public override string Name { get; set; } = "Regert (dont use this because it crashes the server)"; - public override string Description { get; set; } = "you asked for it!"; - public override float Weight { get; set; } = 1f; - public override float Damage { get; set; } = 0; - - public override SpawnProperties? SpawnProperties { get; set; } = new() - { - Limit = 0, - }; - - public override AttachmentName[] Attachments { get; set; } = - [ - AttachmentName.CylinderMag7, - AttachmentName.ExtendedBarrel, - AttachmentName.StandardStock, - ]; - - // I personally like having all the OnEvent before the SubscribeEvents but in the future you can do what you like - protected override void OnShot(ShotEventArgs ev) - { - var throwable = ev.Player.ThrowGrenade(ProjectileType.FragGrenade); - // defining ammo by itself will not change the ammo count - // so you need to call ev.Firearm.MagazineAmmo :) - - // ev.Firearm.MagazineAmmo = E.Subtract((ushort)ev.Firearm.MagazineAmmo); - - throwable.Projectile.GameObject.AddComponent() - .Init(ev.Player.GameObject, throwable.Projectile.Base); - - base.OnShot(ev); - } - - private void OnChangingAttachments(ChangingAttachmentsEventArgs ev) - { - if (!Check(ev.Item)) return; - - Log.Debug($"Player {ev.Player.Nickname} tried to change attachments for {Name}"); - ev.IsAllowed = false; - ev.Player.ShowHint("You are not allowed to change the attachment for this weapon."); - - base.OnChangingAttachment(ev); - } - - [Description("can be removed if not necesarry")] - protected override void SubscribeEvents() - { - ItemEvents.ChangingAttachments += OnChangingAttachments; - - base.SubscribeEvents(); - } - - protected override void UnsubscribeEvents() - { - ItemEvents.ChangingAttachments -= OnChangingAttachments; - - base.UnsubscribeEvents(); - } - } -} \ No newline at end of file diff --git a/Items/Coin.cs b/Items/Coin.cs index aa9ac69..2e52ea1 100644 --- a/Items/Coin.cs +++ b/Items/Coin.cs @@ -120,6 +120,12 @@ private void OnFlippingCoin(FlippingCoinEventArgs ev) } } }); + ev.IsAllowed = false; + + Timing.CallDelayed(5f, () => + { + ev.IsAllowed = true; + }); } private static void OnRoleChanging(ChangingRoleEventArgs ev) diff --git a/Items/GLShot.cs b/Items/GLShot.cs new file mode 100644 index 0000000..a5e8e12 --- /dev/null +++ b/Items/GLShot.cs @@ -0,0 +1,21 @@ +using Exiled.API.Features.Attributes; +using Exiled.API.Features.Spawn; +using Exiled.CustomItems.API.Features; + +namespace ExtendedItems.Items; + +[CustomItem(ItemType.GrenadeHE)] +public class GLShot : CustomGrenade +{ + public override uint Id { get; set; } = 10; + public override string Name { get; set; } = "GLShot"; + public override string Description { get; set; } = "You shouldn't have this"; + public override float Weight { get; set; } = 100; + + public override SpawnProperties? SpawnProperties { get; set; } = new() + { + Limit = 0, + }; + public override bool ExplodeOnCollision { get; set; } = false; + public override float FuseTime { get; set; } = 1000; +} \ No newline at end of file diff --git a/Items/GrenadeLauncher.cs b/Items/GrenadeLauncher.cs index e5f26a8..caae537 100644 --- a/Items/GrenadeLauncher.cs +++ b/Items/GrenadeLauncher.cs @@ -1,15 +1,16 @@ using Exiled.API.Enums; -using Exiled.API.Features; using Exiled.API.Features.Attributes; using Exiled.API.Features.Components; +using Exiled.API.Features.Pickups; using Exiled.API.Features.Spawn; using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Item; using Exiled.Events.EventArgs.Player; using InventorySystem.Items.Firearms.Attachments; +using InventorySystem.Items.ThrowableProjectiles; +using MEC; +using UnityEngine; using YamlDotNet.Serialization; -using E = ExtendedItems.Utils; -using ItemEvents = Exiled.Events.Handlers.Item; namespace ExtendedItems.Items { @@ -25,6 +26,9 @@ public class GrenadeLauncher : CustomWeapon public override float Weight { get; set; } = 10f; public override float Damage { get; set; } = 0f; public override byte ClipSize { get; set; } = 1; + + private static bool _grenadeLaunchCoroutine = false; + [YamlIgnore] public override AttachmentName[] Attachments { get; set; } = @@ -46,66 +50,72 @@ public class GrenadeLauncher : CustomWeapon protected override void OnShooting(ShootingEventArgs ev) { - var throwable = ev.Player.ThrowGrenade(ProjectileType.FragGrenade); - var ammo = E.Subtract((ushort)ev.Firearm.MagazineAmmo); + bool? hasSpawn = TrySpawn(10, ev.Player.Position + new Vector3(0f, .25f, 0f), out var pickupBase); - throwable.Projectile.GameObject.AddComponent() - .Init(ev.Player.GameObject, throwable.Projectile.Base); - - ev.Firearm.MagazineAmmo = 0; - ev.Firearm.BarrelAmmo = 0; - - ev.Player.AddAmmo(AmmoType.Nato762, ammo); - - base.OnShooting(ev); - } - - protected override void OnReloading(ReloadingWeaponEventArgs ev) - { - if (!Check(ev.Item)) return; - if (Plugin.Instance is null) return; - - if (ev.Player.GetAmmo(AmmoType.Nato762) == 0) + if(hasSpawn is true) { - ev.IsAllowed = false; - ev.Player.ShowHint("You don't have any 7.62mm ammo to reload the grenade launcher!", 5); - } - else if (ev.Player.GetAmmo(AmmoType.Nato762) < Plugin.Instance.Config.GrenadeLauncherAmmoUsage) - { - ev.IsAllowed = false; - ev.Player.ShowHint($"You need more than {Plugin.Instance.Config.GrenadeLauncherAmmoUsage} 7.62 to reload the grenade launcher!", 5); + if (!_grenadeLaunchCoroutine) + { + ThrownProjectile thrownProjectile = pickupBase!.GameObject.AddComponent(); + pickupBase!.GameObject.AddComponent().Init(ev.Player.GameObject, thrownProjectile ); + pickupBase.Rigidbody.linearVelocity = new Vector3(3f, .05f); + if (!_grenadeLaunchCoroutine) + { + _grenadeLaunchCoroutine = true; + Timing.RunCoroutine(GrenadeLaunch(pickupBase)); + } + } + } else { - var ammo = ev.Player.GetAmmo(AmmoType.Nato762); - ammo -= Plugin.Instance.Config.GrenadeLauncherAmmoUsage; - ev.Player.SetAmmo(AmmoType.Nato762, ammo) ; + ev.Player.ShowHint("Cant shoot yet", 5f); } - base.OnReloading(ev); + + base.OnShooting(ev); } protected override void SubscribeEvents() { - ItemEvents.ChangingAttachments += OnChangingAttachments; - base.SubscribeEvents(); } protected override void UnsubscribeEvents() { - ItemEvents.ChangingAttachments -= OnChangingAttachments; - base.UnsubscribeEvents(); } - private void OnChangingAttachments(ChangingAttachmentsEventArgs ev) + protected override void OnChangingAttachment(ChangingAttachmentsEventArgs ev) { - if (!Check(ev.Item)) return; - Log.Debug($"Player {ev.Player.Nickname} tried to change attachments for {Name}"); - ev.Player.Broadcast(5, "You can't change the attachments on this weapon"); - ev.IsAllowed = false; - + if (ev.NewAttachmentIdentifiers.Any(attachment => attachment.Name == AttachmentName.ShortBarrel)) + { + ev.IsAllowed = true; + } + else + { + ev.IsAllowed = false; + ev.Player.ShowHint("You need a Short Barrel because I said so :) -Noobest1001", 5f); + } base.OnChangingAttachment(ev); } + + private static IEnumerator GrenadeLaunch(Pickup pickup) + { + if (pickup is not GrenadePickup) + { + yield break; + } + while (true) + { + yield return Timing.WaitForSeconds(.5f); + + if (pickup.Rigidbody.linearVelocity.magnitude < .5f) + { + Utils.Explode(pickup, pickup.PreviousOwner); + _grenadeLaunchCoroutine = false; + yield break; + } + } + } } } \ No newline at end of file diff --git a/Items/Plastic.cs b/Items/Plastic.cs index 96c0519..5805360 100644 --- a/Items/Plastic.cs +++ b/Items/Plastic.cs @@ -49,7 +49,7 @@ public enum C4RemoveMethod public override SpawnProperties? SpawnProperties { get; set; } = new() { - Limit = 2, + Limit = 1, RoomSpawnPoints = [ new RoomSpawnPoint { Room = RoomType.HczNuke, Chance = 50, }, @@ -84,7 +84,7 @@ public void Handler(Pickup? charge, C4RemoveMethod method = C4RemoveMethod.Drop, case C4RemoveMethod.Detonate: { var grenade = (ExplosiveGrenade) Item.Create(Type); - grenade.FuseTime = 0.1f; + grenade.FuseTime = 1f; grenade.SpawnActive(charge.Position, detonator); break; } diff --git a/Items/Scp1499.cs b/Items/Scp1499.cs index e9ec07d..ded939a 100644 --- a/Items/Scp1499.cs +++ b/Items/Scp1499.cs @@ -26,17 +26,17 @@ public class Scp1499 : CustomItem public override float Weight { get; set; } = 5f; [Description("Room to teleport player to after using SCP-1499.")] - private RoomType TeleportRoom = RoomType.Hcz106; + private readonly RoomType _teleportRoom = RoomType.Hcz106; [Description("Time for player to wander in seconds.")] - private float Duration = 15f; + private readonly float _duration = 15f; public override SpawnProperties? SpawnProperties { get; set; } = new() { Limit = 1, LockerSpawnPoints = [ - new LockerSpawnPoint { Type = LockerType.Scp268Pedestal, Chance = 100, Zone = ZoneType.LightContainment, }, + new LockerSpawnPoint { Type = LockerType.Scp268Pedestal, Chance = 100, Zone = ZoneType.HeavyContainment, }, ], }; @@ -57,12 +57,12 @@ private void OnUsedItem(UsedItemEventArgs ev) if (!Check(ev.Item)) return; ev.Player.DisableEffect(EffectType.Invisible); - ev.Player.EnableEffect(EffectType.DamageReduction, byte.MaxValue, Duration); + ev.Player.EnableEffect(EffectType.DamageReduction, byte.MaxValue, _duration); - var handle = Timing.CallDelayed(Duration, () => TeleportPrevious(ev.Player.NetId)); + var handle = Timing.CallDelayed(_duration, () => TeleportPrevious(ev.Player.NetId)); _lastPositions.Add(ev.Player.NetId, (ev.Player.Position, ev.Player.Lift, handle)); - ev.Player.Teleport(Utils.GetGlobalCords(TeleportRoom, _relativePosition)); + ev.Player.Teleport(Utils.GetGlobalCords(_teleportRoom, _relativePosition)); } private void TeleportPrevious(uint netId) diff --git a/Items/Sniper.cs b/Items/Sniper.cs index 26aa92c..d35e6a4 100644 --- a/Items/Sniper.cs +++ b/Items/Sniper.cs @@ -1,9 +1,9 @@ using Exiled.API.Enums; -using Exiled.API.Features; using Exiled.API.Features.Attributes; using Exiled.API.Features.Spawn; using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Item; +using Exiled.Events.EventArgs.Player; using InventorySystem.Items.Firearms.Attachments; using YamlDotNet.Serialization; using ItemEvents = Exiled.Events.Handlers.Item; @@ -33,9 +33,9 @@ public class Sniper : CustomWeapon public override SpawnProperties? SpawnProperties { get; set; } = new() { Limit = 1, - RoomSpawnPoints = + LockerSpawnPoints = [ - new RoomSpawnPoint { Room = RoomType.HczArmory, Chance = 100, }, + new LockerSpawnPoint {Type = LockerType.RifleRack, Chance = 100, UseChamber = true, Zone = ZoneType.HeavyContainment}, ], }; @@ -56,12 +56,19 @@ protected override void UnsubscribeEvents() private void OnChangingAttachments(ChangingAttachmentsEventArgs ev) { if (!Check(ev.Item)) return; - - Log.Debug($"Player {ev.Player.Nickname} tried to change attachments for {Name}"); - ev.IsAllowed = false; - ev.Player.ShowHint("You are not allowed to change the attachment for this weapon."); - base.OnChangingAttachment(ev); - + + // ReSharper disable once InconsistentNaming + AttachmentName[] Monica = Plugin.Instance!.Config.ForcedSniperAttch; + AttachmentName[] subMonica = ev.NewAttachmentIdentifiers.Select(user => user.Name).ToArray(); + ev.IsAllowed = subMonica.All(item => Monica.Contains(item)); + } + + protected override void OnReloading(ReloadingWeaponEventArgs ev) + { + if (Check(ev.Item)) + { + ev.IsAllowed = true; + } } } } \ No newline at end of file diff --git a/Plugin.cs b/Plugin.cs index 05b49e3..7eff456 100644 --- a/Plugin.cs +++ b/Plugin.cs @@ -11,16 +11,19 @@ public class Plugin : Plugin { public static Plugin? Instance; + public static EventHandler? _event; + private List? _settings; public override string Prefix => "Extended Items"; public override string Name => "Extended Items"; public override string Author => "Noobest1001"; - public override Version Version => new(3, 3, 0, 0); + public override Version Version => new(4, 0, 0, 0); public override Version RequiredExiledVersion => new(9, 7, 0); public override void OnEnabled() { Instance = this; + _event = new EventHandler(Instance); Ssss.Register(); @@ -46,6 +49,7 @@ public override void OnDisabled() Ssss.Unregister(); _settings = null; + _event = null; Instance = null; base.OnDisabled(); diff --git a/Utils.cs b/Utils.cs index adecafa..d7d9e1d 100644 --- a/Utils.cs +++ b/Utils.cs @@ -1,10 +1,13 @@ using System.ComponentModel; using Exiled.API.Enums; -using Exiled.API.Features; using Exiled.API.Features.Items; +using Exiled.API.Features.Pickups.Projectiles; using PlayerRoles; using UnityEngine; using EP = Exiled.API.Features.Player; +using Item = Exiled.API.Features.Items.Item; +using Pickup = Exiled.API.Features.Pickups.Pickup; +using Room = Exiled.API.Features.Room; namespace ExtendedItems { @@ -34,27 +37,7 @@ public static Vector3 GetGlobalCords(RoomType roomType, Vector3 localPos) _ => Vector3.zero, }; } - - /// - /// Removes 1 from an ushort (I hate this language sometimes) - /// - /// - /// - /// input - 1 - // I want someone to double-check this before it goes into full prod - public static ushort Subtract(ushort input, int mask = 1) - { - int temp = input; - while (!((temp & mask) > 0)) - { - temp ^= mask; - mask <<= 1; - } - - temp ^= mask; - return (ushort)temp; - } - + // ReSharper disable once InconsistentNaming public static bool PDWarning(EP player) { @@ -75,5 +58,46 @@ public static bool HasEffect(EP player, EffectType effect) { return !Enum.IsDefined(typeof(EffectType), effect) ? throw new InvalidEnumArgumentException(nameof(effect), (int)effect, typeof(EffectType)) : player.ActiveEffects.Any(targetActiveEffect => targetActiveEffect.name == nameof(effect)); } + + public static void Grenade_Damage(EffectGrenadeProjectile grenade, EP player) + { + if (Vector3.Distance(grenade.Position, player.Position) <= 4) + { + if (Physics.Raycast(grenade.Position, player.Position, out var _, 4, (int) LayerMasks.Grenade)) + { + if (player is { IsScp: true, HumeShield: > 900 }) + { + player.Hurt(player, 900, armorPenetration: 50); + } + else if (player.IsHuman) + { + player.Hurt(grenade.PreviousOwner, 150, armorPenetration: 50); + } + } + + } + else if(Physics.Raycast(grenade.Position, player.Position, out var hit, 20, (int) LayerMasks.Grenade)) + { + player.Hurt(player, 25, armorPenetration: 50); + } + } + public static void Explode(Pickup? grenade, EP player) + { + if (grenade is null) + { + player.ShowHint("Shits Fucked up :(\nmb gng"); + } + else + { + Vector3 lVoloc = grenade.Rigidbody.linearVelocity; + Vector3 pos = grenade.Position; + grenade.Destroy(); + var explosiveGrenade = (ExplosiveGrenade) Item.Create(ItemType.GrenadeHE, player); + explosiveGrenade.FuseTime = Vector3.Distance(pos, player.Position) > 7f ? 1f : 5f; + + explosiveGrenade.Projectile.Rigidbody.linearVelocity = lVoloc; + explosiveGrenade.SpawnActive(pos, player); + } + } } } \ No newline at end of file diff --git a/packages.lock.json b/packages.lock.json index e67d9ea..cd04f62 100644 --- a/packages.lock.json +++ b/packages.lock.json @@ -4,9 +4,9 @@ ".NETFramework,Version=v4.8": { "ExMod.Exiled": { "type": "Direct", - "requested": "[9.8.1, )", - "resolved": "9.8.1", - "contentHash": "I2Y7fn9fl07W72TN9XVaST3efjJKGq5/B5ZfXb4VrCJEstTXdqFBJfFMMv0TWrXThHVsTLrXVGkYsr1WQ4y82w==" + "requested": "[9.14.2, )", + "resolved": "9.14.2", + "contentHash": "VGveRNhYtj2C7X2PNQwvFfSjb9pdtDl5JvDQ5ea5lo/2GXzRkUQK3rwoeoBGt7q7hMihng8E31mwYAU7LiqljA==" }, "Microsoft.NETFramework.ReferenceAssemblies": { "type": "Direct", From 1884506a55f7b21a1383563cc5316a44a218a271 Mon Sep 17 00:00:00 2001 From: Noobest1001 Date: Thu, 16 Jul 2026 00:43:24 -0400 Subject: [PATCH 2/9] changed a lot --- ChangeLog.md | 13 -- Config.cs | 113 +++++++------- EventHandler.cs | 18 +-- ExtendedItems.csproj | 8 +- Items/Coin.cs | 215 +++++++++++++------------- Items/GLShot.cs | 3 +- Items/GrenadeLauncher.cs | 139 ++++++++--------- Items/Plastic.cs | 288 ++++++++++++++++++----------------- Items/Scp1499.cs | 151 +++++++++--------- Items/Sniper.cs | 103 +++++++------ Items/Tranquilizer.cs | 214 +++++++++++++------------- Plugin.cs | 77 +++++----- PreviousChangeLogs/v3.0.1.md | 33 ---- PreviousChangeLogs/v3.1.0.md | 13 -- Ssss.cs | 95 ++++++------ Types/CoinEffect.cs | 13 +- Utils.cs | 146 +++++++++--------- 17 files changed, 790 insertions(+), 852 deletions(-) delete mode 100644 ChangeLog.md delete mode 100644 PreviousChangeLogs/v3.0.1.md delete mode 100644 PreviousChangeLogs/v3.1.0.md diff --git a/ChangeLog.md b/ChangeLog.md deleted file mode 100644 index 5979d4a..0000000 --- a/ChangeLog.md +++ /dev/null @@ -1,13 +0,0 @@ -># Update 3.2.2 -> ->> ## General ->>> - Refactored a lot of code to make it easier to read -> ->>## Plastic (C-4) ->>> - Added the ability to explode the C-4 via a keybind (default: Delete) ->>> -> ->>## Tranquilizer ->>>- Changed from a person who is tranqed being invulnerable to just having a 60% damage resistance ->>> -> \ No newline at end of file diff --git a/Config.cs b/Config.cs index 663a23b..21511d2 100644 --- a/Config.cs +++ b/Config.cs @@ -3,63 +3,60 @@ using ExtendedItems.Items; using InventorySystem.Items.Firearms.Attachments; -namespace ExtendedItems -{ - public class Config : IConfig - { - public bool IsEnabled { get; set; } = true; - public bool Debug { get; set; } = true; - - #region Config Settings - - [Description("Weather the Tranq is effective on Tutorials")] - public bool EffectiveOnTutorials { get; set; } = false; - - [Description("Weather the Tranq is still useable when Nuke is on")] - public AttachmentName[] ForcedSniperAttch { get; set; } = [AttachmentName.MuzzleBrake, AttachmentName.RecoilReducingStock, AttachmentName.RifleBody]; - - [Description("The Distance from Larry a player can be before they can no longer use SCP-1499")] - public float LarryDistance { get; set; } = 10f; - - [Description("Ammount of ammo to remove when Grenade Launcher is fired (Can not be negitive)")] - public ushort GrenadeLauncherAmmoUsage { get; set; } = 10; - - [Description("The possable hints shown when you Win")] - public string[] WinHints { get; set; } = - [ - "Long Live the King", - "Use Force", - "Utilize Might", - "Life to the Ruler", - "Be Brave", - "The Savior is here", - "The end is never near", - ]; - - [Description("List of possible causes of death when the coin lands on tails")] - public string[] LoseCauses { get; set; } = - [ - "Silence", - "Quiet", - "Don't Look", - "Look Away", - "Death to the King", - "Death to the Ruler", - "The End", - ]; +namespace ExtendedItems; - #endregion - - #region Custom Items setup - - public Coin Coin { get; set; } = new(); - public Scp1499 Scp1499 { get; set; } = new(); - public GrenadeLauncher GrenadeLauncher { get; set; } = new(); - public Sniper Sniper { get; set; } = new(); - public Tranquilizer Tranquilizer { get; set; } = new(); - public Plastic Plastic { get; set; } = new(); - public GLShot GLShot { get; set; } = new(); - - #endregion - } +public class Config : IConfig +{ + public bool IsEnabled { get; set; } = true; + public bool Debug { get; set; } = true; + + #region Config Settings + + [Description("Weather the Tranq is effective on Tutorials")] + public bool EffectiveOnTutorials { get; set; } = false; + + [Description("Weather the Tranq is still useable when Nuke is on")] + public AttachmentName[] ForcedSniperAttch { get; set; } = + [AttachmentName.MuzzleBrake, AttachmentName.RecoilReducingStock, AttachmentName.RifleBody]; + + [Description("The Distance from Larry a player can be before they can no longer use SCP-1499")] + public float LarryDistance { get; set; } = 10f; + + [Description("The possable hints shown when you Win")] + public string[] WinHints { get; set; } = + [ + "Long Live the King", + "Use Force", + "Utilize Might", + "Life to the Ruler", + "Be Brave", + "The Savior is here", + "The end is never near" + ]; + + [Description("List of possible causes of death when the coin lands on tails")] + public string[] LoseCauses { get; set; } = + [ + "Silence", + "Quiet", + "Don't Look", + "Look Away", + "Death to the King", + "Death to the Ruler", + "The End" + ]; + + #endregion + + #region Custom Items setup + + public Coin Coin { get; set; } = new(); + public Scp1499 Scp1499 { get; set; } = new(); + public GrenadeLauncher GrenadeLauncher { get; set; } = new(); + public Sniper Sniper { get; set; } = new(); + public Tranquilizer Tranquilizer { get; set; } = new(); + public Plastic Plastic { get; set; } = new(); + public GLShot GLShot { get; set; } = new(); + + #endregion } \ No newline at end of file diff --git a/EventHandler.cs b/EventHandler.cs index 8afd176..5cf47e4 100644 --- a/EventHandler.cs +++ b/EventHandler.cs @@ -1,17 +1,17 @@ -using Exiled.API.Features; -using Exiled.Events.EventArgs.Map; +using Exiled.Events.EventArgs.Map; +using LabApi.Events.Arguments.PlayerEvents; namespace ExtendedItems; -public class EventHandler (Plugin plugin) +public class EventHandler() { - protected void OnGrenadeExploding(ExplodingGrenadeEventArgs ev) + public static void OnGrenadeExploding(ExplodingGrenadeEventArgs ev) { - foreach (Player player in ev.TargetsToAffect.ToArray()) - { - Utils.Grenade_Damage(ev.Projectile, player); - } + foreach (var player in ev.TargetsToAffect.ToArray()) Utils.Grenade_Damage(ev.Projectile, player); } - + public void OnLockerOpen(PlayerInteractedLockerEventArgs ev) + { + ev.Locker.Base._deniedBeep = + } } \ No newline at end of file diff --git a/ExtendedItems.csproj b/ExtendedItems.csproj index 958f602..e953767 100644 --- a/ExtendedItems.csproj +++ b/ExtendedItems.csproj @@ -4,7 +4,7 @@ net48 enable enable - preview + latest Library true @@ -14,7 +14,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -342,4 +342,8 @@ + + + + diff --git a/Items/Coin.cs b/Items/Coin.cs index 2e52ea1..d844c4c 100644 --- a/Items/Coin.cs +++ b/Items/Coin.cs @@ -11,127 +11,122 @@ using UnityEngine; using PlayerEvents = Exiled.Events.Handlers.Player; -namespace ExtendedItems.Items +namespace ExtendedItems.Items; + +[CustomItem(ItemType.Coin)] +public class Coin : CustomItem { - [CustomItem(ItemType.Coin)] - public class Coin : CustomItem + public override string Name { get; set; } = "SCP-1289"; + public override uint Id { get; set; } = 4; + public override string Description { get; set; } = "\"What's the most you ever lost on a coin toss?\""; + public override float Weight { get; set; } = 1f; + + public override SpawnProperties? SpawnProperties { get; set; } = new() { - public override string Name { get; set; } = "SCP-1289"; - public override uint Id { get; set; } = 4; - public override string Description { get; set; } = "\"What's the most you ever lost on a coin toss?\""; - public override float Weight { get; set; } = 1f; - - public override SpawnProperties? SpawnProperties { get; set; } = new() - { - Limit = 3, - RoomSpawnPoints = - [ - new RoomSpawnPoint { Room = RoomType.LczCafe, Chance = 50, }, - new RoomSpawnPoint { Room = RoomType.LczToilets, Chance = 50, }, - new RoomSpawnPoint { Room = RoomType.HczArmory, Chance = 50, }, - ], - DynamicSpawnPoints = - [ - new DynamicSpawnPoint { Location = SpawnLocationType.InsideEscapePrimary, Chance = 50, }, - ], - }; - - [Description("Effects to give if coin landed on heads.")] - private static CoinEffect[] Effects => + Limit = 3, + RoomSpawnPoints = [ - new() { Type = EffectType.DamageReduction, Duration = 15, Intensity = 75, }, - new() { Type = EffectType.RainbowTaste, Duration = 15, Intensity = byte.MaxValue, }, - new() { Type = EffectType.Invigorated, Duration = 15, Intensity = byte.MaxValue, }, - new() { Type = EffectType.MovementBoost, Duration = 15, Intensity = 75, }, - ]; - - protected override void SubscribeEvents() - { - PlayerEvents.FlippingCoin += OnFlippingCoin; - PlayerEvents.ChangingRole += OnRoleChanging; - - base.SubscribeEvents(); - } - - protected override void UnsubscribeEvents() - { - PlayerEvents.FlippingCoin -= OnFlippingCoin; - PlayerEvents.ChangingRole -= OnRoleChanging; - - base.UnsubscribeEvents(); - } - - private void OnFlippingCoin(FlippingCoinEventArgs ev) - { - if (!Check(ev.Item)) return; - - Timing.CallDelayed(2f, - () => + new RoomSpawnPoint { Room = RoomType.LczCafe, Chance = 50 }, + new RoomSpawnPoint { Room = RoomType.LczToilets, Chance = 50 }, + new RoomSpawnPoint { Room = RoomType.HczArmory, Chance = 50 } + ], + DynamicSpawnPoints = + [ + new DynamicSpawnPoint { Location = SpawnLocationType.InsideEscapePrimary, Chance = 50 } + ] + }; + + [Description("Effects to give if coin landed on heads.")] + private static CoinEffect[] Effects => + [ + new() { Type = EffectType.DamageReduction, Duration = 15, Intensity = 75 }, + new() { Type = EffectType.RainbowTaste, Duration = 15, Intensity = byte.MaxValue }, + new() { Type = EffectType.Invigorated, Duration = 15, Intensity = byte.MaxValue }, + new() { Type = EffectType.MovementBoost, Duration = 15, Intensity = 75 } + ]; + + protected override void SubscribeEvents() + { + PlayerEvents.FlippingCoin += OnFlippingCoin; + PlayerEvents.ChangingRole += OnRoleChanging; + + base.SubscribeEvents(); + } + + protected override void UnsubscribeEvents() + { + PlayerEvents.FlippingCoin -= OnFlippingCoin; + PlayerEvents.ChangingRole -= OnRoleChanging; + + base.UnsubscribeEvents(); + } + + private void OnFlippingCoin(FlippingCoinEventArgs ev) + { + if (!Check(ev.Item)) return; + + Timing.CallDelayed(2f, + () => + { + if (ev.IsTails) { - if (ev.IsTails) + if (ev.Player.ActiveEffects.Any(targetActiveEffect => + targetActiveEffect.name == nameof(EffectType.AntiScp207))) { - if (ev.Player.ActiveEffects.Any(targetActiveEffect => targetActiveEffect.name == nameof(EffectType.AntiScp207))) - { - Log.Debug($"{ev.Player.Nickname} had Anti-207"); - ev.Player.Explode(ProjectileType.FragGrenade, ev.Player); - } - else - { - Log.Debug("Coin Landed on tails"); - ev.Player.Scale = Vector3.zero; - Log.Debug($"Scaling {ev.Player.Nickname} to zero"); - - // ReSharper disable once InconsistentNaming - var _temp = Plugin.Instance?.Config.LoseCauses.RandomItem() ?? - ""; - - string cause = _temp.Any(char.IsWhiteSpace) ? $"the words {_temp} are etched into the scalp" : $"the word {_temp} is etched in the scalp"; - Ragdoll.CreateAndSpawn(ev.Player.Role.Type, - ev.Player.DisplayNickname, - new CustomReasonDamageHandler(cause), - ev.Player.Position, - ev.Player.Rotation, - ev.Player); - - ev.Player.IsGodModeEnabled = false; - - Log.Debug("Spawning Grenade"); - Utils.Exploding(ev.Player); - ev.Player.Kill(cause); - } + Log.Debug($"{ev.Player.Nickname} had Anti-207"); + ev.Player.Explode(ProjectileType.FragGrenade, ev.Player); } else { - ev.Player.ShowHint($"{Plugin.Instance?.Config.WinHints.RandomItem()}"); + Log.Debug("Coin Landed on tails"); + ev.Player.Scale = Vector3.zero; + Log.Debug($"Scaling {ev.Player.Nickname} to zero"); - if (ev.Player.Health + ev.Player.ArtificialHealth < ev.Player.MaxHealth / 2) - { - ev.Player.AddRegeneration(duration: 10, rate: 5); - } - else - { - Effects.ForEach(effect => - { - ev.Player.EnableEffect(effect.Type, - effect.Intensity, - effect.Duration, - true); - }); - } + // ReSharper disable once InconsistentNaming + var _temp = Plugin.Instance?.Config.LoseCauses.RandomItem() ?? + ""; + + var cause = _temp.Any(char.IsWhiteSpace) + ? $"the words {_temp} are etched into the scalp" + : $"the word {_temp} is etched in the scalp"; + Ragdoll.CreateAndSpawn(ev.Player.Role.Type, + ev.Player.DisplayNickname, + new CustomReasonDamageHandler(cause), + ev.Player.Position, + ev.Player.Rotation, + ev.Player); + + ev.Player.IsGodModeEnabled = false; + + Log.Debug("Spawning Grenade"); + Utils.Exploding(ev.Player); + ev.Player.Kill(cause); } - }); - ev.IsAllowed = false; - - Timing.CallDelayed(5f, () => - { - ev.IsAllowed = true; + } + else + { + ev.Player.ShowHint($"{Plugin.Instance?.Config.WinHints.RandomItem()}"); + + if (ev.Player.Health + ev.Player.ArtificialHealth < ev.Player.MaxHealth / 2) + ev.Player.AddRegeneration(duration: 10, rate: 5); + else + Effects.ForEach(effect => + { + ev.Player.EnableEffect(effect.Type, + effect.Intensity, + effect.Duration, + true); + }); + } }); - } + ev.IsAllowed = false; - private static void OnRoleChanging(ChangingRoleEventArgs ev) - { - ev.Player.Scale = Vector3.one; - ev.Player.DisableAllEffects(); - } + Timing.CallDelayed(5f, () => { ev.IsAllowed = true; }); + } + + private static void OnRoleChanging(ChangingRoleEventArgs ev) + { + ev.Player.Scale = Vector3.one; + ev.Player.DisableAllEffects(); } } \ No newline at end of file diff --git a/Items/GLShot.cs b/Items/GLShot.cs index a5e8e12..8ce8606 100644 --- a/Items/GLShot.cs +++ b/Items/GLShot.cs @@ -14,8 +14,9 @@ public class GLShot : CustomGrenade public override SpawnProperties? SpawnProperties { get; set; } = new() { - Limit = 0, + Limit = 0 }; + public override bool ExplodeOnCollision { get; set; } = false; public override float FuseTime { get; set; } = 1000; } \ No newline at end of file diff --git a/Items/GrenadeLauncher.cs b/Items/GrenadeLauncher.cs index caae537..a4ffc46 100644 --- a/Items/GrenadeLauncher.cs +++ b/Items/GrenadeLauncher.cs @@ -12,110 +12,101 @@ using UnityEngine; using YamlDotNet.Serialization; -namespace ExtendedItems.Items +namespace ExtendedItems.Items; + +[CustomItem(ItemType.GunLogicer)] +public class GrenadeLauncher : CustomWeapon { - [CustomItem(ItemType.GunLogicer)] - public class GrenadeLauncher : CustomWeapon - { - public override uint Id { get; set; } = 5; - public override string Name { get; set; } = "Grenade Launcher"; + private static bool _grenadeLaunchCoroutine; + public override uint Id { get; set; } = 5; + public override string Name { get; set; } = "Grenade Launcher"; - public override string Description { get; set; } = - "A modified Chaos Insurgency LMG that fires High Explosive Grenades"; + public override string Description { get; set; } = + "A modified Chaos Insurgency LMG that fires High Explosive Grenades"; - public override float Weight { get; set; } = 10f; - public override float Damage { get; set; } = 0f; - public override byte ClipSize { get; set; } = 1; - - private static bool _grenadeLaunchCoroutine = false; - + public override float Weight { get; set; } = 10f; + public override float Damage { get; set; } = 0f; + public override byte ClipSize { get; set; } = 1; - [YamlIgnore] - public override AttachmentName[] Attachments { get; set; } = - [AttachmentName.Laser, AttachmentName.IronSights, AttachmentName.ShortBarrel,]; - public override SpawnProperties? SpawnProperties { get; set; } = new() + [YamlIgnore] + public override AttachmentName[] Attachments { get; set; } = + [AttachmentName.Laser, AttachmentName.IronSights, AttachmentName.ShortBarrel]; - { - Limit = 1, - DynamicSpawnPoints = - [ - new DynamicSpawnPoint - { - Chance = 100, - Location = SpawnLocationType.InsideHidChamber, - }, - ], - }; + public override SpawnProperties? SpawnProperties { get; set; } = new() - protected override void OnShooting(ShootingEventArgs ev) - { - bool? hasSpawn = TrySpawn(10, ev.Player.Position + new Vector3(0f, .25f, 0f), out var pickupBase); + { + Limit = 1, + LockerSpawnPoints = + [ + new LockerSpawnPoint + { + Chance = 100, + Type = LockerType.ExperimentalWeapon, + UseChamber = true + } + ] + }; - if(hasSpawn is true) + protected override void OnShooting(ShootingEventArgs ev) + { + bool? hasSpawn = TrySpawn(10, ev.Player.Position + new Vector3(0f, .25f, 0f), out var pickupBase); + + if (hasSpawn is true) + { + if (!_grenadeLaunchCoroutine) { + var thrownProjectile = pickupBase!.GameObject.AddComponent(); + pickupBase.GameObject.AddComponent().Init(ev.Player.GameObject, thrownProjectile); + pickupBase.Rigidbody.linearVelocity = new Vector3(3f, .05f); if (!_grenadeLaunchCoroutine) { - ThrownProjectile thrownProjectile = pickupBase!.GameObject.AddComponent(); - pickupBase!.GameObject.AddComponent().Init(ev.Player.GameObject, thrownProjectile ); - pickupBase.Rigidbody.linearVelocity = new Vector3(3f, .05f); - if (!_grenadeLaunchCoroutine) - { - _grenadeLaunchCoroutine = true; - Timing.RunCoroutine(GrenadeLaunch(pickupBase)); - } + _grenadeLaunchCoroutine = true; + Timing.RunCoroutine(GrenadeLaunch(pickupBase)); } - } else { ev.Player.ShowHint("Cant shoot yet", 5f); } - - base.OnShooting(ev); } - - protected override void SubscribeEvents() + else { - base.SubscribeEvents(); + ev.Player.ShowHint("Something messed up", 5f); } - protected override void UnsubscribeEvents() + + base.OnShooting(ev); + } + + protected override void OnChangingAttachment(ChangingAttachmentsEventArgs ev) + { + if (ev.NewAttachmentIdentifiers.Any(attachment => attachment.Name == AttachmentName.ShortBarrel)) { - base.UnsubscribeEvents(); + ev.IsAllowed = true; } - - protected override void OnChangingAttachment(ChangingAttachmentsEventArgs ev) + else { - if (ev.NewAttachmentIdentifiers.Any(attachment => attachment.Name == AttachmentName.ShortBarrel)) - { - ev.IsAllowed = true; - } - else - { - ev.IsAllowed = false; - ev.Player.ShowHint("You need a Short Barrel because I said so :) -Noobest1001", 5f); - } - base.OnChangingAttachment(ev); + ev.IsAllowed = false; + ev.Player.ShowHint("You need a Short Barrel because I said so :) -Noobest1001", 5f); } - private static IEnumerator GrenadeLaunch(Pickup pickup) + base.OnChangingAttachment(ev); + } + + private static IEnumerator GrenadeLaunch(Pickup pickup) + { + if (pickup is not GrenadePickup) yield break; + while (true) { - if (pickup is not GrenadePickup) + yield return Timing.WaitForSeconds(.5f); + + if (pickup.Rigidbody.linearVelocity.magnitude < .5f) { + Utils.Explode(pickup, pickup.PreviousOwner); + _grenadeLaunchCoroutine = false; yield break; } - while (true) - { - yield return Timing.WaitForSeconds(.5f); - - if (pickup.Rigidbody.linearVelocity.magnitude < .5f) - { - Utils.Explode(pickup, pickup.PreviousOwner); - _grenadeLaunchCoroutine = false; - yield break; - } - } } } } \ No newline at end of file diff --git a/Items/Plastic.cs b/Items/Plastic.cs index 5805360..741f561 100644 --- a/Items/Plastic.cs +++ b/Items/Plastic.cs @@ -12,181 +12,191 @@ using Exiled.Events.EventArgs.Server; using InventorySystem.Items.ThrowableProjectiles; using UnityEngine; -// Non-System or Exiled imports - -// System imports - // shortcuted imports using PlayerEvent = Exiled.Events.Handlers.Player; using ServerEvent = Exiled.Events.Handlers.Server; -namespace ExtendedItems.Items +namespace ExtendedItems.Items; + +[CustomItem(ItemType.GrenadeHE)] +public class Plastic : CustomGrenade { - [CustomItem(ItemType.GrenadeHE)] - public class Plastic : CustomGrenade + public enum C4RemoveMethod { - public enum C4RemoveMethod - { - Remove = 0, - Detonate = 1, - Drop = 2, - } - - // Former Name: Hexahydro-1,3,5-trinitro-1,3,5-triazine - public override string Name { get; set; } = "C4 Explosive Charge"; + Remove = 0, + Detonate = 1, + Drop = 2 + } - public override string Description { get; set; } = - "A Remote Explosive that can be detonated when you are within 100m (about 1049.866 Big macs)"; + // Former Name: Hexahydro-1,3,5-trinitro-1,3,5-triazine + public override string Name { get; set; } = "C4 Explosive Charge"; - public override uint Id { get; set; } = 6; - public override float Weight { get; set; } = 1.5f; - public override bool ExplodeOnCollision { get; set; } = false; - public override float FuseTime { get; set; } = 10800f; - public static Dictionary PlacedCharges { get; } = []; - private static Dictionary Charges { get; } = []; - public static Plastic Instance { get; private set; } = null!; + public override string Description { get; set; } = + "A Remote Explosive that can be detonated when you are within 100m (about 1049.866 Big macs)"; - public override SpawnProperties? SpawnProperties { get; set; } = new() - { - Limit = 1, - RoomSpawnPoints = - [ - new RoomSpawnPoint { Room = RoomType.HczNuke, Chance = 50, }, - ], - DynamicSpawnPoints = - [ - new DynamicSpawnPoint - { - Chance = 100, - Location = SpawnLocationType.InsideEscapePrimary, - }, - ], - }; - - public override ItemType Type { get; set; } = ItemType.GrenadeHE; - - public void Handler(Pickup? charge, C4RemoveMethod method = C4RemoveMethod.Drop, Player? detonator = null) - { - if (charge is null) return; + public override uint Id { get; set; } = 6; + public override float Weight { get; set; } = 1.5f; + public override bool ExplodeOnCollision { get; set; } = false; + public override float FuseTime { get; set; } = 10800f; + public static Dictionary PlacedCharges { get; } = []; + private static Dictionary Charges { get; } = []; + public static Plastic Instance { get; private set; } = null!; - if (detonator == null) method = C4RemoveMethod.Drop; - else + public override SpawnProperties? SpawnProperties { get; set; } = new() + { + Limit = 1, + LockerSpawnPoints = + [ + new LockerSpawnPoint + { + Chance = 50, + Zone = ZoneType.LightContainment, + Type = LockerType.Scp500Pedestal, + UseChamber = true + }, + new LockerSpawnPoint + { + Chance = 4, + Zone = ZoneType.HeavyContainment, + Type = LockerType.Scp500Pedestal, + UseChamber = true + }, + new LockerSpawnPoint { - detonator = Charges.TryGetValue(charge.Serial, out var foundPlayer) - ? foundPlayer - : null; + Chance = 1, + Type = LockerType.AntiScp207Pedestal, + UseChamber = true + }, + new LockerSpawnPoint + { + Chance = 45, + Zone = ZoneType.HeavyContainment, + Type = LockerType.LargeGun, + UseChamber = true } + ] + }; + + public override ItemType Type { get; set; } = ItemType.GrenadeHE; + + public void Handler(Pickup? charge, C4RemoveMethod method = C4RemoveMethod.Drop, Player? detonator = null) + { + if (charge is null) return; + + if (detonator == null) method = C4RemoveMethod.Drop; + else + detonator = Charges.TryGetValue(charge.Serial, out var foundPlayer) + ? foundPlayer + : null; #pragma warning disable CS8602 - switch (method) + switch (method) + { + case C4RemoveMethod.Detonate: { - case C4RemoveMethod.Detonate: - { - var grenade = (ExplosiveGrenade) Item.Create(Type); - grenade.FuseTime = 1f; - grenade.SpawnActive(charge.Position, detonator); - break; - } - case C4RemoveMethod.Remove: - { - charge.Destroy(); - break; - } - case C4RemoveMethod.Drop: //This looks ugly af... what the fuck Microsoft - default: - { - TrySpawn(Id, charge.Position, out _); - break; - } + var grenade = (ExplosiveGrenade)Item.Create(Type); + grenade.FuseTime = 1f; + grenade.SpawnActive(charge.Position, detonator); + break; + } + case C4RemoveMethod.Remove: + { + charge.Destroy(); + break; + } + case C4RemoveMethod.Drop: //This looks ugly af... what the fuck Microsoft + default: + { + TrySpawn(Id, charge.Position, out _); + break; } - - PlacedCharges.Remove(charge); - charge.Destroy(); } + + PlacedCharges.Remove(charge); + charge.Destroy(); + } #pragma warning restore CS8602 - protected override void SubscribeEvents() - { - Instance = this; + protected override void SubscribeEvents() + { + Instance = this; - PlayerEvent.Destroying += OnDestroying; - PlayerEvent.Died += OnDied; - PlayerEvent.Shooting += OnShooting; + PlayerEvent.Destroying += OnDestroying; + PlayerEvent.Died += OnDied; + PlayerEvent.Shooting += OnShooting; - ServerEvent.RoundEnded += OnRoundEnded; + ServerEvent.RoundEnded += OnRoundEnded; - base.SubscribeEvents(); - } + base.SubscribeEvents(); + } - protected override void UnsubscribeEvents() - { - PlayerEvent.Destroying -= OnDestroying; - PlayerEvent.Died -= OnDied; - PlayerEvent.Shooting -= OnShooting; - - ServerEvent.RoundEnded -= OnRoundEnded; + protected override void UnsubscribeEvents() + { + PlayerEvent.Destroying -= OnDestroying; + PlayerEvent.Died -= OnDied; + PlayerEvent.Shooting -= OnShooting; - base.UnsubscribeEvents(); - } + ServerEvent.RoundEnded -= OnRoundEnded; + + base.UnsubscribeEvents(); + } + + protected override void OnWaitingForPlayers() + { + PlacedCharges.Clear(); + base.OnWaitingForPlayers(); + } - protected override void OnWaitingForPlayers() + protected override void OnThrownProjectile(ThrownProjectileEventArgs ev) + { + Log.Debug("Executing OnThrownProjectile method."); + if (!PlacedCharges.ContainsKey(ev.Projectile)) { - PlacedCharges.Clear(); - base.OnWaitingForPlayers(); + PlacedCharges.Add(ev.Pickup, ev.Player); + Charges.Add(ev.Projectile.Serial, ev.Player); } - protected override void OnThrownProjectile(ThrownProjectileEventArgs ev) - { - Log.Debug("Executing OnThrownProjectile method."); - if (!PlacedCharges.ContainsKey(ev.Projectile)) - { - PlacedCharges.Add(ev.Pickup, ev.Player); - Charges.Add(ev.Projectile.Serial, ev.Player); - } + base.OnThrownProjectile(ev); + } - base.OnThrownProjectile(ev); - } + protected override void OnExploding(ExplodingGrenadeEventArgs ev) + { + Log.Debug("Executing OnExploding method."); + PlacedCharges.Remove(ev.Projectile); - protected override void OnExploding(ExplodingGrenadeEventArgs ev) - { - Log.Debug("Executing OnExploding method."); - PlacedCharges.Remove(ev.Projectile); - - base.OnExploding(ev); - } + base.OnExploding(ev); + } - private void OnDestroying(DestroyingEventArgs ev) - { - Log.Debug("Executing OnDestoying method."); - foreach (var charge in PlacedCharges.ToList().Where(charge => charge.Value == ev.Player)) - Handler(charge.Key, C4RemoveMethod.Remove); - - } + private void OnDestroying(DestroyingEventArgs ev) + { + Log.Debug("Executing OnDestoying method."); + foreach (KeyValuePair charge in PlacedCharges.ToList() + .Where(charge => charge.Value == ev.Player)) + Handler(charge.Key, C4RemoveMethod.Remove); + } - private void OnDied(DiedEventArgs ev) - { - foreach (var charge in PlacedCharges.ToList().Where(charge => charge.Value == ev.Player)) - Handler(charge.Key); - - } + private void OnDied(DiedEventArgs ev) + { + foreach (KeyValuePair charge in PlacedCharges.ToList() + .Where(charge => charge.Value == ev.Player)) + Handler(charge.Key); + } - private void OnShooting(ShootingEventArgs ev) - { - var forward = ev.Player.CameraTransform.forward; + private void OnShooting(ShootingEventArgs ev) + { + var forward = ev.Player.CameraTransform.forward; - if (!Physics.Raycast(ev.Player.CameraTransform.position + forward, forward, out var hit, 500)) - return; + if (!Physics.Raycast(ev.Player.CameraTransform.position + forward, forward, out var hit, 500)) + return; - var grenade = hit.collider.gameObject.GetComponentInParent(); + var grenade = hit.collider.gameObject.GetComponentInParent(); - if (grenade == null) return; - if (PlacedCharges.ContainsKey(Pickup.Get(grenade))) Handler(Pickup.Get(grenade), C4RemoveMethod.Remove); - - } + if (grenade == null) return; + if (PlacedCharges.ContainsKey(Pickup.Get(grenade))) Handler(Pickup.Get(grenade), C4RemoveMethod.Remove); + } - private static void OnRoundEnded(RoundEndedEventArgs ev) - { - PlacedCharges.Clear(); - } + private static void OnRoundEnded(RoundEndedEventArgs ev) + { + PlacedCharges.Clear(); } } \ No newline at end of file diff --git a/Items/Scp1499.cs b/Items/Scp1499.cs index ded939a..0a1f6ad 100644 --- a/Items/Scp1499.cs +++ b/Items/Scp1499.cs @@ -10,100 +10,107 @@ using YamlDotNet.Serialization; using PlayerEvents = Exiled.Events.Handlers.Player; -namespace ExtendedItems.Items +namespace ExtendedItems.Items; + +[CustomItem(ItemType.SCP268)] +public class Scp1499 : CustomItem { - [CustomItem(ItemType.SCP268)] - public class Scp1499 : CustomItem - { - [YamlIgnore] private readonly Dictionary _lastPositions = []; + [Description("Room to teleport player to after using SCP-1499.")] + // ReSharper disable once InconsistentNaming + private const RoomType _teleportRoom = RoomType.Hcz106; - [Description("Relative position of room mentioned above to teleport player to after using SCP-1499.")] - private readonly Vector3 _relativePosition = new(5.75f, 10f, -10.75f); + [Description("Time for player to wander in seconds.")] + // ReSharper disable once InconsistentNaming + private const float _duration = 15f; - public override uint Id { get; set; } = 3; - public override string Name { get; set; } = "SCP-1499"; - public override string Description { get; set; } = "A breath away from oblivion."; - public override float Weight { get; set; } = 5f; + [YamlIgnore] private readonly Dictionary _lastPositions = []; - [Description("Room to teleport player to after using SCP-1499.")] - private readonly RoomType _teleportRoom = RoomType.Hcz106; + [Description("Relative position of room mentioned above to teleport player to after using SCP-1499.")] + private readonly Vector3 _relativePosition = new(5.75f, 10f, -10.75f); - [Description("Time for player to wander in seconds.")] - private readonly float _duration = 15f; + public override uint Id { get; set; } = 3; + public override string Name { get; set; } = "SCP-1499"; + public override string Description { get; set; } = "A breath away from oblivion."; + public override float Weight { get; set; } = 5f; - public override SpawnProperties? SpawnProperties { get; set; } = new() - { - Limit = 1, - LockerSpawnPoints = - [ - new LockerSpawnPoint { Type = LockerType.Scp268Pedestal, Chance = 100, Zone = ZoneType.HeavyContainment, }, - ], - }; - - private void OnUsingItem(UsingItemEventArgs ev) - { - if (!Check(ev.Item)) return; - if (ev.Player.IsInPocketDimension || Utils.PDWarning(ev.Player)) + public override SpawnProperties? SpawnProperties { get; set; } = new() + { + Limit = 1, + LockerSpawnPoints = + [ + new LockerSpawnPoint { - ev.Player.ShowHint( - "You put on the gas mask but nothing happens.\nIt seems that this SCP item has its limits."); - ev.IsAllowed = false; - ev.Cooldown = 0f; + Type = LockerType.Scp268Pedestal, + Chance = 50f, + Zone = ZoneType.HeavyContainment, + UseChamber = true } - } + ] + }; - private void OnUsedItem(UsedItemEventArgs ev) + private void OnUsingItem(UsingItemEventArgs ev) + { + if (!Check(ev.Item)) return; + if (ev.Player.IsInPocketDimension || Utils.PDWarning(ev.Player)) { - if (!Check(ev.Item)) return; + ev.Player.ShowHint( + "You put on the gas mask but nothing happens.\nIt seems that this SCP item has its limits."); + ev.IsAllowed = false; + ev.Cooldown = 0.5f; + } + } - ev.Player.DisableEffect(EffectType.Invisible); - ev.Player.EnableEffect(EffectType.DamageReduction, byte.MaxValue, _duration); + private void OnUsedItem(UsedItemEventArgs ev) + { + if (!Check(ev.Item)) return; - var handle = Timing.CallDelayed(_duration, () => TeleportPrevious(ev.Player.NetId)); + ev.Player.DisableEffect(EffectType.Invisible); + ev.Player.EnableEffect(EffectType.DamageReduction, byte.MaxValue, _duration); - _lastPositions.Add(ev.Player.NetId, (ev.Player.Position, ev.Player.Lift, handle)); - ev.Player.Teleport(Utils.GetGlobalCords(_teleportRoom, _relativePosition)); - } + var handle = Timing.CallDelayed(_duration, () => TeleportPrevious(ev.Player.NetId)); - private void TeleportPrevious(uint netId) - { - if (!Player.TryGet(netId, out var player)) return; - if (!_lastPositions.TryGetValue(netId, out var lastPos)) return; + _lastPositions.Add(ev.Player.NetId, (ev.Player.Position, ev.Player.Lift, handle)); + ev.Player.Teleport(Utils.GetGlobalCords(_teleportRoom, _relativePosition)); + } + + private void TeleportPrevious(uint netId) + { + if (!Player.TryGet(netId, out var player)) return; + if (!_lastPositions.TryGetValue(netId, out var lastPos)) return; - if (lastPos.Item2 != null) - player.Teleport(lastPos.Item2.Position + Vector3.up * 2f); - else - player.Teleport(lastPos.Item1); + if (lastPos.Item2 != null) + player.Teleport(lastPos.Item2.Position + Vector3.up * 2f); + else + player.Teleport(lastPos.Item1); - _lastPositions.Remove(netId); - Timing.KillCoroutines(lastPos.Item3); - } + _lastPositions.Remove(netId); + Timing.KillCoroutines(lastPos.Item3); + } - protected override void SubscribeEvents() - { - PlayerEvents.UsedItem += OnUsedItem; - PlayerEvents.UsingItem += OnUsingItem; + protected override void SubscribeEvents() + { + PlayerEvents.UsedItem += OnUsedItem; + PlayerEvents.UsingItem += OnUsingItem; - base.SubscribeEvents(); - } + base.SubscribeEvents(); + } - protected override void UnsubscribeEvents() - { - PlayerEvents.UsedItem -= OnUsedItem; - PlayerEvents.UsingItem -= OnUsingItem; + protected override void UnsubscribeEvents() + { + PlayerEvents.UsedItem -= OnUsedItem; + PlayerEvents.UsingItem -= OnUsingItem; - base.UnsubscribeEvents(); - } + base.UnsubscribeEvents(); + } - protected override void OnDroppingItem(DroppingItemEventArgs ev) - { - if (!Check(ev.Item)) return; - if (!_lastPositions.ContainsKey(ev.Player.NetId)) return; + protected override void OnDroppingItem(DroppingItemEventArgs ev) + { + if (!Check(ev.Item)) return; + if (!_lastPositions.ContainsKey(ev.Player.NetId)) return; - ev.IsAllowed = false; - TeleportPrevious(ev.Player.NetId); + ev.IsAllowed = false; + TeleportPrevious(ev.Player.NetId); - base.OnDroppingItem(ev); - } + base.OnDroppingItem(ev); } } \ No newline at end of file diff --git a/Items/Sniper.cs b/Items/Sniper.cs index d35e6a4..07a900a 100644 --- a/Items/Sniper.cs +++ b/Items/Sniper.cs @@ -3,72 +3,71 @@ using Exiled.API.Features.Spawn; using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Item; -using Exiled.Events.EventArgs.Player; using InventorySystem.Items.Firearms.Attachments; using YamlDotNet.Serialization; using ItemEvents = Exiled.Events.Handlers.Item; -namespace ExtendedItems.Items -{ - [CustomItem(ItemType.GunE11SR)] - public class Sniper : CustomWeapon - { - public override uint Id { get; set; } = 2; - public override string Name { get; set; } = "SR-118"; +namespace ExtendedItems.Items; - public override string Description { get; set; } = - "A modified E-11 that fires 5.56 at supersonic velocity that deals significantly more damage"; +[CustomItem(ItemType.GunE11SR)] +public class Sniper : CustomWeapon +{ + public override uint Id { get; set; } = 2; + public override string Name { get; set; } = "SR-118"; - public override float Weight { get; set; } = 4f; - public override float Damage { get; set; } = 125f; - public override byte ClipSize { get; set; } = 1; + public override string Description { get; set; } = + "A modified E-11 that fires 5.56 at supersonic velocity that deals significantly more damage"; - [YamlIgnore] - public override AttachmentName[] Attachments { get; set; } = - [ - AttachmentName.LowcapMagAP, AttachmentName.Foregrip, AttachmentName.DotSight, - AttachmentName.RecoilReducingStock, AttachmentName.CarbineBody, AttachmentName.MuzzleBrake, - ]; + public override float Weight { get; set; } = 4f; + public override float Damage { get; set; } = 125f; + public override byte ClipSize { get; set; } = 1; - public override SpawnProperties? SpawnProperties { get; set; } = new() - { - Limit = 1, - LockerSpawnPoints = - [ - new LockerSpawnPoint {Type = LockerType.RifleRack, Chance = 100, UseChamber = true, Zone = ZoneType.HeavyContainment}, - ], - }; + [YamlIgnore] + public override AttachmentName[] Attachments { get; set; } = + [ + AttachmentName.LowcapMagAP, AttachmentName.Foregrip, AttachmentName.DotSight, + AttachmentName.RecoilReducingStock, AttachmentName.RifleBody, AttachmentName.MuzzleBrake + ]; - protected override void SubscribeEvents() - { - ItemEvents.ChangingAttachments += OnChangingAttachments; + public override SpawnProperties? SpawnProperties { get; set; } = new() + { + Limit = 1, + LockerSpawnPoints = + [ + new LockerSpawnPoint + { + Type = LockerType.RifleRack, + Chance = 100, + UseChamber = true, + Zone = ZoneType.HeavyContainment + } + ] + }; - base.SubscribeEvents(); - } + protected override void SubscribeEvents() + { + ItemEvents.ChangingAttachments += OnChangingAttachments; - protected override void UnsubscribeEvents() - { - ItemEvents.ChangingAttachments -= OnChangingAttachments; + base.SubscribeEvents(); + } - base.UnsubscribeEvents(); - } + protected override void UnsubscribeEvents() + { + ItemEvents.ChangingAttachments -= OnChangingAttachments; - private void OnChangingAttachments(ChangingAttachmentsEventArgs ev) - { - if (!Check(ev.Item)) return; + base.UnsubscribeEvents(); + } - // ReSharper disable once InconsistentNaming - AttachmentName[] Monica = Plugin.Instance!.Config.ForcedSniperAttch; - AttachmentName[] subMonica = ev.NewAttachmentIdentifiers.Select(user => user.Name).ToArray(); - ev.IsAllowed = subMonica.All(item => Monica.Contains(item)); - } + private void OnChangingAttachments(ChangingAttachmentsEventArgs ev) + { + if (!Check(ev.Item)) return; - protected override void OnReloading(ReloadingWeaponEventArgs ev) - { - if (Check(ev.Item)) - { - ev.IsAllowed = true; - } - } + // ReSharper disable once InconsistentNaming + AttachmentName[] Monica = Plugin.Instance!.Config.ForcedSniperAttch; + AttachmentName[] subMonica = ev.NewAttachmentIdentifiers.Select(user => user.Name).ToArray(); + + // I hate this but this is a way to do this and I dont want to fuck with this anymore + ev.IsAllowed = subMonica.All(item => Monica.Contains(item)) && + (Monica.Contains(AttachmentName.LowcapMagAP) || Monica.Contains(AttachmentName.LowcapMagJHP)); } } \ No newline at end of file diff --git a/Items/Tranquilizer.cs b/Items/Tranquilizer.cs index f5bc466..6ffa729 100644 --- a/Items/Tranquilizer.cs +++ b/Items/Tranquilizer.cs @@ -15,140 +15,134 @@ using Scp096Role = Exiled.API.Features.Roles.Scp096Role; using PlayerEvents = Exiled.Events.Handlers.Player; -namespace ExtendedItems.Items +namespace ExtendedItems.Items; + +[CustomItem(ItemType.GunCOM15)] +public class Tranquilizer : CustomWeapon { - [CustomItem(ItemType.GunCOM15)] - public class Tranquilizer : CustomWeapon - { - [YamlIgnore] private readonly Dictionary _resistances = []; + [YamlIgnore] private readonly Dictionary _resistances = []; - [YamlIgnore] private readonly Random _rng = new(); - public override string Name { get; set; } = "Tranquilizer"; - public override uint Id { get; set; } = 1; + [YamlIgnore] private readonly Random _rng = new(); + public override string Name { get; set; } = "Tranquilizer"; + public override uint Id { get; set; } = 1; - public override string Description { get; set; } = - "A gun that temporarily tranquilizes entities; might be unreliable."; + public override string Description { get; set; } = + "A gun that temporarily tranquilizes entities; might be unreliable."; - public override float Weight { get; set; } = 1f; - public override float Damage { get; set; } = 1f; - public override byte ClipSize { get; set; } = 3; + public override float Weight { get; set; } = 1f; + public override float Damage { get; set; } = 1f; + public override byte ClipSize { get; set; } = 3; - [Description("Whether the tranquilizer is effective on SCP-173.")] - private bool EffectiveOn173 { get; } = false; + [Description("Whether the tranquilizer is effective on SCP-173.")] + private bool EffectiveOn173 { get; } = false; - [Description("The effectiveness of tranquilizer on SCPs in decimal percentage.")] - private float ScpChance { get; } = 0.5f; + [Description("The effectiveness of tranquilizer on SCPs in decimal percentage.")] + private float ScpChance { get; } = 0.5f; - [Description("The effectiveness of tranquilizer on humans in decimal percentage.")] - private float HumanChance { get; } = 0.75f; + [Description("The effectiveness of tranquilizer on humans in decimal percentage.")] + private float HumanChance { get; } = 0.75f; - [Description("Resistance to remove from the chance after being shot.")] - private float Resistance { get; } = 0.05f; - + [Description("Resistance to remove from the chance after being shot.")] + private float Resistance { get; } = 0.05f; - public override SpawnProperties? SpawnProperties { get; set; } = new() - { - Limit = 1, - RoomSpawnPoints = - [ - new RoomSpawnPoint { Room = RoomType.LczCafe, Chance = 25, }, - new RoomSpawnPoint { Room = RoomType.LczGlassBox, Chance = 25, }, - new RoomSpawnPoint { Room = RoomType.LczPlants, Chance = 75, }, - ], - }; - - protected override void SubscribeEvents() - { - PlayerEvents.ChangingRole += OnChangingRole; - base.SubscribeEvents(); - } - protected override void UnsubscribeEvents() - { - PlayerEvents.ChangingRole -= OnChangingRole; - base.UnsubscribeEvents(); - } + public override SpawnProperties? SpawnProperties { get; set; } = new() + { + Limit = 1, + RoomSpawnPoints = + [ + new RoomSpawnPoint { Room = RoomType.LczCafe, Chance = 25 }, + new RoomSpawnPoint { Room = RoomType.LczGlassBox, Chance = 25 }, + new RoomSpawnPoint { Room = RoomType.LczPlants, Chance = 75 } + ] + }; + + protected override void SubscribeEvents() + { + PlayerEvents.ChangingRole += OnChangingRole; + base.SubscribeEvents(); + } - private void OnChangingRole(ChangingRoleEventArgs ev) - { - if (!_resistances.ContainsKey(ev.Player.NetId)) return; - _resistances[ev.Player.NetId] = 0; - } + protected override void UnsubscribeEvents() + { + PlayerEvents.ChangingRole -= OnChangingRole; + base.UnsubscribeEvents(); + } - protected override void OnShot(ShotEventArgs ev) - { - if (ev.Target == null || Plugin.Instance == null) return; - if (ev.Target.IsTutorial && !Plugin.Instance.Config.EffectiveOnTutorials) return; + private void OnChangingRole(ChangingRoleEventArgs ev) + { + if (!_resistances.ContainsKey(ev.Player.NetId)) return; + _resistances[ev.Player.NetId] = 0; + } - if (!Utils.HasEffect(ev.Target, EffectType.Invigorated)) - { - return; - } - + protected override void OnShot(ShotEventArgs ev) + { + if (ev.Target == null || Plugin.Instance == null) return; + if (ev.Target.IsTutorial && !Plugin.Instance.Config.EffectiveOnTutorials) return; - var rand = _rng.NextDouble(); - _resistances.TryGetValue(ev.Target.NetId, out var tResistance); + if (!Utils.HasEffect(ev.Target, EffectType.Invigorated)) return; - var effective = ev.Target.IsScp ? rand < ScpChance - tResistance : rand < HumanChance - tResistance; - if ((ev.Target.Role == RoleTypeId.Scp173 && !EffectiveOn173) || !effective) - { - base.OnShot(ev); - return; - } + var rand = _rng.NextDouble(); + _resistances.TryGetValue(ev.Target.NetId, out var tResistance); - var lift = ev.Player.Lift; + var effective = ev.Target.IsScp ? rand < ScpChance - tResistance : rand < HumanChance - tResistance; - ev.Target.Scale = Vector3.zero; - _resistances[ev.Target.NetId] = tResistance + Resistance; + if ((ev.Target.Role == RoleTypeId.Scp173 && !EffectiveOn173) || !effective) + { + base.OnShot(ev); + return; + } - ev.Target.EnableEffect(EffectType.Ensnared, byte.MaxValue); - ev.Target.EnableEffect(EffectType.Flashed, byte.MaxValue); - ev.Target.EnableEffect(EffectType.Deafened, byte.MaxValue); - ev.Target.EnableEffect(EffectType.DamageReduction, 60); + var lift = ev.Player.Lift; - Ragdoll? ragdoll = null; + ev.Target.Scale = Vector3.zero; + _resistances[ev.Target.NetId] = tResistance + Resistance; - if (ev.Target.IsHuman) - { - ev.Target.CurrentItem = null; - ev.Target.EnableEffect(EffectType.AmnesiaItems, byte.MaxValue); - } - else - { - if (ev.Target.Role != RoleTypeId.Scp106) - { - ragdoll = Ragdoll.CreateAndSpawn(ev.Target.Role.Type, ev.Target.DisplayNickname, - new CustomReasonDamageHandler("Tranquilized."), ev.Target.Position, ev.Target.Rotation, - ev.Target); - } - - if (ev.Target.Role == RoleTypeId.Scp096) - { - var crybaby = (Scp096Role)ev.Target.Role; - if (crybaby.RageState is Scp096RageState.Enraged or Scp096RageState.Distressed) - crybaby.RageManager.ServerEndEnrage(); - } - } + ev.Target.EnableEffect(EffectType.Ensnared, byte.MaxValue); + ev.Target.EnableEffect(EffectType.Flashed, byte.MaxValue); + ev.Target.EnableEffect(EffectType.Deafened, byte.MaxValue); + ev.Target.EnableEffect(EffectType.DamageReduction, 60); - Timing.CallDelayed(5, () => - { - ev.Target.Inventory.enabled = true; - ev.Target.IsGodModeEnabled = false; - ev.Target.DisableEffect(EffectType.Ensnared); - ev.Target.DisableEffect(EffectType.Flashed); - ev.Target.DisableEffect(EffectType.Deafened); - ev.Target.DisableEffect(EffectType.AmnesiaItems); - ev.Target.DisableEffect(EffectType.DamageReduction); - - if (lift != null) ev.Target.Teleport(lift.Position + Vector3.up * 2f); - else ev.Target.Teleport(ev.Target.Position + Vector3.up * 2f); - ev.Target.Scale = Vector3.one; - ragdoll?.Destroy(); - }); + Ragdoll? ragdoll = null; - base.OnShot(ev); + if (ev.Target.IsHuman) + { + ev.Target.CurrentItem = null; + ev.Target.EnableEffect(EffectType.AmnesiaItems, byte.MaxValue); } + else + { + if (ev.Target.Role != RoleTypeId.Scp106) + ragdoll = Ragdoll.CreateAndSpawn(ev.Target.Role.Type, ev.Target.DisplayNickname, + new CustomReasonDamageHandler("Tranquilized."), ev.Target.Position, ev.Target.Rotation, + ev.Target); + + if (ev.Target.Role == RoleTypeId.Scp096) + { + var crybaby = (Scp096Role)ev.Target.Role; + if (crybaby.RageState is Scp096RageState.Enraged or Scp096RageState.Distressed) + crybaby.RageManager.ServerEndEnrage(); + } + } + + Timing.CallDelayed(5, () => + { + ev.Target.Inventory.enabled = true; + ev.Target.IsGodModeEnabled = false; + ev.Target.DisableEffect(EffectType.Ensnared); + ev.Target.DisableEffect(EffectType.Flashed); + ev.Target.DisableEffect(EffectType.Deafened); + ev.Target.DisableEffect(EffectType.AmnesiaItems); + ev.Target.DisableEffect(EffectType.DamageReduction); + + if (lift != null) ev.Target.Teleport(lift.Position + Vector3.up * 2f); + else ev.Target.Teleport(ev.Target.Position + Vector3.up * 2f); + ev.Target.Scale = Vector3.one; + ragdoll?.Destroy(); + }); + + base.OnShot(ev); } } \ No newline at end of file diff --git a/Plugin.cs b/Plugin.cs index 7eff456..a39913b 100644 --- a/Plugin.cs +++ b/Plugin.cs @@ -3,56 +3,59 @@ using Exiled.CustomItems.API.Features; using UnityEngine; using UserSettings.ServerSpecific; +using Map = Exiled.Events.Handlers.Map; -namespace ExtendedItems +namespace ExtendedItems; + +// ReSharper disable once ClassNeverInstantiated.Global +public class Plugin : Plugin { - // ReSharper disable once ClassNeverInstantiated.Global - public class Plugin : Plugin - { - public static Plugin? Instance; + public static Plugin? Instance; - public static EventHandler? _event; + public static EventHandler? _event; - private List? _settings; - public override string Prefix => "Extended Items"; - public override string Name => "Extended Items"; - public override string Author => "Noobest1001"; - public override Version Version => new(4, 0, 0, 0); - public override Version RequiredExiledVersion => new(9, 7, 0); + private List? _settings; + public override string Name => "Extended Items"; + public override string Author => "Noobest1001"; + public override Version Version => new(4, 0, 0, 1); + public override Version RequiredExiledVersion => new(9, 14, 2); + + public override void OnEnabled() + { + Instance = this; + _event = new EventHandler(); - public override void OnEnabled() - { - Instance = this; - _event = new EventHandler(Instance); + Ssss.Register(); - Ssss.Register(); + Log.Send("Registering items", LogLevel.Info, ConsoleColor.DarkYellow); + CustomItem.RegisterItems(overrideClass: Config); - Log.Send("Registering items", LogLevel.Info, ConsoleColor.DarkYellow); - CustomItem.RegisterItems(overrideClass: Config); + _settings = + [ + new SSGroupHeader(10, "Cactus Patch"), + new SSKeybindSetting(24, "C4 Detonation", KeyCode.Delete, hint: "Explodes all C4 placed by you") + ]; - _settings = - [ - new SSGroupHeader(10, "Extended Items"), - new SSKeybindSetting(24, "C4 Detonation", KeyCode.Delete, hint: "Explodes all C4 placed by you"), - ]; + ServerSpecificSettingsSync.DefinedSettings = _settings.ToArray(); - ServerSpecificSettingsSync.DefinedSettings = _settings.ToArray(); + Map.ExplodingGrenade += EventHandler.OnGrenadeExploding; - base.OnEnabled(); - } + base.OnEnabled(); + } + + public override void OnDisabled() + { + Map.ExplodingGrenade -= EventHandler.OnGrenadeExploding; - public override void OnDisabled() - { - Log.Send("Unregistering items", LogLevel.Info, ConsoleColor.DarkYellow); - CustomItem.UnregisterItems(); + Log.Send("Unregistering items", LogLevel.Info, ConsoleColor.DarkYellow); + CustomItem.UnregisterItems(); - Ssss.Unregister(); + Ssss.Unregister(); - _settings = null; - _event = null; - Instance = null; + _settings = null; + _event = null; + Instance = null; - base.OnDisabled(); - } + base.OnDisabled(); } } \ No newline at end of file diff --git a/PreviousChangeLogs/v3.0.1.md b/PreviousChangeLogs/v3.0.1.md deleted file mode 100644 index ca3bd59..0000000 --- a/PreviousChangeLogs/v3.0.1.md +++ /dev/null @@ -1,33 +0,0 @@ -# Update v3.0.1 "Heavy Reinforcements" - -> ## 1. For Staff ->> ->>- I have unified all the Id's of the Custom Items (excluding SCP-1162) to range from 801 -> 805 ->>- Tranquilizer Id now 801 (from 1290) ->>- Sniper Id now 802 (from 1291) ->>- SCP-1499 Id now 803 (from 420) ->>- SCP-1289 (Formerly 'Coin') Id now 804 (from 393) ->>- Grenade Launcher Id now 805 (from 32233) ->>- SCP-1162 Id now 7825 (from 432) but mods shouldn't spawn this in - -> ## 2. Sniper ->> ->>- Changed damage to reflect the proper amount decided by the mod team (118 => 112) ->>- Changed Penatration to the Sniper (92.75 => 95) ->>- Removed the Ammo Counter as I deamed it useless and was a relic from when the ammo glitch was a thing - -> ## 3. Grenade Launcher ->> ->>- You can no longer full auto the Grenade Launcher ->>- Any amount of bullets overloaded into the Grenade Launcher will now be refunded after you shoot it ->>- Removed the Ammo Counter for the same reason as above - -> ## 4. Coin ->> ->>- Changed the name of the Coin ('Coin' ⇒ 'SCP-1289') ->>- Changed nothing else, but I feel like only having one line is wrong :shrug: - -> ## 5. Tranquilizer ->> ->>- Fixed a line of code to hopefully add resistance to both Humans and SCP's ->>- *insert preferably funny filler line* diff --git a/PreviousChangeLogs/v3.1.0.md b/PreviousChangeLogs/v3.1.0.md deleted file mode 100644 index 58b3a2b..0000000 --- a/PreviousChangeLogs/v3.1.0.md +++ /dev/null @@ -1,13 +0,0 @@ -> # Update 3.1.0 -> ->> ## SCP-1289 (formerly 'Coin') ->>> #### Renamed the coin ->>> #### Added death and winning notes ->>>> Due to a limitation of Exiled only the player who gets killed by the coin can see the new effects added by yours -> > > > truly ->> ->>## Tranq ->>> Made the player who got tranqed invulnerable but unable to use any items (humans) ->> ->>## General code ->>> Added some notes in the 'Util.cs' file for those who want to add on to this \ No newline at end of file diff --git a/Ssss.cs b/Ssss.cs index eef85e9..614fa21 100644 --- a/Ssss.cs +++ b/Ssss.cs @@ -1,68 +1,67 @@ using Exiled.API.Features; using Exiled.API.Features.Core.UserSettings; +using Exiled.API.Features.Pickups; using ExtendedItems.Items; using UnityEngine; using UserSettings.ServerSpecific; -namespace ExtendedItems +namespace ExtendedItems; + +public class Ssss { - public class Ssss + // ReSharper disable once InconsistentNaming + private static IEnumerable? _settings; + + public static void Register() { - // ReSharper disable once InconsistentNaming - private static IEnumerable? _settings; + Log.Info("Keybind Registered"); + ServerSpecificSettingsSync.ServerOnSettingValueReceived += Keybind; - public static void Register() - { - Log.Info("Keybind Registered"); - ServerSpecificSettingsSync.ServerOnSettingValueReceived += Keybind; + _settings = + [ + new HeaderSetting(10, "Cactus Patch", "o/", true), + new KeybindSetting(24, "C4 Detonation", KeyCode.Delete, hintDescription: "Explodes all C4 placed by you") + ]; + SettingBase.Register(_settings.ToArray()); + } - _settings = - [ - new HeaderSetting(10, "Example Header", "Example Header Description", true), - new KeybindSetting(24, "Example Keybind", KeyCode.Delete, hintDescription: "Example"), - ]; - SettingBase.Register(_settings); - } + public static void Unregister() + { + ServerSpecificSettingsSync.ServerOnSettingValueReceived -= Keybind; + } - public static void Unregister() - { - ServerSpecificSettingsSync.ServerOnSettingValueReceived -= Keybind; - } + private static void Keybind(ReferenceHub referenceHub, ServerSpecificSettingBase settingBase) + { + if (settingBase is not SSKeybindSetting { SettingId: 24, SyncIsPressed: true } keybindSetting) + return; + if (!Player.TryGet(referenceHub, out var player)) + return; - private static void Keybind(ReferenceHub referenceHub, ServerSpecificSettingBase settingBase) + Log.Info("Keybind used by " + player.Nickname); + if (keybindSetting.SettingId == 24) { - if (settingBase is not SSKeybindSetting { SettingId: 24, SyncIsPressed: true } keybindSetting) - return; - if (!Player.TryGet(referenceHub, out var player)) - return; - - Log.Info("Keybind used by " + player.Nickname); - if (keybindSetting.SettingId == 24) + var i = 0; + foreach (KeyValuePair charge in Plastic.PlacedCharges.ToList()) { - var i = 0; - foreach (var charge in Plastic.PlacedCharges.ToList()) - { - var posy = charge.Key.Position.y; - if (charge.Value != player) continue; - - if (player.Position.y >= posy - 100 && player.Position.y <= posy + 100) - { - Plastic.Instance.Handler(charge.Key, Plastic.C4RemoveMethod.Detonate, player); - i++; - } - else - { - player.SendConsoleMessage( - "One of your charges is out of range. You need to get within the zone that it was placed", - "yellow"); - } + var posy = charge.Key.Position.y; + if (charge.Value != player) continue; - player.ShowHint(i == 1 - ? $"\n{i} C4 charge has been detonated!" - : $"\n{i} C4 charges have been detonated!"); + if (player.Position.y >= posy - 100 && player.Position.y <= posy + 100) + { + Plastic.Instance.Handler(charge.Key, Plastic.C4RemoveMethod.Detonate, player); + i++; + } + else + { + player.SendConsoleMessage( + "One of your charges is out of range. You need to get within the zone that it was placed", + "yellow"); } + + player.ShowHint(i == 1 + ? $"\n{i} C4 charge has been detonated!" + : $"\n{i} C4 charges have been detonated!"); } - } } } \ No newline at end of file diff --git a/Types/CoinEffect.cs b/Types/CoinEffect.cs index 8e6c0e9..576080a 100644 --- a/Types/CoinEffect.cs +++ b/Types/CoinEffect.cs @@ -1,11 +1,10 @@ using Exiled.API.Enums; -namespace ExtendedItems.Types +namespace ExtendedItems.Types; + +public class CoinEffect { - public class CoinEffect - { - public EffectType Type { get; init; } - public float Duration { get; init; } - public byte Intensity { get; init; } - } + public EffectType Type { get; init; } + public float Duration { get; init; } + public byte Intensity { get; init; } } \ No newline at end of file diff --git a/Utils.cs b/Utils.cs index d7d9e1d..b308f00 100644 --- a/Utils.cs +++ b/Utils.cs @@ -9,95 +9,93 @@ using Pickup = Exiled.API.Features.Pickups.Pickup; using Room = Exiled.API.Features.Room; -namespace ExtendedItems +namespace ExtendedItems; + +public static class Utils { - public static class Utils + /// + /// Calculates the global coords of a point inside a room based on the room type and the location + /// + /// + /// + /// Vector3 + public static Vector3 GetGlobalCords(RoomType roomType, Vector3 localPos) { - /// - /// Calculates the global coords of a point inside a room based on the room type and the location - /// - /// - /// - /// Vector3 - public static Vector3 GetGlobalCords(RoomType roomType, Vector3 localPos) - { - var room = Room.Get(roomType); + var room = Room.Get(roomType); - var rotation = room.Rotation; - var roomPos = room.Position; + var rotation = room.Rotation; + var roomPos = room.Position; - var offsetY = Math.Round(Math.Abs(rotation.eulerAngles.y / 90f)); + var offsetY = Math.Round(Math.Abs(rotation.eulerAngles.y / 90f)); - return offsetY switch - { - 0 => new Vector3(roomPos.x + localPos.x, roomPos.y + localPos.y, roomPos.z + localPos.z), - 1 => new Vector3(roomPos.x + localPos.z, roomPos.y + localPos.y, roomPos.z - localPos.x), - 2 => new Vector3(roomPos.x - localPos.x, roomPos.y + localPos.y, roomPos.z - localPos.z), - 3 => new Vector3(roomPos.x - localPos.z, roomPos.y + localPos.y, roomPos.z + localPos.x), - _ => Vector3.zero, - }; - } - - // ReSharper disable once InconsistentNaming - public static bool PDWarning(EP player) + return offsetY switch { - return (from actEffects in player.ActiveEffects - let Larry = EP.List.First(L => L.Role == RoleTypeId.Scp106).Position - select actEffects.name == "Corroding" && Plugin.Instance != null && - Vector3.Distance(player.Position, Larry) < Plugin.Instance.Config.LarryDistance).FirstOrDefault(); - } + 0 => new Vector3(roomPos.x + localPos.x, roomPos.y + localPos.y, roomPos.z + localPos.z), + 1 => new Vector3(roomPos.x + localPos.z, roomPos.y + localPos.y, roomPos.z - localPos.x), + 2 => new Vector3(roomPos.x - localPos.x, roomPos.y + localPos.y, roomPos.z - localPos.z), + 3 => new Vector3(roomPos.x - localPos.z, roomPos.y + localPos.y, roomPos.z + localPos.x), + _ => Vector3.zero + }; + } + + // ReSharper disable once InconsistentNaming + public static bool PDWarning(EP player) + { + return (player.ActiveEffects + // ReSharper disable once InconsistentNaming + .Select(actEffects => new { actEffects, Larry = EP.List.First(L => L.Role == RoleTypeId.Scp106).Position }) + .Select(@t => + @t.actEffects.name == "Corroding" && Plugin.Instance != null && + Vector3.Distance(player.Position, @t.Larry) < Plugin.Instance.Config.LarryDistance)).FirstOrDefault(); + } + + public static void Exploding(EP player) + { + var grenade = (ExplosiveGrenade)Item.Create(ItemType.GrenadeHE); + grenade.FuseTime = 0.1f; + grenade.SpawnActive(player.Position + new Vector3(0, 1, 0), player); + } + + public static bool HasEffect(EP player, EffectType effect) + { + return !Enum.IsDefined(typeof(EffectType), effect) + ? throw new InvalidEnumArgumentException(nameof(effect), (int)effect, typeof(EffectType)) + : player.ActiveEffects.Any(targetActiveEffect => targetActiveEffect.name == nameof(effect)); + } - public static void Exploding(EP player) + public static void Grenade_Damage(EffectGrenadeProjectile grenade, EP player) + { + if (Vector3.Distance(grenade.Position, player.Position) <= 4) { - var grenade = (ExplosiveGrenade)Item.Create(ItemType.GrenadeHE); - grenade.FuseTime = 0.1f; - grenade.SpawnActive(player.Position + new Vector3(0, 1, 0), player); + if (Physics.Raycast(grenade.Position, player.Position, out _, 4, (int)LayerMasks.Grenade)) + { + if (player is { IsScp: true, HumeShield: > 900 }) + player.Hurt(player, 900, armorPenetration: 50); + else if (player.IsHuman) player.Hurt(grenade.PreviousOwner, 150, armorPenetration: 50); + } } - - public static bool HasEffect(EP player, EffectType effect) + else if (Physics.Raycast(grenade.Position, player.Position, out var hit, 20, (int)LayerMasks.Grenade)) { - return !Enum.IsDefined(typeof(EffectType), effect) ? throw new InvalidEnumArgumentException(nameof(effect), (int)effect, typeof(EffectType)) : player.ActiveEffects.Any(targetActiveEffect => targetActiveEffect.name == nameof(effect)); + player.Hurt(player, 25, armorPenetration: 50); } + } - public static void Grenade_Damage(EffectGrenadeProjectile grenade, EP player) + public static void Explode(Pickup? grenade, EP player) + { + if (grenade is null) { - if (Vector3.Distance(grenade.Position, player.Position) <= 4) - { - if (Physics.Raycast(grenade.Position, player.Position, out var _, 4, (int) LayerMasks.Grenade)) - { - if (player is { IsScp: true, HumeShield: > 900 }) - { - player.Hurt(player, 900, armorPenetration: 50); - } - else if (player.IsHuman) - { - player.Hurt(grenade.PreviousOwner, 150, armorPenetration: 50); - } - } - - } - else if(Physics.Raycast(grenade.Position, player.Position, out var hit, 20, (int) LayerMasks.Grenade)) - { - player.Hurt(player, 25, armorPenetration: 50); - } + player.ShowHint("Shits Fucked up :(\nmb gng"); } - public static void Explode(Pickup? grenade, EP player) + else { - if (grenade is null) - { - player.ShowHint("Shits Fucked up :(\nmb gng"); - } - else - { - Vector3 lVoloc = grenade.Rigidbody.linearVelocity; - Vector3 pos = grenade.Position; - grenade.Destroy(); - var explosiveGrenade = (ExplosiveGrenade) Item.Create(ItemType.GrenadeHE, player); - explosiveGrenade.FuseTime = Vector3.Distance(pos, player.Position) > 7f ? 1f : 5f; - - explosiveGrenade.Projectile.Rigidbody.linearVelocity = lVoloc; - explosiveGrenade.SpawnActive(pos, player); - } + var lVoloc = grenade.Rigidbody.linearVelocity; + var pos = grenade.Position; + grenade.Destroy(); + var explosiveGrenade = (ExplosiveGrenade)Item.Create(ItemType.GrenadeHE, player); + explosiveGrenade.FuseTime = Vector3.Distance(pos, player.Position) > 7f ? 1f : 5f; + + explosiveGrenade.Projectile.Rigidbody.linearVelocity = lVoloc; + explosiveGrenade.SpawnActive(pos, player); } } } \ No newline at end of file From c9be5a150dfb71b8d0b5b1f8d4ffff2b04b25a29 Mon Sep 17 00:00:00 2001 From: noobest1001 Date: Fri, 17 Jul 2026 21:38:17 -0400 Subject: [PATCH 3/9] this is so I can work on this at work --- Config.cs | 4 + EventHandler.cs | 6 + ExtendedItems.csproj | 711 ++++++++++++++++++++++++------------------- Utils.cs | 2 +- 4 files changed, 404 insertions(+), 319 deletions(-) diff --git a/Config.cs b/Config.cs index 21511d2..232fa92 100644 --- a/Config.cs +++ b/Config.cs @@ -9,8 +9,12 @@ public class Config : IConfig { public bool IsEnabled { get; set; } = true; public bool Debug { get; set; } = true; + public bool EasterEggs { get; set; } = false; #region Config Settings + + [Description("How Common Easter Eggs are")] + public float EasterEggsChance { get; set; } = 0.01f; [Description("Weather the Tranq is effective on Tutorials")] public bool EffectiveOnTutorials { get; set; } = false; diff --git a/EventHandler.cs b/EventHandler.cs index 5cf47e4..1c2a9c3 100644 --- a/EventHandler.cs +++ b/EventHandler.cs @@ -5,6 +5,8 @@ namespace ExtendedItems; public class EventHandler() { + private Random random = new(); + private bool HasProperFolder = Directory.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"..")); public static void OnGrenadeExploding(ExplodingGrenadeEventArgs ev) { foreach (var player in ev.TargetsToAffect.ToArray()) Utils.Grenade_Damage(ev.Projectile, player); @@ -12,6 +14,10 @@ public static void OnGrenadeExploding(ExplodingGrenadeEventArgs ev) public void OnLockerOpen(PlayerInteractedLockerEventArgs ev) { + if (!Plugin.Instance.Config.EasterEggs) + { + return; + } ev.Locker.Base._deniedBeep = } } \ No newline at end of file diff --git a/ExtendedItems.csproj b/ExtendedItems.csproj index e953767..fc11f35 100644 --- a/ExtendedItems.csproj +++ b/ExtendedItems.csproj @@ -22,324 +22,399 @@ - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp-firstpass.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\BouncyCastle.Cryptography.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Caress.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\CommandSystem.Core.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\DnsClient.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Facepunch.Steamworks.Win64.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.Components.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mono.Security.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\mscorlib.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\netstandard.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\NorthwoodLib.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Pooling.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.ComponentModel.Composition.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Configuration.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Data.DataSetExtensions.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.EnterpriseServices.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.IO.Compression.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Net.Http.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Runtime.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Runtime.CompilerServices.Unsafe.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Security.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.ServiceModel.Internals.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Transactions.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Burst.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Burst.Unsafe.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Mathematics.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Csg.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.KdTree.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Poly2Tri.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Stl.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.ShaderLibrary.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.HighDefinition.Config.Runtime.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.HighDefinition.Runtime.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.TextMeshPro.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.VisualEffectGraph.Runtime.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AccessibilityModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AIModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AndroidJNIModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AnimationModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ARModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AssetBundleModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AudioModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClothModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClusterInputModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClusterRendererModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CrashReportingModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.DirectorModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.DSPGraphModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GameCenterModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GIModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GridModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.HotReloadModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ImageConversionModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.IMGUIModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputLegacyModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.JSONSerializeModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.LocalizationModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.NVIDIAModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ParticleSystemModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PerformanceReportingModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.Physics2DModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PhysicsModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ScreenCaptureModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SharedInternalsModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SpriteMaskModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SpriteShapeModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.StreamingModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SubstanceModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SubsystemsModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TerrainModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TerrainPhysicsModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextCoreFontEngineModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextCoreTextEngineModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextRenderingModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TilemapModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TLSModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UI.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UIElementsModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UIModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UmbraModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityAnalyticsCommonModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityAnalyticsModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityConnectModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityCurlModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityTestProtocolModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestAssetBundleModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestAudioModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VehiclesModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VFXModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VideoModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VirtualTexturingModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VRModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.WindModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.XRModule.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\YamlDotNet.dll - - - C:\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\zxing.dll - + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp-firstpass.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\BouncyCastle.Cryptography.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Caress.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\CommandSystem.Core.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\CustomPasses.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\DnsClient.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Facepunch.Steamworks.Posix.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Interop.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\LabApi.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Microsoft.Bcl.AsyncInterfaces.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.Components.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mono.Security.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\netstandard.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\NorthwoodLib.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Pooling.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Snake.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Buffers.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Collections.Immutable.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.ComponentModel.Composition.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Configuration.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Data.DataSetExtensions.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.EnterpriseServices.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.IO.Compression.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.IO.Pipelines.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Memory.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Net.Http.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Numerics.Vectors.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Runtime.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Runtime.CompilerServices.Unsafe.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Security.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.ServiceModel.Internals.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Text.Encodings.Web.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Text.Json.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Threading.Tasks.Extensions.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Transactions.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Burst.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Burst.Unsafe.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Collections.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Collections.LowLevel.ILSupport.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Mathematics.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Csg.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.KdTree.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Poly2Tri.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Stl.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Rendering.LightTransport.Runtime.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.Runtime.Shared.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.ShaderLibrary.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.GPUDriven.Runtime.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.HighDefinition.Config.Runtime.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.HighDefinition.Runtime.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.TextMeshPro.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.VisualEffectGraph.Runtime.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AccessibilityModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AIModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AndroidJNIModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AnimationModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AssetBundleModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AudioModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClothModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClusterInputModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClusterRendererModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ContentLoadModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CrashReportingModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.DirectorModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.DSPGraphModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GameCenterModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GIModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GraphicsStateCollectionSerializerModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GridModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.HierarchyCoreModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.HotReloadModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ImageConversionModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.IMGUIModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputForUIModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputLegacyModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.JSONSerializeModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.LocalizationModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.MarshallingModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.MultiplayerModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ParticleSystemModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PerformanceReportingModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.Physics2DModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PhysicsModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PropertiesModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ScreenCaptureModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ShaderVariantAnalyticsModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SharedInternalsModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SpriteMaskModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SpriteShapeModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.StreamingModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SubstanceModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SubsystemsModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TerrainModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TerrainPhysicsModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextCoreFontEngineModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextCoreTextEngineModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextRenderingModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TilemapModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TLSModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UI.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UIElementsModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UIModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UmbraModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityAnalyticsCommonModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityAnalyticsModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityConnectModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityCurlModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityTestProtocolModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestAssetBundleModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestAudioModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VehiclesModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VFXModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VideoModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VirtualTexturingModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VRModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.WindModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.XRModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\YamlDotNet.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\zxing.dll + diff --git a/Utils.cs b/Utils.cs index b308f00..62fe67e 100644 --- a/Utils.cs +++ b/Utils.cs @@ -19,7 +19,7 @@ public static class Utils /// /// /// Vector3 - public static Vector3 GetGlobalCords(RoomType roomType, Vector3 localPos) + public static UnityEngine.Vector3 GetGlobalCords(RoomType roomType, Vector3 localPos) { var room = Room.Get(roomType); From 4aade8819da2b0ca7b600a8874d1f33d54788912 Mon Sep 17 00:00:00 2001 From: noobest1001 Date: Fri, 24 Jul 2026 21:21:24 -0400 Subject: [PATCH 4/9] Made some changes for Work, Removed GrenadeLauncher and GLShot because of a null error --- Config.cs | 13 +++-- EventHandler.cs | 20 +++---- ExtendedItems.csproj | 13 ++--- Items/Coin.cs | 110 ++++++++++++++++++++------------------ Items/GLShot.cs | 22 -------- Items/GrenadeLauncher.cs | 112 --------------------------------------- Items/Plastic.cs | 56 +++++++++----------- Plugin.cs | 2 +- Utils.cs | 2 +- 9 files changed, 107 insertions(+), 243 deletions(-) delete mode 100644 Items/GLShot.cs delete mode 100644 Items/GrenadeLauncher.cs diff --git a/Config.cs b/Config.cs index 232fa92..73b3c11 100644 --- a/Config.cs +++ b/Config.cs @@ -1,4 +1,5 @@ using System.ComponentModel; +using Exiled.API.Enums; using Exiled.API.Interfaces; using ExtendedItems.Items; using InventorySystem.Items.Firearms.Attachments; @@ -13,8 +14,8 @@ public class Config : IConfig #region Config Settings - [Description("How Common Easter Eggs are")] - public float EasterEggsChance { get; set; } = 0.01f; + // [Description("How Common Easter Eggs are")] + // public float EasterEggsChance { get; set; } = 0.01f; [Description("Weather the Tranq is effective on Tutorials")] public bool EffectiveOnTutorials { get; set; } = false; @@ -23,6 +24,9 @@ public class Config : IConfig public AttachmentName[] ForcedSniperAttch { get; set; } = [AttachmentName.MuzzleBrake, AttachmentName.RecoilReducingStock, AttachmentName.RifleBody]; + [Description("The Places and Chance a C4 can Spawn")] + public Dictionary C4Spawns { get; set; } = new() { {LockerType.Scp500Pedestal, 70}, {LockerType.AntiScp207Pedestal, 1}, {LockerType.LargeGun, 39}}; + [Description("The Distance from Larry a player can be before they can no longer use SCP-1499")] public float LarryDistance { get; set; } = 10f; @@ -56,11 +60,12 @@ public class Config : IConfig public Coin Coin { get; set; } = new(); public Scp1499 Scp1499 { get; set; } = new(); - public GrenadeLauncher GrenadeLauncher { get; set; } = new(); + // public GLShot GLShot { get; set; } = new(); + // public GrenadeLauncher GrenadeLauncher { get; set; } = new(); public Sniper Sniper { get; set; } = new(); public Tranquilizer Tranquilizer { get; set; } = new(); public Plastic Plastic { get; set; } = new(); - public GLShot GLShot { get; set; } = new(); + #endregion } \ No newline at end of file diff --git a/EventHandler.cs b/EventHandler.cs index 1c2a9c3..63645a1 100644 --- a/EventHandler.cs +++ b/EventHandler.cs @@ -5,19 +5,19 @@ namespace ExtendedItems; public class EventHandler() { - private Random random = new(); - private bool HasProperFolder = Directory.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"..")); + // private Random random = new(); + // private bool HasProperFolder = Directory.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"..")); public static void OnGrenadeExploding(ExplodingGrenadeEventArgs ev) { foreach (var player in ev.TargetsToAffect.ToArray()) Utils.Grenade_Damage(ev.Projectile, player); } - public void OnLockerOpen(PlayerInteractedLockerEventArgs ev) - { - if (!Plugin.Instance.Config.EasterEggs) - { - return; - } - ev.Locker.Base._deniedBeep = - } + // public void OnLockerOpen(PlayerInteractedLockerEventArgs ev) + // { + // if (!Plugin.Instance.Config.EasterEggs) + // { + // return; + // } + // ev.Locker.Base._deniedBeep = + // } } \ No newline at end of file diff --git a/ExtendedItems.csproj b/ExtendedItems.csproj index fc11f35..e752e37 100644 --- a/ExtendedItems.csproj +++ b/ExtendedItems.csproj @@ -46,6 +46,9 @@ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Facepunch.Steamworks.Posix.dll + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Facepunch.Steamworks.Win64.dll + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Interop.dll @@ -106,9 +109,6 @@ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Net.Http.dll - - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Numerics.Vectors.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Runtime.dll @@ -127,9 +127,6 @@ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Text.Json.dll - - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Threading.Tasks.Extensions.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Transactions.dll @@ -417,8 +414,4 @@ - - - - diff --git a/Items/Coin.cs b/Items/Coin.cs index d844c4c..cfaf9f3 100644 --- a/Items/Coin.cs +++ b/Items/Coin.cs @@ -64,64 +64,72 @@ protected override void UnsubscribeEvents() private void OnFlippingCoin(FlippingCoinEventArgs ev) { if (!Check(ev.Item)) return; - - Timing.CallDelayed(2f, - () => - { - if (ev.IsTails) + if (ev.IsAllowed) + { + Timing.CallDelayed(2f, + () => { - if (ev.Player.ActiveEffects.Any(targetActiveEffect => - targetActiveEffect.name == nameof(EffectType.AntiScp207))) + if (ev.IsTails) { - Log.Debug($"{ev.Player.Nickname} had Anti-207"); - ev.Player.Explode(ProjectileType.FragGrenade, ev.Player); + if (ev.Player.ActiveEffects.Any(targetActiveEffect => + targetActiveEffect.name == nameof(EffectType.AntiScp207))) + { + Log.Debug($"{ev.Player.Nickname} had Anti-207"); + ev.Player.Explode(ProjectileType.FragGrenade, ev.Player); + } + else + { + Log.Debug("Coin Landed on tails"); + ev.Player.Scale = Vector3.zero; + Log.Debug($"Scaling {ev.Player.Nickname} to zero"); + + // ReSharper disable once InconsistentNaming + var _temp = Plugin.Instance?.Config.LoseCauses.RandomItem() ?? + ""; + + var cause = _temp.Any(char.IsWhiteSpace) + ? $"the words {_temp} are etched into the scalp" + : $"the word {_temp} is etched in the scalp"; + Ragdoll.CreateAndSpawn(ev.Player.Role.Type, + ev.Player.DisplayNickname, + new CustomReasonDamageHandler(cause), + ev.Player.Position, + ev.Player.Rotation, + ev.Player); + + ev.Player.IsGodModeEnabled = false; + + Log.Debug("Spawning Grenade"); + Utils.Exploding(ev.Player); + ev.Player.Kill(cause); + } } else { - Log.Debug("Coin Landed on tails"); - ev.Player.Scale = Vector3.zero; - Log.Debug($"Scaling {ev.Player.Nickname} to zero"); - - // ReSharper disable once InconsistentNaming - var _temp = Plugin.Instance?.Config.LoseCauses.RandomItem() ?? - ""; - - var cause = _temp.Any(char.IsWhiteSpace) - ? $"the words {_temp} are etched into the scalp" - : $"the word {_temp} is etched in the scalp"; - Ragdoll.CreateAndSpawn(ev.Player.Role.Type, - ev.Player.DisplayNickname, - new CustomReasonDamageHandler(cause), - ev.Player.Position, - ev.Player.Rotation, - ev.Player); - - ev.Player.IsGodModeEnabled = false; - - Log.Debug("Spawning Grenade"); - Utils.Exploding(ev.Player); - ev.Player.Kill(cause); + ev.Player.ShowHint($"{Plugin.Instance?.Config.WinHints.RandomItem()}"); + + if (ev.Player.Health + ev.Player.ArtificialHealth < ev.Player.MaxHealth / 2) + ev.Player.AddRegeneration(duration: 10, rate: 5); + else + Effects.ForEach(effect => + { + ev.Player.EnableEffect(effect.Type, + effect.Intensity, + effect.Duration, + true); + }); } - } - else - { - ev.Player.ShowHint($"{Plugin.Instance?.Config.WinHints.RandomItem()}"); + }); + ev.IsAllowed = false; - if (ev.Player.Health + ev.Player.ArtificialHealth < ev.Player.MaxHealth / 2) - ev.Player.AddRegeneration(duration: 10, rate: 5); - else - Effects.ForEach(effect => - { - ev.Player.EnableEffect(effect.Type, - effect.Intensity, - effect.Duration, - true); - }); - } - }); - ev.IsAllowed = false; - - Timing.CallDelayed(5f, () => { ev.IsAllowed = true; }); + Timing.CallDelayed(5f, () => { ev.IsAllowed = true; }); + } + else + { + ev.Player.ShowHint("Wait", 1f); + } + + } private static void OnRoleChanging(ChangingRoleEventArgs ev) diff --git a/Items/GLShot.cs b/Items/GLShot.cs deleted file mode 100644 index 8ce8606..0000000 --- a/Items/GLShot.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Exiled.API.Features.Attributes; -using Exiled.API.Features.Spawn; -using Exiled.CustomItems.API.Features; - -namespace ExtendedItems.Items; - -[CustomItem(ItemType.GrenadeHE)] -public class GLShot : CustomGrenade -{ - public override uint Id { get; set; } = 10; - public override string Name { get; set; } = "GLShot"; - public override string Description { get; set; } = "You shouldn't have this"; - public override float Weight { get; set; } = 100; - - public override SpawnProperties? SpawnProperties { get; set; } = new() - { - Limit = 0 - }; - - public override bool ExplodeOnCollision { get; set; } = false; - public override float FuseTime { get; set; } = 1000; -} \ No newline at end of file diff --git a/Items/GrenadeLauncher.cs b/Items/GrenadeLauncher.cs deleted file mode 100644 index a4ffc46..0000000 --- a/Items/GrenadeLauncher.cs +++ /dev/null @@ -1,112 +0,0 @@ -using Exiled.API.Enums; -using Exiled.API.Features.Attributes; -using Exiled.API.Features.Components; -using Exiled.API.Features.Pickups; -using Exiled.API.Features.Spawn; -using Exiled.CustomItems.API.Features; -using Exiled.Events.EventArgs.Item; -using Exiled.Events.EventArgs.Player; -using InventorySystem.Items.Firearms.Attachments; -using InventorySystem.Items.ThrowableProjectiles; -using MEC; -using UnityEngine; -using YamlDotNet.Serialization; - -namespace ExtendedItems.Items; - -[CustomItem(ItemType.GunLogicer)] -public class GrenadeLauncher : CustomWeapon -{ - private static bool _grenadeLaunchCoroutine; - public override uint Id { get; set; } = 5; - public override string Name { get; set; } = "Grenade Launcher"; - - public override string Description { get; set; } = - "A modified Chaos Insurgency LMG that fires High Explosive Grenades"; - - public override float Weight { get; set; } = 10f; - public override float Damage { get; set; } = 0f; - public override byte ClipSize { get; set; } = 1; - - - [YamlIgnore] - public override AttachmentName[] Attachments { get; set; } = - [AttachmentName.Laser, AttachmentName.IronSights, AttachmentName.ShortBarrel]; - - public override SpawnProperties? SpawnProperties { get; set; } = new() - - { - Limit = 1, - LockerSpawnPoints = - [ - new LockerSpawnPoint - { - Chance = 100, - Type = LockerType.ExperimentalWeapon, - UseChamber = true - } - ] - }; - - protected override void OnShooting(ShootingEventArgs ev) - { - bool? hasSpawn = TrySpawn(10, ev.Player.Position + new Vector3(0f, .25f, 0f), out var pickupBase); - - if (hasSpawn is true) - { - if (!_grenadeLaunchCoroutine) - { - var thrownProjectile = pickupBase!.GameObject.AddComponent(); - pickupBase.GameObject.AddComponent().Init(ev.Player.GameObject, thrownProjectile); - pickupBase.Rigidbody.linearVelocity = new Vector3(3f, .05f); - if (!_grenadeLaunchCoroutine) - { - _grenadeLaunchCoroutine = true; - Timing.RunCoroutine(GrenadeLaunch(pickupBase)); - } - } - else - { - ev.Player.ShowHint("Cant shoot yet", 5f); - } - } - else - { - ev.Player.ShowHint("Something messed up", 5f); - } - - - base.OnShooting(ev); - } - - protected override void OnChangingAttachment(ChangingAttachmentsEventArgs ev) - { - if (ev.NewAttachmentIdentifiers.Any(attachment => attachment.Name == AttachmentName.ShortBarrel)) - { - ev.IsAllowed = true; - } - else - { - ev.IsAllowed = false; - ev.Player.ShowHint("You need a Short Barrel because I said so :) -Noobest1001", 5f); - } - - base.OnChangingAttachment(ev); - } - - private static IEnumerator GrenadeLaunch(Pickup pickup) - { - if (pickup is not GrenadePickup) yield break; - while (true) - { - yield return Timing.WaitForSeconds(.5f); - - if (pickup.Rigidbody.linearVelocity.magnitude < .5f) - { - Utils.Explode(pickup, pickup.PreviousOwner); - _grenadeLaunchCoroutine = false; - yield break; - } - } - } -} \ No newline at end of file diff --git a/Items/Plastic.cs b/Items/Plastic.cs index 741f561..8f7fb1a 100644 --- a/Items/Plastic.cs +++ b/Items/Plastic.cs @@ -9,11 +9,13 @@ using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Map; using Exiled.Events.EventArgs.Player; -using Exiled.Events.EventArgs.Server; using InventorySystem.Items.ThrowableProjectiles; +using LabApi.Events.Arguments.ServerEvents; using UnityEngine; // shortcuted imports using PlayerEvent = Exiled.Events.Handlers.Player; +using Random = System.Random; +using RoundEndedEventArgs = Exiled.Events.EventArgs.Server.RoundEndedEventArgs; using ServerEvent = Exiled.Events.Handlers.Server; @@ -43,43 +45,33 @@ public enum C4RemoveMethod private static Dictionary Charges { get; } = []; public static Plastic Instance { get; private set; } = null!; + public readonly int Limit = 1; + public override SpawnProperties? SpawnProperties { get; set; } = new() { - Limit = 1, - LockerSpawnPoints = - [ - new LockerSpawnPoint - { - Chance = 50, - Zone = ZoneType.LightContainment, - Type = LockerType.Scp500Pedestal, - UseChamber = true - }, - new LockerSpawnPoint - { - Chance = 4, - Zone = ZoneType.HeavyContainment, - Type = LockerType.Scp500Pedestal, - UseChamber = true - }, - new LockerSpawnPoint - { - Chance = 1, - Type = LockerType.AntiScp207Pedestal, - UseChamber = true - }, - new LockerSpawnPoint - { - Chance = 45, - Zone = ZoneType.HeavyContainment, - Type = LockerType.LargeGun, - UseChamber = true - } - ] + Limit = 0, }; public override ItemType Type { get; set; } = ItemType.GrenadeHE; + private readonly Dictionary Fallback = new() { {LockerType.Scp500Pedestal, 70}, {LockerType.AntiScp207Pedestal, 1}, {LockerType.LargeGun, 39}}; + + protected int[] NormalizeC4() + { + var NonNormalized = Plugin.Instance.Config.C4Spawns.Values.ToArray(); + var Max = NonNormalized.Sum(); + int[] Normalized = new int[NonNormalized.Length]; + int x = 0; + + foreach (var chance in NonNormalized) + { + Normalized[x] = chance / Max; + } + Random rand = new(); + double Roll = rand.NextDouble() * Max; + + } + public void Handler(Pickup? charge, C4RemoveMethod method = C4RemoveMethod.Drop, Player? detonator = null) { if (charge is null) return; diff --git a/Plugin.cs b/Plugin.cs index a39913b..eecfc20 100644 --- a/Plugin.cs +++ b/Plugin.cs @@ -17,7 +17,7 @@ public class Plugin : Plugin private List? _settings; public override string Name => "Extended Items"; public override string Author => "Noobest1001"; - public override Version Version => new(4, 0, 0, 1); + public override Version Version => new(4, 0, 0); public override Version RequiredExiledVersion => new(9, 14, 2); public override void OnEnabled() diff --git a/Utils.cs b/Utils.cs index 62fe67e..b308f00 100644 --- a/Utils.cs +++ b/Utils.cs @@ -19,7 +19,7 @@ public static class Utils /// /// /// Vector3 - public static UnityEngine.Vector3 GetGlobalCords(RoomType roomType, Vector3 localPos) + public static Vector3 GetGlobalCords(RoomType roomType, Vector3 localPos) { var room = Room.Get(roomType); From 30f6129f37af416b832048ddb029b982d52e548e Mon Sep 17 00:00:00 2001 From: Noobest1001 Date: Sun, 2 Aug 2026 17:45:21 -0400 Subject: [PATCH 5/9] Work --- .gitignore | 1 + Config.cs | 12 ++ EventHandler.cs | 7 +- ExtendedItems.csproj | 280 +++++++++++++++++++++++-------------------- Items/Coin.cs | 18 ++- Items/Plastic.cs | 45 +++++-- Utils.cs | 69 +++++++++++ 7 files changed, 285 insertions(+), 147 deletions(-) diff --git a/.gitignore b/.gitignore index 45e07f2..6ce7cf1 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ refs/ *.user .sln .vs/ +ExtendedItems.csproj diff --git a/Config.cs b/Config.cs index 73b3c11..7a0e479 100644 --- a/Config.cs +++ b/Config.cs @@ -29,6 +29,18 @@ public class Config : IConfig [Description("The Distance from Larry a player can be before they can no longer use SCP-1499")] public float LarryDistance { get; set; } = 10f; + + [Description("The color that glows from where SCP-1289 is")] + public string SCP1289Color { get; set; } = "White"; + + [Description("How long it takes for the glow effect to start around SCP-1289 (in seconds)")] + public float SCP1289Timer { get; set; } = 10f; + + [Description("How far should the Hint light for SCP-1289 should reach")] + public float SCP1289LightRange { get; set; } = 10f; + + [Description("How long it take for the glow effect to reach full intensity (in seconds)")] + public float TimeToFullGlow { get; set; } = 60f; [Description("The possable hints shown when you Win")] public string[] WinHints { get; set; } = diff --git a/EventHandler.cs b/EventHandler.cs index 63645a1..adcb7ec 100644 --- a/EventHandler.cs +++ b/EventHandler.cs @@ -1,5 +1,5 @@ using Exiled.Events.EventArgs.Map; -using LabApi.Events.Arguments.PlayerEvents; +using MapGeneration.Distributors; namespace ExtendedItems; @@ -20,4 +20,9 @@ public static void OnGrenadeExploding(ExplodingGrenadeEventArgs ev) // } // ev.Locker.Base._deniedBeep = // } + + public void OnStructureSpawn(ItemDistributor ev) + { + ev.PlaceSpawnables(); + } } \ No newline at end of file diff --git a/ExtendedItems.csproj b/ExtendedItems.csproj index e752e37..e3640ef 100644 --- a/ExtendedItems.csproj +++ b/ExtendedItems.csproj @@ -23,395 +23,411 @@ - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp-firstpass.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp-firstpass.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\BouncyCastle.Cryptography.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\BouncyCastle.Cryptography.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Caress.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Caress.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\CommandSystem.Core.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\CommandSystem.Core.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\CustomPasses.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\CustomPasses.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\DnsClient.dll - - - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Facepunch.Steamworks.Posix.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\DnsClient.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Facepunch.Steamworks.Win64.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Facepunch.Steamworks.Win64.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Interop.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Interop.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\LabApi.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\LabApi.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Microsoft.Bcl.AsyncInterfaces.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Microsoft.Bcl.AsyncInterfaces.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.Components.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.Components.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mono.Security.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mono.Security.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\netstandard.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\netstandard.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\NorthwoodLib.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\NorthwoodLib.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Pooling.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Pooling.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Snake.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Snake.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Buffers.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Buffers.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Collections.Immutable.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Collections.Immutable.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.ComponentModel.Composition.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.ComponentModel.Composition.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Configuration.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Configuration.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Data.DataSetExtensions.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Data.DataSetExtensions.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.EnterpriseServices.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.EnterpriseServices.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.IO.Compression.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.IO.Compression.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.IO.Pipelines.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.IO.Pipelines.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Memory.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Memory.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Net.Http.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Net.Http.dll + + + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Numerics.Vectors.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Runtime.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Runtime.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Runtime.CompilerServices.Unsafe.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Runtime.CompilerServices.Unsafe.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Security.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Security.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.ServiceModel.Internals.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.ServiceModel.Internals.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Text.Encodings.Web.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Text.Encodings.Web.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Text.Json.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Text.Json.dll + + + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Threading.Tasks.Extensions.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Transactions.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Transactions.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Burst.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Burst.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Burst.Unsafe.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Burst.Unsafe.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Collections.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Collections.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Collections.LowLevel.ILSupport.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Collections.LowLevel.ILSupport.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Mathematics.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Mathematics.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Csg.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Csg.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.KdTree.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.KdTree.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Poly2Tri.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Poly2Tri.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Stl.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Stl.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Rendering.LightTransport.Runtime.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Rendering.LightTransport.Runtime.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.Runtime.Shared.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.Runtime.Shared.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.ShaderLibrary.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.ShaderLibrary.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.GPUDriven.Runtime.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.GPUDriven.Runtime.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.HighDefinition.Config.Runtime.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.HighDefinition.Config.Runtime.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.HighDefinition.Runtime.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.HighDefinition.Runtime.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.TextMeshPro.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.TextMeshPro.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.VisualEffectGraph.Runtime.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.VisualEffectGraph.Runtime.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AccessibilityModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AccessibilityModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AIModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AIModule.dll + + + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AMDModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AndroidJNIModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AndroidJNIModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AnimationModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AnimationModule.dll + + + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ARModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AssetBundleModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AssetBundleModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AudioModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AudioModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClothModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClothModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClusterInputModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClusterInputModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClusterRendererModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClusterRendererModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ContentLoadModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ContentLoadModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CrashReportingModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CrashReportingModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.DirectorModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.DirectorModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.DSPGraphModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.DSPGraphModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GameCenterModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GameCenterModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GIModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GIModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GraphicsStateCollectionSerializerModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GraphicsStateCollectionSerializerModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GridModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GridModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.HierarchyCoreModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.HierarchyCoreModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.HotReloadModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.HotReloadModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ImageConversionModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ImageConversionModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.IMGUIModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.IMGUIModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputForUIModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputForUIModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputLegacyModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputLegacyModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.JSONSerializeModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.JSONSerializeModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.LocalizationModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.LocalizationModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.MarshallingModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.MarshallingModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.MultiplayerModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.MultiplayerModule.dll + + + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.NVIDIAModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ParticleSystemModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ParticleSystemModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PerformanceReportingModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PerformanceReportingModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.Physics2DModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.Physics2DModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PhysicsModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PhysicsModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PropertiesModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PropertiesModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ScreenCaptureModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ScreenCaptureModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ShaderVariantAnalyticsModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ShaderVariantAnalyticsModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SharedInternalsModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SharedInternalsModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SpriteMaskModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SpriteMaskModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SpriteShapeModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SpriteShapeModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.StreamingModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.StreamingModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SubstanceModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SubstanceModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SubsystemsModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SubsystemsModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TerrainModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TerrainModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TerrainPhysicsModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TerrainPhysicsModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextCoreFontEngineModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextCoreFontEngineModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextCoreTextEngineModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextCoreTextEngineModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextRenderingModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextRenderingModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TilemapModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TilemapModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TLSModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TLSModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UI.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UI.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UIElementsModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UIElementsModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UIModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UIModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UmbraModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UmbraModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityAnalyticsCommonModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityAnalyticsCommonModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityAnalyticsModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityAnalyticsModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityConnectModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityConnectModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityCurlModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityCurlModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityTestProtocolModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityTestProtocolModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestAssetBundleModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestAssetBundleModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestAudioModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestAudioModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VehiclesModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VehiclesModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VFXModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VFXModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VideoModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VideoModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VirtualTexturingModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VirtualTexturingModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VRModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VRModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.WindModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.WindModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.XRModule.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.XRModule.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\YamlDotNet.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\YamlDotNet.dll - ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\zxing.dll + ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\zxing.dll + + + + diff --git a/Items/Coin.cs b/Items/Coin.cs index cfaf9f3..4dd54b2 100644 --- a/Items/Coin.cs +++ b/Items/Coin.cs @@ -2,6 +2,7 @@ using Exiled.API.Enums; using Exiled.API.Features; using Exiled.API.Features.Attributes; +using Exiled.API.Features.Items; using Exiled.API.Features.Spawn; using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Player; @@ -20,6 +21,7 @@ public class Coin : CustomItem public override uint Id { get; set; } = 4; public override string Description { get; set; } = "\"What's the most you ever lost on a coin toss?\""; public override float Weight { get; set; } = 1f; + private CoroutineHandle _handler; public override SpawnProperties? SpawnProperties { get; set; } = new() { @@ -39,10 +41,10 @@ public class Coin : CustomItem [Description("Effects to give if coin landed on heads.")] private static CoinEffect[] Effects => [ - new() { Type = EffectType.DamageReduction, Duration = 15, Intensity = 75 }, + new() { Type = EffectType.DamageReduction, Duration = 15, Intensity = 20 }, new() { Type = EffectType.RainbowTaste, Duration = 15, Intensity = byte.MaxValue }, new() { Type = EffectType.Invigorated, Duration = 15, Intensity = byte.MaxValue }, - new() { Type = EffectType.MovementBoost, Duration = 15, Intensity = 75 } + new() { Type = EffectType.MovementBoost, Duration = 15, Intensity = 25 } ]; protected override void SubscribeEvents() @@ -132,6 +134,18 @@ private void OnFlippingCoin(FlippingCoinEventArgs ev) } + protected override void OnDroppingItem(DroppingItemEventArgs ev) + { + Utils.CoinHintHandler(ev.Item.CreatePickup(ev.Player.Position, ev.Player.Rotation, false), out _handler); + base.OnDroppingItem(ev); + } + + protected override void OnAcquired(Player player, Item item, bool displayMessage) + { + if (_handler.IsValid) Timing.KillCoroutines(_handler); + base.OnAcquired(player, item, displayMessage); + } + private static void OnRoleChanging(ChangingRoleEventArgs ev) { ev.Player.Scale = Vector3.one; diff --git a/Items/Plastic.cs b/Items/Plastic.cs index 8f7fb1a..617f1ca 100644 --- a/Items/Plastic.cs +++ b/Items/Plastic.cs @@ -10,7 +10,7 @@ using Exiled.Events.EventArgs.Map; using Exiled.Events.EventArgs.Player; using InventorySystem.Items.ThrowableProjectiles; -using LabApi.Events.Arguments.ServerEvents; +using MapGeneration.Distributors; using UnityEngine; // shortcuted imports using PlayerEvent = Exiled.Events.Handlers.Player; @@ -54,24 +54,45 @@ public enum C4RemoveMethod public override ItemType Type { get; set; } = ItemType.GrenadeHE; - private readonly Dictionary Fallback = new() { {LockerType.Scp500Pedestal, 70}, {LockerType.AntiScp207Pedestal, 1}, {LockerType.LargeGun, 39}}; + private readonly Dictionary _c4Spawns = Plugin.Instance.Config.C4Spawns ?? + new Dictionary + { + { LockerType.Scp500Pedestal, 70 }, + { LockerType.AntiScp207Pedestal, 1 }, + { LockerType.LargeGun, 39 } + }; - protected int[] NormalizeC4() + protected LockerType NormalizeC4() { - var NonNormalized = Plugin.Instance.Config.C4Spawns.Values.ToArray(); - var Max = NonNormalized.Sum(); - int[] Normalized = new int[NonNormalized.Length]; + var nonNormalized = Plugin.Instance.Config.C4Spawns.Values.ToArray(); + var Max = nonNormalized.Sum(); + var Normalized = new int[nonNormalized.Length]; int x = 0; - foreach (var chance in NonNormalized) + Random rand = new(); + + double Roll = rand.Next(0, Max); + foreach (KeyValuePair place in _c4Spawns) { - Normalized[x] = chance / Max; + if (Roll < place.Value) return place.Key; + + Roll -= place.Value; } - Random rand = new(); - double Roll = rand.NextDouble() * Max; - + + foreach (var locker in Locker.) + + return LockerType.Scp500Pedestal; } - + + private void OnSpawningItem(SpawningItemEventArgs ev) + { + } + + public override Pickup? Spawn(Vector3 position, Player? previousOwner = null) + { + return base.Spawn(position, previousOwner); + } + public void Handler(Pickup? charge, C4RemoveMethod method = C4RemoveMethod.Drop, Player? detonator = null) { if (charge is null) return; diff --git a/Utils.cs b/Utils.cs index b308f00..014372f 100644 --- a/Utils.cs +++ b/Utils.cs @@ -2,10 +2,12 @@ using Exiled.API.Enums; using Exiled.API.Features.Items; using Exiled.API.Features.Pickups.Projectiles; +using MEC; using PlayerRoles; using UnityEngine; using EP = Exiled.API.Features.Player; using Item = Exiled.API.Features.Items.Item; +using LightSourceToy = LabApi.Features.Wrappers.LightSourceToy; using Pickup = Exiled.API.Features.Pickups.Pickup; using Room = Exiled.API.Features.Room; @@ -98,4 +100,71 @@ public static void Explode(Pickup? grenade, EP player) explosiveGrenade.SpawnActive(pos, player); } } + + // For when the Coin hasn't been picked up for a set amount of time + public static void CoinHintHandler(Pickup pickup, out CoroutineHandle handle) + { + var glowCoroutine = Timing.RunCoroutine(CoinCoroutine(pickup)); + handle = glowCoroutine; + } + + private static Color ParseConfigColor() + { + var color = Plugin.Instance.Config.SCP1289Color; + var fallback = Color.white; + if (color[0] == '#') + try + { + var temp = Enumerable.Range(1, color.Length) + .Where(x => x % 2 == 0) + .Select(x => Convert.ToByte(color.Substring(x, 2), 16)) + .ToArray(); + fallback = new Color(temp[0], temp[1], temp[2]); + } + catch (Exception e) + { + return fallback; + } + else + switch (color.ToLower()) + { + case "red": + return Color.red; + case "yellow": + return Color.yellow; + case "green": + return Color.green; + case "blue": + return Color.blue; + case "cyan": + return Color.cyan; + case "magenta": + return Color.magenta; + case "black": + return Color.black; + case "gray": + return Color.gray; + } + + return fallback; + } + + private static IEnumerator CoinCoroutine(Pickup pickup) + { + yield return Timing.WaitForSeconds(Plugin.Instance.Config.SCP1289Timer); + var intensity = 0; + var light = LightSourceToy.Create(new Vector3(0, 0, 0), pickup.Rotation, pickup.Transform, false); + light.Color = ParseConfigColor(); + light.Range = Plugin.Instance.Config.SCP1289LightRange; + light.Type = LightType.Tube; + light.ShadowStrength = .5f; + light. + + while (intensity != 100) + { + light.Intensity = intensity; + yield return Timing.WaitForSeconds(Plugin.Instance.Config.TimeToFullGlow / 100); + intensity++; + } + } } \ No newline at end of file From 95de35f70eca9b324f9b1b5e88ee9bfb16d72431 Mon Sep 17 00:00:00 2001 From: noobest1001 Date: Sun, 2 Aug 2026 21:20:13 -0400 Subject: [PATCH 6/9] Made some changes for Work again :\ --- .gitignore | 1 + ExtendedItems.csproj | 796 +++++++++++++++++++++---------------------- Items/Plastic.cs | 9 +- Ssss.cs | 4 +- Utils.cs | 11 +- 5 files changed, 406 insertions(+), 415 deletions(-) diff --git a/.gitignore b/.gitignore index 6ce7cf1..c9563d8 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ refs/ .sln .vs/ ExtendedItems.csproj + diff --git a/ExtendedItems.csproj b/ExtendedItems.csproj index e3640ef..d0d3c04 100644 --- a/ExtendedItems.csproj +++ b/ExtendedItems.csproj @@ -22,412 +22,396 @@ - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp-firstpass.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\BouncyCastle.Cryptography.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Caress.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\CommandSystem.Core.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\CustomPasses.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\DnsClient.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Facepunch.Steamworks.Win64.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Interop.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\LabApi.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Microsoft.Bcl.AsyncInterfaces.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.Components.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mono.Security.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\netstandard.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\NorthwoodLib.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Pooling.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Snake.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Buffers.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Collections.Immutable.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.ComponentModel.Composition.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Configuration.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Data.DataSetExtensions.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.EnterpriseServices.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.IO.Compression.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.IO.Pipelines.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Memory.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Net.Http.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Numerics.Vectors.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Runtime.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Runtime.CompilerServices.Unsafe.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Security.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.ServiceModel.Internals.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Text.Encodings.Web.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Text.Json.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Threading.Tasks.Extensions.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Transactions.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Burst.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Burst.Unsafe.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Collections.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Collections.LowLevel.ILSupport.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Mathematics.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Csg.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.KdTree.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Poly2Tri.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Stl.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Rendering.LightTransport.Runtime.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.Runtime.Shared.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.ShaderLibrary.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.GPUDriven.Runtime.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.HighDefinition.Config.Runtime.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.HighDefinition.Runtime.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.TextMeshPro.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.VisualEffectGraph.Runtime.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AccessibilityModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AIModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AMDModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AndroidJNIModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AnimationModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ARModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AssetBundleModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AudioModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClothModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClusterInputModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClusterRendererModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ContentLoadModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CrashReportingModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.DirectorModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.DSPGraphModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GameCenterModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GIModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GraphicsStateCollectionSerializerModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GridModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.HierarchyCoreModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.HotReloadModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ImageConversionModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.IMGUIModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputForUIModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputLegacyModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.JSONSerializeModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.LocalizationModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.MarshallingModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.MultiplayerModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.NVIDIAModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ParticleSystemModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PerformanceReportingModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.Physics2DModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PhysicsModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PropertiesModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ScreenCaptureModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ShaderVariantAnalyticsModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SharedInternalsModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SpriteMaskModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SpriteShapeModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.StreamingModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SubstanceModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SubsystemsModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TerrainModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TerrainPhysicsModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextCoreFontEngineModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextCoreTextEngineModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextRenderingModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TilemapModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TLSModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UI.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UIElementsModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UIModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UmbraModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityAnalyticsCommonModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityAnalyticsModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityConnectModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityCurlModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityTestProtocolModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestAssetBundleModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestAudioModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VehiclesModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VFXModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VideoModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VirtualTexturingModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VRModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.WindModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.XRModule.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\YamlDotNet.dll - - - ..\..\..\..\Program Files (x86)\Steam\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\zxing.dll - - - - - + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp-firstpass.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\BouncyCastle.Cryptography.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Caress.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\CommandSystem.Core.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\CustomPasses.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\DnsClient.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Facepunch.Steamworks.Posix.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Facepunch.Steamworks.Win64.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Interop.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\LabApi.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Microsoft.Bcl.AsyncInterfaces.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mirror.Components.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Mono.Security.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\netstandard.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\NorthwoodLib.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Pooling.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Snake.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Buffers.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Collections.Immutable.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.ComponentModel.Composition.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Configuration.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Data.DataSetExtensions.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.EnterpriseServices.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.IO.Compression.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.IO.Pipelines.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Memory.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Net.Http.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Runtime.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Runtime.CompilerServices.Unsafe.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Security.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.ServiceModel.Internals.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Text.Encodings.Web.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Text.Json.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\System.Transactions.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Burst.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Burst.Unsafe.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Collections.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Collections.LowLevel.ILSupport.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Mathematics.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Csg.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.KdTree.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Poly2Tri.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.ProBuilder.Stl.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Rendering.LightTransport.Runtime.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.Runtime.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.Runtime.Shared.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.ShaderLibrary.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.GPUDriven.Runtime.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.HighDefinition.Config.Runtime.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.HighDefinition.Runtime.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.TextMeshPro.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.VisualEffectGraph.Runtime.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AccessibilityModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AIModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AndroidJNIModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AnimationModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AssetBundleModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.AudioModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClothModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClusterInputModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ClusterRendererModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ContentLoadModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CoreModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.CrashReportingModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.DirectorModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.DSPGraphModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GameCenterModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GIModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GraphicsStateCollectionSerializerModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GridModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.HierarchyCoreModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.HotReloadModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ImageConversionModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.IMGUIModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputForUIModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputLegacyModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.JSONSerializeModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.LocalizationModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.MarshallingModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.MultiplayerModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ParticleSystemModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PerformanceReportingModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.Physics2DModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PhysicsModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PropertiesModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ScreenCaptureModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ShaderVariantAnalyticsModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SharedInternalsModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SpriteMaskModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SpriteShapeModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.StreamingModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SubstanceModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.SubsystemsModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TerrainModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TerrainPhysicsModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextCoreFontEngineModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextCoreTextEngineModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TextRenderingModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TilemapModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.TLSModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UI.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UIElementsModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UIModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UmbraModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityAnalyticsCommonModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityAnalyticsModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityConnectModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityCurlModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityTestProtocolModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestAssetBundleModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestAudioModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestTextureModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.UnityWebRequestWWWModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VehiclesModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VFXModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VideoModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VirtualTexturingModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.VRModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.WindModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.XRModule.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\YamlDotNet.dll + + + ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\zxing.dll + diff --git a/Items/Plastic.cs b/Items/Plastic.cs index 617f1ca..ff3d232 100644 --- a/Items/Plastic.cs +++ b/Items/Plastic.cs @@ -12,6 +12,7 @@ using InventorySystem.Items.ThrowableProjectiles; using MapGeneration.Distributors; using UnityEngine; + // shortcuted imports using PlayerEvent = Exiled.Events.Handlers.Player; using Random = System.Random; @@ -79,18 +80,14 @@ protected LockerType NormalizeC4() Roll -= place.Value; } - foreach (var locker in Locker.) + foreach (var locker in Locker) return LockerType.Scp500Pedestal; } private void OnSpawningItem(SpawningItemEventArgs ev) { - } - - public override Pickup? Spawn(Vector3 position, Player? previousOwner = null) - { - return base.Spawn(position, previousOwner); + } public void Handler(Pickup? charge, C4RemoveMethod method = C4RemoveMethod.Drop, Player? detonator = null) diff --git a/Ssss.cs b/Ssss.cs index 614fa21..bf00dfc 100644 --- a/Ssss.cs +++ b/Ssss.cs @@ -22,7 +22,9 @@ public static void Register() new HeaderSetting(10, "Cactus Patch", "o/", true), new KeybindSetting(24, "C4 Detonation", KeyCode.Delete, hintDescription: "Explodes all C4 placed by you") ]; - SettingBase.Register(_settings.ToArray()); + SettingBase.Register([ + .. _settings + ]); } public static void Unregister() diff --git a/Utils.cs b/Utils.cs index 014372f..4727986 100644 --- a/Utils.cs +++ b/Utils.cs @@ -15,6 +15,7 @@ namespace ExtendedItems; public static class Utils { + private static Dictionary Lights = []; /// /// Calculates the global coords of a point inside a room based on the room type and the location /// @@ -154,17 +155,23 @@ private static IEnumerator CoinCoroutine(Pickup pickup) yield return Timing.WaitForSeconds(Plugin.Instance.Config.SCP1289Timer); var intensity = 0; var light = LightSourceToy.Create(new Vector3(0, 0, 0), pickup.Rotation, pickup.Transform, false); + Lights.Add(light, pickup.Serial); + light.Color = ParseConfigColor(); light.Range = Plugin.Instance.Config.SCP1289LightRange; light.Type = LightType.Tube; light.ShadowStrength = .5f; - light. - + light.Intensity = intensity; + light.Parent = pickup.Transform; + + light.Spawn(); + while (intensity != 100) { light.Intensity = intensity; yield return Timing.WaitForSeconds(Plugin.Instance.Config.TimeToFullGlow / 100); intensity++; } + } } \ No newline at end of file From e3975e4dd466df824eca8b309d3b3ba4fcc4a168 Mon Sep 17 00:00:00 2001 From: Noobest1001 Date: Mon, 10 Aug 2026 05:33:26 -0400 Subject: [PATCH 7/9] will I be free of the angish that Linux and Windows brings me? --- .gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c9563d8..59408ad 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,4 @@ refs/ *.user .sln .vs/ -ExtendedItems.csproj - +./ExtendedItems.csproj From ef8a7f46663d1e2c9bf558883a7d5dfdc4dcc768 Mon Sep 17 00:00:00 2001 From: Noobest1001 Date: Wed, 19 Aug 2026 01:24:16 -0400 Subject: [PATCH 8/9] Updated various items and features for better compatibility and functionality. Added `IGlowEffect` interface, implemented various item changes, optimized spawn handling, updated config options, and refactored grenade handling and locker spawning logic. --- .gitignore | 1 - API/Interface/IGlowEffect.cs | 16 ++++ Config.cs | 3 + EventHandler.cs | 23 ++---- Items/Coin.cs | 85 ++++++++++++++++++-- Items/Plastic.cs | 95 +++++++++++++---------- Items/Scp1499.cs | 31 ++++---- Items/Sniper.cs | 92 ++++++++++++++++++++-- Items/Tranquilizer.cs | 24 +++--- Utils.cs | 146 +++++++++++++++++++++++------------ 10 files changed, 374 insertions(+), 142 deletions(-) create mode 100644 API/Interface/IGlowEffect.cs diff --git a/.gitignore b/.gitignore index 59408ad..45e07f2 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,3 @@ refs/ *.user .sln .vs/ -./ExtendedItems.csproj diff --git a/API/Interface/IGlowEffect.cs b/API/Interface/IGlowEffect.cs new file mode 100644 index 0000000..20339d0 --- /dev/null +++ b/API/Interface/IGlowEffect.cs @@ -0,0 +1,16 @@ +using Exiled.API.Features.Pickups; + +namespace ExtendedItems.API.Interface; + +public interface IGlowEffect +{ + public abstract byte LightId { get; init; } + + public abstract byte Intensity { get; set; } + + public abstract Pickup? Parent { get; set; } + + public abstract void Create(Pickup pickup); + + public abstract void Remove(Pickup pickup); +} \ No newline at end of file diff --git a/Config.cs b/Config.cs index 7a0e479..fe2388b 100644 --- a/Config.cs +++ b/Config.cs @@ -41,6 +41,9 @@ public class Config : IConfig [Description("How long it take for the glow effect to reach full intensity (in seconds)")] public float TimeToFullGlow { get; set; } = 60f; + + [Description("Wether a player that is shot in the head with Sniper when they have heavy armor will have 207?")] + public bool HeadRemove207 { get; set; } = true; [Description("The possable hints shown when you Win")] public string[] WinHints { get; set; } = diff --git a/EventHandler.cs b/EventHandler.cs index adcb7ec..8afc3f1 100644 --- a/EventHandler.cs +++ b/EventHandler.cs @@ -1,28 +1,19 @@ -using Exiled.Events.EventArgs.Map; -using MapGeneration.Distributors; +using Exiled.API.Enums; +using Exiled.Events.EventArgs.Map; namespace ExtendedItems; -public class EventHandler() +public class EventHandler { - // private Random random = new(); - // private bool HasProperFolder = Directory.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"..")); public static void OnGrenadeExploding(ExplodingGrenadeEventArgs ev) { foreach (var player in ev.TargetsToAffect.ToArray()) Utils.Grenade_Damage(ev.Projectile, player); } - // public void OnLockerOpen(PlayerInteractedLockerEventArgs ev) - // { - // if (!Plugin.Instance.Config.EasterEggs) - // { - // return; - // } - // ev.Locker.Base._deniedBeep = - // } - - public void OnStructureSpawn(ItemDistributor ev) + public void OnFillingLockers(FillingLockerEventArgs ev) { - ev.PlaceSpawnables(); + if (ev.Pickup.Type == ItemType.GrenadeHE) + ev.Chamber.RequiredPermissions = KeycardPermissions.ArmoryLevelThree | + KeycardPermissions.ContainmentLevelTwo | KeycardPermissions.ExitGates; } } \ No newline at end of file diff --git a/Items/Coin.cs b/Items/Coin.cs index 4dd54b2..8800002 100644 --- a/Items/Coin.cs +++ b/Items/Coin.cs @@ -2,26 +2,40 @@ using Exiled.API.Enums; using Exiled.API.Features; using Exiled.API.Features.Attributes; -using Exiled.API.Features.Items; using Exiled.API.Features.Spawn; using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Player; +using ExtendedItems.API.Interface; using ExtendedItems.Types; +using LabApi.Features.Wrappers; using MEC; using PlayerStatsSystem; using UnityEngine; +using Item = Exiled.API.Features.Items.Item; +using Pickup = Exiled.API.Features.Pickups.Pickup; +using Player = Exiled.API.Features.Player; using PlayerEvents = Exiled.Events.Handlers.Player; +using Ragdoll = Exiled.API.Features.Ragdoll; namespace ExtendedItems.Items; [CustomItem(ItemType.Coin)] -public class Coin : CustomItem +public class Coin : CustomItem, IGlowEffect { + // Exiled's API 🤮 (all jokes) public override string Name { get; set; } = "SCP-1289"; public override uint Id { get; set; } = 4; public override string Description { get; set; } = "\"What's the most you ever lost on a coin toss?\""; public override float Weight { get; set; } = 1f; + + // My API for shits and giggles :) + public Pickup? Parent { get; set; } + public byte Intensity { get; set; } = 0; + public byte LightId { get; init; } + + private CoroutineHandle _handler; + internal LightSourceToy? _lightSourceToy; public override SpawnProperties? SpawnProperties { get; set; } = new() { @@ -38,6 +52,31 @@ public class Coin : CustomItem ] }; + public void Create(Pickup pickup) + { + LightId = + _lightSourceToy = LightSourceToy.Create(pickup.Transform, false); + } + + public void Remove(Pickup pickup) + { + _lightSourceToy?.Destroy(); + } + + ~Coin() + { + if (Parent is not null) Remove(Parent); + Parent = null; + if (_handler.IsValid) Timing.KillCoroutines(_handler); + _handler = default; + } + + public override Pickup? Spawn(Vector3 position, Player? previousOwner = null) + { + Parent = base.Spawn(position, previousOwner); + return Parent; + } + [Description("Effects to give if coin landed on heads.")] private static CoinEffect[] Effects => [ @@ -51,6 +90,7 @@ protected override void SubscribeEvents() { PlayerEvents.FlippingCoin += OnFlippingCoin; PlayerEvents.ChangingRole += OnRoleChanging; + PlayerEvents.ItemAdded += ItemAdded; base.SubscribeEvents(); } @@ -59,10 +99,17 @@ protected override void UnsubscribeEvents() { PlayerEvents.FlippingCoin -= OnFlippingCoin; PlayerEvents.ChangingRole -= OnRoleChanging; + PlayerEvents.ItemAdded -= ItemAdded; base.UnsubscribeEvents(); } + private void ItemAdded(ItemAddedEventArgs ev) + { + if (!Check(ev.Item)) return; + Utils.RemoveLight(ev.Item.CreatePickup(ev.Player.Position, ev.Player.Rotation, false)); + } + private void OnFlippingCoin(FlippingCoinEventArgs ev) { if (!Check(ev.Item)) return; @@ -78,6 +125,7 @@ private void OnFlippingCoin(FlippingCoinEventArgs ev) { Log.Debug($"{ev.Player.Nickname} had Anti-207"); ev.Player.Explode(ProjectileType.FragGrenade, ev.Player); + ev.Player.DisableEffect(EffectType.AntiScp207); } else { @@ -130,25 +178,50 @@ private void OnFlippingCoin(FlippingCoinEventArgs ev) { ev.Player.ShowHint("Wait", 1f); } - - } protected override void OnDroppingItem(DroppingItemEventArgs ev) { - Utils.CoinHintHandler(ev.Item.CreatePickup(ev.Player.Position, ev.Player.Rotation, false), out _handler); + if (!Check(ev.Item)) return; + CoinHintHandler(ev.Item.CreatePickup(ev.Player.Position, ev.Player.Rotation, false), out _handler); base.OnDroppingItem(ev); } protected override void OnAcquired(Player player, Item item, bool displayMessage) { + if (!Check(item)) return; if (_handler.IsValid) Timing.KillCoroutines(_handler); + _lightSourceToy.Destroy(); base.OnAcquired(player, item, displayMessage); } - private static void OnRoleChanging(ChangingRoleEventArgs ev) + private void OnRoleChanging(ChangingRoleEventArgs ev) { ev.Player.Scale = Vector3.one; ev.Player.DisableAllEffects(); } + + private static IEnumerator CoinCoroutine(Pickup pickup) + { + yield return Timing.WaitForSeconds(Plugin.Instance.Config.SCP1289Timer); + var intensity = 0; + var light = LightSourceToy.Create(pickup.Position, pickup.Rotation, pickup.Transform, false); + light.Color = Utils.ParseConfigColor(); + light.Range = Plugin.Instance.Config.SCP1289LightRange; + light.Type = LightType.Tube; + light.ShadowStrength = .5f; + + while (intensity != 100) + { + light.Intensity = intensity; + yield return Timing.WaitForSeconds(Plugin.Instance.Config.TimeToFullGlow / 100); + intensity++; + } + } + + private static void CoinHintHandler(Pickup pickup, out CoroutineHandle handle) + { + var glowCoroutine = Timing.RunCoroutine(CoinCoroutine(pickup)); + handle = glowCoroutine; + } } \ No newline at end of file diff --git a/Items/Plastic.cs b/Items/Plastic.cs index ff3d232..35a0a14 100644 --- a/Items/Plastic.cs +++ b/Items/Plastic.cs @@ -9,21 +9,20 @@ using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Map; using Exiled.Events.EventArgs.Player; +using ExtendedItems.API.Interface; using InventorySystem.Items.ThrowableProjectiles; -using MapGeneration.Distributors; using UnityEngine; +using Map = Exiled.Events.Handlers.Map; -// shortcuted imports +// shortened imports using PlayerEvent = Exiled.Events.Handlers.Player; -using Random = System.Random; using RoundEndedEventArgs = Exiled.Events.EventArgs.Server.RoundEndedEventArgs; using ServerEvent = Exiled.Events.Handlers.Server; - namespace ExtendedItems.Items; [CustomItem(ItemType.GrenadeHE)] -public class Plastic : CustomGrenade +public class Plastic : CustomGrenade, IGlowEffect { public enum C4RemoveMethod { @@ -40,54 +39,59 @@ public enum C4RemoveMethod public override uint Id { get; set; } = 6; public override float Weight { get; set; } = 1.5f; + public override SpawnProperties? SpawnProperties { get; set; } public override bool ExplodeOnCollision { get; set; } = false; public override float FuseTime { get; set; } = 10800f; public static Dictionary PlacedCharges { get; } = []; private static Dictionary Charges { get; } = []; - public static Plastic Instance { get; private set; } = null!; - public readonly int Limit = 1; + // ReSharper disable once RedundantDefaultMemberInitializer + public static Plastic? Instance { get; private set; } = null!; + + private Vector3 _toSpawn; - public override SpawnProperties? SpawnProperties { get; set; } = new() + public readonly int Limit = 1; + + public SpawnProperties? SpawnPoints { get; set; } = new() { Limit = 0, + LockerSpawnPoints = + { + new LockerSpawnPoint + { + Type = LockerType.Scp500Pedestal, + Chance = 70 + }, + new LockerSpawnPoint + { + Type = LockerType.AntiScp207Pedestal, + Chance = 1 + }, + new LockerSpawnPoint + { + Type = LockerType.LargeGun, + Chance = 39 + } + } }; public override ItemType Type { get; set; } = ItemType.GrenadeHE; - private readonly Dictionary _c4Spawns = Plugin.Instance.Config.C4Spawns ?? - new Dictionary - { - { LockerType.Scp500Pedestal, 70 }, - { LockerType.AntiScp207Pedestal, 1 }, - { LockerType.LargeGun, 39 } - }; + private readonly Dictionary _c4Spawns = Utils.GetSpawnLocations(Instance?.SpawnPoints); - protected LockerType NormalizeC4() + private void OnFillingLocker(FillingLockerEventArgs ev) { - var nonNormalized = Plugin.Instance.Config.C4Spawns.Values.ToArray(); - var Max = nonNormalized.Sum(); - var Normalized = new int[nonNormalized.Length]; - int x = 0; - - Random rand = new(); - - double Roll = rand.Next(0, Max); - foreach (KeyValuePair place in _c4Spawns) + if (ev.Chamber is null || ev.Pickup is null) { - if (Roll < place.Value) return place.Key; - - Roll -= place.Value; + return; } - foreach (var locker in Locker) - - return LockerType.Scp500Pedestal; - } - - private void OnSpawningItem(SpawningItemEventArgs ev) - { - + Utils.NormalizeLockerSpawns(_c4Spawns, out _toSpawn); + if (ev.Locker.Position == _toSpawn) + { + ev.IsAllowed = false; + if (TryGet(6, out var item)) item?.Spawn(ev.Locker.Position); + } } public void Handler(Pickup? charge, C4RemoveMethod method = C4RemoveMethod.Drop, Player? detonator = null) @@ -115,7 +119,7 @@ public void Handler(Pickup? charge, C4RemoveMethod method = C4RemoveMethod.Drop, charge.Destroy(); break; } - case C4RemoveMethod.Drop: //This looks ugly af... what the fuck Microsoft + case C4RemoveMethod.Drop: //This looks ugly af... what the fuck Microsoft default: { TrySpawn(Id, charge.Position, out _); @@ -131,6 +135,8 @@ protected override void SubscribeEvents() { Instance = this; + Map.FillingLocker += OnFillingLocker; + PlayerEvent.Destroying += OnDestroying; PlayerEvent.Died += OnDied; PlayerEvent.Shooting += OnShooting; @@ -142,12 +148,16 @@ protected override void SubscribeEvents() protected override void UnsubscribeEvents() { + Map.FillingLocker -= OnFillingLocker; + PlayerEvent.Destroying -= OnDestroying; PlayerEvent.Died -= OnDied; PlayerEvent.Shooting -= OnShooting; ServerEvent.RoundEnded -= OnRoundEnded; + Instance = null; + base.UnsubscribeEvents(); } @@ -159,6 +169,7 @@ protected override void OnWaitingForPlayers() protected override void OnThrownProjectile(ThrownProjectileEventArgs ev) { + if (!Check(ev.Item)) return; Log.Debug("Executing OnThrownProjectile method."); if (!PlacedCharges.ContainsKey(ev.Projectile)) { @@ -179,17 +190,21 @@ protected override void OnExploding(ExplodingGrenadeEventArgs ev) private void OnDestroying(DestroyingEventArgs ev) { - Log.Debug("Executing OnDestoying method."); + Log.Debug("Executing OnDestroying method."); foreach (KeyValuePair charge in PlacedCharges.ToList() .Where(charge => charge.Value == ev.Player)) + { Handler(charge.Key, C4RemoveMethod.Remove); + } } private void OnDied(DiedEventArgs ev) { foreach (KeyValuePair charge in PlacedCharges.ToList() .Where(charge => charge.Value == ev.Player)) + { Handler(charge.Key); + } } private void OnShooting(ShootingEventArgs ev) @@ -197,11 +212,13 @@ private void OnShooting(ShootingEventArgs ev) var forward = ev.Player.CameraTransform.forward; if (!Physics.Raycast(ev.Player.CameraTransform.position + forward, forward, out var hit, 500)) + { return; + } var grenade = hit.collider.gameObject.GetComponentInParent(); - if (grenade == null) return; + if (grenade is null) return; if (PlacedCharges.ContainsKey(Pickup.Get(grenade))) Handler(Pickup.Get(grenade), C4RemoveMethod.Remove); } diff --git a/Items/Scp1499.cs b/Items/Scp1499.cs index 0a1f6ad..394a25b 100644 --- a/Items/Scp1499.cs +++ b/Items/Scp1499.cs @@ -5,7 +5,9 @@ using Exiled.API.Features.Spawn; using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Player; +using ExtendedItems.API.Interface; using MEC; +using PlayerRoles; using UnityEngine; using YamlDotNet.Serialization; using PlayerEvents = Exiled.Events.Handlers.Player; @@ -13,7 +15,7 @@ namespace ExtendedItems.Items; [CustomItem(ItemType.SCP268)] -public class Scp1499 : CustomItem +public class Scp1499 : CustomItem, IGlowEffect { [Description("Room to teleport player to after using SCP-1499.")] // ReSharper disable once InconsistentNaming @@ -35,23 +37,14 @@ public class Scp1499 : CustomItem public override SpawnProperties? SpawnProperties { get; set; } = new() { - Limit = 1, - LockerSpawnPoints = - [ - new LockerSpawnPoint - { - Type = LockerType.Scp268Pedestal, - Chance = 50f, - Zone = ZoneType.HeavyContainment, - UseChamber = true - } - ] + Limit = 0 }; private void OnUsingItem(UsingItemEventArgs ev) { if (!Check(ev.Item)) return; - if (ev.Player.IsInPocketDimension || Utils.PDWarning(ev.Player)) + + if (ev.Player.IsInPocketDimension || IsBlockedByPocketDimensionRules(ev.Player)) { ev.Player.ShowHint( "You put on the gas mask but nothing happens.\nIt seems that this SCP item has its limits."); @@ -60,6 +53,16 @@ private void OnUsingItem(UsingItemEventArgs ev) } } + private static bool IsBlockedByPocketDimensionRules(Player player) + { + if (Plugin.Instance is null || !player.ActiveEffects.Any(effect => effect.name == "Corroding")) + return false; + + var scp106 = Player.List.FirstOrDefault(rolePlayer => rolePlayer.Role == RoleTypeId.Scp106); + return scp106 is not null && + Vector3.Distance(player.Position, scp106.Position) < Plugin.Instance.Config.LarryDistance; + } + private void OnUsedItem(UsedItemEventArgs ev) { if (!Check(ev.Item)) return; @@ -113,4 +116,4 @@ protected override void OnDroppingItem(DroppingItemEventArgs ev) base.OnDroppingItem(ev); } -} \ No newline at end of file +} diff --git a/Items/Sniper.cs b/Items/Sniper.cs index 07a900a..a6d5ba9 100644 --- a/Items/Sniper.cs +++ b/Items/Sniper.cs @@ -1,16 +1,24 @@ +using System.ComponentModel; using Exiled.API.Enums; +using Exiled.API.Features; using Exiled.API.Features.Attributes; using Exiled.API.Features.Spawn; using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Item; +using Exiled.Events.EventArgs.Player; +using ExtendedItems.API.Interface; using InventorySystem.Items.Firearms.Attachments; +using PlayerRoles; +using PlayerStatsSystem; +using UnityEngine; using YamlDotNet.Serialization; +using static HitboxType; using ItemEvents = Exiled.Events.Handlers.Item; namespace ExtendedItems.Items; [CustomItem(ItemType.GunE11SR)] -public class Sniper : CustomWeapon +public class Sniper : CustomWeapon, IGlowEffect { public override uint Id { get; set; } = 2; public override string Name { get; set; } = "SR-118"; @@ -19,7 +27,7 @@ public class Sniper : CustomWeapon "A modified E-11 that fires 5.56 at supersonic velocity that deals significantly more damage"; public override float Weight { get; set; } = 4f; - public override float Damage { get; set; } = 125f; + public override float Damage { get; set; } = 0f; public override byte ClipSize { get; set; } = 1; [YamlIgnore] @@ -28,7 +36,7 @@ public class Sniper : CustomWeapon AttachmentName.LowcapMagAP, AttachmentName.Foregrip, AttachmentName.DotSight, AttachmentName.RecoilReducingStock, AttachmentName.RifleBody, AttachmentName.MuzzleBrake ]; - + public override SpawnProperties? SpawnProperties { get; set; } = new() { Limit = 1, @@ -58,6 +66,76 @@ protected override void UnsubscribeEvents() base.UnsubscribeEvents(); } + protected override void OnShot(ShotEventArgs ev) + { + if (!Check(ev.Item) || Plugin.Instance is null || ev.Target is null) return; + ev.CanHurt = false; + var raycast = Physics.Raycast(ev.Player.Position, ev.Player.Transform.forward, 100f, + LayerMask.GetMask("OnlyWorldOnlyWorldCollision", "Player")); + switch (raycast) + { + // ev.Target.Kill(new CustomReasonDamageHandler("A Large bullet wound observed in the head of " + ev.Target.Nickname)); + // Respawn.GrantInfluence(ev.Player.IsNTF ? Faction.FoundationStaff : Faction.FoundationEnemy, 2); + // Respawn.AdvanceTimer(ev.Player.IsNTF ? Faction.FoundationStaff : Faction.FoundationEnemy, 8f); + case true when ev.Target.IsHuman: + switch (ev.Hitbox.HitboxType) + { + case Headshot or Limb or Body when HasEffect(ev.Target, EffectType.AntiScp207) && + Plugin.Instance.Config.HeadRemove207: + ev.Target.DisableEffect(EffectType.AntiScp207); + ev.Target.Health = 1; + ev.Target.EnableEffect(EffectType.Concussed, 10f); + ev.Target.EnableEffect(EffectType.Invigorated, 5f); + break; + + case Headshot or Body or Limb when ev.Target.CurrentArmor.Type == ItemType.ArmorHeavy && + !HasEffect(ev.Target, EffectType.AntiScp207): + ev.Target.Health = 1; + ev.Target.EnableEffect(EffectType.Concussed, 10f); + ev.Target.EnableEffect(EffectType.Invigorated, 5f); + break; + + case Headshot: + ev.Target.Kill(new CustomReasonDamageHandler( + "A Large bullet wound observed in the Head. Presumed to be " + ev.Target.Nickname)); + Respawn.GrantInfluence(ev.Player.IsNTF ? Faction.FoundationStaff : Faction.FoundationEnemy, 2); + Respawn.AdvanceTimer(ev.Player.IsNTF ? Faction.FoundationStaff : Faction.FoundationEnemy, 8f); + break; + + case Body: + ev.Target.Kill(new CustomReasonDamageHandler("A Large bullet wound observed in the Body of " + + ev.Target.Nickname)); + Respawn.GrantInfluence(ev.Player.IsNTF ? Faction.FoundationStaff : Faction.FoundationEnemy, 2); + Respawn.AdvanceTimer(ev.Player.IsNTF ? Faction.FoundationStaff : Faction.FoundationEnemy, 8f); + break; + default: + ev.Target.Kill(new CustomReasonDamageHandler( + "A Large section of flesh in an extremity observed on " + ev.Target.Nickname)); + Respawn.GrantInfluence(ev.Player.IsNTF ? Faction.FoundationStaff : Faction.FoundationEnemy, 2); + Respawn.AdvanceTimer(ev.Player.IsNTF ? Faction.FoundationStaff : Faction.FoundationEnemy, 8f); + break; + } + + break; + + case true when ev.Target.IsScp: + if (ev.Target.Role == RoleTypeId.Scp0492 && ev.Hitbox.HitboxType == Headshot) + ev.Target.Hurt(ev.Player, 300, armorPenetration: 75); + else + ev.Target.Hurt(ev.Player, 150, armorPenetration: 75); + break; + } + + base.OnShot(ev); + } + + private static bool HasEffect(Player player, EffectType effectType) + { + return !Enum.IsDefined(typeof(EffectType), effectType) + ? throw new InvalidEnumArgumentException(nameof(effectType), (int)effectType, typeof(EffectType)) + : player.ActiveEffects.Any(effect => effect.name == nameof(effectType)); + } + private void OnChangingAttachments(ChangingAttachmentsEventArgs ev) { if (!Check(ev.Item)) return; @@ -65,9 +143,11 @@ private void OnChangingAttachments(ChangingAttachmentsEventArgs ev) // ReSharper disable once InconsistentNaming AttachmentName[] Monica = Plugin.Instance!.Config.ForcedSniperAttch; AttachmentName[] subMonica = ev.NewAttachmentIdentifiers.Select(user => user.Name).ToArray(); - - // I hate this but this is a way to do this and I dont want to fuck with this anymore - ev.IsAllowed = subMonica.All(item => Monica.Contains(item)) && + + // I hate this, but this is a way to do this, and I don't want to fuck with this anymore + ev.IsAllowed = subMonica.All(Monica.Contains) && (Monica.Contains(AttachmentName.LowcapMagAP) || Monica.Contains(AttachmentName.LowcapMagJHP)); + ev.Player.AddAmmo(AmmoType.Nato556, (ushort)ev.Firearm.MagazineAmmo); + ev.Firearm.MagazineAmmo = 0; } } \ No newline at end of file diff --git a/Items/Tranquilizer.cs b/Items/Tranquilizer.cs index 6ffa729..fd45ef0 100644 --- a/Items/Tranquilizer.cs +++ b/Items/Tranquilizer.cs @@ -21,9 +21,8 @@ namespace ExtendedItems.Items; public class Tranquilizer : CustomWeapon { [YamlIgnore] private readonly Dictionary _resistances = []; - - [YamlIgnore] private readonly Random _rng = new(); + public override string Name { get; set; } = "Tranquilizer"; public override uint Id { get; set; } = 1; @@ -78,10 +77,11 @@ private void OnChangingRole(ChangingRoleEventArgs ev) protected override void OnShot(ShotEventArgs ev) { + if (!Check(ev.Item)) return; if (ev.Target == null || Plugin.Instance == null) return; if (ev.Target.IsTutorial && !Plugin.Instance.Config.EffectiveOnTutorials) return; - if (!Utils.HasEffect(ev.Target, EffectType.Invigorated)) return; + if (ev.Player.ActiveEffects.Any(effect => effect.name != "Invigorated")) return; var rand = _rng.NextDouble(); @@ -114,17 +114,17 @@ protected override void OnShot(ShotEventArgs ev) } else { - if (ev.Target.Role != RoleTypeId.Scp106) - ragdoll = Ragdoll.CreateAndSpawn(ev.Target.Role.Type, ev.Target.DisplayNickname, - new CustomReasonDamageHandler("Tranquilized."), ev.Target.Position, ev.Target.Rotation, - ev.Target); - if (ev.Target.Role == RoleTypeId.Scp096) { var crybaby = (Scp096Role)ev.Target.Role; if (crybaby.RageState is Scp096RageState.Enraged or Scp096RageState.Distressed) crybaby.RageManager.ServerEndEnrage(); } + + if (ev.Target.Role != RoleTypeId.Scp106) + ragdoll = Ragdoll.CreateAndSpawn(ev.Target.Role.Type, ev.Target.DisplayNickname, + new CustomReasonDamageHandler("Tranquilized."), ev.Target.Position, ev.Target.Rotation, + ev.Target); } Timing.CallDelayed(5, () => @@ -134,11 +134,13 @@ protected override void OnShot(ShotEventArgs ev) ev.Target.DisableEffect(EffectType.Ensnared); ev.Target.DisableEffect(EffectType.Flashed); ev.Target.DisableEffect(EffectType.Deafened); - ev.Target.DisableEffect(EffectType.AmnesiaItems); + if (ev.Player.IsHuman) ev.Target.DisableEffect(EffectType.AmnesiaItems); ev.Target.DisableEffect(EffectType.DamageReduction); - if (lift != null) ev.Target.Teleport(lift.Position + Vector3.up * 2f); - else ev.Target.Teleport(ev.Target.Position + Vector3.up * 2f); + if (lift is not null) + ev.Target.Teleport(lift.Position + Vector3.up * 2f); + else + ev.Target.Teleport(ev.Target.Position + Vector3.up * 2f); ev.Target.Scale = Vector3.one; ragdoll?.Destroy(); }); diff --git a/Utils.cs b/Utils.cs index 4727986..52869d7 100644 --- a/Utils.cs +++ b/Utils.cs @@ -1,14 +1,16 @@ -using System.ComponentModel; -using Exiled.API.Enums; +using Exiled.API.Enums; +using Exiled.API.Features; using Exiled.API.Features.Items; +using Exiled.API.Features.Lockers; using Exiled.API.Features.Pickups.Projectiles; +using Exiled.API.Features.Spawn; using MEC; -using PlayerRoles; using UnityEngine; using EP = Exiled.API.Features.Player; using Item = Exiled.API.Features.Items.Item; using LightSourceToy = LabApi.Features.Wrappers.LightSourceToy; using Pickup = Exiled.API.Features.Pickups.Pickup; +using Random = System.Random; using Room = Exiled.API.Features.Room; namespace ExtendedItems; @@ -25,13 +27,10 @@ public static class Utils public static Vector3 GetGlobalCords(RoomType roomType, Vector3 localPos) { var room = Room.Get(roomType); - - var rotation = room.Rotation; var roomPos = room.Position; + var quarterTurns = Mathf.RoundToInt(room.Rotation.eulerAngles.y / 90f) % 4; - var offsetY = Math.Round(Math.Abs(rotation.eulerAngles.y / 90f)); - - return offsetY switch + return quarterTurns switch { 0 => new Vector3(roomPos.x + localPos.x, roomPos.y + localPos.y, roomPos.z + localPos.z), 1 => new Vector3(roomPos.x + localPos.z, roomPos.y + localPos.y, roomPos.z - localPos.x), @@ -41,31 +40,13 @@ public static Vector3 GetGlobalCords(RoomType roomType, Vector3 localPos) }; } - // ReSharper disable once InconsistentNaming - public static bool PDWarning(EP player) - { - return (player.ActiveEffects - // ReSharper disable once InconsistentNaming - .Select(actEffects => new { actEffects, Larry = EP.List.First(L => L.Role == RoleTypeId.Scp106).Position }) - .Select(@t => - @t.actEffects.name == "Corroding" && Plugin.Instance != null && - Vector3.Distance(player.Position, @t.Larry) < Plugin.Instance.Config.LarryDistance)).FirstOrDefault(); - } - public static void Exploding(EP player) { var grenade = (ExplosiveGrenade)Item.Create(ItemType.GrenadeHE); grenade.FuseTime = 0.1f; grenade.SpawnActive(player.Position + new Vector3(0, 1, 0), player); } - - public static bool HasEffect(EP player, EffectType effect) - { - return !Enum.IsDefined(typeof(EffectType), effect) - ? throw new InvalidEnumArgumentException(nameof(effect), (int)effect, typeof(EffectType)) - : player.ActiveEffects.Any(targetActiveEffect => targetActiveEffect.name == nameof(effect)); - } - + public static void Grenade_Damage(EffectGrenadeProjectile grenade, EP player) { if (Vector3.Distance(grenade.Position, player.Position) <= 4) @@ -77,7 +58,7 @@ public static void Grenade_Damage(EffectGrenadeProjectile grenade, EP player) else if (player.IsHuman) player.Hurt(grenade.PreviousOwner, 150, armorPenetration: 50); } } - else if (Physics.Raycast(grenade.Position, player.Position, out var hit, 20, (int)LayerMasks.Grenade)) + else if (Physics.Raycast(grenade.Position, player.Position, out _, 20, (int)LayerMasks.Grenade)) { player.Hurt(player, 25, armorPenetration: 50); } @@ -109,8 +90,41 @@ public static void CoinHintHandler(Pickup pickup, out CoroutineHandle handle) handle = glowCoroutine; } - private static Color ParseConfigColor() + internal static void NormalizeLockerSpawns(Dictionary spawns, out Vector3 toSpawn) + { + var totalWeight = spawns.Values.Sum(); + var random = new Random(); + + var roll = random.Next(0, (int)totalWeight); + Vector3? selectedLockerType = Locker.Random(lockerType: LockerType.Scp500Pedestal)?.Position; + + foreach (KeyValuePair spawn in spawns) + { + if (roll < spawn.Value) + { + selectedLockerType = spawn.Key; + break; + } + + roll = (int)Mathf.Round(roll - spawn.Value); + } + + Locker[] matchingLockers = Locker.List + .Where(locker => locker.Position == selectedLockerType) + .ToArray(); + + if (matchingLockers.Length == 0) + { + toSpawn = Vector3.zero; + return; + } + + toSpawn = matchingLockers[random.Next(0, matchingLockers.Length)].Position; + } + + internal static Color ParseConfigColor() { + if (Plugin.Instance is null) return Color.white; var color = Plugin.Instance.Config.SCP1289Color; var fallback = Color.white; if (color[0] == '#') @@ -122,7 +136,7 @@ private static Color ParseConfigColor() .ToArray(); fallback = new Color(temp[0], temp[1], temp[2]); } - catch (Exception e) + catch (Exception) { return fallback; } @@ -150,28 +164,62 @@ private static Color ParseConfigColor() return fallback; } + internal static Dictionary GetSpawnLocations(SpawnProperties? spawnProperties) + { + if (spawnProperties is null) + { + Log.Warn("SpawnProperties is null."); + return new Dictionary(); + } + + Dictionary spawnLocations = spawnProperties.LockerSpawnPoints + .TakeWhile(lockerSpawnPoints => lockerSpawnPoints.Chance != 0f).ToDictionary( + lockerSpawnPoints => lockerSpawnPoints.Position, lockerSpawnPoints => lockerSpawnPoints.Chance); + foreach (var dynamicSpawnLocation in spawnProperties.DynamicSpawnPoints) + spawnLocations.Add(dynamicSpawnLocation.Position + new Vector3(0, .5f, 0), dynamicSpawnLocation.Chance); + + foreach (var roomSpawnLocation in spawnProperties.RoomSpawnPoints) + spawnLocations.Add(Room.Get(roomSpawnLocation.Room).Position + new Vector3(0, .5f, 0), + roomSpawnLocation.Chance); + foreach (var staticSpawnLocation in spawnProperties.StaticSpawnPoints) + spawnLocations.Add(staticSpawnLocation.Position + new Vector3(0, .5f, 0), staticSpawnLocation.Chance); + + return spawnLocations; + } + private static IEnumerator CoinCoroutine(Pickup pickup) { - yield return Timing.WaitForSeconds(Plugin.Instance.Config.SCP1289Timer); - var intensity = 0; - var light = LightSourceToy.Create(new Vector3(0, 0, 0), pickup.Rotation, pickup.Transform, false); - Lights.Add(light, pickup.Serial); - - light.Color = ParseConfigColor(); - light.Range = Plugin.Instance.Config.SCP1289LightRange; - light.Type = LightType.Tube; - light.ShadowStrength = .5f; - light.Intensity = intensity; - light.Parent = pickup.Transform; - - light.Spawn(); - - while (intensity != 100) + if (Plugin.Instance != null) { + yield return Timing.WaitForSeconds(Plugin.Instance.Config.SCP1289Timer); + var intensity = 0; + var light = LightSourceToy.Create(new Vector3(0, 0, 0), pickup.Rotation, pickup.Transform, false); + Lights.Add(light, pickup.Serial); + + light.Color = ParseConfigColor(); + light.Range = Plugin.Instance.Config.SCP1289LightRange; + light.Type = LightType.Tube; + light.ShadowStrength = .5f; light.Intensity = intensity; - yield return Timing.WaitForSeconds(Plugin.Instance.Config.TimeToFullGlow / 100); - intensity++; + light.Parent = pickup.Transform; + + light.Spawn(); + + while (intensity != 100) + { + light.Intensity = intensity; + yield return Timing.WaitForSeconds(Plugin.Instance.Config.TimeToFullGlow / 100); + intensity++; + } + } + } + + internal static void RemoveLight(Pickup pickup) + { + if (Lights.ContainsKey(Lights.FirstOrDefault(light => light.Value == pickup.Serial).Key)) + { + Lights.Remove(Lights.FirstOrDefault(light => light.Value == pickup.Serial).Key); + Lights.FirstOrDefault(light => light.Value == pickup.Serial).Key.Destroy(); } - } -} \ No newline at end of file +} From 63b62381a6125f018493d9ac6d883354c5326329 Mon Sep 17 00:00:00 2001 From: noobest1001 Date: Thu, 20 Aug 2026 21:14:31 -0400 Subject: [PATCH 9/9] moved the source code to a /src folder because GH --- API/Interface/IGlowEffect.cs | 16 - Config.cs => src/Config.cs | 170 +++++----- EventHandler.cs => src/EventHandler.cs | 9 +- {Items => src/Items}/Coin.cs | 35 +- {Items => src/Items}/Plastic.cs | 10 +- {Items => src/Items}/Scp1499.cs | 3 +- {Items => src/Items}/Sniper.cs | 11 +- {Items => src/Items}/Tranquilizer.cs | 0 Plugin.cs => src/Plugin.cs | 2 + Ssss.cs => src/Ssss.cs | 0 {Types => src/Types}/CoinEffect.cs | 18 +- Utils.cs => src/Utils.cs | 450 ++++++++++++------------- 12 files changed, 346 insertions(+), 378 deletions(-) delete mode 100644 API/Interface/IGlowEffect.cs rename Config.cs => src/Config.cs (97%) rename EventHandler.cs => src/EventHandler.cs (50%) rename {Items => src/Items}/Coin.cs (90%) rename {Items => src/Items}/Plastic.cs (96%) rename {Items => src/Items}/Scp1499.cs (97%) rename {Items => src/Items}/Sniper.cs (96%) rename {Items => src/Items}/Tranquilizer.cs (100%) rename Plugin.cs => src/Plugin.cs (93%) rename Ssss.cs => src/Ssss.cs (100%) rename {Types => src/Types}/CoinEffect.cs (95%) rename Utils.cs => src/Utils.cs (97%) diff --git a/API/Interface/IGlowEffect.cs b/API/Interface/IGlowEffect.cs deleted file mode 100644 index 20339d0..0000000 --- a/API/Interface/IGlowEffect.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Exiled.API.Features.Pickups; - -namespace ExtendedItems.API.Interface; - -public interface IGlowEffect -{ - public abstract byte LightId { get; init; } - - public abstract byte Intensity { get; set; } - - public abstract Pickup? Parent { get; set; } - - public abstract void Create(Pickup pickup); - - public abstract void Remove(Pickup pickup); -} \ No newline at end of file diff --git a/Config.cs b/src/Config.cs similarity index 97% rename from Config.cs rename to src/Config.cs index fe2388b..eb764a7 100644 --- a/Config.cs +++ b/src/Config.cs @@ -1,86 +1,86 @@ -using System.ComponentModel; -using Exiled.API.Enums; -using Exiled.API.Interfaces; -using ExtendedItems.Items; -using InventorySystem.Items.Firearms.Attachments; - -namespace ExtendedItems; - -public class Config : IConfig -{ - public bool IsEnabled { get; set; } = true; - public bool Debug { get; set; } = true; - public bool EasterEggs { get; set; } = false; - - #region Config Settings - - // [Description("How Common Easter Eggs are")] - // public float EasterEggsChance { get; set; } = 0.01f; - - [Description("Weather the Tranq is effective on Tutorials")] - public bool EffectiveOnTutorials { get; set; } = false; - - [Description("Weather the Tranq is still useable when Nuke is on")] - public AttachmentName[] ForcedSniperAttch { get; set; } = - [AttachmentName.MuzzleBrake, AttachmentName.RecoilReducingStock, AttachmentName.RifleBody]; - - [Description("The Places and Chance a C4 can Spawn")] - public Dictionary C4Spawns { get; set; } = new() { {LockerType.Scp500Pedestal, 70}, {LockerType.AntiScp207Pedestal, 1}, {LockerType.LargeGun, 39}}; - - [Description("The Distance from Larry a player can be before they can no longer use SCP-1499")] - public float LarryDistance { get; set; } = 10f; - - [Description("The color that glows from where SCP-1289 is")] - public string SCP1289Color { get; set; } = "White"; - - [Description("How long it takes for the glow effect to start around SCP-1289 (in seconds)")] - public float SCP1289Timer { get; set; } = 10f; - - [Description("How far should the Hint light for SCP-1289 should reach")] - public float SCP1289LightRange { get; set; } = 10f; - - [Description("How long it take for the glow effect to reach full intensity (in seconds)")] - public float TimeToFullGlow { get; set; } = 60f; - - [Description("Wether a player that is shot in the head with Sniper when they have heavy armor will have 207?")] - public bool HeadRemove207 { get; set; } = true; - - [Description("The possable hints shown when you Win")] - public string[] WinHints { get; set; } = - [ - "Long Live the King", - "Use Force", - "Utilize Might", - "Life to the Ruler", - "Be Brave", - "The Savior is here", - "The end is never near" - ]; - - [Description("List of possible causes of death when the coin lands on tails")] - public string[] LoseCauses { get; set; } = - [ - "Silence", - "Quiet", - "Don't Look", - "Look Away", - "Death to the King", - "Death to the Ruler", - "The End" - ]; - - #endregion - - #region Custom Items setup - - public Coin Coin { get; set; } = new(); - public Scp1499 Scp1499 { get; set; } = new(); - // public GLShot GLShot { get; set; } = new(); - // public GrenadeLauncher GrenadeLauncher { get; set; } = new(); - public Sniper Sniper { get; set; } = new(); - public Tranquilizer Tranquilizer { get; set; } = new(); - public Plastic Plastic { get; set; } = new(); - - - #endregion +using System.ComponentModel; +using Exiled.API.Enums; +using Exiled.API.Interfaces; +using ExtendedItems.Items; +using InventorySystem.Items.Firearms.Attachments; + +namespace ExtendedItems; + +public class Config : IConfig +{ + public bool IsEnabled { get; set; } = true; + public bool Debug { get; set; } = true; + public bool EasterEggs { get; set; } = false; + + #region Config Settings + + // [Description("How Common Easter Eggs are")] + // public float EasterEggsChance { get; set; } = 0.01f; + + [Description("Weather the Tranq is effective on Tutorials")] + public bool EffectiveOnTutorials { get; set; } = false; + + [Description("Weather the Tranq is still useable when Nuke is on")] + public AttachmentName[] ForcedSniperAttch { get; set; } = + [AttachmentName.MuzzleBrake, AttachmentName.RecoilReducingStock, AttachmentName.RifleBody]; + + [Description("The Places and Chance a C4 can Spawn")] + public Dictionary C4Spawns { get; set; } = new() { {LockerType.Scp500Pedestal, 70}, {LockerType.AntiScp207Pedestal, 1}, {LockerType.LargeGun, 39}}; + + [Description("The Distance from Larry a player can be before they can no longer use SCP-1499")] + public float LarryDistance { get; set; } = 10f; + + [Description("The color that glows from where SCP-1289 is")] + public string SCP1289Color { get; set; } = "White"; + + [Description("How long it takes for the glow effect to start around SCP-1289 (in seconds)")] + public float SCP1289Timer { get; set; } = 10f; + + [Description("How far should the Hint light for SCP-1289 should reach")] + public float SCP1289LightRange { get; set; } = 10f; + + [Description("How long it take for the glow effect to reach full intensity (in seconds)")] + public float TimeToFullGlow { get; set; } = 60f; + + [Description("Wether a player that is shot in the head with Sniper when they have heavy armor will have 207?")] + public bool HeadRemove207 { get; set; } = true; + + [Description("The possable hints shown when you Win")] + public string[] WinHints { get; set; } = + [ + "Long Live the King", + "Use Force", + "Utilize Might", + "Life to the Ruler", + "Be Brave", + "The Savior is here", + "The end is never near" + ]; + + [Description("List of possible causes of death when the coin lands on tails")] + public string[] LoseCauses { get; set; } = + [ + "Silence", + "Quiet", + "Don't Look", + "Look Away", + "Death to the King", + "Death to the Ruler", + "The End" + ]; + + #endregion + + #region Custom Items setup + + public Coin Coin { get; set; } = new(); + public Scp1499 Scp1499 { get; set; } = new(); + // public GLShot GLShot { get; set; } = new(); + // public GrenadeLauncher GrenadeLauncher { get; set; } = new(); + public Sniper Sniper { get; set; } = new(); + public Tranquilizer Tranquilizer { get; set; } = new(); + public Plastic Plastic { get; set; } = new(); + + + #endregion } \ No newline at end of file diff --git a/EventHandler.cs b/src/EventHandler.cs similarity index 50% rename from EventHandler.cs rename to src/EventHandler.cs index 8afc3f1..f1a1867 100644 --- a/EventHandler.cs +++ b/src/EventHandler.cs @@ -10,10 +10,11 @@ public static void OnGrenadeExploding(ExplodingGrenadeEventArgs ev) foreach (var player in ev.TargetsToAffect.ToArray()) Utils.Grenade_Damage(ev.Projectile, player); } - public void OnFillingLockers(FillingLockerEventArgs ev) + public static void OnFillingLockers(FillingLockerEventArgs ev) { - if (ev.Pickup.Type == ItemType.GrenadeHE) - ev.Chamber.RequiredPermissions = KeycardPermissions.ArmoryLevelThree | - KeycardPermissions.ContainmentLevelTwo | KeycardPermissions.ExitGates; + if (ev.Pickup.Type == ItemType.GunFRMG0) + { + ev.IsAllowed = false; + } } } \ No newline at end of file diff --git a/Items/Coin.cs b/src/Items/Coin.cs similarity index 90% rename from Items/Coin.cs rename to src/Items/Coin.cs index 8800002..6806752 100644 --- a/Items/Coin.cs +++ b/src/Items/Coin.cs @@ -5,12 +5,12 @@ using Exiled.API.Features.Spawn; using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Player; -using ExtendedItems.API.Interface; using ExtendedItems.Types; using LabApi.Features.Wrappers; using MEC; using PlayerStatsSystem; using UnityEngine; + using Item = Exiled.API.Features.Items.Item; using Pickup = Exiled.API.Features.Pickups.Pickup; using Player = Exiled.API.Features.Player; @@ -20,22 +20,15 @@ namespace ExtendedItems.Items; [CustomItem(ItemType.Coin)] -public class Coin : CustomItem, IGlowEffect +public class Coin : CustomItem { - // Exiled's API 🤮 (all jokes) public override string Name { get; set; } = "SCP-1289"; public override uint Id { get; set; } = 4; public override string Description { get; set; } = "\"What's the most you ever lost on a coin toss?\""; public override float Weight { get; set; } = 1f; - - // My API for shits and giggles :) - public Pickup? Parent { get; set; } - public byte Intensity { get; set; } = 0; - public byte LightId { get; init; } - - + private CoroutineHandle _handler; - internal LightSourceToy? _lightSourceToy; + private LightSourceToy? _lightSourceToy; public override SpawnProperties? SpawnProperties { get; set; } = new() { @@ -52,31 +45,13 @@ public class Coin : CustomItem, IGlowEffect ] }; - public void Create(Pickup pickup) - { - LightId = - _lightSourceToy = LightSourceToy.Create(pickup.Transform, false); - } - - public void Remove(Pickup pickup) - { - _lightSourceToy?.Destroy(); - } - ~Coin() { - if (Parent is not null) Remove(Parent); - Parent = null; if (_handler.IsValid) Timing.KillCoroutines(_handler); + _lightSourceToy = null; _handler = default; } - public override Pickup? Spawn(Vector3 position, Player? previousOwner = null) - { - Parent = base.Spawn(position, previousOwner); - return Parent; - } - [Description("Effects to give if coin landed on heads.")] private static CoinEffect[] Effects => [ diff --git a/Items/Plastic.cs b/src/Items/Plastic.cs similarity index 96% rename from Items/Plastic.cs rename to src/Items/Plastic.cs index 35a0a14..44212c9 100644 --- a/Items/Plastic.cs +++ b/src/Items/Plastic.cs @@ -9,7 +9,6 @@ using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Map; using Exiled.Events.EventArgs.Player; -using ExtendedItems.API.Interface; using InventorySystem.Items.ThrowableProjectiles; using UnityEngine; using Map = Exiled.Events.Handlers.Map; @@ -22,7 +21,7 @@ namespace ExtendedItems.Items; [CustomItem(ItemType.GrenadeHE)] -public class Plastic : CustomGrenade, IGlowEffect +public class Plastic : CustomGrenade { public enum C4RemoveMethod { @@ -39,7 +38,10 @@ public enum C4RemoveMethod public override uint Id { get; set; } = 6; public override float Weight { get; set; } = 1.5f; - public override SpawnProperties? SpawnProperties { get; set; } + public override SpawnProperties? SpawnProperties { get; set; } = new() + { + Limit = 0 + }; public override bool ExplodeOnCollision { get; set; } = false; public override float FuseTime { get; set; } = 10800f; public static Dictionary PlacedCharges { get; } = []; @@ -89,6 +91,8 @@ private void OnFillingLocker(FillingLockerEventArgs ev) Utils.NormalizeLockerSpawns(_c4Spawns, out _toSpawn); if (ev.Locker.Position == _toSpawn) { + ev.Chamber.RequiredPermissions = KeycardPermissions.ArmoryLevelThree | + KeycardPermissions.ContainmentLevelTwo | KeycardPermissions.ExitGates; ev.IsAllowed = false; if (TryGet(6, out var item)) item?.Spawn(ev.Locker.Position); } diff --git a/Items/Scp1499.cs b/src/Items/Scp1499.cs similarity index 97% rename from Items/Scp1499.cs rename to src/Items/Scp1499.cs index 394a25b..b377a37 100644 --- a/Items/Scp1499.cs +++ b/src/Items/Scp1499.cs @@ -5,7 +5,6 @@ using Exiled.API.Features.Spawn; using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Player; -using ExtendedItems.API.Interface; using MEC; using PlayerRoles; using UnityEngine; @@ -15,7 +14,7 @@ namespace ExtendedItems.Items; [CustomItem(ItemType.SCP268)] -public class Scp1499 : CustomItem, IGlowEffect +public class Scp1499 : CustomItem { [Description("Room to teleport player to after using SCP-1499.")] // ReSharper disable once InconsistentNaming diff --git a/Items/Sniper.cs b/src/Items/Sniper.cs similarity index 96% rename from Items/Sniper.cs rename to src/Items/Sniper.cs index a6d5ba9..d99dc0e 100644 --- a/Items/Sniper.cs +++ b/src/Items/Sniper.cs @@ -6,7 +6,6 @@ using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Item; using Exiled.Events.EventArgs.Player; -using ExtendedItems.API.Interface; using InventorySystem.Items.Firearms.Attachments; using PlayerRoles; using PlayerStatsSystem; @@ -18,7 +17,7 @@ namespace ExtendedItems.Items; [CustomItem(ItemType.GunE11SR)] -public class Sniper : CustomWeapon, IGlowEffect +public class Sniper : CustomWeapon { public override uint Id { get; set; } = 2; public override string Name { get; set; } = "SR-118"; @@ -33,8 +32,12 @@ public class Sniper : CustomWeapon, IGlowEffect [YamlIgnore] public override AttachmentName[] Attachments { get; set; } = [ - AttachmentName.LowcapMagAP, AttachmentName.Foregrip, AttachmentName.DotSight, - AttachmentName.RecoilReducingStock, AttachmentName.RifleBody, AttachmentName.MuzzleBrake + AttachmentName.LowcapMagAP, + AttachmentName.Foregrip, + AttachmentName.DotSight, + AttachmentName.RecoilReducingStock, + AttachmentName.RifleBody, + AttachmentName.MuzzleBrake ]; public override SpawnProperties? SpawnProperties { get; set; } = new() diff --git a/Items/Tranquilizer.cs b/src/Items/Tranquilizer.cs similarity index 100% rename from Items/Tranquilizer.cs rename to src/Items/Tranquilizer.cs diff --git a/Plugin.cs b/src/Plugin.cs similarity index 93% rename from Plugin.cs rename to src/Plugin.cs index eecfc20..924ed97 100644 --- a/Plugin.cs +++ b/src/Plugin.cs @@ -39,6 +39,7 @@ public override void OnEnabled() ServerSpecificSettingsSync.DefinedSettings = _settings.ToArray(); Map.ExplodingGrenade += EventHandler.OnGrenadeExploding; + Map.FillingLocker += EventHandler.OnFillingLockers; base.OnEnabled(); } @@ -46,6 +47,7 @@ public override void OnEnabled() public override void OnDisabled() { Map.ExplodingGrenade -= EventHandler.OnGrenadeExploding; + Map.FillingLocker -= EventHandler.OnFillingLockers; Log.Send("Unregistering items", LogLevel.Info, ConsoleColor.DarkYellow); CustomItem.UnregisterItems(); diff --git a/Ssss.cs b/src/Ssss.cs similarity index 100% rename from Ssss.cs rename to src/Ssss.cs diff --git a/Types/CoinEffect.cs b/src/Types/CoinEffect.cs similarity index 95% rename from Types/CoinEffect.cs rename to src/Types/CoinEffect.cs index 576080a..f7383a9 100644 --- a/Types/CoinEffect.cs +++ b/src/Types/CoinEffect.cs @@ -1,10 +1,10 @@ -using Exiled.API.Enums; - -namespace ExtendedItems.Types; - -public class CoinEffect -{ - public EffectType Type { get; init; } - public float Duration { get; init; } - public byte Intensity { get; init; } +using Exiled.API.Enums; + +namespace ExtendedItems.Types; + +public class CoinEffect +{ + public EffectType Type { get; init; } + public float Duration { get; init; } + public byte Intensity { get; init; } } \ No newline at end of file diff --git a/Utils.cs b/src/Utils.cs similarity index 97% rename from Utils.cs rename to src/Utils.cs index 52869d7..5259eef 100644 --- a/Utils.cs +++ b/src/Utils.cs @@ -1,225 +1,225 @@ -using Exiled.API.Enums; -using Exiled.API.Features; -using Exiled.API.Features.Items; -using Exiled.API.Features.Lockers; -using Exiled.API.Features.Pickups.Projectiles; -using Exiled.API.Features.Spawn; -using MEC; -using UnityEngine; -using EP = Exiled.API.Features.Player; -using Item = Exiled.API.Features.Items.Item; -using LightSourceToy = LabApi.Features.Wrappers.LightSourceToy; -using Pickup = Exiled.API.Features.Pickups.Pickup; -using Random = System.Random; -using Room = Exiled.API.Features.Room; - -namespace ExtendedItems; - -public static class Utils -{ - private static Dictionary Lights = []; - /// - /// Calculates the global coords of a point inside a room based on the room type and the location - /// - /// - /// - /// Vector3 - public static Vector3 GetGlobalCords(RoomType roomType, Vector3 localPos) - { - var room = Room.Get(roomType); - var roomPos = room.Position; - var quarterTurns = Mathf.RoundToInt(room.Rotation.eulerAngles.y / 90f) % 4; - - return quarterTurns switch - { - 0 => new Vector3(roomPos.x + localPos.x, roomPos.y + localPos.y, roomPos.z + localPos.z), - 1 => new Vector3(roomPos.x + localPos.z, roomPos.y + localPos.y, roomPos.z - localPos.x), - 2 => new Vector3(roomPos.x - localPos.x, roomPos.y + localPos.y, roomPos.z - localPos.z), - 3 => new Vector3(roomPos.x - localPos.z, roomPos.y + localPos.y, roomPos.z + localPos.x), - _ => Vector3.zero - }; - } - - public static void Exploding(EP player) - { - var grenade = (ExplosiveGrenade)Item.Create(ItemType.GrenadeHE); - grenade.FuseTime = 0.1f; - grenade.SpawnActive(player.Position + new Vector3(0, 1, 0), player); - } - - public static void Grenade_Damage(EffectGrenadeProjectile grenade, EP player) - { - if (Vector3.Distance(grenade.Position, player.Position) <= 4) - { - if (Physics.Raycast(grenade.Position, player.Position, out _, 4, (int)LayerMasks.Grenade)) - { - if (player is { IsScp: true, HumeShield: > 900 }) - player.Hurt(player, 900, armorPenetration: 50); - else if (player.IsHuman) player.Hurt(grenade.PreviousOwner, 150, armorPenetration: 50); - } - } - else if (Physics.Raycast(grenade.Position, player.Position, out _, 20, (int)LayerMasks.Grenade)) - { - player.Hurt(player, 25, armorPenetration: 50); - } - } - - public static void Explode(Pickup? grenade, EP player) - { - if (grenade is null) - { - player.ShowHint("Shits Fucked up :(\nmb gng"); - } - else - { - var lVoloc = grenade.Rigidbody.linearVelocity; - var pos = grenade.Position; - grenade.Destroy(); - var explosiveGrenade = (ExplosiveGrenade)Item.Create(ItemType.GrenadeHE, player); - explosiveGrenade.FuseTime = Vector3.Distance(pos, player.Position) > 7f ? 1f : 5f; - - explosiveGrenade.Projectile.Rigidbody.linearVelocity = lVoloc; - explosiveGrenade.SpawnActive(pos, player); - } - } - - // For when the Coin hasn't been picked up for a set amount of time - public static void CoinHintHandler(Pickup pickup, out CoroutineHandle handle) - { - var glowCoroutine = Timing.RunCoroutine(CoinCoroutine(pickup)); - handle = glowCoroutine; - } - - internal static void NormalizeLockerSpawns(Dictionary spawns, out Vector3 toSpawn) - { - var totalWeight = spawns.Values.Sum(); - var random = new Random(); - - var roll = random.Next(0, (int)totalWeight); - Vector3? selectedLockerType = Locker.Random(lockerType: LockerType.Scp500Pedestal)?.Position; - - foreach (KeyValuePair spawn in spawns) - { - if (roll < spawn.Value) - { - selectedLockerType = spawn.Key; - break; - } - - roll = (int)Mathf.Round(roll - spawn.Value); - } - - Locker[] matchingLockers = Locker.List - .Where(locker => locker.Position == selectedLockerType) - .ToArray(); - - if (matchingLockers.Length == 0) - { - toSpawn = Vector3.zero; - return; - } - - toSpawn = matchingLockers[random.Next(0, matchingLockers.Length)].Position; - } - - internal static Color ParseConfigColor() - { - if (Plugin.Instance is null) return Color.white; - var color = Plugin.Instance.Config.SCP1289Color; - var fallback = Color.white; - if (color[0] == '#') - try - { - var temp = Enumerable.Range(1, color.Length) - .Where(x => x % 2 == 0) - .Select(x => Convert.ToByte(color.Substring(x, 2), 16)) - .ToArray(); - fallback = new Color(temp[0], temp[1], temp[2]); - } - catch (Exception) - { - return fallback; - } - else - switch (color.ToLower()) - { - case "red": - return Color.red; - case "yellow": - return Color.yellow; - case "green": - return Color.green; - case "blue": - return Color.blue; - case "cyan": - return Color.cyan; - case "magenta": - return Color.magenta; - case "black": - return Color.black; - case "gray": - return Color.gray; - } - - return fallback; - } - - internal static Dictionary GetSpawnLocations(SpawnProperties? spawnProperties) - { - if (spawnProperties is null) - { - Log.Warn("SpawnProperties is null."); - return new Dictionary(); - } - - Dictionary spawnLocations = spawnProperties.LockerSpawnPoints - .TakeWhile(lockerSpawnPoints => lockerSpawnPoints.Chance != 0f).ToDictionary( - lockerSpawnPoints => lockerSpawnPoints.Position, lockerSpawnPoints => lockerSpawnPoints.Chance); - foreach (var dynamicSpawnLocation in spawnProperties.DynamicSpawnPoints) - spawnLocations.Add(dynamicSpawnLocation.Position + new Vector3(0, .5f, 0), dynamicSpawnLocation.Chance); - - foreach (var roomSpawnLocation in spawnProperties.RoomSpawnPoints) - spawnLocations.Add(Room.Get(roomSpawnLocation.Room).Position + new Vector3(0, .5f, 0), - roomSpawnLocation.Chance); - foreach (var staticSpawnLocation in spawnProperties.StaticSpawnPoints) - spawnLocations.Add(staticSpawnLocation.Position + new Vector3(0, .5f, 0), staticSpawnLocation.Chance); - - return spawnLocations; - } - - private static IEnumerator CoinCoroutine(Pickup pickup) - { - if (Plugin.Instance != null) - { - yield return Timing.WaitForSeconds(Plugin.Instance.Config.SCP1289Timer); - var intensity = 0; - var light = LightSourceToy.Create(new Vector3(0, 0, 0), pickup.Rotation, pickup.Transform, false); - Lights.Add(light, pickup.Serial); - - light.Color = ParseConfigColor(); - light.Range = Plugin.Instance.Config.SCP1289LightRange; - light.Type = LightType.Tube; - light.ShadowStrength = .5f; - light.Intensity = intensity; - light.Parent = pickup.Transform; - - light.Spawn(); - - while (intensity != 100) - { - light.Intensity = intensity; - yield return Timing.WaitForSeconds(Plugin.Instance.Config.TimeToFullGlow / 100); - intensity++; - } - } - } - - internal static void RemoveLight(Pickup pickup) - { - if (Lights.ContainsKey(Lights.FirstOrDefault(light => light.Value == pickup.Serial).Key)) - { - Lights.Remove(Lights.FirstOrDefault(light => light.Value == pickup.Serial).Key); - Lights.FirstOrDefault(light => light.Value == pickup.Serial).Key.Destroy(); - } - } -} +using Exiled.API.Enums; +using Exiled.API.Features; +using Exiled.API.Features.Items; +using Exiled.API.Features.Lockers; +using Exiled.API.Features.Pickups.Projectiles; +using Exiled.API.Features.Spawn; +using MEC; +using UnityEngine; +using EP = Exiled.API.Features.Player; +using Item = Exiled.API.Features.Items.Item; +using LightSourceToy = LabApi.Features.Wrappers.LightSourceToy; +using Pickup = Exiled.API.Features.Pickups.Pickup; +using Random = System.Random; +using Room = Exiled.API.Features.Room; + +namespace ExtendedItems; + +public static class Utils +{ + private static Dictionary Lights = []; + /// + /// Calculates the global coords of a point inside a room based on the room type and the location + /// + /// + /// + /// Vector3 + public static Vector3 GetGlobalCords(RoomType roomType, Vector3 localPos) + { + var room = Room.Get(roomType); + var roomPos = room.Position; + var quarterTurns = Mathf.RoundToInt(room.Rotation.eulerAngles.y / 90f) % 4; + + return quarterTurns switch + { + 0 => new Vector3(roomPos.x + localPos.x, roomPos.y + localPos.y, roomPos.z + localPos.z), + 1 => new Vector3(roomPos.x + localPos.z, roomPos.y + localPos.y, roomPos.z - localPos.x), + 2 => new Vector3(roomPos.x - localPos.x, roomPos.y + localPos.y, roomPos.z - localPos.z), + 3 => new Vector3(roomPos.x - localPos.z, roomPos.y + localPos.y, roomPos.z + localPos.x), + _ => Vector3.zero + }; + } + + public static void Exploding(EP player) + { + var grenade = (ExplosiveGrenade)Item.Create(ItemType.GrenadeHE); + grenade.FuseTime = 0.1f; + grenade.SpawnActive(player.Position + new Vector3(0, 1, 0), player); + } + + public static void Grenade_Damage(EffectGrenadeProjectile grenade, EP player) + { + if (Vector3.Distance(grenade.Position, player.Position) <= 4) + { + if (Physics.Raycast(grenade.Position, player.Position, out _, 4, (int)LayerMasks.Grenade)) + { + if (player is { IsScp: true, HumeShield: > 900 }) + player.Hurt(player, 900, armorPenetration: 50); + else if (player.IsHuman) player.Hurt(grenade.PreviousOwner, 150, armorPenetration: 50); + } + } + else if (Physics.Raycast(grenade.Position, player.Position, out _, 20, (int)LayerMasks.Grenade)) + { + player.Hurt(player, 25, armorPenetration: 50); + } + } + + public static void Explode(Pickup? grenade, EP player) + { + if (grenade is null) + { + player.ShowHint("Shits Fucked up :(\nmb gng"); + } + else + { + var lVoloc = grenade.Rigidbody.linearVelocity; + var pos = grenade.Position; + grenade.Destroy(); + var explosiveGrenade = (ExplosiveGrenade)Item.Create(ItemType.GrenadeHE, player); + explosiveGrenade.FuseTime = Vector3.Distance(pos, player.Position) > 7f ? 1f : 5f; + + explosiveGrenade.Projectile.Rigidbody.linearVelocity = lVoloc; + explosiveGrenade.SpawnActive(pos, player); + } + } + + // For when the Coin hasn't been picked up for a set amount of time + public static void CoinHintHandler(Pickup pickup, out CoroutineHandle handle) + { + var glowCoroutine = Timing.RunCoroutine(CoinCoroutine(pickup)); + handle = glowCoroutine; + } + + internal static void NormalizeLockerSpawns(Dictionary spawns, out Vector3 toSpawn) + { + var totalWeight = spawns.Values.Sum(); + var random = new Random(); + + var roll = random.Next(0, (int)totalWeight); + Vector3? selectedLockerType = Locker.Random(lockerType: LockerType.Scp500Pedestal)?.Position; + + foreach (KeyValuePair spawn in spawns) + { + if (roll < spawn.Value) + { + selectedLockerType = spawn.Key; + break; + } + + roll = (int)Mathf.Round(roll - spawn.Value); + } + + Locker[] matchingLockers = Locker.List + .Where(locker => locker.Position == selectedLockerType) + .ToArray(); + + if (matchingLockers.Length == 0) + { + toSpawn = Vector3.zero; + return; + } + + toSpawn = matchingLockers[random.Next(0, matchingLockers.Length)].Position; + } + + internal static Color ParseConfigColor() + { + if (Plugin.Instance is null) return Color.white; + var color = Plugin.Instance.Config.SCP1289Color; + var fallback = Color.white; + if (color[0] == '#') + try + { + var temp = Enumerable.Range(1, color.Length) + .Where(x => x % 2 == 0) + .Select(x => Convert.ToByte(color.Substring(x, 2), 16)) + .ToArray(); + fallback = new Color(temp[0], temp[1], temp[2]); + } + catch (Exception) + { + return fallback; + } + else + switch (color.ToLower()) + { + case "red": + return Color.red; + case "yellow": + return Color.yellow; + case "green": + return Color.green; + case "blue": + return Color.blue; + case "cyan": + return Color.cyan; + case "magenta": + return Color.magenta; + case "black": + return Color.black; + case "gray": + return Color.gray; + } + + return fallback; + } + + internal static Dictionary GetSpawnLocations(SpawnProperties? spawnProperties) + { + if (spawnProperties is null) + { + Log.Warn("SpawnProperties is null."); + return new Dictionary(); + } + + Dictionary spawnLocations = spawnProperties.LockerSpawnPoints + .TakeWhile(lockerSpawnPoints => lockerSpawnPoints.Chance != 0f).ToDictionary( + lockerSpawnPoints => lockerSpawnPoints.Position, lockerSpawnPoints => lockerSpawnPoints.Chance); + foreach (var dynamicSpawnLocation in spawnProperties.DynamicSpawnPoints) + spawnLocations.Add(dynamicSpawnLocation.Position + new Vector3(0, .5f, 0), dynamicSpawnLocation.Chance); + + foreach (var roomSpawnLocation in spawnProperties.RoomSpawnPoints) + spawnLocations.Add(Room.Get(roomSpawnLocation.Room).Position + new Vector3(0, .5f, 0), + roomSpawnLocation.Chance); + foreach (var staticSpawnLocation in spawnProperties.StaticSpawnPoints) + spawnLocations.Add(staticSpawnLocation.Position + new Vector3(0, .5f, 0), staticSpawnLocation.Chance); + + return spawnLocations; + } + + private static IEnumerator CoinCoroutine(Pickup pickup) + { + if (Plugin.Instance != null) + { + yield return Timing.WaitForSeconds(Plugin.Instance.Config.SCP1289Timer); + var intensity = 0; + var light = LightSourceToy.Create(new Vector3(0, 0, 0), pickup.Rotation, pickup.Transform, false); + Lights.Add(light, pickup.Serial); + + light.Color = ParseConfigColor(); + light.Range = Plugin.Instance.Config.SCP1289LightRange; + light.Type = LightType.Tube; + light.ShadowStrength = .5f; + light.Intensity = intensity; + light.Parent = pickup.Transform; + + light.Spawn(); + + while (intensity != 100) + { + light.Intensity = intensity; + yield return Timing.WaitForSeconds(Plugin.Instance.Config.TimeToFullGlow / 100); + intensity++; + } + } + } + + internal static void RemoveLight(Pickup pickup) + { + if (Lights.ContainsKey(Lights.FirstOrDefault(light => light.Value == pickup.Serial).Key)) + { + Lights.Remove(Lights.FirstOrDefault(light => light.Value == pickup.Serial).Key); + Lights.FirstOrDefault(light => light.Value == pickup.Serial).Key.Destroy(); + } + } +}