Browse Source

fix: 🚑 fix the bug about Semaphore when attacking

tags/v0.1.0
shangfengh 2 years ago
parent
commit
7bd12c51a2
3 changed files with 87 additions and 56 deletions
  1. +84
    -55
      logic/GameClass/GameObj/Map/Map.cs
  2. +2
    -0
      logic/Gaming/AttackManager.cs
  3. +1
    -1
      logic/Server/GameServer.cs

+ 84
- 55
logic/GameClass/GameObj/Map/Map.cs View File

@@ -75,6 +75,7 @@ namespace GameClass.GameObj
{ {
if (Interlocked.Increment(ref numOfNoHpStudent) == GameData.numOfStudent) if (Interlocked.Increment(ref numOfNoHpStudent) == GameData.numOfStudent)
{ {
AddScoreFromAddict();
Timer.IsGaming = false; Timer.IsGaming = false;
return; return;
} }
@@ -120,6 +121,10 @@ namespace GameClass.GameObj
GameObjLockDict[GameObjType.EmergencyExit].ExitReadLock(); GameObjLockDict[GameObjType.EmergencyExit].ExitReadLock();
} }
} }
private void AddScoreFromAddict()
{

}




private Dictionary<GameObjType, IList<IGameObj>> gameObjDict; private Dictionary<GameObjType, IList<IGameObj>> gameObjDict;
@@ -182,6 +187,26 @@ namespace GameClass.GameObj
} }
return player; 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) public Character? FindPlayerToAction(long playerID)
{ {
Character? player = null; Character? player = null;
@@ -215,61 +240,7 @@ namespace GameClass.GameObj
} }
return player; 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) public GameObj? OneForInteract(XY Pos, GameObjType gameObjType)
{ {
GameObj? GameObjForInteract = null; GameObj? GameObjForInteract = null;
@@ -375,6 +346,7 @@ namespace GameClass.GameObj
} }
return GameObjForInteract; return GameObjForInteract;
} }

public bool CanSee(Character player, GameObj gameObj) public bool CanSee(Character player, GameObj gameObj)
{ {
if ((gameObj.Type == GameObjType.Character) && ((Character)gameObj).HasInvisible) return false; if ((gameObj.Type == GameObjType.Character) && ((Character)gameObj).HasInvisible) return false;
@@ -422,6 +394,63 @@ namespace GameClass.GameObj
} }
return true; 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) public Map(uint[,] mapResource)
{ {
gameObjDict = new Dictionary<GameObjType, IList<IGameObj>>(); gameObjDict = new Dictionary<GameObjType, IList<IGameObj>>();


+ 2
- 0
logic/Gaming/AttackManager.cs View File

@@ -228,6 +228,7 @@ namespace Gaming
if (!player.StartThread(stateNum, RunningStateType.RunningActively)) if (!player.StartThread(stateNum, RunningStateType.RunningActively))
{ {
TryRemoveBullet(bullet); TryRemoveBullet(bullet);
player.ThreadNum.Release();
return; return;
} }
new FrameRateTaskExecutor<int>( new FrameRateTaskExecutor<int>(
@@ -241,6 +242,7 @@ namespace Gaming
) )
.Start(); .Start();


player.ThreadNum.Release();
if (gameMap.Timer.IsGaming) if (gameMap.Timer.IsGaming)
{ {
if (!player.ResetPlayerState(stateNum)) if (!player.ResetPlayerState(stateNum))


+ 1
- 1
logic/Server/GameServer.cs View File

@@ -149,7 +149,7 @@ namespace Server
currentNews.Clear(); currentNews.Clear();
} }
currentGameInfo.GameState = gameState; currentGameInfo.GameState = gameState;
currentGameInfo.AllMessage = GetMessageOfAll(time);
currentGameInfo.AllMessage = GetMessageOfAll(game.GameMap.Timer.nowTime());
mwr?.WriteOne(currentGameInfo); mwr?.WriteOne(currentGameInfo);
break; break;
default: default:


Loading…
Cancel
Save