HGHHMainCheckerComponentSystem.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace ET.Server
  5. {
  6. [FriendOf(typeof (HGHHMainCheckerComponent))]
  7. public static class HGHHMainCheckerComponentSystem
  8. {
  9. [ObjectSystem]
  10. public class HGHHMainCheckerComponentAwakeSystem: AwakeSystem<HGHHMainCheckerComponent>
  11. {
  12. protected override void Awake(HGHHMainCheckerComponent self)
  13. {
  14. Log.Info($"创建黄冈晃晃主逻辑组件...");
  15. self.Flag = false;
  16. self.Time = 0;
  17. self.State = 0;
  18. self.Players = new Player[4];
  19. self.CurrentRound = 0;
  20. self.CardList = new List<int>();
  21. // 初始化牌库
  22. for (int i = 0; i < 4; i++)
  23. {
  24. foreach (int value in HghhConstValue.Values)
  25. {
  26. self.CardList.Add(value);
  27. }
  28. RandomGenerator.Shuffle(self.CardList);
  29. }
  30. }
  31. }
  32. [ObjectSystem]
  33. public class HGHHMainCheckerComponentDestroySystem: DestroySystem<HGHHMainCheckerComponent>
  34. {
  35. protected override void Destroy(HGHHMainCheckerComponent self)
  36. {
  37. Log.Info($"销毁黄冈晃晃主逻辑组件...");
  38. }
  39. }
  40. [ObjectSystem]
  41. public class HGHHMainCheckerComponentUpdateSystem: UpdateSystem<HGHHMainCheckerComponent>
  42. {
  43. protected override void Update(HGHHMainCheckerComponent self)
  44. {
  45. Room room = self.GetParent<Room>();
  46. if (room == null)
  47. {
  48. Log.Error($"黄冈晃晃主逻辑组件获取不到主实体...");
  49. return;
  50. }
  51. Log.Debug($"检测: 黄冈晃晃-房间号:{room.RoomId}, 状态:{self.State}...");
  52. try
  53. {
  54. self.Check(room);
  55. }
  56. catch (Exception e)
  57. {
  58. Log.Error($"move timer error: {self.Id}\n{e}");
  59. }
  60. }
  61. }
  62. private static void Check(this HGHHMainCheckerComponent self, Room room)
  63. {
  64. Log.Debug($"检测: 黄冈晃晃-房间号:{room.RoomId}...");
  65. switch (self.State)
  66. {
  67. case 0:
  68. // 等待状态
  69. Log.Debug($"检测: 黄冈晃晃-房间号:{room.RoomId}, 状态:检测是否可开局...");
  70. if (self.CheckReadySatrt(room))
  71. {
  72. self.State = 1;
  73. self.Flag = false;
  74. self.Time = 0;
  75. }
  76. break;
  77. case 1:
  78. // 开局
  79. if (!self.Flag)
  80. {
  81. if (self.Time >= 3)
  82. {
  83. self.Start(room);
  84. self.Flag = true;
  85. self.Time = 0;
  86. Log.Debug($"检测: 黄冈晃晃-房间号:{room.RoomId}, 状态:开局...VS动画...");
  87. }
  88. }
  89. else
  90. {
  91. if (self.Time > 0)
  92. {
  93. self.State = 2;
  94. self.Flag = false;
  95. self.Time = 0;
  96. }
  97. }
  98. break;
  99. case 2:
  100. // 进行中
  101. if (!self.Flag)
  102. {
  103. self.Flag = true;
  104. self.Time = 0;
  105. // 摸牌
  106. self.DrawCard(room);
  107. }
  108. else
  109. {
  110. // 强制操作
  111. if (self.Time > 30)
  112. {
  113. }
  114. }
  115. break;
  116. case 3:
  117. // 已结束
  118. break;
  119. }
  120. self.Time++;
  121. }
  122. /// <summary>
  123. /// 检测是否可开始 3秒倒计时开始
  124. /// </summary>
  125. /// <param name="self"></param>
  126. /// <param name="room"></param>
  127. /// <returns></returns>
  128. private static bool CheckReadySatrt(this HGHHMainCheckerComponent self, Room room)
  129. {
  130. if (!room.IsStart() || self.State != 0)
  131. {
  132. return false;
  133. }
  134. // 通知客户端3秒倒计时
  135. foreach (Player player in room.GetAllPlayers().Values.Where(player => player != null))
  136. {
  137. MessageHelper.SendToClient(player, new G2C_ReadySatrtPush(){ReadySatrtTime = 3});
  138. }
  139. return true;
  140. }
  141. /// <summary>
  142. /// 游戏开局
  143. /// </summary>
  144. /// <param name="self"></param>
  145. /// <param name="room"></param>
  146. private static void Start(this HGHHMainCheckerComponent self, Room room)
  147. {
  148. self.CurrentRound += 1;
  149. // 摇骰子
  150. int rand1 = RandomGenerator.RandomNumber(1, 7);
  151. int rand2 = RandomGenerator.RandomNumber(1, 7);
  152. self.Rand = new[] { rand1, rand2 };
  153. // 定庄
  154. self.ZhuangPos = (rand1 + rand2) % 4;
  155. // 当前操作玩家
  156. self.CurrentPlayer = room.GetAllPlayers()[self.ZhuangPos];
  157. // 当前摸牌玩家
  158. self.DrawCardPlayer = room.GetAllPlayers()[self.ZhuangPos];
  159. // 发牌
  160. self.SendCard(room);
  161. // 通知客户端
  162. for (int index = 0; index < room.GetAllPlayers().Count; index++)
  163. {
  164. Player player = room.GetAllPlayers()[index];
  165. if (player != null)
  166. {
  167. player.State = 2;
  168. RoomInfo roomInfo = new RoomInfo();
  169. roomInfo.Type = 1;
  170. roomInfo.State = self.State;
  171. roomInfo.Time = self.Time;
  172. roomInfo.Rand1 = self.Rand[0];
  173. roomInfo.Rand2 = self.Rand[1];
  174. roomInfo.CardNum = self.CardList.Count;
  175. // 本人
  176. roomInfo.MyInfo = self.PlayerInfoToProto(player, true);
  177. // 其他三家
  178. roomInfo.OtherInfo = new List<PlayerInfo>();
  179. int[] nextPos = room.GetSorcPos(index);
  180. foreach (int pos in nextPos)
  181. {
  182. Player other = room.GetAllPlayers()[pos];
  183. if (other != null)
  184. {
  185. roomInfo.OtherInfo.Add(self.PlayerInfoToProto(other, false));
  186. }
  187. }
  188. MessageHelper.SendToClient(player, new G2C_SatrtPush(){info = roomInfo});
  189. Log.Info($"房间id={room.RoomId}, 玩家id={player.Id}, 玩家={player.Name}, 手牌信息={player.RemainCards}");
  190. }
  191. }
  192. }
  193. /// <summary>
  194. /// 发牌
  195. /// </summary>
  196. /// <param name="self"></param>
  197. /// <param name="room"></param>
  198. private static void SendCard(this HGHHMainCheckerComponent self, Room room)
  199. {
  200. foreach (Player player in room.GetAllPlayers().Values)
  201. {
  202. if (player == null)
  203. {
  204. continue;
  205. }
  206. for (int i = 0; i < 13; i++)
  207. {
  208. int card = self.CardList[0];
  209. player.RemainCards.Add(card);
  210. self.CardList.RemoveAt(0);
  211. }
  212. }
  213. }
  214. /// <summary>
  215. /// 摸牌
  216. /// </summary>
  217. /// <param name="self"></param>
  218. /// <param name="room"></param>
  219. private static void DrawCard(this HGHHMainCheckerComponent self, Room room)
  220. {
  221. }
  222. /// <summary>
  223. /// 房间信息转proto
  224. /// </summary>
  225. /// <param name="self"></param>
  226. /// <param name="room"></param>
  227. /// <returns></returns>
  228. public static RoomInfo RoomToProto(this HGHHMainCheckerComponent self, Room room)
  229. {
  230. RoomInfo info = new ();
  231. info.RoomId = room.RoomId;
  232. info.Type = room.Type;
  233. info.OwnerId = room.OwnerId;
  234. info.State = self.State;
  235. // todo 玩家信息
  236. // info.PlayerList = new List<PlayerInfo>();
  237. // foreach (Player p in room.GetAllPlayers().Values.Where(p => p != null))
  238. // {
  239. // info.PlayerList.Add(ProtoHelper.PlayerToProto(p));
  240. // }
  241. return info;
  242. }
  243. /// <summary>
  244. /// 房间内玩家信息转proto
  245. /// </summary>
  246. /// <param name="self">玩家</param>
  247. /// <param name="player">玩家</param>
  248. /// <param name="flag">是否本人</param>
  249. /// <returns></returns>
  250. public static PlayerInfo PlayerInfoToProto(this HGHHMainCheckerComponent self, Player player, bool flag)
  251. {
  252. PlayerInfo info = new ();
  253. info.id = player.Id;
  254. info.name = player.Name;
  255. info.sex = player.Sex;
  256. info.exp = player.Exp;
  257. info.level = player.Level;
  258. info.vip = 0;
  259. info.pos = player.Pos;
  260. info.state = player.State;
  261. info.isAuto = player.IsAuto;
  262. info.cardInfo = new CardInfo();
  263. if (flag)
  264. {
  265. info.cardInfo.RemainCards = player.RemainCards;
  266. }
  267. info.cardInfo.RemainCardsNum = player.RemainCards.Count;
  268. info.cardInfo.DisCards = player.DisCards;
  269. return info;
  270. }
  271. }
  272. }