From ff4ca4a95921f7548828b9b4a1478b6d8b03e0b1 Mon Sep 17 00:00:00 2001 From: shangfengh <3495281661@qq.com> Date: Sat, 6 May 2023 22:58:45 +0800 Subject: [PATCH] fix: :bug: add some lock --- ...戏机制与平衡性调整更新草案.md | 2 +- docs/版本更新说明.md | 2 +- logic/GameClass/GameObj/GameObj.cs | 2 ++ logic/GameClass/GameObj/Map/Chest.cs | 7 +++---- logic/GameClass/GameObj/Map/Map.cs | 1 - logic/GameClass/GameObj/Moveable.cs | 20 +++++++++---------- logic/GameClass/GameObj/ObjOfCharacter.cs | 16 ++++++++++++--- logic/GameClass/GameObj/PickedProp.cs | 9 ++------- logic/GameClass/GameObj/Tile.cs | 1 - logic/Server/CopyInfo.cs | 1 + 10 files changed, 32 insertions(+), 29 deletions(-) diff --git a/docs/游戏机制与平衡性调整更新草案.md b/docs/游戏机制与平衡性调整更新草案.md index 597350b..24a3f1b 100644 --- a/docs/游戏机制与平衡性调整更新草案.md +++ b/docs/游戏机制与平衡性调整更新草案.md @@ -6,7 +6,7 @@ v1.3 - 有任何问题都可以在选手群中提出建议和讨论 ## 游戏接口 - 删除structures.h中Player的属性place + - 删除structures.h中Player的属性place ## 游戏规则 diff --git a/docs/版本更新说明.md b/docs/版本更新说明.md index 3a752ef..bc59a20 100644 --- a/docs/版本更新说明.md +++ b/docs/版本更新说明.md @@ -3,7 +3,7 @@ # 说明 - 只说明对于选手较为重要的修改 -# 5.6更新的更改 +# 5月6日更新 - docs:添加了 游戏机制与平衡性调整更新草案.pdf - docs:添加了 版本更新说明.pdf - docs&hotfix: 修正了GameRules.pdf中学生翻窗速度的错误 diff --git a/logic/GameClass/GameObj/GameObj.cs b/logic/GameClass/GameObj/GameObj.cs index 28d0c2e..0c9c301 100644 --- a/logic/GameClass/GameObj/GameObj.cs +++ b/logic/GameClass/GameObj/GameObj.cs @@ -9,6 +9,8 @@ namespace GameClass.GameObj /// public abstract class GameObj : IGameObj { + private ReaderWriterLockSlim gameObjReaderWriterLock = new(); + public ReaderWriterLockSlim GameObjReaderWriterLock => gameObjReaderWriterLock; protected readonly object gameObjLock = new(); public object GameLock => gameObjLock; diff --git a/logic/GameClass/GameObj/Map/Chest.cs b/logic/GameClass/GameObj/Map/Chest.cs index 69ea6cf..1cc8707 100644 --- a/logic/GameClass/GameObj/Map/Chest.cs +++ b/logic/GameClass/GameObj/Map/Chest.cs @@ -1,5 +1,4 @@ using Preparation.Utility; -using System.Collections.Generic; namespace GameClass.GameObj { @@ -16,7 +15,7 @@ namespace GameClass.GameObj public override bool IsRigid => true; public override ShapeType Shape => ShapeType.Square; - private Prop[] propInChest = new Prop[GameData.maxNumOfPropInChest] { new NullProp(), new NullProp() }; + private readonly Prop[] propInChest = new Prop[GameData.maxNumOfPropInChest] { new NullProp(), new NullProp() }; public Prop[] PropInChest => propInChest; private int openStartTime = 0; @@ -25,7 +24,7 @@ namespace GameClass.GameObj public Character? WhoOpen => whoOpen; public void Open(int startTime, Character character) { - lock (gameObjLock) + lock (GameObjReaderWriterLock) { openStartTime = startTime; whoOpen = character; @@ -33,7 +32,7 @@ namespace GameClass.GameObj } public void StopOpen() { - lock (gameObjLock) + lock (GameObjReaderWriterLock) { openStartTime = 0; whoOpen = null; diff --git a/logic/GameClass/GameObj/Map/Map.cs b/logic/GameClass/GameObj/Map/Map.cs index 3cfbf49..3a3869f 100644 --- a/logic/GameClass/GameObj/Map/Map.cs +++ b/logic/GameClass/GameObj/Map/Map.cs @@ -8,7 +8,6 @@ namespace GameClass.GameObj { public partial class Map : IMap { - private readonly Dictionary birthPointList; // 出生点列表 public Dictionary BirthPointList => birthPointList; diff --git a/logic/GameClass/GameObj/Moveable.cs b/logic/GameClass/GameObj/Moveable.cs index d7adadc..3a48ef3 100644 --- a/logic/GameClass/GameObj/Moveable.cs +++ b/logic/GameClass/GameObj/Moveable.cs @@ -1,17 +1,15 @@ using Preparation.Interface; using Preparation.Utility; -using Protobuf; using System.Threading; namespace GameClass.GameObj { - /// - /// 一切游戏元素的总基类,与THUAI4不同,继承IMoveable接口(出于一切物体其实都是可运动的指导思想)——LHR - /// public abstract class Moveable : GameObj, IMoveable { protected readonly object moveObjLock = new(); public object MoveLock => moveObjLock; + private ReaderWriterLockSlim moveReaderWriterLock = new(); + public ReaderWriterLockSlim MoveReaderWriterLock => moveReaderWriterLock; public override XY Position { @@ -60,7 +58,7 @@ namespace GameClass.GameObj return moveVec * moveVec; } - public void ReSetPos(XY position) + public void ReSetPos(XY position) { lock (moveObjLock) { @@ -72,12 +70,12 @@ namespace GameClass.GameObj { get { - lock (gameObjLock) + lock (moveReaderWriterLock) return canMove; } set { - lock (gameObjLock) + lock (moveReaderWriterLock) { canMove = value; } @@ -89,12 +87,12 @@ namespace GameClass.GameObj { get { - lock (gameObjLock) + lock (moveReaderWriterLock) return isResetting; } set { - lock (gameObjLock) + lock (moveReaderWriterLock) { isResetting = value; } @@ -111,12 +109,12 @@ namespace GameClass.GameObj { get { - lock (gameObjLock) + lock (moveReaderWriterLock) return moveSpeed; } set { - lock (gameObjLock) + lock (moveReaderWriterLock) { moveSpeed = value; } diff --git a/logic/GameClass/GameObj/ObjOfCharacter.cs b/logic/GameClass/GameObj/ObjOfCharacter.cs index 1004891..7bdcba1 100644 --- a/logic/GameClass/GameObj/ObjOfCharacter.cs +++ b/logic/GameClass/GameObj/ObjOfCharacter.cs @@ -1,5 +1,7 @@ -using Preparation.Interface; +using Google.Protobuf.WellKnownTypes; +using Preparation.Interface; using Preparation.Utility; +using System.Threading; namespace GameClass.GameObj { @@ -8,13 +10,21 @@ namespace GameClass.GameObj /// public abstract class ObjOfCharacter : Moveable, IObjOfCharacter { + private ReaderWriterLockSlim objOfCharacterReaderWriterLock = new(); + public ReaderWriterLockSlim ObjOfCharacterReaderWriterLock => objOfCharacterReaderWriterLock; private ICharacter? parent = null; // 主人 public ICharacter? Parent { - get => parent; + get + { + lock (objOfCharacterReaderWriterLock) + { + return parent; + } + } set { - lock (gameObjLock) + lock (objOfCharacterReaderWriterLock) { parent = value; } diff --git a/logic/GameClass/GameObj/PickedProp.cs b/logic/GameClass/GameObj/PickedProp.cs index 221e6e8..fc070db 100644 --- a/logic/GameClass/GameObj/PickedProp.cs +++ b/logic/GameClass/GameObj/PickedProp.cs @@ -1,10 +1,5 @@ using Preparation.Utility; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace GameClass.GameObj { // 为方便界面组做道具拾起特效,现引入“被捡起的道具”,在每帧发送给界面组 @@ -13,11 +8,11 @@ namespace GameClass.GameObj public override ShapeType Shape => ShapeType.Circle; public override bool IsRigid => false; public long MappingID { get; } - public Prop PropHasPicked; + public readonly Prop propHasPicked; public PickedProp(Prop prop) : base(prop.Position, prop.Radius, GameObjType.PickedProp) { - this.PropHasPicked = prop; + this.propHasPicked = prop; this.MappingID = prop.ID; } } diff --git a/logic/GameClass/GameObj/Tile.cs b/logic/GameClass/GameObj/Tile.cs index 88bbf55..ce71673 100644 --- a/logic/GameClass/GameObj/Tile.cs +++ b/logic/GameClass/GameObj/Tile.cs @@ -1,6 +1,5 @@ using Preparation.Interface; using Preparation.Utility; -using System.Threading; namespace GameClass.GameObj { diff --git a/logic/Server/CopyInfo.cs b/logic/Server/CopyInfo.cs index 9b4ff84..ff88b8b 100644 --- a/logic/Server/CopyInfo.cs +++ b/logic/Server/CopyInfo.cs @@ -268,6 +268,7 @@ namespace Server Y = chest.Position.y } }; + Debugger.Output(chest, chest.OpenStartTime.ToString()); int progress = (chest.WhoOpen != null) ? ((time - chest.OpenStartTime) * chest.WhoOpen.SpeedOfOpenChest) : 0; msg.ChestMessage.Progress = (progress > GameData.degreeOfOpenedChest) ? GameData.degreeOfOpenedChest : progress; return msg;