From 4bfb4f24cac158544587892f4f6b5d664dec7f8b Mon Sep 17 00:00:00 2001 From: gsy1519 <614054460@qq.com> Date: Sat, 11 Mar 2023 23:39:49 +0800 Subject: [PATCH 1/4] fix: :bug: fix some problem --- logic/Server/CopyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logic/Server/CopyInfo.cs b/logic/Server/CopyInfo.cs index 44da0c0..db50d5f 100644 --- a/logic/Server/CopyInfo.cs +++ b/logic/Server/CopyInfo.cs @@ -42,7 +42,7 @@ namespace Server msg.StudentMessage.TimeUntilSkillAvailable.Add(keyValue.Value); //msg.StudentMessage.StudentType; // 下面写 msg.StudentMessage.Guid = player.ID; - msg.StudentMessage.State = StudentState.NullStatus; + //msg.StudentMessage.State = player.PlayerState; msg.StudentMessage.FailTime = 0; msg.StudentMessage.EmoTime = 0; msg.StudentMessage.PlayerId = 0; From bc0009e06c1b732e64488bebf8867fba426e79f3 Mon Sep 17 00:00:00 2001 From: gsy1519 <614054460@qq.com> Date: Sun, 12 Mar 2023 23:03:52 +0800 Subject: [PATCH 2/4] fix: fix some bugs --- logic/ClientTest/Program.cs | 10 ++++---- logic/Gaming/Game.cs | 13 +++++++--- logic/Server/CopyInfo.cs | 6 ++++- logic/Server/GameServer.cs | 47 ++++++++++++++++++++++++++----------- logic/Server/Program.cs | 2 +- 5 files changed, 54 insertions(+), 24 deletions(-) diff --git a/logic/ClientTest/Program.cs b/logic/ClientTest/Program.cs index c1a98aa..b981672 100644 --- a/logic/ClientTest/Program.cs +++ b/logic/ClientTest/Program.cs @@ -29,15 +29,15 @@ namespace ClientTest while (await call.ResponseStream.MoveNext()) { + Console.WriteLine("hi"); var currentGameInfo = call.ResponseStream.Current; - if (playerInfo.PlayerType == PlayerType.StudentPlayer) + for (int i = 0; i < currentGameInfo.ObjMessage.Count; i++) { - for (int i = 0; i < currentGameInfo.ObjMessage.Count; i++) - { - //Console.WriteLine($"Human is at ({currentGameInfo.StudentMessage[i].X}, {currentGameInfo.StudentMessage[i].Y})"); - } + if (currentGameInfo.ObjMessage[i].MessageOfObjCase == MessageOfObj.MessageOfObjOneofCase.StudentMessage ) + Console.WriteLine($"Human is at ({currentGameInfo.ObjMessage[i].StudentMessage.X}, {currentGameInfo.ObjMessage[i].StudentMessage.Y})"); } } + } } } \ No newline at end of file diff --git a/logic/Gaming/Game.cs b/logic/Gaming/Game.cs index 6bb3949..57c8e7c 100644 --- a/logic/Gaming/Game.cs +++ b/logic/Gaming/Game.cs @@ -118,10 +118,17 @@ namespace Gaming propManager.StartProducing(); // 开始游戏 - if (!gameMap.Timer.StartGame(milliSeconds)) - return false; + new Thread + ( + () => + { + if (!gameMap.Timer.StartGame(milliSeconds)) + return; - EndGame(); // 游戏结束时要做的事 + EndGame(); // 游戏结束时要做的事 + } + ) + { IsBackground = true }.Start(); return true; } diff --git a/logic/Server/CopyInfo.cs b/logic/Server/CopyInfo.cs index db50d5f..e5310c8 100644 --- a/logic/Server/CopyInfo.cs +++ b/logic/Server/CopyInfo.cs @@ -32,6 +32,7 @@ namespace Server { MessageOfObj msg = new MessageOfObj(); if (player.IsGhost()) return null; + msg.StudentMessage = new(); msg.StudentMessage.X = player.Position.x; msg.StudentMessage.Y = player.Position.y; @@ -114,6 +115,7 @@ namespace Server { MessageOfObj msg = new MessageOfObj(); if (!player.IsGhost()) return null; + msg.TrickerMessage = new(); msg.TrickerMessage.X = player.Position.x; msg.TrickerMessage.Y = player.Position.y; @@ -212,6 +214,7 @@ namespace Server private static MessageOfObj Bullet(Bullet bullet) { MessageOfObj msg = new MessageOfObj(); + msg.BulletMessage = new(); msg.BulletMessage.X = bullet.Position.x; msg.BulletMessage.Y = bullet.Position.y; //msg.BulletMessage.FacingDirection = bullet.FacingDirection; // XY转double? @@ -263,6 +266,7 @@ namespace Server private static MessageOfObj Prop(Prop prop) { MessageOfObj msg = new MessageOfObj(); + msg.PropMessage = new(); //msg.PropMessage.Type = PropType.NullPropType; 下面写 msg.PropMessage.X = prop.Position.x; msg.PropMessage.Y = prop.Position.y; @@ -326,7 +330,7 @@ namespace Server private static MessageOfObj BombedBullet(BombedBullet bombedBullet) { MessageOfObj msg = new MessageOfObj(); - + msg.BombedBulletMessage = new(); msg.BombedBulletMessage.X = bombedBullet.bulletHasBombed.Position.x; msg.BombedBulletMessage.Y = bombedBullet.bulletHasBombed.Position.y; //msg.BombedBulletMessage.FacingDirection = bombedBullet.FacingDirection; XY类型转double? diff --git a/logic/Server/GameServer.cs b/logic/Server/GameServer.cs index a73f5eb..7ada4fc 100644 --- a/logic/Server/GameServer.cs +++ b/logic/Server/GameServer.cs @@ -82,8 +82,8 @@ namespace Server } public void StartGame() { - bool gameState = game.StartGame((int)options.GameTimeInSecond * 1000); - var waitHandle = new SemaphoreSlim(gameState == true ? 1 : 0); // 注意修改 + game.StartGame((int)options.GameTimeInSecond * 1000); + Thread.Sleep(1); new Thread(() => { bool flag = true; @@ -109,13 +109,6 @@ namespace Server ).Start(); }) { IsBackground = true }.Start(); - new Thread(() => - { - waitHandle.Wait(); - this.endGameSem.Release(); - }) - { IsBackground = true }.Start(); - } public void WaitForEnd() { @@ -136,9 +129,11 @@ namespace Server public void ReportGame(GameState gameState, bool requiredGaming = true) { var gameObjList = game.GetGameObj(); + currentGameInfo = new(); lock (messageToAllClientsLock) { //currentGameInfo.MapMessage = (Messa(game.GameMap)); + if (gameState == GameState.GameStart) currentGameInfo.MapMessage = MapMsg(game.GameMap.ProtoGameMap); switch (gameState) { case GameState.GameRunning: @@ -149,6 +144,7 @@ namespace Server currentGameInfo.ObjMessage.Add(CopyInfo.Auto(gameObj)); } currentGameInfo.GameState = gameState; + currentGameInfo.AllMessage = new(); // 还没写 mwr?.WriteOne(currentGameInfo); break; default: @@ -185,7 +181,24 @@ namespace Server return true; return false; } - private MessageOfMap MapMsg(Map map) + + private Protobuf.PlaceType IntToPlaceType(uint n) + { + switch (n) + { + case 0: return Protobuf.PlaceType.Land; + case 6: return Protobuf.PlaceType.Wall; + case 7: return Protobuf.PlaceType.Grass; + case 8: return Protobuf.PlaceType.Classroom; + case 9: return Protobuf.PlaceType.Gate; + case 10: return Protobuf.PlaceType.HiddenGate; + case 11: return Protobuf.PlaceType.Window; + case 12: return Protobuf.PlaceType.Door; + case 13: return Protobuf.PlaceType.Chest; + default: return Protobuf.PlaceType.NullPlaceType; + } + } + private MessageOfMap MapMsg(uint[, ] map) { MessageOfMap msgOfMap = new MessageOfMap(); for (int i = 0; i < GameData.rows; i++) @@ -193,7 +206,7 @@ namespace Server msgOfMap.Row.Add(new MessageOfMap.Types.Row()); for (int j = 0; j < GameData.cols; j++) { - //msgOfMap.Row[i].Col.Add((int)map.ProtoGameMap[i, j]); int转placetype + msgOfMap.Row[i].Col.Add(IntToPlaceType(map[i, j])); } } return msgOfMap; @@ -270,14 +283,13 @@ namespace Server if (currentGameInfo != null) { await responseStream.WriteAsync(currentGameInfo); - Console.WriteLine("Send!"); + //Console.WriteLine("Send!"); } semaDict[request.PlayerId].Item2.Release(); } while (game.GameMap.Timer.IsGaming); } public override Task Attack(AttackMsg request, ServerCallContext context) - { game.Attack(request.PlayerId, request.Angle); BoolRes boolRes = new(); @@ -292,7 +304,9 @@ namespace Server public override Task Move(MoveMsg request, ServerCallContext context) { +#if DEBUG Console.WriteLine($"Move ID: {request.PlayerId}, TimeInMilliseconds: {request.TimeInMilliseconds}"); +#endif var gameID = communicationToGameID[PlayerTypeToTeamID(request.PlayerType), request.PlayerId]; game.MovePlayer(gameID, (int)request.TimeInMilliseconds, request.Angle); // 之后game.MovePlayer可能改为bool类型 @@ -336,7 +350,12 @@ namespace Server } public override Task StartLearning(IDMsg request, ServerCallContext context) { - return base.StartLearning(request, context); +#if DEBUG + Console.WriteLine($"StartLearning ID: {request.PlayerId}"); +#endif + BoolRes boolRes = new(); + boolRes.ActSuccess = game.Fix(request.PlayerId); + return Task.FromResult(boolRes); } public GameServer(ArgumentOptions options) diff --git a/logic/Server/Program.cs b/logic/Server/Program.cs index 7063a9b..792147c 100644 --- a/logic/Server/Program.cs +++ b/logic/Server/Program.cs @@ -34,7 +34,7 @@ namespace Server Grpc.Core.Server server = new Grpc.Core.Server(new[] { new ChannelOption(ChannelOptions.SoReuseport, 0) }) { Services = { AvailableService.BindService(gameServer) }, - Ports = { new ServerPort("127.0.0.1", 8888, ServerCredentials.Insecure) } + Ports = { new ServerPort("0.0.0.0", 8888, ServerCredentials.Insecure) } }; server.Start(); From 9615b1fa46f6b6ae3e933f6f94f869629bd9f89e Mon Sep 17 00:00:00 2001 From: gsy1519 <614054460@qq.com> Date: Mon, 13 Mar 2023 12:13:25 +0800 Subject: [PATCH 3/4] feat: :wheelchair: try to send MapMsg and some other messages --- dependency/proto/Message2Server.proto | 26 ++++++++-------------- logic/ClientTest/Program.cs | 2 -- logic/Gaming/Game.cs | 2 +- logic/Server/GameServer.cs | 32 +++++++++++++-------------- 4 files changed, 25 insertions(+), 37 deletions(-) diff --git a/dependency/proto/Message2Server.proto b/dependency/proto/Message2Server.proto index 99440d0..8dbed28 100755 --- a/dependency/proto/Message2Server.proto +++ b/dependency/proto/Message2Server.proto @@ -7,56 +7,48 @@ import "MessageType.proto"; message PlayerMsg { int64 player_id = 1; - PlayerType player_type = 2; oneof job_type { - StudentType student_type = 3; - TrickerType tricker_type = 4; + StudentType student_type = 2; + TrickerType tricker_type = 3; } } message MoveMsg { int64 player_id = 1; - PlayerType player_type = 2; - double angle = 3; - int64 time_in_milliseconds = 4; + double angle = 2; + int64 time_in_milliseconds = 3; } message PropMsg { int64 player_id = 1; - PlayerType player_type = 2; - PropType prop_type = 3; + PropType prop_type = 2; } message SendMsg { int64 player_id = 1; - PlayerType player_type = 2; - int64 to_player_id = 3; - PlayerType to_player_type = 4; - string message = 5; + int64 to_player_id = 2; + string message = 3; } message AttackMsg // 相当于攻击 { int64 player_id = 1; - PlayerType player_type = 2; - double angle = 3; + double angle = 2; } message IDMsg { int64 player_id = 1; - PlayerType player_type = 2; } message SkillMsg { int64 player_id = 1; - PlayerType player_type = 2; - int32 skill_id = 3; + int32 skill_id = 2; } // 基本继承于THUAI5,为了使发送的信息尽可能不被浪费,暂定不发这类大包。 diff --git a/logic/ClientTest/Program.cs b/logic/ClientTest/Program.cs index b981672..32a173f 100644 --- a/logic/ClientTest/Program.cs +++ b/logic/ClientTest/Program.cs @@ -12,12 +12,10 @@ namespace ClientTest var client = new AvailableService.AvailableServiceClient(channel); PlayerMsg playerInfo = new(); playerInfo.PlayerId = 0; - playerInfo.PlayerType = PlayerType.StudentPlayer; playerInfo.StudentType = StudentType.NullStudentType; var call = client.AddPlayer(playerInfo); MoveMsg moveMsg = new(); moveMsg.PlayerId = 0; - moveMsg.PlayerType = PlayerType.StudentPlayer; moveMsg.TimeInMilliseconds = 100; moveMsg.Angle = 0; while (true) diff --git a/logic/Gaming/Game.cs b/logic/Gaming/Game.cs index 557e99c..ffb8fa1 100644 --- a/logic/Gaming/Game.cs +++ b/logic/Gaming/Game.cs @@ -150,7 +150,7 @@ namespace Gaming finally { - gameMap.GameObjLockDict[GameObjType.Character].ExitReadLock(); + gameMap.GameObjLockDict[GameObjType.Generator].ExitReadLock(); } }, timeInterval: GameData.checkInterval, diff --git a/logic/Server/GameServer.cs b/logic/Server/GameServer.cs index 7ada4fc..f858596 100644 --- a/logic/Server/GameServer.cs +++ b/logic/Server/GameServer.cs @@ -32,7 +32,7 @@ namespace Server protected readonly ArgumentOptions options; protected readonly Game game; private uint spectatorMinPlayerID = 2022; - private List> spectatorList = new List>(); + private List spectatorList = new List(); public int TeamCount => options.TeamCount; protected long[,] communicationToGameID; // 通信用的ID映射到游戏内的ID,[i,j]表示team:i,player:j的id。 private readonly object messageToAllClientsLock = new(); @@ -163,21 +163,19 @@ namespace Server } } - private int PlayerTypeToTeamID(PlayerType playerType) + private int PlayerIDToTeamID(long playerID) { - if (playerType == PlayerType.StudentPlayer) return 0; - if (playerType == PlayerType.TrickerPlayer) return 1; + if (0 <= playerID && playerID < options.PlayerCountPerTeam) return 0; + if (playerID == options.PlayerCountPerTeam) return 1; return -1; } - private uint GetBirthPointIdx(PlayerType playerType, long playerID) // 获取出生点位置 + private uint GetBirthPointIdx(long playerID) // 获取出生点位置 { - return (uint)((PlayerTypeToTeamID(playerType) * options.PlayerCountPerTeam) + playerID + 1); + return (uint)(playerID + 1); } - private bool ValidPlayerTypeAndPlayerID(PlayerType playerType, long playerID) + private bool ValidPlayerID(long playerID) { - if (playerType == PlayerType.StudentPlayer && 0 <= playerID && playerID < options.PlayerCountPerTeam) - return true; // 人数待修改 - if (playerType == PlayerType.TrickerPlayer && 0 <= playerID && playerID < options.PlayerCountPerTeam) + if (0 <= playerID && playerID < options.PlayerCountPerTeam + 1) return true; return false; } @@ -232,10 +230,10 @@ namespace Server public override async Task AddPlayer(PlayerMsg request, IServerStreamWriter responseStream, ServerCallContext context) { Console.WriteLine($"AddPlayer: {request.PlayerId}"); - if (request.PlayerId >= spectatorMinPlayerID && request.PlayerType == PlayerType.NullPlayerType) + if (request.PlayerId >= spectatorMinPlayerID) { // 观战模式 - Tuple tp = new Tuple(request.PlayerType, (uint)request.PlayerId); + uint tp = (uint) request.PlayerId; if (!spectatorList.Contains(tp)) { spectatorList.Add(tp); @@ -246,7 +244,7 @@ namespace Server if (game.GameMap.Timer.IsGaming) return; - if (!ValidPlayerTypeAndPlayerID(request.PlayerType, request.PlayerId)) //玩家id是否正确 + if (!ValidPlayerID(request.PlayerId)) //玩家id是否正确 return; //if (communicationToGameID[PlayerTypeToTeamID(request.PlayerType), request.PlayerId] != GameObj.invalidID) //是否已经添加了该玩家 //return; @@ -255,15 +253,15 @@ namespace Server lock (addPlayerLock) { - Game.PlayerInitInfo playerInitInfo = new(GetBirthPointIdx(request.PlayerType, request.PlayerId), PlayerTypeToTeamID(request.PlayerType), request.PlayerId, characterType); + Game.PlayerInitInfo playerInitInfo = new(GetBirthPointIdx(request.PlayerId), PlayerIDToTeamID(request.PlayerId), request.PlayerId, characterType); long newPlayerID = game.AddPlayer(playerInitInfo); if (newPlayerID == GameObj.invalidID) return; - communicationToGameID[PlayerTypeToTeamID(request.PlayerType), request.PlayerId] = newPlayerID; + communicationToGameID[PlayerIDToTeamID(request.PlayerId), request.PlayerId] = newPlayerID; // 内容待修改 var temp = (new SemaphoreSlim(0, 1), new SemaphoreSlim(0, 1)); bool start = false; - Console.WriteLine($"PlayerType: {request.PlayerType} Id: {request.PlayerId} joins."); + Console.WriteLine($"Id: {request.PlayerId} joins."); lock (semaDict) { semaDict.Add(request.PlayerId, temp); @@ -307,7 +305,7 @@ namespace Server #if DEBUG Console.WriteLine($"Move ID: {request.PlayerId}, TimeInMilliseconds: {request.TimeInMilliseconds}"); #endif - var gameID = communicationToGameID[PlayerTypeToTeamID(request.PlayerType), request.PlayerId]; + var gameID = communicationToGameID[PlayerIDToTeamID(request.PlayerId), request.PlayerId]; game.MovePlayer(gameID, (int)request.TimeInMilliseconds, request.Angle); // 之后game.MovePlayer可能改为bool类型 MoveRes moveRes = new(); From e5fbc752d449b7b46ba88b13b2feaf7ed29511da Mon Sep 17 00:00:00 2001 From: gsy1519 <614054460@qq.com> Date: Mon, 13 Mar 2023 12:17:17 +0800 Subject: [PATCH 4/4] feat: :zap: try to send MapMsg and remove PlayerType from Message2Server.proto --- logic/ClientTest/Program.cs | 4 ++-- logic/Server/GameServer.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/logic/ClientTest/Program.cs b/logic/ClientTest/Program.cs index 32a173f..33cb939 100644 --- a/logic/ClientTest/Program.cs +++ b/logic/ClientTest/Program.cs @@ -31,11 +31,11 @@ namespace ClientTest var currentGameInfo = call.ResponseStream.Current; for (int i = 0; i < currentGameInfo.ObjMessage.Count; i++) { - if (currentGameInfo.ObjMessage[i].MessageOfObjCase == MessageOfObj.MessageOfObjOneofCase.StudentMessage ) + if (currentGameInfo.ObjMessage[i].MessageOfObjCase == MessageOfObj.MessageOfObjOneofCase.StudentMessage) Console.WriteLine($"Human is at ({currentGameInfo.ObjMessage[i].StudentMessage.X}, {currentGameInfo.ObjMessage[i].StudentMessage.Y})"); } } - + } } } \ No newline at end of file diff --git a/logic/Server/GameServer.cs b/logic/Server/GameServer.cs index f858596..ab19a2c 100644 --- a/logic/Server/GameServer.cs +++ b/logic/Server/GameServer.cs @@ -196,7 +196,7 @@ namespace Server default: return Protobuf.PlaceType.NullPlaceType; } } - private MessageOfMap MapMsg(uint[, ] map) + private MessageOfMap MapMsg(uint[,] map) { MessageOfMap msgOfMap = new MessageOfMap(); for (int i = 0; i < GameData.rows; i++) @@ -233,7 +233,7 @@ namespace Server if (request.PlayerId >= spectatorMinPlayerID) { // 观战模式 - uint tp = (uint) request.PlayerId; + uint tp = (uint)request.PlayerId; if (!spectatorList.Contains(tp)) { spectatorList.Add(tp);