Browse Source

fix: 🐛 fix problems of AddPlayer

tags/0.1.0
gsy1519 2 years ago
parent
commit
face17fe1d
5 changed files with 103 additions and 54 deletions
  1. +0
    -0
      logic.thuaipb
  2. +17
    -6
      logic/ClientTest/Program.cs
  3. +12
    -8
      logic/Server/CopyInfo.cs
  4. +72
    -38
      logic/Server/GameServer.cs
  5. +2
    -2
      logic/Server/Properties/launchSettings.json

+ 0
- 0
logic.thuaipb View File


+ 17
- 6
logic/ClientTest/Program.cs View File

@@ -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})");
}
}
}*/

}
}

+ 12
- 8
logic/Server/CopyInfo.cs View File

@@ -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;


+ 72
- 38
logic/Server/GameServer.cs View File

@@ -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<MsgRes>[] teamCommunicatonMsg;
private MessageOfObj currentMapMsg = new();
private object newsLock = new();
private List<MessageOfNews> 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<MessageToClient> 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<BoolRes> 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<MsgRes> 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<BoolRes> 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<MsgRes>[options.PlayerCountPerTeam + 1];
teamCommunicationLock = new object[options.PlayerCountPerTeam + 1];
//创建server时先设定待加入人物都是invalid
for (int i = 0; i < communicationToGameID.GetLength(0); i++)
{


+ 2
- 2
logic/Server/Properties/launchSettings.json View File

@@ -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"
}
}
}
}

Loading…
Cancel
Save