diff --git a/logic/GameClass/GameObj/Character/Character.cs b/logic/GameClass/GameObj/Character/Character.cs index 5d0394d..f546986 100644 --- a/logic/GameClass/GameObj/Character/Character.cs +++ b/logic/GameClass/GameObj/Character/Character.cs @@ -147,38 +147,48 @@ namespace GameClass.GameObj } public double OriVampire { get; protected set; } - private AtomicInt degreeOfTreatment = new(0); + private readonly object treatLock = new(); + private int degreeOfTreatment = 0; public int DegreeOfTreatment { - get => degreeOfTreatment; + get + { + lock (treatLock) + return degreeOfTreatment; + } } public void SetDegreeOfTreatment0() { - degreeOfTreatment.Set(0); + lock (treatLock) + degreeOfTreatment = 0; } + public bool AddDegreeOfTreatment(int value, Student whoTreatYou) { - value = degreeOfTreatment.Add(value); - long addV = HP.TryAddAll(value); - if (addV == 0) + lock (treatLock) { - SetDegreeOfTreatment0(); + degreeOfTreatment += value; + long addV = HP.TryAddAll(degreeOfTreatment); + if (addV == 0) + { + degreeOfTreatment = 0; + return false; + } + if (addV > 0) + { + whoTreatYou.AddScore(GameData.StudentScoreTreat(addV)); + degreeOfTreatment = 0; + return true; + } + if (degreeOfTreatment >= GameData.basicTreatmentDegree) + { + whoTreatYou.AddScore(GameData.StudentScoreTreat(GameData.basicTreatmentDegree)); + HP.AddPositiveV(GameData.basicTreatmentDegree); + degreeOfTreatment = 0; + return true; + } return false; } - if (addV > 0) - { - whoTreatYou.AddScore(GameData.StudentScoreTreat(addV)); - SetDegreeOfTreatment0(); - return true; - } - if (value >= GameData.basicTreatmentDegree) - { - whoTreatYou.AddScore(GameData.StudentScoreTreat(GameData.basicTreatmentDegree)); - HP.AddPositiveV(GameData.basicTreatmentDegree); - SetDegreeOfTreatment0(); - return true; - } - return false; } #endregion #region 查询状态相关的基本属性与方法 @@ -475,18 +485,8 @@ namespace GameClass.GameObj /// /// 角色所属队伍ID /// - private long teamID = long.MaxValue; - public long TeamID - { - get => Interlocked.Read(ref teamID); - set => Interlocked.Exchange(ref teamID, value); - } - private long playerID = long.MaxValue; - public long PlayerID - { - get => Interlocked.Read(ref playerID); - set => Interlocked.Exchange(ref playerID, value); - } + public AtomicLong TeamID { get; } = new AtomicLong(long.MaxValue); + public AtomicLong PlayerID { get; } = new AtomicLong(long.MaxValue); #region 道具和buff相关属性、方法 private readonly object inventoryLock = new(); diff --git a/logic/Gaming/CharacterManager.cs b/logic/Gaming/CharacterManager.cs index 182f42c..6fdeedb 100644 --- a/logic/Gaming/CharacterManager.cs +++ b/logic/Gaming/CharacterManager.cs @@ -57,8 +57,8 @@ namespace Gaming } gameMap.Add(newPlayer); - newPlayer.TeamID = teamID; - newPlayer.PlayerID = playerID; + newPlayer.TeamID.Set(teamID); + newPlayer.PlayerID.Set(playerID); /* #region 人物装弹 new Thread ( diff --git a/logic/Preparation/Utility/SafeValue.cs b/logic/Preparation/Utility/SafeValue.cs index 4fb4d64..d2be37d 100644 --- a/logic/Preparation/Utility/SafeValue.cs +++ b/logic/Preparation/Utility/SafeValue.cs @@ -26,6 +26,27 @@ namespace Preparation.Utility /// 返回操作前的值 public int CompareExReturnOri(int newV, int compareTo) => Interlocked.CompareExchange(ref v, newV, compareTo); } + public struct AtomicLong + { + private long v; + public AtomicLong(long x) + { + v = x; + } + public override string ToString() => Interlocked.Read(ref v).ToString(); + public long Get() => Interlocked.Read(ref v); + public static implicit operator long(AtomicLong aint) => Interlocked.Read(ref aint.v); + public long Set(long value) => Interlocked.Exchange(ref v, value); + + public long Add(long x) => Interlocked.Add(ref v, x); + public long Sub(long x) => Interlocked.Add(ref v, -x); + public long Inc() => Interlocked.Increment(ref v); + public long Dec() => Interlocked.Decrement(ref v); + + public void CompareExchange(long newV, long compareTo) => Interlocked.CompareExchange(ref v, newV, compareTo); + /// 返回操作前的值 + public long CompareExReturnOri(long newV, long compareTo) => Interlocked.CompareExchange(ref v, newV, compareTo); + } public struct AtomicBool { private int v;//v==0为false,v==1为true