RequestAquireSkill.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package net.sf.l2j.gameserver.clientpackets;
  16. import java.util.logging.Logger;
  17. import net.sf.l2j.Config;
  18. import net.sf.l2j.gameserver.datatables.SkillSpellbookTable;
  19. import net.sf.l2j.gameserver.datatables.SkillTable;
  20. import net.sf.l2j.gameserver.datatables.SkillTreeTable;
  21. import net.sf.l2j.gameserver.model.L2ItemInstance;
  22. import net.sf.l2j.gameserver.model.L2PledgeSkillLearn;
  23. import net.sf.l2j.gameserver.model.L2ShortCut;
  24. import net.sf.l2j.gameserver.model.L2Skill;
  25. import net.sf.l2j.gameserver.model.L2SkillLearn;
  26. import net.sf.l2j.gameserver.model.L2TransformSkillLearn;
  27. import net.sf.l2j.gameserver.model.actor.instance.L2FishermanInstance;
  28. import net.sf.l2j.gameserver.model.actor.instance.L2FolkInstance;
  29. import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance;
  30. import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  31. import net.sf.l2j.gameserver.model.actor.instance.L2TransformManagerInstance;
  32. import net.sf.l2j.gameserver.model.actor.instance.L2VillageMasterInstance;
  33. import net.sf.l2j.gameserver.network.SystemMessageId;
  34. import net.sf.l2j.gameserver.serverpackets.ExStorageMaxCount;
  35. import net.sf.l2j.gameserver.serverpackets.PledgeSkillList;
  36. import net.sf.l2j.gameserver.serverpackets.ShortCutRegister;
  37. import net.sf.l2j.gameserver.serverpackets.StatusUpdate;
  38. import net.sf.l2j.gameserver.serverpackets.SystemMessage;
  39. import net.sf.l2j.gameserver.util.IllegalPlayerAction;
  40. import net.sf.l2j.gameserver.util.Util;
  41. /**
  42. * This class ...
  43. *
  44. * @version $Revision: 1.7.2.1.2.4 $ $Date: 2005/03/27 15:29:30 $
  45. */
  46. public class RequestAquireSkill extends L2GameClientPacket
  47. {
  48. private static final String _C__6C_REQUESTAQUIRESKILL = "[C] 6C RequestAquireSkill";
  49. private static Logger _log = Logger.getLogger(RequestAquireSkill.class.getName());
  50. private int _id;
  51. private int _level;
  52. private int _skillType;
  53. @Override
  54. protected void readImpl()
  55. {
  56. _id = readD();
  57. _level = readD();
  58. _skillType = readD();
  59. }
  60. @Override
  61. protected void runImpl()
  62. {
  63. L2PcInstance player = getClient().getActiveChar();
  64. if (player == null)
  65. return;
  66. if (player.isTransformed())
  67. {
  68. _log.warning("possible cheater: "+player.getName()+" attempting to learn a skill while he/she is transformed! < Ban him/her!");
  69. player.closeNetConnection();
  70. return;
  71. }
  72. L2FolkInstance trainer = player.getLastFolkNPC();
  73. if (trainer == null)
  74. return;
  75. int npcid = trainer.getNpcId();
  76. if (!player.isInsideRadius(trainer, L2NpcInstance.INTERACTION_DISTANCE, false, false)
  77. && !player.isGM())
  78. return;
  79. if (!Config.ALT_GAME_SKILL_LEARN)
  80. player.setSkillLearningClassId(player.getClassId());
  81. if (player.getSkillLevel(_id) >= _level)
  82. {
  83. // already knows the skill with this level
  84. return;
  85. }
  86. L2Skill skill = SkillTable.getInstance().getInfo(_id, _level);
  87. int counts = 0;
  88. int _requiredSp = 10000000;
  89. switch (_skillType)
  90. {
  91. case 0:
  92. {
  93. if (trainer instanceof L2TransformManagerInstance) // transform skills
  94. {
  95. int costid = 0;
  96. // Skill Learn bug Fix
  97. L2TransformSkillLearn[] skillst = SkillTreeTable.getInstance().getAvailableTransformSkills(player);
  98. for (L2TransformSkillLearn s : skillst)
  99. {
  100. L2Skill sk = SkillTable.getInstance().getInfo(s.getId(),s.getLevel());
  101. if (sk == null || sk != skill)
  102. continue;
  103. counts++;
  104. costid = s.getItemId();
  105. _requiredSp = s.getSpCost();
  106. }
  107. if (counts == 0)
  108. {
  109. player.sendMessage("You are trying to learn skill that u can't..");
  110. Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " tried to learn skill that he can't!!!", IllegalPlayerAction.PUNISH_KICK);
  111. return;
  112. }
  113. if (player.getSp() >= _requiredSp)
  114. {
  115. if (!player.destroyItemByItemId("Consume", costid, 1, trainer, false))
  116. {
  117. // Haven't spellbook
  118. player.sendPacket(new SystemMessage(SystemMessageId.ITEM_MISSING_TO_LEARN_SKILL));
  119. return;
  120. }
  121. SystemMessage sm = new SystemMessage(SystemMessageId.S2_S1_DISAPPEARED);
  122. sm.addItemName(costid);
  123. sm.addNumber(1);
  124. sendPacket(sm);
  125. sm = null;
  126. }
  127. else
  128. {
  129. SystemMessage sm = new SystemMessage(SystemMessageId.NOT_ENOUGH_SP_TO_LEARN_SKILL);
  130. player.sendPacket(sm);
  131. sm = null;
  132. return;
  133. }
  134. break;
  135. }
  136. // normal skills
  137. L2SkillLearn[] skills = SkillTreeTable.getInstance().getAvailableSkills(player, player.getSkillLearningClassId());
  138. for (L2SkillLearn s : skills)
  139. {
  140. L2Skill sk = SkillTable.getInstance().getInfo(s.getId(),
  141. s.getLevel());
  142. if (sk == null || sk != skill || !sk.getCanLearn(player.getSkillLearningClassId())
  143. || !sk.canTeachBy(npcid))
  144. continue;
  145. counts++;
  146. _requiredSp = SkillTreeTable.getInstance().getSkillCost(player,skill);
  147. }
  148. if (counts == 0 && !Config.ALT_GAME_SKILL_LEARN)
  149. {
  150. player.sendMessage("You are trying to learn skill that u can't..");
  151. Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " tried to learn skill that he can't!!!", IllegalPlayerAction.PUNISH_KICK);
  152. return;
  153. }
  154. if (player.getSp() >= _requiredSp)
  155. {
  156. if (Config.SP_BOOK_NEEDED)
  157. {
  158. int spbId = -1;
  159. if (skill.getId() == L2Skill.SKILL_DIVINE_INSPIRATION)
  160. spbId = SkillSpellbookTable.getInstance().getBookForSkill(skill, _level);
  161. else
  162. spbId = SkillSpellbookTable.getInstance().getBookForSkill(skill);
  163. if (skill.getId() == L2Skill.SKILL_DIVINE_INSPIRATION || skill.getLevel() == 1 && spbId > -1)
  164. {
  165. L2ItemInstance spb = player.getInventory().getItemByItemId(spbId);
  166. if (spb == null)
  167. {
  168. // Haven't spellbook
  169. player.sendPacket(new SystemMessage(SystemMessageId.ITEM_MISSING_TO_LEARN_SKILL));
  170. return;
  171. }
  172. // ok
  173. player.destroyItem("Consume", spb.getObjectId(), 1, trainer, true);
  174. }
  175. }
  176. }
  177. else
  178. {
  179. SystemMessage sm = new SystemMessage(
  180. SystemMessageId.NOT_ENOUGH_SP_TO_LEARN_SKILL);
  181. player.sendPacket(sm);
  182. sm = null;
  183. return;
  184. }
  185. break;
  186. }
  187. case 1:
  188. {
  189. int costid = 0;
  190. int costcount = 0;
  191. // Skill Learn bug Fix
  192. L2SkillLearn[] skillsc = SkillTreeTable.getInstance().getAvailableSkills(player);
  193. for (L2SkillLearn s : skillsc)
  194. {
  195. L2Skill sk = SkillTable.getInstance().getInfo(s.getId(),s.getLevel());
  196. if (sk == null || sk != skill)
  197. continue;
  198. counts++;
  199. costid = s.getIdCost();
  200. costcount = s.getCostCount();
  201. _requiredSp = s.getSpCost();
  202. }
  203. if (counts == 0)
  204. {
  205. player.sendMessage("You are trying to learn skill that u can't..");
  206. Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " tried to learn skill that he can't!!!", IllegalPlayerAction.PUNISH_KICK);
  207. return;
  208. }
  209. if (player.getSp() >= _requiredSp)
  210. {
  211. if (!player.destroyItemByItemId("Consume", costid, costcount, trainer, false))
  212. {
  213. // Haven't spellbook
  214. player.sendPacket(new SystemMessage(SystemMessageId.ITEM_MISSING_TO_LEARN_SKILL));
  215. return;
  216. }
  217. SystemMessage sm = new SystemMessage(SystemMessageId.S2_S1_DISAPPEARED);
  218. sm.addItemName(costid);
  219. sm.addNumber(costcount);
  220. sendPacket(sm);
  221. sm = null;
  222. }
  223. else
  224. {
  225. SystemMessage sm = new SystemMessage(SystemMessageId.NOT_ENOUGH_SP_TO_LEARN_SKILL);
  226. player.sendPacket(sm);
  227. sm = null;
  228. return;
  229. }
  230. break;
  231. }
  232. case 2:
  233. {
  234. if (!player.isClanLeader())
  235. {
  236. // TODO: Find and add system msg
  237. player.sendMessage("This feature is available only for the clan leader");
  238. return;
  239. }
  240. int itemId = 0;
  241. int repCost = 100000000;
  242. // Skill Learn bug Fix
  243. L2PledgeSkillLearn[] skills = SkillTreeTable.getInstance().getAvailablePledgeSkills(player);
  244. for (L2PledgeSkillLearn s : skills)
  245. {
  246. L2Skill sk = SkillTable.getInstance().getInfo(s.getId(), s.getLevel());
  247. if (sk == null || sk != skill)
  248. continue;
  249. counts++;
  250. itemId = s.getItemId();
  251. repCost = s.getRepCost();
  252. }
  253. if (counts == 0)
  254. {
  255. player.sendMessage("You are trying to learn skill that u can't..");
  256. Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " tried to learn skill that he can't!!!", IllegalPlayerAction.PUNISH_KICK);
  257. return;
  258. }
  259. if (player.getClan().getReputationScore() >= repCost)
  260. {
  261. if (Config.LIFE_CRYSTAL_NEEDED)
  262. {
  263. if (!player.destroyItemByItemId("Consume", itemId, 1, trainer, false))
  264. {
  265. // Haven't spellbook
  266. player.sendPacket(new SystemMessage(SystemMessageId.ITEM_MISSING_TO_LEARN_SKILL));
  267. return;
  268. }
  269. SystemMessage sm = new SystemMessage(SystemMessageId.S2_S1_DISAPPEARED);
  270. sm.addItemName(itemId);
  271. sm.addNumber(1);
  272. sendPacket(sm);
  273. sm = null;
  274. }
  275. }
  276. else
  277. {
  278. SystemMessage sm = new SystemMessage(SystemMessageId.ACQUIRE_SKILL_FAILED_BAD_CLAN_REP_SCORE);
  279. player.sendPacket(sm);
  280. return;
  281. }
  282. player.getClan().setReputationScore(player.getClan().getReputationScore()-repCost, true);
  283. player.getClan().addNewSkill(skill);
  284. if (Config.DEBUG)
  285. _log.fine("Learned pledge skill " + _id + " for " + _requiredSp + " SP.");
  286. SystemMessage cr = new SystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP);
  287. cr.addNumber(repCost);
  288. player.sendPacket(cr);
  289. SystemMessage sm = new SystemMessage(SystemMessageId.CLAN_SKILL_S1_ADDED);
  290. sm.addSkillName(_id);
  291. player.sendPacket(sm);
  292. sm = null;
  293. player.getClan().broadcastToOnlineMembers(new PledgeSkillList(player.getClan()));
  294. for(L2PcInstance member: player.getClan().getOnlineMembers(0))
  295. {
  296. member.sendSkillList();
  297. }
  298. ((L2VillageMasterInstance)trainer).showPledgeSkillList(player); //Maybe we shoud add a check here...
  299. return;
  300. }
  301. default:
  302. {
  303. _log.warning("Recived Wrong Packet Data in Aquired Skill - unk1:" + _skillType);
  304. return;
  305. }
  306. }
  307. player.addSkill(skill, true);
  308. if (Config.DEBUG)
  309. _log.fine("Learned skill " + _id + " for " + _requiredSp + " SP.");
  310. player.setSp(player.getSp() - _requiredSp);
  311. StatusUpdate su = new StatusUpdate(player.getObjectId());
  312. su.addAttribute(StatusUpdate.SP, player.getSp());
  313. player.sendPacket(su);
  314. SystemMessage sm = new SystemMessage(SystemMessageId.LEARNED_SKILL_S1);
  315. sm.addSkillName(_id);
  316. player.sendPacket(sm);
  317. sm = null;
  318. // update all the shortcuts to this skill
  319. if (_level > 1)
  320. {
  321. L2ShortCut[] allShortCuts = player.getAllShortCuts();
  322. for (L2ShortCut sc : allShortCuts)
  323. {
  324. if (sc.getId() == _id && sc.getType() == L2ShortCut.TYPE_SKILL)
  325. {
  326. L2ShortCut newsc = new L2ShortCut(sc.getSlot(), sc
  327. .getPage(), sc.getType(), sc.getId(), _level, 1);
  328. player.sendPacket(new ShortCutRegister(newsc));
  329. player.registerShortCut(newsc);
  330. }
  331. }
  332. }
  333. if (trainer instanceof L2FishermanInstance)
  334. ((L2FishermanInstance) trainer).showSkillList(player);
  335. else if (trainer instanceof L2TransformManagerInstance)
  336. ((L2TransformManagerInstance) trainer).showTransformSkillList(player);
  337. else
  338. trainer.showSkillList(player, player.getSkillLearningClassId());
  339. if (_id >= 1368 && _id <= 1372) // if skill is expand sendpacket :)
  340. {
  341. ExStorageMaxCount esmc = new ExStorageMaxCount(player);
  342. player.sendPacket(esmc);
  343. }
  344. }
  345. /*
  346. * (non-Javadoc)
  347. *
  348. * @see net.sf.l2j.gameserver.clientpackets.ClientBasePacket#getType()
  349. */
  350. @Override
  351. public String getType()
  352. {
  353. return _C__6C_REQUESTAQUIRESKILL;
  354. }
  355. }