Skip to content

Commit 439bd02

Browse files
authored
Merge pull request #48 from manfred-z6/dev
Add server to .sln
2 parents a1bb419 + 7901f54 commit 439bd02

5 files changed

Lines changed: 225 additions & 76 deletions

File tree

logic/PlayBack/PlaybackConstant.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
namespace Playback;
2+
23
public static class Constants
34
{
45
/// <summary>

logic/Server/GameServer.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ private void SaveGameResult(string path)
106106
result.Add("Team 2", score[1]);
107107
result.Add("Team 3", score[2]);
108108
result.Add("Team 4", score[3]);
109-
JsonSerializer serializer = new();
109+
JsonSerializer serializer = new();
110110
using StreamWriter sw = new(path);
111111
using JsonTextWriter writer = new(sw);
112112
serializer.Serialize(writer, result);
@@ -128,7 +128,7 @@ protected void SendGameResult(int[] scores, bool crashed = false) // 天梯的
128128
}
129129
string state = crashed ? "Crashed" : "Finished";
130130
string[][] player_role = new string[4][];
131-
for(int i = 0; i < options.TeamCount; i++)
131+
for (int i = 0; i < options.TeamCount; i++)
132132
{
133133
player_role[i] = new string[options.CharacterCount];
134134
}
@@ -299,7 +299,7 @@ public void ReportGame(GameState gameState, bool requiredGaming = true)
299299
{
300300
MessageOfObj? msg = CopyInfo.Auto(gameObj, time);
301301
if (msg != null) currentGameInfo.ObjMessage.Add(msg);
302-
}
302+
}
303303
lock (newsLock)
304304
{
305305
foreach (var news in currentNews)
@@ -382,7 +382,7 @@ public override int[] GetScore()
382382
score[(int)t.TeamId] = (int)t.Score;
383383
}
384384
return score;
385-
}
385+
}
386386

387387
private uint GetBirthPointIdx(long playerID) // 获取出生点位置
388388
{
@@ -396,7 +396,7 @@ private bool ValidPlayerID(long playerID)
396396
return false;
397397
}
398398

399-
399+
400400
private MessageOfAll GetMessageOfAll(int time)
401401
{
402402
MessageOfAll msg = new()
@@ -410,10 +410,10 @@ private MessageOfAll GetMessageOfAll(int time)
410410
{
411411
var teamInfo = new MessageOfAll.Types.TeamInfo
412412
{
413-
Score = (int)t.Score,
414-
Material = (int)t.FactoryStorage,
415-
ComputePower = (int)t.FactoryComputingPower,
416-
FactoryHp = (int)t.FactoryHP
413+
Score = (int)t.Score,
414+
Material = (int)t.FactoryStorage,
415+
ComputePower = (int)t.FactoryComputingPower,
416+
FactoryHp = (int)t.FactoryHP
417417
};
418418

419419
msg.Teams.Add(teamInfo);

logic/Server/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public static int Main(string[] args)
5757
rpcServer.ShutdownAsync().Wait();
5858

5959
logger.LogInfo("=================== Final Score ====================");
60-
60+
6161
logger.LogInfo($"Team0: {server.GetScore()[0]}"); //
6262
logger.LogInfo($"Team1: {server.GetScore()[1]}"); //
6363
logger.LogInfo($"Team2: {server.GetScore()[2]}"); //

logic/Server/RpcServices.cs

Lines changed: 158 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Microsoft.Extensions.Logging;
55
using Preparation.Utility;
66
using Protobuf;
7+
using System.Threading;
78
using Utility = Preparation.Utility;
89

910
namespace Server
@@ -26,7 +27,7 @@ protected bool IsSpectatorJoin
2627
isSpectatorJoin = value;
2728
}
2829
}
29-
30+
3031
#region 连接和初始化服务
3132

