You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

RpcServices.cs 17 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. using Grpc.Core;
  2. using Protobuf;
  3. using System.Threading;
  4. using Timothy.FrameRateTask;
  5. using System;
  6. using System.Net.Http.Headers;
  7. using Gaming;
  8. using GameClass.GameObj;
  9. using Preparation.Utility;
  10. using Playback;
  11. using Newtonsoft.Json;
  12. using Newtonsoft.Json.Linq;
  13. using Preparation.Interface;
  14. namespace Server
  15. {
  16. public partial class GameServer : AvailableService.AvailableServiceBase
  17. {
  18. public override Task<BoolRes> TryConnection(IDMsg request, ServerCallContext context)
  19. {
  20. #if DEBUG
  21. Console.WriteLine($"TryConnection ID: {request.PlayerId}");
  22. #endif
  23. var onConnection = new BoolRes();
  24. lock (gameLock)
  25. {
  26. if (0 <= request.PlayerId && request.PlayerId < playerNum) // 注意修改
  27. {
  28. onConnection.ActSuccess = true;
  29. Console.WriteLine(onConnection.ActSuccess);
  30. return Task.FromResult(onConnection);
  31. }
  32. }
  33. onConnection.ActSuccess = false;
  34. return Task.FromResult(onConnection);
  35. }
  36. protected readonly object addPlayerLock = new();
  37. public override async Task AddPlayer(PlayerMsg request, IServerStreamWriter<MessageToClient> responseStream, ServerCallContext context)
  38. {
  39. Console.WriteLine($"AddPlayer: {request.PlayerId}");
  40. if (request.PlayerId >= spectatorMinPlayerID)
  41. {
  42. // 观战模式
  43. uint tp = (uint)request.PlayerId;
  44. if (!spectatorList.Contains(tp))
  45. {
  46. spectatorList.Add(tp);
  47. Console.WriteLine("A new spectator comes to watch this game.");
  48. var temp = (new SemaphoreSlim(0, 1), new SemaphoreSlim(0, 1));
  49. lock (semaDictLock)
  50. {
  51. semaDict.Add(request.PlayerId, temp);
  52. }
  53. }
  54. do
  55. {
  56. semaDict[request.PlayerId].Item1.Wait();
  57. try
  58. {
  59. if (currentGameInfo != null)
  60. {
  61. await responseStream.WriteAsync(currentGameInfo);
  62. //Console.WriteLine("Send!");
  63. }
  64. }
  65. catch (Exception ex)
  66. {
  67. Console.WriteLine(ex);
  68. }
  69. finally
  70. {
  71. semaDict[request.PlayerId].Item2.Release();
  72. }
  73. } while (game.GameMap.Timer.IsGaming);
  74. return;
  75. }
  76. if (game.GameMap.Timer.IsGaming)
  77. return;
  78. if (!ValidPlayerID(request.PlayerId)) //玩家id是否正确
  79. return;
  80. if (communicationToGameID[request.PlayerId] != GameObj.invalidID) //是否已经添加了该玩家
  81. return;
  82. Preparation.Utility.CharacterType characterType = Preparation.Utility.CharacterType.Null;
  83. if (request.PlayerType == PlayerType.StudentPlayer)
  84. characterType = CopyInfo.ToStudentType(request.StudentType);
  85. else if (request.PlayerType == PlayerType.TrickerPlayer)
  86. characterType = CopyInfo.ToTrickerType(request.TrickerType);
  87. lock (addPlayerLock)
  88. {
  89. Game.PlayerInitInfo playerInitInfo = new(GetBirthPointIdx(request.PlayerId), PlayerTypeToTeamID(request.PlayerType), (int)request.PlayerId, characterType);
  90. long newPlayerID = game.AddPlayer(playerInitInfo);
  91. if (newPlayerID == GameObj.invalidID)
  92. return;
  93. communicationToGameID[request.PlayerId] = newPlayerID;
  94. // 内容待修改
  95. var temp = (new SemaphoreSlim(0, 1), new SemaphoreSlim(0, 1));
  96. bool start = false;
  97. Console.WriteLine($"Id: {request.PlayerId} joins.");
  98. lock (semaDictLock)
  99. {
  100. semaDict.Add(request.PlayerId, temp);
  101. start = (semaDict.Count - spectatorList.Count) == playerNum;
  102. }
  103. if (start) StartGame();
  104. }
  105. do
  106. {
  107. semaDict[request.PlayerId].Item1.Wait();
  108. try
  109. {
  110. if (currentGameInfo != null)
  111. {
  112. await responseStream.WriteAsync(currentGameInfo);
  113. //Console.WriteLine("Send!");
  114. }
  115. }
  116. catch (Exception ex)
  117. {
  118. //Console.WriteLine(ex);
  119. }
  120. finally
  121. {
  122. semaDict[request.PlayerId].Item2.Release();
  123. }
  124. } while (game.GameMap.Timer.IsGaming);
  125. }
  126. public override Task<BoolRes> Attack(AttackMsg request, ServerCallContext context)
  127. {
  128. #if DEBUG
  129. Console.WriteLine($"Attack ID: {request.PlayerId}");
  130. #endif
  131. BoolRes boolRes = new();
  132. if (request.PlayerId >= spectatorMinPlayerID)
  133. {
  134. boolRes.ActSuccess = false;
  135. return Task.FromResult(boolRes);
  136. }
  137. if (request.Angle == double.NaN)
  138. {
  139. boolRes.ActSuccess = false;
  140. return Task.FromResult(boolRes);
  141. }
  142. var gameID = communicationToGameID[request.PlayerId];
  143. game.Attack(gameID, request.Angle);
  144. boolRes.ActSuccess = true;
  145. return Task.FromResult(boolRes);
  146. }
  147. public override Task<MoveRes> Move(MoveMsg request, ServerCallContext context)
  148. {
  149. #if DEBUG
  150. Console.WriteLine($"Move ID: {request.PlayerId}, TimeInMilliseconds: {request.TimeInMilliseconds}");
  151. #endif
  152. MoveRes moveRes = new();
  153. if (request.PlayerId >= spectatorMinPlayerID)
  154. {
  155. moveRes.ActSuccess = false;
  156. return Task.FromResult(moveRes);
  157. }
  158. if (request.Angle == double.NaN)
  159. {
  160. moveRes.ActSuccess = false;
  161. return Task.FromResult(moveRes);
  162. }
  163. var gameID = communicationToGameID[request.PlayerId];
  164. game.MovePlayer(gameID, (int)request.TimeInMilliseconds, request.Angle);
  165. // 之后game.MovePlayer可能改为bool类
  166. moveRes.ActSuccess = true;
  167. if (!game.GameMap.Timer.IsGaming) moveRes.ActSuccess = false;
  168. return Task.FromResult(moveRes);
  169. }
  170. public override Task<BoolRes> SendMessage(SendMsg request, ServerCallContext context)
  171. {
  172. var boolRes = new BoolRes();
  173. if (request.PlayerId >= spectatorMinPlayerID)
  174. {
  175. boolRes.ActSuccess = false;
  176. return Task.FromResult(boolRes);
  177. }
  178. if (!ValidPlayerID(request.PlayerId) || !ValidPlayerID(request.ToPlayerId)
  179. || PlayerIDToTeamID(request.PlayerId) != PlayerIDToTeamID(request.ToPlayerId) || request.PlayerId == request.ToPlayerId)
  180. {
  181. boolRes.ActSuccess = false;
  182. return Task.FromResult(boolRes);
  183. }
  184. if (request.Message.Length > 256)
  185. {
  186. #if DEBUG
  187. Console.WriteLine("Message string is too long!");
  188. #endif
  189. boolRes.ActSuccess = false;
  190. return Task.FromResult(boolRes);
  191. }
  192. else
  193. {
  194. MessageOfNews news = new();
  195. news.News = request.Message;
  196. news.FromId = request.PlayerId;
  197. news.ToId = request.ToPlayerId;
  198. lock (newsLock)
  199. {
  200. currentNews.Add(news);
  201. }
  202. #if DEBUG
  203. Console.WriteLine(news.News);
  204. #endif
  205. }
  206. boolRes.ActSuccess = true;
  207. return Task.FromResult(boolRes);
  208. }
  209. public override Task<BoolRes> PickProp(PropMsg request, ServerCallContext context)
  210. {
  211. #if DEBUG
  212. Console.WriteLine($"PickProp ID: {request.PlayerId}");
  213. #endif
  214. BoolRes boolRes = new();
  215. if (request.PlayerId >= spectatorMinPlayerID)
  216. {
  217. boolRes.ActSuccess = false;
  218. return Task.FromResult(boolRes);
  219. }
  220. var gameID = communicationToGameID[request.PlayerId];
  221. boolRes.ActSuccess = game.PickProp(gameID, CopyInfo.ToPropType(request.PropType));
  222. return Task.FromResult(boolRes);
  223. }
  224. public override Task<BoolRes> UseProp(PropMsg request, ServerCallContext context)
  225. {
  226. #if DEBUG
  227. Console.WriteLine($"UseProp ID: {request.PlayerId}");
  228. #endif
  229. BoolRes boolRes = new();
  230. if (request.PlayerId >= spectatorMinPlayerID)
  231. {
  232. boolRes.ActSuccess = false;
  233. return Task.FromResult(boolRes);
  234. }
  235. var gameID = communicationToGameID[request.PlayerId];
  236. game.UseProp(gameID, CopyInfo.ToPropType(request.PropType));
  237. boolRes.ActSuccess = true;
  238. return Task.FromResult(boolRes);
  239. }
  240. public override Task<BoolRes> ThrowProp(PropMsg request, ServerCallContext context)
  241. {
  242. #if DEBUG
  243. Console.WriteLine($"ThrowProp ID: {request.PlayerId}");
  244. #endif
  245. BoolRes boolRes = new();
  246. if (request.PlayerId >= spectatorMinPlayerID)
  247. {
  248. boolRes.ActSuccess = false;
  249. return Task.FromResult(boolRes);
  250. }
  251. var gameID = communicationToGameID[request.PlayerId];
  252. game.ThrowProp(gameID, CopyInfo.ToPropType(request.PropType));
  253. boolRes.ActSuccess = true;
  254. return Task.FromResult(boolRes);
  255. }
  256. public override Task<BoolRes> UseSkill(SkillMsg request, ServerCallContext context)
  257. {
  258. #if DEBUG
  259. Console.WriteLine($"UseSkill ID: {request.PlayerId}");
  260. #endif
  261. BoolRes boolRes = new();
  262. if (request.PlayerId >= spectatorMinPlayerID)
  263. {
  264. boolRes.ActSuccess = false;
  265. return Task.FromResult(boolRes);
  266. }
  267. var gameID = communicationToGameID[request.PlayerId];
  268. boolRes.ActSuccess = game.UseActiveSkill(gameID, request.SkillId);
  269. return Task.FromResult(boolRes);
  270. }
  271. public override Task<BoolRes> Graduate(IDMsg request, ServerCallContext context)
  272. {
  273. #if DEBUG
  274. Console.WriteLine($"Graduate ID: {request.PlayerId}");
  275. #endif
  276. BoolRes boolRes = new();
  277. if (request.PlayerId >= spectatorMinPlayerID)
  278. {
  279. boolRes.ActSuccess = false;
  280. return Task.FromResult(boolRes);
  281. }
  282. var gameID = communicationToGameID[request.PlayerId];
  283. boolRes.ActSuccess = game.Escape(gameID);
  284. return Task.FromResult(boolRes);
  285. }
  286. public override Task<BoolRes> StartRescueMate(TreatAndRescueMsg request, ServerCallContext context)
  287. {
  288. #if DEBUG
  289. Console.WriteLine($"StartRescueMate ID: {request.PlayerId}");
  290. #endif
  291. BoolRes boolRes = new();
  292. if (request.PlayerId >= spectatorMinPlayerID)
  293. {
  294. boolRes.ActSuccess = false;
  295. return Task.FromResult(boolRes);
  296. }
  297. var gameID = communicationToGameID[request.PlayerId];
  298. if (request.ToPlayerId >= 0 && request.ToPlayerId < options.MaxStudentCount)
  299. {
  300. var toGameID = communicationToGameID[request.ToPlayerId];
  301. boolRes.ActSuccess = game.Rescue(gameID, toGameID);
  302. }
  303. else
  304. {
  305. boolRes.ActSuccess = game.Rescue(gameID);
  306. }
  307. return Task.FromResult(boolRes);
  308. }
  309. public override Task<BoolRes> StartTreatMate(TreatAndRescueMsg request, ServerCallContext context)
  310. {
  311. #if DEBUG
  312. Console.WriteLine($"StartTreatMate ID: {request.PlayerId}");
  313. #endif
  314. BoolRes boolRes = new();
  315. if (request.PlayerId >= spectatorMinPlayerID)
  316. {
  317. boolRes.ActSuccess = false;
  318. return Task.FromResult(boolRes);
  319. }
  320. var gameID = communicationToGameID[request.PlayerId];
  321. if (request.ToPlayerId >= 0 && request.ToPlayerId < options.MaxStudentCount)
  322. {
  323. var toGameID = communicationToGameID[request.ToPlayerId];
  324. boolRes.ActSuccess = game.Treat(gameID, toGameID);
  325. }
  326. else
  327. {
  328. boolRes.ActSuccess = game.Treat(gameID);
  329. }
  330. return Task.FromResult(boolRes);
  331. }
  332. public override Task<BoolRes> StartLearning(IDMsg request, ServerCallContext context)
  333. {
  334. #if DEBUG
  335. Console.WriteLine($"StartLearning ID: {request.PlayerId}");
  336. #endif
  337. BoolRes boolRes = new();
  338. if (request.PlayerId >= spectatorMinPlayerID)
  339. {
  340. boolRes.ActSuccess = false;
  341. return Task.FromResult(boolRes);
  342. }
  343. var gameID = communicationToGameID[request.PlayerId];
  344. boolRes.ActSuccess = game.Fix(gameID);
  345. return Task.FromResult(boolRes);
  346. }
  347. public override Task<BoolRes> StartOpenChest(IDMsg request, ServerCallContext context)
  348. {
  349. #if DEBUG
  350. Console.WriteLine($"StartOpenChest ID: {request.PlayerId}");
  351. #endif
  352. BoolRes boolRes = new();
  353. if (request.PlayerId >= spectatorMinPlayerID)
  354. {
  355. boolRes.ActSuccess = false;
  356. return Task.FromResult(boolRes);
  357. }
  358. var gameID = communicationToGameID[request.PlayerId];
  359. boolRes.ActSuccess = game.OpenChest(gameID);
  360. return Task.FromResult(boolRes);
  361. }
  362. public override Task<BoolRes> StartOpenGate(IDMsg request, ServerCallContext context)
  363. {
  364. #if DEBUG
  365. Console.WriteLine($"StartOpenGate ID: {request.PlayerId}");
  366. #endif
  367. BoolRes boolRes = new();
  368. if (request.PlayerId >= spectatorMinPlayerID)
  369. {
  370. boolRes.ActSuccess = false;
  371. return Task.FromResult(boolRes);
  372. }
  373. var gameID = communicationToGameID[request.PlayerId];
  374. boolRes.ActSuccess = game.OpenDoorway(gameID);
  375. return Task.FromResult(boolRes);
  376. }
  377. public override Task<BoolRes> OpenDoor(IDMsg request, ServerCallContext context)
  378. {
  379. #if DEBUG
  380. Console.WriteLine($"OpenDoor ID: {request.PlayerId}");
  381. #endif
  382. BoolRes boolRes = new();
  383. if (request.PlayerId >= spectatorMinPlayerID)
  384. {
  385. boolRes.ActSuccess = false;
  386. return Task.FromResult(boolRes);
  387. }
  388. var gameID = communicationToGameID[request.PlayerId];
  389. boolRes.ActSuccess = game.LockOrOpenDoor(gameID);
  390. return Task.FromResult(boolRes);
  391. }
  392. public override Task<BoolRes> CloseDoor(IDMsg request, ServerCallContext context)
  393. {
  394. #if DEBUG
  395. Console.WriteLine($"CloseDoor ID: {request.PlayerId}");
  396. #endif
  397. BoolRes boolRes = new();
  398. if (request.PlayerId >= spectatorMinPlayerID)
  399. {
  400. boolRes.ActSuccess = false;
  401. return Task.FromResult(boolRes);
  402. }
  403. var gameID = communicationToGameID[request.PlayerId];
  404. boolRes.ActSuccess = game.LockOrOpenDoor(gameID);
  405. return Task.FromResult(boolRes);
  406. }
  407. public override Task<BoolRes> EndAllAction(IDMsg request, ServerCallContext context)
  408. {
  409. #if DEBUG
  410. Console.WriteLine($"EndAllAction ID: {request.PlayerId}");
  411. #endif
  412. BoolRes boolRes = new();
  413. if (request.PlayerId >= spectatorMinPlayerID)
  414. {
  415. boolRes.ActSuccess = false;
  416. return Task.FromResult(boolRes);
  417. }
  418. var gameID = communicationToGameID[request.PlayerId];
  419. boolRes.ActSuccess = game.Stop(gameID);
  420. return Task.FromResult(boolRes);
  421. }
  422. public override Task<BoolRes> SkipWindow(IDMsg request, ServerCallContext context)
  423. {
  424. #if DEBUG
  425. Console.WriteLine($"SkipWindow ID: {request.PlayerId}");
  426. #endif
  427. BoolRes boolRes = new();
  428. if (request.PlayerId >= spectatorMinPlayerID)
  429. {
  430. boolRes.ActSuccess = false;
  431. return Task.FromResult(boolRes);
  432. }
  433. var gameID = communicationToGameID[request.PlayerId];
  434. boolRes.ActSuccess = game.ClimbingThroughWindow(gameID);
  435. return Task.FromResult(boolRes);
  436. }
  437. }
  438. }