Advertisement
Guest User

Untitled

a guest
Apr 24th, 2015
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.90 KB | None | 0 0
  1. using Game.Logic;
  2. using Game.Server.Battle;
  3. using Game.Server.GameObjects;
  4. using log4net;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Reflection;
  8. using System.Threading;
  9. namespace Game.Server.Rooms
  10. {
  11. public class RoomMgr
  12. {
  13. private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
  14. private static bool m_running;
  15. private static Queue<IAction> m_actionQueue;
  16. private static Thread m_thread;
  17. private static BaseRoom[] m_rooms;
  18. private static BaseWaitingRoom m_waitingRoom;
  19. private static BaseWorldBossRoom m_worldbossRoom;
  20. private static HallRoom m_hallroom;
  21. private static BaseCollectionTaskRoom m_collectTaskRoom;
  22. private static BaseSevenDoubleRoom[] m_sevenDoubleRoom;
  23. private static BaseCampBattleRoom m_campBattleRoom;
  24. private static BaseConsBatRoom m_ConsBatRoom;
  25. private static BaseChristmasRoom m_christmasRoom;
  26. public static readonly int THREAD_INTERVAL = 40;
  27. public static readonly int PICK_UP_INTERVAL = 100000;
  28. public static readonly int CLEAR_ROOM_INTERVAL = 400;
  29. private static long m_clearTick = 0L;
  30. public static BaseSevenDoubleRoom[] SevenDoubleRoom
  31. {
  32. get
  33. {
  34. return RoomMgr.m_sevenDoubleRoom;
  35. }
  36. }
  37. public static BaseCampBattleRoom CampBattleRoom
  38. {
  39. get
  40. {
  41. return RoomMgr.m_campBattleRoom;
  42. }
  43. }
  44. public static BaseConsBatRoom ConsBatRoom
  45. {
  46. get
  47. {
  48. return RoomMgr.m_ConsBatRoom;
  49. }
  50. }
  51. public static BaseChristmasRoom ChristmasRoom
  52. {
  53. get
  54. {
  55. return RoomMgr.m_christmasRoom;
  56. }
  57. }
  58. public static BaseRoom[] Rooms
  59. {
  60. get
  61. {
  62. return RoomMgr.m_rooms;
  63. }
  64. }
  65. public static BaseWaitingRoom WaitingRoom
  66. {
  67. get
  68. {
  69. return RoomMgr.m_waitingRoom;
  70. }
  71. }
  72. public static BaseCollectionTaskRoom CollectTaskRoom
  73. {
  74. get
  75. {
  76. return RoomMgr.m_collectTaskRoom;
  77. }
  78. }
  79. public static BaseWorldBossRoom WorldBossRoom
  80. {
  81. get
  82. {
  83. return RoomMgr.m_worldbossRoom;
  84. }
  85. }
  86. public static HallRoom Hallroom
  87. {
  88. get
  89. {
  90. return RoomMgr.m_hallroom;
  91. }
  92. }
  93.  
  94. public static bool Setup(int maxRoom)
  95. {
  96. maxRoom = ((maxRoom < 1) ? 1 : maxRoom);
  97. RoomMgr.m_thread = new Thread(new ThreadStart(RoomMgr.RoomThread));
  98. RoomMgr.m_actionQueue = new Queue<IAction>();
  99. RoomMgr.m_rooms = new BaseRoom[maxRoom];
  100. for (int i = 0; i < maxRoom; i++)
  101. {
  102. RoomMgr.m_rooms[i] = new BaseRoom(i + 1);
  103. }
  104. RoomMgr.m_sevenDoubleRoom = new BaseSevenDoubleRoom[maxRoom];
  105. for (int j = 0; j < maxRoom; j++)
  106. {
  107. RoomMgr.m_sevenDoubleRoom[j] = new BaseSevenDoubleRoom(j + 1);
  108. }
  109. RoomMgr.m_waitingRoom = new BaseWaitingRoom();
  110. RoomMgr.m_worldbossRoom = new BaseWorldBossRoom();
  111. RoomMgr.m_hallroom = new HallRoom();
  112. RoomMgr.m_christmasRoom = new BaseChristmasRoom();
  113. RoomMgr.m_ConsBatRoom = new BaseConsBatRoom();
  114. RoomMgr.m_campBattleRoom = new BaseCampBattleRoom();
  115. RoomMgr.m_collectTaskRoom = new BaseCollectionTaskRoom();
  116. return true;
  117. }
  118. public static void Start()
  119. {
  120. if (!RoomMgr.m_running)
  121. {
  122. RoomMgr.m_running = true;
  123. RoomMgr.m_thread.Start();
  124. }
  125. }
  126. public static void Stop()
  127. {
  128. if (RoomMgr.m_running)
  129. {
  130. RoomMgr.m_running = false;
  131. RoomMgr.m_thread.Join();
  132. }
  133. }
  134. private static void RoomThread()
  135. {
  136. Thread.CurrentThread.Priority = ThreadPriority.Highest;
  137. long num = 0L;
  138. RoomMgr.m_clearTick = TickHelper.GetTickCount();
  139. while (RoomMgr.m_running)
  140. {
  141. long tickCount = TickHelper.GetTickCount();
  142. int num2 = 0;
  143. try
  144. {
  145. num2 = RoomMgr.ExecuteActions();
  146. if (RoomMgr.m_clearTick <= tickCount)
  147. {
  148. RoomMgr.m_clearTick += (long)RoomMgr.CLEAR_ROOM_INTERVAL;
  149. RoomMgr.ClearRooms(tickCount);
  150. }
  151. goto IL_CB;
  152. }
  153. catch (Exception exception)
  154. {
  155. RoomMgr.log.Error("Room Mgr Thread Error:", exception);
  156. goto IL_CB;
  157. }
  158. goto IL_6B;
  159. IL_89:
  160. if (num > 0L)
  161. {
  162. Thread.Sleep((int)num);
  163. num = 0L;
  164. continue;
  165. }
  166. if (num < -1000L)
  167. {
  168. num += 1000L;
  169. continue;
  170. }
  171. continue;
  172. IL_6B:
  173. long tickCount2;
  174. RoomMgr.log.WarnFormat("Room Mgr is spent too much times: {0} ms,count:{1}", tickCount2 - tickCount, num2);
  175. goto IL_89;
  176. IL_CB:
  177. tickCount2 = TickHelper.GetTickCount();
  178. num += (long)RoomMgr.THREAD_INTERVAL - (tickCount2 - tickCount);
  179. if (tickCount2 - tickCount > (long)(RoomMgr.THREAD_INTERVAL * 2))
  180. {
  181. goto IL_6B;
  182. }
  183. goto IL_89;
  184. }
  185. }
  186. private static int ExecuteActions()
  187. {
  188. IAction[] array = null;
  189. Queue<IAction> actionQueue;
  190. Monitor.Enter(actionQueue = RoomMgr.m_actionQueue);
  191. try
  192. {
  193. if (RoomMgr.m_actionQueue.Count > 0)
  194. {
  195. array = new IAction[RoomMgr.m_actionQueue.Count];
  196. RoomMgr.m_actionQueue.CopyTo(array, 0);
  197. RoomMgr.m_actionQueue.Clear();
  198. }
  199. }
  200. finally
  201. {
  202. Monitor.Exit(actionQueue);
  203. }
  204. if (array != null)
  205. {
  206. IAction[] array2 = array;
  207. for (int i = 0; i < array2.Length; i++)
  208. {
  209. IAction action = array2[i];
  210. try
  211. {
  212. long tickCount = TickHelper.GetTickCount();
  213. action.Execute();
  214. long tickCount2 = TickHelper.GetTickCount();
  215. if (tickCount2 - tickCount > 40L)
  216. {
  217. RoomMgr.log.WarnFormat("RoomMgr action spent too much times:{0},{1}ms!", action.GetType(), tickCount2 - tickCount);
  218. }
  219. }
  220. catch (Exception exception)
  221. {
  222. RoomMgr.log.Error("RoomMgr execute action error:", exception);
  223. }
  224. }
  225. return array.Length;
  226. }
  227. return 0;
  228. }
  229. public static void ClearRooms(long tick)
  230. {
  231. BaseRoom[] rooms = RoomMgr.m_rooms;
  232. for (int i = 0; i < rooms.Length; i++)
  233. {
  234. BaseRoom baseRoom = rooms[i];
  235. if (baseRoom.IsUsing && baseRoom.PlayerCount == 0)
  236. {
  237. baseRoom.Stop();
  238. }
  239. }
  240. }
  241. public static void AddAction(IAction action)
  242. {
  243. Queue<IAction> actionQueue;
  244. Monitor.Enter(actionQueue = RoomMgr.m_actionQueue);
  245. try
  246. {
  247. RoomMgr.m_actionQueue.Enqueue(action);
  248. }
  249. finally
  250. {
  251. Monitor.Exit(actionQueue);
  252. }
  253. }
  254. public static void CreateRoom(GamePlayer player, string name, string password, eRoomType roomType, byte timeType)
  255. {
  256. RoomMgr.AddAction(new CreateRoomAction(player, name, password, roomType, timeType));
  257. }
  258. public static void CreateCampBattleRoom(GamePlayer player, GamePlayer ChallengePlayer)
  259. {
  260. RoomMgr.AddAction(new CreateCampBattleRoomAction(player, ChallengePlayer));
  261. }
  262. public static void CreateCampBattleBossRoom(GamePlayer player, int mapId)
  263. {
  264. RoomMgr.AddAction(new CreateCampBattleBossAction(player, eRoomType.CampBattleBattle, 1, mapId));
  265. }
  266. public static void CreateCatchBeastRoom(GamePlayer player)
  267. {
  268. RoomMgr.AddAction(new CreateCatchBeastAction(player));
  269. }
  270. public static void CreateConsortiaBattleRoom(GamePlayer player, GamePlayer ChallengePlayer)
  271. {
  272. RoomMgr.AddAction(new CreateConsortiaBattleRoomAction(player, ChallengePlayer));
  273. }
  274. public static void CreateBattleRoom(GamePlayer player, eRoomType roomType)
  275. {
  276. RoomMgr.AddAction(new CreateBattleRoomAction(player, roomType));
  277. }
  278. public static void CreateFightFootballTimeRoom(GamePlayer player, eRoomType roomType)
  279. {
  280. RoomMgr.AddAction(new CreateFightFootballTimeRoomAction(player, roomType));
  281. }
  282. public static void CreateEncounterRoom(GamePlayer player, eRoomType roomType)
  283. {
  284. RoomMgr.AddAction(new CreateEncounterRoomAction(player, roomType));
  285. }
  286. public static void CreateGroupBattleRoom(GamePlayer player, int groupType)
  287. {
  288. RoomMgr.AddAction(new CreateGroupBattleRoomAction(player, groupType));
  289. }
  290. public static void CreateConsortiaBossRoom(GamePlayer player, eRoomType roomType, int bossLevel)
  291. {
  292. RoomMgr.AddAction(new CreateConsortiaBossAction(player, roomType, bossLevel));
  293. }
  294. public static void EnterRoom(GamePlayer player, int roomId, string pwd, int type)
  295. {
  296. RoomMgr.AddAction(new EnterRoomAction(player, roomId, pwd, type));
  297. }
  298. public static void EnterRoom(GamePlayer player)
  299. {
  300. RoomMgr.EnterRoom(player, -1, null, 1);
  301. }
  302. public static void ExitRoom(BaseRoom room, GamePlayer player)
  303. {
  304. RoomMgr.AddAction(new ExitRoomAction(room, player));
  305. }
  306. public static void StartGame(BaseRoom room)
  307. {
  308. RoomMgr.AddAction(new StartGameAction(room));
  309. }
  310. public static void StartGameMission(BaseRoom room)
  311. {
  312. RoomMgr.AddAction(new StartGameMissionAction(room));
  313. }
  314. public static void UpdatePlayerState(GamePlayer player, byte state)
  315. {
  316. RoomMgr.AddAction(new UpdatePlayerStateAction(player, player.CurrentRoom, state));
  317. }
  318. public static void UpdateRoomPos(BaseRoom room, int pos, bool isOpened, int place, int placeView)
  319. {
  320. RoomMgr.AddAction(new UpdateRoomPosAction(room, pos, isOpened, place, placeView));
  321. }
  322. public static void KickPlayer(BaseRoom baseRoom, byte index)
  323. {
  324. RoomMgr.AddAction(new KickPlayerAction(baseRoom, (int)index));
  325. }
  326. public static void EnterWaitingRoom(GamePlayer player)
  327. {
  328. RoomMgr.AddAction(new EnterWaitingRoomAction(player));
  329. }
  330. public static void ExitWaitingRoom(GamePlayer player)
  331. {
  332. RoomMgr.AddAction(new ExitWaitRoomAction(player));
  333. }
  334. public static void CancelPickup(BattleServer server, BaseRoom room)
  335. {
  336. RoomMgr.AddAction(new CancelPickupAction(server, room));
  337. }
  338. public static void PickupNpc(int roomId)
  339. {
  340. RoomMgr.AddAction(new PickupNpcAction(roomId));
  341. }
  342. public static void UpdateRoomGameType(BaseRoom room, eRoomType roomType, byte timeMode, eHardLevel hardLevel, int levelLimits, int mapId, string password, string roomname, bool isCrosszone, bool isOpenBoss, string Pic, int currentFloor)
  343. {
  344. RoomMgr.AddAction(new RoomSetupChangeAction(room, roomType, timeMode, hardLevel, levelLimits, mapId, password, roomname, isCrosszone, isOpenBoss, Pic, currentFloor));
  345. }
  346. internal static void SwitchTeam(GamePlayer gamePlayer)
  347. {
  348. RoomMgr.AddAction(new SwitchTeamAction(gamePlayer));
  349. }
  350. public static List<BaseRoom> GetAllUsingRoom()
  351. {
  352. List<BaseRoom> list = new List<BaseRoom>();
  353. BaseRoom[] rooms;
  354. Monitor.Enter(rooms = RoomMgr.m_rooms);
  355. try
  356. {
  357. BaseRoom[] rooms2 = RoomMgr.m_rooms;
  358. for (int i = 0; i < rooms2.Length; i++)
  359. {
  360. BaseRoom baseRoom = rooms2[i];
  361. if (baseRoom.IsUsing)
  362. {
  363. list.Add(baseRoom);
  364. }
  365. }
  366. }
  367. finally
  368. {
  369. Monitor.Exit(rooms);
  370. }
  371. return list;
  372. }
  373. public static List<BaseRoom> GetAllRooms()
  374. {
  375. List<BaseRoom> list = new List<BaseRoom>();
  376. BaseRoom[] rooms;
  377. Monitor.Enter(rooms = RoomMgr.m_rooms);
  378. try
  379. {
  380. BaseRoom[] rooms2 = RoomMgr.m_rooms;
  381. for (int i = 0; i < rooms2.Length; i++)
  382. {
  383. BaseRoom baseRoom = rooms2[i];
  384. if (!baseRoom.IsEmpty)
  385. {
  386. list.Add(baseRoom);
  387. }
  388. }
  389. }
  390. finally
  391. {
  392. Monitor.Exit(rooms);
  393. }
  394. return list;
  395. }
  396. public static List<BaseRoom> GetAllPveRooms()
  397. {
  398. List<BaseRoom> list = new List<BaseRoom>();
  399. BaseRoom[] rooms;
  400. Monitor.Enter(rooms = RoomMgr.m_rooms);
  401. try
  402. {
  403. BaseRoom[] rooms2 = RoomMgr.m_rooms;
  404. for (int i = 0; i < rooms2.Length; i++)
  405. {
  406. BaseRoom baseRoom = rooms2[i];
  407. if (!baseRoom.IsEmpty && baseRoom.RoomType == eRoomType.Dungeon)
  408. {
  409. list.Add(baseRoom);
  410. }
  411. }
  412. }
  413. finally
  414. {
  415. Monitor.Exit(rooms);
  416. }
  417. return list;
  418. }
  419. public static List<BaseRoom> GetAllMatchRooms()
  420. {
  421. List<BaseRoom> list = new List<BaseRoom>();
  422. BaseRoom[] rooms;
  423. Monitor.Enter(rooms = RoomMgr.m_rooms);
  424. try
  425. {
  426. BaseRoom[] rooms2 = RoomMgr.m_rooms;
  427. for (int i = 0; i < rooms2.Length; i++)
  428. {
  429. BaseRoom baseRoom = rooms2[i];
  430. if (!baseRoom.IsEmpty && (baseRoom.RoomType == eRoomType.Match || baseRoom.RoomType == eRoomType.Freedom))
  431. {
  432. list.Add(baseRoom);
  433. }
  434. }
  435. }
  436. finally
  437. {
  438. Monitor.Exit(rooms);
  439. }
  440. return list;
  441. }
  442. public static List<BaseRoom> GetAllMatchRooms(eRoomType type)
  443. {
  444. List<BaseRoom> list = new List<BaseRoom>();
  445. BaseRoom[] rooms;
  446. Monitor.Enter(rooms = RoomMgr.m_rooms);
  447. try
  448. {
  449. BaseRoom[] rooms2 = RoomMgr.m_rooms;
  450. for (int i = 0; i < rooms2.Length; i++)
  451. {
  452. BaseRoom baseRoom = rooms2[i];
  453. if (!baseRoom.IsEmpty && baseRoom.RoomType == type)
  454. {
  455. list.Add(baseRoom);
  456. }
  457. }
  458. }
  459. finally
  460. {
  461. Monitor.Exit(rooms);
  462. }
  463. return list;
  464. }
  465. public static void StartProxyGame(BaseRoom room, ProxyGame game)
  466. {
  467. RoomMgr.AddAction(new StartProxyGameAction(room, game));
  468. }
  469. public static void StopProxyGame(BaseRoom room)
  470. {
  471. RoomMgr.AddAction(new StopProxyGameAction(room));
  472. }
  473. }
  474. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement