diff --git a/docs/版本更新说明.md b/docs/版本更新说明.md index f29b9d2..ae232c6 100644 --- a/docs/版本更新说明.md +++ b/docs/版本更新说明.md @@ -88,5 +88,8 @@ - fix:修复了卡窗的问题 - hotfix:修复了救人线程崩溃的问题 +# 5月26日12:00更新 +- fix:修复了救人中断后不继续沉迷的问题 + # 5月26日更新 -- fix:修复了救人中断后不继续沉迷的问题 \ No newline at end of file +- improve:优化CD逻辑 \ No newline at end of file diff --git a/logic/GameClass/GameObj/Character/Character.Skill.cs b/logic/GameClass/GameObj/Character/Character.Skill.cs index 195d954..252c0ff 100644 --- a/logic/GameClass/GameObj/Character/Character.Skill.cs +++ b/logic/GameClass/GameObj/Character/Character.Skill.cs @@ -23,25 +23,6 @@ namespace GameClass.GameObj return new NullSkill(); } - public bool SetTimeUntilActiveSkillAvailable(ActiveSkillType activeSkillType, int timeUntilActiveSkillAvailable) - { - if (Occupation.ListOfIActiveSkill.Contains(activeSkillType)) - { - ActiveSkillDictionary[activeSkillType].TimeUntilActiveSkillAvailable = (timeUntilActiveSkillAvailable > 0) ? timeUntilActiveSkillAvailable : 0; - return true; - } - return false; - } - public bool AddTimeUntilActiveSkillAvailable(ActiveSkillType activeSkillType, int addTimeUntilActiveSkillAvailable) - { - if (Occupation.ListOfIActiveSkill.Contains(activeSkillType)) - { - ActiveSkillDictionary[activeSkillType].TimeUntilActiveSkillAvailable += addTimeUntilActiveSkillAvailable; - return true; - } - return false; - } - public bool IsGhost() { return GameData.IsGhost(CharacterType); diff --git a/logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs b/logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs index 4f27d97..585e1a4 100644 --- a/logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs +++ b/logic/Gaming/SkillManager/SkillManager.ActiveSkill.cs @@ -498,52 +498,18 @@ namespace Gaming { lock (activeSkill.ActiveSkillUseLock) { - if (activeSkill.TimeUntilActiveSkillAvailable == 0) + if (activeSkill.StartSkill()) { - activeSkill.TimeUntilActiveSkillAvailable = activeSkill.SkillCD; - new Thread (() => { startSkill(); activeSkill.IsBeingUsed = 1; - new FrameRateTaskExecutor( - () => !player.IsRemoved, - () => - { - activeSkill.TimeUntilActiveSkillAvailable -= (int)GameData.frameDuration; - }, - timeInterval: GameData.frameDuration, - () => 0, - maxTotalDuration: (long)(activeSkill.DurationTime) - ) - { - AllowTimeExceed = true, - MaxTolerantTimeExceedCount = ulong.MaxValue, - } - .Start(); + Thread.Sleep(activeSkill.DurationTime); endSkill(); activeSkill.IsBeingUsed = 0; Debugger.Output(player, "return to normal."); - - new FrameRateTaskExecutor( - loopCondition: () => activeSkill.TimeUntilActiveSkillAvailable > 0, - loopToDo: () => - { - activeSkill.TimeUntilActiveSkillAvailable -= (int)GameData.frameDuration; - }, - timeInterval: GameData.frameDuration, - finallyReturn: () => 0 - ) - { - AllowTimeExceed = true, - MaxTolerantTimeExceedCount = ulong.MaxValue, - } - .Start(); - - activeSkill.TimeUntilActiveSkillAvailable = 0; - Debugger.Output(player, "ActiveSkill is ready."); } ) { IsBackground = true }.Start(); diff --git a/logic/Preparation/Interface/ISkill.cs b/logic/Preparation/Interface/ISkill.cs index 72a1cba..aa1629a 100644 --- a/logic/Preparation/Interface/ISkill.cs +++ b/logic/Preparation/Interface/ISkill.cs @@ -1,5 +1,6 @@ using Preparation.Interface; using Preparation.Utility; +using System; using System.Threading; namespace Preparation.Interface @@ -29,18 +30,25 @@ namespace Preparation.Interface private readonly object skillLock = new(); public object SkillLock => skillLock; - private int timeUntilActiveSkillAvailable = 0; - public int TimeUntilActiveSkillAvailable + private int openStartTime = 0; + public int OpenStartTime { get { - return Interlocked.CompareExchange(ref timeUntilActiveSkillAvailable, 0, 0); + lock (skillLock) + return openStartTime; } - set + } + public bool StartSkill() + { + lock (skillLock) { - if (value < 0) value = 0; - else if (value > SkillCD) value = SkillCD; - Interlocked.Exchange(ref timeUntilActiveSkillAvailable, value); + if (Environment.TickCount - openStartTime >= SkillCD) + { + openStartTime = Environment.TickCount; + return true; + } + else return false; } } diff --git a/logic/Server/CopyInfo.cs b/logic/Server/CopyInfo.cs index fe0f775..6552b94 100644 --- a/logic/Server/CopyInfo.cs +++ b/logic/Server/CopyInfo.cs @@ -15,8 +15,8 @@ namespace Server case Preparation.Utility.GameObjType.Character: Character character = (Character)gameObj; if (character.IsGhost()) - return Tricker((Ghost)character); - else return Student((Student)character); + return Tricker((Ghost)character, time); + else return Student((Student)character, time); case Preparation.Utility.GameObjType.Bullet: return Bullet((Bullet)gameObj); case Preparation.Utility.GameObjType.BombedBullet: @@ -49,7 +49,7 @@ namespace Server return objMsg; } - private static MessageOfObj? Student(Student player) + private static MessageOfObj? Student(Student player, int time) { if (player.IsGhost()) return null; MessageOfObj msg = new() @@ -81,7 +81,10 @@ namespace Server }; foreach (var keyValue in player.ActiveSkillDictionary) - msg.StudentMessage.TimeUntilSkillAvailable.Add(keyValue.Value.TimeUntilActiveSkillAvailable); + { + int progress = keyValue.Value.SkillCD - Environment.TickCount + keyValue.Value.OpenStartTime; + msg.StudentMessage.TimeUntilSkillAvailable.Add(progress < 0 ? 0 : progress); + } for (int i = 0; i < GameData.maxNumOfSkill - player.ActiveSkillDictionary.Count; ++i) msg.StudentMessage.TimeUntilSkillAvailable.Add(-1); @@ -97,7 +100,7 @@ namespace Server return msg; } - private static MessageOfObj? Tricker(Character player) + private static MessageOfObj? Tricker(Character player, int time) { if (!player.IsGhost()) return null; MessageOfObj msg = new() @@ -122,7 +125,10 @@ namespace Server } }; foreach (var keyValue in player.ActiveSkillDictionary) - msg.TrickerMessage.TimeUntilSkillAvailable.Add(keyValue.Value.TimeUntilActiveSkillAvailable); + { + int progress = keyValue.Value.SkillCD - Environment.TickCount + keyValue.Value.OpenStartTime; + msg.TrickerMessage.TimeUntilSkillAvailable.Add(progress < 0 ? 0 : progress); + } for (int i = 0; i < GameData.maxNumOfSkill - player.ActiveSkillDictionary.Count; ++i) msg.TrickerMessage.TimeUntilSkillAvailable.Add(-1); diff --git a/logic/cmd/PlaybackClient.cmd b/logic/cmd/PlaybackClient.cmd new file mode 100644 index 0000000..b91db54 --- /dev/null +++ b/logic/cmd/PlaybackClient.cmd @@ -0,0 +1,2 @@ +@echo off +start cmd /k ..\Client\bin\Debug\net6.0-windows\Client.exe --cl --playbackFile .\test.thuaipb --playbackSpeed 1 \ No newline at end of file