MonsterCarnival.java
上传用户:gwt600
上传日期:2021-06-03
资源大小:704k
文件大小:11k
源码类别:

游戏

开发平台:

Java

  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5. package net.sf.odinms.server;
  6. import java.util.concurrent.ScheduledFuture;
  7. import net.sf.odinms.client.MapleCharacter;
  8. import net.sf.odinms.net.world.MapleParty;
  9. import net.sf.odinms.server.maps.MapleMap;
  10. import net.sf.odinms.net.channel.ChannelServer;
  11. import net.sf.odinms.net.world.MaplePartyCharacter;
  12. import net.sf.odinms.tools.MaplePacketCreator;
  13. /**
  14.  *
  15.  * @author David
  16.  */
  17. public class MonsterCarnival {
  18. public static int D = 3;
  19. public static int C = 2;
  20. public static int B = 1;
  21. public static int A = 0;
  22. private MapleParty p1, p2;
  23. private MapleMap map;
  24. private ScheduledFuture<?> timer;
  25. private ScheduledFuture<?> effectTimer;
  26. private long startTime;
  27. private MapleCharacter leader1, leader2;
  28. private int redCP, blueCP, redTotalCP, blueTotalCP;
  29. public MonsterCarnival(MapleParty p1, MapleParty p2, int mapid) {
  30. this.p1 = p1;
  31. this.p2 = p2;
  32. int chnl = p1.getLeader().getChannel();
  33. int chnl1 = p2.getLeader().getChannel();
  34. if (chnl != chnl1) throw new RuntimeException("嘉年华队长不在同一条线..");
  35. ChannelServer cs = ChannelServer.getInstance(chnl);
  36. p1.setEnemy(p2);
  37. p2.setEnemy(p1);
  38. cs.getMapFactory().disposeMap(mapid);
  39. map = cs.getMapFactory().getMap(mapid);
  40. int redPortal = 0;
  41. int bluePortal = 0;
  42. if (map.isPurpleCPQMap()) {
  43. redPortal = 2;
  44. bluePortal = 1;
  45. }
  46. for (MaplePartyCharacter mpc : p1.getMembers()) {
  47. MapleCharacter mc;
  48. mc = cs.getPlayerStorage().getCharacterByName(mpc.getName());
  49. if (mc != null) {
  50. mc.setMonsterCarnival(this);
  51. mc.changeMap(map, map.getPortal(redPortal));
  52. mc.setTeam(0);
  53. if (p1.getLeader().getId() == mc.getId()) {
  54. leader1 = mc;
  55. }
  56. }
  57. }
  58. for (MaplePartyCharacter mpc : p2.getMembers()) {
  59. MapleCharacter mc;
  60. mc = cs.getPlayerStorage().getCharacterByName(mpc.getName());
  61. if (mc != null) {
  62. mc.setMonsterCarnival(this);
  63. mc.changeMap(map, map.getPortal(bluePortal));
  64. mc.setTeam(1);
  65. if (p2.getLeader().getId() == mc.getId()) {
  66. leader2 = mc;
  67. }
  68. }
  69. }
  70. startTime = System.currentTimeMillis() + 60 * 10000;
  71. timer = TimerManager.getInstance().schedule(new Runnable() {
  72. public void run() {
  73. timeUp();
  74. }
  75. }, 10 * 60 * 1000);
  76. effectTimer = TimerManager.getInstance().schedule(new Runnable() {
  77. public void run() {
  78. complete();
  79. }
  80. }, 10 * 60 * 1000 - 10 * 1000);
  81. TimerManager.getInstance().schedule(new Runnable() {
  82. public void run() {
  83. map.addClock(60 * 10);
  84. }
  85. }, 2000);
  86. }
  87. public void playerDisconnected(int charid) {
  88. if (leader1.getId() == charid ||
  89. leader2.getId() == charid) {
  90. earlyFinish();
  91. int team = -1;
  92. for (MaplePartyCharacter mpc : leader1.getParty().getMembers()) {
  93. if (mpc.getId() == charid) {
  94. team = 0;
  95. }
  96. }
  97. for (MaplePartyCharacter mpc : leader2.getParty().getMembers()) {
  98. if (mpc.getId() == charid) {
  99. team = 1;
  100. }
  101. }
  102. if (team == -1) team = 1;
  103. String teamS = "undefined";
  104. switch (team) {
  105. case 0:
  106. teamS = "Red";
  107. break;
  108. case 1:
  109. teamS = "Blue";
  110. break;
  111. }
  112. map.broadcastMessage(MaplePacketCreator.serverNotice(5, "枫叶 " + teamS + " 已经离开怪物嘉年华."));
  113. return;
  114. } else {
  115. map.broadcastMessage(MaplePacketCreator.serverNotice(5, ChannelServer.getInstance(1).getMarket().getCharacterName(charid) + " 已经离开怪物嘉年华."));
  116. }
  117. }
  118. public void earlyFinish() {
  119. dispose(true);
  120. }
  121. public void leftParty(int charid) {
  122. playerDisconnected(charid);
  123. }
  124. protected int getRankByCP(int cp) {
  125. if (cp < 50) {
  126. return D;
  127. } else if (cp > 50 && cp < 100) {
  128. return C;
  129. } else if (cp > 100 && cp < 300) {
  130. return B;
  131. } else if (cp > 300) {
  132. return A;
  133. }
  134. return D;
  135. }
  136. protected void dispose() {
  137. dispose(false);
  138. }
  139. protected void dispose(boolean warpout) {
  140. int chnl = p1.getLeader().getChannel();
  141. ChannelServer cs = ChannelServer.getInstance(chnl);
  142. MapleMap out = cs.getMapFactory().getMap(980000000);
  143. for (MaplePartyCharacter mpc : leader1.getParty().getMembers()) {
  144. MapleCharacter mc;
  145. mc = cs.getPlayerStorage().getCharacterByName(mpc.getName());
  146. if (mc != null) {
  147. mc.setCpqRanking(getRankByCP(this.redTotalCP));
  148. mc.resetCP();
  149. if (warpout) {
  150. mc.changeMap(out, out.getPortal(0));
  151. }
  152. }
  153. }
  154. for (MaplePartyCharacter mpc : leader2.getParty().getMembers()) {
  155. MapleCharacter mc;
  156. mc = cs.getPlayerStorage().getCharacterByName(mpc.getName());
  157. if (mc != null) {
  158. mc.setCpqRanking(getRankByCP(this.blueTotalCP));
  159. mc.resetCP();
  160. if (warpout) {
  161. mc.changeMap(out, out.getPortal(0));
  162. }
  163. }
  164. }
  165. timer.cancel(false);
  166. effectTimer.cancel(false);
  167. redTotalCP = 0;
  168. blueTotalCP = 0;
  169. leader1.getParty().setEnemy(null);
  170. leader2.getParty().setEnemy(null);
  171. }
  172. public void exit() {
  173. dispose();
  174. }
  175. public ScheduledFuture<?> getTimer() {
  176. return this.timer;
  177. }
  178. public void finish(int winningTeam) {
  179. int chnl = leader1.getClient().getChannel();
  180. int chnl1 = leader2.getClient().getChannel();
  181. if (chnl != chnl1) throw new RuntimeException("CPQ leaders are on different channels..");
  182. ChannelServer cs = ChannelServer.getInstance(chnl);
  183. if (winningTeam == 0) {
  184. for (MaplePartyCharacter mpc : leader1.getParty().getMembers()) {
  185. MapleCharacter mc;
  186. mc = cs.getPlayerStorage().getCharacterByName(mpc.getName());
  187. if (mc != null) {
  188. mc.setCpqRanking(getRankByCP(this.redTotalCP));
  189. mc.changeMap(cs.getMapFactory().getMap(map.getId() + 2), cs.getMapFactory().getMap(map.getId() + 2).getPortal(0));
  190. mc.setTeam(-1);
  191. }
  192. }
  193. for (MaplePartyCharacter mpc : leader2.getParty().getMembers()) {
  194. MapleCharacter mc;
  195. mc = cs.getPlayerStorage().getCharacterByName(mpc.getName());
  196. if (mc != null) {
  197. mc.setCpqRanking(getRankByCP(this.blueTotalCP));
  198. mc.changeMap(cs.getMapFactory().getMap(map.getId() + 3), cs.getMapFactory().getMap(map.getId() + 3).getPortal(0));
  199. mc.setTeam(-1);
  200. }
  201. }
  202. } else if (winningTeam == 1) {
  203. for (MaplePartyCharacter mpc : leader2.getParty().getMembers()) {
  204. MapleCharacter mc;
  205. mc = cs.getPlayerStorage().getCharacterByName(mpc.getName());
  206. if (mc != null) {
  207. mc.changeMap(cs.getMapFactory().getMap(map.getId() + 2), cs.getMapFactory().getMap(map.getId() + 2).getPortal(0));
  208. mc.setTeam(-1);
  209. }
  210. }
  211. for (MaplePartyCharacter mpc : leader1.getParty().getMembers()) {
  212. MapleCharacter mc;
  213. mc = cs.getPlayerStorage().getCharacterByName(mpc.getName());
  214. if (mc != null) {
  215. mc.changeMap(cs.getMapFactory().getMap(map.getId() + 3), cs.getMapFactory().getMap(map.getId() + 3).getPortal(0));
  216. mc.setTeam(-1);
  217. }
  218. }
  219. }
  220. dispose();
  221. }
  222. public void timeUp() {
  223. int cp1 = this.redTotalCP;
  224. int cp2 = this.blueTotalCP;
  225. if (cp1 == cp2) {
  226. extendTime();
  227. return;
  228. }
  229. if (cp1 > cp2) {
  230. finish(0);
  231. } else {
  232. finish(1);
  233. }
  234. }
  235. public long getTimeLeft() {
  236. return (startTime - System.currentTimeMillis());
  237. }
  238. public int getTimeLeftSeconds() {
  239. return (int) (getTimeLeft() / 1000);
  240. }
  241. public void extendTime() {
  242. map.broadcastMessage(MaplePacketCreator.serverNotice(5, "The time has been extended."));
  243. startTime = System.currentTimeMillis() + 3 * 1000;
  244. map.addClock(3 * 60);
  245. timer = TimerManager.getInstance().schedule(new Runnable() {
  246. public void run() {
  247. timeUp();
  248. }
  249. }, 3 * 60 * 1000);
  250. effectTimer = TimerManager.getInstance().schedule(new Runnable() {
  251. public void run() {
  252. complete();
  253. }
  254. }, 3 * 60 * 1000 - 10);
  255. }
  256. public void complete() {
  257. int cp1 = this.redTotalCP;
  258. int cp2 = this.blueTotalCP;
  259. if (cp1 == cp2) {
  260. return;
  261. }
  262. boolean redWin = cp1 > cp2;
  263. int chnl = leader1.getClient().getChannel();
  264. int chnl1 = leader2.getClient().getChannel();
  265. if (chnl != chnl1) throw new RuntimeException("CPQ leaders are on different channels..");
  266. ChannelServer cs = ChannelServer.getInstance(chnl);
  267. map.killAllMonsters(false);
  268. for (MaplePartyCharacter mpc : leader1.getParty().getMembers()) {
  269. MapleCharacter mc;
  270. mc = cs.getPlayerStorage().getCharacterByName(mpc.getName());
  271. if (mc != null) {
  272. if (redWin) {
  273. mc.getClient().getSession().write(MaplePacketCreator.showEffect("quest/carnival/win"));
  274. mc.getClient().getSession().write(MaplePacketCreator.playSound("MobCarnival/Win"));
  275. } else {
  276. mc.getClient().getSession().write(MaplePacketCreator.showEffect("quest/carnival/lose"));
  277. mc.getClient().getSession().write(MaplePacketCreator.playSound("MobCarnival/Lose"));
  278. }
  279. }
  280. }
  281. for (MaplePartyCharacter mpc : leader2.getParty().getMembers()) {
  282. MapleCharacter mc;
  283. mc = cs.getPlayerStorage().getCharacterByName(mpc.getName());
  284. if (mc != null) {
  285. if (!redWin) {
  286. mc.getClient().getSession().write(MaplePacketCreator.showEffect("quest/carnival/win"));
  287. mc.getClient().getSession().write(MaplePacketCreator.playSound("MobCarnival/Win"));
  288. } else {
  289. mc.getClient().getSession().write(MaplePacketCreator.showEffect("quest/carnival/lose"));
  290. mc.getClient().getSession().write(MaplePacketCreator.playSound("MobCarnival/Lose"));
  291. }
  292. }
  293. }
  294. }
  295. public MapleParty getRed() {
  296. return p1;
  297. }
  298. public void setRed(MapleParty p1) {
  299. this.p1 = p1;
  300. }
  301. public MapleParty getBlue() {
  302. return p2;
  303. }
  304. public void setBlue(MapleParty p2) {
  305. this.p2 = p2;
  306. }
  307. public MapleCharacter getLeader1() {
  308. return leader1;
  309. }
  310. public void setLeader1(MapleCharacter leader1) {
  311. this.leader1 = leader1;
  312. }
  313. public MapleCharacter getLeader2() {
  314. return leader2;
  315. }
  316. public void setLeader2(MapleCharacter leader2) {
  317. this.leader2 = leader2;
  318. }
  319. public MapleCharacter getEnemyLeader(int team) {
  320. switch (team) {
  321. case 0:
  322. return leader2;
  323. case 1:
  324. return leader1;
  325. }
  326. return null;
  327. }
  328. public int getBlueCP() {
  329. return blueCP;
  330. }
  331. public void setBlueCP(int blueCP) {
  332. this.blueCP = blueCP;
  333. }
  334. public int getBlueTotalCP() {
  335. return blueTotalCP;
  336. }
  337. public void setBlueTotalCP(int blueTotalCP) {
  338. this.blueTotalCP = blueTotalCP;
  339. }
  340. public int getRedCP() {
  341. return redCP;
  342. }
  343. public void setRedCP(int redCP) {
  344. this.redCP = redCP;
  345. }
  346. public int getRedTotalCP() {
  347. return redTotalCP;
  348. }
  349. public void setRedTotalCP(int redTotalCP) {
  350. this.redTotalCP = redTotalCP;
  351. }
  352. public int getTotalCP(int team) {
  353. if (team == 0)
  354. return redTotalCP;
  355. else if (team == 1)
  356. return blueTotalCP;
  357. else
  358. throw new RuntimeException("Unknown team");
  359. }
  360. public void setTotalCP(int totalCP, int team) {
  361. if (team == 0)
  362. this.redTotalCP = totalCP;
  363. else if (team == 1)
  364. this.blueTotalCP = totalCP;
  365. }
  366. public int getCP(int team) {
  367. if (team == 0)
  368. return redCP;
  369. else if (team == 1)
  370. return blueCP;
  371. else
  372. throw new RuntimeException("Unknown team");
  373. }
  374. public void setCP(int CP, int team) {
  375. if (team == 0)
  376. this.redCP = CP;
  377. else if (team == 1)
  378. this.blueCP = CP;
  379. }
  380. }