SSQStatus.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. /*
  2. * Copyright (C) 2004-2015 L2J Server
  3. *
  4. * This file is part of L2J Server.
  5. *
  6. * L2J Server is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * L2J Server is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. package com.l2jserver.gameserver.network.serverpackets;
  20. import com.l2jserver.Config;
  21. import com.l2jserver.gameserver.SevenSigns;
  22. import com.l2jserver.gameserver.SevenSignsFestival;
  23. import com.l2jserver.gameserver.model.StatsSet;
  24. import com.l2jserver.gameserver.network.SystemMessageId;
  25. /**
  26. * Seven Signs Record Update
  27. * @author Tempy
  28. * @editor shansoft
  29. */
  30. public class SSQStatus extends L2GameServerPacket
  31. {
  32. private final int _objectId;
  33. private final int _page;
  34. public SSQStatus(int objectId, int recordPage)
  35. {
  36. _objectId = objectId;
  37. _page = recordPage;
  38. }
  39. @Override
  40. protected final void writeImpl()
  41. {
  42. int winningCabal = SevenSigns.getInstance().getCabalHighestScore();
  43. int totalDawnMembers = SevenSigns.getInstance().getTotalMembers(SevenSigns.CABAL_DAWN);
  44. int totalDuskMembers = SevenSigns.getInstance().getTotalMembers(SevenSigns.CABAL_DUSK);
  45. writeC(0xfb);
  46. writeC(_page);
  47. writeC(SevenSigns.getInstance().getCurrentPeriod()); // current period?
  48. int dawnPercent = 0;
  49. int duskPercent = 0;
  50. switch (_page)
  51. {
  52. case 1:
  53. // [ddd cc dd ddd c ddd c]
  54. writeD(SevenSigns.getInstance().getCurrentCycle());
  55. int currentPeriod = SevenSigns.getInstance().getCurrentPeriod();
  56. switch (currentPeriod)
  57. {
  58. case SevenSigns.PERIOD_COMP_RECRUITING:
  59. writeD(SystemMessageId.INITIAL_PERIOD.getId());
  60. break;
  61. case SevenSigns.PERIOD_COMPETITION:
  62. writeD(SystemMessageId.SSQ_COMPETITION_UNDERWAY.getId());
  63. break;
  64. case SevenSigns.PERIOD_COMP_RESULTS:
  65. writeD(SystemMessageId.RESULTS_PERIOD.getId());
  66. break;
  67. case SevenSigns.PERIOD_SEAL_VALIDATION:
  68. writeD(SystemMessageId.VALIDATION_PERIOD.getId());
  69. break;
  70. }
  71. switch (currentPeriod)
  72. {
  73. case SevenSigns.PERIOD_COMP_RECRUITING:
  74. case SevenSigns.PERIOD_COMP_RESULTS:
  75. writeD(SystemMessageId.UNTIL_TODAY_6PM.getId());
  76. break;
  77. case SevenSigns.PERIOD_COMPETITION:
  78. case SevenSigns.PERIOD_SEAL_VALIDATION:
  79. writeD(SystemMessageId.UNTIL_MONDAY_6PM.getId());
  80. break;
  81. }
  82. writeC(SevenSigns.getInstance().getPlayerCabal(_objectId));
  83. writeC(SevenSigns.getInstance().getPlayerSeal(_objectId));
  84. writeQ(SevenSigns.getInstance().getPlayerStoneContrib(_objectId)); // Seal Stones Turned-In
  85. writeQ(SevenSigns.getInstance().getPlayerAdenaCollect(_objectId)); // Ancient Adena to Collect
  86. double dawnStoneScore = SevenSigns.getInstance().getCurrentStoneScore(SevenSigns.CABAL_DAWN);
  87. int dawnFestivalScore = SevenSigns.getInstance().getCurrentFestivalScore(SevenSigns.CABAL_DAWN);
  88. double duskStoneScore = SevenSigns.getInstance().getCurrentStoneScore(SevenSigns.CABAL_DUSK);
  89. int duskFestivalScore = SevenSigns.getInstance().getCurrentFestivalScore(SevenSigns.CABAL_DUSK);
  90. double totalStoneScore = duskStoneScore + dawnStoneScore;
  91. /*
  92. * Scoring seems to be proportionate to a set base value, so base this on the maximum obtainable score from festivals, which is 500.
  93. */
  94. int duskStoneScoreProp = 0;
  95. int dawnStoneScoreProp = 0;
  96. if (totalStoneScore != 0)
  97. {
  98. duskStoneScoreProp = Math.round(((float) duskStoneScore / (float) totalStoneScore) * 500);
  99. dawnStoneScoreProp = Math.round(((float) dawnStoneScore / (float) totalStoneScore) * 500);
  100. }
  101. int duskTotalScore = SevenSigns.getInstance().getCurrentScore(SevenSigns.CABAL_DUSK);
  102. int dawnTotalScore = SevenSigns.getInstance().getCurrentScore(SevenSigns.CABAL_DAWN);
  103. int totalOverallScore = duskTotalScore + dawnTotalScore;
  104. if (totalOverallScore != 0)
  105. {
  106. dawnPercent = Math.round(((float) dawnTotalScore / (float) totalOverallScore) * 100);
  107. duskPercent = Math.round(((float) duskTotalScore / (float) totalOverallScore) * 100);
  108. }
  109. if (Config.DEBUG)
  110. {
  111. _log.info("Dusk Stone Score: " + duskStoneScore + " - Dawn Stone Score: " + dawnStoneScore);
  112. _log.info("Dusk Festival Score: " + duskFestivalScore + " - Dawn Festival Score: " + dawnFestivalScore);
  113. _log.info("Dusk Score: " + duskTotalScore + " - Dawn Score: " + dawnTotalScore);
  114. _log.info("Overall Score: " + totalOverallScore);
  115. _log.info("");
  116. if (totalStoneScore == 0)
  117. {
  118. _log.info("Dusk Prop: 0 - Dawn Prop: 0");
  119. }
  120. else
  121. {
  122. _log.info("Dusk Prop: " + ((duskStoneScore / totalStoneScore) * 500) + " - Dawn Prop: " + ((dawnStoneScore / totalStoneScore) * 500));
  123. }
  124. _log.info("Dusk %: " + duskPercent + " - Dawn %: " + dawnPercent);
  125. }
  126. /* DUSK */
  127. writeQ(duskStoneScoreProp); // Seal Stone Score
  128. writeQ(duskFestivalScore); // Festival Score
  129. writeQ(duskTotalScore); // Total Score
  130. writeC(duskPercent); // Dusk %
  131. /* DAWN */
  132. writeQ(dawnStoneScoreProp); // Seal Stone Score
  133. writeQ(dawnFestivalScore); // Festival Score
  134. writeQ(dawnTotalScore); // Total Score
  135. writeC(dawnPercent); // Dawn %
  136. break;
  137. case 2:
  138. // c cc hc [cd (dc (S))]
  139. writeH(1);
  140. writeC(5); // Total number of festivals
  141. for (int i = 0; i < 5; i++)
  142. {
  143. writeC(i + 1); // Current client-side festival ID
  144. writeD(SevenSignsFestival.FESTIVAL_LEVEL_SCORES[i]);
  145. int duskScore = SevenSignsFestival.getInstance().getHighestScore(SevenSigns.CABAL_DUSK, i);
  146. int dawnScore = SevenSignsFestival.getInstance().getHighestScore(SevenSigns.CABAL_DAWN, i);
  147. // Dusk Score \\
  148. writeQ(duskScore);
  149. StatsSet highScoreData = SevenSignsFestival.getInstance().getHighestScoreData(SevenSigns.CABAL_DUSK, i);
  150. String[] partyMembers = highScoreData.getString("members").split(",");
  151. if (partyMembers != null)
  152. {
  153. writeC(partyMembers.length);
  154. for (String partyMember : partyMembers)
  155. {
  156. writeS(partyMember);
  157. }
  158. }
  159. else
  160. {
  161. writeC(0);
  162. }
  163. // Dawn Score \\
  164. writeQ(dawnScore);
  165. highScoreData = SevenSignsFestival.getInstance().getHighestScoreData(SevenSigns.CABAL_DAWN, i);
  166. partyMembers = highScoreData.getString("members").split(",");
  167. if (partyMembers != null)
  168. {
  169. writeC(partyMembers.length);
  170. for (String partyMember : partyMembers)
  171. {
  172. writeS(partyMember);
  173. }
  174. }
  175. else
  176. {
  177. writeC(0);
  178. }
  179. }
  180. break;
  181. case 3:
  182. // c cc [ccc (cccc)]
  183. writeC(10); // Minimum limit for winning cabal to retain their seal
  184. writeC(35); // Minimum limit for winning cabal to claim a seal
  185. writeC(3); // Total number of seals
  186. for (int i = 1; i < 4; i++)
  187. {
  188. int dawnProportion = SevenSigns.getInstance().getSealProportion(i, SevenSigns.CABAL_DAWN);
  189. int duskProportion = SevenSigns.getInstance().getSealProportion(i, SevenSigns.CABAL_DUSK);
  190. if (Config.DEBUG)
  191. {
  192. _log.info(SevenSigns.getSealName(i, true) + " = Dawn Prop: " + dawnProportion + "(" + ((dawnProportion / totalDawnMembers) * 100) + "%)" + ", Dusk Prop: " + duskProportion + "(" + ((duskProportion / totalDuskMembers) * 100) + "%)");
  193. }
  194. writeC(i);
  195. writeC(SevenSigns.getInstance().getSealOwner(i));
  196. if (totalDuskMembers == 0)
  197. {
  198. if (totalDawnMembers == 0)
  199. {
  200. writeC(0);
  201. writeC(0);
  202. }
  203. else
  204. {
  205. writeC(0);
  206. writeC(Math.round(((float) dawnProportion / (float) totalDawnMembers) * 100));
  207. }
  208. }
  209. else
  210. {
  211. if (totalDawnMembers == 0)
  212. {
  213. writeC(Math.round(((float) duskProportion / (float) totalDuskMembers) * 100));
  214. writeC(0);
  215. }
  216. else
  217. {
  218. writeC(Math.round(((float) duskProportion / (float) totalDuskMembers) * 100));
  219. writeC(Math.round(((float) dawnProportion / (float) totalDawnMembers) * 100));
  220. }
  221. }
  222. }
  223. break;
  224. case 4:
  225. // c cc [cc (ccD)] CT 2.3 update
  226. writeC(winningCabal); // Overall predicted winner
  227. writeC(3); // Total number of seals
  228. for (int i = 1; i < 4; i++)
  229. {
  230. int dawnProportion = SevenSigns.getInstance().getSealProportion(i, SevenSigns.CABAL_DAWN);
  231. int duskProportion = SevenSigns.getInstance().getSealProportion(i, SevenSigns.CABAL_DUSK);
  232. dawnPercent = Math.round((dawnProportion / (totalDawnMembers == 0 ? 1 : (float) totalDawnMembers)) * 100);
  233. duskPercent = Math.round((duskProportion / (totalDuskMembers == 0 ? 1 : (float) totalDuskMembers)) * 100);
  234. int sealOwner = SevenSigns.getInstance().getSealOwner(i);
  235. writeC(i);
  236. switch (sealOwner)
  237. {
  238. case SevenSigns.CABAL_NULL:
  239. switch (winningCabal)
  240. {
  241. case SevenSigns.CABAL_NULL:
  242. writeC(SevenSigns.CABAL_NULL);
  243. writeD(SystemMessageId.COMPETITION_TIE_SEAL_NOT_AWARDED.getId());
  244. break;
  245. case SevenSigns.CABAL_DAWN:
  246. if (dawnPercent >= 35)
  247. {
  248. writeC(SevenSigns.CABAL_DAWN);
  249. writeD(SystemMessageId.SEAL_NOT_OWNED_35_MORE_VOTED.getId());
  250. }
  251. else
  252. {
  253. writeC(SevenSigns.CABAL_NULL);
  254. writeD(SystemMessageId.SEAL_NOT_OWNED_35_LESS_VOTED.getId());
  255. }
  256. break;
  257. case SevenSigns.CABAL_DUSK:
  258. if (duskPercent >= 35)
  259. {
  260. writeC(SevenSigns.CABAL_DUSK);
  261. writeD(SystemMessageId.SEAL_NOT_OWNED_35_MORE_VOTED.getId());
  262. }
  263. else
  264. {
  265. writeC(SevenSigns.CABAL_NULL);
  266. writeD(SystemMessageId.SEAL_NOT_OWNED_35_LESS_VOTED.getId());
  267. }
  268. break;
  269. }
  270. break;
  271. case SevenSigns.CABAL_DAWN:
  272. switch (winningCabal)
  273. {
  274. case SevenSigns.CABAL_NULL:
  275. if (dawnPercent >= 10)
  276. {
  277. writeC(SevenSigns.CABAL_DAWN);
  278. writeD(SystemMessageId.SEAL_OWNED_10_MORE_VOTED.getId());
  279. }
  280. else
  281. {
  282. writeC(SevenSigns.CABAL_NULL);
  283. writeD(SystemMessageId.COMPETITION_TIE_SEAL_NOT_AWARDED.getId());
  284. }
  285. break;
  286. case SevenSigns.CABAL_DAWN:
  287. if (dawnPercent >= 10)
  288. {
  289. writeC(sealOwner);
  290. writeD(SystemMessageId.SEAL_OWNED_10_MORE_VOTED.getId());
  291. }
  292. else
  293. {
  294. writeC(SevenSigns.CABAL_NULL);
  295. writeD(SystemMessageId.SEAL_OWNED_10_LESS_VOTED.getId());
  296. }
  297. break;
  298. case SevenSigns.CABAL_DUSK:
  299. if (duskPercent >= 35)
  300. {
  301. writeC(SevenSigns.CABAL_DUSK);
  302. writeD(SystemMessageId.SEAL_NOT_OWNED_35_MORE_VOTED.getId());
  303. }
  304. else if (dawnPercent >= 10)
  305. {
  306. writeC(SevenSigns.CABAL_DAWN);
  307. writeD(SystemMessageId.SEAL_OWNED_10_MORE_VOTED.getId());
  308. }
  309. else
  310. {
  311. writeC(SevenSigns.CABAL_NULL);
  312. writeD(SystemMessageId.SEAL_OWNED_10_LESS_VOTED.getId());
  313. }
  314. break;
  315. }
  316. break;
  317. case SevenSigns.CABAL_DUSK:
  318. switch (winningCabal)
  319. {
  320. case SevenSigns.CABAL_NULL:
  321. if (duskPercent >= 10)
  322. {
  323. writeC(SevenSigns.CABAL_DUSK);
  324. writeD(SystemMessageId.SEAL_OWNED_10_MORE_VOTED.getId());
  325. }
  326. else
  327. {
  328. writeC(SevenSigns.CABAL_NULL);
  329. writeD(SystemMessageId.COMPETITION_TIE_SEAL_NOT_AWARDED.getId());
  330. }
  331. break;
  332. case SevenSigns.CABAL_DAWN:
  333. if (dawnPercent >= 35)
  334. {
  335. writeC(SevenSigns.CABAL_DAWN);
  336. writeD(SystemMessageId.SEAL_NOT_OWNED_35_MORE_VOTED.getId());
  337. }
  338. else if (duskPercent >= 10)
  339. {
  340. writeC(sealOwner);
  341. writeD(SystemMessageId.SEAL_OWNED_10_MORE_VOTED.getId());
  342. }
  343. else
  344. {
  345. writeC(SevenSigns.CABAL_NULL);
  346. writeD(SystemMessageId.SEAL_OWNED_10_LESS_VOTED.getId());
  347. }
  348. break;
  349. case SevenSigns.CABAL_DUSK:
  350. if (duskPercent >= 10)
  351. {
  352. writeC(sealOwner);
  353. writeD(SystemMessageId.SEAL_OWNED_10_MORE_VOTED.getId());
  354. }
  355. else
  356. {
  357. writeC(SevenSigns.CABAL_NULL);
  358. writeD(SystemMessageId.SEAL_OWNED_10_LESS_VOTED.getId());
  359. }
  360. break;
  361. }
  362. break;
  363. }
  364. }
  365. break;
  366. }
  367. }
  368. }