Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions logic/PlayBack/PlaybackConstant.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
namespace Playback;

public static class Constants
{
/// <summary>
Expand Down
18 changes: 9 additions & 9 deletions logic/Server/GameServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@
result.Add("Team 2", score[1]);
result.Add("Team 3", score[2]);
result.Add("Team 4", score[3]);
JsonSerializer serializer = new();
JsonSerializer serializer = new();
using StreamWriter sw = new(path);
using JsonTextWriter writer = new(sw);
serializer.Serialize(writer, result);
Expand All @@ -128,7 +128,7 @@
}
string state = crashed ? "Crashed" : "Finished";
string[][] player_role = new string[4][];
for(int i = 0; i < options.TeamCount; i++)
for (int i = 0; i < options.TeamCount; i++)
{
player_role[i] = new string[options.CharacterCount];
}
Expand Down Expand Up @@ -247,7 +247,7 @@
double[] doubleArray = scores.Select(x => (double)x).ToArray();
if (options.Mode == 2)
{
bool crash = false;

Check warning on line 250 in logic/Server/GameServer.cs

View workflow job for this annotation

GitHub Actions / dotnet-build-logic

The variable 'crash' is assigned but its value is never used
doubleArray = PullScore(doubleArray);
if (doubleArray.Length == 0)
{
Expand Down Expand Up @@ -299,7 +299,7 @@
{
MessageOfObj? msg = CopyInfo.Auto(gameObj, time);
if (msg != null) currentGameInfo.ObjMessage.Add(msg);
}
}
lock (newsLock)
{
foreach (var news in currentNews)
Expand Down Expand Up @@ -382,7 +382,7 @@
score[(int)t.TeamId] = (int)t.Score;
}
return score;
}
}

private uint GetBirthPointIdx(long playerID) // 获取出生点位置
{
Expand All @@ -396,7 +396,7 @@
return false;
}


private MessageOfAll GetMessageOfAll(int time)
{
MessageOfAll msg = new()
Expand All @@ -410,10 +410,10 @@
{
var teamInfo = new MessageOfAll.Types.TeamInfo
{
Score = (int)t.Score,
Material = (int)t.FactoryStorage,
ComputePower = (int)t.FactoryComputingPower,
FactoryHp = (int)t.FactoryHP
Score = (int)t.Score,
Material = (int)t.FactoryStorage,
ComputePower = (int)t.FactoryComputingPower,
FactoryHp = (int)t.FactoryHP
};

msg.Teams.Add(teamInfo);
Expand Down
2 changes: 1 addition & 1 deletion logic/Server/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public static int Main(string[] args)
rpcServer.ShutdownAsync().Wait();

logger.LogInfo("=================== Final Score ====================");

logger.LogInfo($"Team0: {server.GetScore()[0]}"); //
logger.LogInfo($"Team1: {server.GetScore()[1]}"); //
logger.LogInfo($"Team2: {server.GetScore()[2]}"); //
Expand Down
224 changes: 158 additions & 66 deletions logic/Server/RpcServices.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Microsoft.Extensions.Logging;
using Preparation.Utility;
using Protobuf;
using System.Threading;
using Utility = Preparation.Utility;

namespace Server
Expand All @@ -26,7 +27,7 @@
isSpectatorJoin = value;
}
}

#region 连接和初始化服务

public override Task<BoolRes> TryConnection(IDMsg request, ServerCallContext context)
Expand Down Expand Up @@ -54,67 +55,156 @@

