| @@ -1,3 +1,3 @@ | |||||
| grpcio==1.52.0 | |||||
| grpcio-tools==1.52.0 | |||||
| grpcio==1.54.0 | |||||
| grpcio-tools==1.54.0 | |||||
| numpy | numpy | ||||
| @@ -18,7 +18,7 @@ | |||||
| <PackageReference Include="Google.Protobuf.Tools" Version="3.22.3" /> | <PackageReference Include="Google.Protobuf.Tools" Version="3.22.3" /> | ||||
| <PackageReference Include="Grpc" Version="2.46.6" /> | <PackageReference Include="Grpc" Version="2.46.6" /> | ||||
| <PackageReference Include="Grpc.Core" Version="2.46.6" /> | <PackageReference Include="Grpc.Core" Version="2.46.6" /> | ||||
| <PackageReference Include="Grpc.Tools" Version="2.53.0"> | |||||
| <PackageReference Include="Grpc.Tools" Version="2.54.0"> | |||||
| <PrivateAssets>all</PrivateAssets> | <PrivateAssets>all</PrivateAssets> | ||||
| <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||
| </PackageReference> | </PackageReference> | ||||
| @@ -51,7 +51,7 @@ if [ -f $playback_dir/start.lock ]; then | |||||
| while [ $? -eq 0 ] | while [ $? -eq 0 ] | ||||
| do | do | ||||
| sleep 1 | sleep 1 | ||||
| ps -p $server_pid | |||||
| ps -p $server_pid > /dev/null 2>&1 | |||||
| done | done | ||||
| touch $playback_dir/finish.lock | touch $playback_dir/finish.lock | ||||
| echo "Finish" | echo "Finish" | ||||
| @@ -170,7 +170,7 @@ start cmd /k win64\Client.exe --cl --playbackFile .\video.thuaipb --playbackSpee | |||||
| ## WPF简易调试界面 | ## WPF简易调试界面 | ||||
|  | |||||
|  | |||||
| ### 界面介绍 | ### 界面介绍 | ||||
| @@ -10,8 +10,17 @@ | |||||
| <Window.Resources> | <Window.Resources> | ||||
| <ImageBrush x:Key="Logo" ImageSource="Logo.png"/> | <ImageBrush x:Key="Logo" ImageSource="Logo.png"/> | ||||
| <RoutedUICommand x:Key="maximize_Pressed" Text="maximize_Pressed"/> | |||||
| </Window.Resources> | </Window.Resources> | ||||
| <Window.CommandBindings> | |||||
| <CommandBinding Command="{StaticResource maximize_Pressed}" Executed="ClickToMaxmize"/> | |||||
| </Window.CommandBindings> | |||||
| <Window.InputBindings> | |||||
| <KeyBinding Key="F11" Command="{StaticResource maximize_Pressed}"/> | |||||
| </Window.InputBindings> | |||||
| <Grid Name="MainGrid" Margin="0,0,0,0"> | <Grid Name="MainGrid" Margin="0,0,0,0"> | ||||
| <!--Title行删去了两个赋值语句,等之后补回来--> | <!--Title行删去了两个赋值语句,等之后补回来--> | ||||
| <Grid.RowDefinitions> | <Grid.RowDefinitions> | ||||
| @@ -48,7 +48,7 @@ namespace Gaming | |||||
| { | { | ||||
| case GameObjType.Character: | case GameObjType.Character: | ||||
| if ((!(((Character)objBeingShot).IsGhost())) && bullet.Parent.IsGhost()) | |||||
| if ((!(((Character)objBeingShot).IsGhost())) && bullet.Parent!.IsGhost()) | |||||
| { | { | ||||
| characterManager.BeAttacked((Student)objBeingShot, bullet); | characterManager.BeAttacked((Student)objBeingShot, bullet); | ||||
| } | } | ||||
| @@ -57,7 +57,7 @@ namespace Gaming | |||||
| break; | break; | ||||
| case GameObjType.Generator: | case GameObjType.Generator: | ||||
| if (bullet.CanBeBombed(GameObjType.Generator)) | if (bullet.CanBeBombed(GameObjType.Generator)) | ||||
| ((Generator)objBeingShot).Repair(-bullet.AP * GameData.factorDamageGenerator, (Character)bullet.Parent); | |||||
| ((Generator)objBeingShot).Repair(-bullet.AP * GameData.factorDamageGenerator, (Character)bullet.Parent!); | |||||
| break; | break; | ||||
| default: | default: | ||||
| break; | break; | ||||
| @@ -101,12 +101,12 @@ namespace Gaming | |||||
| { | { | ||||
| if (objBeingShot == null) | if (objBeingShot == null) | ||||
| { | { | ||||
| characterManager.BackSwing((Character)bullet.Parent, bullet.Backswing); | |||||
| characterManager.BackSwing((Character)bullet.Parent!, bullet.Backswing); | |||||
| return; | return; | ||||
| } | } | ||||
| BombObj(bullet, objBeingShot); | BombObj(bullet, objBeingShot); | ||||
| characterManager.BackSwing((Character)bullet.Parent, bullet.RecoveryFromHit); | |||||
| characterManager.BackSwing((Character)bullet.Parent!, bullet.RecoveryFromHit); | |||||
| return; | return; | ||||
| } | } | ||||
| @@ -122,7 +122,7 @@ namespace Gaming | |||||
| if (bullet.TypeOfBullet == BulletType.BombBomb && objBeingShot != null) | if (bullet.TypeOfBullet == BulletType.BombBomb && objBeingShot != null) | ||||
| { | { | ||||
| bullet.Parent.BulletOfPlayer = BulletType.JumpyDumpty; | |||||
| bullet.Parent!.BulletOfPlayer = BulletType.JumpyDumpty; | |||||
| Debugger.Output(bullet.Parent, bullet.Parent.CharacterType.ToString() + " " + bullet.Parent.BulletNum.ToString()); | Debugger.Output(bullet.Parent, bullet.Parent.CharacterType.ToString() + " " + bullet.Parent.BulletNum.ToString()); | ||||
| Attack((Character)bullet.Parent, bullet.FacingDirection.Angle() + Math.PI / 2.0); | Attack((Character)bullet.Parent, bullet.FacingDirection.Angle() + Math.PI / 2.0); | ||||
| Attack((Character)bullet.Parent, bullet.FacingDirection.Angle() + Math.PI * 3.0 / 2.0); | Attack((Character)bullet.Parent, bullet.FacingDirection.Angle() + Math.PI * 3.0 / 2.0); | ||||
| @@ -159,10 +159,10 @@ namespace Gaming | |||||
| if (objBeingShot == null) | if (objBeingShot == null) | ||||
| { | { | ||||
| characterManager.BackSwing((Character)bullet.Parent, bullet.Backswing); | |||||
| characterManager.BackSwing((Character)bullet.Parent!, bullet.Backswing); | |||||
| } | } | ||||
| else | else | ||||
| characterManager.BackSwing((Character)bullet.Parent, bullet.RecoveryFromHit); | |||||
| characterManager.BackSwing((Character)bullet.Parent!, bullet.RecoveryFromHit); | |||||
| } | } | ||||
| public bool Attack(Character player, double angle) | public bool Attack(Character player, double angle) | ||||
| @@ -25,11 +25,11 @@ namespace Gaming | |||||
| switch (player.PlayerState) | switch (player.PlayerState) | ||||
| { | { | ||||
| case PlayerStateType.OpeningTheChest: | case PlayerStateType.OpeningTheChest: | ||||
| ((Chest)player.WhatInteractingWith).StopOpen(); | |||||
| ((Chest)player.WhatInteractingWith!).StopOpen(); | |||||
| player.ChangePlayerState(value, gameObj); | player.ChangePlayerState(value, gameObj); | ||||
| break; | break; | ||||
| case PlayerStateType.OpeningTheDoorway: | case PlayerStateType.OpeningTheDoorway: | ||||
| Doorway doorway = (Doorway)player.WhatInteractingWith; | |||||
| Doorway doorway = (Doorway)player.WhatInteractingWith!; | |||||
| doorway.OpenDegree += gameMap.Timer.nowTime() - doorway.OpenStartTime; | doorway.OpenDegree += gameMap.Timer.nowTime() - doorway.OpenStartTime; | ||||
| doorway.OpenStartTime = 0; | doorway.OpenStartTime = 0; | ||||
| player.ChangePlayerState(value, gameObj); | player.ChangePlayerState(value, gameObj); | ||||
| @@ -302,7 +302,7 @@ namespace Gaming | |||||
| if (character.CanBeAwed()) | if (character.CanBeAwed()) | ||||
| { | { | ||||
| if (BeStunned(character, GameData.basicStunnedTimeOfStudent)) | if (BeStunned(character, GameData.basicStunnedTimeOfStudent)) | ||||
| bullet.Parent.AddScore(GameData.TrickerScoreStudentBeStunned(GameData.basicStunnedTimeOfStudent)); | |||||
| bullet.Parent!.AddScore(GameData.TrickerScoreStudentBeStunned(GameData.basicStunnedTimeOfStudent)); | |||||
| return true; | return true; | ||||
| } | } | ||||
| return false; | return false; | ||||
| @@ -321,7 +321,7 @@ namespace Gaming | |||||
| Debugger.Output(student, "is being shot!"); | Debugger.Output(student, "is being shot!"); | ||||
| #endif | #endif | ||||
| if (student.NoHp()) return; // 原来已经死了 | if (student.NoHp()) return; // 原来已经死了 | ||||
| if (!bullet.Parent.IsGhost()) return; | |||||
| if (!bullet.Parent!.IsGhost()) return; | |||||
| if (student.CharacterType == CharacterType.StraightAStudent) | if (student.CharacterType == CharacterType.StraightAStudent) | ||||
| { | { | ||||
| @@ -413,9 +413,10 @@ namespace Gaming | |||||
| } | } | ||||
| if (player.CharacterType == CharacterType.Robot) | if (player.CharacterType == CharacterType.Robot) | ||||
| { | { | ||||
| if (((Golem)player).Parent != null && ((Golem)player).Parent.CharacterType == CharacterType.TechOtaku) | |||||
| var parent = ((Golem)player).Parent; | |||||
| if (parent != null && parent.CharacterType == CharacterType.TechOtaku) | |||||
| { | { | ||||
| ((SummonGolem)(((Golem)player).Parent.FindIActiveSkill(ActiveSkillType.SummonGolem))).GolemSummoned = null; | |||||
| ((SummonGolem)(parent.FindIActiveSkill(ActiveSkillType.SummonGolem))).GolemSummoned = null; | |||||
| player.FindIActiveSkill(ActiveSkillType.UseRobot).IsBeingUsed = false; | player.FindIActiveSkill(ActiveSkillType.UseRobot).IsBeingUsed = false; | ||||
| } | } | ||||
| return; | return; | ||||
| @@ -123,7 +123,7 @@ namespace Server | |||||
| mwr?.Flush(); | mwr?.Flush(); | ||||
| if (options.ResultFileName != DefaultArgumentOptions.FileName) | if (options.ResultFileName != DefaultArgumentOptions.FileName) | ||||
| SaveGameResult(options.ResultFileName.EndsWith(".json") ? options.ResultFileName : options.ResultFileName + ".json"); | SaveGameResult(options.ResultFileName.EndsWith(".json") ? options.ResultFileName : options.ResultFileName + ".json"); | ||||
| SendGameResult(); | |||||
| // SendGameResult(); | |||||
| this.endGameSem.Release(); | this.endGameSem.Release(); | ||||
| } | } | ||||
| public void ReportGame(GameState gameState, bool requiredGaming = true) | public void ReportGame(GameState gameState, bool requiredGaming = true) | ||||
| @@ -139,6 +139,7 @@ namespace Server | |||||
| if (start) StartGame(); | if (start) StartGame(); | ||||
| } | } | ||||
| bool exitFlag = false; | |||||
| do | do | ||||
| { | { | ||||
| semaDict[request.PlayerId].Item1.Wait(); | semaDict[request.PlayerId].Item1.Wait(); | ||||
| @@ -152,7 +153,11 @@ namespace Server | |||||
| } | } | ||||
| catch (Exception) | catch (Exception) | ||||
| { | { | ||||
| //Console.WriteLine(ex); | |||||
| if (!exitFlag) | |||||
| { | |||||
| Console.WriteLine($"The client {request.PlayerId} exited"); | |||||
| exitFlag = true; | |||||
| } | |||||
| } | } | ||||
| finally | finally | ||||
| { | { | ||||
| @@ -219,30 +224,67 @@ namespace Server | |||||
| boolRes.ActSuccess = false; | boolRes.ActSuccess = false; | ||||
| return Task.FromResult(boolRes); | return Task.FromResult(boolRes); | ||||
| } | } | ||||
| if (request.Message.Length > 256) | |||||
| switch (request.MessageCase) | |||||
| { | { | ||||
| case SendMsg.MessageOneofCase.TextMessage: | |||||
| { | |||||
| if (request.TextMessage.Length > 256) | |||||
| { | |||||
| #if DEBUG | #if DEBUG | ||||
| Console.WriteLine("Message string is too long!"); | |||||
| Console.WriteLine("Text message string is too long!"); | |||||
| #endif | #endif | ||||
| boolRes.ActSuccess = false; | |||||
| return Task.FromResult(boolRes); | |||||
| } | |||||
| else | |||||
| { | |||||
| MessageOfNews news = new(); | |||||
| news.News = request.Message; | |||||
| news.FromId = request.PlayerId; | |||||
| news.ToId = request.ToPlayerId; | |||||
| lock (newsLock) | |||||
| { | |||||
| currentNews.Add(news); | |||||
| } | |||||
| boolRes.ActSuccess = false; | |||||
| return Task.FromResult(boolRes); | |||||
| } | |||||
| MessageOfNews news = new(); | |||||
| news.TextMessage = request.TextMessage; | |||||
| news.FromId = request.PlayerId; | |||||
| news.ToId = request.ToPlayerId; | |||||
| lock (newsLock) | |||||
| { | |||||
| currentNews.Add(news); | |||||
| } | |||||
| #if DEBUG | #if DEBUG | ||||
| Console.WriteLine(news.News); | |||||
| Console.WriteLine(news.TextMessage); | |||||
| #endif | #endif | ||||
| boolRes.ActSuccess = true; | |||||
| return Task.FromResult(boolRes); | |||||
| } | |||||
| case SendMsg.MessageOneofCase.BinaryMessage: | |||||
| { | |||||
| if (request.BinaryMessage.Length > 256) | |||||
| { | |||||
| #if DEBUG | |||||
| Console.WriteLine("Binary message string is too long!"); | |||||
| #endif | |||||
| boolRes.ActSuccess = false; | |||||
| return Task.FromResult(boolRes); | |||||
| } | |||||
| MessageOfNews news = new(); | |||||
| news.BinaryMessage = request.BinaryMessage; | |||||
| news.FromId = request.PlayerId; | |||||
| news.ToId = request.ToPlayerId; | |||||
| lock (newsLock) | |||||
| { | |||||
| currentNews.Add(news); | |||||
| } | |||||
| #if DEBUG | |||||
| Console.Write("BinaryMessageLength: "); | |||||
| Console.WriteLine(news.BinaryMessage.Length); | |||||
| #endif | |||||
| boolRes.ActSuccess = true; | |||||
| return Task.FromResult(boolRes); | |||||
| } | |||||
| default: | |||||
| { | |||||
| boolRes.ActSuccess = false; | |||||
| return Task.FromResult(boolRes); | |||||
| } | |||||
| } | } | ||||
| boolRes.ActSuccess = true; | |||||
| return Task.FromResult(boolRes); | |||||
| } | } | ||||
| public override Task<BoolRes> PickProp(PropMsg request, ServerCallContext context) | public override Task<BoolRes> PickProp(PropMsg request, ServerCallContext context) | ||||
| { | { | ||||
| @@ -13,7 +13,7 @@ | |||||
| <PackageReference Include="Google.Protobuf" Version="3.22.3" /> | <PackageReference Include="Google.Protobuf" Version="3.22.3" /> | ||||
| <PackageReference Include="Grpc" Version="2.46.6" /> | <PackageReference Include="Grpc" Version="2.46.6" /> | ||||
| <PackageReference Include="Grpc.Core" Version="2.46.6" /> | <PackageReference Include="Grpc.Core" Version="2.46.6" /> | ||||
| <PackageReference Include="Grpc.Tools" Version="2.53.0"> | |||||
| <PackageReference Include="Grpc.Tools" Version="2.54.0"> | |||||
| <PrivateAssets>all</PrivateAssets> | <PrivateAssets>all</PrivateAssets> | ||||
| <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||
| </PackageReference> | </PackageReference> | ||||