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(); + } + } +}