From 81302bddce242076f7e1a6ec9a761a8265e97b72 Mon Sep 17 00:00:00 2001
From: shangfengh <3495281661@qq.com>
Date: Wed, 21 Jun 2023 21:48:38 +0800
Subject: [PATCH] feat: :art: add a new SafeValues, AtomicLong
---
.../GameClass/GameObj/Character/Character.cs | 66 +++++++++----------
logic/Gaming/CharacterManager.cs | 4 +-
logic/Preparation/Utility/SafeValue.cs | 21 ++++++
3 files changed, 56 insertions(+), 35 deletions(-)
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