| @@ -21,7 +21,7 @@ GitLink 镜像地址:[THUAI6: GitLink Mirror](https://www.gitlink.org.cn/EESAS | |||||
| ### 配置说明 | ### 配置说明 | ||||
| 本仓库使用 git 进行版本控制,为所有开发工作共用仓库,请勿上传不必要的文件。主目录文件结构非必要请勿修改,且主目录中已配置的`.gitignore`、`.gitattributes`文件非必要请勿修改;各子目录已预先包含使用`Visual Studio`开发的`.gitignore`模板,可以根据自身需要增加忽略规则;如有必要,可在子目录下自定义`.gitattributes`文件 | |||||
| 本仓库使用 Git 进行版本控制,为所有开发工作共用仓库,请勿上传不必要的文件。主目录文件结构非必要请勿修改,且主目录中已配置的 `.gitignore`、`.gitattributes` 文件非必要请勿修改;各子目录已预先包含使用 `Visual Studio` 开发的 `.gitignore` 模板,可以根据自身需要增加忽略规则;如有必要,可在子目录下自定义 `.gitattributes` 文件 | |||||
| ### 目录分配 | ### 目录分配 | ||||
| @@ -46,7 +46,7 @@ GitLink 镜像地址:[THUAI6: GitLink Mirror](https://www.gitlink.org.cn/EESAS | |||||
| ### 关于社区开发者 | ### 关于社区开发者 | ||||
| - 社区开发者开发工作请遵循 [THUAI6社区开发者贡献指南](./CONTRIBUTING.md) | |||||
| - 社区开发者开发工作请遵循 [THUAI6 社区开发者贡献指南](./CONTRIBUTING.md) | |||||
| - 社区开发者贡献的代码请遵循 [Contributor Covenant Code of Conduct](./CODE_OF_CONDUCT.md) | - 社区开发者贡献的代码请遵循 [Contributor Covenant Code of Conduct](./CODE_OF_CONDUCT.md) | ||||
| ### 开发流程 | ### 开发流程 | ||||
| @@ -63,7 +63,7 @@ THUAI6 开发组成员与其他贡献者应当遵循以下流程: | |||||
| - 非必要请勿上传大文件到 Github | - 非必要请勿上传大文件到 Github | ||||
| - commit 提交信息请遵循 Semantic Commit 规范,即:`type: content `格式 | |||||
| - commit 提交信息请遵循 [Semantic Commits](https://www.conventionalcommits.org/zh-hans) 规范,即:`type: content` 格式 | |||||
| 常用的 commit message type 包括: | 常用的 commit message type 包括: | ||||
| @@ -90,7 +90,7 @@ THUAI6 开发组成员与其他贡献者应当遵循以下流程: | |||||
| ## 代码风格 | ## 代码风格 | ||||
| 本仓库严格规定了`C++`与`CSharp`代码风格,具体配置请参见 [.clang-format](.clang-format) | |||||
| 本仓库严格规定了 `C++` 与 `CSharp` 代码风格,具体配置请参见 [.clang-format](.clang-format) | |||||
| ### 风格说明 | ### 风格说明 | ||||
| @@ -158,17 +158,41 @@ THUAI6 开发组成员与其他贡献者应当遵循以下流程: | |||||
| > | > | ||||
| - 命名允许较长,但不应过于啰嗦冗余,能完整表明意图即可。 | - 命名允许较长,但不应过于啰嗦冗余,能完整表明意图即可。 | ||||
| - 代码应保证良好的可读性;**禁止**中学 OI 竞赛的各种“卡常”奇技淫巧!!!效率并非总是最重要的,良好的可读性与可维护性往往更加重要 | - 代码应保证良好的可读性;**禁止**中学 OI 竞赛的各种“卡常”奇技淫巧!!!效率并非总是最重要的,良好的可读性与可维护性往往更加重要 | ||||
| - 熟练运用面向对象编程的思想,设计架构时尽可能降低模块与模块的耦合性,保证代码的可维护性 | - 熟练运用面向对象编程的思想,设计架构时尽可能降低模块与模块的耦合性,保证代码的可维护性 | ||||
| - 慎用全局变量、全局函数等 | - 慎用全局变量、全局函数等 | ||||
| - 尽可能将各功能模块化,便于日后复用;尽可能降低类与类的耦合,善用继承与多态 | - 尽可能将各功能模块化,便于日后复用;尽可能降低类与类的耦合,善用继承与多态 | ||||
| - 适当设计单元测试,保证代码的正确运行 | - 适当设计单元测试,保证代码的正确运行 | ||||
| - 注意跨平台问题,代码需保证同时支持 Windows 与 Linux,避免直接的系统调用带来的跨平台问题 | - 注意跨平台问题,代码需保证同时支持 Windows 与 Linux,避免直接的系统调用带来的跨平台问题 | ||||
| - 善于使用 [Google](https://www.google.com/) 并使用[**英文**](https://en.wikipedia.org/wiki/American_English)搜索,善于查阅 [Microsoft Learn](https://learn.microsoft.com/)、[cppreference](https://en.cppreference.com/)、[StackOverflow](https://stackoverflow.com/) 以及第三方库官方文档等;不应轻信 [CSDN](https://www.csdn.net/) 等劣质博客社区以及[博客园](https://www.cnblogs.com/)、[简书](https://www.jianshu.com/)等质量参差不齐的博客社区,对其内容需全方位多角度仔细求证方可相信 | - 善于使用 [Google](https://www.google.com/) 并使用[**英文**](https://en.wikipedia.org/wiki/American_English)搜索,善于查阅 [Microsoft Learn](https://learn.microsoft.com/)、[cppreference](https://en.cppreference.com/)、[StackOverflow](https://stackoverflow.com/) 以及第三方库官方文档等;不应轻信 [CSDN](https://www.csdn.net/) 等劣质博客社区以及[博客园](https://www.cnblogs.com/)、[简书](https://www.jianshu.com/)等质量参差不齐的博客社区,对其内容需全方位多角度仔细求证方可相信 | ||||
| - Pull requests 模板中的复选框采用 Markdown 格式: | |||||
| ```markdown | |||||
| - [ ] 不勾选 | |||||
| - [x] 勾选 | |||||
| ``` | |||||
| 效果: | |||||
| - [ ] 不勾选 | |||||
| - [x] 勾选 | |||||
| - 注意维护开发文档,便于后来者快速了解本仓库代码结构 | - 注意维护开发文档,便于后来者快速了解本仓库代码结构 | ||||
| - 小组内合理分工,避免个人任务量过重或过轻 | - 小组内合理分工,避免个人任务量过重或过轻 | ||||
| - 做好部会记录,及时完成工作任务,避免拖延到ddl | |||||
| - 做好部会记录,及时完成工作任务,避免拖延到 ddl | |||||
| - 各组间多交流,相互了解各自的开发进度,加强协作,遇到困难互相帮助 | - 各组间多交流,相互了解各自的开发进度,加强协作,遇到困难互相帮助 | ||||
| - 加油,奥里给 ,冲冲冲 | - 加油,奥里给 ,冲冲冲 | ||||
| ## 开发组成员 | ## 开发组成员 | ||||
| @@ -18,38 +18,45 @@ message PlayerMsg | |||||
| message MoveMsg | message MoveMsg | ||||
| { | { | ||||
| int64 player_id = 1; | int64 player_id = 1; | ||||
| double angle = 2; | |||||
| int64 time_in_milliseconds = 3; | |||||
| PlayerType player_type = 2; | |||||
| double angle = 3; | |||||
| int64 time_in_milliseconds = 4; | |||||
| } | } | ||||
| message PropMsg | message PropMsg | ||||
| { | { | ||||
| int64 player_id = 1; | int64 player_id = 1; | ||||
| PropType prop_type = 2; | |||||
| PlayerType player_type = 2; | |||||
| PropType prop_type = 3; | |||||
| } | } | ||||
| message SendMsg | message SendMsg | ||||
| { | { | ||||
| int64 player_id = 1; | int64 player_id = 1; | ||||
| int64 to_player_id = 2; | |||||
| string message = 3; | |||||
| PlayerType player_type = 2; | |||||
| int64 to_player_id = 3; | |||||
| PlayerType to_player_type = 4; | |||||
| string message = 5; | |||||
| } | } | ||||
| message AttackMsg // 相当于攻击 | message AttackMsg // 相当于攻击 | ||||
| { | { | ||||
| int64 player_id = 1; | int64 player_id = 1; | ||||
| double angle = 2; | |||||
| PlayerType player_type = 2; | |||||
| double angle = 3; | |||||
| } | } | ||||
| message IDMsg | message IDMsg | ||||
| { | { | ||||
| int64 player_id = 1; | int64 player_id = 1; | ||||
| PlayerType player_type = 2; | |||||
| } | } | ||||
| message SkillMsg | message SkillMsg | ||||
| { | { | ||||
| int64 player_id = 1; | int64 player_id = 1; | ||||
| int32 skill_id = 2; | |||||
| PlayerType player_type = 2; | |||||
| int32 skill_id = 3; | |||||
| } | } | ||||
| // 基本继承于THUAI5,为了使发送的信息尽可能不被浪费,暂定不发这类大包。 | // 基本继承于THUAI5,为了使发送的信息尽可能不被浪费,暂定不发这类大包。 | ||||
| @@ -15,21 +15,26 @@ namespace ClientTest | |||||
| playerInfo.PlayerType = PlayerType.StudentPlayer; | playerInfo.PlayerType = PlayerType.StudentPlayer; | ||||
| playerInfo.StudentType = StudentType.NullStudentType; | playerInfo.StudentType = StudentType.NullStudentType; | ||||
| var call = client.AddPlayer(playerInfo); | var call = client.AddPlayer(playerInfo); | ||||
| MoveMsg moveMsg = new(); | |||||
| moveMsg.PlayerId = 0; | |||||
| moveMsg.PlayerType = PlayerType.StudentPlayer; | |||||
| moveMsg.TimeInMilliseconds = 100; | |||||
| moveMsg.Angle = 0; | |||||
| while (true) | |||||
| { | |||||
| Console.ReadLine(); | |||||
| client.Move(moveMsg); | |||||
| Console.WriteLine("Move!"); | |||||
| } | |||||
| while (await call.ResponseStream.MoveNext()) | while (await call.ResponseStream.MoveNext()) | ||||
| { | { | ||||
| var currentGameInfo = call.ResponseStream.Current; | var currentGameInfo = call.ResponseStream.Current; | ||||
| if (playerInfo.PlayerType == PlayerType.StudentPlayer) | if (playerInfo.PlayerType == PlayerType.StudentPlayer) | ||||
| { | { | ||||
| for (int i = 0; i < currentGameInfo.StudentMessage.Count; i++) | |||||
| { | |||||
| Console.WriteLine($"Human is at ({currentGameInfo.StudentMessage[i].X}, {currentGameInfo.StudentMessage[i].Y})"); | |||||
| } | |||||
| } | |||||
| if (playerInfo.PlayerType == PlayerType.TrickerPlayer) | |||||
| { | |||||
| for (int i = 0; i < currentGameInfo.TrickerMessage.Count; i++) | |||||
| for (int i = 0; i < currentGameInfo.ObjMessage.Count; i++) | |||||
| { | { | ||||
| Console.WriteLine($"Butcher is at ({currentGameInfo.TrickerMessage[i].X}, {currentGameInfo.TrickerMessage[i].Y})"); | |||||
| //Console.WriteLine($"Human is at ({currentGameInfo.StudentMessage[i].X}, {currentGameInfo.StudentMessage[i].Y})"); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -12,7 +12,7 @@ namespace GameClass.GameObj | |||||
| private readonly IOccupation occupation; | private readonly IOccupation occupation; | ||||
| public IOccupation Occupation => occupation; | public IOccupation Occupation => occupation; | ||||
| private Dictionary<ActiveSkillType, int> timeUntilActiveSkillAvailable; | |||||
| private Dictionary<ActiveSkillType, int> timeUntilActiveSkillAvailable = new(); | |||||
| public Dictionary<ActiveSkillType, int> TimeUntilActiveSkillAvailable => timeUntilActiveSkillAvailable; | public Dictionary<ActiveSkillType, int> TimeUntilActiveSkillAvailable => timeUntilActiveSkillAvailable; | ||||
| public bool SetTimeUntilActiveSkillAvailable(ActiveSkillType activeSkillType, int timeUntilActiveSkillAvailable) | public bool SetTimeUntilActiveSkillAvailable(ActiveSkillType activeSkillType, int timeUntilActiveSkillAvailable) | ||||
| @@ -65,7 +65,7 @@ namespace GameClass.GameObj | |||||
| } | } | ||||
| set | set | ||||
| { | { | ||||
| if (!(value == PlayerStateType.IsMoving || value == PlayerStateType.Null)) | |||||
| if (!(value == PlayerStateType.IsMoving)) | |||||
| lock (gameObjLock) | lock (gameObjLock) | ||||
| IsMoving = false; | IsMoving = false; | ||||
| @@ -477,6 +477,7 @@ namespace GameClass.GameObj | |||||
| playerState = playerStateType; | playerState = playerStateType; | ||||
| CanMove = false; | CanMove = false; | ||||
| IsResetting = true; | IsResetting = true; | ||||
| Position = GameData.PosWhoDie; | |||||
| } | } | ||||
| } | } | ||||
| @@ -214,6 +214,10 @@ namespace GameClass.Skill | |||||
| { | { | ||||
| case BecomeInvisible: | case BecomeInvisible: | ||||
| return ActiveSkillType.BecomeInvisible; | return ActiveSkillType.BecomeInvisible; | ||||
| case UseKnife: | |||||
| return ActiveSkillType.UseKnife; | |||||
| case BeginToCharge: | |||||
| return ActiveSkillType.BeginToCharge; | |||||
| default: | default: | ||||
| return ActiveSkillType.Null; | return ActiveSkillType.Null; | ||||
| } | } | ||||
| @@ -43,7 +43,7 @@ namespace GameClass.Skill | |||||
| public List<IActiveSkill> ListOfIActiveSkill => new(new IActiveSkill[] { new BecomeInvisible(), new UseKnife() }); | public List<IActiveSkill> ListOfIActiveSkill => new(new IActiveSkill[] { new BecomeInvisible(), new UseKnife() }); | ||||
| public List<IPassiveSkill> ListOfIPassiveSkill => new(new IPassiveSkill[] { }); | public List<IPassiveSkill> ListOfIPassiveSkill => new(new IPassiveSkill[] { }); | ||||
| } | } | ||||
| public class Athlete : IOccupation | |||||
| public class Athlete : IStudent | |||||
| { | { | ||||
| private const int moveSpeed = GameData.basicMoveSpeed; | private const int moveSpeed = GameData.basicMoveSpeed; | ||||
| public int MoveSpeed => moveSpeed; | public int MoveSpeed => moveSpeed; | ||||
| @@ -59,7 +59,9 @@ namespace GameClass.Skill | |||||
| public BulletType InitBullet => BulletType.CommonAttackOfGhost; | public BulletType InitBullet => BulletType.CommonAttackOfGhost; | ||||
| public List<IActiveSkill> ListOfIActiveSkill => new(new IActiveSkill[] { new BecomeInvisible(), new UseKnife() }); | |||||
| public List<IActiveSkill> ListOfIActiveSkill => new(new IActiveSkill[] { new BeginToCharge() }); | |||||
| public List<IPassiveSkill> ListOfIPassiveSkill => new(new IPassiveSkill[] { }); | public List<IPassiveSkill> ListOfIPassiveSkill => new(new IPassiveSkill[] { }); | ||||
| public int FixSpeed => GameData.basicFixSpeed; | |||||
| } | } | ||||
| } | } | ||||
| @@ -22,6 +22,20 @@ namespace Gaming | |||||
| return true; | return true; | ||||
| } | } | ||||
| public bool Stop(Character player) | |||||
| { | |||||
| if (player.PlayerState == PlayerStateType.IsRescuing || player.PlayerState == PlayerStateType.IsRescued | |||||
| || player.PlayerState == PlayerStateType.IsFixing || player.PlayerState == PlayerStateType.IsMoving | |||||
| || player.PlayerState == PlayerStateType.IsTreated || player.PlayerState == PlayerStateType.IsTreating | |||||
| || player.PlayerState == PlayerStateType.IsClosingDoor || player.PlayerState == PlayerStateType.IsOpeningDoor | |||||
| || player.PlayerState == PlayerStateType.IsClimbingThtoughWindows) | |||||
| { | |||||
| player.PlayerState = PlayerStateType.Null; | |||||
| return true; | |||||
| } | |||||
| return false; | |||||
| } | |||||
| public bool Fix(Student player)// 自动检查有无发电机可修 | public bool Fix(Student player)// 自动检查有无发电机可修 | ||||
| { | { | ||||
| if (player.PlayerState != PlayerStateType.Null || player.IsGhost()) | if (player.PlayerState != PlayerStateType.Null || player.IsGhost()) | ||||
| @@ -180,17 +180,18 @@ namespace Gaming | |||||
| Character? player = gameMap.FindPlayer(playerID); | Character? player = gameMap.FindPlayer(playerID); | ||||
| if (player != null) | if (player != null) | ||||
| { | { | ||||
| return actionManager.MovePlayer(player, moveTimeInMilliseconds, angle); | |||||
| var res = actionManager.MovePlayer(player, moveTimeInMilliseconds, angle); | |||||
| #if DEBUG | #if DEBUG | ||||
| Console.WriteLine($"PlayerID:{playerID} move to ({player.Position.x},{player.Position.y})!"); | Console.WriteLine($"PlayerID:{playerID} move to ({player.Position.x},{player.Position.y})!"); | ||||
| #endif | #endif | ||||
| return res; | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| return false; | |||||
| #if DEBUG | #if DEBUG | ||||
| Console.WriteLine($"PlayerID:{playerID} player does not exists!"); | Console.WriteLine($"PlayerID:{playerID} player does not exists!"); | ||||
| #endif | #endif | ||||
| return false; | |||||
| } | } | ||||
| } | } | ||||
| public bool Treat(long playerID, long playerTreatedID) | public bool Treat(long playerID, long playerTreatedID) | ||||
| @@ -243,6 +244,18 @@ namespace Gaming | |||||
| } | } | ||||
| return false; | return false; | ||||
| } | } | ||||
| public bool Stop(long playerID) | |||||
| { | |||||
| if (!gameMap.Timer.IsGaming) | |||||
| return false; | |||||
| Character player = gameMap.FindPlayer(playerID); | |||||
| if (player != null) | |||||
| { | |||||
| return actionManager.Stop(player); | |||||
| } | |||||
| return false; | |||||
| } | |||||
| public void Attack(long playerID, double angle) | public void Attack(long playerID, double angle) | ||||
| { | { | ||||
| if (!gameMap.Timer.IsGaming) | if (!gameMap.Timer.IsGaming) | ||||
| @@ -19,6 +19,9 @@ namespace Preparation.Utility | |||||
| IsRescued = 10, | IsRescued = 10, | ||||
| IsStunned = 11, | IsStunned = 11, | ||||
| IsTryingToAttack = 12,//指前摇 | IsTryingToAttack = 12,//指前摇 | ||||
| IsOpeningDoor = 13, | |||||
| IsClosingDoor = 14, | |||||
| IsClimbingThtoughWindows = 15, | |||||
| } | } | ||||
| public enum GameObjType | public enum GameObjType | ||||
| { | { | ||||
| @@ -79,7 +82,7 @@ namespace Preparation.Utility | |||||
| NuclearWeapon = 3, | NuclearWeapon = 3, | ||||
| SuperFast = 4, | SuperFast = 4, | ||||
| UseKnife = 5, | UseKnife = 5, | ||||
| ASkill5 = 6 | |||||
| BeginToCharge = 6 | |||||
| } | } | ||||
| public enum PassiveSkillType | public enum PassiveSkillType | ||||
| { | { | ||||
| @@ -7,7 +7,7 @@ namespace Preparation.Utility | |||||
| { | { | ||||
| #region 基本常数与常方法 | #region 基本常数与常方法 | ||||
| public const int numOfPosGridPerCell = 1000; // 每格的【坐标单位】数 | public const int numOfPosGridPerCell = 1000; // 每格的【坐标单位】数 | ||||
| public const int numOfStepPerSecond = 100; // 每秒行走的步数 | |||||
| public const int numOfStepPerSecond = 20; // 每秒行走的步数 | |||||
| public const int frameDuration = 50; // 每帧时长 | public const int frameDuration = 50; // 每帧时长 | ||||
| public const int lengthOfMap = 50000; // 地图长度 | public const int lengthOfMap = 50000; // 地图长度 | ||||
| @@ -8,7 +8,26 @@ namespace Server | |||||
| public static class CopyInfo | public static class CopyInfo | ||||
| { | { | ||||
| // 下面赋值为0的大概率是还没写完 2023-03-03 | // 下面赋值为0的大概率是还没写完 2023-03-03 | ||||
| private static MessageOfStudent Human(Character player) | |||||
| /*public static MessageOfObj? Auto(GameObj gameObj) | |||||
| { | |||||
| if (gameObj.Type == Preparation.Utility.GameObjType.Character) | |||||
| { | |||||
| Character character = (Character)gameObj; | |||||
| if (character.IsGhost()) | |||||
| return Tri | |||||
| } | |||||
| else if (gameObj.Type == Preparation.Utility.GameObjType.Bullet) | |||||
| return Bullet((Bullet)gameObj); | |||||
| else if (gameObj.Type == Preparation.Utility.GameObjType.Prop) | |||||
| return Prop((Prop)gameObj); | |||||
| else if (gameObj.Type == Preparation.Utility.GameObjType.BombedBullet) | |||||
| return BombedBullet((BombedBullet)gameObj); | |||||
| else if (gameObj.Type == Preparation.Utility.GameObjType.PickedProp) | |||||
| return PickedProp((PickedProp)gameObj); | |||||
| else return null; //先写着防报错 | |||||
| }*/ | |||||
| private static MessageOfStudent? Student(Character player) | |||||
| { | { | ||||
| MessageOfStudent msg = new MessageOfStudent(); | MessageOfStudent msg = new MessageOfStudent(); | ||||
| if (player.IsGhost()) return null; | if (player.IsGhost()) return null; | ||||
| @@ -19,7 +38,6 @@ namespace Server | |||||
| msg.Determination = player.HP; | msg.Determination = player.HP; | ||||
| msg.FailNum = 0; | msg.FailNum = 0; | ||||
| msg.TimeUntilSkillAvailable = 0; | msg.TimeUntilSkillAvailable = 0; | ||||
| //msg.Place = 0; 下面写了 | |||||
| msg.StudentType = StudentType.NullStudentType; // 下面写 | msg.StudentType = StudentType.NullStudentType; // 下面写 | ||||
| msg.Guid = 0; | msg.Guid = 0; | ||||
| msg.State = StudentState.NullStatus; | msg.State = StudentState.NullStatus; | ||||
| @@ -28,32 +46,7 @@ namespace Server | |||||
| msg.PlayerId = 0; | msg.PlayerId = 0; | ||||
| msg.ViewRange = 0; | msg.ViewRange = 0; | ||||
| msg.Radius = 0; | msg.Radius = 0; | ||||
| //msg.Buff[0] = StudentBuffType.NullSbuffType; 下面写了 | |||||
| /* THUAI5中的内容 | |||||
| msg.BulletNum = player.BulletNum; | |||||
| msg.CanMove = player.CanMove; | |||||
| msg.CD = player.CD; | |||||
| msg.GemNum = player.GemNum; | |||||
| msg.Guid = player.ID; | |||||
| msg.IsResetting = player.IsResetting; | |||||
| msg.LifeNum = player.DeathCount + 1; | |||||
| msg.Radius = player.Radius; | |||||
| msg.TimeUntilCommonSkillAvailable = player.TimeUntilCommonSkillAvailable; | |||||
| msg.TeamID = player.TeamID; | |||||
| msg.PlayerID = player.PlayerID; | |||||
| msg.IsInvisible = player.IsInvisible; | |||||
| msg.FacingDirection = player.FacingDirection; | |||||
| //应该要发队伍分数,这里先发个人分数 | |||||
| msg.MessageOfHuman.Score = player.Score; | |||||
| //这条暂时没啥用 | |||||
| msg.MessageOfHuman.TimeUntilUltimateSkillAvailable = 0; | |||||
| msg.MessageOfHuman.Vampire = player.Vampire;*/ | |||||
| foreach (KeyValuePair<Preparation.Utility.BuffType, bool> kvp in player.Buff) | foreach (KeyValuePair<Preparation.Utility.BuffType, bool> kvp in player.Buff) | ||||
| { | { | ||||
| @@ -78,19 +71,24 @@ namespace Server | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /*switch (player.Place) | |||||
| switch (player.Place) | |||||
| { | { | ||||
| case Preparation.Utility.PlaceType.Land: | |||||
| msg.Place = PlaceType.Land; | |||||
| case Preparation.Utility.PlaceType.EmergencyExit: | |||||
| msg.Place = PlaceType.HiddenGate; | |||||
| break; | break; | ||||
| case Preparation.Utility.PlaceType.Grass1: | |||||
| msg.Place = PlaceType.Grass; | |||||
| case Preparation.Utility.PlaceType.Doorway: | |||||
| msg.Place = PlaceType.Gate; | |||||
| break; | break; | ||||
| case Preparation.Utility.PlaceType.Grass2: | |||||
| case Preparation.Utility.PlaceType.Grass: | |||||
| msg.Place = PlaceType.Grass; | msg.Place = PlaceType.Grass; | ||||
| break; | break; | ||||
| case Preparation.Utility.PlaceType.Grass3: | |||||
| msg.Place = PlaceType.Grass; | |||||
| case Preparation.Utility.PlaceType.BirthPoint1: | |||||
| case Preparation.Utility.PlaceType.BirthPoint2: | |||||
| case Preparation.Utility.PlaceType.BirthPoint3: | |||||
| case Preparation.Utility.PlaceType.BirthPoint4: | |||||
| case Preparation.Utility.PlaceType.BirthPoint5: | |||||
| case Preparation.Utility.PlaceType.Null: | |||||
| msg.Place = PlaceType.Land; | |||||
| break; | break; | ||||
| // case Preparation.Utility.PlaceType.Invisible: | // case Preparation.Utility.PlaceType.Invisible: | ||||
| // msg.MessageOfHuman.Place = Communication.Proto.PlaceType.Invisible; | // msg.MessageOfHuman.Place = Communication.Proto.PlaceType.Invisible; | ||||
| @@ -98,36 +96,36 @@ namespace Server | |||||
| default: | default: | ||||
| msg.Place = PlaceType.NullPlaceType; | msg.Place = PlaceType.NullPlaceType; | ||||
| break; | break; | ||||
| }*/ | |||||
| } | |||||
| //Character的储存方式可能得改,用enum type存道具和子弹,不应该用对象 | //Character的储存方式可能得改,用enum type存道具和子弹,不应该用对象 | ||||
| //现在懒得改了,有时间再重整一波 | //现在懒得改了,有时间再重整一波 | ||||
| /*if (player.PropInventory == null) | |||||
| msg.Prop = PropType.NullPropType; | |||||
| if (player.PropInventory == null) | |||||
| msg.Prop.Add(PropType.NullPropType); | |||||
| else | else | ||||
| { | { | ||||
| switch (player.PropInventory.GetPropType()) | switch (player.PropInventory.GetPropType()) | ||||
| { | { | ||||
| case Preparation.Utility.PropType.Gem: | case Preparation.Utility.PropType.Gem: | ||||
| msg.Prop = PropType.NullPropType; | |||||
| break; | |||||
| case Preparation.Utility.PropType.addLIFE: | |||||
| msg.MessageOfHuman.Prop = Communication.Proto.PropType.AddLife; | |||||
| break; | |||||
| case Preparation.Utility.PropType.addSpeed: | |||||
| msg.MessageOfHuman.Prop = Communication.Proto.PropType.AddSpeed; | |||||
| break; | |||||
| case Preparation.Utility.PropType.Shield: | |||||
| msg.MessageOfHuman.Prop = Communication.Proto.PropType.Shield; | |||||
| break; | |||||
| case Preparation.Utility.PropType.Spear: | |||||
| msg.MessageOfHuman.Prop = Communication.Proto.PropType.Spear; | |||||
| break; | |||||
| default: | |||||
| msg.Prop = PropType.NullPropType; | |||||
| msg.Prop.Add(PropType.NullPropType); | |||||
| break; | break; | ||||
| /*case Preparation.Utility.PropType.addLIFE: | |||||
| msg.MessageOfHuman.Prop = Communication.Proto.PropType.AddLife; | |||||
| break; | |||||
| case Preparation.Utility.PropType.addSpeed: | |||||
| msg.MessageOfHuman.Prop = Communication.Proto.PropType.AddSpeed; | |||||
| break; | |||||
| case Preparation.Utility.PropType.Shield: | |||||
| msg.MessageOfHuman.Prop = Communication.Proto.PropType.Shield; | |||||
| break; | |||||
| case Preparation.Utility.PropType.Spear: | |||||
| msg.MessageOfHuman.Prop = Communication.Proto.PropType.Spear; | |||||
| break; | |||||
| default: | |||||
| msg.Prop = PropType.NullPropType; | |||||
| break;*/ | |||||
| } | } | ||||
| }*/ | |||||
| } | |||||
| /*switch (player.PassiveSkillType) 需要对接一下,proto里似乎没有这个 | /*switch (player.PassiveSkillType) 需要对接一下,proto里似乎没有这个 | ||||
| { | { | ||||
| case Preparation.Utility.PassiveSkillType.RecoverAfterBattle: | case Preparation.Utility.PassiveSkillType.RecoverAfterBattle: | ||||
| @@ -114,6 +114,7 @@ namespace Server | |||||
| public void ReportGame() | public void ReportGame() | ||||
| { | { | ||||
| //currentGameInfo = null; | //currentGameInfo = null; | ||||
| var gameObjList = game.GetGameObj(); | |||||
| foreach (var kvp in semaDict) | foreach (var kvp in semaDict) | ||||
| { | { | ||||
| @@ -191,8 +192,9 @@ namespace Server | |||||
| { | { | ||||
| Game.PlayerInitInfo playerInitInfo = new(GetBirthPointIdx(request.PlayerType, request.PlayerId), PlayerTypeToTeamID(request.PlayerType), request.PlayerId, characterType); | Game.PlayerInitInfo playerInitInfo = new(GetBirthPointIdx(request.PlayerType, request.PlayerId), PlayerTypeToTeamID(request.PlayerType), request.PlayerId, characterType); | ||||
| long newPlayerID = game.AddPlayer(playerInitInfo); | long newPlayerID = game.AddPlayer(playerInitInfo); | ||||
| //if (newPlayerID == GameObj.invalidID) | |||||
| //return; | |||||
| if (newPlayerID == GameObj.invalidID) | |||||
| return; | |||||
| communicationToGameID[PlayerTypeToTeamID(request.PlayerType), request.PlayerId] = newPlayerID; | |||||
| // 内容待修改 | // 内容待修改 | ||||
| var temp = (new SemaphoreSlim(0, 1), new SemaphoreSlim(0, 1)); | var temp = (new SemaphoreSlim(0, 1), new SemaphoreSlim(0, 1)); | ||||
| bool start = false; | bool start = false; | ||||
| @@ -238,7 +240,8 @@ namespace Server | |||||
| public override Task<MoveRes> Move(MoveMsg request, ServerCallContext context) | public override Task<MoveRes> Move(MoveMsg request, ServerCallContext context) | ||||
| { | { | ||||
| Console.WriteLine($"Move ID: {request.PlayerId}, TimeInMilliseconds: {request.TimeInMilliseconds}"); | Console.WriteLine($"Move ID: {request.PlayerId}, TimeInMilliseconds: {request.TimeInMilliseconds}"); | ||||
| game.MovePlayer(request.PlayerId, (int)request.TimeInMilliseconds, request.Angle); | |||||
| var gameID = communicationToGameID[PlayerTypeToTeamID(request.PlayerType), request.PlayerId]; | |||||
| game.MovePlayer(gameID, (int)request.TimeInMilliseconds, request.Angle); | |||||
| // 之后game.MovePlayer可能改为bool类型 | // 之后game.MovePlayer可能改为bool类型 | ||||
| MoveRes moveRes = new(); | MoveRes moveRes = new(); | ||||
| moveRes.ActSuccess = true; | moveRes.ActSuccess = true; | ||||
| @@ -257,13 +260,11 @@ namespace Server | |||||
| { | { | ||||
| return base.SendMessage(request, context); | return base.SendMessage(request, context); | ||||
| } | } | ||||
| public override Task<BoolRes> UseProp(IDMsg request, ServerCallContext context) | |||||
| public override Task<BoolRes> UseProp(PropMsg request, ServerCallContext context) | |||||
| { | { | ||||
| return base.UseProp(request, context); | return base.UseProp(request, context); | ||||
| } | } | ||||
| public override Task<BoolRes> UseSkill(IDMsg request, ServerCallContext context) | |||||
| public override Task<BoolRes> UseSkill(SkillMsg request, ServerCallContext context) | |||||
| { | { | ||||
| return base.UseSkill(request, context); | return base.UseSkill(request, context); | ||||
| } | } | ||||
| @@ -272,13 +273,13 @@ namespace Server | |||||
| { | { | ||||
| return base.Graduate(request, context); | return base.Graduate(request, context); | ||||
| } | } | ||||
| public override Task<BoolRes> StartHealMate(IDMsg request, ServerCallContext context) | |||||
| public override Task<BoolRes> StartRescueMate(IDMsg request, ServerCallContext context) | |||||
| { | { | ||||
| return base.StartHealMate(request, context); | |||||
| return base.StartRescueMate(request, context); | |||||
| } | } | ||||
| public override Task<BoolRes> StartHelpMate(IDMsg request, ServerCallContext context) | |||||
| public override Task<BoolRes> StartTreatMate(IDMsg request, ServerCallContext context) | |||||
| { | { | ||||
| return base.StartHelpMate(request, context); | |||||
| return base.StartTreatMate(request, context); | |||||
| } | } | ||||
| public override Task<BoolRes> StartLearning(IDMsg request, ServerCallContext context) | public override Task<BoolRes> StartLearning(IDMsg request, ServerCallContext context) | ||||
| { | { | ||||