/* * Copyright (C) 2004-2015 L2J DataPack * * This file is part of L2J DataPack. * * L2J DataPack is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * L2J DataPack is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package custom.Validators; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.l2jserver.Config; import com.l2jserver.gameserver.data.xml.impl.ClassListData; import com.l2jserver.gameserver.enums.IllegalActionPunishmentType; import com.l2jserver.gameserver.model.PcCondOverride; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; import com.l2jserver.gameserver.model.quest.Quest; import com.l2jserver.gameserver.model.quest.QuestState; import com.l2jserver.gameserver.model.skills.Skill; import com.l2jserver.gameserver.util.Util; /** * Sub-class skills validator.
* TODO: Rewrite. * @author DS */ public final class SubClassSkills extends Quest { // arrays must be sorted // @formatter:off private static final int[] _allCertSkillIds = { 631, 632, 633, 634, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 799, 800, 801, 802, 803, 804, 1489, 1490, 1491 }; private static final int[][] _certSkillsByLevel = { { 631, 632, 633, 634 }, { 631, 632, 633, 634 }, { 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 650, 651, 652, 653, 654, 655, 799, 800, 801, 802, 803, 804, 1489, 1490, 1491 }, { 656, 657, 658, 659, 660, 661, 662 } }; private static final int[] _allCertItemIds = { 10280, 10281, 10282, 10283, 10284, 10285, 10286, 10287, 10288, 10289, 10290, 10291, 10292, 10293, 10294, 10612 }; private static final int[][] _certItemsByLevel = { { 10280 }, { 10280 }, { 10612, 10281, 10282, 10283, 10284, 10285, 10286, 10287 }, { 10288, 10289, 10290, 10291, 10292, 10293, 10294 } }; // @formatter:on private static final String[] VARS = { "EmergentAbility65-", "EmergentAbility70-", "ClassAbility75-", "ClassAbility80-" }; private SubClassSkills() { super(-1, SubClassSkills.class.getSimpleName(), "custom"); setOnEnterWorld(true); } @Override public String onEnterWorld(L2PcInstance player) { if (!Config.SKILL_CHECK_ENABLE) { return null; } if (player.canOverrideCond(PcCondOverride.SKILL_CONDITIONS) && !Config.SKILL_CHECK_GM) { return null; } final List certSkills = getCertSkills(player); if (player.isSubClassActive()) { for (Skill s : certSkills) { Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " has cert skill on subclass :" + s.getName() + "(" + s.getId() + "/" + s.getLevel() + "), class:" + ClassListData.getInstance().getClass(player.getClassId()).getClassName(), IllegalActionPunishmentType.NONE); if (Config.SKILL_CHECK_REMOVE) { player.removeSkill(s); } } return null; } int[][] cSkills = new int[certSkills.size()][2]; // skillId/skillLvl for (int i = certSkills.size(); --i >= 0;) { Skill skill = certSkills.get(i); cSkills[i][0] = skill.getId(); cSkills[i][1] = skill.getLevel(); } final List certItems = getCertItems(player); int[][] cItems = new int[certItems.size()][2]; // objectId/number for (int i = certItems.size(); --i >= 0;) { L2ItemInstance item = certItems.get(i); cItems[i][0] = item.getObjectId(); cItems[i][1] = (int) Math.min(item.getCount(), Integer.MAX_VALUE); } QuestState st = player.getQuestState("SubClassSkills"); if (st == null) { st = newQuestState(player); } String qName, qValue; int id, index; for (int i = VARS.length; --i >= 0;) { for (int j = Config.MAX_SUBCLASS; j > 0; j--) { qName = VARS[i] + String.valueOf(j); qValue = st.getGlobalQuestVar(qName); if ((qValue == null) || qValue.isEmpty()) { continue; } if (qValue.endsWith(";")) // found skill { try { id = Integer.parseInt(qValue.replace(";", "")); Skill skill = null; if (certSkills != null) { // searching skill in test array if (cSkills != null) { for (index = certSkills.size(); --index >= 0;) { if (cSkills[index][0] == id) { skill = certSkills.get(index); cSkills[index][1]--; break; } } } if (skill != null) { if (!Util.contains(_certSkillsByLevel[i], id)) { // should remove this skill ? Util.handleIllegalPlayerAction(player, "Invalid cert variable WITH skill:" + qName + "=" + qValue + " - skill does not match certificate level", IllegalActionPunishmentType.NONE); } } else { Util.handleIllegalPlayerAction(player, "Invalid cert variable:" + qName + "=" + qValue + " - skill not found", IllegalActionPunishmentType.NONE); } } else { Util.handleIllegalPlayerAction(player, "Invalid cert variable:" + qName + "=" + qValue + " - no certified skills found", IllegalActionPunishmentType.NONE); } } catch (NumberFormatException e) { Util.handleIllegalPlayerAction(player, "Invalid cert variable:" + qName + "=" + qValue + " - not a number", IllegalActionPunishmentType.NONE); } } else // found item { try { id = Integer.parseInt(qValue); if (id == 0) { continue; } L2ItemInstance item = null; if (certItems != null) { // searching item in test array if (cItems != null) { for (index = certItems.size(); --index >= 0;) { if (cItems[index][0] == id) { item = certItems.get(index); cItems[index][1]--; break; } } } if (item != null) { if (!Util.contains(_certItemsByLevel[i], item.getId())) { Util.handleIllegalPlayerAction(player, "Invalid cert variable:" + qName + "=" + qValue + " - item found but does not match certificate level", IllegalActionPunishmentType.NONE); } } else { Util.handleIllegalPlayerAction(player, "Invalid cert variable:" + qName + "=" + qValue + " - item not found", IllegalActionPunishmentType.NONE); } } else { Util.handleIllegalPlayerAction(player, "Invalid cert variable:" + qName + "=" + qValue + " - no cert item found in inventory", IllegalActionPunishmentType.NONE); } } catch (NumberFormatException e) { Util.handleIllegalPlayerAction(player, "Invalid cert variable:" + qName + "=" + qValue + " - not a number", IllegalActionPunishmentType.NONE); } } } } if ((certSkills != null) && (cSkills != null)) { for (int i = cSkills.length; --i >= 0;) { if (cSkills[i][1] == 0) { continue; } Skill skill = certSkills.get(i); if (cSkills[i][1] > 0) { if (cSkills[i][1] == skill.getLevel()) { Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " has invalid cert skill :" + skill.getName() + "(" + skill.getId() + "/" + skill.getLevel() + ")", IllegalActionPunishmentType.NONE); } else { Util.handleIllegalPlayerAction(player, "Player " + player.getName() + " has invalid cert skill :" + skill.getName() + "(" + skill.getId() + "/" + skill.getLevel() + "), level too high", IllegalActionPunishmentType.NONE); } if (Config.SKILL_CHECK_REMOVE) { player.removeSkill(skill); } } else { Util.handleIllegalPlayerAction(player, "Invalid cert skill :" + skill.getName() + "(" + skill.getId() + "/" + skill.getLevel() + "), level too low", IllegalActionPunishmentType.NONE); } } } if ((certItems != null) && (cItems != null)) { for (int i = cItems.length; --i >= 0;) { if (cItems[i][1] == 0) { continue; } L2ItemInstance item = certItems.get(i); Util.handleIllegalPlayerAction(player, "Invalid cert item without variable or with wrong count:" + item.getObjectId(), IllegalActionPunishmentType.NONE); } } return null; } private List getCertSkills(L2PcInstance player) { final List tmp = new ArrayList<>(); for (Skill s : player.getAllSkills()) { if ((s != null) && (Arrays.binarySearch(_allCertSkillIds, s.getId()) >= 0)) { tmp.add(s); } } return tmp; } private List getCertItems(L2PcInstance player) { final List tmp = new ArrayList<>(); for (L2ItemInstance i : player.getInventory().getItems()) { if ((i != null) && (Arrays.binarySearch(_allCertItemIds, i.getId()) >= 0)) { tmp.add(i); } } return tmp; } public static void main(String[] args) { new SubClassSkills(); } }