diff --git a/CustomClasses/BloodFueledManager.cs b/CustomClasses/BloodFueledManager.cs new file mode 100644 index 0000000..d670ae9 --- /dev/null +++ b/CustomClasses/BloodFueledManager.cs @@ -0,0 +1,96 @@ +using CustomPlayerEffects; +using LabApi.Features.Wrappers; +using Mirror; +using PlayerRoles.FirstPersonControl; +using UnityEngine; +using UnityEngine.SceneManagement; +using Logger = LabApi.Features.Console.Logger; +using Random = System.Random; + +namespace CustomClasses; + +public abstract class CustomPlayerEffect : StatusEffectBase +{ + private static bool _isLoaded; + + public Player Owner { get; private set; } = null!; + + protected override void Start() + { + Owner = Player.Get(Hub); + base.Start(); + } + + public override string ToString() => $"{GetType().Name}: Owner ({Owner}) - Intensity ({Intensity}) - Duration {Duration}"; + + internal static void Initialize() + { + SceneManager.sceneLoaded += (_, _) => + { + if (_isLoaded) + return; + + _isLoaded = true; + + var playerEffects = NetworkManager.singleton.playerPrefab.GetComponent().playerEffectsController.effectsGameObject.transform; + var type = typeof(DisableStaminaRegenEffect); + if (!typeof(StatusEffectBase).IsAssignableFrom(type)) + { + Logger.Error($"[CustomPlayerEffect.Initialize] {type.FullName} is not a valid StatusEffectBase and thus could not be registered!"); + return; + } + + // register effect into prefab + new GameObject(type.Name, type).transform.parent = playerEffects; + }; + } +} + +public class DisableStaminaRegenEffect : CustomPlayerEffect, IStaminaModifier +{ + public bool StaminaModifierActive => IsEnabled; + public float StaminaUsageMultiplier => 1; + + public float StaminaRegenMultiplier => 0; + public bool SprintingDisabled => false; + + public override EffectClassification Classification => EffectClassification.Negative; +} + +public class BloodFueledManager +{ + private readonly CustomClasses _plugin; + + public static bool IsBloodFueled(Player player) => player.CustomInfo.Contains("Blood Fueled"); + + public BloodFueledManager(CustomClasses plugin) + { + _plugin = plugin; + + } +} + +public class BloodFueledHandler : CustomClassHandler +{ + public override void HandleSpawn(Player player, CustomClassConfig config, Random random) + { + player.SendBroadcast("You are the Blood Fueled!", CustomClasses.BroadcastDuration); + const string customInfo = "Blood Fueled"; + if (!Player.ValidateCustomInfo(customInfo, out var reason)) + { + Logger.Error($"Invalid custom info for Blood Fueled: {reason}"); + } + else + { + player.CustomInfo = customInfo; + player.InfoArea |= PlayerInfoArea.CustomInfo; + } + + player.MaxHumeShield = 0; + player.HumeShield = 0; + player.MaxHealth = 3500; + player.Health = 3500; + + player.EnableEffect(1, float.PositiveInfinity); + } +} \ No newline at end of file diff --git a/CustomClasses/CustomClasses.cs b/CustomClasses/CustomClasses.cs index f05d67c..e16c356 100644 --- a/CustomClasses/CustomClasses.cs +++ b/CustomClasses/CustomClasses.cs @@ -38,33 +38,41 @@ public sealed class CustomClasses : Plugin /// public override string Name => "CustomClasses"; + /// public override string Author => "Code002Lover"; + /// public override Version Version { get; } = new(1, 0, 0); + /// public override string Description => "Adds custom classes to the game"; + /// public override Version RequiredApiVersion { get; } = new(LabApiProperties.CompiledVersion); - + public const ushort BroadcastDuration = 10; - + /// /// Configuration for the Janitor class. /// public JanitorConfig JanitorConfig { get; private set; } = new(); + /// /// Configuration for the Research Subject class. /// public ResearchSubjectConfig ResearchSubjectConfig { get; private set; } = new(); + /// /// Configuration for the Head Guard class. /// public HeadGuardConfig HeadGuardConfig { get; private set; } = new(); + /// /// Configuration for the Medic class. /// public MedicConfig MedicConfig { get; private set; } = new(); + /// /// Configuration for the Gambler class. /// @@ -74,7 +82,7 @@ public sealed class CustomClasses : Plugin /// Configuration for the ShadowStepper class. /// public ShadowStepperConfig ShadowStepperConfig { get; private set; } = new(); - + public MtfDemolitionistConfig MtfDemolitionistConfig { get; private set; } = new(); public ScoutConfig ScoutConfig { get; private set; } = new(); public ExplosiveMasterConfig ExplosiveMasterConfig { get; private set; } = new(); @@ -82,6 +90,7 @@ public sealed class CustomClasses : Plugin public SerpentsHandConfig SerpentsHandConfig { get; private set; } = new(); public NegromancerConfig NegromancerConfig { get; private set; } = new(); public NegromancerShadowConfig NegromancerShadowConfig { get; private set; } = new(); + public BloodFueledConfig BloodFueledConfig { get; private set; } = new(); internal readonly Dictionary Hints = new(); @@ -269,16 +278,17 @@ public sealed class CustomClasses : Plugin private void OnPlayerSpawned(PlayerSpawnedEventArgs ev) { ev.Player.CustomInfo = ""; - + if (ClassManager.TryHandleSpawn(ev.Player, JanitorConfig, typeof(JanitorConfig), null)) return; if (ClassManager.TryHandleSpawn(ev.Player, ResearchSubjectConfig, typeof(ResearchSubjectConfig), null)) return; if (ClassManager.TryHandleSpawn(ev.Player, HeadGuardConfig, typeof(HeadGuardConfig), null)) return; if (ClassManager.TryHandleSpawn(ev.Player, MedicConfig, typeof(MedicConfig), null)) return; if (ClassManager.TryHandleSpawn(ev.Player, GamblerConfig, typeof(GamblerConfig), null)) return; if (ClassManager.TryHandleSpawn(ev.Player, ShadowStepperConfig, typeof(ShadowStepperConfig), null)) return; - if (ClassManager.TryHandleSpawn(ev.Player, MtfDemolitionistConfig, typeof(MtfDemolitionistConfig), null)) return; + if (ClassManager.TryHandleSpawn(ev.Player, MtfDemolitionistConfig, typeof(MtfDemolitionistConfig), null)) + return; if (ClassManager.TryHandleSpawn(ev.Player, ExplosiveMasterConfig, typeof(ExplosiveMasterConfig), null)) return; - if (ClassManager.TryHandleSpawn(ev.Player, FlashMasterConfig, typeof(FlashMasterConfig), null)) return; + if (ClassManager.TryHandleSpawn(ev.Player, BloodFueledConfig, typeof(BloodFueledConfig), null)) return; } private static void OnScp914ProcessingPickup(Scp914ProcessingPickupEventArgs ev) @@ -338,6 +348,7 @@ public class CustomClassManager RegisterHandler(new SerpentsHandHandler(), new SerpentsHandState()); RegisterHandler(new NegromancerHandler()); RegisterHandler(new NegromancerShadowHandler()); + RegisterHandler(new BloodFueledHandler()); } public SpawnState GetSpawnState(Type configType) @@ -959,6 +970,14 @@ public sealed class NegromancerShadowConfig : CustomClassConfig public override ItemType[] Items { get; set; } = []; } +public sealed class BloodFueledConfig : CustomClassConfig +{ + public override double ChancePerPlayer { get; set; } = 1.0; + public override int MaxSpawns { get; set; } = int.MaxValue; + public override RoleTypeId RequiredRole { get; set; } = RoleTypeId.Scp939; + public override ItemType[] Items { get; set; } = []; +} + /// /// Tracks the spawn state for a custom class. /// @@ -970,4 +989,4 @@ public record SpawnState { Spawns = 0; } -} \ No newline at end of file +}