protected readonly object addPlayerLock = new();
public override async Task RegisterFactory(RegisterFactoryMsg request, IServerStreamWriter<MessageToClient> responseStream, ServerCallContext context)
{
GameServerLogging.logger.LogDebug(
$"TRY Register Factory: Team {request.TeamId}");
if (game.GameMap.Timer.IsGaming)
return;
if (!ValidPlayerID(request.PlayerId)) //玩家id是否正确
return;
if (request.TeamId >= TeamCount)
return;
if (communicationToGameID[request.TeamId][request.PlayerId] != GameObj.invalidID) //是否已经添加了该玩家
return;
GameServerLogging.logger.LogDebug("AddPlayer: Check Correct");
lock (addPlayerLock)
{
GameServerLogging.logger.LogDebug("ch id :" + request.PlayerId + " te id:" + request.TeamId + " side: " + request.SideFlag);
var temp = (new SemaphoreSlim(0, 1), new SemaphoreSlim(0, 1));
GameServerLogging.logger.LogInfo($"Register Factory: Team {request.TeamId}");
StartGame();
}
bool exitFlag = false;
bool firstTime = true;
do
{
try
{
semaDicts[request.TeamId][request.PlayerId].Item1.Wait();
Character? character = game.GameMap.FindCharacterInPlayerID(request.TeamId, request.PlayerId);
// if(character!=null)
// {
// GameServerLogging.logger.LogInfo($"Character {request.PlayerId} exist! IsRemoved {character.IsRemoved}");
// }
// else{
// GameServerLogging.logger.LogInfo($"Character {request.PlayerId} null");
// }
if (!firstTime && request.PlayerId > 0 && (character == null || character.IsRemoved == true))
{
// GameServerLogging.logger.LogInfo($"Cannot find character {request.PlayerId} from Team {request.TeamId}!");
}
else
GameServerLogging.logger.LogDebug($"TRY Register Factory: Team {request.TeamId}");

if (game.GameMap?.Timer?.IsGaming ?? false)
return;

if (!ValidPlayerID(request.PlayerId))
return;

if (request.TeamId < 0 || request.TeamId >= TeamCount)
return;

if (communicationToGameID[request.TeamId][request.PlayerId] != GameObj.invalidID)
return;

// 观战玩家分支
if (request.PlayerId >= spectatorMinPlayerID && options.NotAllowSpectator == false)
{
if (firstTime)
firstTime = false;
try
GameServerLogging.logger.LogDebug($"TRY Add Spectator: Player {request.PlayerId}");
lock (spectatorJoinLock)
{
if (currentGameInfo != null && !exitFlag)
if (semaDicts[0].TryAdd(request.PlayerId, (new SemaphoreSlim(0, 1), new SemaphoreSlim(0, 1))))
{
await responseStream.WriteAsync(currentGameInfo);
// GameServerLogging.logger.LogInfo(
// $"Send to Player{request.PlayerId} from Team {request.TeamId}!",
// false);
GameServerLogging.logger.LogInfo("A new spectator comes to watch this game");
IsSpectatorJoin = true;
}
else
{
GameServerLogging.logger.LogInfo($"Duplicated Spectator ID {request.PlayerId}");
return;
}
}
catch

do
{
if (!exitFlag)
semaDicts[0][request.PlayerId].Item1.Wait();
try
{
GameServerLogging.logger.LogInfo($"The client {request.PlayerId} exited");
exitFlag = true;
if (currentGameInfo != null)
{
var info = currentGameInfo.Clone();
for (int i = info.ObjMessage.Count - 1; i >= 0; i--)
{
if (info.ObjMessage[i].NewsMessage != null)
{
info.ObjMessage.RemoveAt(i);
}
}
await responseStream.WriteAsync(info);
}
}
catch (InvalidOperationException)
{
if (semaDicts[0].TryRemove(request.PlayerId, out var semas))
{
try
{
semas.Item1.Release();
semas.Item2.Release();
}
catch { }
GameServerLogging.logger.LogInfo($"The spectator {request.PlayerId} exited");
return;
}
}
catch (Exception ex)
{
GameServerLogging.logger.LogInfo(ex.ToString());
}
finally
{
try
{
semaDicts[0][request.PlayerId].Item2.Release();
}
catch { }
}
} while (game.GameMap.Timer.IsGaming);

Check warning on line 137 in logic/Server/RpcServices.cs

View workflow job for this annotation

GitHub Actions / dotnet-build-logic

Dereference of a possibly null reference.

GameServerLogging.logger.LogDebug("END Add Spectator");
return;
}

GameServerLogging.logger.LogDebug("AddPlayer: Check Correct");

// 加入玩家队列
var playerSemas = (new SemaphoreSlim(0, 1), new SemaphoreSlim(0, 1));
lock (addPlayerLock)
{
GameServerLogging.logger.LogDebug($"ch id :{request.PlayerId} te id:{request.TeamId} side: {request.SideFlag}");

if (!semaDicts[request.TeamId].TryAdd(request.PlayerId, playerSemas))
{
GameServerLogging.logger.LogWarning($"Player {request.PlayerId} has already been registered in team {request.TeamId}");
return;
}

communicationToGameID[request.TeamId][request.PlayerId] = GameObj.invalidID;

bool start = Interlocked.Increment(ref playerCountNow) == (playerNum * TeamCount);
GameServerLogging.logger.LogInfo($"Register Factory: Team {request.TeamId}, current joined players: {playerCountNow}");

if (start)
{
StartGame();
}
}
semaDicts[request.TeamId][request.PlayerId].Item2.Release();
} while (game.GameMap.Timer.IsGaming);

bool exitFlag = false;
bool firstTime = true;
do
{
playerSemas.Item1.Wait();
var character = game.GameMap.FindCharacterInPlayerID(request.TeamId, request.PlayerId);

Check warning on line 173 in logic/Server/RpcServices.cs

View workflow job for this annotation

GitHub Actions / dotnet-build-logic

Dereference of a possibly null reference.

if (!firstTime && request.PlayerId > 0 && (character == null || character.IsRemoved == true))
{
// character离开/死亡时可安全忽略继续发流
}
else
{
if (firstTime)
firstTime = false;

try
{
if (currentGameInfo != null && !exitFlag)
{
await responseStream.WriteAsync(currentGameInfo);
}
}
catch
{
if (!exitFlag)
{
GameServerLogging.logger.LogInfo($"The client {request.PlayerId} exited");
exitFlag = true;
}
}
}

playerSemas.Item2.Release();
} while (game.GameMap.Timer.IsGaming);
}
catch (Exception ex)
{
GameServerLogging.logger.LogError($"RegisterFactory exception: {ex}");
}
}

