diff --git a/logic.thuaipb b/logic.thuaipb new file mode 100644 index 0000000..e69de29 diff --git a/logic/ClientTest/Program.cs b/logic/ClientTest/Program.cs index 33cb939..043a456 100644 --- a/logic/ClientTest/Program.cs +++ b/logic/ClientTest/Program.cs @@ -12,29 +12,40 @@ namespace ClientTest var client = new AvailableService.AvailableServiceClient(channel); PlayerMsg playerInfo = new(); playerInfo.PlayerId = 0; - playerInfo.StudentType = StudentType.NullStudentType; + playerInfo.PlayerType = PlayerType.StudentPlayer; + playerInfo.StudentType = StudentType._1; var call = client.AddPlayer(playerInfo); MoveMsg moveMsg = new(); moveMsg.PlayerId = 0; moveMsg.TimeInMilliseconds = 100; moveMsg.Angle = 0; + int tot = 0; + /*while (await call.ResponseStream.MoveNext()) + { + var currentGameInfo = call.ResponseStream.Current; + if (currentGameInfo.GameState == GameState.GameStart) break; + }*/ while (true) { - Console.ReadLine(); - client.Move(moveMsg); + Thread.Sleep(50); + MoveRes boolRes = client.Move(moveMsg); + if (boolRes.ActSuccess == false) break; + tot++; + if (tot % 10 == 0) moveMsg.Angle += 1; + Console.WriteLine("Move!"); } - while (await call.ResponseStream.MoveNext()) + /*while (await call.ResponseStream.MoveNext()) { - Console.WriteLine("hi"); + //Console.WriteLine("hi"); var currentGameInfo = call.ResponseStream.Current; for (int i = 0; i < currentGameInfo.ObjMessage.Count; i++) { if (currentGameInfo.ObjMessage[i].MessageOfObjCase == MessageOfObj.MessageOfObjOneofCase.StudentMessage) Console.WriteLine($"Human is at ({currentGameInfo.ObjMessage[i].StudentMessage.X}, {currentGameInfo.ObjMessage[i].StudentMessage.Y})"); } - } + }*/ } } diff --git a/logic/Server/CopyInfo.cs b/logic/Server/CopyInfo.cs index 05e8521..edeb13d 100644 --- a/logic/Server/CopyInfo.cs +++ b/logic/Server/CopyInfo.cs @@ -27,7 +27,12 @@ namespace Server return PickedProp((PickedProp)gameObj); else return null; //先写着防报错 } - + public static MessageOfObj? Auto(MessageOfNews news) + { + MessageOfObj objMsg = new(); + objMsg.NewsMessage = news; + return objMsg; + } private static MessageOfObj? Student(Character player) { MessageOfObj msg = new MessageOfObj(); @@ -47,7 +52,6 @@ namespace Server msg.StudentMessage.PlayerId = 0; msg.StudentMessage.ViewRange = 0; msg.StudentMessage.Radius = 0; - msg.StudentMessage.Damage = 0; msg.StudentMessage.DangerAlert = 0; msg.StudentMessage.Score = 0; msg.StudentMessage.TreatProgress = 0; @@ -83,12 +87,12 @@ namespace Server msg.StudentMessage.Prop.Add(PropType.NullPropType); else { - switch (player.PropInventory.GetPropType()) + /*switch (player.PropInventory.GetPropType()) { case Preparation.Utility.PropType.Gem: msg.StudentMessage.Prop.Add(PropType.NullPropType); break; - /*case Preparation.Utility.PropType.addLIFE: + case Preparation.Utility.PropType.addLIFE: msg.StudentMessage.MessageOfHuman.Prop = Communication.Proto.PropType.AddLife; break; case Preparation.Utility.PropType.addSpeed: @@ -102,8 +106,8 @@ namespace Server break; default: msg.StudentMessage.Prop = PropType.NullPropType; - break;*/ - } + break; + }*/ } return msg; @@ -112,6 +116,7 @@ namespace Server private static MessageOfObj? Tricker(Character player) { MessageOfObj msg = new MessageOfObj(); + msg.TrickerMessage = new(); if (!player.IsGhost()) return null; msg.TrickerMessage = new(); @@ -120,12 +125,11 @@ namespace Server msg.TrickerMessage.Speed = player.MoveSpeed; msg.TrickerMessage.Damage = 0; foreach (var keyValue in player.TimeUntilActiveSkillAvailable) - msg.StudentMessage.TimeUntilSkillAvailable.Add(keyValue.Value); + msg.TrickerMessage.TimeUntilSkillAvailable.Add(keyValue.Value); //msg.TrickerMessage.Place = 0; 下面写了 //msg.TrickerMessage.Prop = PropType.NullPropType; // 下面写 msg.TrickerMessage.TrickerType = TrickerType.NullTrickerType; // 下面写 msg.TrickerMessage.Guid = 0; - msg.TrickerMessage.Movable = false; msg.TrickerMessage.PlayerId = 0; msg.TrickerMessage.ViewRange = 0; msg.TrickerMessage.Radius = 0; diff --git a/logic/Server/GameServer.cs b/logic/Server/GameServer.cs index 5fe5bdc..bfdf687 100644 --- a/logic/Server/GameServer.cs +++ b/logic/Server/GameServer.cs @@ -20,11 +20,11 @@ namespace Server protected readonly ArgumentOptions options; private HttpSender? httpSender; private object gameLock = new(); - private object[] teamCommunicationLock; private const int playerNum = 1; // 注意修改 private MessageToClient currentGameInfo = new(); - private MessageOfMap currentMapMsg = new(); - private Queue[] teamCommunicatonMsg; + private MessageOfObj currentMapMsg = new(); + private object newsLock = new(); + private List currentNews = new(); private SemaphoreSlim endGameSem = new(0); protected readonly Game game; private uint spectatorMinPlayerID = 2022; @@ -33,7 +33,6 @@ namespace Server protected long[] communicationToGameID; // 通信用的ID映射到游戏内的ID,通信中0-3为Student,4为Tricker private readonly object messageToAllClientsLock = new(); public static readonly long SendMessageToClientIntervalInMilliseconds = 50; - private readonly Semaphore endGameInfoSema = new(0, 1); private MessageWriter? mwr = null; public void StartGame() @@ -117,7 +116,7 @@ namespace Server if (options.ResultFileName != DefaultArgumentOptions.FileName) SaveGameResult(options.ResultFileName + ".json"); //SendGameResult(); - endGameInfoSema.Release(); + this.endGameSem.Release(); } public void ReportGame(GameState gameState, bool requiredGaming = true) @@ -126,16 +125,40 @@ namespace Server currentGameInfo = new(); lock (messageToAllClientsLock) { - //currentGameInfo.MapMessage = (Message(game.GameMap)); switch (gameState) { case GameState.GameRunning: - case GameState.GameStart: case GameState.GameEnd: foreach (GameObj gameObj in gameObjList) { currentGameInfo.ObjMessage.Add(CopyInfo.Auto(gameObj)); } + lock (newsLock) + { + foreach (var news in currentNews) + { + currentGameInfo.ObjMessage.Add(CopyInfo.Auto(news)); + } + currentNews.Clear(); + } + currentGameInfo.GameState = gameState; + currentGameInfo.AllMessage = new(); // 还没写 + mwr?.WriteOne(currentGameInfo); + break; + case GameState.GameStart: + currentGameInfo.ObjMessage.Add(currentMapMsg); + foreach (GameObj gameObj in gameObjList) + { + currentGameInfo.ObjMessage.Add(CopyInfo.Auto(gameObj)); + } + lock (newsLock) + { + foreach (var news in currentNews) + { + currentGameInfo.ObjMessage.Add(CopyInfo.Auto(news)); + } + currentNews.Clear(); + } currentGameInfo.GameState = gameState; currentGameInfo.AllMessage = new(); // 还没写 mwr?.WriteOne(currentGameInfo); @@ -168,7 +191,7 @@ namespace Server } private uint GetBirthPointIdx(long playerID) // 获取出生点位置 { - return (uint)(playerID + 1); // ID从0-4,出生点从1-5 + return (uint)playerID + 1; // ID从0-4,出生点从1-5 } private bool ValidPlayerID(long playerID) { @@ -193,15 +216,16 @@ namespace Server default: return Protobuf.PlaceType.NullPlaceType; } } - private MessageOfMap MapMsg(uint[,] map) + private MessageOfObj MapMsg(uint[,] map) { - MessageOfMap msgOfMap = new MessageOfMap(); + MessageOfObj msgOfMap = new(); + msgOfMap.MapMessage = new(); for (int i = 0; i < GameData.rows; i++) { - msgOfMap.Row.Add(new MessageOfMap.Types.Row()); + msgOfMap.MapMessage.Row.Add(new MessageOfMap.Types.Row()); for (int j = 0; j < GameData.cols; j++) { - msgOfMap.Row[i].Col.Add(IntToPlaceType(map[i, j])); + msgOfMap.MapMessage.Row[i].Col.Add(IntToPlaceType(map[i, j])); } } return msgOfMap; @@ -226,6 +250,7 @@ namespace Server protected readonly object addPlayerLock = new(); public override async Task AddPlayer(PlayerMsg request, IServerStreamWriter responseStream, ServerCallContext context) { + Console.WriteLine($"AddPlayer: {request.PlayerId}"); if (request.PlayerId >= spectatorMinPlayerID) { @@ -246,7 +271,25 @@ namespace Server if (communicationToGameID[request.PlayerId] != GameObj.invalidID) //是否已经添加了该玩家 return; - Preparation.Utility.CharacterType characterType = Preparation.Utility.CharacterType.Athlete; // 待修改 + Preparation.Utility.CharacterType characterType = Preparation.Utility.CharacterType.Null; // 待修改 + if (request.PlayerType == PlayerType.StudentPlayer) + { + switch (request.StudentType) + { + default: + characterType = Preparation.Utility.CharacterType.Athlete; + break; + } + } + else if (request.PlayerType == PlayerType.TrickerPlayer) + { + switch (request.TrickerType) + { + default: + characterType = Preparation.Utility.CharacterType.Assassin; + break; + } + } lock (addPlayerLock) { @@ -295,18 +338,20 @@ namespace Server Console.WriteLine($"Move ID: {request.PlayerId}, TimeInMilliseconds: {request.TimeInMilliseconds}"); #endif var gameID = communicationToGameID[request.PlayerId]; - game.MovePlayer(gameID, (int)request.TimeInMilliseconds, request.Angle); - // 之后game.MovePlayer可能改为bool类型 MoveRes moveRes = new(); + game.MovePlayer(gameID, (int)request.TimeInMilliseconds, request.Angle); + // 之后game.MovePlayer可能改为bool类 moveRes.ActSuccess = true; + if (!game.GameMap.Timer.IsGaming) moveRes.ActSuccess = false; return Task.FromResult(moveRes); } public override Task PickProp(PropMsg request, ServerCallContext context) { BoolRes boolRes = new(); + var gameID = communicationToGameID[request.PlayerId]; if (request.PropType == Protobuf.PropType.NullPropType) - boolRes.ActSuccess = game.PickProp(request.PlayerId, Preparation.Utility.PropType.Null); + boolRes.ActSuccess = game.PickProp(gameID, Preparation.Utility.PropType.Null); // 待修改 return Task.FromResult(boolRes); } @@ -320,8 +365,6 @@ namespace Server boolRes.ActSuccess = false; return Task.FromResult(boolRes); } - MsgRes msg = new(); - msg.HaveMessage = false; if (request.Message.Length > 256) { #if DEBUG @@ -332,30 +375,22 @@ namespace Server } else { - msg.HaveMessage = true; - msg.FromPlayerId = request.PlayerId; - msg.MessageReceived = request.Message; + MessageOfNews news = new(); + news.News = request.Message; + news.FromId = request.PlayerId; + news.ToId = request.ToPlayerId; + lock (newsLock) + { + currentNews.Add(news); + } #if DEBUG - Console.WriteLine(msg); + Console.WriteLine(news.News); #endif - teamCommunicatonMsg[request.ToPlayerId].Enqueue(msg); + //teamCommunicatonMsg[request.ToPlayerId].Enqueue(msg); } boolRes.ActSuccess = true; return Task.FromResult(boolRes); } - - public override Task GetMessage(IDMsg request, IServerStreamWriter responseStream, ServerCallContext context) - { - if (!game.GameMap.Timer.IsGaming) return Task.CompletedTask; - lock (teamCommunicationLock[request.PlayerId]) - { - while (teamCommunicatonMsg[request.PlayerId].Count > 0) - { - responseStream.WriteAsync(teamCommunicatonMsg[request.PlayerId].Dequeue()); - } - } - return Task.CompletedTask; - } public override Task UseProp(PropMsg request, ServerCallContext context) { return base.UseProp(request, context); @@ -436,9 +471,8 @@ namespace Server } finally { this.game = new Game(map, options.TeamCount); } } + currentMapMsg = MapMsg(game.GameMap.ProtoGameMap); communicationToGameID = new long[options.PlayerCountPerTeam + 1]; - teamCommunicatonMsg = new Queue[options.PlayerCountPerTeam + 1]; - teamCommunicationLock = new object[options.PlayerCountPerTeam + 1]; //创建server时先设定待加入人物都是invalid for (int i = 0; i < communicationToGameID.GetLength(0); i++) { diff --git a/logic/Server/Properties/launchSettings.json b/logic/Server/Properties/launchSettings.json index 62a6702..e92f6c7 100644 --- a/logic/Server/Properties/launchSettings.json +++ b/logic/Server/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "Server": { "commandName": "Project", - "commandLineArgs": "-p 8888" + "commandLineArgs": "-p 8888\r\n-f playback\r\n-g 600\r\n-b true\r\n-c 4\r\n-t 2" } } -} +} \ No newline at end of file