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