Browse Source

Merge pull request #177 from gsy1519/dev

achieve all rpc services
tags/0.1.0
TCL GitHub 2 years ago
parent
commit
3c2e6c56dc
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 233 additions and 52 deletions
  1. +2
    -2
      dependency/proto/Services.proto
  2. +1
    -1
      logic/Preparation/Utility/GameData.cs
  3. +3
    -0
      logic/Server/ArgumentOption.cs
  4. +54
    -8
      logic/Server/CopyInfo.cs
  5. +172
    -40
      logic/Server/GameServer.cs
  6. +1
    -1
      logic/Server/Properties/launchSettings.json

+ 2
- 2
dependency/proto/Services.proto View File

@@ -20,8 +20,8 @@ service AvailableService
rpc SendMessage (SendMsg) returns (BoolRes); rpc SendMessage (SendMsg) returns (BoolRes);
// rpc GetMessage (IDMsg) returns (stream MsgRes); // rpc GetMessage (IDMsg) returns (stream MsgRes);
rpc StartLearning (IDMsg) returns (BoolRes); // 开始修理机器 rpc StartLearning (IDMsg) returns (BoolRes); // 开始修理机器
rpc StartRescueMate (TreatAndRescueMsg) returns (BoolRes); // 开始救人
rpc StartTreatMate (TreatAndRescueMsg) returns (BoolRes);
rpc StartRescueMate (IDMsg) returns (BoolRes); // 开始救人
rpc StartTreatMate (IDMsg) returns (BoolRes); // 开始治疗
rpc Attack (AttackMsg) returns (BoolRes); // 攻击 rpc Attack (AttackMsg) returns (BoolRes); // 攻击
rpc Graduate (IDMsg) returns (BoolRes); // 相当于逃跑 rpc Graduate (IDMsg) returns (BoolRes); // 相当于逃跑
rpc OpenDoor (IDMsg) returns (BoolRes); // 开门 rpc OpenDoor (IDMsg) returns (BoolRes); // 开门


+ 1
- 1
logic/Preparation/Utility/GameData.cs View File

@@ -22,7 +22,7 @@ namespace Preparation.Utility
public const int cols = 50; // 列数 public const int cols = 50; // 列数


public const int numOfBirthPoint = 5; public const int numOfBirthPoint = 5;
// public const int numOfGenerator = 9;
public const int numOfGenerator = 9;
public const int numOfChest = 8; public const int numOfChest = 8;


private const int numOfObjNotMap = 5; private const int numOfObjNotMap = 5;


+ 3
- 0
logic/Server/ArgumentOption.cs View File

@@ -15,6 +15,9 @@ namespace Server
[Option('p', "port", Required = true, HelpText = "Server listening port")] [Option('p', "port", Required = true, HelpText = "Server listening port")]
public ushort ServerPort { get; set; } = 10086; public ushort ServerPort { get; set; } = 10086;


[Option('n', "playerNum", Required = false, HelpText = "The number of teams, 1 by defualt")]
public ushort playerNum { get; set; } = 1;

[Option('t', "teamCount", Required = false, HelpText = "The number of teams, 1 by defualt")] [Option('t', "teamCount", Required = false, HelpText = "The number of teams, 1 by defualt")]
public ushort TeamCount { get; set; } = 1; public ushort TeamCount { get; set; } = 1;




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

@@ -9,7 +9,7 @@ namespace Server