public override Task<MessageOfMap> GetMap(NullRequest request, ServerCallContext context)
Expand Down Expand Up @@ -151,18 +241,18 @@
public override Task<BoolRes> Recover(RecoverMsg request, ServerCallContext context)
{
GameServerLogging.logger.LogDebug(
$"TRY Recover: Player {request.PlayerId} from Team {request.TeamId}" +
$"TRY Recover: Player {request.PlayerId} from Team {request.TeamId}" +
$"RecoveredHp: {request.RecoveredHp}");
BoolRes boolRes = new();

boolRes.ActSuccess = game.Recover(request.TeamId, request.PlayerId, request.RecoveredHp);
GameServerLogging.logger.LogDebug($"END Recover:{boolRes.ActSuccess}");
return Task.FromResult(boolRes);
}

public override Task<BoolRes> Harvest(ResourceMsg request, ServerCallContext context)
{
GameServerLogging.logger.LogDebug($"TRY Harvesting: Player {request.PlayerId} from Team {request.TeamId}" +
GameServerLogging.logger.LogDebug($"TRY Harvesting: Player {request.PlayerId} from Team {request.TeamId}" +
$"HarvestedResource: {request.ResourceId}, Amount: {request.Amount}");
BoolRes boolRes = new();
// boolRes.ActSuccess = game.Harvest(request.TeamId, request.PlayerId, request.ResourceId, request.Amount);
Expand Down Expand Up @@ -196,7 +286,7 @@
GameServerLogging.logger.LogDebug(
$"TRY Send: From Player {request.PlayerId} To Player {request.ToPlayerId} from Team {request.TeamId}");
BoolRes boolRes = new BoolRes();

GameServerLogging.logger.LogDebug($"Send: As {request.MessageCase}");
switch (request.MessageCase)
{
Expand Down Expand Up @@ -260,12 +350,13 @@
public override Task<BoolRes> Load(LoadMsg request, ServerCallContext context)
{
GameServerLogging.logger.LogDebug($"TRY Load: {request.PlayerId} from Team {request.TeamId} loading Product {request.ProductType} with Amount {request.ProductAmount}");
BoolRes boolRes = new() {
ActSuccess =
BoolRes boolRes = new()
{
ActSuccess =
game.Load(
request.TeamId,
request.PlayerId,
Transformation.GoodsTypeFromProto(request.ProductType),
request.TeamId,
request.PlayerId,
Transformation.GoodsTypeFromProto(request.ProductType),
request.ProductAmount)
};
GameServerLogging.logger.LogDebug($"END Load:{boolRes.ActSuccess}");
Expand All @@ -276,13 +367,14 @@
{
GameServerLogging.logger.LogDebug($"TRY Trade: Player {request.PlayerId} {(request.IsBuy ? "buy from" : "sell to")} Team {request.TeamId}" +
$" Product:{request.ProductType}, Amount:{request.ProductAmount}");
BoolRes boolRes = new(){
ActSuccess =
BoolRes boolRes = new()
{
ActSuccess =
game.Trade(
request.TeamId,
request.PlayerId,
Transformation.GoodsTypeFromProto(request.ProductType),
request.ProductAmount,
request.TeamId,
request.PlayerId,
Transformation.GoodsTypeFromProto(request.ProductType),
request.ProductAmount,
request.IsBuy)
};
GameServerLogging.logger.LogDebug($"END Trade:{boolRes.ActSuccess}");
Expand Down
Loading
Loading