diff --git a/logic/GameClass/GameObj/Character/Character.cs b/logic/GameClass/GameObj/Character/Character.cs index 88940f2..26655d8 100644 --- a/logic/GameClass/GameObj/Character/Character.cs +++ b/logic/GameClass/GameObj/Character/Character.cs @@ -516,10 +516,16 @@ namespace GameClass.GameObj ((Chest)whatInteractingWith!).StopOpen(); return ChangePlayerState(value, gameObj); case PlayerStateType.OpeningTheDoorway: - Doorway doorway = (Doorway)whatInteractingWith!; - doorway.StopOpenning(); - return ChangePlayerState(value, gameObj); - + try + { + Doorway doorway = (Doorway)whatInteractingWith!; + doorway.StopOpenning(); + return ChangePlayerState(value, gameObj); + } + finally + { + ThreadNum.Release(); + } case PlayerStateType.OpeningTheDoor: Door door = (Door)whatInteractingWith!; try diff --git a/logic/Gaming/ActionManager.cs b/logic/Gaming/ActionManager.cs index 18b5e39..6edb986 100644 --- a/logic/Gaming/ActionManager.cs +++ b/logic/Gaming/ActionManager.cs @@ -126,8 +126,6 @@ namespace Gaming public bool OpenDoorway(Student player) { - if (!(player.Commandable())) - return false; Doorway? doorwayToOpen = (Doorway?)gameMap.OneForInteract(player.Position, GameObjType.Doorway); if (doorwayToOpen == null) return false; @@ -137,7 +135,16 @@ namespace Gaming ( () => { - //player.ThreadNum.WaitOne(); + player.ThreadNum.WaitOne(); + lock (player.ActionLock) + { + if (stateNum != player.StateNum) + { + player.ThreadNum.Release(); + return; + } + } + doorwayToOpen.TryToOpen(); Thread.Sleep(GameData.degreeOfOpenedDoorway - doorwayToOpen.OpenDegree); lock (player.ActionLock) { @@ -145,6 +152,7 @@ namespace Gaming { player.SetPlayerStateNaturally(); doorwayToOpen.FinishOpenning(); + player.ThreadNum.Release(); } } }