public static class CopyInfo public static class CopyInfo
{ {
private static Protobuf.PlaceType ToPlaceType(Preparation.Utility.PlaceType place)
public static Protobuf.PlaceType ToPlaceType(Preparation.Utility.PlaceType place)
{ {
switch (place) switch (place)
{ {
@@ -44,7 +44,7 @@ namespace Server
return Protobuf.PlaceType.NullPlaceType; return Protobuf.PlaceType.NullPlaceType;
} }
} }
private static Protobuf.PropType ToPropType(Preparation.Utility.PropType prop)
public static Protobuf.PropType ToPropType(Preparation.Utility.PropType prop)
{ {
switch (prop) switch (prop)
{ {
@@ -67,7 +67,31 @@ namespace Server
} }
} }


private static Protobuf.PlayerState ToPlayerState(Preparation.Utility.PlayerStateType playerState)
public static Preparation.Utility.PropType ToPropType(Protobuf.PropType prop)
{
switch (prop)
{
case Protobuf.PropType.AddSpeed:
return Preparation.Utility.PropType.AddSpeed;
case Protobuf.PropType.AddLifeOrAp:
return Preparation.Utility.PropType.AddLifeOrAp;
case Protobuf.PropType.AddHpOrAp:
return Preparation.Utility.PropType.AddHpOrAp;
case Protobuf.PropType.ShieldOrSpear:
return Preparation.Utility.PropType.ShieldOrSpear;
case Protobuf.PropType.Key3:
return Preparation.Utility.PropType.Key3;
case Protobuf.PropType.Key5:
return Preparation.Utility.PropType.Key5;
case Protobuf.PropType.Key6:
return Preparation.Utility.PropType.Key6;
default:
return Preparation.Utility.PropType.Null;
}
}


public static Protobuf.PlayerState ToPlayerState(Preparation.Utility.PlayerStateType playerState)
{ {
switch (playerState) switch (playerState)
{ {
@@ -110,7 +134,7 @@ namespace Server
return PlayerState.NullStatus; return PlayerState.NullStatus;
} }
} }
private static Protobuf.StudentBuffType ToStudentBuffType(Preparation.Utility.BuffType buffType)
public static Protobuf.StudentBuffType ToStudentBuffType(Preparation.Utility.BuffType buffType)
{ {
switch (buffType) switch (buffType)
{ {
@@ -119,7 +143,7 @@ namespace Server
return Protobuf.StudentBuffType.NullSbuffType; return Protobuf.StudentBuffType.NullSbuffType;
} }
} }
private static Protobuf.TrickerBuffType ToTrickerBuffType(Preparation.Utility.BuffType buffType)
public static Protobuf.TrickerBuffType ToTrickerBuffType(Preparation.Utility.BuffType buffType)
{ {
switch (buffType) switch (buffType)
{ {
@@ -128,7 +152,7 @@ namespace Server
return Protobuf.TrickerBuffType.NullTbuffType; return Protobuf.TrickerBuffType.NullTbuffType;
} }
} }
private static Protobuf.BulletType ToBulletType(Preparation.Utility.BulletType bulletType)
public static Protobuf.BulletType ToBulletType(Preparation.Utility.BulletType bulletType)
{ {
switch (bulletType) switch (bulletType)
{ {
@@ -141,7 +165,7 @@ namespace Server
} }
} }


private static Protobuf.StudentType ToStudentType(Preparation.Utility.CharacterType characterType)
public static Protobuf.StudentType ToStudentType(Preparation.Utility.CharacterType characterType)
{ {
switch (characterType) switch (characterType)
{ {
@@ -151,7 +175,18 @@ namespace Server
return Protobuf.StudentType.NullStudentType; return Protobuf.StudentType.NullStudentType;
} }
} }
private static Protobuf.TrickerType ToTrickerType(Preparation.Utility.CharacterType characterType)

public static Preparation.Utility.CharacterType ToStudentType(Protobuf.StudentType characterType)
{
switch (characterType)
{
case Protobuf.StudentType.Athlete:
return Preparation.Utility.CharacterType.Athlete;
default:
return Preparation.Utility.CharacterType.Null;
}
}
public static Protobuf.TrickerType ToTrickerType(Preparation.Utility.CharacterType characterType)
{ {
switch (characterType) switch (characterType)
{ {
@@ -162,6 +197,17 @@ namespace Server
} }
} }


public static Preparation.Utility.CharacterType ToTrickerType(Protobuf.TrickerType characterType)
{
switch (characterType)
{
case Protobuf.TrickerType.Assassin:
return Preparation.Utility.CharacterType.Assassin;
default:
return Preparation.Utility.CharacterType.Null;
}
}

public static MessageOfObj? Auto(GameObj gameObj) public static MessageOfObj? Auto(GameObj gameObj)
{ {
switch (gameObj.Type) switch (gameObj.Type)


+ 172
- 40
logic/Server/GameServer.cs View File

@@ -20,14 +20,14 @@ namespace Server
protected readonly ArgumentOptions options; protected readonly ArgumentOptions options;
private HttpSender? httpSender; private HttpSender? httpSender;
private object gameLock = new(); private object gameLock = new();
private const int playerNum = 1; // 注意修改
private int playerNum => options.playerNum; // 注意修改
private MessageToClient currentGameInfo = new(); private MessageToClient currentGameInfo = new();
private MessageOfObj currentMapMsg = new(); private MessageOfObj currentMapMsg = new();
private object newsLock = new(); private object newsLock = new();
private List<MessageOfNews> currentNews = new(); private List<MessageOfNews> currentNews = new();
private SemaphoreSlim endGameSem = new(0); private SemaphoreSlim endGameSem = new(0);
protected readonly Game game; protected readonly Game game;
private uint spectatorMinPlayerID = 2022;
private uint spectatorMinPlayerID = 2023;
private List<uint> spectatorList = new List<uint>(); private List<uint> spectatorList = new List<uint>();
public int TeamCount => options.TeamCount; public int TeamCount => options.TeamCount;
protected long[] communicationToGameID; // 通信用的ID映射到游戏内的ID,通信中0-3为Student,4为Tricker protected long[] communicationToGameID; // 通信用的ID映射到游戏内的ID,通信中0-3为Student,4为Tricker
@@ -115,7 +115,7 @@ namespace Server
mwr?.Flush(); mwr?.Flush();
if (options.ResultFileName != DefaultArgumentOptions.FileName) if (options.ResultFileName != DefaultArgumentOptions.FileName)
SaveGameResult(options.ResultFileName + ".json"); SaveGameResult(options.ResultFileName + ".json");
//SendGameResult();
SendGameResult();
this.endGameSem.Release(); this.endGameSem.Release();
} }


@@ -142,7 +142,7 @@ namespace Server
currentNews.Clear(); currentNews.Clear();
} }
currentGameInfo.GameState = gameState; currentGameInfo.GameState = gameState;
currentGameInfo.AllMessage = new(); // 还没写
currentGameInfo.AllMessage = GetMessageOfAll();
mwr?.WriteOne(currentGameInfo); mwr?.WriteOne(currentGameInfo);
break; break;
case GameState.GameStart: case GameState.GameStart:
@@ -160,7 +160,7 @@ namespace Server
currentNews.Clear(); currentNews.Clear();
} }
currentGameInfo.GameState = gameState; currentGameInfo.GameState = gameState;
currentGameInfo.AllMessage = new(); // 还没写
currentGameInfo.AllMessage = GetMessageOfAll(); // 还没写
mwr?.WriteOne(currentGameInfo); mwr?.WriteOne(currentGameInfo);
break; break;
default: default:
@@ -186,7 +186,14 @@ namespace Server
private int PlayerIDToTeamID(long playerID) private int PlayerIDToTeamID(long playerID)
{ {
if (0 <= playerID && playerID < options.PlayerCountPerTeam) return 0; if (0 <= playerID && playerID < options.PlayerCountPerTeam) return 0;
if (playerID == options.PlayerCountPerTeam) return 1;
if (playerID == 4) return 1;
return -1;
}

private int PlayerTypeToTeamID(Protobuf.PlayerType playerType)
{
if (playerType == PlayerType.StudentPlayer) return 0;
if (playerType == PlayerType.TrickerPlayer) return 1;
return -1; return -1;
} }
private uint GetBirthPointIdx(long playerID) // 获取出生点位置 private uint GetBirthPointIdx(long playerID) // 获取出生点位置
@@ -200,6 +207,35 @@ namespace Server
return false; return false;
} }


