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.

ActionManager.cs 29 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. using System;
  2. using System.Threading;
  3. using GameClass.GameObj;
  4. using GameEngine;
  5. using Preparation.Utility;
  6. using Timothy.FrameRateTask;
  7. namespace Gaming
  8. {
  9. public partial class Game
  10. {
  11. private readonly ActionManager actionManager;
  12. private class ActionManager
  13. {
  14. public bool MovePlayer(Character playerToMove, int moveTimeInMilliseconds, double moveDirection)
  15. {
  16. if (moveTimeInMilliseconds < 5) return false;
  17. long stateNum = playerToMove.SetPlayerState(RunningStateType.Waiting, PlayerStateType.Moving);
  18. if (stateNum == -1) return false;
  19. new Thread
  20. (
  21. () =>
  22. {
  23. playerToMove.ThreadNum.WaitOne();
  24. if (!playerToMove.StartThread(stateNum, RunningStateType.RunningActively))
  25. {
  26. playerToMove.ThreadNum.Release();
  27. return;
  28. }
  29. moveEngine.MoveObj(playerToMove, moveTimeInMilliseconds, moveDirection, stateNum);
  30. }
  31. )
  32. { IsBackground = true }.Start();
  33. return true;
  34. }
  35. public bool MovePlayerWhenStunned(Character playerToMove, int moveTimeInMilliseconds, double moveDirection)
  36. {
  37. if (playerToMove.CharacterType == CharacterType.Robot) return false;
  38. long stateNum = playerToMove.SetPlayerState(RunningStateType.Waiting, PlayerStateType.Charmed);
  39. if (stateNum == -1) return false;
  40. new Thread
  41. (() =>
  42. {
  43. playerToMove.ThreadNum.WaitOne();
  44. if (!playerToMove.StartThread(stateNum, RunningStateType.RunningActively))
  45. {
  46. playerToMove.ThreadNum.Release();
  47. return;
  48. }
  49. else
  50. {
  51. moveEngine.MoveObj(playerToMove, moveTimeInMilliseconds, moveDirection, playerToMove.StateNum);
  52. Thread.Sleep(moveTimeInMilliseconds);
  53. playerToMove.ResetPlayerState(stateNum);
  54. }
  55. }
  56. )
  57. { IsBackground = true }.Start();
  58. return true;
  59. }
  60. public static bool Stop(Character player)
  61. {
  62. lock (player.ActionLock)
  63. {
  64. if (player.Commandable())
  65. {
  66. player.SetPlayerState(RunningStateType.Null);
  67. return true;
  68. }
  69. }
  70. return false;
  71. }
  72. public bool Fix(Student player)// 自动检查有无发电机可修
  73. {
  74. Generator? generatorForFix = (Generator?)gameMap.OneForInteract(player.Position, GameObjType.Generator);
  75. if (generatorForFix == null) return false;
  76. if (generatorForFix.DegreeOfRepair == GameData.degreeOfFixedGenerator)
  77. return false;
  78. long stateNum = player.SetPlayerState(RunningStateType.Waiting, PlayerStateType.Fixing);
  79. if (stateNum == -1) return false;
  80. new Thread
  81. (
  82. () =>
  83. {
  84. player.ThreadNum.WaitOne();
  85. if (!player.StartThread(stateNum, RunningStateType.RunningActively))
  86. {
  87. player.ThreadNum.Release();
  88. return;
  89. }
  90. generatorForFix.AddNumOfFixing();
  91. Thread.Sleep(GameData.checkInterval);
  92. new FrameRateTaskExecutor<int>(
  93. loopCondition: () => stateNum == player.StateNum && gameMap.Timer.IsGaming,
  94. loopToDo: () =>
  95. {
  96. if (generatorForFix.Repair(player.FixSpeed * GameData.checkInterval, player))
  97. gameMap.AddNumOfRepairedGenerators();
  98. if (generatorForFix.DegreeOfRepair == GameData.degreeOfFixedGenerator)
  99. {
  100. player.ResetPlayerState(stateNum);
  101. return false;
  102. }
  103. return true;
  104. },
  105. timeInterval: GameData.checkInterval,
  106. finallyReturn: () => 0
  107. )
  108. .Start();
  109. player.ThreadNum.Release();
  110. generatorForFix.SubNumOfFixing();
  111. }
  112. )
  113. { IsBackground = true }.Start();
  114. return true;
  115. }
  116. public bool OpenDoorway(Student player)
  117. {
  118. Doorway? doorwayToOpen = (Doorway?)gameMap.OneForInteract(player.Position, GameObjType.Doorway);
  119. if (doorwayToOpen == null) return false;
  120. long stateNum = player.SetPlayerState(RunningStateType.Waiting, PlayerStateType.OpeningTheDoorway, doorwayToOpen);
  121. if (stateNum == -1) return false;
  122. new Thread
  123. (
  124. () =>
  125. {
  126. player.ThreadNum.WaitOne();
  127. if (!doorwayToOpen.TryToOpen())
  128. {
  129. player.ThreadNum.Release();
  130. player.ResetPlayerState(stateNum);
  131. return;
  132. }
  133. if (!player.StartThread(stateNum, RunningStateType.RunningSleepily))
  134. {
  135. player.ThreadNum.Release();
  136. return;
  137. }
  138. Thread.Sleep(GameData.degreeOfOpenedDoorway - doorwayToOpen.OpenDegree);
  139. if (player.ResetPlayerState(stateNum))
  140. {
  141. doorwayToOpen.FinishOpenning();
  142. player.ThreadNum.Release();
  143. }
  144. }
  145. )
  146. { IsBackground = true }.Start();
  147. return true;
  148. }
  149. public bool Escape(Student player)
  150. {
  151. if (player.CharacterType == CharacterType.Robot || player.CharacterType == CharacterType.Teacher)
  152. return false;
  153. Doorway? doorwayForEscape = (Doorway?)gameMap.OneForInteract(player.Position, GameObjType.Doorway);
  154. if (doorwayForEscape != null && doorwayForEscape.IsOpen())
  155. {
  156. if (!player.TryToRemoveFromGame(PlayerStateType.Escaped)) return false;
  157. player.AddScore(GameData.StudentScoreEscape);
  158. gameMap.MapEscapeStudent();
  159. return true;
  160. }
  161. else
  162. {
  163. EmergencyExit? emergencyExit = (EmergencyExit?)gameMap.OneForInteract(player.Position, GameObjType.EmergencyExit);
  164. if (emergencyExit != null && emergencyExit.IsOpen)
  165. {
  166. if (!player.TryToRemoveFromGame(PlayerStateType.Escaped)) return false;
  167. player.AddScore(GameData.StudentScoreEscape);
  168. gameMap.MapEscapeStudent();
  169. return true;
  170. }
  171. return false;
  172. }
  173. }
  174. public bool Treat(Student player, Student? playerTreated = null)
  175. {
  176. if (player.CharacterType == CharacterType.Robot) return false;
  177. if (playerTreated == null)
  178. {
  179. playerTreated = gameMap.StudentForInteract(player);
  180. if (playerTreated == null) return false;
  181. }
  182. else if (!GameData.ApproachToInteract(playerTreated.Position, player.Position)) return false;
  183. if (playerTreated.HP == playerTreated.MaxHp) return false;
  184. long stateNumTreated = playerTreated.SetPlayerState(RunningStateType.Waiting, PlayerStateType.Treated);
  185. if (stateNumTreated == -1) return false;
  186. long stateNum = player.SetPlayerState(RunningStateType.Waiting, PlayerStateType.Treating);
  187. if (stateNum == -1)
  188. {
  189. playerTreated.ResetPlayerState(stateNumTreated);
  190. return false;
  191. }
  192. new Thread
  193. (
  194. () =>
  195. {
  196. player.ThreadNum.WaitOne();
  197. if (!player.StartThread(stateNum, RunningStateType.RunningActively))
  198. {
  199. player.ThreadNum.Release();
  200. playerTreated.ResetPlayerState(stateNumTreated);
  201. return;
  202. }
  203. playerTreated.ThreadNum.WaitOne();
  204. if (!playerTreated.StartThread(stateNum, RunningStateType.RunningActively))
  205. {
  206. playerTreated.ThreadNum.Release();
  207. player.ResetPlayerState(stateNum);
  208. player.ThreadNum.Release();
  209. return;
  210. }
  211. Thread.Sleep(GameData.checkInterval);
  212. new FrameRateTaskExecutor<int>(
  213. loopCondition: () => stateNum == player.StateNum && gameMap.Timer.IsGaming,
  214. loopToDo: () =>
  215. {
  216. lock (playerTreated.ActionLock)
  217. {
  218. if (playerTreated.StateNum == stateNumTreated)
  219. {
  220. if (playerTreated.AddDegreeOfTreatment(GameData.checkInterval * player.TreatSpeed, player))
  221. {
  222. playerTreated.SetPlayerStateNaturally();
  223. return false;
  224. }
  225. }
  226. else return false;
  227. }
  228. return true;
  229. },
  230. timeInterval: GameData.checkInterval,
  231. finallyReturn: () => 0
  232. )
  233. .Start();
  234. player.ThreadNum.Release();
  235. playerTreated.ThreadNum.Release();
  236. if (player.ResetPlayerState(stateNum))
  237. return;
  238. playerTreated.ResetPlayerState(stateNumTreated);
  239. }
  240. )
  241. { IsBackground = true }.Start();
  242. return true;
  243. }
  244. public bool Rescue(Student player, Student? playerRescued = null)
  245. {
  246. if (player.CharacterType == CharacterType.Robot) return false;
  247. if (playerRescued == null)
  248. {
  249. playerRescued = gameMap.StudentForInteract(player);
  250. if (playerRescued == null) return false;
  251. }
  252. else if (!GameData.ApproachToInteract(playerRescued.Position, player.Position)) return false;
  253. long stateNumRescued = playerRescued.SetPlayerState(RunningStateType.Waiting, PlayerStateType.Rescued);
  254. if (stateNumRescued == -1) return false;
  255. long stateNum = player.SetPlayerState(RunningStateType.Waiting, PlayerStateType.Rescuing);
  256. if (stateNum == -1)
  257. {
  258. playerRescued.ResetPlayerStateInOneThread(stateNumRescued, RunningStateType.RunningForcibly, PlayerStateType.Addicted);
  259. return false;
  260. }
  261. new Thread
  262. (
  263. () =>
  264. {
  265. player.ThreadNum.WaitOne();
  266. if (!player.StartThread(stateNum, RunningStateType.RunningActively))
  267. {
  268. player.ThreadNum.Release();
  269. playerRescued.ResetPlayerStateInOneThread(stateNumRescued, RunningStateType.RunningForcibly, PlayerStateType.Addicted);
  270. return;
  271. }
  272. playerRescued.ThreadNum.WaitOne();
  273. if (!playerRescued.StartThread(stateNumRescued, RunningStateType.RunningActively))
  274. {
  275. playerRescued.ThreadNum.Release();
  276. if (!player.ResetPlayerState(stateNum))
  277. player.ThreadNum.Release();
  278. return;
  279. }
  280. new FrameRateTaskExecutor<int>(
  281. loopCondition: () => stateNum == player.StateNum && gameMap.Timer.IsGaming,
  282. loopToDo: () =>
  283. {
  284. lock (playerRescued.ActionLock)
  285. {
  286. if (playerRescued.StateNum == stateNumRescued)
  287. {
  288. if (playerRescued.AddTimeOfRescue(GameData.checkInterval))
  289. {
  290. playerRescued.SetPlayerStateNaturally();
  291. playerRescued.SetHP(playerRescued.MaxHp / 2);
  292. player.AddScore(GameData.StudentScoreRescue);
  293. return false;
  294. }
  295. }
  296. else return false;
  297. }
  298. return true;
  299. },
  300. timeInterval: GameData.checkInterval,
  301. finallyReturn: () => 0
  302. )
  303. .Start();
  304. playerRescued.SetTimeOfRescue(0);
  305. player.ThreadNum.Release();
  306. playerRescued.ThreadNum.Release();
  307. if (player.ResetPlayerState(stateNum)) return;
  308. playerRescued.ResetPlayerStateInOneThread(stateNumRescued, RunningStateType.RunningForcibly, PlayerStateType.Addicted);
  309. }
  310. )
  311. { IsBackground = true }.Start();
  312. return true;
  313. }
  314. public bool OpenChest(Character player)
  315. {
  316. Chest? chestToOpen = (Chest?)gameMap.OneForInteract(player.Position, GameObjType.Chest);
  317. if (chestToOpen == null) return false;
  318. long stateNum = player.SetPlayerState(RunningStateType.Waiting, PlayerStateType.OpeningTheChest, chestToOpen);
  319. if (stateNum == -1) return false;
  320. new Thread
  321. (
  322. () =>
  323. {
  324. player.ThreadNum.WaitOne();
  325. lock (player.ActionLock)
  326. {
  327. if (!player.StartThread(stateNum, RunningStateType.RunningSleepily))
  328. {
  329. player.ThreadNum.Release();
  330. return;
  331. }
  332. else
  333. if (!chestToOpen.Open(player))
  334. {
  335. player.ThreadNum.Release();
  336. player.SetPlayerStateNaturally();
  337. return;
  338. }
  339. }
  340. Thread.Sleep(GameData.degreeOfOpenedChest / player.SpeedOfOpenChest);
  341. if (player.ResetPlayerState(stateNum))
  342. {
  343. player.ThreadNum.Release();
  344. for (int i = 0; i < GameData.maxNumOfPropInChest; ++i)
  345. {
  346. Gadget prop = chestToOpen.PropInChest[i];
  347. chestToOpen.PropInChest[i] = new NullProp();
  348. prop.ReSetPos(player.Position);
  349. gameMap.Add(prop);
  350. }
  351. }
  352. }
  353. )
  354. { IsBackground = true }.Start();
  355. return true;
  356. }
  357. public bool ClimbingThroughWindow(Character player)
  358. {
  359. Window? windowForClimb = (Window?)gameMap.OneForInteractInACross(player.Position, GameObjType.Window);
  360. if (windowForClimb == null) return false;
  361. long stateNum = player.SetPlayerState(RunningStateType.Waiting, PlayerStateType.ClimbingThroughWindows, windowForClimb);
  362. if (stateNum == -1) return false;
  363. XY windowToPlayer = new(
  364. (Math.Abs(player.Position.x - windowForClimb.Position.x) > GameData.numOfPosGridPerCell / 2) ? (GameData.numOfPosGridPerCell / 2 * (player.Position.x > windowForClimb.Position.x ? 1 : -1)) : 0,
  365. (Math.Abs(player.Position.y - windowForClimb.Position.y) > GameData.numOfPosGridPerCell / 2) ? (GameData.numOfPosGridPerCell / 2 * (player.Position.y > windowForClimb.Position.y ? 1 : -1)) : 0);
  366. /* Character? characterInWindow = (Character?)gameMap.OneInTheSameCell(windowForClimb.Position - 2 * windowToPlayer, GameObjType.Character);
  367. if (characterInWindow != null)
  368. {
  369. if (player.IsGhost() && !characterInWindow.IsGhost())
  370. characterManager.BeAttacked((Student)(characterInWindow), player.Attack(characterInWindow.Position));
  371. return false;
  372. }
  373. Wall addWall = new Wall(windowForClimb.Position - 2 * windowToPlayer);
  374. gameMap.Add(addWall);*/
  375. new Thread
  376. (
  377. () =>
  378. {
  379. player.ThreadNum.WaitOne();
  380. lock (player.ActionLock)
  381. {
  382. if (!player.StartThread(stateNum, RunningStateType.RunningSleepily))
  383. {
  384. player.ThreadNum.Release();
  385. return;
  386. }
  387. if (!windowForClimb.TryToClimb(player))
  388. {
  389. player.SetPlayerStateNaturally();
  390. player.ThreadNum.Release();
  391. return;
  392. }
  393. }
  394. Thread.Sleep((int)((windowToPlayer + windowForClimb.Position - player.Position).Length() * 1000 / player.MoveSpeed));
  395. lock (player.ActionLock)
  396. {
  397. if (!player.StartThread(stateNum, RunningStateType.RunningActively)) return;
  398. windowForClimb.Enter2Stage(windowForClimb.Position - 2 * windowToPlayer);
  399. player.ReSetPos(windowToPlayer + windowForClimb.Position);
  400. }
  401. player.MoveSpeed.Set(player.SpeedOfClimbingThroughWindows);
  402. moveEngine.MoveObj(player, (int)(GameData.numOfPosGridPerCell * 3 * 1000 / player.MoveSpeed / 2), (-1 * windowToPlayer).Angle(), stateNum);
  403. Thread.Sleep((int)(GameData.numOfPosGridPerCell * 3 * 1000 / player.MoveSpeed / 2));
  404. player.MoveSpeed.Set(player.ReCalculateBuff(BuffType.AddSpeed, player.OrgMoveSpeed, GameData.MaxSpeed, GameData.MinSpeed));
  405. lock (player.ActionLock)
  406. {
  407. if (stateNum == player.StateNum)
  408. {
  409. player.ReSetPos(windowForClimb.Stage);
  410. player.SetPlayerStateNaturally();
  411. windowForClimb.FinishClimbing();
  412. }
  413. }
  414. }
  415. )
  416. { IsBackground = true }.Start();
  417. return true;
  418. }
  419. public bool LockDoor(Character player)
  420. {
  421. if (player.CharacterType == CharacterType.Robot) return false;
  422. Door? doorToLock = (Door?)gameMap.OneForInteract(player.Position, GameObjType.Door);
  423. if (doorToLock == null) return false;
  424. if (!player.UseTool(doorToLock.KeyType)) return false;
  425. long stateNum = player.SetPlayerState(RunningStateType.Waiting, PlayerStateType.LockingTheDoor, doorToLock);
  426. if (stateNum == -1)
  427. {
  428. player.ReleaseTool(doorToLock.KeyType);
  429. return false;
  430. }
  431. new Thread
  432. (
  433. () =>
  434. {
  435. player.ThreadNum.WaitOne();
  436. if (!player.StartThread(stateNum, RunningStateType.RunningActively))
  437. {
  438. player.ReleaseTool(doorToLock.KeyType);
  439. player.ThreadNum.Release();
  440. return;
  441. }
  442. if (!doorToLock.TryLock(player))
  443. {
  444. player.ReleaseTool(doorToLock.KeyType);
  445. player.ResetPlayerState(stateNum);
  446. player.ThreadNum.Release();
  447. return;
  448. }
  449. Thread.Sleep(GameData.checkInterval);
  450. new FrameRateTaskExecutor<int>(
  451. loopCondition: () => stateNum == player.StateNum && gameMap.Timer.IsGaming,
  452. loopToDo: () =>
  453. {
  454. if ((gameMap.PartInTheSameCell(doorToLock.Position, GameObjType.Character)) != null)
  455. return false;
  456. if (doorToLock.LockDegree.Add(GameData.checkInterval * player.SpeedOfOpeningOrLocking) >= GameData.basicSpeedOfOpeningOrLocking)
  457. return false;
  458. return true;
  459. },
  460. timeInterval: GameData.checkInterval,
  461. finallyReturn: () => 0
  462. )
  463. .Start();
  464. doorToLock.StopLock();
  465. player.ReleaseTool(doorToLock.KeyType);
  466. player.ThreadNum.Release();
  467. player.ResetPlayerState(stateNum);
  468. }
  469. )
  470. { IsBackground = true }.Start();
  471. return true;
  472. }
  473. public bool OpenDoor(Character player)
  474. {
  475. if (player.CharacterType == CharacterType.Robot) return false;
  476. Door? doorToOpen = (Door?)gameMap.OneForInteract(player.Position, GameObjType.Door);
  477. if (doorToOpen == null) return false;
  478. if (!player.UseTool(doorToOpen.KeyType)) return false;
  479. long stateNum = player.SetPlayerState(RunningStateType.Waiting, PlayerStateType.OpeningTheDoor, doorToOpen);
  480. if (stateNum == -1)
  481. {
  482. player.ReleaseTool(doorToOpen.KeyType);
  483. return false;
  484. }
  485. new Thread
  486. (
  487. () =>
  488. {
  489. player.ThreadNum.WaitOne();
  490. if (!player.StartThread(stateNum, RunningStateType.RunningSleepily))
  491. {
  492. player.ReleaseTool(doorToOpen.KeyType);
  493. player.ThreadNum.Release();
  494. return;
  495. }
  496. if (!doorToOpen.TryOpen(player))
  497. {
  498. player.ReleaseTool(doorToOpen.KeyType);
  499. if (player.ResetPlayerState(stateNum))
  500. player.ThreadNum.Release();
  501. return;
  502. }
  503. Thread.Sleep(GameData.degreeOfLockingOrOpeningTheDoor / player.SpeedOfOpeningOrLocking);
  504. if (player.ResetPlayerState(stateNum))
  505. {
  506. doorToOpen.StopOpen();
  507. player.ReleaseTool(doorToOpen.KeyType);
  508. player.ThreadNum.Release();
  509. }
  510. }
  511. )
  512. { IsBackground = true }.Start();
  513. return true;
  514. }
  515. /*
  516. private void ActivateMine(Character player, Mine mine)
  517. {
  518. gameMap.ObjListLock.EnterWriteLock();
  519. try { gameMap.ObjList.Remove(mine); }
  520. catch { }
  521. finally { gameMap.ObjListLock.ExitWriteLock(); }
  522. switch (mine.GetPropType())
  523. {
  524. case PropType.Dirt:
  525. player.AddMoveSpeed(Constant.dirtMoveSpeedDebuff, Constant.buffPropTime);
  526. break;
  527. case PropType.Attenuator:
  528. player.AddAP(Constant.attenuatorAtkDebuff, Constant.buffPropTime);
  529. break;
  530. case PropType.Divider:
  531. player.ChangeCD(Constant.dividerCdDiscount, Constant.buffPropTime);
  532. break;
  533. }
  534. }
  535. */
  536. private readonly Map gameMap;
  537. private readonly CharacterManager characterManager;
  538. public readonly MoveEngine moveEngine;
  539. public ActionManager(Map gameMap, CharacterManager characterManager)
  540. {
  541. this.gameMap = gameMap;
  542. this.moveEngine = new MoveEngine(
  543. gameMap: gameMap,
  544. OnCollision: (obj, collisionObj, moveVec) =>
  545. {
  546. Character player = (Character)obj;
  547. switch (collisionObj.Type)
  548. {
  549. case GameObjType.Bullet:
  550. if (((Bullet)collisionObj).Parent != player && ((Bullet)collisionObj).TypeOfBullet == BulletType.JumpyDumpty)
  551. {
  552. if (CharacterManager.BeStunned((Character)player, GameData.timeOfStunnedWhenJumpyDumpty) > 0)
  553. player.AddScore(GameData.TrickerScoreStudentBeStunned(GameData.timeOfStunnedWhenJumpyDumpty));
  554. gameMap.Remove((GameObj)collisionObj);
  555. }
  556. break;
  557. case GameObjType.Character:
  558. if (player.FindActiveSkill(ActiveSkillType.CanBeginToCharge).IsBeingUsed && ((Character)collisionObj).IsGhost())
  559. {
  560. if (CharacterManager.BeStunned((Character)collisionObj, GameData.timeOfGhostStunnedWhenCharge) > 0)
  561. player.AddScore(GameData.StudentScoreTrickerBeStunned(GameData.timeOfGhostStunnedWhenCharge));
  562. CharacterManager.BeStunned(player, GameData.timeOfStudentStunnedWhenCharge);
  563. }
  564. break;
  565. case GameObjType.Item:
  566. if (((Item)collisionObj).GetPropType() == PropType.CraftingBench)
  567. {
  568. ((CraftingBench)collisionObj).TryStopSkill();
  569. gameMap.Remove((Item)collisionObj);
  570. }
  571. break;
  572. default:
  573. break;
  574. }
  575. //Preparation.Utility.Debugger.Output(obj, " end move with " + collisionObj.ToString());
  576. //if (collisionObj is Mine)
  577. //{
  578. // ActivateMine((Character)obj, (Mine)collisionObj);
  579. // return MoveEngine.AfterCollision.ContinueCheck;
  580. //}
  581. return MoveEngine.AfterCollision.MoveMax;
  582. },
  583. EndMove: obj =>
  584. {
  585. obj.ThreadNum.Release();
  586. // Debugger.Output(obj, " end move at " + obj.Position.ToString() + " At time: " + Environment.TickCount64);
  587. }
  588. );
  589. this.characterManager = characterManager;
  590. }
  591. }
  592. }
  593. }