From c99ac3b1b5dedd180fa89388311d773c838f6cdd Mon Sep 17 00:00:00 2001 From: 3cxc <81449257+3cxc@users.noreply.github.com> Date: Thu, 12 Feb 2026 15:45:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20SCP=E7=AB=99=E7=AB=8B=E5=9B=9E=E8=A1=80?= =?UTF-8?q?=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Configs/Config.cs | 15 +++++++ EasyTools.csproj | 1 + Events/CustomEventHandler.cs | 5 +++ Utils/ScpReal.cs | 78 ++++++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+) create mode 100644 Utils/ScpReal.cs diff --git a/Configs/Config.cs b/Configs/Config.cs index 10667a3..2435c08 100644 --- a/Configs/Config.cs +++ b/Configs/Config.cs @@ -85,5 +85,20 @@ namespace EasyTools.Configs [Description("Is 1853 harmless? / 是否开启1853(洗手液)无害?")] public bool harmless_1853 { get; set; } = true; + + + /// ///////////////////////////////////////////////// + [Description("SCP静止回血?")] + public bool heal_scp { get; set; } = true; + + + [Description("等待多少秒后持续回血")] + public float heal_scp_secend { get; set; } = 6; + + [Description("受伤检测")] + public float heal_atk_secend { get; set; } = 2; + + [Description("回血量")] + public int heal_scp_x { get; set; } = 2; } } diff --git a/EasyTools.csproj b/EasyTools.csproj index 16be4a6..c2056ee 100644 --- a/EasyTools.csproj +++ b/EasyTools.csproj @@ -130,6 +130,7 @@ + diff --git a/Events/CustomEventHandler.cs b/Events/CustomEventHandler.cs index 26eb35f..ababd9d 100644 --- a/Events/CustomEventHandler.cs +++ b/Events/CustomEventHandler.cs @@ -58,6 +58,11 @@ namespace EasyTools.Events { Timing.RunCoroutine(Util.AutoServerBroadcast()); } + + if (Config.heal_scp) + { + Timing.RunCoroutine(ScpReal.AutoReal()); + } }); } diff --git a/Utils/ScpReal.cs b/Utils/ScpReal.cs new file mode 100644 index 0000000..70ee75c --- /dev/null +++ b/Utils/ScpReal.cs @@ -0,0 +1,78 @@ +using CustomPlayerEffects; +using EasyTools.Events; +using LabApi.Features.Wrappers; +using MEC; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace EasyTools.Utils +{ + public class ScpReal + { + + private static readonly Dictionary _lastMove = []; + + private static readonly Dictionary _lastHealth = []; + private static readonly Dictionary _lastDamageTime = []; + + public static IEnumerator AutoReal() + { + while (true) + { + if (Round.IsRoundEnded || !Round.IsRoundStarted) + { + yield break; + } + + foreach (Player p in Player.ReadyList) + { + if (p.IsSCP) + { + + // 先检测玩家是否正在受到伤害 + if (_lastHealth.TryGetValue(p, out var lastHealth)) + { + if (p.Health < lastHealth) + { + _lastDamageTime[p] = DateTime.UtcNow; + } + } + + _lastHealth[p] = lastHealth; + + Vector3 pos = p.Position; + if(_lastMove.TryGetValue(p,out var last)) + { + if (Vector3.Distance(pos,last.pos) < 0.1f) + { + + bool canceled = false; + // 检测是否正在受伤 + if (_lastDamageTime.TryGetValue(p,out var lastDamageTime)) + { + if (DateTime.UtcNow - lastDamageTime < TimeSpan.FromSeconds(CustomEventHandler.Config.heal_atk_secend)) { canceled = true; } + } + + if (!canceled && DateTime.UtcNow - last.time > TimeSpan.FromSeconds(CustomEventHandler.Config.heal_scp_secend)) + { + float old_health = p.Health; + float new_health = old_health + CustomEventHandler.Config.heal_scp_x; + if (new_health <= p.MaxHealth) + { + p.Health = new_health; + } + } + } + else { _lastMove[p] = (pos, DateTime.UtcNow); } + }else { _lastMove[p] = (pos, DateTime.UtcNow); } + }else if (_lastMove.ContainsKey(p)) { _lastMove.Remove(p); } + } + yield return Timing.WaitForSeconds(1f); + } + } + } +}