From 500f686a86374f53688d172953cb26be40470a66 Mon Sep 17 00:00:00 2001 From: Patrique29 Date: Tue, 21 Apr 2026 19:31:36 +0200 Subject: [PATCH 1/8] fix multiple same scp --- .../CustomRoles/API/Features/CustomSCP.cs | 4 +- .../Misc/Features/Spawn/DummySCPs/DummySCP.cs | 5 ++ KruacentExiled/Misc/Features/Spawn/Spawn.cs | 46 +++++++++++++------ 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/KruacentExiled/CustomRoles/API/Features/CustomSCP.cs b/KruacentExiled/CustomRoles/API/Features/CustomSCP.cs index 00483ae..1f7860f 100644 --- a/KruacentExiled/CustomRoles/API/Features/CustomSCP.cs +++ b/KruacentExiled/CustomRoles/API/Features/CustomSCP.cs @@ -75,11 +75,11 @@ public int GetPreferences(Player player) if(sliderSetting is null) { Log.Error("slider setting is null in custom scp"); - return -6; + return 0; } - if (!SettingBase.TryGetSetting(player, sliderSetting.Id, out var setting)) return -6; + if (!SettingBase.TryGetSetting(player, sliderSetting.Id, out var setting)) return 0; return (int) setting.SliderValue; } diff --git a/KruacentExiled/Misc/Features/Spawn/DummySCPs/DummySCP.cs b/KruacentExiled/Misc/Features/Spawn/DummySCPs/DummySCP.cs index 2dffb5a..3970174 100644 --- a/KruacentExiled/Misc/Features/Spawn/DummySCPs/DummySCP.cs +++ b/KruacentExiled/Misc/Features/Spawn/DummySCPs/DummySCP.cs @@ -29,6 +29,11 @@ public void Set(Player player) public int GetPreferences(Player player) { + if (player.IsNPC) + { + return 0; + } + return player.ScpPreferences.Preferences[Role]; } diff --git a/KruacentExiled/Misc/Features/Spawn/Spawn.cs b/KruacentExiled/Misc/Features/Spawn/Spawn.cs index 51a55f6..784be8d 100644 --- a/KruacentExiled/Misc/Features/Spawn/Spawn.cs +++ b/KruacentExiled/Misc/Features/Spawn/Spawn.cs @@ -1,4 +1,5 @@ using Exiled.API.Enums; +using Exiled.API.Extensions; using Exiled.API.Features; using Exiled.API.Features.Pools; using Exiled.Events.EventArgs.Server; @@ -78,19 +79,23 @@ private void OnRoundStarted() if (MainPlugin.Configs.ScpPreferences) { int scpcount = 0; + HashSet freeRoles = new HashSet(allRoles); - foreach (Player player in Player.Enumerable.Where(p => p.IsScp && !p.IsNPC)) + foreach (Player player in Player.Enumerable.Where(p => p.IsScp)) { - if (scpcount != 1) + bool flag; + if (scpcount <= 1) { - if (SetScpPreferences(player)) - { - scpcount++; - } + flag = SetScpPreferences(player, freeRoles); } else { - SetScpPreferencesWithSupport(player); + flag = SetScpPreferencesWithSupport(player, freeRoles); + } + + if (flag) + { + scpcount++; } } } @@ -101,17 +106,17 @@ private void OnRoundStarted() } - private bool SetScpPreferencesWithSupport(Player player) + private bool SetScpPreferencesWithSupport(Player player, HashSet availableRoles) { //todo make the player choose which support scp they want to play (like scp049cgui) - return SetScpPreferences(player, false); + return SetScpPreferences(player, availableRoles, false); } - private bool SetScpPreferences(Player player, bool ignoreSupport = true) + private bool SetScpPreferences(Player player, HashSet availableRoles, bool ignoreSupport = true) { Config config = MainPlugin.Configs; if (config == null) @@ -121,7 +126,7 @@ private bool SetScpPreferences(Player player, bool ignoreSupport = true) } - ISCPPreferences roleScp = ChooseRandomRole(player, ignoreSupport); + ISCPPreferences roleScp = ChooseRandomRole(player,availableRoles, ignoreSupport); if(roleScp is CustomSCP) { @@ -130,30 +135,42 @@ private bool SetScpPreferences(Player player, bool ignoreSupport = true) } else { + KELog.Debug("vanilla scp"); eventarg.VanillaSCPs.Add(player); } KELog.Debug($"Scp ({player.Nickname}) is {roleScp.SCPId} previous : {player.Role.Type}"); roleScp.Set(player); + availableRoles.Remove(roleScp); return true; } - private ISCPPreferences ChooseRandomRole(Player player,bool ignoreSupport) + private ISCPPreferences ChooseRandomRole(Player player, HashSet availableRoles, bool ignoreSupport) { List weightedPool = new List(); - foreach (ISCPPreferences scp in allRoles) + + + + if(availableRoles.Count == 0) + { + availableRoles = allRoles.ToHashSet(); + } + + + foreach (ISCPPreferences scp in availableRoles) { if (scp.IsSupport && ignoreSupport) continue; int pref = scp.GetPreferences(player) + 5 + baseValue; + KELog.Debug(scp.SCPId + " : " + pref); for (int i = 0; i < pref; i++) { - KELog.Debug(scp.SCPId); + weightedPool.Add(scp); } } @@ -163,7 +180,6 @@ private ISCPPreferences ChooseRandomRole(Player player,bool ignoreSupport) return weightedPool[randomIndex]; } - public override void SubscribeEvents() { Exiled.Events.Handlers.Server.AllPlayersSpawned += OnRoundStarted; From f972ec63797b713be1559cffb6982653b8418977 Mon Sep 17 00:00:00 2001 From: Omer <27omerf@gmail.Com> Date: Tue, 21 Apr 2026 20:36:45 +0200 Subject: [PATCH 2/8] fix .dll been copied into the server & add auto release draft with .dll --- .github/workflows/buildtoserver.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/buildtoserver.yml b/.github/workflows/buildtoserver.yml index 42b086c..ca0773c 100644 --- a/.github/workflows/buildtoserver.yml +++ b/.github/workflows/buildtoserver.yml @@ -42,6 +42,7 @@ jobs: msbuild "$SLN" /p:Configuration=Release - name: Copy plugin to server + if: github.event_name == 'push' run: | DLL=$(find . -path "*/bin/Release/*KruacentExiled.dll" | head -n 1) @@ -51,3 +52,12 @@ jobs: fi cp "$DLL" $OUTPUT_FOLDER_PATH/ + - name: Create GitHub Release Draft + if: github.event_name == 'push' + uses: softprops/action-gh-release@v2 + with: + tag_name: draft-${{ github.sha }} + name: "Draft Release" + draft: true + files: "**/bin/Release/*KruacentExiled.dll" + generate_release_notes: false From 47d58042f2839e5e8055850a14580a217c5ac9ea Mon Sep 17 00:00:00 2001 From: Patrique29 Date: Wed, 22 Apr 2026 17:34:46 +0200 Subject: [PATCH 3/8] 035 cant trigger scps --- .../CustomRoles/CR/CustomSCPs/SCP035.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/KruacentExiled/CustomRoles/CR/CustomSCPs/SCP035.cs b/KruacentExiled/CustomRoles/CR/CustomSCPs/SCP035.cs index e6cee18..80c8d7d 100644 --- a/KruacentExiled/CustomRoles/CR/CustomSCPs/SCP035.cs +++ b/KruacentExiled/CustomRoles/CR/CustomSCPs/SCP035.cs @@ -4,7 +4,9 @@ using Exiled.API.Features.Pickups; using Exiled.CustomItems.API.Features; using Exiled.Events.EventArgs.Player; +using Exiled.Events.EventArgs.Scp096; using Exiled.Events.EventArgs.Scp1509; +using Exiled.Events.EventArgs.Scp173; using Exiled.Events.EventArgs.Server; using HintServiceMeow.Core.Models.Arguments; using HintServiceMeow.Core.Utilities; @@ -102,6 +104,9 @@ protected override void SubscribeEvents() Exiled.Events.Handlers.Scp1509.Resurrecting += OnResurrecting; Exiled.Events.Handlers.Player.UsingItem += OnUsingItem; Exiled.Events.Handlers.Player.VoiceChatting += OnVoiceChatting; + Exiled.Events.Handlers.Scp096.AddingTarget += OnAddingTarget; + Exiled.Events.Handlers.Scp173.AddingObserver += OnAddingObserver; + base.SubscribeEvents(); } @@ -115,6 +120,8 @@ protected override void UnsubscribeEvents() Exiled.Events.Handlers.Server.EndingRound -= OnEndingRound; Exiled.Events.Handlers.Scp1509.Resurrecting -= OnResurrecting; Exiled.Events.Handlers.Player.UsingItem -= OnUsingItem; + Exiled.Events.Handlers.Scp096.AddingTarget -= OnAddingTarget; + Exiled.Events.Handlers.Scp173.AddingObserver -= OnAddingObserver; base.UnsubscribeEvents(); } private static HintPosition position = new RemainingPlayerPosition(); @@ -128,6 +135,27 @@ private void OnDying(DyingEventArgs ev) } + private void OnAddingObserver(AddingObserverEventArgs ev) + { + if (!ev.IsAllowed) return; + if (Check(ev.Observer)) + { + ev.IsAllowed = false; + } + } + + + private void OnAddingTarget(AddingTargetEventArgs ev) + { + if (!ev.IsAllowed) return; + if (Check(ev.Target)) + { + ev.IsAllowed = false; + } + + + } + private void OnVoiceChatting(VoiceChattingEventArgs ev) { Player player = ev.Player; From aa133f7966326637eb954182094a29453282b68a Mon Sep 17 00:00:00 2001 From: Patrique29 Date: Wed, 22 Apr 2026 17:35:49 +0200 Subject: [PATCH 4/8] fix nego not having its friendmaker --- KruacentExiled/CustomRoles/CR/ChaosInsurgency/Negotiator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KruacentExiled/CustomRoles/CR/ChaosInsurgency/Negotiator.cs b/KruacentExiled/CustomRoles/CR/ChaosInsurgency/Negotiator.cs index 6e0b9e4..206e9b1 100644 --- a/KruacentExiled/CustomRoles/CR/ChaosInsurgency/Negotiator.cs +++ b/KruacentExiled/CustomRoles/CR/ChaosInsurgency/Negotiator.cs @@ -70,7 +70,7 @@ protected override void GiveInventory(Player player) { base.GiveInventory(player); - Exiled.CustomItems.API.Features.CustomItem.TryGive(player, "Friend Maker", false); + Exiled.CustomItems.API.Features.CustomItem.TryGive(player, "FriendMaker", false); } From abbee78fd8b4b8d20a6d0c03e8d5cace09a2212e Mon Sep 17 00:00:00 2001 From: Patrique29 Date: Wed, 22 Apr 2026 18:16:44 +0200 Subject: [PATCH 5/8] remove 173 buff --- .../Misc/Features/SCPRebalance/SCPBuff.cs | 86 +------------------ KruacentExiled/Misc/Handlers/ServerHandler.cs | 37 -------- 2 files changed, 1 insertion(+), 122 deletions(-) diff --git a/KruacentExiled/Misc/Features/SCPRebalance/SCPBuff.cs b/KruacentExiled/Misc/Features/SCPRebalance/SCPBuff.cs index 982084c..b15fd9e 100644 --- a/KruacentExiled/Misc/Features/SCPRebalance/SCPBuff.cs +++ b/KruacentExiled/Misc/Features/SCPRebalance/SCPBuff.cs @@ -41,29 +41,17 @@ internal SCPBuff() { } public void SubscribeEvents() { - - - Exiled.Events.Handlers.Player.ChangingRole += BecomingSCP; } public void UnsubscribeEvents() { Exiled.Events.Handlers.Player.ChangingRole -= BecomingSCP; - - - } - internal void StartBuff() - { - Timing.RunCoroutine(PeanutShield()); - - } - private void BecomingSCP(ChangingRoleEventArgs ev) { @@ -71,7 +59,7 @@ private void BecomingSCP(ChangingRoleEventArgs ev) if (!ev.NewRole.IsScp() || ev.NewRole == RoleTypeId.Scp0492) return; if(player.Role == RoleTypeId.None) return; float healthincrease = IncreaseSCPHealth; - if(RoleBuff.TryGetValue(ev.NewRole,out float val) && Player.Enumerable.Count(p => SCPTeam.IsSCP(p.ReferenceHub)) > 1) + if(RoleBuff.TryGetValue(ev.NewRole,out float val) && SCPTeam.SCPs.Count > 1) { healthincrease *= val; } @@ -92,77 +80,5 @@ private void BecomingSCP(ChangingRoleEventArgs ev) } - - - private IEnumerator PeanutShield() - { - while (Round.InProgress) - { - List peanuts = Player.List.Where(p => p.Role == RoleTypeId.Scp173).ToList(); - peanuts.ForEach(p => - { - AddHumeShield(p, CheckPlayerAround(p, 6)); - }); - yield return Timing.WaitForSeconds(RefreshRate); - } - } - - - /// - /// Count the number of player around - /// - /// The Player (the peanut) to check around them - /// - /// - /// - private int CheckPlayerAround(Player p, float radius, bool countFriendly = false) - { - int result = 0; - foreach (Player player in Player.List) - { - if (player == p) continue; - if (player.Role.Side == p.Role.Side && !countFriendly) continue; - if (IsPlayerInZone(player, p.Position, radius, radius)) - result += 5; - } - return result; - } - - - private bool IsPlayerInZone(Player player, Vector3 zonePosition, float radius, float height) - { - - float horizontalDistance = Vector3.Distance( - new Vector3(player.Position.x, 0, player.Position.z), - new Vector3(zonePosition.x, 0, zonePosition.z) - ); - - // Calculate the vertical difference (y) - float verticalDifference = Mathf.Abs(player.Position.y - zonePosition.y); - - // Check if the player is in the 3d zone. - return horizontalDistance <= radius / 2 && verticalDifference <= height / 2; - } - - - /// - /// Add HumeShield to a player - /// - /// - /// - /// true if it's not over the max HumeShield of the player; false otherwise - private bool AddHumeShield(Player p, float hum) - { - float max = p.MaxHumeShield; - if (max < hum + p.HumeShield) - { - p.HumeShield = max; - return false; - } - p.HumeShield += hum; - return true; - } - - } } diff --git a/KruacentExiled/Misc/Handlers/ServerHandler.cs b/KruacentExiled/Misc/Handlers/ServerHandler.cs index be2f020..41102f6 100644 --- a/KruacentExiled/Misc/Handlers/ServerHandler.cs +++ b/KruacentExiled/Misc/Handlers/ServerHandler.cs @@ -12,45 +12,8 @@ public void OnRoundStarted() MainPlugin.Instance.AutoElevator.StartLoop(); MainPlugin.Instance.AutoTesla.StartLoop(); - MainPlugin.Instance.SCPBuff.StartBuff(); Respawn.SetTokens(SpawnableFaction.NtfWave, 1); Respawn.SetTokens(SpawnableFaction.ChaosWave, 1); - - /* - string test = "test.png"; - string kel = "nokel.png"; - string tenna = "tennasmooving.gif"; - string smol = "smol.gif"; - - Image img = Image.FromFile(Paths.Configs + $"/{kel}"); - Image gif = Image.FromFile(Paths.Configs + $"/{tenna}"); - - - TextImage text = new TextImage(img); - AnimatedTextImage giftext = new(gif); - Vector3 basePos = RoleTypeId.Scp049.GetRandomSpawnLocation().Position; - - Round.IsLocked = true; - var pl = Player.List.FirstOrDefault(); - Timing.CallDelayed(2f, delegate - { - pl.Role.Set(RoleTypeId.NtfSpecialist); - }); - - - Timing.CallDelayed(5f, delegate - { - giftext.Spawn(pl?.Position + Vector3.up ?? basePos, Quaternion.Euler(Vector3.zero)); - //text.Spawn(pl?.Position+Vector3.up ?? basePos, .05f); - }); - - - text.Spawn(basePos + Vector3.back); - foreach(Player p in Player.List.Where(p => !p.IsNPC)) - { - p.Teleport(RoomType.Hcz939); - } - */ } } } From bbc805f06fd2fdcd97de42fd63f13ee17037013b Mon Sep 17 00:00:00 2001 From: Patrique29 Date: Wed, 22 Apr 2026 20:12:10 +0200 Subject: [PATCH 6/8] temp fix to change scp hp --- KruacentExiled/Misc/Config.cs | 1 + KruacentExiled/Misc/Features/SCPRebalance/SCPBuff.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/KruacentExiled/Misc/Config.cs b/KruacentExiled/Misc/Config.cs index 481fd12..8edc60f 100644 --- a/KruacentExiled/Misc/Config.cs +++ b/KruacentExiled/Misc/Config.cs @@ -28,6 +28,7 @@ public class Config : IConfig public float MultSCP106 { get; set; } = 1.1f; public int MinPlayerVote { get; set; } = 6; + public float MultBaseSCP { get; set; } = 1.25f; } diff --git a/KruacentExiled/Misc/Features/SCPRebalance/SCPBuff.cs b/KruacentExiled/Misc/Features/SCPRebalance/SCPBuff.cs index b15fd9e..94f1c31 100644 --- a/KruacentExiled/Misc/Features/SCPRebalance/SCPBuff.cs +++ b/KruacentExiled/Misc/Features/SCPRebalance/SCPBuff.cs @@ -20,7 +20,7 @@ namespace KruacentExiled.Misc.Features.SCPRebalance public class SCPBuff : IUsingEvents { public const float RefreshRate = 1f; - public float IncreaseSCPHealth { get; } = 1.25f; + public float IncreaseSCPHealth => MainPlugin.Configs.MultBaseSCP; private static Config Config => MainPlugin.Configs; public Dictionary RoleBuff = new Dictionary() From e46c16c9403ff723334ce7eeb66e1534de0ca596 Mon Sep 17 00:00:00 2001 From: Patrique29 Date: Wed, 22 Apr 2026 20:20:40 +0200 Subject: [PATCH 7/8] post nuke respawn --- KruacentExiled/Misc/Features/PostNuke/PostNukeHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/KruacentExiled/Misc/Features/PostNuke/PostNukeHandler.cs b/KruacentExiled/Misc/Features/PostNuke/PostNukeHandler.cs index 9e41415..cca0abd 100644 --- a/KruacentExiled/Misc/Features/PostNuke/PostNukeHandler.cs +++ b/KruacentExiled/Misc/Features/PostNuke/PostNukeHandler.cs @@ -72,7 +72,7 @@ private void OnDetonated(WarheadDetonatedEventArgs ev) KELog.Debug(trigger); if (trigger == Faction.Unclassified - || trigger == Faction.FoundationStaff + || trigger == Faction.SCP || trigger == Faction.Flamingos) return; From c4fa461e1e3575ccbd80f29b63167f6515bb0202 Mon Sep 17 00:00:00 2001 From: Patrique29 Date: Wed, 22 Apr 2026 20:24:50 +0200 Subject: [PATCH 8/8] 049 door can't close if locked --- KruacentExiled/Map/Heavy/BulkDoor049.cs | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/KruacentExiled/Map/Heavy/BulkDoor049.cs b/KruacentExiled/Map/Heavy/BulkDoor049.cs index 3ef4c49..4adda2d 100644 --- a/KruacentExiled/Map/Heavy/BulkDoor049.cs +++ b/KruacentExiled/Map/Heavy/BulkDoor049.cs @@ -1,5 +1,6 @@ using Exiled.API.Enums; using Exiled.API.Features; +using Exiled.API.Features.Doors; using Interactables.Interobjects.DoorUtils; using KE.Utils.API.Map; using MEC; @@ -38,11 +39,12 @@ public static void Create() Log.Debug("spawn 049 bulk door at "+ worldpos); } - + private static CoroutineHandle handle; private static void DoorVariant_OnInstanceRemoved(DoorVariant obj) { door.OnStateChanged -= Door_OnStateChanged; DoorVariant.OnInstanceRemoved -= DoorVariant_OnInstanceRemoved; + Timing.KillCoroutines(handle); } public const float IdleDuration = 20f; @@ -52,7 +54,7 @@ private static void Door_OnStateChanged() { if (door.NetworkTargetState) { - Timing.RunCoroutine(AutoClose()); + handle = Timing.RunCoroutine(AutoClose()); } } @@ -67,14 +69,18 @@ private static IEnumerator AutoClose() { yield break; } - duration -= RefreshRate; - Log.Info(duration); - if (duration <= 0) + if(door.NetworkActiveLocks == 0) { - Log.Info("auto close"); - door.NetworkTargetState = false; - duration = IdleDuration; + duration -= RefreshRate; + Log.Debug(duration); + if (duration <= 0) + { + Log.Debug("auto close"); + door.NetworkTargetState = false; + duration = IdleDuration; + } } + yield return Timing.WaitForSeconds(RefreshRate); }