3233
public override Task<BoolRes> TryConnection(IDMsg request, ServerCallContext context)
@@ -54,67 +55,156 @@ public override Task<BoolRes> TryConnection(IDMsg request, ServerCallContext con
5455

5556
protected readonly object addPlayerLock = new();
5657
public override async Task RegisterFactory(RegisterFactoryMsg request, IServerStreamWriter<MessageToClient> responseStream, ServerCallContext context)
57-
{
58-
GameServerLogging.logger.LogDebug(
59-
$"TRY Register Factory: Team {request.TeamId}");
60-
if (game.GameMap.Timer.IsGaming)
61-
return;
62-
if (!ValidPlayerID(request.PlayerId)) //玩家id是否正确
63-
return;
64-
if (request.TeamId >= TeamCount)
65-
return;
66-
if (communicationToGameID[request.TeamId][request.PlayerId] != GameObj.invalidID) //是否已经添加了该玩家
67-
return;
68-
GameServerLogging.logger.LogDebug("AddPlayer: Check Correct");
69-
lock (addPlayerLock)
70-
{
71-
GameServerLogging.logger.LogDebug("ch id :" + request.PlayerId + " te id:" + request.TeamId + " side: " + request.SideFlag);
72-
var temp = (new SemaphoreSlim(0, 1), new SemaphoreSlim(0, 1));
73-
GameServerLogging.logger.LogInfo($"Register Factory: Team {request.TeamId}");
74-
StartGame();
75-
}
76-
bool exitFlag = false;
77-
bool firstTime = true;
78-
do
58+
{
59+
try
7960
{
80-
semaDicts[request.TeamId][request.PlayerId].Item1.Wait();
81-
Character? character = game.GameMap.FindCharacterInPlayerID(request.TeamId, request.PlayerId);
82-
// if(character!=null)
83-
// {
84-
// GameServerLogging.logger.LogInfo($"Character {request.PlayerId} exist! IsRemoved {character.IsRemoved}");
85-
// }
86-
// else{
87-
// GameServerLogging.logger.LogInfo($"Character {request.PlayerId} null");
88-
// }
89-
if (!firstTime && request.PlayerId > 0 && (character == null || character.IsRemoved == true))
90-
{
91-
// GameServerLogging.logger.LogInfo($"Cannot find character {request.PlayerId} from Team {request.TeamId}!");
92-
}
93-
else
61+
GameServerLogging.logger.LogDebug($"TRY Register Factory: Team {request.TeamId}");
62+
63+
if (game.GameMap?.Timer?.IsGaming ?? false)
64+
return;
65+
66+
if (!ValidPlayerID(request.PlayerId))
67+
return;
68+
69+
if (request.TeamId < 0 || request.TeamId >= TeamCount)
70+
return;
71+
72+
if (communicationToGameID[request.TeamId][request.PlayerId] != GameObj.invalidID)
73+
return;
74+
75+
// 观战玩家分支
76+
if (request.PlayerId >= spectatorMinPlayerID && options.NotAllowSpectator == false)
9477
{
95-
if (firstTime)
96-
firstTime = false;
97-
try
78+
GameServerLogging.logger.LogDebug($"TRY Add Spectator: Player {request.PlayerId}");
79+
lock (spectatorJoinLock)
9880
{
99-
if (currentGameInfo != null && !exitFlag)
81+
if (semaDicts[0].TryAdd(request.PlayerId, (new SemaphoreSlim(0, 1), new SemaphoreSlim(0, 1))))
10082
{
101-
await responseStream.WriteAsync(currentGameInfo);
102-
// GameServerLogging.logger.LogInfo(
103-
// $"Send to Player{request.PlayerId} from Team {request.TeamId}!",
104-
// false);
83+
GameServerLogging.logger.LogInfo("A new spectator comes to watch this game");
84+
IsSpectatorJoin = true;
85+
}
86+
else
87+
{
88+
GameServerLogging.logger.LogInfo($"Duplicated Spectator ID {request.PlayerId}");
89+
return;
10590
}
10691
}
107-
catch
92+
93+
do
10894
{
109-
if (!exitFlag)
95+
semaDicts[0][request.PlayerId].Item1.Wait();
96+
try
11097
{
111-
GameServerLogging.logger.LogInfo($"The client {request.PlayerId} exited");
112-
exitFlag = true;
98+
if (currentGameInfo != null)
99+
{
100+
var info = currentGameInfo.Clone();
101+
for (int i = info.ObjMessage.Count - 1; i >= 0; i--)
102+
{
103+
if (info.ObjMessage[i].NewsMessage != null)
104+
{
105+
info.ObjMessage.RemoveAt(i);
106+
}
107+
}
108+
await responseStream.WriteAsync(info);
109+
}
113110
}
111+
catch (InvalidOperationException)
112+
{
113+
if (semaDicts[0].TryRemove(request.PlayerId, out var semas))
114+
{
115+
try
116+
{
117+
semas.Item1.Release();
118+
semas.Item2.Release();
119+
}
120+
catch { }
121+
GameServerLogging.logger.LogInfo($"The spectator {request.PlayerId} exited");
122+
return;
123+
}
124+
}
125+
catch (Exception ex)
126+
{
127+
GameServerLogging.logger.LogInfo(ex.ToString());
128+
}
129+
finally
130+
{
131+
try
132+
{
133+
semaDicts[0][request.PlayerId].Item2.Release();
134+
}
135+
catch { }
136+
}
137+
} while (game.GameMap.Timer.IsGaming);
138+
139+
GameServerLogging.logger.LogDebug("END Add Spectator");
140+
return;
141+
}
142+
143+
GameServerLogging.logger.LogDebug("AddPlayer: Check Correct");
144+
145+
// 加入玩家队列
146+
var playerSemas = (new SemaphoreSlim(0, 1), new SemaphoreSlim(0, 1));
147+
lock (addPlayerLock)
148+
{
149+
GameServerLogging.logger.LogDebug($"ch id :{request.PlayerId} te id:{request.TeamId} side: {request.SideFlag}");
150+
151+
if (!semaDicts[request.TeamId].TryAdd(request.PlayerId, playerSemas))
152+
{
153+
GameServerLogging.logger.LogWarning($"Player {request.PlayerId} has already been registered in team {request.TeamId}");
154+
return;
155+
}
156+
157+
communicationToGameID[request.TeamId][request.PlayerId] = GameObj.invalidID;
158+
159+
bool start = Interlocked.Increment(ref playerCountNow) == (playerNum * TeamCount);
160+
GameServerLogging.logger.LogInfo($"Register Factory: Team {request.TeamId}, current joined players: {playerCountNow}");
161+
162+
if (start)
163+
{
164+
StartGame();
114165
}
115166
}
116-
semaDicts[request.TeamId][request.PlayerId].Item2.Release();
117-
} while (game.GameMap.Timer.IsGaming);
167+
168+
bool exitFlag = false;
169+
bool firstTime = true;
170+
do
171+
{
172+
playerSemas.Item1.Wait();
173+
var character = game.GameMap.FindCharacterInPlayerID(request.TeamId, request.PlayerId);
174+
175+
if (!firstTime && request.PlayerId > 0 && (character == null || character.IsRemoved == true))
176+
{
177+
// character离开/死亡时可安全忽略继续发流
178+
}
179+
else
180+
{
181+
if (firstTime)
182+
firstTime = false;
183+
184+
try
185+
{
186+
if (currentGameInfo != null && !exitFlag)
187+
{
188+
await responseStream.WriteAsync(currentGameInfo);
189+
}
190+
}
191+
catch
192+
{
193+
if (!exitFlag)
194+
{
195+
GameServerLogging.logger.LogInfo($"The client {request.PlayerId} exited");
196+
exitFlag = true;
197+
}
198+
}
199+
}
200+
201+
playerSemas.Item2.Release();
202+
} while (game.GameMap.Timer.IsGaming);
203+
}
204+
catch (Exception ex)
205+
{
206+
GameServerLogging.logger.LogError($"RegisterFactory exception: {ex}");
207+
}
118208
}
119209

120210
public override Task<MessageOfMap> GetMap(NullRequest request, ServerCallContext context)
@@ -151,18 +241,18 @@ public override Task<MoveRes> Move(MoveMsg request, ServerCallContext context)
151241
public override Task<BoolRes> Recover(RecoverMsg request, ServerCallContext context)
152242
{
153243
GameServerLogging.logger.LogDebug(
154-
$"TRY Recover: Player {request.PlayerId} from Team {request.TeamId}" +
244+
$"TRY Recover: Player {request.PlayerId} from Team {request.TeamId}" +
155245
$"RecoveredHp: {request.RecoveredHp}");
156246
BoolRes boolRes = new();
157-
247+
158248
boolRes.ActSuccess = game.Recover(request.TeamId, request.PlayerId, request.RecoveredHp);
159249
GameServerLogging.logger.LogDebug($"END Recover:{boolRes.ActSuccess}");
160250
return Task.FromResult(boolRes);
161251
}
162252

163253
public override Task<BoolRes> Harvest(ResourceMsg request, ServerCallContext context)
164254
{
165-
GameServerLogging.logger.LogDebug($"TRY Harvesting: Player {request.PlayerId} from Team {request.TeamId}" +
255+
GameServerLogging.logger.LogDebug($"TRY Harvesting: Player {request.PlayerId} from Team {request.TeamId}" +
166256
$"HarvestedResource: {request.ResourceId}, Amount: {request.Amount}");
167257
BoolRes boolRes = new();
168258
// boolRes.ActSuccess = game.Harvest(request.TeamId, request.PlayerId, request.ResourceId, request.Amount);
@@ -196,7 +286,7 @@ public override Task<BoolRes> Send(SendMsg request, ServerCallContext context)
196286
GameServerLogging.logger.LogDebug(
197287
$"TRY Send: From Player {request.PlayerId} To Player {request.ToPlayerId} from Team {request.TeamId}");
198288
BoolRes boolRes = new BoolRes();
199-
289+
200290
GameServerLogging.logger.LogDebug($"Send: As {request.MessageCase}");
201291
switch (request.MessageCase)
202292
{
@@ -260,12 +350,13 @@ public override Task<BoolRes> Send(SendMsg request, ServerCallContext context)
260350
public override Task<BoolRes> Load(LoadMsg request, ServerCallContext context)
261351
{
262352
GameServerLogging.logger.LogDebug($"TRY Load: {request.PlayerId} from Team {request.TeamId} loading Product {request.ProductType} with Amount {request.ProductAmount}");
263-
BoolRes boolRes = new() {
264-
ActSuccess =
353+
BoolRes boolRes = new()
354+
{
355+
ActSuccess =
265356
game.Load(
266-
request.TeamId,
267-
request.PlayerId,
268-
Transformation.GoodsTypeFromProto(request.ProductType),
357+
request.TeamId,
358+
request.PlayerId,
359+
Transformation.GoodsTypeFromProto(request.ProductType),
269360
request.ProductAmount)
270361
};
271362
GameServerLogging.logger.LogDebug($"END Load:{boolRes.ActSuccess}");
@@ -276,13 +367,14 @@ public override Task<BoolRes> Trade(TradeMsg request, ServerCallContext context)
276367
{
277368
GameServerLogging.logger.LogDebug($"TRY Trade: Player {request.PlayerId} {(request.IsBuy ? "buy from" : "sell to")} Team {request.TeamId}" +
278369
$" Product:{request.ProductType}, Amount:{request.ProductAmount}");
279-
BoolRes boolRes = new(){
280-
ActSuccess =
370+
BoolRes boolRes = new()
371+
{
372+
ActSuccess =
281373
game.Trade(
282-
request.TeamId,
283-
request.PlayerId,
284-
Transformation.GoodsTypeFromProto(request.ProductType),
285-
request.ProductAmount,
374+
request.TeamId,
375+
request.PlayerId,
376+
Transformation.GoodsTypeFromProto(request.ProductType),
377+
request.ProductAmount,
286378
request.IsBuy)
287379
};
288380
GameServerLogging.logger.LogDebug($"END Trade:{boolRes.ActSuccess}");

0 commit comments

Comments
 (0)