private MessageOfAll GetMessageOfAll()
{
MessageOfAll msg = new MessageOfAll();
//msg.GameTime
msg.SubjectLeft = GameData.numOfGeneratorRequiredForRepair - (int)game.GameMap.NumOfRepairedGenerators;
//msg.StudentGraduated
//msg.StudentQuited
msg.StudentScore = 0;
msg.TrickerScore = 0;
game.GameMap.GameObjLockDict[GameObjType.Character].EnterReadLock();
try
{
foreach (Character character in game.GameMap.GameObjDict[GameObjType.Character])
{
if (!character.IsGhost()) msg.StudentScore += character.Score;
else msg.TrickerScore += character.Score;
}

}
finally
{
game.GameMap.GameObjLockDict[GameObjType.Character].ExitReadLock();
}
//msg.GateOpened =
//msg.HiddenGateRefreshed =
//msg.HiddenGateOpened
return msg;
}

private Protobuf.PlaceType IntToPlaceType(uint n) private Protobuf.PlaceType IntToPlaceType(uint n)
{ {
switch (n) switch (n)
@@ -234,7 +270,9 @@ namespace Server
} }
public override Task<BoolRes> TryConnection(IDMsg request, ServerCallContext context) public override Task<BoolRes> TryConnection(IDMsg request, ServerCallContext context)
{ {
#if DEBUG
Console.WriteLine($"TryConnection ID: {request.PlayerId}"); Console.WriteLine($"TryConnection ID: {request.PlayerId}");
#endif
var onConnection = new BoolRes(); var onConnection = new BoolRes();
lock (gameLock) lock (gameLock)
{ {
@@ -273,29 +311,15 @@ namespace Server
if (communicationToGameID[request.PlayerId] != GameObj.invalidID) //是否已经添加了该玩家 if (communicationToGameID[request.PlayerId] != GameObj.invalidID) //是否已经添加了该玩家
return; return;


Preparation.Utility.CharacterType characterType = Preparation.Utility.CharacterType.Null; // 待修改
Preparation.Utility.CharacterType characterType = Preparation.Utility.CharacterType.Null;
if (request.PlayerType == PlayerType.StudentPlayer) if (request.PlayerType == PlayerType.StudentPlayer)
{
switch (request.StudentType)
{
default:
characterType = Preparation.Utility.CharacterType.Athlete;
break;
}
}
characterType = CopyInfo.ToStudentType(request.StudentType);
else if (request.PlayerType == PlayerType.TrickerPlayer) else if (request.PlayerType == PlayerType.TrickerPlayer)
{
switch (request.TrickerType)
{
default:
characterType = Preparation.Utility.CharacterType.Assassin;
break;
}
}
characterType = CopyInfo.ToTrickerType(request.TrickerType);


lock (addPlayerLock) lock (addPlayerLock)
{ {
Game.PlayerInitInfo playerInitInfo = new(GetBirthPointIdx(request.PlayerId), PlayerIDToTeamID(request.PlayerId), request.PlayerId, characterType);
Game.PlayerInitInfo playerInitInfo = new(GetBirthPointIdx(request.PlayerId), PlayerTypeToTeamID(request.PlayerType), request.PlayerId, characterType);
long newPlayerID = game.AddPlayer(playerInitInfo); long newPlayerID = game.AddPlayer(playerInitInfo);
if (newPlayerID == GameObj.invalidID) if (newPlayerID == GameObj.invalidID)
return; return;
@@ -326,6 +350,9 @@ namespace Server


public override Task<BoolRes> Attack(AttackMsg request, ServerCallContext context) public override Task<BoolRes> Attack(AttackMsg request, ServerCallContext context)
{ {
#if DEBUG
Console.WriteLine($"Attack ID: {request.PlayerId}");
#endif
var gameID = communicationToGameID[request.PlayerId]; var gameID = communicationToGameID[request.PlayerId];
game.Attack(gameID, request.Angle); game.Attack(gameID, request.Angle);
BoolRes boolRes = new(); BoolRes boolRes = new();
@@ -348,16 +375,6 @@ namespace Server
return Task.FromResult(moveRes); 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(gameID, Preparation.Utility.PropType.Null);
// 待修改
return Task.FromResult(boolRes);
}

public override Task<BoolRes> SendMessage(SendMsg request, ServerCallContext context) public override Task<BoolRes> SendMessage(SendMsg request, ServerCallContext context)
{ {
var boolRes = new BoolRes(); var boolRes = new BoolRes();
@@ -388,31 +405,81 @@ namespace Server
#if DEBUG #if DEBUG
Console.WriteLine(news.News); Console.WriteLine(news.News);
#endif #endif
//teamCommunicatonMsg[request.ToPlayerId].Enqueue(msg);
} }
boolRes.ActSuccess = true; boolRes.ActSuccess = true;
return Task.FromResult(boolRes); return Task.FromResult(boolRes);
} }
public override Task<BoolRes> PickProp(PropMsg request, ServerCallContext context)
{
#if DEBUG
Console.WriteLine($"PickProp ID: {request.PlayerId}");
#endif
BoolRes boolRes = new();
var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.PickProp(gameID, CopyInfo.ToPropType(request.PropType));
return Task.FromResult(boolRes);
}

public override Task<BoolRes> UseProp(PropMsg request, ServerCallContext context) public override Task<BoolRes> UseProp(PropMsg request, ServerCallContext context)
{ {
return base.UseProp(request, context);
#if DEBUG
Console.WriteLine($"UseProp ID: {request.PlayerId}");
#endif
BoolRes boolRes = new();
var gameID = communicationToGameID[request.PlayerId];
//boolRes.ActSuccess = game.UseProp(gameID, CopyInfo.ToPropType(request.PropType));
return Task.FromResult(boolRes);
}
public override Task<BoolRes> ThrowProp(PropMsg request, ServerCallContext context)
{
#if DEBUG
Console.WriteLine($"ThrowProp ID: {request.PlayerId}");
#endif
BoolRes boolRes = new();
var gameID = communicationToGameID[request.PlayerId];
//boolRes.ActSuccess = game.ThrowProp(gameID, CopyInfo.ToPropType(request.PropType));
return Task.FromResult(boolRes);
} }
public override Task<BoolRes> UseSkill(SkillMsg request, ServerCallContext context) public override Task<BoolRes> UseSkill(SkillMsg request, ServerCallContext context)
{ {
return base.UseSkill(request, context);
#if DEBUG
Console.WriteLine($"UseSkill ID: {request.PlayerId}");
#endif
BoolRes boolRes = new();
var gameID = communicationToGameID[request.PlayerId];
//boolRes.ActSuccess = game.UseActiveSkill(gameID, CopyInfo.ToPropType(request.PropType));
return Task.FromResult(boolRes);
} }


public override Task<BoolRes> Graduate(IDMsg request, ServerCallContext context) public override Task<BoolRes> Graduate(IDMsg request, ServerCallContext context)
{ {
return base.Graduate(request, context);
#if DEBUG
Console.WriteLine($"Graduate ID: {request.PlayerId}");
#endif
BoolRes boolRes = new();
var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.Escape(gameID);
return Task.FromResult(boolRes);
} }
public override Task<BoolRes> StartRescueMate(IDMsg request, ServerCallContext context) public override Task<BoolRes> StartRescueMate(IDMsg request, ServerCallContext context)
{ {
return base.StartRescueMate(request, context);
#if DEBUG
Console.WriteLine($"StartRescueMate ID: {request.PlayerId}");
#endif
BoolRes boolRes = new();
var gameID = communicationToGameID[request.PlayerId];
//boolRes.ActSuccess = game.Rescue(gameID);
return Task.FromResult(boolRes);
} }
public override Task<BoolRes> StartTreatMate(IDMsg request, ServerCallContext context) public override Task<BoolRes> StartTreatMate(IDMsg request, ServerCallContext context)
{ {
return base.StartTreatMate(request, context);
#if DEBUG
Console.WriteLine($"StartTreatMate ID: {request.PlayerId}");
#endif
BoolRes boolRes = new();
var gameID = communicationToGameID[request.PlayerId];
//boolRes.ActSuccess = game.Treat(gameID);
return Task.FromResult(boolRes);
} }
public override Task<BoolRes> StartLearning(IDMsg request, ServerCallContext context) public override Task<BoolRes> StartLearning(IDMsg request, ServerCallContext context)
{ {
@@ -424,6 +491,71 @@ namespace Server
boolRes.ActSuccess = game.Fix(gameID); boolRes.ActSuccess = game.Fix(gameID);
return Task.FromResult(boolRes); return Task.FromResult(boolRes);
} }
public override Task<BoolRes> StartOpenChest(IDMsg request, ServerCallContext context)
{
#if DEBUG
Console.WriteLine($"StartOpenChest ID: {request.PlayerId}");
#endif
BoolRes boolRes = new();
var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.OpenChest(gameID);
return Task.FromResult(boolRes);
}

public override Task<BoolRes> StartOpenGate(IDMsg request, ServerCallContext context)
{
#if DEBUG
Console.WriteLine($"StartOpenGate ID: {request.PlayerId}");
#endif
BoolRes boolRes = new();
var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.OpenDoorway(gameID);
return Task.FromResult(boolRes);
}
public override Task<BoolRes> OpenDoor(IDMsg request, ServerCallContext context)
{
#if DEBUG
Console.WriteLine($"OpenDoor ID: {request.PlayerId}");
#endif
BoolRes boolRes = new();
var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.LockOrOpenDoor(gameID);
return Task.FromResult(boolRes);
}

public override Task<BoolRes> CloseDoor(IDMsg request, ServerCallContext context)
{
#if DEBUG
Console.WriteLine($"CloseDoor ID: {request.PlayerId}");
#endif
BoolRes boolRes = new();
var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.LockOrOpenDoor(gameID);
return Task.FromResult(boolRes);
}

public override Task<BoolRes> EndAllAction(IDMsg request, ServerCallContext context)
{
#if DEBUG
Console.WriteLine($"EndAllAction ID: {request.PlayerId}");
#endif
BoolRes boolRes = new();
var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.Stop(gameID);
return Task.FromResult(boolRes);
}


public override Task<BoolRes> SkipWindow(IDMsg request, ServerCallContext context)
{
#if DEBUG
Console.WriteLine($"SkipWindow ID: {request.PlayerId}");
#endif
BoolRes boolRes = new();
var gameID = communicationToGameID[request.PlayerId];
boolRes.ActSuccess = game.ClimbingThroughWindow(gameID);
return Task.FromResult(boolRes);
}


public GameServer(ArgumentOptions options) public GameServer(ArgumentOptions options)
{ {


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

@@ -2,7 +2,7 @@
"profiles": { "profiles": {
"Server": { "Server": {
"commandName": "Project", "commandName": "Project",
"commandLineArgs": "-p 8888\r\n-f playback\r\n-g 600\r\n-b true\r\n-c 4\r\n-t 2"
"commandLineArgs": "-p 8888\r\n-f playback\r\n-g 600\r\n-b true\r\n-c 4\r\n-t 2\r\n-n 1"
} }
} }
} }

Loading…
Cancel
Save