various fixes + new custom class shadowmancer

This commit is contained in:
2025-07-12 20:18:02 +02:00
parent 0615f8aeea
commit 78fa56dce9
10 changed files with 356 additions and 10 deletions
+99 -5
View File
@@ -11,11 +11,13 @@ using LabApi.Events.Arguments.Scp914Events;
using LabApi.Events.Arguments.ServerEvents;
using LabApi.Events.Handlers;
using LabApi.Features;
using LabApi.Features.Enums;
using LabApi.Features.Wrappers;
using LabApi.Loader.Features.Plugins;
using MapGeneration;
using MEC;
using PlayerRoles;
using PlayerRoles.PlayableScps.Scp106;
using Scp914.Processors;
using UnityEngine;
using Logger = LabApi.Features.Console.Logger;
@@ -32,6 +34,7 @@ public sealed class CustomClasses : Plugin
{
public readonly CustomClassManager ClassManager = new();
public SerpentsHandManager SerpentsHandManager;
public NegromancerManager NegromancerManager;
/// <inheritdoc/>
public override string Name => "CustomClasses";
@@ -77,6 +80,8 @@ public sealed class CustomClasses : Plugin
public ExplosiveMasterConfig ExplosiveMasterConfig { get; private set; } = new();
public FlashMasterConfig FlashMasterConfig { get; private set; } = new();
public SerpentsHandConfig SerpentsHandConfig { get; private set; } = new();
public NegromancerConfig NegromancerConfig { get; private set; } = new();
public NegromancerShadowConfig NegromancerShadowConfig { get; private set; } = new();
internal readonly Dictionary<Player, Hint> Hints = new();
@@ -142,6 +147,7 @@ public sealed class CustomClasses : Plugin
}
}
NegromancerManager = new NegromancerManager(this);
Instance = this;
}
@@ -330,6 +336,8 @@ public class CustomClassManager
RegisterHandler<ExplosiveMasterConfig>(new ExplosiveMasterHandler());
RegisterHandler<FlashMasterConfig>(new FlashMasterHandler());
RegisterHandler<SerpentsHandConfig>(new SerpentsHandHandler(), new SerpentsHandState());
RegisterHandler<NegromancerConfig>(new NegromancerHandler());
RegisterHandler<NegromancerShadowConfig>(new NegromancerShadowHandler());
}
public SpawnState GetSpawnState(Type configType)
@@ -420,6 +428,29 @@ public class CustomClassManager
}
}
public class NegromancerShadowHandler : CustomClassHandler
{
public override void HandleSpawn(Player player, CustomClassConfig config, Random random)
{
player.MaxHealth = 1000;
player.MaxHumeShield = 0;
player.HumeShield = 0;
player.EnableEffect<MovementBoost>(10, float.PositiveInfinity);
const string customInfo = "<color=#A0A0A0>Shadow</color>";
if (!Player.ValidateCustomInfo(customInfo, out var reason))
{
Logger.Error($"Invalid custom info for Shadow: {reason}");
}
else
{
player.CustomInfo = customInfo;
player.InfoArea |= PlayerInfoArea.CustomInfo;
}
}
}
/// <summary>
/// Interface for custom class spawn handlers.
/// </summary>
@@ -444,6 +475,15 @@ public abstract class CustomClassHandler: ICustomClassHandler
}
}
public enum JanitorSpawn
{
Lcz173,
Lcz914,
LczGr18,
Lcz330
}
/// <summary>
/// Handler for the Janitor custom class.
/// </summary>
@@ -451,13 +491,51 @@ public class JanitorHandler(CustomClassManager manager) : CustomClassHandler
{
public override void HandleSpawn(Player player, CustomClassConfig config, Random random)
{
var scp914 = Map.Rooms.FirstOrDefault(r => r.Name == RoomName.Lcz914);
if (scp914 == null)
var spawnLocation = (JanitorSpawn)random.Next(0, 4);
switch (spawnLocation)
{
Logger.Error("LCZ 914 room not found for Janitor spawn.");
return;
case JanitorSpawn.Lcz914:
var scp914 = Map.Rooms.FirstOrDefault(r => r.Name == RoomName.Lcz914);
if (scp914 == null)
{
Logger.Error("LCZ 914 room not found for Janitor spawn.");
return;
}
manager.TeleportPlayerToAround(player, scp914.Position);
break;
case JanitorSpawn.Lcz173:
var lcz173Door = Map.Doors.FirstOrDefault(x => x.DoorName == DoorName.Lcz173Connector);
if (lcz173Door == null)
{
Logger.Error("LCZ 173 connector door not found for Janitor spawn.");
return;
}
manager.TeleportPlayerToAround(player, lcz173Door.Position);
break;
case JanitorSpawn.LczGr18:
var lczGr18Door = Map.Doors.FirstOrDefault(x => x.DoorName == DoorName.LczGr18Inner);
if (lczGr18Door == null)
{
Logger.Error("LCZ Gr18 door not found for Janitor spawn.");
return;
}
manager.TeleportPlayerToAround(player, lczGr18Door.Position);
break;
case JanitorSpawn.Lcz330:
var lcz330Door = Map.Doors.FirstOrDefault(x => x.DoorName == DoorName.Lcz330);
if (lcz330Door == null)
{
Logger.Error("LCZ 330 door not found for Janitor spawn.");
return;
}
manager.TeleportPlayerToAround(player, lcz330Door.Position);
break;
default:
throw new ArgumentOutOfRangeException();
}
manager.TeleportPlayerToAround(player, scp914.Position);
foreach (var spawnItem in config.Items)
{
player.AddItem(spawnItem, ItemAddReason.StartingItem);
@@ -865,6 +943,22 @@ public sealed class FlashMasterConfig : CustomClassConfig
public override ItemType[] Items { get; set; } = [ItemType.GrenadeFlash];
}
public sealed class NegromancerConfig : CustomClassConfig
{
public override double ChancePerPlayer { get; set; } = 0.0;
public override int MaxSpawns { get; set; } = 1;
public override RoleTypeId RequiredRole { get; set; } = RoleTypeId.Scp049;
public override ItemType[] Items { get; set; } = [];
}
public sealed class NegromancerShadowConfig : CustomClassConfig
{
public override double ChancePerPlayer { get; set; } = 0.0;
public override int MaxSpawns { get; set; } = int.MaxValue;
public override RoleTypeId RequiredRole { get; set; } = RoleTypeId.Scp106;
public override ItemType[] Items { get; set; } = [];
}
/// <summary>
/// Tracks the spawn state for a custom class.
/// </summary>