Jump to content

u3games

Members
  • Content Count

    113
  • Joined

  • Last visited

  • Feedback

    0%

Everything posted by u3games

  1. Index: dist/game/data/scripts.cfg =================================================================== --- dist/game/data/scripts.cfg (revision 10413) +++ dist/game/data/scripts.cfg (working copy) @@ -310,6 +310,7 @@ custom/ShadowWeapons/ShadowWeapons.java custom/NewbieCoupons/NewbieCoupons.java custom/RaidbossInfo/RaidbossInfo.java +custom/NpcBuffer/NpcBuffer.java custom/NpcLocationInfo/NpcLocationInfo.java custom/Validators/SubClassSkills.java Index: dist/game/data/scripts/custom/NpcBuffer/NpcBuffer.java =================================================================== --- dist/game/data/scripts/custom/NpcBuffer/NpcBuffer.java (revision 0) +++ dist/game/data/scripts/custom/NpcBuffer/NpcBuffer.java (working copy) @@ -0,0 +1,1970 @@ +/* + * Copyright (C) 2004-2014 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 <http://www.gnu.org/licenses/>. + */ +package custom.NpcBuffer; + +import static com.l2jserver.gameserver.util.Util.formatAdena; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.l2jserver.Config; +import com.l2jserver.L2DatabaseFactory; +import com.l2jserver.gameserver.datatables.SkillData; +import com.l2jserver.gameserver.instancemanager.QuestManager; +import com.l2jserver.gameserver.model.actor.L2Npc; +import com.l2jserver.gameserver.model.actor.L2Summon; +import com.l2jserver.gameserver.model.actor.instance.L2CubicInstance; +import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; +import com.l2jserver.gameserver.model.actor.instance.L2PetInstance; +import com.l2jserver.gameserver.model.actor.instance.L2ServitorInstance; +import com.l2jserver.gameserver.model.actor.stat.PcStat; +import com.l2jserver.gameserver.model.actor.stat.SummonStat; +import com.l2jserver.gameserver.model.actor.status.PcStatus; +import com.l2jserver.gameserver.model.actor.status.SummonStatus; +import com.l2jserver.gameserver.model.effects.L2EffectType; +import com.l2jserver.gameserver.model.entity.TvTEvent; +import com.l2jserver.gameserver.model.olympiad.OlympiadManager; +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.network.SystemMessageId; +import com.l2jserver.gameserver.network.serverpackets.ActionFailed; +import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse; +import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage; +import com.l2jserver.gameserver.network.serverpackets.SetSummonRemainTime; +import com.l2jserver.gameserver.network.serverpackets.SetupGauge; + +public class NpcBuffer extends Quest +{ + private static final boolean DEBUG = false; + + private static void print(Exception e) + { + _log.warning(">>>" + e.toString() + "<<<"); + if (DEBUG) + { + e.printStackTrace(); + } + } + + private static final String QUEST_LOADING_INFO = "Rin4a"; + private static final int NPC_ID = 12; + + private static final String TITLE_NAME = "Scheme Buffer"; + private static final boolean SCRIPT_RELOAD = false; + private static final boolean SMART_WINDOW = true; + private static final boolean ENABLE_BUFF_SECTION = true; + private static final boolean ENABLE_SCHEME_SYSTEM = true; + private static final boolean ENABLE_HEAL = true; + private static final boolean ENABLE_HEAL_IN_COMBAT = false; + private static final boolean ENABLE_BUFFS = true; + private static final boolean ENABLE_RESIST = true; + private static final boolean ENABLE_SONGS = true; + private static final boolean ENABLE_DANCES = true; + private static final boolean ENABLE_CHANTS = false; + private static final boolean ENABLE_OTHERS = false; + private static final boolean ENABLE_SPECIAL = false; + private static final boolean ENABLE_CUBIC = false; + private static final boolean ENABLE_BUFF_REMOVE = true; + private static final boolean ENABLE_BUFF_SET = true; + private static final boolean BUFF_WITH_KARMA = true; + private static final boolean FREE_BUFFS = false; + private static final boolean TIME_OUT = true; + private static final int TIME_OUT_TIME = 3; + private static final int MIN_LEVEL = 1; + private static final int BUFF_REMOVE_PRICE = 10000; + private static final int HEAL_PRICE = 10000; + private static final int BUFF_PRICE = 1000; + private static final int RESIST_PRICE = 1000; + private static final int SONG_PRICE = 1000; + private static final int DANCE_PRICE = 1000; + private static final int CHANT_PRICE = 1000; + private static final int OTHERS_PRICE = 1000; + private static final int SPECIAL_PRICE = 1000; + private static final int CUBIC_PRICE = 1000; + private static final int BUFF_SET_PRICE = 15000; + private static final int SCHEME_BUFF_PRICE = 20000; + private static final int SCHEMES_PER_PLAYER = 4; + private static final int CONSUMABLE_ID = 57; + private static final int MAX_SCHEME_BUFFS = Config.BUFFS_MAX_AMOUNT; + private static final int MAX_SCHEME_DANCES = Config.DANCES_MAX_AMOUNT; + + private static final String SET_FIGHTER = "Fighter"; + private static final String SET_MAGE = "Mage"; + private static final String SET_ALL = "All"; + private static final String SET_NONE = "None"; + + private String rebuildMainHtml(QuestState st) + { + String MAIN_HTML_MESSAGE = "<html><head><title>" + TITLE_NAME + "</title></head><body><center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32>"; + String MESSAGE = ""; + int td = 0; + String[] TRS = + { + "<tr><td height=25>", + "</td>", + "<td height=25>", + "</td></tr>" + }; + + final String bottonA, bottonB, bottonC; + if (st.getInt("Pet-On-Off") == 1) + { + bottonA = "Auto Buff Pet"; + bottonB = "Heal My Pet"; + bottonC = "Remove Pet Buffs"; + MAIN_HTML_MESSAGE += "<button value=\"Player Options\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " buffpet 0 0 0\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + else + { + bottonA = "Auto Buff"; + bottonB = "Heal"; + bottonC = "Remove Buffs"; + MAIN_HTML_MESSAGE += "<button value=\"Pet Options\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " buffpet 1 0 0\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + + if (ENABLE_BUFF_SECTION) + { + if (ENABLE_BUFFS) + { + if (td > 2) + { + td = 0; + } + MESSAGE += TRS[td] + "<button value=\"Buffs\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect view_buffs 0 0\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + TRS[td + 1]; + td += 2; + } + if (ENABLE_RESIST) + { + if (td > 2) + { + td = 0; + } + MESSAGE += TRS[td] + "<button value=\"Resist\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect view_resists 0 0\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + TRS[td + 1]; + td += 2; + } + if (ENABLE_SONGS) + { + if (td > 2) + { + td = 0; + } + MESSAGE += TRS[td] + "<button value=\"Songs\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect view_songs 0 0\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + TRS[td + 1]; + td += 2; + } + if (ENABLE_DANCES) + { + if (td > 2) + { + td = 0; + } + MESSAGE += TRS[td] + "<button value=\"Dances\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect view_dances 0 0\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + TRS[td + 1]; + td += 2; + } + if (ENABLE_CHANTS) + { + if (td > 2) + { + td = 0; + } + MESSAGE += TRS[td] + "<button value=\"Chants\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect view_chants 0 0\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + TRS[td + 1]; + td += 2; + } + if (ENABLE_SPECIAL) + { + if (td > 2) + { + td = 0; + } + MESSAGE += TRS[td] + "<button value=\"Special\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect view_special 0 0\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + TRS[td + 1]; + td += 2; + } + if (ENABLE_OTHERS) + { + if (td > 2) + { + td = 0; + } + MESSAGE += TRS[td] + "<button value=\"Others\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect view_others 0 0\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + TRS[td + 1]; + td += 2; + } + } + + if (ENABLE_CUBIC) + { + if (td > 2) + { + td = 0; + } + MESSAGE += TRS[td] + "<button value=\"Cubics\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect view_cubic 0 0\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + TRS[td + 1]; + td += 2; + } + + if (MESSAGE.length() > 0) + { + MAIN_HTML_MESSAGE += "<BR1><table width=100% border=0 cellspacing=0 cellpadding=1 bgcolor=444444><tr>" + "<td><font color=00FFFF>Buffs:</font></td><td align=right>...</td></tr></table>" + "<BR1><table cellspacing=0 cellpadding=0>" + MESSAGE + "</table>"; + MESSAGE = ""; + td = 0; + } + + if (ENABLE_BUFF_SET) + { + if (td > 2) + { + td = 0; + } + MESSAGE += TRS[td] + "<button value=\"" + bottonA + "\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " castBuffSet 0 0 0\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + TRS[td + 1]; + td += 2; + } + + if (ENABLE_HEAL) + { + if (td > 2) + { + td = 0; + } + MESSAGE += TRS[td] + "<button value=\"" + bottonB + "\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " heal 0 0 0\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + TRS[td + 1]; + td += 2; + } + + if (ENABLE_BUFF_REMOVE) + { + if (td > 2) + { + td = 0; + } + MESSAGE += TRS[td] + "<button value=\"" + bottonC + "\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " removeBuffs 0 0 0\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + TRS[td + 1]; + td += 2; + } + + if (MESSAGE.length() > 0) + { + MAIN_HTML_MESSAGE += "<BR1><table width=100% border=0 cellspacing=0 cellpadding=1 bgcolor=444444><tr>" + "<td><font color=00FFFF>Preset:</font></td><td align=right><font color=LEVEL>" + formatAdena(BUFF_SET_PRICE) + "</font> adena</td></tr></table>" + "<BR1><table cellspacing=0 cellpadding=0>" + MESSAGE + "</table>"; + MESSAGE = ""; + td = 0; + } + + if (ENABLE_SCHEME_SYSTEM) + { + MAIN_HTML_MESSAGE += generateScheme(st); + } + + if (st.getPlayer().isGM()) + { + MAIN_HTML_MESSAGE += "<br><button value=\"GM Manage Buffs\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect manage_buffs 0 0\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + MAIN_HTML_MESSAGE += "<br><font color=303030>" + TITLE_NAME + "</font>" + "</center></body></html>"; + return MAIN_HTML_MESSAGE; + } + + private String generateScheme(QuestState st) + { + List<String> schemeName = new ArrayList<>(); + List<String> schemeId = new ArrayList<>(); + String HTML = ""; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement rss = con.prepareStatement("SELECT * FROM npcbuffer_scheme_list WHERE player_id=?"); + rss.setInt(1, st.getPlayer().getObjectId()); + ResultSet action = rss.executeQuery(); + while (action.next()) + { + schemeName.add(action.getString("scheme_name")); + schemeId.add(action.getString("id")); + } + } + catch (SQLException e) + { + print(e); + } + HTML += "<BR1><table width=100% border=0 cellspacing=0 cellpadding=1 bgcolor=444444><tr>" + "<td><font color=00FFFF>Scheme:</font></td><td align=right><font color=LEVEL>" + formatAdena(SCHEME_BUFF_PRICE) + "</font> adena</TD></TR></table>" + "<BR1><table cellspacing=0 cellpadding=0>"; + if (schemeName.size() > 0) + { + String MESSAGE = ""; + int td = 0; + String[] TRS = + { + "<tr><td>", + "</td>", + "<td>", + "</td></tr>" + }; + for (int i = 0; i < schemeName.size(); ++i) + { + if (td > 2) + { + td = 0; + } + MESSAGE += TRS[td] + "<button value=\"" + schemeName.get(i) + "\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " cast " + schemeId.get(i) + " x x\" width=130 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + TRS[td + 1]; + td += 2; + } + + if (MESSAGE.length() > 0) + { + HTML += "<table>" + MESSAGE + "</table>"; + } + } + + if (schemeName.size() < SCHEMES_PER_PLAYER) + { + HTML += "<BR1><table><tr><td><button value=\"Create\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " create_1 x x x\" width=85 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>"; + } + else + { + HTML += "<BR1><table width=100><tr>"; + } + + if (schemeName.size() > 0) + { + HTML += "<td><button value=\"Edit\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " edit_1 x x x\" width=85 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>" + "<td><button value=\"Delete\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " delete_1 x x x\" width=85 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr></table>"; + } + else + { + HTML += "</tr></table>"; + } + return HTML; + } + + private String reloadPanel(QuestState st) + { + return "<html><head><title>" + TITLE_NAME + "</title></head><body><center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>" + "<font color=303030>" + TITLE_NAME + "</font><br>" + "<img src=\"L2UI.SquareGray\" width=250 height=1><br>" + "<table width=260 border=0 bgcolor=444444>" + "<tr><td><br></td></tr>" + "<tr><td align=center><font color=FFFFFF>This option can be seen by GMs only and it<br1>allow to update any changes made in the<br1>script. You can disable this option in<br1>the settings section within the Script.<br><font color=LEVEL>Do you want to update the SCRIPT?</font></font></td></tr>" + "<tr><td></td></tr></table><br>" + "<img src=\"L2UI.SquareGray\" width=250 height=1><br><br>" + "<button value=\"Yes\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " reloadscript 1 0 0\" width=50 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<button value=\"No\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " reloadscript 0 0 0\" width=50 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "</center></body></html>"; + } + + private String getItemNameHtml(QuestState st, int itemval) + { + return "" + itemval + ";"; + } + + private int getBuffCount(String scheme) + { + int count = 0; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement rss = con.prepareStatement("SELECT buff_class FROM npcbuffer_scheme_contents WHERE scheme_id=?"); + rss.setString(1, scheme); + ResultSet action = rss.executeQuery(); + while (action.next()) + { + ++count; + } + } + catch (SQLException e) + { + print(e); + } + return count; + } + + private String getBuffType(int id) + { + String val = "none"; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement act = con.prepareStatement("SELECT buffType FROM npcbuffer_buff_list WHERE buffId=? LIMIT 1"); + act.setInt(1, id); + ResultSet rs = act.executeQuery(); + if (rs.next()) + { + val = rs.getString("buffType"); + } + } + catch (SQLException e) + { + print(e); + } + return val; + } + + private boolean isEnabled(int id, int level) + { + boolean val = false; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement act = con.prepareStatement("SELECT canUse FROM npcbuffer_buff_list WHERE buffId=? AND buffLevel=? LIMIT 1"); + act.setInt(1, id); + act.setInt(2, level); + ResultSet rs = act.executeQuery(); + if (rs.next()) + { + if ("1".equals(rs.getString("canUse"))) + { + val = true; + } + } + } + catch (SQLException e) + { + print(e); + } + return val; + } + + private boolean isUsed(String scheme, int id, int level) + { + boolean used = false; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement rss = con.prepareStatement("SELECT id FROM npcbuffer_scheme_contents WHERE scheme_id=? AND skill_id=? AND skill_level=? LIMIT 1"); + rss.setString(1, scheme); + rss.setInt(2, id); + rss.setInt(3, level); + ResultSet action = rss.executeQuery(); + if (action.next()) + { + used = true; + } + } + catch (SQLException e) + { + print(e); + } + return used; + } + + private int getClassBuff(String id) + { + int val = 0; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement getTipo = con.prepareStatement("SELECT buff_class FROM npcbuffer_buff_list WHERE buffId=?"); + getTipo.setString(1, id); + ResultSet gt = getTipo.executeQuery(); + if (gt.next()) + { + val = gt.getInt("buff_class"); + } + } + catch (SQLException e) + { + print(e); + } + return val; + } + + private String showText(QuestState st, String type, String text, boolean buttonEnabled, String buttonName, String location) + { + String MESSAGE = "<html><head><title>" + TITLE_NAME + "</title></head><body><center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>"; + MESSAGE += "<font color=LEVEL>" + type + "</font><br>" + text + "<br>"; + if (buttonEnabled) + { + MESSAGE += "<button value=\"" + buttonName + "\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect " + location + " 0 0\" width=100 height=22 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + MESSAGE += "<font color=303030>" + TITLE_NAME + "</font></center></body></html>"; + st.playSound("ItemSound3.sys_shortage"); + return MESSAGE; + } + + private String reloadConfig(QuestState st) + { + try + { + if (QuestManager.getInstance().reload(QUEST_LOADING_INFO)) + { + st.getPlayer().sendMessage("The script and settings have been reloaded successfully."); + } + else + { + st.getPlayer().sendMessage("Script Reloaded Failed. you edited something wrong! :P, fix it and restart the server"); + } + } + catch (Exception e) + { + st.getPlayer().sendMessage("Script Reloaded Failed. you edited something wrong! :P, fix it and restart the server"); + print(e); + } + return rebuildMainHtml(st); + } + + private NpcBuffer() + { + super(-1, NpcBuffer.class.getSimpleName(), "custom"); + addStartNpc(NPC_ID); + addFirstTalkId(NPC_ID); + addTalkId(NPC_ID); + } + + private boolean isPetBuff(QuestState st) + { + return st.getInt("Pet-On-Off") != 0; + } + + private String createScheme() + { + return "<html><head><title>" + TITLE_NAME + "</title></head><body><center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br><br>You MUST seprerate new words with a dot (.)<br><br>Scheme name: <edit var=\"name\" width=100><br><br>" + "<button value=\"Create Scheme\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " create $name no_name x x\" width=200 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<br><button value=\"Back\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect main 0 0\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<br><font color=303030>" + TITLE_NAME + "</font></center></body></html>"; + } + + private String deleteScheme(L2PcInstance player) + { + String HTML = "<html><head><title>" + TITLE_NAME + "</title></head><body><center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>Available schemes:<br><br>"; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement rss = con.prepareStatement("SELECT * FROM npcbuffer_scheme_list WHERE player_id=?"); + rss.setInt(1, player.getObjectId()); + ResultSet action = rss.executeQuery(); + while (action.next()) + { + HTML += "<button value=\"" + action.getString("scheme_name") + "\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " delete_c " + action.getString("id") + " " + action.getString("scheme_name") + " x\" width=200 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + } + catch (SQLException e) + { + print(e); + } + HTML += "<br><button value=\"Back\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect main 0 0\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<br><font color=303030>" + TITLE_NAME + "</font></center></body></html>"; + return HTML; + } + + private String editScheme(L2PcInstance player) + { + String HTML = "<html><head><title>" + TITLE_NAME + "</title></head><body><center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>Select a scheme that you would like to manage:<br><br>"; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement rss = con.prepareStatement("SELECT * FROM npcbuffer_scheme_list WHERE player_id=?"); + rss.setInt(1, player.getObjectId()); + ResultSet action = rss.executeQuery(); + while (action.next()) + { + String name = action.getString("scheme_name"); + String id = action.getString("id"); + HTML += "<button value=\"" + name + "\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " manage_scheme_select " + id + " x x\" width=200 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + } + catch (SQLException e) + { + print(e); + } + HTML += "<br><button value=\"Back\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect main 0 0\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<br><font color=303030>" + TITLE_NAME + "</font></center></body></html>"; + return HTML; + } + + private String getOptionList(String scheme) + { + int bcount = getBuffCount(scheme); + String HTML = "<html><head><title>" + TITLE_NAME + "</title></head><body><center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>There are <font color=LEVEL>" + bcount + "</font> buffs in current scheme!<br><br>"; + if (bcount < (MAX_SCHEME_BUFFS + MAX_SCHEME_DANCES)) + { + HTML += "<button value=\"Add buffs\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " manage_scheme_1 " + scheme + " 1 x\" width=200 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + if (bcount > 0) + { + HTML += "<button value=\"Remove buffs\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " manage_scheme_2 " + scheme + " 1 x\" width=200 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + HTML += "<br><button value=\"Back\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " edit_1 0 0 0\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<button value=\"Home\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect main 0 0\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<br><font color=303030>" + TITLE_NAME + "</font></center></body></html>"; + return HTML; + } + + private String buildHtml(String buffType) + { + String HTML_MESSAGE = "<html><head><title>" + TITLE_NAME + "</title></head><body><center><br>"; + + List<String> availableBuffs = new ArrayList<>(); + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement getList = con.prepareStatement("SELECT buffId,buffLevel FROM npcbuffer_buff_list WHERE buffType=\"" + buffType + "\" AND canUse=1 ORDER BY Buff_Class ASC, id"); + ResultSet rs = getList.executeQuery(); + while (rs.next()) + { + int bId = rs.getInt("buffId"); + int bLevel = rs.getInt("buffLevel"); + String bName = SkillData.getInstance().getSkill(bId, bLevel).getName(); + bName = bName.replace(" ", "+"); + availableBuffs.add(bName + "_" + bId + "_" + bLevel); + } + } + catch (SQLException e) + { + print(e); + } + + if (availableBuffs.size() == 0) + { + HTML_MESSAGE += "No buffs are available at this moment!"; + } + else + { + if (FREE_BUFFS) + { + HTML_MESSAGE += "All buffs are for <font color=LEVEL>free</font>!"; + } + else + { + int price = 0; + switch (buffType) + { + case "buff": + price = BUFF_PRICE; + break; + case "resist": + price = RESIST_PRICE; + break; + case "song": + price = SONG_PRICE; + break; + case "dance": + price = DANCE_PRICE; + break; + case "chant": + price = CHANT_PRICE; + break; + case "others": + price = OTHERS_PRICE; + break; + case "special": + price = SPECIAL_PRICE; + break; + case "cubic": + price = CUBIC_PRICE; + break; + default: + if (DEBUG) + { + throw new RuntimeException(); + } + } + HTML_MESSAGE += "All special buffs cost <font color=LEVEL>" + formatAdena(price) + "</font> adena!"; + } + HTML_MESSAGE += "<BR1><table>"; + for (String buff : availableBuffs) + { + buff = buff.replace("_", " "); + String[] buffSplit = buff.split(" "); + String name = buffSplit[0]; + int id = Integer.parseInt(buffSplit[1]); + int level = Integer.parseInt(buffSplit[2]); + name = name.replace("+", " "); + HTML_MESSAGE += "<tr><td>" + getSkillIconHtml(id, level) + "</td><td><button value=\"" + name + "\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " giveBuffs " + id + " " + level + " " + buffType + "\" width=190 height=32 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>"; + } + HTML_MESSAGE += "</table>"; + } + + HTML_MESSAGE += "<br><button value=\"Back\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect main 0 0\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<br><font color=303030>" + TITLE_NAME + "</font></center></body></html>"; + return HTML_MESSAGE; + } + + private String generateQuery(int case1, int case2) + { + StringBuilder qry = new StringBuilder(); + if (ENABLE_BUFFS) + { + if (case1 < MAX_SCHEME_BUFFS) + { + qry.append(",\"buff\""); + } + } + if (ENABLE_RESIST) + { + if (case1 < MAX_SCHEME_BUFFS) + { + qry.append(",\"resist\""); + } + } + if (ENABLE_SONGS) + { + if (case2 < MAX_SCHEME_DANCES) + { + qry.append(",\"song\""); + } + } + if (ENABLE_DANCES) + { + if (case2 < MAX_SCHEME_DANCES) + { + qry.append(",\"dance\""); + } + } + if (ENABLE_CHANTS) + { + if (case1 < MAX_SCHEME_BUFFS) + { + qry.append(",\"chant\""); + } + } + if (ENABLE_OTHERS) + { + if (case1 < MAX_SCHEME_BUFFS) + { + qry.append(",\"others\""); + } + } + if (ENABLE_SPECIAL) + { + if (case1 < MAX_SCHEME_BUFFS) + { + qry.append(",\"special\""); + } + } + if (qry.length() > 0) + { + qry.deleteCharAt(0); + } + return qry.toString(); + } + + private String viewAllSchemeBuffs$getBuffCount(String scheme) + { + int count = 0; + int D_S_Count = 0; + int B_Count = 0; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement rss = con.prepareStatement("SELECT buff_class FROM npcbuffer_scheme_contents WHERE scheme_id=?"); + rss.setString(1, scheme); + ResultSet action = rss.executeQuery(); + while (action.next()) + { + ++count; + int val = action.getInt("buff_class"); + if ((val == 1) || (val == 2)) + { + ++D_S_Count; + } + else + { + ++B_Count; + } + } + } + catch (SQLException e) + { + print(e); + } + String res = count + " " + B_Count + " " + D_S_Count; + return res; + } + + private String viewAllSchemeBuffs(String scheme, String page, String action) + { + List<String> buffList = new ArrayList<>(); + String HTML_MESSAGE = "<html><head><title>" + TITLE_NAME + "</title></head><body><center><br>"; + String[] eventSplit = viewAllSchemeBuffs$getBuffCount(scheme).split(" "); + int TOTAL_BUFF = Integer.parseInt(eventSplit[0]); + int BUFF_COUNT = Integer.parseInt(eventSplit[1]); + int DANCE_SONG = Integer.parseInt(eventSplit[2]); + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + if (action.equals("add")) + { + HTML_MESSAGE += "You can add <font color=LEVEL>" + (MAX_SCHEME_BUFFS - BUFF_COUNT) + "</font> Buffs and <font color=LEVEL>" + (MAX_SCHEME_DANCES - DANCE_SONG) + "</font> Dances more!"; + String QUERY = "SELECT * FROM npcbuffer_buff_list WHERE buffType IN (" + generateQuery(BUFF_COUNT, DANCE_SONG) + ") AND canUse=1 ORDER BY Buff_Class ASC, id"; + PreparedStatement getBuffCount = con.prepareStatement(QUERY); + ResultSet rss = getBuffCount.executeQuery(); + while (rss.next()) + { + String name = SkillData.getInstance().getSkill(rss.getInt("buffId"), rss.getInt("buffLevel")).getName(); + name = name.replace(" ", "+"); + buffList.add(name + "_" + rss.getInt("buffId") + "_" + rss.getInt("buffLevel")); + } + } + else if (action.equals("remove")) + { + HTML_MESSAGE += "You have <font color=LEVEL>" + BUFF_COUNT + "</font> Buffs and <font color=LEVEL>" + DANCE_SONG + "</font> Dances"; + String QUERY = "SELECT * FROM npcbuffer_scheme_contents WHERE scheme_id=? ORDER BY Buff_Class ASC, id"; + PreparedStatement getBuffCount = con.prepareStatement(QUERY); + getBuffCount.setString(1, scheme); + ResultSet rss = getBuffCount.executeQuery(); + while (rss.next()) + { + String name = SkillData.getInstance().getSkill(rss.getInt("skill_id"), rss.getInt("skill_level")).getName(); + name = name.replace(" ", "+"); + buffList.add(name + "_" + rss.getInt("skill_id") + "_" + rss.getInt("skill_level")); + } + } + else if (DEBUG) + { + throw new RuntimeException(); + } + } + catch (SQLException e) + { + print(e); + } + + HTML_MESSAGE += "<BR1><table border=0><tr>"; + final int buffsPerPage = 20; + final String width, pageName; + int pc = ((buffList.size() - 1) / buffsPerPage) + 1; + if (pc > 5) + { + width = "25"; + pageName = "P"; + } + else + { + width = "50"; + pageName = "Page "; + } + for (int ii = 1; ii <= pc; ++ii) + { + if (ii == Integer.parseInt(page)) + { + HTML_MESSAGE += "<td width=" + width + " align=center><font color=LEVEL>" + pageName + ii + "</font></td>"; + } + else if (action.equals("add")) + { + HTML_MESSAGE += "<td width=" + width + ">" + "<button value=\"" + pageName + ii + "\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " manage_scheme_1 " + scheme + " " + ii + " x\" width=" + width + " height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>"; + } + else if (action.equals("remove")) + { + HTML_MESSAGE += "<td width=" + width + ">" + "<button value=\"" + pageName + ii + "\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " manage_scheme_2 " + scheme + " " + ii + " x\" width=" + width + " height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>"; + } + else if (DEBUG) + { + throw new RuntimeException(); + } + } + HTML_MESSAGE += "</tr></table>"; + + int limit = buffsPerPage * Integer.parseInt(page); + int start = limit - buffsPerPage; + int end = Math.min(limit, buffList.size()); + int k = 0; + for (int i = start; i < end; ++i) + { + String value = buffList.get(i); + value = value.replace("_", " "); + String[] extr = value.split(" "); + String name = extr[0]; + name = name.replace("+", " "); + int id = Integer.parseInt(extr[1]); + int level = Integer.parseInt(extr[2]); + if (action.equals("add")) + { + if (!isUsed(scheme, id, level)) + { + if ((k % 2) != 0) + { + HTML_MESSAGE += "<BR1><table border=0 bgcolor=333333>"; + } + else + { + HTML_MESSAGE += "<BR1><table border=0 bgcolor=292929>"; + } + HTML_MESSAGE += "<tr><td width=35>" + getSkillIconHtml(id, level) + "</td><td fixwidth=170>" + name + "</td><td><button value=\"Add\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " add_buff " + scheme + "_" + id + "_" + level + " " + page + " " + TOTAL_BUFF + "\" width=65 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>" + "</tr></table>"; + k += 1; + } + } + else if (action.equals("remove")) + { + if ((k % 2) != 0) + { + HTML_MESSAGE += "<BR1><table border=0 bgcolor=333333>"; + } + else + { + HTML_MESSAGE += "<BR1><table border=0 bgcolor=292929>"; + } + HTML_MESSAGE += "<tr><td width=35>" + getSkillIconHtml(id, level) + "</td><td fixwidth=170>" + name + "</td><td><button value=\"Remove\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " remove_buff " + scheme + "_" + id + "_" + level + " " + page + " " + TOTAL_BUFF + "\" width=65 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>" + "</table>"; + k += 1; + } + } + HTML_MESSAGE += "<br><br><button value=\"Back\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " manage_scheme_select " + scheme + " x x\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<button value=\"Home\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect main 0 0\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<br><font color=303030>" + TITLE_NAME + "</font></center></body></html>"; + return HTML_MESSAGE; + } + + private String viewAllBuffTypes() + { + String HTML_MESSAGE = "<html><head><title>" + TITLE_NAME + "</title></head><body><center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>"; + HTML_MESSAGE += "<font color=LEVEL>[Buff management]</font><br>"; + if (ENABLE_BUFFS) + { + HTML_MESSAGE += "<button value=\"Buffs\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " edit_buff_list buff Buffs 1\" width=200 height=22 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + if (ENABLE_RESIST) + { + HTML_MESSAGE += "<button value=\"Resist Buffs\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " edit_buff_list resist Resists 1\" width=200 height=22 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + if (ENABLE_SONGS) + { + HTML_MESSAGE += "<button value=\"Songs\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " edit_buff_list song Songs 1\" width=200 height=22 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + if (ENABLE_DANCES) + { + HTML_MESSAGE += "<button value=\"Dances\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " edit_buff_list dance Dances 1\" width=200 height=22 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + if (ENABLE_CHANTS) + { + HTML_MESSAGE += "<button value=\"Chants\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " edit_buff_list chant Chants 1\" width=200 height=22 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + if (ENABLE_SPECIAL) + { + HTML_MESSAGE += "<button value=\"Special Buffs\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " edit_buff_list special Special_Buffs 1\" width=200 height=22 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + if (ENABLE_OTHERS) + { + HTML_MESSAGE += "<button value=\"Others Buffs\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " edit_buff_list others Others_Buffs 1\" width=200 height=22 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + if (ENABLE_CUBIC) + { + HTML_MESSAGE += "<button value=\"Cubics\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " edit_buff_list cubic cubic_Buffs 1\" width=200 height=22 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">"; + } + if (ENABLE_BUFF_SET) + { + HTML_MESSAGE += "<button value=\"Buff Sets\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " edit_buff_list set Buff_Sets 1\" width=200 height=22 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"><br>"; + } + HTML_MESSAGE += "<button value=\"Back\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect main 0 0\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<br><font color=303030>" + TITLE_NAME + "</font></center></body></html>"; + return HTML_MESSAGE; + } + + private String viewAllBuffs(String type, String typeName, String page) + { + List<String> buffList = new ArrayList<>(); + String HTML_MESSAGE = "<html><head><title>" + TITLE_NAME + "</title></head><body><center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>"; + typeName = typeName.replace("_", " "); + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + final PreparedStatement getBuffCount; + if (type.equals("set")) + { + getBuffCount = con.prepareStatement("SELECT * FROM npcbuffer_buff_list WHERE buffType IN (" + generateQuery(0, 0) + ") AND canUse=1"); + } + else + { + getBuffCount = con.prepareStatement("SELECT * FROM npcbuffer_buff_list WHERE buffType=?"); + getBuffCount.setString(1, type); + } + ResultSet rss = getBuffCount.executeQuery(); + while (rss.next()) + { + String name = SkillData.getInstance().getSkill(rss.getInt("buffId"), rss.getInt("buffLevel")).getName(); + name = name.replace(" ", "+"); + String usable = rss.getString("canUse"); + String forClass = rss.getString("forClass"); + String skill_id = rss.getString("buffId"); + String skill_level = rss.getString("buffLevel"); + buffList.add(name + "_" + forClass + "_" + page + "_" + usable + "_" + skill_id + "_" + skill_level); + } + } + catch (SQLException e) + { + print(e); + } + Collections.sort(buffList); + + HTML_MESSAGE += "<font color=LEVEL>[Buff management - " + typeName + " - Page " + page + "]</font><br><table border=0><tr>"; + final int buffsPerPage; + if (type.equals("set")) + { + buffsPerPage = 12; + } + else + { + buffsPerPage = 20; + } + final String width, pageName; + int pc = ((buffList.size() - 1) / buffsPerPage) + 1; + if (pc > 5) + { + width = "25"; + pageName = "P"; + } + else + { + width = "50"; + pageName = "Page "; + } + typeName = typeName.replace(" ", "_"); + for (int ii = 1; ii <= pc; ++ii) + { + if (ii == Integer.parseInt(page)) + { + HTML_MESSAGE += "<td width=" + width + " align=center><font color=LEVEL>" + pageName + ii + "</font></td>"; + } + else + { + HTML_MESSAGE += "<td width=" + width + "><button value=\"" + pageName + "" + ii + "\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " edit_buff_list " + type + " " + typeName + " " + ii + "\" width=" + width + " height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>"; + } + } + HTML_MESSAGE += "</tr></table><br>"; + + int limit = buffsPerPage * Integer.parseInt(page); + int start = limit - buffsPerPage; + int end = Math.min(limit, buffList.size()); + for (int i = start; i < end; ++i) + { + String value = buffList.get(i); + value = value.replace("_", " "); + String[] extr = value.split(" "); + String name = extr[0]; + name = name.replace("+", " "); + int forClass = Integer.parseInt(extr[1]); + int usable = Integer.parseInt(extr[3]); + String skillPos = extr[4] + "_" + extr[5]; + if ((i % 2) != 0) + { + HTML_MESSAGE += "<BR1><table border=0 bgcolor=333333>"; + } + else + { + HTML_MESSAGE += "<BR1><table border=0 bgcolor=292929>"; + } + if (type.equals("set")) + { + String listOrder = null; + if (forClass == 0) + { + listOrder = "List=\"" + SET_FIGHTER + ";" + SET_MAGE + ";" + SET_ALL + ";" + SET_NONE + ";\""; + } + else if (forClass == 1) + { + listOrder = "List=\"" + SET_MAGE + ";" + SET_FIGHTER + ";" + SET_ALL + ";" + SET_NONE + ";\""; + } + else if (forClass == 2) + { + listOrder = "List=\"" + SET_ALL + ";" + SET_FIGHTER + ";" + SET_MAGE + ";" + SET_NONE + ";\""; + } + else if (forClass == 3) + { + listOrder = "List=\"" + SET_NONE + ";" + SET_FIGHTER + ";" + SET_MAGE + ";" + SET_ALL + ";\""; + } + HTML_MESSAGE += "<tr><td fixwidth=145>" + name + "</td><td width=70><combobox var=\"newSet" + i + "\" width=70 " + listOrder + "></td>" + "<td width=50><button value=\"Update\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " changeBuffSet " + skillPos + " $newSet" + i + " " + page + "\" width=50 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>"; + } + else + { + HTML_MESSAGE += "<tr><td fixwidth=170>" + name + "</td><td width=80>"; + if (usable == 1) + { + HTML_MESSAGE += "<button value=\"Disable\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " editSelectedBuff " + skillPos + " 0-" + page + " " + type + "\" width=80 height=22 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>"; + } + else if (usable == 0) + { + HTML_MESSAGE += "<button value=\"Enable\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " editSelectedBuff " + skillPos + " 1-" + page + " " + type + "\" width=80 height=22 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td></tr>"; + } + } + HTML_MESSAGE += "</table>"; + } + HTML_MESSAGE += "<br><br><button value=\"Back\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect manage_buffs 0 0\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<button value=\"Home\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " redirect main 0 0\" width=100 height=20 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<br><font color=303030>" + TITLE_NAME + "</font></center></body></html>"; + return HTML_MESSAGE; + } + + private void manageSelectedBuff(String buffPosId, String canUseBuff) + { + String[] bpid = buffPosId.split("_"); + String bId = bpid[0]; + String bLvl = bpid[1]; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement upd = con.prepareStatement("UPDATE npcbuffer_buff_list SET canUse=? WHERE buffId=? AND buffLevel=? LIMIT 1"); + upd.setString(1, canUseBuff); + upd.setString(2, bId); + upd.setString(3, bLvl); + upd.executeUpdate(); + upd.close(); + } + catch (SQLException e) + { + print(e); + } + } + + private String manageSelectedSet(String id, String newVal, String opt3) + { + String[] bpid = id.split("_"); + String bId = bpid[0]; + String bLvl = bpid[1]; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement upd = con.prepareStatement("UPDATE npcbuffer_buff_list SET forClass=? WHERE buffId=? AND bufflevel=?"); + upd.setString(1, newVal); + upd.setString(2, bId); + upd.setString(3, bLvl); + upd.executeUpdate(); + upd.close(); + } + catch (SQLException e) + { + print(e); + } + return viewAllBuffs("set", "Buff Sets", opt3); + } + + private void addTimeout(QuestState st, int gaugeColor, int amount, int offset) + { + int endtime = (int) ((System.currentTimeMillis() + (amount * 1000)) / 1000); + st.set("blockUntilTime", String.valueOf(endtime)); + st.getPlayer().sendPacket(new SetupGauge(gaugeColor, (amount * 1000) + offset)); + } + + private void heal(L2PcInstance player, boolean isPet) + { + L2Summon target = player.getSummon(); + if (!isPet) + { + PcStatus pcStatus = player.getStatus(); + PcStat pcStat = player.getStat(); + pcStatus.setCurrentHp(pcStat.getMaxHp()); + pcStatus.setCurrentMp(pcStat.getMaxMp()); + pcStatus.setCurrentCp(pcStat.getMaxCp()); + } + else if (target != null) + { + SummonStatus petStatus = target.getStatus(); + SummonStat petStat = target.getStat(); + petStatus.setCurrentHp(petStat.getMaxHp()); + petStatus.setCurrentMp(petStat.getMaxMp()); + if (target instanceof L2PetInstance) + { + L2PetInstance pet = (L2PetInstance) target; + pet.setCurrentFed(pet.getMaxFed()); + player.sendPacket(new SetSummonRemainTime(pet.getMaxFed(), pet.getCurrentFed())); + } + else if (target instanceof L2ServitorInstance) + { + L2ServitorInstance summon = (L2ServitorInstance) target; + // FIXME: summon.setLifeTimeRemaining(summon.getLifeTimeRemaining() - summon.getLifeTime()); + summon.setLifeTimeRemaining(summon.getLifeTimeRemaining() + summon.getLifeTime()); + player.sendPacket(new SetSummonRemainTime(summon.getLifeTime(), summon.getLifeTimeRemaining())); + } + else if (DEBUG) + { + throw new RuntimeException(); + } + } + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + if (DEBUG) + { + System.out.println(getScriptName() + "#onAdvEvent('" + event + "'," + (npc == null ? "NULL" : npc.getId() + npc.getName()) + "," + (player == null ? "NULL" : player.getName()) + ")"); + } + QuestState st = player.getQuestState(QUEST_LOADING_INFO); + String[] eventSplit = event.split(" ", 4); + if (eventSplit.length != 4) + { + player.sendPacket(SystemMessageId.INCORRECT_NAME_TRY_AGAIN); + return null; + } + String eventParam0 = eventSplit[0]; + String eventParam1 = eventSplit[1]; + String eventParam2 = eventSplit[2]; + String eventParam3 = eventSplit[3]; + + switch (eventParam0) + { + case "reloadscript": + if (eventParam1.equals("1")) + { + return reloadConfig(st); + } + if (eventParam1.equals("0")) + { + return rebuildMainHtml(st); + } + if (DEBUG) + { + throw new RuntimeException(); + } + + case "redirect": + switch (eventParam1) + { + case "main": + return rebuildMainHtml(st); + case "manage_buffs": + return viewAllBuffTypes(); + case "view_buffs": + return buildHtml("buff"); + case "view_resists": + return buildHtml("resist"); + case "view_songs": + return buildHtml("song"); + case "view_dances": + return buildHtml("dance"); + case "view_chants": + return buildHtml("chant"); + case "view_others": + return buildHtml("others"); + case "view_special": + return buildHtml("special"); + case "view_cubic": + return buildHtml("cubic"); + default: + if (DEBUG) + { + throw new RuntimeException(); + } + } + + case "buffpet": + if ((int) (System.currentTimeMillis() / 1000) > st.getInt("blockUntilTime")) + { + st.set("Pet-On-Off", eventParam1); + if (TIME_OUT) + { + addTimeout(st, 3, TIME_OUT_TIME / 2, 600); + } + } + return rebuildMainHtml(st); + + case "create": + { + String param = eventParam1.replaceAll("[ !" + "\"" + "#$%&'()*+,/:;<=>?@" + "\\[" + "\\\\" + "\\]" + "\\^" + "`{|}~]", ""); + if ((param.length() == 0) || param.equals("no_name")) + { + player.sendPacket(SystemMessageId.INCORRECT_NAME_TRY_AGAIN); + return showText(st, "Info", "Please, enter the scheme name!", true, "Return", "main"); + } + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement ins = con.prepareStatement("INSERT INTO npcbuffer_scheme_list (player_id,scheme_name) VALUES (?,?)"); + ins.setInt(1, player.getObjectId()); + ins.setString(2, param); + ins.executeUpdate(); + ins.close(); + } + catch (SQLException e) + { + print(e); + } + return rebuildMainHtml(st); + } + + case "delete": + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement rem; + rem = con.prepareStatement("DELETE FROM npcbuffer_scheme_list WHERE id=? LIMIT 1"); + rem.setString(1, eventParam1); + rem.executeUpdate(); + rem.close(); + rem = con.prepareStatement("DELETE FROM npcbuffer_scheme_contents WHERE scheme_id=?"); + rem.setString(1, eventParam1); + rem.executeUpdate(); + rem.close(); + } + catch (SQLException e) + { + print(e); + } + return rebuildMainHtml(st); + + case "delete_c": + return "<html><head><title>" + TITLE_NAME + "</title></head><body><center><img src=\"L2UI_CH3.herotower_deco\" width=256 height=32><br>Do you really want to delete '" + eventParam2 + "' scheme?<br><br>" + "<button value=\"Yes\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " delete " + eventParam1 + " x x\" width=50 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<button value=\"No\" action=\"bypass -h Quest " + QUEST_LOADING_INFO + " delete_1 x x x\" width=50 height=25 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\">" + "<br><font color=303030>" + TITLE_NAME + "</font></center></body></html>"; + + case "create_1": + return createScheme(); + case "edit_1": + return editScheme(player); + case "delete_1": + return deleteScheme(player); + case "manage_scheme_1": + return viewAllSchemeBuffs(eventParam1, eventParam2, "add"); + case "manage_scheme_2": + return viewAllSchemeBuffs(eventParam1, eventParam2, "remove"); + case "manage_scheme_select": + return getOptionList(eventParam1); + + case "remove_buff": + { + String[] split = eventParam1.split("_"); + String scheme = split[0]; + String skill = split[1]; + String level = split[2]; + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement rem = con.prepareStatement("DELETE FROM npcbuffer_scheme_contents WHERE scheme_id=? AND skill_id=? AND skill_level=? LIMIT 1"); + rem.setString(1, scheme); + rem.setString(2, skill); + rem.setString(3, level); + rem.executeUpdate(); + } + catch (SQLException e) + { + print(e); + } + int temp = Integer.parseInt(eventParam3) - 1; + final String HTML; + if (temp <= 0) + { + HTML = getOptionList(scheme); + } + else + { + HTML = viewAllSchemeBuffs(scheme, eventParam2, "remove"); + } + return HTML; + } + + case "add_buff": + { + String[] split = eventParam1.split("_"); + String scheme = split[0]; + String skill = split[1]; + String level = split[2]; + int idbuffclass = getClassBuff(skill); + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement ins = con.prepareStatement("INSERT INTO npcbuffer_scheme_contents (scheme_id,skill_id,skill_level,buff_class) VALUES (?,?,?,?)"); + ins.setString(1, scheme); + ins.setString(2, skill); + ins.setString(3, level); + ins.setInt(4, idbuffclass); + ins.executeUpdate(); + ins.close(); + } + catch (SQLException e) + { + print(e); + } + int temp = Integer.parseInt(eventParam3) + 1; + final String HTML; + if (temp >= (MAX_SCHEME_BUFFS + MAX_SCHEME_DANCES)) + { + HTML = getOptionList(scheme); + } + else + { + HTML = viewAllSchemeBuffs(scheme, eventParam2, "add"); + } + return HTML; + } + + case "edit_buff_list": + return viewAllBuffs(eventParam1, eventParam2, eventParam3); + + case "changeBuffSet": + if (eventParam2.equals(SET_FIGHTER)) + { + eventParam2 = "0"; + } + else if (eventParam2.equals(SET_MAGE)) + { + eventParam2 = "1"; + } + else if (eventParam2.equals(SET_ALL)) + { + eventParam2 = "2"; + } + else if (eventParam2.equals(SET_NONE)) + { + eventParam2 = "3"; + } + else if (DEBUG) + { + throw new RuntimeException(); + } + return manageSelectedSet(eventParam1, eventParam2, eventParam3); + + case "editSelectedBuff": + { + eventParam2 = eventParam2.replace("-", " "); + String[] split = eventParam2.split(" "); + String action = split[0]; + String page = split[1]; + manageSelectedBuff(eventParam1, action); + final String typeName; + switch (eventParam3) + { + case "buff": + typeName = "Buffs"; + break; + case "resist": + typeName = "Resists"; + break; + case "song": + typeName = "Songs"; + break; + case "dance": + typeName = "Dances"; + break; + case "chant": + typeName = "Chants"; + break; + case "others": + typeName = "Others_Buffs"; + break; + case "special": + typeName = "Special_Buffs"; + break; + case "cubic": + typeName = "Cubics"; + break; + default: + throw new RuntimeException(); + } + return viewAllBuffs(eventParam3, typeName, page); + } + + case "viewSelectedConfig": + throw new RuntimeException(); + + case "changeConfig": + throw new RuntimeException(); + + case "heal": + if ((int) (System.currentTimeMillis() / 1000) > st.getInt("blockUntilTime")) + { + if (player.isInCombat() && !ENABLE_HEAL_IN_COMBAT) + { + return showText(st, "Info", "You can't use the heal function while in combat.", false, "Return", "main"); + } + + if (st.getQuestItemsCount(CONSUMABLE_ID) < HEAL_PRICE) + { + return showText(st, "Sorry", "You don't have the enough items:<br>You need: <font color=LEVEL>" + HEAL_PRICE + " " + getItemNameHtml(st, CONSUMABLE_ID) + "!", false, "0", "0"); + } + final boolean getSummonbuff = isPetBuff(st); + if (getSummonbuff) + { + if (player.getSummon() != null) + { + heal(player, getSummonbuff); + } + else + { + return showText(st, "Info", "You can't use the Pet's options.<br>Summon your pet first!", false, "Return", "main"); + } + } + else + { + heal(player, getSummonbuff); + } + st.takeItems(CONSUMABLE_ID, HEAL_PRICE); + if (TIME_OUT) + { + addTimeout(st, 1, TIME_OUT_TIME / 2, 600); + } + } + return SMART_WINDOW ? null : rebuildMainHtml(st); + + case "removeBuffs": + if ((int) (System.currentTimeMillis() / 1000) > st.getInt("blockUntilTime")) + { + if (st.getQuestItemsCount(CONSUMABLE_ID) < BUFF_REMOVE_PRICE) + { + return showText(st, "Sorry", "You don't have the enough items:<br>You need: <font color=LEVEL>" + BUFF_REMOVE_PRICE + " " + getItemNameHtml(st, CONSUMABLE_ID) + "!", false, "0", "0"); + } + final boolean getSummonbuff = isPetBuff(st); + if (getSummonbuff) + { + if (player.getSummon() != null) + { + player.getSummon().stopAllEffects(); + } + else + { + return showText(st, "Info", "You can't use the Pet's options.<br>Summon your pet first!", false, "Return", "main"); + } + } + else + { + player.stopAllEffects(); + if (player.getCubics() != null) + { + for (L2CubicInstance cubic : player.getCubics().values()) + { + cubic.stopAction(); + player.getCubics().remove(cubic); + } + } + } + st.takeItems(CONSUMABLE_ID, BUFF_REMOVE_PRICE); + if (TIME_OUT) + { + addTimeout(st, 2, TIME_OUT_TIME / 2, 600); + } + } + return SMART_WINDOW ? null : rebuildMainHtml(st); + + case "cast": + if ((int) (System.currentTimeMillis() / 1000) > st.getInt("blockUntilTime")) + { + List<Integer> buffs = new ArrayList<>(); + List<Integer> levels = new ArrayList<>(); + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement rss = con.prepareStatement("SELECT * FROM npcbuffer_scheme_contents WHERE scheme_id=? ORDER BY id"); + rss.setString(1, eventParam1); + ResultSet action = rss.executeQuery(); + while (action.next()) + { + int id = Integer.parseInt(action.getString("skill_id")); + int level = Integer.parseInt(action.getString("skill_level")); + switch (getBuffType(id)) + { + case "buff": + if (ENABLE_BUFFS) + { + if (isEnabled(id, level)) + { + buffs.add(id); + levels.add(level); + } + } + break; + case "resist": + if (ENABLE_RESIST) + { + if (isEnabled(id, level)) + { + buffs.add(id); + levels.add(level); + } + } + break; + case "song": + if (ENABLE_SONGS) + { + if (isEnabled(id, level)) + { + buffs.add(id); + levels.add(level); + } + } + break; + case "dance": + if (ENABLE_DANCES) + { + if (isEnabled(id, level)) + { + buffs.add(id); + levels.add(level); + } + } + break; + case "chant": + if (ENABLE_CHANTS) + { + if (isEnabled(id, level)) + { + buffs.add(id); + levels.add(level); + } + } + break; + case "others": + if (ENABLE_OTHERS) + { + if (isEnabled(id, level)) + { + buffs.add(id); + levels.add(level); + } + } + break; + case "special": + if (ENABLE_SPECIAL) + { + if (isEnabled(id, level)) + { + buffs.add(id); + levels.add(level); + } + } + break; + default: + if (DEBUG) + { + throw new RuntimeException(); + } + } + } + } + catch (SQLException e) + { + print(e); + } + + if (buffs.size() == 0) + { + return viewAllSchemeBuffs(eventParam1, "1", "add"); + } + if (!FREE_BUFFS) + { + if (st.getQuestItemsCount(CONSUMABLE_ID) < SCHEME_BUFF_PRICE) + { + return showText(st, "Sorry", "You don't have the enough items:<br>You need: <font color=LEVEL>" + SCHEME_BUFF_PRICE + " " + getItemNameHtml(st, CONSUMABLE_ID) + "!", false, "0", "0"); + } + } + + final boolean getSummonbuff = isPetBuff(st); + for (int i = 0; i < buffs.size(); ++i) + { + if (!getSummonbuff) + { + npc.broadcastPacket(new MagicSkillUse(npc, player, buffs.get(i), 1, 1, 1)); + SkillData.getInstance().getSkill(buffs.get(i), levels.get(i)).applyEffects(player, player); + } + else + { + if (player.getSummon() != null) + { + npc.broadcastPacket(new MagicSkillUse(npc, player.getSummon(), buffs.get(i), 1, 1, 1)); + SkillData.getInstance().getSkill(buffs.get(i), levels.get(i)).applyEffects(player.getSummon(), player.getSummon()); + } + else + { + return showText(st, "Info", "You can't use the Pet's options.<br>Summon your pet first!", false, "Return", "main"); + } + } + } + st.takeItems(CONSUMABLE_ID, SCHEME_BUFF_PRICE); + if (TIME_OUT) + { + addTimeout(st, 3, TIME_OUT_TIME, 600); + } + } + return SMART_WINDOW ? null : rebuildMainHtml(st); + + case "giveBuffs": + { + final int cost; + switch (eventParam3) + { + case "buff": + cost = BUFF_PRICE; + break; + case "resist": + cost = RESIST_PRICE; + break; + case "song": + cost = SONG_PRICE; + break; + case "dance": + cost = DANCE_PRICE; + break; + case "chant": + cost = CHANT_PRICE; + break; + case "others": + cost = OTHERS_PRICE; + break; + case "special": + cost = SPECIAL_PRICE; + break; + case "cubic": + cost = CUBIC_PRICE; + break; + default: + throw new RuntimeException(); + } + + if ((int) (System.currentTimeMillis() / 1000) > st.getInt("blockUntilTime")) + { + if (!FREE_BUFFS) + { + if (st.getQuestItemsCount(CONSUMABLE_ID) < cost) + { + return showText(st, "Sorry", "You don't have the enough items:<br>You need: <font color=LEVEL>" + cost + " " + getItemNameHtml(st, CONSUMABLE_ID) + "!", false, "0", "0"); + } + } + Skill skill = SkillData.getInstance().getSkill(Integer.parseInt(eventParam1), Integer.parseInt(eventParam2)); + if (skill.hasEffectType(L2EffectType.SUMMON)) + { + if (st.getQuestItemsCount(skill.getItemConsumeId()) < skill.getItemConsume()) + { + return showText(st, "Sorry", "You don't have the enough items:<br>You need: <font color=LEVEL>" + skill.getItemConsume() + " " + getItemNameHtml(st, skill.getItemConsumeId()) + "!", false, "0", "0"); + } + } + final boolean getSummonbuff = isPetBuff(st); + if (!getSummonbuff) + { + if (eventParam3.equals("cubic")) + { + if (player.getCubics() != null) + { + for (L2CubicInstance cubic : player.getCubics().values()) + { + cubic.stopAction(); + player.getCubics().remove(cubic); + } + } + npc.broadcastPacket(new MagicSkillUse(npc, player, Integer.parseInt(eventParam1), 1, 1, 1)); + player.useMagic(SkillData.getInstance().getSkill(Integer.parseInt(eventParam1), Integer.parseInt(eventParam2)), false, false); + } + else + { + npc.broadcastPacket(new MagicSkillUse(npc, player, Integer.parseInt(eventParam1), 1, 1, 1)); + SkillData.getInstance().getSkill(Integer.parseInt(eventParam1), Integer.parseInt(eventParam2)).applyEffects(player, player); + } + } + else + { + if (eventParam3.equals("cubic")) + { + if (player.getCubics() != null) + { + for (L2CubicInstance cubic : player.getCubics().values()) + { + cubic.stopAction(); + player.getCubics().remove(cubic); + } + } + npc.broadcastPacket(new MagicSkillUse(npc, player, Integer.parseInt(eventParam1), 1, 1, 1)); + player.useMagic(SkillData.getInstance().getSkill(Integer.parseInt(eventParam1), Integer.parseInt(eventParam2)), false, false); + } + else + { + if (player.getSummon() != null) + { + npc.broadcastPacket(new MagicSkillUse(npc, player.getSummon(), Integer.parseInt(eventParam1), 1, 1, 1)); + SkillData.getInstance().getSkill(Integer.parseInt(eventParam1), Integer.parseInt(eventParam2)).applyEffects(player.getSummon(), player.getSummon()); + } + else + { + return showText(st, "Info", "You can't use the Pet's options.<br>Summon your pet first!", false, "Return", "main"); + } + } + } + st.takeItems(CONSUMABLE_ID, cost); + if (TIME_OUT) + { + addTimeout(st, 3, TIME_OUT_TIME / 10, 600); + } + } + return SMART_WINDOW ? null : buildHtml(eventParam3); + } + + case "castBuffSet": + if ((int) (System.currentTimeMillis() / 1000) > st.getInt("blockUntilTime")) + { + if (!FREE_BUFFS) + { + if (st.getQuestItemsCount(CONSUMABLE_ID) < BUFF_SET_PRICE) + { + return showText(st, "Sorry", "You don't have the enough items:<br>You need: <font color=LEVEL>" + BUFF_SET_PRICE + " " + getItemNameHtml(st, CONSUMABLE_ID) + "!", false, "0", "0"); + } + } + List<int[]> buff_sets = new ArrayList<>(); + final int player_class; + if (player.isMageClass()) + { + player_class = 1; + } + else + { + player_class = 0; + } + final boolean getSummonbuff = isPetBuff(st); + if (!getSummonbuff) + { + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement getSimilarNameCount = con.prepareStatement("SELECT buffId,buffLevel FROM npcbuffer_buff_list WHERE forClass IN (?,?) ORDER BY id ASC"); + getSimilarNameCount.setInt(1, player_class); + getSimilarNameCount.setString(2, "2"); + ResultSet rss = getSimilarNameCount.executeQuery(); + while (rss.next()) + { + int id = rss.getInt("buffId"); + int lvl = rss.getInt("buffLevel"); + buff_sets.add(new int[] + { + id, + lvl + }); + } + } + catch (SQLException e) + { + print(e); + } + for (int[] i : buff_sets) + { + npc.broadcastPacket(new MagicSkillUse(npc, player, i[0], 1, 1, 1)); + SkillData.getInstance().getSkill(i[0], i[1]).applyEffects(player, player); + } + } + else + { + if (player.getSummon() != null) + { + try (Connection con = L2DatabaseFactory.getInstance().getConnection()) + { + PreparedStatement getSimilarNameCount = con.prepareStatement("SELECT buffId,buffLevel FROM npcbuffer_buff_list WHERE forClass IN (?,?) ORDER BY id ASC"); + getSimilarNameCount.setString(1, "0"); + getSimilarNameCount.setString(2, "2"); + ResultSet rss = getSimilarNameCount.executeQuery(); + while (rss.next()) + { + int id = rss.getInt("buffId"); + int lvl = rss.getInt("buffLevel"); + buff_sets.add(new int[] + { + id, + lvl + }); + } + } + catch (SQLException e) + { + print(e); + } + for (int[] i : buff_sets) + { + npc.broadcastPacket(new MagicSkillUse(npc, player.getSummon(), i[0], 1, 1, 1)); + SkillData.getInstance().getSkill(i[0], i[1]).applyEffects(player.getSummon(), player.getSummon()); + } + } + else + { + return showText(st, "Info", "You can't use the Pet's options.<br>Summon your pet first!", false, "Return", "main"); + } + } + st.takeItems(CONSUMABLE_ID, BUFF_SET_PRICE); + if (TIME_OUT) + { + addTimeout(st, 3, TIME_OUT_TIME, 600); + } + } + return SMART_WINDOW ? null : rebuildMainHtml(st); + + } + return rebuildMainHtml(st); + } + + @SuppressWarnings("unused") + @Override + public String onFirstTalk(L2Npc npc, L2PcInstance player) + { + QuestState st = player.getQuestState(QUEST_LOADING_INFO); + if (st == null) + { + st = newQuestState(player); + } + if (player.isGM()) + { + if (SCRIPT_RELOAD) + { + return reloadPanel(st); + } + return rebuildMainHtml(st); + } + else if ((int) (System.currentTimeMillis() / 1000) > st.getInt("blockUntilTime")) + { + return showText(st, "Sorry", "You have to wait a while!<br>if you wish to use my services!", false, "Return", "main"); + } + if (!BUFF_WITH_KARMA && (player.getKarma() > 0)) + { + return showText(st, "Info", "You have too much <font color=FF0000>karma!</font><br>Come back,<br>when you don't have any karma!", false, "Return", "main"); + } + else if (OlympiadManager.getInstance().isRegistered(player)) + { + return showText(st, "Info", "You can not buff while you are in <font color=FF0000>Olympiad!</font><br>Come back,<br>when you are out of the Olympiad.", false, "Return", "main"); + } + else if (TvTEvent.isPlayerParticipant(player.getObjectId())) + { + return showText(st, "Info", "You can not buff while you are in <font color=\"FF0000\">TvT!</font><br>Come back,<br>when you are out of TvT!", false, "Return", "main"); + } + else if (player.getLevel() < MIN_LEVEL) + { + return showText(st, "Info", "Your level is too low!<br>You have to be at least level <font color=LEVEL>" + MIN_LEVEL + "</font>,<br>to use my services!", false, "Return", "main"); + } + else if (player.getPvpFlag() > 0) + { + return showText(st, "Info", "You can't buff while you are <font color=800080>flagged!</font><br>Wait some time and try again!", false, "Return", "main"); + } + else if (player.isInCombat()) + { + return showText(st, "Info", "You can't buff while you are attacking!<br>Stop your fight and try again!", false, "Return", "main"); + } + else + { + return rebuildMainHtml(st); + } + } + + @Override + public boolean showResult(L2PcInstance player, String res) + { + if (SMART_WINDOW) + { + if ((player != null) && (res != null) && res.startsWith("<html>")) + { + final NpcHtmlMessage npcReply = new NpcHtmlMessage(); + npcReply.setHtml(res); + player.sendPacket(npcReply); + player.sendPacket(ActionFailed.STATIC_PACKET); + return false; + } + } + return super.showResult(player, res); + } + + private String getSkillIconHtml(int id, int level) + { + String iconNumber = getSkillIconNumber(id, level); + return "<button action=\"bypass -h Quest " + QUEST_LOADING_INFO + " description " + id + " " + level + " x\" width=32 height=32 back=\"Icon.skill" + iconNumber + "\" fore=\"Icon.skill" + iconNumber + "\">"; + } + + private String getSkillIconNumber(int id, int level) + { + String formato; + if (id == 4) + { + formato = "0004"; + } + else if ((id > 9) && (id < 100)) + { + formato = "00" + id; + } + else if ((id > 99) && (id < 1000)) + { + formato = "0" + id; + } + else if (id == 1517) + { + formato = "1536"; + } + else if (id == 1518) + { + formato = "1537"; + } + else if (id == 1547) + { + formato = "0065"; + } + else if (id == 2076) + { + formato = "0195"; + } + else if ((id > 4550) && (id < 4555)) + { + formato = "5739"; + } + else if ((id > 4698) && (id < 4701)) + { + formato = "1331"; + } + else if ((id > 4701) && (id < 4704)) + { + formato = "1332"; + } + else if (id == 6049) + { + formato = "0094"; + } + else + { + formato = String.valueOf(id); + } + return formato; + } + + static public void main(String[] args) + { + new NpcBuffer(); + } +} \ No newline at end of file Index: dist/game/data/stats/npcs/custom/custom.xml =================================================================== --- dist/game/data/stats/npcs/custom/custom.xml (revision 10413) +++ dist/game/data/stats/npcs/custom/custom.xml (working copy) @@ -58,4 +58,10 @@ <height normal="22.25" /> </collision> </npc> + <npc id="12" displayId="32226" name="Rin4a" usingServerSideName="true" title="NPC Buffer" usingServerSideTitle="true" type="L2NpcBuffer"> + <collision> + <radius normal="11" /> + <height normal="22.25" /> + </collision> + </npc> </list> \ No newline at end of file Index: dist/sql/game/scheme_npcbuffer.sql =================================================================== --- dist/sql/game/scheme_npcbuffer.sql (revision 0) +++ dist/sql/game/scheme_npcbuffer.sql (working copy) @@ -0,0 +1,182 @@ +DROP TABLE IF EXISTS `npcbuffer_buff_list`; +DROP TABLE IF EXISTS `npcbuffer_scheme_contents`; +DROP TABLE IF EXISTS `npcbuffer_scheme_list`; + +CREATE TABLE `npcbuffer_buff_list` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `buff_class` int(2) DEFAULT NULL, + `buffType` varchar(10) DEFAULT NULL, + `buffId` int(5) DEFAULT '0', + `buffLevel` int(5) DEFAULT NULL, + `forClass` tinyint(1) DEFAULT NULL, + `canUse` tinyint(1) DEFAULT NULL, + PRIMARY KEY (`id`) +) AUTO_INCREMENT=136; +CREATE TABLE `npcbuffer_scheme_contents` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `scheme_id` int(11) DEFAULT NULL, + `skill_id` int(8) DEFAULT NULL, + `skill_level` int(4) DEFAULT NULL, + `buff_class` int(2) DEFAULT NULL, + PRIMARY KEY (`id`) +) AUTO_INCREMENT=30; +CREATE TABLE `npcbuffer_scheme_list` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `player_id` varchar(40) DEFAULT NULL, + `scheme_name` varchar(36) DEFAULT NULL, + `mod_accepted` tinyint(1) DEFAULT NULL, + PRIMARY KEY (`id`) +) AUTO_INCREMENT=7; + +INSERT INTO `npcbuffer_buff_list` VALUES ('1', '0', 'buff', '1036', '2', '2', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('2', '0', 'buff', '1040', '3', '2', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('3', '0', 'buff', '1043', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('4', '0', 'buff', '1044', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('5', '0', 'buff', '1045', '6', '2', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('6', '0', 'buff', '1047', '4', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('7', '0', 'buff', '1048', '6', '2', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('8', '0', 'buff', '1059', '3', '1', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('9', '0', 'buff', '1068', '3', '0', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('10', '0', 'buff', '1077', '3', '0', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('11', '0', 'buff', '1085', '3', '1', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('12', '0', 'buff', '1086', '2', '0', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('13', '0', 'buff', '1087', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('14', '0', 'buff', '1204', '2', '2', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('15', '0', 'buff', '1240', '3', '0', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('16', '0', 'buff', '1242', '3', '0', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('17', '0', 'buff', '1243', '6', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('18', '0', 'buff', '1257', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('19', '0', 'buff', '1268', '4', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('20', '0', 'buff', '1303', '2', '1', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('21', '0', 'buff', '1304', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('22', '0', 'buff', '1307', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('23', '0', 'buff', '1311', '6', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('24', '0', 'buff', '1397', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('25', '0', 'buff', '1460', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('26', '0', 'buff', '1232', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('27', '0', 'buff', '1238', '3', '3', '0'); +INSERT INTO `npcbuffer_buff_list` VALUES ('28', '0', 'special', '1323', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('29', '0', 'special', '1388', '3', '0', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('30', '0', 'special', '1389', '3', '1', '1'); + +INSERT INTO `npcbuffer_buff_list` VALUES ('31', '1', 'song', '264', '1', '2', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('32', '1', 'song', '265', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('33', '1', 'song', '266', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('34', '1', 'song', '267', '1', '2', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('35', '1', 'song', '268', '1', '2', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('36', '1', 'song', '269', '1', '0', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('37', '1', 'song', '270', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('38', '1', 'song', '304', '1', '2', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('39', '1', 'song', '305', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('40', '1', 'song', '306', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('41', '1', 'song', '308', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('42', '1', 'song', '349', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('43', '1', 'song', '363', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('44', '1', 'song', '364', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('45', '1', 'song', '529', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('46', '1', 'song', '764', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('47', '1', 'song', '914', '1', '3', '1'); + +INSERT INTO `npcbuffer_buff_list` VALUES ('48', '2', 'dance', '271', '1', '0', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('49', '2', 'dance', '272', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('50', '2', 'dance', '273', '1', '1', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('51', '2', 'dance', '274', '1', '0', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('52', '2', 'dance', '275', '1', '0', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('53', '2', 'dance', '276', '1', '1', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('54', '2', 'dance', '277', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('55', '2', 'dance', '307', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('56', '2', 'dance', '309', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('57', '2', 'dance', '310', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('58', '2', 'dance', '311', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('59', '2', 'dance', '365', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('60', '2', 'dance', '366', '1', '3', '0'); +INSERT INTO `npcbuffer_buff_list` VALUES ('61', '2', 'dance', '530', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('62', '2', 'dance', '765', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('63', '2', 'dance', '915', '1', '3', '1'); + +INSERT INTO `npcbuffer_buff_list` VALUES ('64', '3', 'resist', '1461', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('65', '3', 'chant', '1002', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('66', '3', 'chant', '1006', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('67', '3', 'chant', '1007', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('68', '3', 'chant', '1009', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('69', '3', 'chant', '1251', '2', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('70', '3', 'chant', '1252', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('71', '3', 'chant', '1253', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('72', '3', 'chant', '1284', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('73', '3', 'chant', '1308', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('74', '3', 'chant', '1309', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('75', '3', 'chant', '1310', '4', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('76', '3', 'chant', '1362', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('77', '3', 'special', '1499', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('78', '3', 'special', '1500', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('79', '3', 'special', '1501', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('80', '3', 'special', '1502', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('81', '3', 'special', '1503', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('82', '3', 'special', '1504', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('83', '3', 'special', '1519', '1', '3', '1'); + +INSERT INTO `npcbuffer_buff_list` VALUES ('84', '4', 'others', '825', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('85', '4', 'others', '826', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('86', '4', 'others', '827', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('87', '4', 'others', '828', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('88', '4', 'others', '829', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('89', '4', 'others', '830', '1', '3', '1'); + +INSERT INTO `npcbuffer_buff_list` VALUES ('90', '5', 'others', '834', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('91', '5', 'others', '1442', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('92', '5', 'others', '1443', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('93', '5', 'others', '1444', '1', '3', '1'); + +INSERT INTO `npcbuffer_buff_list` VALUES ('94', '6', 'cubic', '67', '7', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('95', '6', 'cubic', '10', '8', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('96', '6', 'cubic', '22', '7', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('97', '6', 'cubic', '33', '8', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('98', '6', 'cubic', '278', '6', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('99', '6', 'cubic', '449', '4', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('100', '6', 'cubic', '1279', '9', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('101', '6', 'cubic', '1280', '9', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('102', '6', 'cubic', '1281', '9', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('103', '6', 'cubic', '1328', '8', '3', '0'); +INSERT INTO `npcbuffer_buff_list` VALUES ('104', '6', 'cubic', '1329', '9', '3', '0'); +INSERT INTO `npcbuffer_buff_list` VALUES ('105', '6', 'cubic', '1330', '8', '3', '0'); +INSERT INTO `npcbuffer_buff_list` VALUES ('106', '6', 'cubic', '779', '1', '3', '1'); + +INSERT INTO `npcbuffer_buff_list` VALUES ('107', '7', 'special', '1062', '2', '2', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('108', '7', 'special', '1355', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('109', '7', 'special', '1356', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('110', '7', 'special', '1357', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('111', '7', 'special', '1363', '1', '0', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('112', '7', 'special', '1413', '1', '1', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('114', '7', 'special', '1457', '1', '3', '0'); +INSERT INTO `npcbuffer_buff_list` VALUES ('115', '7', 'special', '4699', '13', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('116', '7', 'special', '4700', '13', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('117', '7', 'special', '4702', '13', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('118', '7', 'special', '4703', '13', '3', '1'); + +INSERT INTO `npcbuffer_buff_list` VALUES ('119', '8', 'resist', '1032', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('120', '8', 'resist', '1033', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('121', '8', 'resist', '1035', '4', '2', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('122', '8', 'resist', '1078', '6', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('123', '8', 'resist', '1182', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('124', '8', 'resist', '1189', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('125', '8', 'resist', '1191', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('126', '8', 'resist', '1259', '4', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('127', '8', 'resist', '1352', '1', '2', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('128', '8', 'resist', '1353', '1', '2', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('129', '8', 'resist', '1354', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('130', '8', 'resist', '1392', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('131', '8', 'resist', '1393', '3', '3', '1'); + +INSERT INTO `npcbuffer_buff_list` VALUES ('132', '8', 'overlord', '1003', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('133', '8', 'overlord', '1004', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('134', '8', 'overlord', '1005', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('135', '8', 'overlord', '1008', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('136', '8', 'overlord', '1249', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('137', '8', 'overlord', '1250', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('138', '8', 'overlord', '1260', '3', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('139', '8', 'overlord', '1261', '2', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('140', '8', 'overlord', '1282', '2', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('141', '8', 'overlord', '1364', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('142', '8', 'overlord', '1365', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('143', '8', 'overlord', '1415', '1', '3', '1'); +INSERT INTO `npcbuffer_buff_list` VALUES ('144', '8', 'overlord', '1416', '1', '3', '1'); \ No newline at end of file
  2. Professional Lineage 2 High Five Emulator! Server emulator fully written in Java. http://www.l2jdevs.org Telegram channel: https://t.me/l2jdevs We are waiting you, regards!
×