Advertisement
horato

AioNpcInstance

Aug 22nd, 2011
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 43.44 KB | None | 0 0
  1. ### Eclipse Workspace Patch 1.0
  2. #P L2J_Server_BETA
  3. Index: java/com/l2jserver/gameserver/model/actor/instance/L2AioNpcInstance.java
  4. ===================================================================
  5. --- java/com/l2jserver/gameserver/model/actor/instance/L2AioNpcInstance.java (revision 0)
  6. +++ java/com/l2jserver/gameserver/model/actor/instance/L2AioNpcInstance.java (revision 0)
  7. @@ -0,0 +1,1289 @@
  8. +/*
  9. + * This program is free software: you can redistribute it and/or modify it under
  10. + * the terms of the GNU General Public License as published by the Free Software
  11. + * Foundation, either version 3 of the License, or (at your option) any later
  12. + * version.
  13. + *
  14. + * This program is distributed in the hope that it will be useful, but WITHOUT
  15. + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  16. + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  17. + * details.
  18. + *
  19. + * You should have received a copy of the GNU General Public License along with
  20. + * this program. If not, see <http://www.gnu.org/licenses/>.
  21. + */
  22. +package com.l2jserver.gameserver.model.actor.instance;
  23. +
  24. +import java.util.Iterator;
  25. +import java.util.Set;
  26. +
  27. +import javolution.util.FastList;
  28. +
  29. +import com.l2jserver.Config;
  30. +import com.l2jserver.gameserver.datatables.CharTemplateTable;
  31. +import com.l2jserver.gameserver.datatables.ClanTable;
  32. +import com.l2jserver.gameserver.datatables.MultiSell;
  33. +import com.l2jserver.gameserver.datatables.SkillTable;
  34. +import com.l2jserver.gameserver.datatables.SkillTreesData;
  35. +import com.l2jserver.gameserver.instancemanager.CastleManager;
  36. +import com.l2jserver.gameserver.instancemanager.FortManager;
  37. +import com.l2jserver.gameserver.instancemanager.FortSiegeManager;
  38. +import com.l2jserver.gameserver.instancemanager.QuestManager;
  39. +import com.l2jserver.gameserver.instancemanager.SiegeManager;
  40. +import com.l2jserver.gameserver.model.L2Clan;
  41. +import com.l2jserver.gameserver.model.L2ClanMember;
  42. +import com.l2jserver.gameserver.model.L2ItemInstance;
  43. +import com.l2jserver.gameserver.model.L2Skill;
  44. +import com.l2jserver.gameserver.model.L2SkillLearn;
  45. +import com.l2jserver.gameserver.model.L2Clan.SubPledge;
  46. +import com.l2jserver.gameserver.model.actor.L2Npc;
  47. +import com.l2jserver.gameserver.model.base.ClassId;
  48. +import com.l2jserver.gameserver.model.base.PlayerClass;
  49. +import com.l2jserver.gameserver.model.base.Race;
  50. +import com.l2jserver.gameserver.model.base.SubClass;
  51. +import com.l2jserver.gameserver.model.entity.Castle;
  52. +import com.l2jserver.gameserver.model.entity.Fort;
  53. +import com.l2jserver.gameserver.model.olympiad.Olympiad;
  54. +import com.l2jserver.gameserver.model.quest.QuestState;
  55. +import com.l2jserver.gameserver.network.SystemMessageId;
  56. +import com.l2jserver.gameserver.network.serverpackets.AcquireSkillList;
  57. +import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
  58. +import com.l2jserver.gameserver.network.serverpackets.ExBrExtraUserInfo;
  59. +import com.l2jserver.gameserver.network.serverpackets.MagicSkillLaunched;
  60. +import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse;
  61. +import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
  62. +import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  63. +import com.l2jserver.gameserver.network.serverpackets.UserInfo;
  64. +import com.l2jserver.gameserver.network.serverpackets.AcquireSkillList.SkillType;
  65. +import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
  66. +import com.l2jserver.gameserver.util.Util;
  67. +import com.l2jserver.util.StringUtil;
  68. +
  69. +public class L2AioNpcInstance extends L2Npc
  70. +{
  71. +
  72. + public L2AioNpcInstance(int objectId, L2NpcTemplate template)
  73. + {
  74. + super(objectId, template);
  75. + setIsInvul(false);
  76. + }
  77. +
  78. + @Override
  79. + public String getHtmlPath(int npcId, int val)
  80. + {
  81. + String pom = "";
  82. +
  83. + if (val == 0)
  84. + pom = "" + npcId;
  85. + else
  86. + pom = npcId + "-" + val;
  87. +
  88. + return "data/html/default/" + pom + ".htm";
  89. + }
  90. +
  91. + @Override
  92. + public void onBypassFeedback(L2PcInstance player, String command)
  93. + {
  94. + final int[] _itemsIds = { 10280, 10281, 10282, 10283, 10284, 10285, 10286, 10287, 10288, 10289, 10290, 10291, 10292, 10293, 10294, 10612 };
  95. + final String htmlFolder = "data/html/masterTransformation/";
  96. + final int feeDeleteSubClassSkills = 10000000;
  97. + final String[] _questVarNames = { "EmergentAbility65-", "EmergentAbility70-", "ClassAbility75-", "ClassAbility80-" };
  98. +
  99. + String[] commandStr = command.split(" ");
  100. + String actualCommand = commandStr[0]; // Get actual command
  101. +
  102. + String cmdParams = "";
  103. + String cmdParams2 = "";
  104. +
  105. + if (commandStr.length >= 2)
  106. + cmdParams = commandStr[1];
  107. + if (commandStr.length >= 3)
  108. + cmdParams2 = commandStr[2];
  109. +
  110. + if (command.startsWith("ShowOlyManager"))
  111. + {
  112. + String filename = null;
  113. + if (player.isNoble())
  114. + filename = Olympiad.OLYMPIAD_HTML_PATH + "noble_main.htm";
  115. + else
  116. + filename = "data/html/default/aio/oly/31688.htm";
  117. + showChatWindow(player, filename);
  118. + }
  119. + else if (command.startsWith("ShowOlyMonument"))
  120. + {
  121. + String filename = null;
  122. + if (player.isHero() || player.isNoble())
  123. + filename = Olympiad.OLYMPIAD_HTML_PATH + "hero_main.htm";
  124. + else
  125. + filename = "data/html/default/31690.htm";
  126. + showChatWindow(player, filename);
  127. + }
  128. +
  129. + else if (actualCommand.equalsIgnoreCase("create_clan"))
  130. + {
  131. + if (cmdParams.isEmpty())
  132. + return;
  133. +
  134. + ClanTable.getInstance().createClan(player, cmdParams);
  135. + }
  136. + else if (actualCommand.equalsIgnoreCase("create_academy"))
  137. + {
  138. + if (cmdParams.isEmpty())
  139. + return;
  140. +
  141. + createSubPledge(player, cmdParams, null, L2Clan.SUBUNIT_ACADEMY, 5);
  142. + }
  143. + else if (actualCommand.equalsIgnoreCase("rename_pledge"))
  144. + {
  145. + if (cmdParams.isEmpty() || cmdParams2.isEmpty())
  146. + return;
  147. +
  148. + renameSubPledge(player, Integer.valueOf(cmdParams), cmdParams2);
  149. + }
  150. + else if (actualCommand.equalsIgnoreCase("create_royal"))
  151. + {
  152. + if (cmdParams.isEmpty())
  153. + return;
  154. +
  155. + createSubPledge(player, cmdParams, cmdParams2, L2Clan.SUBUNIT_ROYAL1, 6);
  156. + }
  157. + else if (actualCommand.equalsIgnoreCase("create_knight"))
  158. + {
  159. + if (cmdParams.isEmpty())
  160. + return;
  161. +
  162. + createSubPledge(player, cmdParams, cmdParams2, L2Clan.SUBUNIT_KNIGHT1, 7);
  163. + }
  164. + else if (actualCommand.equalsIgnoreCase("assign_subpl_leader"))
  165. + {
  166. + if (cmdParams.isEmpty())
  167. + return;
  168. +
  169. + assignSubPledgeLeader(player, cmdParams, cmdParams2);
  170. + }
  171. + else if (actualCommand.equalsIgnoreCase("create_ally"))
  172. + {
  173. + if (cmdParams.isEmpty())
  174. + return;
  175. +
  176. + if (player.getClan() == null)
  177. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.ONLY_CLAN_LEADER_CREATE_ALLIANCE));
  178. + else
  179. + player.getClan().createAlly(player, cmdParams);
  180. + }
  181. + else if (actualCommand.equalsIgnoreCase("dissolve_ally"))
  182. + {
  183. + player.getClan().dissolveAlly(player);
  184. + }
  185. + else if (actualCommand.equalsIgnoreCase("dissolve_clan"))
  186. + {
  187. + dissolveClan(player, player.getClanId());
  188. + }
  189. + else if (actualCommand.equalsIgnoreCase("change_clan_leader"))
  190. + {
  191. + if (cmdParams.isEmpty())
  192. + return;
  193. +
  194. + changeClanLeader(player, cmdParams);
  195. + }
  196. + else if (actualCommand.equalsIgnoreCase("recover_clan"))
  197. + {
  198. + recoverClan(player, player.getClanId());
  199. + }
  200. + else if (actualCommand.equalsIgnoreCase("increase_clan_level"))
  201. + {
  202. + if (player.getClan().levelUpClan(player))
  203. + {
  204. + player.broadcastPacket(new MagicSkillUse(player, 5103, 1, 0, 0));
  205. + player.broadcastPacket(new MagicSkillLaunched(player, 5103, 1));
  206. + }
  207. + }
  208. + else if (actualCommand.equalsIgnoreCase("learn_clan_skills"))
  209. + {
  210. + showPledgeSkillList(player);
  211. + }
  212. + else if (command.startsWith("Subclass"))
  213. + {
  214. + // Subclasses may not be changed while a skill is in use.
  215. + if (player.isCastingNow() || player.isAllSkillsDisabled())
  216. + {
  217. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.SUBCLASS_NO_CHANGE_OR_CREATE_WHILE_SKILL_IN_USE));
  218. + return;
  219. + }
  220. +
  221. + NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
  222. +
  223. + if (player.getTransformation() != null)
  224. + {
  225. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_NoTransformed.htm");
  226. + player.sendPacket(html);
  227. + return;
  228. + }
  229. +
  230. + int cmdChoice = 0;
  231. + int paramOne = 0;
  232. + int paramTwo = 0;
  233. +
  234. + try
  235. + {
  236. + cmdChoice = Integer.parseInt(command.substring(9, 10).trim());
  237. +
  238. + int endIndex = command.indexOf(' ', 11);
  239. + if (endIndex == -1)
  240. + endIndex = command.length();
  241. +
  242. + paramOne = Integer.parseInt(command.substring(11, endIndex).trim());
  243. + if (command.length() > endIndex)
  244. + paramTwo = Integer.parseInt(command.substring(endIndex).trim());
  245. + }
  246. + catch (Exception NumberFormatException)
  247. + {
  248. + }
  249. +
  250. + switch (cmdChoice)
  251. + {
  252. + case 0: // Subclass change menu
  253. + html.setFile(player.getHtmlPrefix(), getSubClassMenu(player.getRace()));
  254. + break;
  255. + case 1: // Add Subclass - Initial
  256. + // Avoid giving player an option to add a new sub class, if they have three already.
  257. + if (player.getTotalSubClasses() >= Config.MAX_SUBCLASS)
  258. + {
  259. + html.setFile(player.getHtmlPrefix(), getSubClassFail());
  260. + break;
  261. + }
  262. +
  263. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_Add.htm");
  264. + final StringBuilder content1 = StringUtil.startAppend(200);
  265. + Set<PlayerClass> subsAvailable = getAvailableSubClasses(player);
  266. +
  267. + if (subsAvailable != null && !subsAvailable.isEmpty())
  268. + {
  269. + for (PlayerClass subClass : subsAvailable)
  270. + {
  271. + StringUtil.append(content1, "<a action=\"bypass -h npc_%objectId%_Subclass 4 ", String.valueOf(subClass.ordinal()), "\" msg=\"1268;", formatClassForDisplay(subClass), "\">", formatClassForDisplay(subClass), "</a><br>");
  272. + }
  273. + }
  274. + else
  275. + {
  276. + // TODO: Retail message
  277. + player.sendMessage("There are no sub classes available at this time.");
  278. + return;
  279. + }
  280. + html.replace("%list%", content1.toString());
  281. + break;
  282. + case 2: // Change Class - Initial
  283. + if (player.getSubClasses().isEmpty())
  284. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ChangeNo.htm");
  285. + else
  286. + {
  287. + final StringBuilder content2 = StringUtil.startAppend(200);
  288. +
  289. + if (checkVillageMaster(player.getBaseClass()))
  290. + {
  291. + StringUtil.append(content2, "<a action=\"bypass -h npc_%objectId%_Subclass 5 0\">", CharTemplateTable.getInstance().getClassNameById(player.getBaseClass()), "</a><br>");
  292. + }
  293. +
  294. + for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext();)
  295. + {
  296. + SubClass subClass = subList.next();
  297. + if (checkVillageMaster(subClass.getClassDefinition()))
  298. + {
  299. + StringUtil.append(content2, "<a action=\"bypass -h npc_%objectId%_Subclass 5 ", String.valueOf(subClass.getClassIndex()), "\">", formatClassForDisplay(subClass.getClassDefinition()), "</a><br>");
  300. + }
  301. + }
  302. +
  303. + if (content2.length() > 0)
  304. + {
  305. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_Change.htm");
  306. + html.replace("%list%", content2.toString());
  307. + }
  308. + else
  309. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ChangeNotFound.htm");
  310. + }
  311. + break;
  312. + case 3: // Change/Cancel Subclass - Initial
  313. + if (player.getSubClasses() == null || player.getSubClasses().isEmpty())
  314. + {
  315. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyEmpty.htm");
  316. + break;
  317. + }
  318. +
  319. + // custom value
  320. + if (player.getTotalSubClasses() > 3)
  321. + {
  322. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyCustom.htm");
  323. + final StringBuilder content3 = StringUtil.startAppend(200);
  324. + int classIndex = 1;
  325. +
  326. + for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext();)
  327. + {
  328. + SubClass subClass = subList.next();
  329. +
  330. + StringUtil.append(content3, "Sub-class ", String.valueOf(classIndex++), "<br>", "<a action=\"bypass -h npc_%objectId%_Subclass 6 ", String.valueOf(subClass.getClassIndex()), "\">", CharTemplateTable.getInstance().getClassNameById(subClass.getClassId()), "</a><br>");
  331. + }
  332. + html.replace("%list%", content3.toString());
  333. + }
  334. + else
  335. + {
  336. + // retail html contain only 3 subclasses
  337. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_Modify.htm");
  338. + if (player.getSubClasses().containsKey(1))
  339. + html.replace("%sub1%", CharTemplateTable.getInstance().getClassNameById(player.getSubClasses().get(1).getClassId()));
  340. + else
  341. + html.replace("<a action=\"bypass -h npc_%objectId%_Subclass 6 1\">%sub1%</a><br>", "");
  342. +
  343. + if (player.getSubClasses().containsKey(2))
  344. + html.replace("%sub2%", CharTemplateTable.getInstance().getClassNameById(player.getSubClasses().get(2).getClassId()));
  345. + else
  346. + html.replace("<a action=\"bypass -h npc_%objectId%_Subclass 6 2\">%sub2%</a><br>", "");
  347. +
  348. + if (player.getSubClasses().containsKey(3))
  349. + html.replace("%sub3%", CharTemplateTable.getInstance().getClassNameById(player.getSubClasses().get(3).getClassId()));
  350. + else
  351. + html.replace("<a action=\"bypass -h npc_%objectId%_Subclass 6 3\">%sub3%</a><br>", "");
  352. + }
  353. + break;
  354. + case 4: // Add Subclass - Action (Subclass 4 x[x])
  355. + /*
  356. + * If the character is less than level 75 on any of their previously chosen
  357. + * classes then disallow them to change to their most recently added sub-class choice.
  358. + */
  359. +
  360. + if (!player.getFloodProtectors().getSubclass().tryPerformAction("add subclass"))
  361. + {
  362. + _log.warning("Player " + player.getName() + " has performed a subclass change too fast");
  363. + return;
  364. + }
  365. +
  366. + boolean allowAddition = true;
  367. +
  368. + if (player.getTotalSubClasses() >= Config.MAX_SUBCLASS)
  369. + allowAddition = false;
  370. +
  371. + if (player.getLevel() < 75)
  372. + allowAddition = false;
  373. +
  374. + if (allowAddition)
  375. + {
  376. + if (!player.getSubClasses().isEmpty())
  377. + {
  378. + for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext();)
  379. + {
  380. + SubClass subClass = subList.next();
  381. +
  382. + if (subClass.getLevel() < 75)
  383. + {
  384. + allowAddition = false;
  385. + break;
  386. + }
  387. + }
  388. + }
  389. + }
  390. +
  391. + /*
  392. + * If quest checking is enabled, verify if the character has completed the Mimir's Elixir (Path to Subclass)
  393. + * and Fate's Whisper (A Grade Weapon) quests by checking for instances of their unique reward items.
  394. + *
  395. + * If they both exist, remove both unique items and continue with adding the sub-class.
  396. + */
  397. + if (allowAddition && !Config.ALT_GAME_SUBCLASS_WITHOUT_QUESTS)
  398. + allowAddition = checkQuests(player);
  399. +
  400. + if (allowAddition && isValidNewSubClass(player, paramOne))
  401. + {
  402. + if (!player.addSubClass(paramOne, player.getTotalSubClasses() + 1))
  403. + return;
  404. +
  405. + player.setActiveClass(player.getTotalSubClasses());
  406. +
  407. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_AddOk.htm");
  408. +
  409. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.ADD_NEW_SUBCLASS)); // Subclass added.
  410. + }
  411. + else
  412. + html.setFile(player.getHtmlPrefix(), getSubClassFail());
  413. + break;
  414. + case 5: // Change Class - Action
  415. + /*
  416. + * If the character is less than level 75 on any of their previously chosen
  417. + * classes then disallow them to change to their most recently added sub-class choice.
  418. + *
  419. + * Note: paramOne = classIndex
  420. + */
  421. +
  422. + if (!player.getFloodProtectors().getSubclass().tryPerformAction("change class"))
  423. + {
  424. + _log.warning("Player " + player.getName() + " has performed a subclass change too fast");
  425. + return;
  426. + }
  427. +
  428. + if (player.getClassIndex() == paramOne)
  429. + {
  430. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_Current.htm");
  431. + break;
  432. + }
  433. +
  434. + if (paramOne == 0)
  435. + {
  436. + if (!checkVillageMaster(player.getBaseClass()))
  437. + return;
  438. + }
  439. + else
  440. + {
  441. + try
  442. + {
  443. + if (!checkVillageMaster(player.getSubClasses().get(paramOne).getClassDefinition()))
  444. + return;
  445. + }
  446. + catch (NullPointerException e)
  447. + {
  448. + return;
  449. + }
  450. + }
  451. +
  452. + player.setActiveClass(paramOne);
  453. +
  454. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.SUBCLASS_TRANSFER_COMPLETED)); // Transfer completed.
  455. + return;
  456. + case 6: // Change/Cancel Subclass - Choice
  457. + // validity check
  458. + if (paramOne < 1 || paramOne > Config.MAX_SUBCLASS)
  459. + return;
  460. +
  461. + subsAvailable = getAvailableSubClasses(player);
  462. +
  463. + // another validity check
  464. + if (subsAvailable == null || subsAvailable.isEmpty())
  465. + {
  466. + // TODO: Retail message
  467. + player.sendMessage("There are no sub classes available at this time.");
  468. + return;
  469. + }
  470. +
  471. + final StringBuilder content6 = StringUtil.startAppend(200);
  472. +
  473. + for (PlayerClass subClass : subsAvailable)
  474. + {
  475. + StringUtil.append(content6, "<a action=\"bypass -h npc_%objectId%_Subclass 7 ", String.valueOf(paramOne), " ", String.valueOf(subClass.ordinal()), "\" msg=\"1445;", "\">", formatClassForDisplay(subClass), "</a><br>");
  476. + }
  477. +
  478. + switch (paramOne)
  479. + {
  480. + case 1:
  481. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyChoice1.htm");
  482. + break;
  483. + case 2:
  484. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyChoice2.htm");
  485. + break;
  486. + case 3:
  487. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyChoice3.htm");
  488. + break;
  489. + default:
  490. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyChoice.htm");
  491. + }
  492. + html.replace("%list%", content6.toString());
  493. + break;
  494. + case 7: // Change Subclass - Action
  495. + /*
  496. + * Warning: the information about this subclass will be removed from the
  497. + * subclass list even if false!
  498. + */
  499. +
  500. + if (!player.getFloodProtectors().getSubclass().tryPerformAction("change class"))
  501. + {
  502. + _log.warning("Player " + player.getName() + " has performed a subclass change too fast");
  503. + return;
  504. + }
  505. +
  506. + if (!isValidNewSubClass(player, paramTwo))
  507. + return;
  508. +
  509. + if (player.modifySubClass(paramOne, paramTwo))
  510. + {
  511. + player.abortCast();
  512. + player.stopAllEffectsExceptThoseThatLastThroughDeath(); // all effects from old subclass stopped!
  513. + player.stopCubics();
  514. + player.setActiveClass(paramOne);
  515. +
  516. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/SubClass_ModifyOk.htm");
  517. + html.replace("%name%", CharTemplateTable.getInstance().getClassNameById(paramTwo));
  518. +
  519. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.ADD_NEW_SUBCLASS)); // Subclass added.
  520. + }
  521. + else
  522. + {
  523. + /*
  524. + * This isn't good! modifySubClass() removed subclass from memory
  525. + * we must update _classIndex! Else IndexOutOfBoundsException can turn
  526. + * up some place down the line along with other seemingly unrelated
  527. + * problems.
  528. + */
  529. + player.setActiveClass(0); // Also updates _classIndex plus switching _classid to baseclass.
  530. +
  531. + player.sendMessage("The sub class could not be added, you have been reverted to your base class.");
  532. + return;
  533. + }
  534. + break;
  535. + }
  536. +
  537. + html.replace("%objectId%", String.valueOf(getObjectId()));
  538. + player.sendPacket(html);
  539. + }
  540. + else if (command.startsWith("LearnSubClassSkill"))
  541. + {
  542. + if (player.isSubClassActive())
  543. + {
  544. + NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
  545. + html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation008.htm");
  546. + player.sendPacket(html);
  547. + }
  548. + else
  549. + {
  550. + boolean hasItems = false;
  551. + for (int i : _itemsIds)
  552. + {
  553. + if (player.getInventory().getItemByItemId(i) != null)
  554. + {
  555. + hasItems = true;
  556. + break;
  557. + }
  558. + }
  559. + if (hasItems)
  560. + {
  561. + showSubClassSkillList(player);
  562. + }
  563. + else
  564. + {
  565. + NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
  566. + html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation008.htm");
  567. + player.sendPacket(html);
  568. + }
  569. + }
  570. + return;
  571. + }
  572. + else if (command.startsWith("CancelCertification"))
  573. + {
  574. + final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
  575. + if (player.getSubClasses().size() == 0)
  576. + {
  577. + html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation007.htm");
  578. + }
  579. + else if (player.isSubClassActive())
  580. + {
  581. + html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation008.htm");
  582. + }
  583. + else if (player.getAdena() < feeDeleteSubClassSkills)
  584. + {
  585. + html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation008no.htm");
  586. + }
  587. + else
  588. + {
  589. + QuestState st = player.getQuestState("SubClassSkills");
  590. + if (st == null)
  591. + {
  592. + st = QuestManager.getInstance().getQuest("SubClassSkills").newQuestState(player);
  593. + }
  594. +
  595. + int activeCertifications = 0;
  596. + for (String varName : _questVarNames)
  597. + {
  598. + for (int i = 1; i <= Config.MAX_SUBCLASS; i++)
  599. + {
  600. + String qvar = st.getGlobalQuestVar(varName + i);
  601. + if (!qvar.isEmpty() && (qvar.endsWith(";") || !qvar.equals("0")))
  602. + {
  603. + activeCertifications++;
  604. + }
  605. + }
  606. + }
  607. + if (activeCertifications == 0)
  608. + {
  609. + html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation010no.htm");
  610. + }
  611. + else
  612. + {
  613. + for (String varName : _questVarNames)
  614. + {
  615. + for (int i = 1; i <= Config.MAX_SUBCLASS; i++)
  616. + {
  617. + final String qvarName = varName + i;
  618. + final String qvar = st.getGlobalQuestVar(qvarName);
  619. + if (qvar.endsWith(";"))
  620. + {
  621. + final String skillIdVar = qvar.replace(";", "");
  622. + if (Util.isDigit(skillIdVar))
  623. + {
  624. + int skillId = Integer.parseInt(skillIdVar);
  625. + final L2Skill sk = SkillTable.getInstance().getInfo(skillId, 1);
  626. + if (sk != null)
  627. + {
  628. + player.removeSkill(sk);
  629. + st.saveGlobalQuestVar(qvarName, "0");
  630. + }
  631. + }
  632. + else
  633. + {
  634. + _log.warning("Invalid Sub-Class Skill Id: " + skillIdVar + " for player " + player.getName() + "!");
  635. + }
  636. + }
  637. + else if (!qvar.isEmpty() && !qvar.equals("0"))
  638. + {
  639. + if (Util.isDigit(qvar))
  640. + {
  641. + final int itemObjId = Integer.parseInt(qvar);
  642. + L2ItemInstance itemInstance = player.getInventory().getItemByObjectId(itemObjId);
  643. + if (itemInstance != null)
  644. + {
  645. + player.destroyItem("CancelCertification", itemObjId, 1, player, false);
  646. + }
  647. + else
  648. + {
  649. + itemInstance = player.getWarehouse().getItemByObjectId(itemObjId);
  650. + if (itemInstance != null)
  651. + {
  652. + _log.warning("Somehow " + player.getName() + " put a certification book into warehouse!");
  653. + player.getWarehouse().destroyItem("CancelCertification", itemInstance, 1, player, false);
  654. + }
  655. + else
  656. + {
  657. + _log.warning("Somehow " + player.getName() + " deleted a certification book!");
  658. + }
  659. + }
  660. + st.saveGlobalQuestVar(qvarName, "0");
  661. + }
  662. + else
  663. + {
  664. + _log.warning("Invalid item object Id: " + qvar + " for player " + player.getName() + "!");
  665. + }
  666. + }
  667. + }
  668. + }
  669. + st.takeItems(57, 10000000);
  670. + html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation009no.htm");
  671. + player.sendSkillList();
  672. + }
  673. +
  674. + //Let's consume all certification books, even those not present in database.
  675. + L2ItemInstance itemInstance = null;
  676. + for (int itemId : _itemsIds)
  677. + {
  678. + itemInstance = player.getInventory().getItemByItemId(itemId);
  679. + if (itemInstance != null)
  680. + {
  681. + _log.warning(L2TransformManagerInstance.class.getName() + ": player " + player + " had 'extra' certification skill books while cancelling sub-class certifications!");
  682. + player.destroyItem("CancelCertificationExtraBooks", itemInstance, this, false);
  683. + }
  684. + }
  685. + }
  686. + player.sendPacket(html);
  687. + return;
  688. + }
  689. + if (command.startsWith("LearnTransformationSkill"))
  690. + {
  691. + if (canTransform(player))
  692. + {
  693. + L2TransformManagerInstance.showTransformSkillList(player);
  694. + }
  695. + else
  696. + {
  697. + NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
  698. + html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation003.htm");
  699. + player.sendPacket(html);
  700. + }
  701. + return;
  702. + }
  703. + else if (command.startsWith("BuyTransformationItems"))
  704. + {
  705. + if (canTransform(player))
  706. + {
  707. + MultiSell.getInstance().separateAndSend(32323001, player, this, false);
  708. + }
  709. + else
  710. + {
  711. + NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
  712. + html.setFile(player.getHtmlPrefix(), htmlFolder + "master_transformation004.htm");
  713. + player.sendPacket(html);
  714. + }
  715. + return;
  716. + }
  717. + else
  718. + {
  719. + // this class dont know any other commands, let forward
  720. + // the command to the parent class
  721. + super.onBypassFeedback(player, command);
  722. + }
  723. + }
  724. +
  725. + private String getSubClassMenu(Race pRace)
  726. + {
  727. + if (Config.ALT_GAME_SUBCLASS_EVERYWHERE || pRace != Race.Kamael)
  728. + return "data/html/villagemaster/SubClass.htm";
  729. +
  730. + return "data/html/villagemaster/SubClass_NoOther.htm";
  731. + }
  732. +
  733. + private String getSubClassFail()
  734. + {
  735. + return "data/html/villagemaster/SubClass_Fail.htm";
  736. + }
  737. +
  738. + private final Set<PlayerClass> getAvailableSubClasses(L2PcInstance player)
  739. + {
  740. + // get player base class
  741. + final int currentBaseId = player.getBaseClass();
  742. + final ClassId baseCID = ClassId.values()[currentBaseId];
  743. +
  744. + // we need 2nd occupation ID
  745. + final int baseClassId;
  746. + if (baseCID.level() > 2)
  747. + baseClassId = baseCID.getParent().ordinal();
  748. + else
  749. + baseClassId = currentBaseId;
  750. +
  751. + Set<PlayerClass> availSubs = PlayerClass.values()[baseClassId].getAvailableSubclasses(player);
  752. +
  753. + if (availSubs != null && !availSubs.isEmpty())
  754. + {
  755. + for (Iterator<PlayerClass> availSub = availSubs.iterator(); availSub.hasNext();)
  756. + {
  757. + PlayerClass pclass = availSub.next();
  758. +
  759. + // check for the village master
  760. + if (!checkVillageMaster(pclass))
  761. + {
  762. + availSub.remove();
  763. + continue;
  764. + }
  765. +
  766. + // scan for already used subclasses
  767. + int availClassId = pclass.ordinal();
  768. + ClassId cid = ClassId.values()[availClassId];
  769. + for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext();)
  770. + {
  771. + SubClass prevSubClass = subList.next();
  772. + ClassId subClassId = ClassId.values()[prevSubClass.getClassId()];
  773. +
  774. + if (subClassId.equalsOrChildOf(cid))
  775. + {
  776. + availSub.remove();
  777. + break;
  778. + }
  779. + }
  780. + }
  781. + }
  782. +
  783. + return availSubs;
  784. + }
  785. +
  786. + private static final String formatClassForDisplay(PlayerClass className)
  787. + {
  788. + String classNameStr = className.toString();
  789. + char[] charArray = classNameStr.toCharArray();
  790. +
  791. + for (int i = 1; i < charArray.length; i++)
  792. + {
  793. + if (Character.isUpperCase(charArray[i]))
  794. + classNameStr = classNameStr.substring(0, i) + " " + classNameStr.substring(i);
  795. + }
  796. +
  797. + return classNameStr;
  798. + }
  799. +
  800. + private final boolean checkVillageMaster(PlayerClass pclass)
  801. + {
  802. + if (Config.ALT_GAME_SUBCLASS_EVERYWHERE)
  803. + return true;
  804. +
  805. + return checkVillageMasterRace(pclass) && checkVillageMasterTeachType(pclass);
  806. + }
  807. +
  808. + private final boolean checkVillageMaster(int classId)
  809. + {
  810. + return checkVillageMaster(PlayerClass.values()[classId]);
  811. + }
  812. +
  813. + private static final Iterator<SubClass> iterSubClasses(L2PcInstance player)
  814. + {
  815. + return player.getSubClasses().values().iterator();
  816. + }
  817. +
  818. + private boolean checkQuests(L2PcInstance player)
  819. + {
  820. + // Noble players can add subbclasses without quests
  821. + if (player.isNoble())
  822. + return true;
  823. +
  824. + QuestState qs = player.getQuestState("234_FatesWhisper");
  825. + if (qs == null || !qs.isCompleted())
  826. + return false;
  827. +
  828. + qs = player.getQuestState("235_MimirsElixir");
  829. + if (qs == null || !qs.isCompleted())
  830. + return false;
  831. +
  832. + return true;
  833. + }
  834. +
  835. + private final boolean isValidNewSubClass(L2PcInstance player, int classId)
  836. + {
  837. + if (!checkVillageMaster(classId))
  838. + return false;
  839. +
  840. + final ClassId cid = ClassId.values()[classId];
  841. + for (Iterator<SubClass> subList = iterSubClasses(player); subList.hasNext();)
  842. + {
  843. + SubClass sub = subList.next();
  844. + ClassId subClassId = ClassId.values()[sub.getClassId()];
  845. +
  846. + if (subClassId.equalsOrChildOf(cid))
  847. + return false;
  848. + }
  849. +
  850. + // get player base class
  851. + final int currentBaseId = player.getBaseClass();
  852. + final ClassId baseCID = ClassId.values()[currentBaseId];
  853. +
  854. + // we need 2nd occupation ID
  855. + final int baseClassId;
  856. + if (baseCID.level() > 2)
  857. + baseClassId = baseCID.getParent().ordinal();
  858. + else
  859. + baseClassId = currentBaseId;
  860. +
  861. + Set<PlayerClass> availSubs = PlayerClass.values()[baseClassId].getAvailableSubclasses(player);
  862. + if (availSubs == null || availSubs.isEmpty())
  863. + return false;
  864. +
  865. + boolean found = false;
  866. + for (Iterator<PlayerClass> availSub = availSubs.iterator(); availSub.hasNext();)
  867. + {
  868. + PlayerClass pclass = availSub.next();
  869. + if (pclass.ordinal() == classId)
  870. + {
  871. + found = true;
  872. + break;
  873. + }
  874. + }
  875. +
  876. + return found;
  877. + }
  878. +
  879. + private boolean checkVillageMasterRace(PlayerClass pclass)
  880. + {
  881. + return true;
  882. + }
  883. +
  884. + private boolean checkVillageMasterTeachType(PlayerClass pclass)
  885. + {
  886. + return true;
  887. + }
  888. +
  889. + private static final void createSubPledge(L2PcInstance player, String clanName, String leaderName, int pledgeType, int minClanLvl)
  890. + {
  891. + if (!player.isClanLeader())
  892. + {
  893. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT));
  894. + return;
  895. + }
  896. +
  897. + final L2Clan clan = player.getClan();
  898. + if (clan.getLevel() < minClanLvl)
  899. + {
  900. + if (pledgeType == L2Clan.SUBUNIT_ACADEMY)
  901. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_DO_NOT_MEET_CRITERIA_IN_ORDER_TO_CREATE_A_CLAN_ACADEMY));
  902. + else
  903. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_DO_NOT_MEET_CRITERIA_IN_ORDER_TO_CREATE_A_MILITARY_UNIT));
  904. +
  905. + return;
  906. + }
  907. + if (!Util.isAlphaNumeric(clanName) || 2 > clanName.length())
  908. + {
  909. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CLAN_NAME_INCORRECT));
  910. + return;
  911. + }
  912. + if (clanName.length() > 16)
  913. + {
  914. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CLAN_NAME_TOO_LONG));
  915. + return;
  916. + }
  917. +
  918. + for (L2Clan tempClan : ClanTable.getInstance().getClans())
  919. + {
  920. + if (tempClan.getSubPledge(clanName) != null)
  921. + {
  922. + if (pledgeType == L2Clan.SUBUNIT_ACADEMY)
  923. + {
  924. + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_ALREADY_EXISTS);
  925. + sm.addString(clanName);
  926. + player.sendPacket(sm);
  927. + sm = null;
  928. + }
  929. + else
  930. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.ANOTHER_MILITARY_UNIT_IS_ALREADY_USING_THAT_NAME));
  931. +
  932. + return;
  933. + }
  934. + }
  935. +
  936. + if (pledgeType != L2Clan.SUBUNIT_ACADEMY)
  937. + {
  938. + if (clan.getClanMember(leaderName) == null || clan.getClanMember(leaderName).getPledgeType() != 0)
  939. + {
  940. + if (pledgeType >= L2Clan.SUBUNIT_KNIGHT1)
  941. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CAPTAIN_OF_ORDER_OF_KNIGHTS_CANNOT_BE_APPOINTED));
  942. + else if (pledgeType >= L2Clan.SUBUNIT_ROYAL1)
  943. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CAPTAIN_OF_ROYAL_GUARD_CANNOT_BE_APPOINTED));
  944. +
  945. + return;
  946. + }
  947. + }
  948. +
  949. + final int leaderId = pledgeType != L2Clan.SUBUNIT_ACADEMY ? clan.getClanMember(leaderName).getObjectId() : 0;
  950. +
  951. + if (clan.createSubPledge(player, pledgeType, leaderId, clanName) == null)
  952. + return;
  953. +
  954. + SystemMessage sm;
  955. + if (pledgeType == L2Clan.SUBUNIT_ACADEMY)
  956. + {
  957. + sm = SystemMessage.getSystemMessage(SystemMessageId.THE_S1S_CLAN_ACADEMY_HAS_BEEN_CREATED);
  958. + sm.addString(player.getClan().getName());
  959. + }
  960. + else if (pledgeType >= L2Clan.SUBUNIT_KNIGHT1)
  961. + {
  962. + sm = SystemMessage.getSystemMessage(SystemMessageId.THE_KNIGHTS_OF_S1_HAVE_BEEN_CREATED);
  963. + sm.addString(player.getClan().getName());
  964. + }
  965. + else if (pledgeType >= L2Clan.SUBUNIT_ROYAL1)
  966. + {
  967. + sm = SystemMessage.getSystemMessage(SystemMessageId.THE_ROYAL_GUARD_OF_S1_HAVE_BEEN_CREATED);
  968. + sm.addString(player.getClan().getName());
  969. + }
  970. + else
  971. + sm = SystemMessage.getSystemMessage(SystemMessageId.CLAN_CREATED);
  972. + player.sendPacket(sm);
  973. +
  974. + if (pledgeType != L2Clan.SUBUNIT_ACADEMY)
  975. + {
  976. + final L2ClanMember leaderSubPledge = clan.getClanMember(leaderName);
  977. + final L2PcInstance leaderPlayer = leaderSubPledge.getPlayerInstance();
  978. + if (leaderPlayer != null)
  979. + {
  980. + leaderPlayer.setPledgeClass(leaderSubPledge.calculatePledgeClass(leaderPlayer));
  981. + leaderPlayer.sendPacket(new UserInfo(leaderPlayer));
  982. + leaderPlayer.sendPacket(new ExBrExtraUserInfo(leaderPlayer));
  983. + }
  984. + }
  985. + }
  986. +
  987. + private static final void renameSubPledge(L2PcInstance player, int pledgeType, String pledgeName)
  988. + {
  989. + if (!player.isClanLeader())
  990. + {
  991. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT));
  992. + return;
  993. + }
  994. +
  995. + final L2Clan clan = player.getClan();
  996. + final SubPledge subPledge = player.getClan().getSubPledge(pledgeType);
  997. +
  998. + if (subPledge == null)
  999. + {
  1000. + player.sendMessage("Pledge don't exists.");
  1001. + return;
  1002. + }
  1003. + if (!Util.isAlphaNumeric(pledgeName) || 2 > pledgeName.length())
  1004. + {
  1005. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CLAN_NAME_INCORRECT));
  1006. + return;
  1007. + }
  1008. + if (pledgeName.length() > 16)
  1009. + {
  1010. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CLAN_NAME_TOO_LONG));
  1011. + return;
  1012. + }
  1013. +
  1014. + subPledge.setName(pledgeName);
  1015. + clan.updateSubPledgeInDB(subPledge.getId());
  1016. + clan.broadcastClanStatus();
  1017. + player.sendMessage("Pledge name changed.");
  1018. + }
  1019. +
  1020. + private static final void assignSubPledgeLeader(L2PcInstance player, String clanName, String leaderName)
  1021. + {
  1022. + if (!player.isClanLeader())
  1023. + {
  1024. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT));
  1025. + return;
  1026. + }
  1027. + if (leaderName.length() > 16)
  1028. + {
  1029. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.NAMING_CHARNAME_UP_TO_16CHARS));
  1030. + return;
  1031. + }
  1032. + if (player.getName().equals(leaderName))
  1033. + {
  1034. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CAPTAIN_OF_ROYAL_GUARD_CANNOT_BE_APPOINTED));
  1035. + return;
  1036. + }
  1037. +
  1038. + final L2Clan clan = player.getClan();
  1039. + final SubPledge subPledge = player.getClan().getSubPledge(clanName);
  1040. +
  1041. + if (null == subPledge || subPledge.getId() == L2Clan.SUBUNIT_ACADEMY)
  1042. + {
  1043. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CLAN_NAME_INCORRECT));
  1044. + return;
  1045. + }
  1046. + if (clan.getClanMember(leaderName) == null || (clan.getClanMember(leaderName).getPledgeType() != 0))
  1047. + {
  1048. + if (subPledge.getId() >= L2Clan.SUBUNIT_KNIGHT1)
  1049. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CAPTAIN_OF_ORDER_OF_KNIGHTS_CANNOT_BE_APPOINTED));
  1050. + else if (subPledge.getId() >= L2Clan.SUBUNIT_ROYAL1)
  1051. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CAPTAIN_OF_ROYAL_GUARD_CANNOT_BE_APPOINTED));
  1052. +
  1053. + return;
  1054. + }
  1055. +
  1056. + subPledge.setLeaderId(clan.getClanMember(leaderName).getObjectId());
  1057. + clan.updateSubPledgeInDB(subPledge.getId());
  1058. +
  1059. + final L2ClanMember leaderSubPledge = clan.getClanMember(leaderName);
  1060. + final L2PcInstance leaderPlayer = leaderSubPledge.getPlayerInstance();
  1061. + if (leaderPlayer != null)
  1062. + {
  1063. + leaderPlayer.setPledgeClass(leaderSubPledge.calculatePledgeClass(leaderPlayer));
  1064. + leaderPlayer.sendPacket(new UserInfo(leaderPlayer));
  1065. + leaderPlayer.sendPacket(new ExBrExtraUserInfo(leaderPlayer));
  1066. + }
  1067. +
  1068. + clan.broadcastClanStatus();
  1069. + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_BEEN_SELECTED_AS_CAPTAIN_OF_S2);
  1070. + sm.addString(leaderName);
  1071. + sm.addString(clanName);
  1072. + clan.broadcastToOnlineMembers(sm);
  1073. + sm = null;
  1074. + }
  1075. +
  1076. + /**
  1077. + * this displays PledgeSkillList to the player.
  1078. + * @param player
  1079. + */
  1080. + private static final void showPledgeSkillList(L2PcInstance player)
  1081. + {
  1082. + if (player.getClan() == null || !player.isClanLeader())
  1083. + {
  1084. + NpcHtmlMessage html = new NpcHtmlMessage(1);
  1085. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/NotClanLeader.htm");
  1086. + player.sendPacket(html);
  1087. + player.sendPacket(ActionFailed.STATIC_PACKET);
  1088. + return;
  1089. + }
  1090. +
  1091. + final FastList<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailablePledgeSkills(player.getClan());
  1092. + final AcquireSkillList asl = new AcquireSkillList(SkillType.Pledge);
  1093. + int counts = 0;
  1094. +
  1095. + for (L2SkillLearn s : skills)
  1096. + {
  1097. + asl.addSkill(s.getSkillId(), s.getSkillLevel(), s.getSkillLevel(), s.getLevelUpSp(), s.getSocialClass());
  1098. + counts++;
  1099. + }
  1100. +
  1101. + if (counts == 0)
  1102. + {
  1103. + if (player.getClan().getLevel() < 8)
  1104. + {
  1105. + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN_S1);
  1106. + if (player.getClan().getLevel() < 5)
  1107. + sm.addNumber(5);
  1108. + else
  1109. + sm.addNumber(player.getClan().getLevel() + 1);
  1110. + player.sendPacket(sm);
  1111. + }
  1112. + else
  1113. + {
  1114. + NpcHtmlMessage html = new NpcHtmlMessage(1);
  1115. + html.setFile(player.getHtmlPrefix(), "data/html/villagemaster/NoMoreSkills.htm");
  1116. + player.sendPacket(html);
  1117. + }
  1118. + }
  1119. + else
  1120. + {
  1121. + player.sendPacket(asl);
  1122. + }
  1123. + player.sendPacket(ActionFailed.STATIC_PACKET);
  1124. + }
  1125. +
  1126. + private static final void dissolveClan(L2PcInstance player, int clanId)
  1127. + {
  1128. + if (!player.isClanLeader())
  1129. + {
  1130. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT));
  1131. + return;
  1132. + }
  1133. +
  1134. + final L2Clan clan = player.getClan();
  1135. + if (clan.getAllyId() != 0)
  1136. + {
  1137. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_DISPERSE_THE_CLANS_IN_ALLY));
  1138. + return;
  1139. + }
  1140. + if (clan.isAtWar())
  1141. + {
  1142. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_IN_WAR));
  1143. + return;
  1144. + }
  1145. + if (clan.getHasCastle() != 0 || clan.getHasHideout() != 0 || clan.getHasFort() != 0)
  1146. + {
  1147. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_OWNING_CLAN_HALL_OR_CASTLE));
  1148. + return;
  1149. + }
  1150. +
  1151. + for (Castle castle : CastleManager.getInstance().getCastles())
  1152. + {
  1153. + if (SiegeManager.getInstance().checkIsRegistered(clan, castle.getCastleId()))
  1154. + {
  1155. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_IN_SIEGE));
  1156. + return;
  1157. + }
  1158. + }
  1159. + for (Fort fort : FortManager.getInstance().getForts())
  1160. + {
  1161. + if (FortSiegeManager.getInstance().checkIsRegistered(clan, fort.getFortId()))
  1162. + {
  1163. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_IN_SIEGE));
  1164. + return;
  1165. + }
  1166. + }
  1167. +
  1168. + if (player.isInsideZone(L2PcInstance.ZONE_SIEGE))
  1169. + {
  1170. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_DISSOLVE_WHILE_IN_SIEGE));
  1171. + return;
  1172. + }
  1173. + if (clan.getDissolvingExpiryTime() > System.currentTimeMillis())
  1174. + {
  1175. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.DISSOLUTION_IN_PROGRESS));
  1176. + return;
  1177. + }
  1178. +
  1179. + clan.setDissolvingExpiryTime(System.currentTimeMillis() + Config.ALT_CLAN_DISSOLVE_DAYS * 86400000L); //24*60*60*1000 = 86400000
  1180. + clan.updateClanInDB();
  1181. +
  1182. + ClanTable.getInstance().scheduleRemoveClan(clan.getClanId());
  1183. +
  1184. + player.sendMessage("Your clan will be dissolved after " + Config.ALT_CLAN_DISSOLVE_DAYS + " days");
  1185. +
  1186. + // The clan leader should take the XP penalty of a full death.
  1187. + player.deathPenalty(false, false, false);
  1188. + }
  1189. +
  1190. + private static final void recoverClan(L2PcInstance player, int clanId)
  1191. + {
  1192. + if (!player.isClanLeader())
  1193. + {
  1194. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT));
  1195. + return;
  1196. + }
  1197. +
  1198. + final L2Clan clan = player.getClan();
  1199. + clan.setDissolvingExpiryTime(0);
  1200. + clan.updateClanInDB();
  1201. +
  1202. + player.sendMessage("Your clan deletion has been canceled");
  1203. + }
  1204. +
  1205. + private static final void changeClanLeader(L2PcInstance player, String target)
  1206. + {
  1207. + if (!player.isClanLeader())
  1208. + {
  1209. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT));
  1210. + return;
  1211. + }
  1212. + if (player.getName().equalsIgnoreCase(target))
  1213. + return;
  1214. + /*
  1215. + * Until proper clan leader change support is done, this is a little
  1216. + * exploit fix (leader, while fliying wyvern changes clan leader and the new leader
  1217. + * can ride the wyvern too)
  1218. + * DrHouse
  1219. + */
  1220. + if (player.isFlying())
  1221. + {
  1222. + player.sendMessage("Please, stop flying");
  1223. + return;
  1224. + }
  1225. +
  1226. + final L2Clan clan = player.getClan();
  1227. +
  1228. + final L2ClanMember member = clan.getClanMember(target);
  1229. + if (member == null)
  1230. + {
  1231. + SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_DOES_NOT_EXIST);
  1232. + sm.addString(target);
  1233. + player.sendPacket(sm);
  1234. + sm = null;
  1235. + return;
  1236. + }
  1237. + if (!member.isOnline())
  1238. + {
  1239. + player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.INVITED_USER_NOT_ONLINE));
  1240. + return;
  1241. + }
  1242. + clan.setNewLeader(member);
  1243. + }
  1244. +
  1245. + public static void showSubClassSkillList(L2PcInstance player)
  1246. + {
  1247. + final FastList<L2SkillLearn> subClassSkills = SkillTreesData.getInstance().getAvailableSubClassSkills(player);
  1248. + final AcquireSkillList asl = new AcquireSkillList(AcquireSkillList.SkillType.SubClass);
  1249. + int count = 0;
  1250. +
  1251. + for (L2SkillLearn s : subClassSkills)
  1252. + {
  1253. + final L2Skill sk = SkillTable.getInstance().getInfo(s.getSkillId(), s.getSkillLevel());
  1254. + if (sk != null)
  1255. + {
  1256. + count++;
  1257. + asl.addSkill(s.getSkillId(), s.getSkillLevel(), s.getSkillLevel(), 0, 0);
  1258. + }
  1259. + }
  1260. + if (count > 0)
  1261. + {
  1262. + player.sendPacket(asl);
  1263. + }
  1264. + else
  1265. + {
  1266. + player.sendPacket(SystemMessageId.NO_MORE_SKILLS_TO_LEARN);
  1267. + }
  1268. + }
  1269. +
  1270. + private static boolean canTransform(L2PcInstance player)
  1271. + {
  1272. + if (Config.ALLOW_TRANSFORM_WITHOUT_QUEST)
  1273. + {
  1274. + return true;
  1275. + }
  1276. + final QuestState st = player.getQuestState("136_MoreThanMeetsTheEye");
  1277. + if ((st != null) && st.isCompleted())
  1278. + {
  1279. + return true;
  1280. + }
  1281. + return false;
  1282. + }
  1283. +
  1284. + public void showChatWindow(L2PcInstance player, int val, String suffix)
  1285. + {
  1286. + String filename = Olympiad.OLYMPIAD_HTML_PATH;
  1287. +
  1288. + filename += "noble_desc" + val;
  1289. + filename += (suffix != null) ? suffix + ".htm" : ".htm";
  1290. +
  1291. + if (filename.equals(Olympiad.OLYMPIAD_HTML_PATH + "noble_desc0.htm"))
  1292. + filename = Olympiad.OLYMPIAD_HTML_PATH + "noble_main.htm";
  1293. +
  1294. + showChatWindow(player, filename);
  1295. + }
  1296. +}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement