diff --git a/CAPI/python/requirements.txt b/CAPI/python/requirements.txt
index 3f4ef6c..26f017f 100644
--- a/CAPI/python/requirements.txt
+++ b/CAPI/python/requirements.txt
@@ -1,3 +1,3 @@
-grpcio==1.52.0
-grpcio-tools==1.52.0
+grpcio==1.54.0
+grpcio-tools==1.54.0
numpy
diff --git a/dependency/proto/Protos.csproj b/dependency/proto/Protos.csproj
index 3d025bc..87fe468 100755
--- a/dependency/proto/Protos.csproj
+++ b/dependency/proto/Protos.csproj
@@ -18,7 +18,7 @@
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/dependency/shell/run.sh b/dependency/shell/run.sh
index 6a30e94..9046d3e 100644
--- a/dependency/shell/run.sh
+++ b/dependency/shell/run.sh
@@ -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"
diff --git a/docs/使用文档.md b/docs/使用文档.md
index b9f3d46..50d250c 100644
--- a/docs/使用文档.md
+++ b/docs/使用文档.md
@@ -170,7 +170,7 @@ start cmd /k win64\Client.exe --cl --playbackFile .\video.thuaipb --playbackSpee
## WPF简易调试界面
-
+
### 界面介绍
diff --git a/logic/Client/MainWindow.xaml b/logic/Client/MainWindow.xaml
index 7046f39..6d82564 100644
--- a/logic/Client/MainWindow.xaml
+++ b/logic/Client/MainWindow.xaml
@@ -10,8 +10,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/logic/Gaming/AttackManager.cs b/logic/Gaming/AttackManager.cs
index 0db4748..9b9fc1e 100644
--- a/logic/Gaming/AttackManager.cs
+++ b/logic/Gaming/AttackManager.cs
@@ -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)
diff --git a/logic/Gaming/CharacterManager .cs b/logic/Gaming/CharacterManager .cs
index c7aefaf..2a12664 100644
--- a/logic/Gaming/CharacterManager .cs
+++ b/logic/Gaming/CharacterManager .cs
@@ -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;
diff --git a/logic/Server/GameServer.cs b/logic/Server/GameServer.cs
index 6573e7b..17f9ce8 100644
--- a/logic/Server/GameServer.cs
+++ b/logic/Server/GameServer.cs
@@ -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)
diff --git a/logic/Server/RpcServices.cs b/logic/Server/RpcServices.cs
index 2db93b2..30563d5 100644
--- a/logic/Server/RpcServices.cs
+++ b/logic/Server/RpcServices.cs
@@ -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 PickProp(PropMsg request, ServerCallContext context)
{
diff --git a/logic/Server/Server.csproj b/logic/Server/Server.csproj
index 43c37b5..25d1f5c 100644
--- a/logic/Server/Server.csproj
+++ b/logic/Server/Server.csproj
@@ -13,7 +13,7 @@
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive