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
deleted file mode 100644
index 2853293..0000000
--- a/Config.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System.ComponentModel;
-using Exiled.API.Interfaces;
-using ExtendedItems.Items;
-
-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 bool NukeTranq { get; set; } = true;
-
- [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",
- ];
-
- #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 AdminAbuse AdminAbuse { get; set; } = new();
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/ExtendedItems.csproj b/ExtendedItems.csproj
index a9168a1..d0d3c04 100644
--- a/ExtendedItems.csproj
+++ b/ExtendedItems.csproj
@@ -4,7 +4,8 @@
net48
enable
enable
- preview
+ latest
+ Library
true
@@ -13,7 +14,7 @@
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
@@ -21,323 +22,395 @@
+
+ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Assembly-CSharp.dll
+
- C:\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\Assembly-CSharp-firstpass.dll
- C:\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\BouncyCastle.Cryptography.dll
- C:\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\Caress.dll
- C:\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\CommandSystem.Core.dll
+
+
+ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\CustomPasses.dll
- C:\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\DnsClient.dll
+
+
+ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Facepunch.Steamworks.Posix.dll
- C:\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\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
- C:\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.dll
- C:\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\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
+ ..\..\..\..\mnt\games\SteamLibrary\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\netstandard.dll
+ ..\..\..\..\mnt\games\SteamLibrary\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
+ ..\..\..\..\mnt\games\SteamLibrary\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
+ ..\..\..\..\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
- C:\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.ComponentModel.Composition.dll
- C:\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.Configuration.dll
- C:\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.Data.DataSetExtensions.dll
- C:\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.EnterpriseServices.dll
- C:\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.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
- C:\Program Files (x86)\Steam\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.Net.Http.dll
- C:\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.dll
- C:\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.Runtime.CompilerServices.Unsafe.dll
- C:\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.Security.dll
- C:\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.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
- C:\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\System.Transactions.dll
- C:\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.dll
- C:\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.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
- C:\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.Mathematics.dll
- C:\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.dll
- C:\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.Csg.dll
- C:\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.KdTree.dll
- C:\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.Poly2Tri.dll
- C:\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.ProBuilder.Stl.dll
+
+
+ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.Rendering.LightTransport.Runtime.dll
- C:\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.dll
+
+
+ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.Core.Runtime.Shared.dll
- C:\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.Core.ShaderLibrary.dll
+
+
+ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\Unity.RenderPipelines.GPUDriven.Runtime.dll
- C:\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.Config.Runtime.dll
- C:\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.HighDefinition.Runtime.dll
- C:\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.RenderPipelines.ShaderGraph.ShaderGraphLibrary.dll
- C:\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.TextMeshPro.dll
- C:\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\Unity.VisualEffectGraph.Runtime.dll
+
+
+ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.dll
- C:\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.AccessibilityModule.dll
- C:\Program Files (x86)\Steam\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.AIModule.dll
- C:\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.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
+ ..\..\..\..\mnt\games\SteamLibrary\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.AssetBundleModule.dll
+ ..\..\..\..\mnt\games\SteamLibrary\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
+ ..\..\..\..\mnt\games\SteamLibrary\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
+ ..\..\..\..\mnt\games\SteamLibrary\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
+ ..\..\..\..\mnt\games\SteamLibrary\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
+ ..\..\..\..\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
- C:\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.CoreModule.dll
- C:\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.CrashReportingModule.dll
- C:\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.DirectorModule.dll
- C:\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.DSPGraphModule.dll
- C:\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.GameCenterModule.dll
- C:\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.GIModule.dll
+
+
+ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.GraphicsStateCollectionSerializerModule.dll
- C:\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.GridModule.dll
+
+
+ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.HierarchyCoreModule.dll
- C:\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.HotReloadModule.dll
- C:\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.ImageConversionModule.dll
- C:\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.IMGUIModule.dll
+
+
+ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.InputForUIModule.dll
- C:\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.InputLegacyModule.dll
- C:\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.InputModule.dll
- C:\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.JSONSerializeModule.dll
- C:\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.LocalizationModule.dll
-
- C:\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.MarshallingModule.dll
+
+
+ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.MultiplayerModule.dll
- C:\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.ParticleSystemModule.dll
- C:\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.PerformanceReportingModule.dll
- C:\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.Physics2DModule.dll
- C:\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.PhysicsModule.dll
+
+
+ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.PropertiesModule.dll
- C:\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.RuntimeInitializeOnLoadManagerInitializerModule.dll
- C:\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.ScreenCaptureModule.dll
+
+
+ ..\..\..\..\mnt\games\SteamLibrary\steamapps\common\SCP Secret Laboratory Dedicated Server\SCPSL_Data\Managed\UnityEngine.ShaderVariantAnalyticsModule.dll
- C:\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.SharedInternalsModule.dll
- C:\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.SpriteMaskModule.dll
- C:\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.SpriteShapeModule.dll
- C:\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.StreamingModule.dll
- C:\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.SubstanceModule.dll
- C:\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.SubsystemsModule.dll
- C:\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.TerrainModule.dll
- C:\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.TerrainPhysicsModule.dll
- C:\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.TextCoreFontEngineModule.dll
- C:\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.TextCoreTextEngineModule.dll
- C:\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.TextRenderingModule.dll
- C:\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.TilemapModule.dll
- C:\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.TLSModule.dll
- C:\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.UI.dll
- C:\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.UIElementsModule.dll
- C:\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.UIModule.dll
- C:\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.UmbraModule.dll
- C:\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.UnityAnalyticsCommonModule.dll
- C:\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.UnityAnalyticsModule.dll
- C:\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.UnityConnectModule.dll
- C:\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.UnityCurlModule.dll
- C:\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.UnityTestProtocolModule.dll
- C:\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.UnityWebRequestAssetBundleModule.dll
- C:\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.UnityWebRequestAudioModule.dll
- C:\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.UnityWebRequestModule.dll
- C:\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.UnityWebRequestTextureModule.dll
- C:\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.UnityWebRequestWWWModule.dll
- C:\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.VehiclesModule.dll
- C:\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.VFXModule.dll
- C:\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.VideoModule.dll
- C:\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.VirtualTexturingModule.dll
- C:\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.VRModule.dll
- C:\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.WindModule.dll
- C:\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\UnityEngine.XRModule.dll
- C:\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\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\zxing.dll
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
deleted file mode 100644
index aa9ac69..0000000
--- a/Items/Coin.cs
+++ /dev/null
@@ -1,131 +0,0 @@
-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.Player;
-using ExtendedItems.Types;
-using MEC;
-using PlayerStatsSystem;
-using UnityEngine;
-using PlayerEvents = Exiled.Events.Handlers.Player;
-
-namespace ExtendedItems.Items
-{
- [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()
- {
- 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 =>
- [
- 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.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);
- }
- }
- 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);
- });
- }
- }
- });
- }
-
- private static void OnRoleChanging(ChangingRoleEventArgs ev)
- {
- ev.Player.Scale = Vector3.one;
- ev.Player.DisableAllEffects();
- }
- }
-}
\ No newline at end of file
diff --git a/Items/GrenadeLauncher.cs b/Items/GrenadeLauncher.cs
deleted file mode 100644
index e5f26a8..0000000
--- a/Items/GrenadeLauncher.cs
+++ /dev/null
@@ -1,111 +0,0 @@
-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 YamlDotNet.Serialization;
-using E = ExtendedItems.Utils;
-using ItemEvents = Exiled.Events.Handlers.Item;
-
-namespace ExtendedItems.Items
-{
- [CustomItem(ItemType.GunLogicer)]
- public class GrenadeLauncher : CustomWeapon
- {
- 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,
- DynamicSpawnPoints =
- [
- new DynamicSpawnPoint
- {
- Chance = 100,
- Location = SpawnLocationType.InsideHidChamber,
- },
- ],
- };
-
- protected override void OnShooting(ShootingEventArgs ev)
- {
- var throwable = ev.Player.ThrowGrenade(ProjectileType.FragGrenade);
- var ammo = E.Subtract((ushort)ev.Firearm.MagazineAmmo);
-
- 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)
- {
- 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);
- }
- else
- {
- var ammo = ev.Player.GetAmmo(AmmoType.Nato762);
- ammo -= Plugin.Instance.Config.GrenadeLauncherAmmoUsage;
- ev.Player.SetAmmo(AmmoType.Nato762, ammo) ;
- }
- base.OnReloading(ev);
- }
-
- protected override void SubscribeEvents()
- {
- ItemEvents.ChangingAttachments += OnChangingAttachments;
-
- base.SubscribeEvents();
- }
-
- protected override void UnsubscribeEvents()
- {
- ItemEvents.ChangingAttachments -= OnChangingAttachments;
-
- base.UnsubscribeEvents();
- }
-
- private void OnChangingAttachments(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;
-
- base.OnChangingAttachment(ev);
- }
- }
-}
\ No newline at end of file
diff --git a/Items/Plastic.cs b/Items/Plastic.cs
deleted file mode 100644
index 96c0519..0000000
--- a/Items/Plastic.cs
+++ /dev/null
@@ -1,192 +0,0 @@
-// Exiled imports
-
-using Exiled.API.Enums;
-using Exiled.API.Features;
-using Exiled.API.Features.Attributes;
-using Exiled.API.Features.Items;
-using Exiled.API.Features.Pickups;
-using Exiled.API.Features.Spawn;
-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 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
-{
- [CustomItem(ItemType.GrenadeHE)]
- public class Plastic : CustomGrenade
- {
- 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";
-
- 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 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 SpawnProperties? SpawnProperties { get; set; } = new()
- {
- Limit = 2,
- 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;
-
- if (detonator == null) method = C4RemoveMethod.Drop;
- else
- {
- detonator = Charges.TryGetValue(charge.Serial, out var foundPlayer)
- ? foundPlayer
- : null;
- }
-
-#pragma warning disable CS8602
- switch (method)
- {
- case C4RemoveMethod.Detonate:
- {
- var grenade = (ExplosiveGrenade) Item.Create(Type);
- grenade.FuseTime = 0.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();
- }
-#pragma warning restore CS8602
- protected override void SubscribeEvents()
- {
- Instance = this;
-
- PlayerEvent.Destroying += OnDestroying;
- PlayerEvent.Died += OnDied;
- PlayerEvent.Shooting += OnShooting;
-
- ServerEvent.RoundEnded += OnRoundEnded;
-
- base.SubscribeEvents();
- }
-
- protected override void UnsubscribeEvents()
- {
- PlayerEvent.Destroying -= OnDestroying;
- PlayerEvent.Died -= OnDied;
- PlayerEvent.Shooting -= OnShooting;
-
- ServerEvent.RoundEnded -= OnRoundEnded;
-
- base.UnsubscribeEvents();
- }
-
- protected override void OnWaitingForPlayers()
- {
- PlacedCharges.Clear();
- base.OnWaitingForPlayers();
- }
-
- 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);
- }
-
- protected override void OnExploding(ExplodingGrenadeEventArgs ev)
- {
- Log.Debug("Executing OnExploding method.");
- PlacedCharges.Remove(ev.Projectile);
-
- 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 OnDied(DiedEventArgs ev)
- {
- foreach (var charge in PlacedCharges.ToList().Where(charge => charge.Value == ev.Player))
- Handler(charge.Key);
-
- }
-
- 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 (PlacedCharges.ContainsKey(Pickup.Get(grenade))) Handler(Pickup.Get(grenade), C4RemoveMethod.Remove);
-
- }
-
- private static void OnRoundEnded(RoundEndedEventArgs ev)
- {
- PlacedCharges.Clear();
- }
- }
-}
\ No newline at end of file
diff --git a/Items/Scp1499.cs b/Items/Scp1499.cs
deleted file mode 100644
index e9ec07d..0000000
--- a/Items/Scp1499.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-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.Player;
-using MEC;
-using UnityEngine;
-using YamlDotNet.Serialization;
-using PlayerEvents = Exiled.Events.Handlers.Player;
-
-namespace ExtendedItems.Items
-{
- [CustomItem(ItemType.SCP268)]
- public class Scp1499 : CustomItem
- {
- [YamlIgnore] private readonly Dictionary _lastPositions = [];
-
- [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);
-
- 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;
-
- [Description("Room to teleport player to after using SCP-1499.")]
- private RoomType TeleportRoom = RoomType.Hcz106;
-
- [Description("Time for player to wander in seconds.")]
- private float Duration = 15f;
-
- public override SpawnProperties? SpawnProperties { get; set; } = new()
- {
- Limit = 1,
- LockerSpawnPoints =
- [
- new LockerSpawnPoint { Type = LockerType.Scp268Pedestal, Chance = 100, Zone = ZoneType.LightContainment, },
- ],
- };
-
- private void OnUsingItem(UsingItemEventArgs ev)
- {
- if (!Check(ev.Item)) return;
- if (ev.Player.IsInPocketDimension || Utils.PDWarning(ev.Player))
- {
- 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;
- }
- }
-
- private void OnUsedItem(UsedItemEventArgs ev)
- {
- if (!Check(ev.Item)) return;
-
- ev.Player.DisableEffect(EffectType.Invisible);
- ev.Player.EnableEffect(EffectType.DamageReduction, byte.MaxValue, Duration);
-
- 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));
- }
-
- 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);
-
- _lastPositions.Remove(netId);
- Timing.KillCoroutines(lastPos.Item3);
- }
-
- protected override void SubscribeEvents()
- {
- PlayerEvents.UsedItem += OnUsedItem;
- PlayerEvents.UsingItem += OnUsingItem;
-
- base.SubscribeEvents();
- }
-
- protected override void UnsubscribeEvents()
- {
- PlayerEvents.UsedItem -= OnUsedItem;
- PlayerEvents.UsingItem -= OnUsingItem;
-
- base.UnsubscribeEvents();
- }
-
- 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);
-
- base.OnDroppingItem(ev);
- }
- }
-}
\ No newline at end of file
diff --git a/Items/Sniper.cs b/Items/Sniper.cs
deleted file mode 100644
index 26aa92c..0000000
--- a/Items/Sniper.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-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 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";
-
- public override string Description { get; set; } =
- "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 byte ClipSize { get; set; } = 1;
-
- [YamlIgnore]
- public override AttachmentName[] Attachments { get; set; } =
- [
- AttachmentName.LowcapMagAP, AttachmentName.Foregrip, AttachmentName.DotSight,
- AttachmentName.RecoilReducingStock, AttachmentName.CarbineBody, AttachmentName.MuzzleBrake,
- ];
-
- public override SpawnProperties? SpawnProperties { get; set; } = new()
- {
- Limit = 1,
- RoomSpawnPoints =
- [
- new RoomSpawnPoint { Room = RoomType.HczArmory, Chance = 100, },
- ],
- };
-
- protected override void SubscribeEvents()
- {
- ItemEvents.ChangingAttachments += OnChangingAttachments;
-
- base.SubscribeEvents();
- }
-
- protected override void UnsubscribeEvents()
- {
- ItemEvents.ChangingAttachments -= OnChangingAttachments;
-
- base.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);
-
- }
- }
-}
\ No newline at end of file
diff --git a/Items/Tranquilizer.cs b/Items/Tranquilizer.cs
deleted file mode 100644
index f5bc466..0000000
--- a/Items/Tranquilizer.cs
+++ /dev/null
@@ -1,154 +0,0 @@
-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.Player;
-using MEC;
-using PlayerRoles;
-using PlayerRoles.PlayableScps.Scp096;
-using PlayerStatsSystem;
-using UnityEngine;
-using YamlDotNet.Serialization;
-using Random = System.Random;
-using Scp096Role = Exiled.API.Features.Roles.Scp096Role;
-using PlayerEvents = Exiled.Events.Handlers.Player;
-
-namespace ExtendedItems.Items
-{
- [CustomItem(ItemType.GunCOM15)]
- 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;
-
- 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;
-
- [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 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;
-
-
- 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();
- }
-
- private void OnChangingRole(ChangingRoleEventArgs ev)
- {
- if (!_resistances.ContainsKey(ev.Player.NetId)) return;
- _resistances[ev.Player.NetId] = 0;
- }
-
- protected override void OnShot(ShotEventArgs ev)
- {
- 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;
- }
-
-
- var rand = _rng.NextDouble();
- _resistances.TryGetValue(ev.Target.NetId, out var tResistance);
-
- var effective = ev.Target.IsScp ? rand < ScpChance - tResistance : rand < HumanChance - tResistance;
-
- if ((ev.Target.Role == RoleTypeId.Scp173 && !EffectiveOn173) || !effective)
- {
- base.OnShot(ev);
- return;
- }
-
- var lift = ev.Player.Lift;
-
- ev.Target.Scale = Vector3.zero;
- _resistances[ev.Target.NetId] = tResistance + Resistance;
-
- 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);
-
- Ragdoll? ragdoll = null;
-
- 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
deleted file mode 100644
index 05b49e3..0000000
--- a/Plugin.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using Discord;
-using Exiled.API.Features;
-using Exiled.CustomItems.API.Features;
-using UnityEngine;
-using UserSettings.ServerSpecific;
-
-namespace ExtendedItems
-{
- // ReSharper disable once ClassNeverInstantiated.Global
- public class Plugin : Plugin
- {
- public static Plugin? Instance;
-
- 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 RequiredExiledVersion => new(9, 7, 0);
-
- public override void OnEnabled()
- {
- Instance = this;
-
- Ssss.Register();
-
- Log.Send("Registering items", LogLevel.Info, ConsoleColor.DarkYellow);
- CustomItem.RegisterItems(overrideClass: Config);
-
- _settings =
- [
- new SSGroupHeader(10, "Extended Items"),
- new SSKeybindSetting(24, "C4 Detonation", KeyCode.Delete, hint: "Explodes all C4 placed by you"),
- ];
-
- ServerSpecificSettingsSync.DefinedSettings = _settings.ToArray();
-
- base.OnEnabled();
- }
-
- public override void OnDisabled()
- {
- Log.Send("Unregistering items", LogLevel.Info, ConsoleColor.DarkYellow);
- CustomItem.UnregisterItems();
-
- Ssss.Unregister();
-
- _settings = null;
- Instance = null;
-
- 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
deleted file mode 100644
index eef85e9..0000000
--- a/Ssss.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-using Exiled.API.Features;
-using Exiled.API.Features.Core.UserSettings;
-using ExtendedItems.Items;
-using UnityEngine;
-using UserSettings.ServerSpecific;
-
-namespace ExtendedItems
-{
- public class Ssss
- {
- // ReSharper disable once InconsistentNaming
- private static IEnumerable? _settings;
-
- public static void Register()
- {
- Log.Info("Keybind Registered");
- ServerSpecificSettingsSync.ServerOnSettingValueReceived += Keybind;
-
- _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;
- }
-
- 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;
-
- Log.Info("Keybind used by " + player.Nickname);
- if (keybindSetting.SettingId == 24)
- {
- 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");
- }
-
- 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
deleted file mode 100644
index 8e6c0e9..0000000
--- a/Types/CoinEffect.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-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/Utils.cs
deleted file mode 100644
index adecafa..0000000
--- a/Utils.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-using System.ComponentModel;
-using Exiled.API.Enums;
-using Exiled.API.Features;
-using Exiled.API.Features.Items;
-using PlayerRoles;
-using UnityEngine;
-using EP = Exiled.API.Features.Player;
-
-namespace ExtendedItems
-{
- 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)
- {
- var room = Room.Get(roomType);
-
- var rotation = room.Rotation;
- var roomPos = room.Position;
-
- 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,
- };
- }
-
- ///
- /// 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)
- {
- 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();
- }
-
- 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));
- }
- }
-}
\ 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",
diff --git a/src/Config.cs b/src/Config.cs
new file mode 100644
index 0000000..eb764a7
--- /dev/null
+++ b/src/Config.cs
@@ -0,0 +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
+}
\ No newline at end of file
diff --git a/src/EventHandler.cs b/src/EventHandler.cs
new file mode 100644
index 0000000..f1a1867
--- /dev/null
+++ b/src/EventHandler.cs
@@ -0,0 +1,20 @@
+using Exiled.API.Enums;
+using Exiled.Events.EventArgs.Map;
+
+namespace ExtendedItems;
+
+public class EventHandler
+{
+ public static void OnGrenadeExploding(ExplodingGrenadeEventArgs ev)
+ {
+ foreach (var player in ev.TargetsToAffect.ToArray()) Utils.Grenade_Damage(ev.Projectile, player);
+ }
+
+ public static void OnFillingLockers(FillingLockerEventArgs ev)
+ {
+ if (ev.Pickup.Type == ItemType.GunFRMG0)
+ {
+ ev.IsAllowed = false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Items/Coin.cs b/src/Items/Coin.cs
new file mode 100644
index 0000000..6806752
--- /dev/null
+++ b/src/Items/Coin.cs
@@ -0,0 +1,202 @@
+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.Player;
+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 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;
+
+ private CoroutineHandle _handler;
+ private LightSourceToy? _lightSourceToy;
+
+ 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 }
+ ]
+ };
+
+ ~Coin()
+ {
+ if (_handler.IsValid) Timing.KillCoroutines(_handler);
+ _lightSourceToy = null;
+ _handler = default;
+ }
+
+ [Description("Effects to give if coin landed on heads.")]
+ private static CoinEffect[] Effects =>
+ [
+ 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 = 25 }
+ ];
+
+ protected override void SubscribeEvents()
+ {
+ PlayerEvents.FlippingCoin += OnFlippingCoin;
+ PlayerEvents.ChangingRole += OnRoleChanging;
+ PlayerEvents.ItemAdded += ItemAdded;
+
+ base.SubscribeEvents();
+ }
+
+ 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;
+ if (ev.IsAllowed)
+ {
+ Timing.CallDelayed(2f,
+ () =>
+ {
+ if (ev.IsTails)
+ {
+ 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);
+ ev.Player.DisableEffect(EffectType.AntiScp207);
+ }
+ 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
+ {
+ 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;
+
+ Timing.CallDelayed(5f, () => { ev.IsAllowed = true; });
+ }
+ else
+ {
+ ev.Player.ShowHint("Wait", 1f);
+ }
+ }
+
+ protected override void OnDroppingItem(DroppingItemEventArgs ev)
+ {
+ 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 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/src/Items/Plastic.cs b/src/Items/Plastic.cs
new file mode 100644
index 0000000..44212c9
--- /dev/null
+++ b/src/Items/Plastic.cs
@@ -0,0 +1,233 @@
+// Exiled imports
+
+using Exiled.API.Enums;
+using Exiled.API.Features;
+using Exiled.API.Features.Attributes;
+using Exiled.API.Features.Items;
+using Exiled.API.Features.Pickups;
+using Exiled.API.Features.Spawn;
+using Exiled.CustomItems.API.Features;
+using Exiled.Events.EventArgs.Map;
+using Exiled.Events.EventArgs.Player;
+using InventorySystem.Items.ThrowableProjectiles;
+using UnityEngine;
+using Map = Exiled.Events.Handlers.Map;
+
+// shortened imports
+using PlayerEvent = Exiled.Events.Handlers.Player;
+using RoundEndedEventArgs = Exiled.Events.EventArgs.Server.RoundEndedEventArgs;
+using ServerEvent = Exiled.Events.Handlers.Server;
+
+namespace ExtendedItems.Items;
+
+[CustomItem(ItemType.GrenadeHE)]
+public class Plastic : CustomGrenade
+{
+ 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";
+
+ 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 uint Id { get; set; } = 6;
+ public override float Weight { get; set; } = 1.5f;
+ 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; } = [];
+ private static Dictionary Charges { get; } = [];
+
+ // ReSharper disable once RedundantDefaultMemberInitializer
+ public static Plastic? Instance { get; private set; } = null!;
+
+ private Vector3 _toSpawn;
+
+ 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 = Utils.GetSpawnLocations(Instance?.SpawnPoints);
+
+ private void OnFillingLocker(FillingLockerEventArgs ev)
+ {
+ if (ev.Chamber is null || ev.Pickup is null)
+ {
+ return;
+ }
+
+ 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);
+ }
+ }
+
+ 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)
+ {
+ 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;
+ }
+ }
+
+ PlacedCharges.Remove(charge);
+ charge.Destroy();
+ }
+#pragma warning restore CS8602
+ protected override void SubscribeEvents()
+ {
+ Instance = this;
+
+ Map.FillingLocker += OnFillingLocker;
+
+ PlayerEvent.Destroying += OnDestroying;
+ PlayerEvent.Died += OnDied;
+ PlayerEvent.Shooting += OnShooting;
+
+ ServerEvent.RoundEnded += OnRoundEnded;
+
+ base.SubscribeEvents();
+ }
+
+ protected override void UnsubscribeEvents()
+ {
+ Map.FillingLocker -= OnFillingLocker;
+
+ PlayerEvent.Destroying -= OnDestroying;
+ PlayerEvent.Died -= OnDied;
+ PlayerEvent.Shooting -= OnShooting;
+
+ ServerEvent.RoundEnded -= OnRoundEnded;
+
+ Instance = null;
+
+ base.UnsubscribeEvents();
+ }
+
+ protected override void OnWaitingForPlayers()
+ {
+ PlacedCharges.Clear();
+ base.OnWaitingForPlayers();
+ }
+
+ protected override void OnThrownProjectile(ThrownProjectileEventArgs ev)
+ {
+ if (!Check(ev.Item)) return;
+ 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);
+ }
+
+ protected override void OnExploding(ExplodingGrenadeEventArgs ev)
+ {
+ Log.Debug("Executing OnExploding method.");
+ PlacedCharges.Remove(ev.Projectile);
+
+ base.OnExploding(ev);
+ }
+
+ private void OnDestroying(DestroyingEventArgs ev)
+ {
+ 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)
+ {
+ 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 is null) return;
+ if (PlacedCharges.ContainsKey(Pickup.Get(grenade))) Handler(Pickup.Get(grenade), C4RemoveMethod.Remove);
+ }
+
+ private static void OnRoundEnded(RoundEndedEventArgs ev)
+ {
+ PlacedCharges.Clear();
+ }
+}
\ No newline at end of file
diff --git a/src/Items/Scp1499.cs b/src/Items/Scp1499.cs
new file mode 100644
index 0000000..b377a37
--- /dev/null
+++ b/src/Items/Scp1499.cs
@@ -0,0 +1,118 @@
+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.Player;
+using MEC;
+using PlayerRoles;
+using UnityEngine;
+using YamlDotNet.Serialization;
+using PlayerEvents = Exiled.Events.Handlers.Player;
+
+namespace ExtendedItems.Items;
+
+[CustomItem(ItemType.SCP268)]
+public class Scp1499 : CustomItem
+{
+ [Description("Room to teleport player to after using SCP-1499.")]
+ // ReSharper disable once InconsistentNaming
+ private const RoomType _teleportRoom = RoomType.Hcz106;
+
+ [Description("Time for player to wander in seconds.")]
+ // ReSharper disable once InconsistentNaming
+ private const float _duration = 15f;
+
+ [YamlIgnore] private readonly Dictionary _lastPositions = [];
+
+ [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);
+
+ 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 = 0
+ };
+
+ private void OnUsingItem(UsingItemEventArgs ev)
+ {
+ if (!Check(ev.Item)) return;
+
+ 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.");
+ ev.IsAllowed = false;
+ ev.Cooldown = 0.5f;
+ }
+ }
+
+ 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;
+
+ ev.Player.DisableEffect(EffectType.Invisible);
+ ev.Player.EnableEffect(EffectType.DamageReduction, byte.MaxValue, _duration);
+
+ 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));
+ }
+
+ 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);
+
+ _lastPositions.Remove(netId);
+ Timing.KillCoroutines(lastPos.Item3);
+ }
+
+ protected override void SubscribeEvents()
+ {
+ PlayerEvents.UsedItem += OnUsedItem;
+ PlayerEvents.UsingItem += OnUsingItem;
+
+ base.SubscribeEvents();
+ }
+
+ protected override void UnsubscribeEvents()
+ {
+ PlayerEvents.UsedItem -= OnUsedItem;
+ PlayerEvents.UsingItem -= OnUsingItem;
+
+ base.UnsubscribeEvents();
+ }
+
+ 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);
+
+ base.OnDroppingItem(ev);
+ }
+}
diff --git a/src/Items/Sniper.cs b/src/Items/Sniper.cs
new file mode 100644
index 0000000..d99dc0e
--- /dev/null
+++ b/src/Items/Sniper.cs
@@ -0,0 +1,156 @@
+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 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 override uint Id { get; set; } = 2;
+ public override string Name { get; set; } = "SR-118";
+
+ public override string Description { get; set; } =
+ "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; } = 0f;
+ public override byte ClipSize { get; set; } = 1;
+
+ [YamlIgnore]
+ public override AttachmentName[] Attachments { get; set; } =
+ [
+ AttachmentName.LowcapMagAP,
+ AttachmentName.Foregrip,
+ AttachmentName.DotSight,
+ AttachmentName.RecoilReducingStock,
+ AttachmentName.RifleBody,
+ AttachmentName.MuzzleBrake
+ ];
+
+ public override SpawnProperties? SpawnProperties { get; set; } = new()
+ {
+ Limit = 1,
+ LockerSpawnPoints =
+ [
+ new LockerSpawnPoint
+ {
+ Type = LockerType.RifleRack,
+ Chance = 100,
+ UseChamber = true,
+ Zone = ZoneType.HeavyContainment
+ }
+ ]
+ };
+
+ protected override void SubscribeEvents()
+ {
+ ItemEvents.ChangingAttachments += OnChangingAttachments;
+
+ base.SubscribeEvents();
+ }
+
+ protected override void UnsubscribeEvents()
+ {
+ ItemEvents.ChangingAttachments -= OnChangingAttachments;
+
+ 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;
+
+ // 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 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/src/Items/Tranquilizer.cs b/src/Items/Tranquilizer.cs
new file mode 100644
index 0000000..fd45ef0
--- /dev/null
+++ b/src/Items/Tranquilizer.cs
@@ -0,0 +1,150 @@
+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.Player;
+using MEC;
+using PlayerRoles;
+using PlayerRoles.PlayableScps.Scp096;
+using PlayerStatsSystem;
+using UnityEngine;
+using YamlDotNet.Serialization;
+using Random = System.Random;
+using Scp096Role = Exiled.API.Features.Roles.Scp096Role;
+using PlayerEvents = Exiled.Events.Handlers.Player;
+
+namespace ExtendedItems.Items;
+
+[CustomItem(ItemType.GunCOM15)]
+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;
+
+ 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;
+
+ [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 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;
+
+
+ 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();
+ }
+
+ private void OnChangingRole(ChangingRoleEventArgs ev)
+ {
+ if (!_resistances.ContainsKey(ev.Player.NetId)) return;
+ _resistances[ev.Player.NetId] = 0;
+ }
+
+ 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 (ev.Player.ActiveEffects.Any(effect => effect.name != "Invigorated")) return;
+
+
+ var rand = _rng.NextDouble();
+ _resistances.TryGetValue(ev.Target.NetId, out var tResistance);
+
+ var effective = ev.Target.IsScp ? rand < ScpChance - tResistance : rand < HumanChance - tResistance;
+
+ if ((ev.Target.Role == RoleTypeId.Scp173 && !EffectiveOn173) || !effective)
+ {
+ base.OnShot(ev);
+ return;
+ }
+
+ var lift = ev.Player.Lift;
+
+ ev.Target.Scale = Vector3.zero;
+ _resistances[ev.Target.NetId] = tResistance + Resistance;
+
+ 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);
+
+ Ragdoll? ragdoll = null;
+
+ if (ev.Target.IsHuman)
+ {
+ ev.Target.CurrentItem = null;
+ ev.Target.EnableEffect(EffectType.AmnesiaItems, byte.MaxValue);
+ }
+ else
+ {
+ 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, () =>
+ {
+ ev.Target.Inventory.enabled = true;
+ ev.Target.IsGodModeEnabled = false;
+ ev.Target.DisableEffect(EffectType.Ensnared);
+ ev.Target.DisableEffect(EffectType.Flashed);
+ ev.Target.DisableEffect(EffectType.Deafened);
+ if (ev.Player.IsHuman) ev.Target.DisableEffect(EffectType.AmnesiaItems);
+ ev.Target.DisableEffect(EffectType.DamageReduction);
+
+ 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();
+ });
+
+ base.OnShot(ev);
+ }
+}
\ No newline at end of file
diff --git a/src/Plugin.cs b/src/Plugin.cs
new file mode 100644
index 0000000..924ed97
--- /dev/null
+++ b/src/Plugin.cs
@@ -0,0 +1,63 @@
+using Discord;
+using Exiled.API.Features;
+using Exiled.CustomItems.API.Features;
+using UnityEngine;
+using UserSettings.ServerSpecific;
+using Map = Exiled.Events.Handlers.Map;
+
+namespace ExtendedItems;
+
+// ReSharper disable once ClassNeverInstantiated.Global
+public class Plugin : Plugin
+{
+ public static Plugin? Instance;
+
+ public static EventHandler? _event;
+
+ private List? _settings;
+ public override string Name => "Extended Items";
+ public override string Author => "Noobest1001";
+ public override Version Version => new(4, 0, 0);
+ public override Version RequiredExiledVersion => new(9, 14, 2);
+
+ public override void OnEnabled()
+ {
+ Instance = this;
+ _event = new EventHandler();
+
+ Ssss.Register();
+
+ 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")
+ ];
+
+ ServerSpecificSettingsSync.DefinedSettings = _settings.ToArray();
+
+ Map.ExplodingGrenade += EventHandler.OnGrenadeExploding;
+ Map.FillingLocker += EventHandler.OnFillingLockers;
+
+ base.OnEnabled();
+ }
+
+ public override void OnDisabled()
+ {
+ Map.ExplodingGrenade -= EventHandler.OnGrenadeExploding;
+ Map.FillingLocker -= EventHandler.OnFillingLockers;
+
+ Log.Send("Unregistering items", LogLevel.Info, ConsoleColor.DarkYellow);
+ CustomItem.UnregisterItems();
+
+ Ssss.Unregister();
+
+ _settings = null;
+ _event = null;
+ Instance = null;
+
+ base.OnDisabled();
+ }
+}
\ No newline at end of file
diff --git a/src/Ssss.cs b/src/Ssss.cs
new file mode 100644
index 0000000..bf00dfc
--- /dev/null
+++ b/src/Ssss.cs
@@ -0,0 +1,69 @@
+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;
+
+public class Ssss
+{
+ // ReSharper disable once InconsistentNaming
+ private static IEnumerable? _settings;
+
+ 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
+ ]);
+ }
+
+ 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;
+
+ Log.Info("Keybind used by " + player.Nickname);
+ if (keybindSetting.SettingId == 24)
+ {
+ var i = 0;
+ foreach (KeyValuePair 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");
+ }
+
+ 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/src/Types/CoinEffect.cs b/src/Types/CoinEffect.cs
new file mode 100644
index 0000000..f7383a9
--- /dev/null
+++ b/src/Types/CoinEffect.cs
@@ -0,0 +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; }
+}
\ No newline at end of file
diff --git a/src/Utils.cs b/src/Utils.cs
new file mode 100644
index 0000000..5259eef
--- /dev/null
+++ b/src/Utils.cs
@@ -0,0 +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();
+ }
+ }
+}