diff --git a/logic/GameClass/GameObj/Map/Map.cs b/logic/GameClass/GameObj/Map/Map.cs index 4d81852..c20d2f0 100644 --- a/logic/GameClass/GameObj/Map/Map.cs +++ b/logic/GameClass/GameObj/Map/Map.cs @@ -75,6 +75,7 @@ namespace GameClass.GameObj { if (Interlocked.Increment(ref numOfNoHpStudent) == GameData.numOfStudent) { + AddScoreFromAddict(); Timer.IsGaming = false; return; } @@ -120,6 +121,10 @@ namespace GameClass.GameObj GameObjLockDict[GameObjType.EmergencyExit].ExitReadLock(); } } + private void AddScoreFromAddict() + { + + } private Dictionary> gameObjDict; @@ -182,6 +187,26 @@ namespace GameClass.GameObj } return player; } + public Character FindGhost() + { + gameObjLockDict[GameObjType.Character].EnterReadLock(); + try + { + int i; + for (i = 0; i < (gameObjDict[GameObjType.Character]).Count - 1; ++i) + { + if (((Character)gameObjDict[GameObjType.Character][i]).IsGhost()) + { + return ((Character)gameObjDict[GameObjType.Character][i]); + } + } + return ((Character)gameObjDict[GameObjType.Character][i]); + } + finally + { + gameObjLockDict[GameObjType.Character].ExitReadLock(); + } + } public Character? FindPlayerToAction(long playerID) { Character? player = null; @@ -215,61 +240,7 @@ namespace GameClass.GameObj } return player; } - public bool Remove(GameObj gameObj) - { - GameObj? ToDel = null; - GameObjLockDict[gameObj.Type].EnterWriteLock(); - try - { - foreach (GameObj obj in GameObjDict[gameObj.Type]) - { - if (gameObj.ID == obj.ID) - { - ToDel = obj; - break; - } - } - if (ToDel != null) - { - GameObjDict[gameObj.Type].Remove(ToDel); - ToDel.TryToRemove(); - } - } - finally - { - GameObjLockDict[gameObj.Type].ExitWriteLock(); - } - return ToDel != null; - } - public bool RemoveJustFromMap(GameObj gameObj) - { - GameObjLockDict[gameObj.Type].EnterWriteLock(); - try - { - if (GameObjDict[gameObj.Type].Remove(gameObj)) - { - gameObj.TryToRemove(); - return true; - } - return false; - } - finally - { - GameObjLockDict[gameObj.Type].ExitWriteLock(); - } - } - public void Add(GameObj gameObj) - { - GameObjLockDict[gameObj.Type].EnterWriteLock(); - try - { - GameObjDict[gameObj.Type].Add(gameObj); - } - finally - { - GameObjLockDict[gameObj.Type].ExitWriteLock(); - } - } + public GameObj? OneForInteract(XY Pos, GameObjType gameObjType) { GameObj? GameObjForInteract = null; @@ -375,6 +346,7 @@ namespace GameClass.GameObj } return GameObjForInteract; } + public bool CanSee(Character player, GameObj gameObj) { if ((gameObj.Type == GameObjType.Character) && ((Character)gameObj).HasInvisible) return false; @@ -422,6 +394,63 @@ namespace GameClass.GameObj } return true; } + + public bool Remove(GameObj gameObj) + { + GameObj? ToDel = null; + GameObjLockDict[gameObj.Type].EnterWriteLock(); + try + { + foreach (GameObj obj in GameObjDict[gameObj.Type]) + { + if (gameObj.ID == obj.ID) + { + ToDel = obj; + break; + } + } + if (ToDel != null) + { + GameObjDict[gameObj.Type].Remove(ToDel); + ToDel.TryToRemove(); + } + } + finally + { + GameObjLockDict[gameObj.Type].ExitWriteLock(); + } + return ToDel != null; + } + public bool RemoveJustFromMap(GameObj gameObj) + { + GameObjLockDict[gameObj.Type].EnterWriteLock(); + try + { + if (GameObjDict[gameObj.Type].Remove(gameObj)) + { + gameObj.TryToRemove(); + return true; + } + return false; + } + finally + { + GameObjLockDict[gameObj.Type].ExitWriteLock(); + } + } + public void Add(GameObj gameObj) + { + GameObjLockDict[gameObj.Type].EnterWriteLock(); + try + { + GameObjDict[gameObj.Type].Add(gameObj); + } + finally + { + GameObjLockDict[gameObj.Type].ExitWriteLock(); + } + } + public Map(uint[,] mapResource) { gameObjDict = new Dictionary>(); diff --git a/logic/Gaming/AttackManager.cs b/logic/Gaming/AttackManager.cs index 4ed6cc5..cd3402d 100644 --- a/logic/Gaming/AttackManager.cs +++ b/logic/Gaming/AttackManager.cs @@ -228,6 +228,7 @@ namespace Gaming if (!player.StartThread(stateNum, RunningStateType.RunningActively)) { TryRemoveBullet(bullet); + player.ThreadNum.Release(); return; } new FrameRateTaskExecutor( @@ -241,6 +242,7 @@ namespace Gaming ) .Start(); + player.ThreadNum.Release(); if (gameMap.Timer.IsGaming) { if (!player.ResetPlayerState(stateNum)) diff --git a/logic/Server/GameServer.cs b/logic/Server/GameServer.cs index c1ea2f2..3e920d1 100644 --- a/logic/Server/GameServer.cs +++ b/logic/Server/GameServer.cs @@ -149,7 +149,7 @@ namespace Server currentNews.Clear(); } currentGameInfo.GameState = gameState; - currentGameInfo.AllMessage = GetMessageOfAll(time); + currentGameInfo.AllMessage = GetMessageOfAll(game.GameMap.Timer.nowTime()); mwr?.WriteOne(currentGameInfo); break; default: