Browse Source

Merge pull request #595 from shangfengh/new

fix: 🚑 fix the bug about Semaphore when attacking
tags/v0.1.0
shangfengh GitHub 2 years ago
parent
commit
241e8057fc
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
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)
{
AddScoreFromAddict();
Timer.IsGaming = false;
return;
}
@@ -120,6 +121,10 @@ namespace GameClass.GameObj
GameObjLockDict[GameObjType.EmergencyExit].ExitReadLock();
}
}
private void AddScoreFromAddict()
{

}


private Dictionary<GameObjType, IList<IGameObj>> 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<GameObjType, IList<IGameObj>>();


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

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

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


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

@@ -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:


Loading…
Cancel
Save