package scripting;
import client.MapleCharacter;
import client.MapleCharacterUtil;
import client.MapleClient;
import client.MapleJob;
import client.MapleQuestStatus;
import client.MapleStat;
import client.Skill;
import client.SkillEntry;
import client.SkillFactory;
import client.inventory.Equip;
import client.inventory.Item;
import client.inventory.ItemFlag;
import client.inventory.MapleInventory;
import client.inventory.MapleInventoryType;
import constants.GameConstants;
import constants.ItemConstants;
import constants.ServerConfig;
import tools.SearchGenerator;
import database.DatabaseConnection;
import handling.SendPacketOpcode;
import handling.channel.ChannelServer;
import handling.channel.MapleGuildRanking;
import handling.channel.handler.HiredMerchantHandler;
import handling.channel.handler.InventoryHandler;
import handling.channel.handler.PlayersHandler;
import handling.login.LoginInformationProvider;
import handling.world.MapleParty;
import handling.world.MaplePartyCharacter;
import handling.world.World;
import handling.world.exped.ExpeditionType;
import handling.world.guild.MapleGuild;
import handling.world.guild.MapleGuildAlliance;
import java.awt.Point;
import java.io.File;
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.EnumMap;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.script.Invocable;
import provider.MapleDataDirectoryEntry;
import provider.MapleDataFileEntry;
import provider.MapleDataProvider;
import provider.MapleDataProviderFactory;
import server.MapleCarnivalChallenge;
import server.MapleCarnivalParty;
import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.MapleSlideMenu;
import server.MapleSquad;
import server.MapleStatEffect;
import server.Randomizer;
import server.SpeedRunner;
import server.StructItemOption;
import server.Timer.CloneTimer;
import server.life.*;
import server.maps.Event_DojoAgent;
import server.maps.Event_PyramidSubway;
import server.maps.MapleMap;
import server.quest.MapleQuest;
import server.shops.MapleShopFactory;
import tools.FileoutputUtil;
import tools.Pair;
import tools.StringUtil;
import tools.Triple;
import tools.data.MaplePacketLittleEndianWriter;
import tools.packet.CField;
import tools.packet.CField.NPCPacket;
import tools.packet.CField.UIPacket;
import tools.packet.CWvsContext;
import tools.packet.CWvsContext.GuildPacket;
import tools.packet.CWvsContext.InfoPacket;
public class NPCConversationManager extends AbstractPlayerInteraction {
private String getText;
private final ScriptType type; // -1 = NPC, 0 = start quest, 1 = end quest
private byte lastMsg = -1;
public boolean pendingDisposal = false;
private final Invocable iv;
public NPCConversationManager(MapleClient c, int npc, int questid, String npcscript, ScriptType type, Invocable iv) {
super(c, npc, questid, npcscript);
this.type = type;
this.iv = iv;
}
public Invocable getIv() {
return iv;
}
public int getNpc() {
return id;
}
public int getQuest() {
return id2;
}
public String getScript() {
return script;
}
public ScriptType getType() {
return type;
}
public void safeDispose() {
pendingDisposal = true;
}
public void dispose() {
NPCScriptManager.getInstance().dispose(c);
}
public void sendSlideMenu(final int type, final String sel) {
int lasticon = 0;
c.getSession().write(NPCPacket.getSlideMenu(id, type, lasticon, sel));
lastMsg = 0x11;//was12
}
public String getDimensionalMirror(MapleCharacter character) {
return MapleSlideMenu.SlideMenu0.getSelectionInfo(character, id);
}
public String getSlideMenuSelection(int type) {
switch (type) {
case 0:
return MapleSlideMenu.SlideMenu0.getSelectionInfo(getPlayer(), id);
case 1:
return MapleSlideMenu.SlideMenu1.getSelectionInfo(getPlayer(), id);
case 2:
return MapleSlideMenu.SlideMenu2.getSelectionInfo(getPlayer(), id);
case 3:
return MapleSlideMenu.SlideMenu3.getSelectionInfo(getPlayer(), id);
case 4:
return MapleSlideMenu.SlideMenu4.getSelectionInfo(getPlayer(), id);
case 5:
return MapleSlideMenu.SlideMenu5.getSelectionInfo(getPlayer(), id);
case 6:
return MapleSlideMenu.SlideMenu6.getSelectionInfo(getPlayer(), id);
default:
return MapleSlideMenu.SlideMenu0.getSelectionInfo(getPlayer(), id);
}
}
public int[] getSlideMenuDataIntegers(int type, int selection) {
switch (type) {
case 0:
return MapleSlideMenu.SlideMenu0.getDataIntegers(selection);
case 1:
return MapleSlideMenu.SlideMenu1.getDataIntegers(selection);
case 2:
return MapleSlideMenu.SlideMenu2.getDataIntegers(selection);
case 3:
return MapleSlideMenu.SlideMenu3.getDataIntegers(selection);
case 4:
return MapleSlideMenu.SlideMenu4.getDataIntegers(selection);
case 5:
return MapleSlideMenu.SlideMenu5.getDataIntegers(selection);
case 6:
return MapleSlideMenu.SlideMenu6.getDataIntegers(selection);
default:
return MapleSlideMenu.SlideMenu0.getDataIntegers(selection);
}
}
public void sendNext(String text) {
sendNext(text, id);
}
public void sendNext(String text, int id) {
if (text.contains("#L")) { //sendNext will dc otherwise!
sendSimple(text);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 0, text, "00 01", (byte) 0));
lastMsg = 0;
}
public void sendPlayerToNpc(String text) {
sendNextS(text, (byte) 3, id);
}
public void sendNextNoESC(String text) {
sendNextS(text, (byte) 1, id);
}
public void sendNextNoESC(String text, int id) {
sendNextS(text, (byte) 1, id);
}
public void sendNextS(String text, byte type) {
sendNextS(text, type, id);
}
public void sendNextS(String text, byte type, int idd) {
sendNextS(text, type, idd, id);
}
public void sendNextS(String text, byte type, int idd, int npcid) {
if (text.contains("#L")) { // will dc otherwise!
sendSimpleS(text, type);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(npcid, (byte) 0, text, "00 01", type, idd));
lastMsg = 0;
}
public void sendNextSNew(String text, byte type, byte type2) {
sendNextSNew(text, type, type2, id);
}
public void sendNextSNew(String text, byte type, byte type2, int idd) {
if (text.contains("#L")) { // will dc otherwise!
sendSimpleSNew(text, type, type2);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 0, text, "00 01", type, type2, idd));
lastMsg = 0;
}
public void sendPrev(String text) {
sendPrev(text, id);
}
public void sendPrev(String text, int id) {
if (text.contains("#L")) { // will dc otherwise!
sendSimple(text);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 0, text, "01 00", (byte) 0));
lastMsg = 0;
}
public void sendZeroTalk(String talk) {
c.getSession().write(NPCPacket.getZeroNPCTalk(id, (byte) 0, talk, "01 00", (byte) 3, 0));
}
public void sendSangokuTalk(String talk, int idd, boolean next, boolean prev) {
sendSangokuTalk(talk, (byte) 5, idd, next, prev);
}
public void sendSangokuTalk(boolean unknown, String talk, int idd, boolean next, boolean prev) {
sendSangokuTalk(unknown, talk, (byte) 5, idd, next, prev);
}
public void sendSangokuTalk(String talk, int idd, boolean next, boolean prev, boolean pic) {
sendSangokuTalk(talk, (byte) 5, idd, next, prev, pic);
}
public void sendSangokuTalk(boolean unknown, String talk, int idd, boolean next, boolean prev, boolean pic) {
sendSangokuTalk(unknown, talk, (byte) 5, idd, next, prev, pic);
}
public void sendSangokuTalk(String talk, int type, int idd, boolean next, boolean prev) {
sendSangokuTalk(false, talk, (byte) 0x19, (byte) type, idd, next, prev, true);
}
public void sendSangokuTalk(boolean unknown, String talk, int type, int idd, boolean next, boolean prev) {
sendSangokuTalk(unknown, talk, (byte) 0x19, (byte) type, idd, next, prev, true);
}
public void sendSangokuTalk(String talk, int type, int idd, boolean next, boolean prev, boolean pic) {
sendSangokuTalk(false, talk, (byte) 0x19, (byte) type, idd, next, prev, pic);
}
public void sendSangokuTalk(boolean unknown, String talk, int type, int idd, boolean next, boolean prev, boolean pic) {
sendSangokuTalk(unknown, talk, (byte) 0x19, (byte) type, idd, next, prev, pic);
}
public void sendSangokuTalk(boolean unknown, String talk, int msgType, int type, int idd, boolean next, boolean prev, boolean pic) {
c.getSession().write(NPCPacket.getSengokuNPCTalk(unknown, id, (byte) msgType, (byte) type, idd, talk, next, prev, pic));
lastMsg = (byte) msgType;
}
public final void DisableUI(final boolean enabled) {
c.getSession().write(UIPacket.IntroDisableUI(enabled));
}
public void sendPrevS(String text, byte type) {
sendPrevS(text, type, id);
}
public void sendPrevS(String text, byte type, int idd) {
if (text.contains("#L")) { // will dc otherwise!
sendSimpleS(text, type);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 0, text, "01 00", type, idd));
lastMsg = 0;
}
public void sendPrevSNew(String text, byte type, byte type2) {
sendPrevSNew(text, type, type2, id);
}
public void sendPrevSNew(String text, byte type, byte type2, int idd) {
if (text.contains("#L")) { // will dc otherwise!
sendSimpleSNew(text, type, type2);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 0, text, "01 00", type, type2, idd));
lastMsg = 0;
}
public void sendNextPrev(String text) {
sendNextPrev(text, id);
}
public void sendNextPrev(String text, int id) {
if (text.contains("#L")) { // will dc otherwise!
sendSimple(text);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 0, text, "01 01", (byte) 0));
lastMsg = 0;
}
public void PlayerToNpc(String text) {
sendNextPrevS(text, (byte) 3);
}
public void sendNextPrevS(String text) {
sendNextPrevS(text, (byte) 3);
}
public void sendNextPrevS(String text, byte type) {
sendNextPrevS(text, type, id);
}
public void sendNextPrevS(String text, byte type, int idd) {
sendNextPrevS(text, type, idd, id);
}
public void sendNextPrevS(String text, byte type, int idd, int npcid) {
if (text.contains("#L")) { // will dc otherwise!
sendSimpleS(text, type);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(npcid, (byte) 0, text, "01 01", type, idd));
lastMsg = 0;
}
public void sendNextPrevSNew(String text, byte type, byte type2) {
sendNextPrevSNew(text, type, type2, id);
}
public void sendNextPrevSNew(String text, byte type, byte type2, int idd) {
sendNextPrevSNew(text, type, type2, idd, id);
}
public void sendNextPrevSNew(String text, byte type, byte type2, int idd, int npcid) {
if (text.contains("#L")) { // will dc otherwise!
sendSimpleSNew(text, type, type2);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(npcid, (byte) 0, text, "01 01", type, type2, idd));
lastMsg = 0;
}
public void sendOk(String text) {
sendOk(text, id);
}
public void sendOk(String text, int id) {
if (text.contains("#L")) { // will dc otherwise!
sendSimple(text);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 0, text, "00 00", (byte) 0));
lastMsg = 0;
}
public void sendOkS(String text, byte type) {
sendOkS(text, type, id);
}
public void sendOkS(String text, byte type, int idd) {
if (text.contains("#L")) { // will dc otherwise!
sendSimpleS(text, type);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 0, text, "00 00", type, idd));
lastMsg = 0;
}
public void sendOkSNew(String text, byte type, byte type2) {
sendOkSNew(text, type, type2, id);
}
public void sendOkSNew(String text, byte type, byte type2, int idd) {
if (text.contains("#L")) { // will dc otherwise!
sendSimpleSNew(text, type, type2);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 0, text, "00 00", type, type2, idd));
lastMsg = 0;
}
// public void sendSelfTalk(String text, byte type) {
// c.getSession().write(NPCPacket.getSelfTalkText(text));
// }
public void sendSelfTalk(String text) {
if (text.contains("#L")) { // will dc otherwise!
sendSimpleS(text, type.getValue());
return;
}
c.getSession().write(NPCPacket.getSelfTalkText(text));
lastMsg = 0;
}
public void sendYesNo(String text) {
sendYesNo(text, id);
}
public void sendYesNo(String text, int id) {
if (text.contains("#L")) { // will dc otherwise!
sendSimple(text);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 2, text, "", (byte) 0));
lastMsg = 2;
}
public void sendYesNoS(String text, byte type) {
sendYesNoS(text, type, id);
}
public void sendYesNoS(String text, byte type, int idd) {
if (text.contains("#L")) { // will dc otherwise!
sendSimpleS(text, type);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 2, text, "", type, idd));
lastMsg = 2;
}
public void sendYesNoSNew(String text, byte type, byte type2) {
sendYesNoSNew(text, type, type2, id);
}
public void sendYesNoSNew(String text, byte type, byte type2, int idd) {
if (text.contains("#L")) { // will dc otherwise!
sendSimpleSNew(text, type, type2);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 2, text, "", type, type2, idd));
lastMsg = 2;
}
public void sendAcceptDecline(String text) {
askAcceptDecline(text);
}
public void sendAcceptDeclineNoESC(String text) {
askAcceptDeclineNoESC(text);
}
public void askAcceptDecline(String text) {
askAcceptDecline(text, id);
}
public void askAcceptDecline(String text, int id) {
if (text.contains("#L")) { // will dc otherwise!
sendSimple(text);
return;
}
lastMsg = (byte) (0xF);
c.getSession().write(NPCPacket.getNPCTalk(id, lastMsg, text, "", (byte) 0));
}
public void askAcceptDeclineNoESC(String text) {
askAcceptDeclineNoESC(text, id);
}
public void askAcceptDeclineNoESC(String text, int id) {
if (text.contains("#L")) { // will dc otherwise!
sendSimple(text);
return;
}
lastMsg = (byte) 15;
c.getSession().write(NPCPacket.getNPCTalk(id, lastMsg, text, "", (byte) 1));
}
public void askAngelicBusterAvatar() {
c.getSession().write(NPCPacket.getAngelicBusterAvatarSelect(id));
lastMsg = 0x17;
}
public void askAvatar(String text, int... args) {
c.getSession().write(NPCPacket.getNPCTalkStyle(id, text, args, false));
lastMsg = 9;
}
public void sendSimple(String text) {
sendSimple(text, id);
}
public void sendSimple(String text, int id) {
if (!text.contains("#L")) { //sendSimple will dc otherwise!
sendNext(text);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 5, text, "", (byte) 0));
lastMsg = 5;
}
public void sendSimpleS(String text, byte type) {
sendSimpleS(text, type, id);
}
public void sendSimpleS(String text, byte type, int idd) {
if (!text.contains("#L")) { //sendSimple will dc otherwise!
sendNextS(text, type);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 5, text, "", type, idd));
lastMsg = 5;
}
public void sendSimpleSNew(String text, byte type, byte type2) {
sendSimpleSNew(text, type, type2, id);
}
public void sendSimpleSNew(String text, byte type, byte type2, int idd) {
if (!text.contains("#L")) { //sendSimple will dc otherwise!
sendNextSNew(text, type, type2);
return;
}
c.getSession().write(NPCPacket.getNPCTalk(id, (byte) 5, text, "", type, type2, idd));
lastMsg = 5;
}
public void sendStyle(String text, int styles[]) {
c.getSession().write(NPCPacket.getNPCTalkStyle(id, text, styles, false));
lastMsg = 9;
}
public void sendSecondStyle(String text, int styles[]) {
c.getSession().write(NPCPacket.getNPCTalkStyle(id, text, styles, true));
lastMsg = 9;
}
public void sendGetNumber(String text, int def, int min, int max) {
if (text.contains("#L")) { // will dc otherwise!
sendSimple(text);
return;
}
c.getSession().write(NPCPacket.getNPCTalkNum(id, text, def, min, max));
lastMsg = 4;
}
public void sendGetText(String text) {
sendGetText(text, id);
}
public void sendGetText(String text, int id) {
if (text.contains("#L")) { // will dc otherwise!
sendSimple(text);
return;
}
c.getSession().write(NPCPacket.getNPCTalkText(id, text));
lastMsg = 3;
}
public void setGetText(String text) {
this.getText = text;
}
public String getText() {
return getText;
}
public void setHair(int hair) {
if (hairExists(hair)) {
getPlayer().setHair(hair);
getPlayer().updateSingleStat(MapleStat.HAIR, hair);
getPlayer().equipChanged();
}
}
public void setFace(int face) {
if (faceExists(face)) {
getPlayer().setFace(face);
getPlayer().updateSingleStat(MapleStat.FACE, face);
getPlayer().equipChanged();
}
}
public void setSkin(int color) {
getPlayer().setSkinColor((byte) color);
getPlayer().updateSingleStat(MapleStat.SKIN, color);
getPlayer().equipChanged();
}
public static boolean hairExists(int hair) {
return MapleItemInformationProvider.getInstance().hairExists(hair);
}
public static boolean faceExists(int face) {
return MapleItemInformationProvider.getInstance().faceExists(face);
}
public int[] getCanHair(int[] hairs) {
List<Integer> canHair = new ArrayList();
List<Integer> cantHair = new ArrayList();
for (int hair : hairs) {
if (hairExists(hair)) {
canHair.add(hair);
} else {
cantHair.add(hair);
}
}
if (cantHair.size() > 0 && c.getPlayer().isAdmin()) {
StringBuilder sb = new StringBuilder("正在讀取的髮型里有");
sb.append(cantHair.size()).append("個髮型用戶端不支援顯示,已經被清除:");
for (int i = 0; i < cantHair.size(); i++) {
sb.append(cantHair.get(i));
if (i < cantHair.size() - 1) {
sb.append(",");
}
}
playerMessage(sb.toString());
}
int[] getHair = new int[canHair.size()];
for (int i = 0; i < canHair.size(); i++) {
getHair[i] = canHair.get(i);
}
return getHair;
}
public int[] getCanFace(int[] faces) {
List<Integer> canFace = new ArrayList();
List<Integer> cantFace = new ArrayList();
for (int face : faces) {
if (faceExists(face)) {
canFace.add(face);
} else {
cantFace.add(face);
}
}
if (cantFace.size() > 0 && c.getPlayer().isAdmin()) {
StringBuilder sb = new StringBuilder("正在讀取的臉型里有");
sb.append(cantFace.size()).append("個臉型用戶端不支援顯示,已經被清除:");
for (int i = 0; i < cantFace.size(); i++) {
sb.append(cantFace.get(i));
if (i < cantFace.size() - 1) {
sb.append(",");
}
}
playerMessage(sb.toString());
}
int[] getFace = new int[canFace.size()];
for (int i = 0; i < canFace.size(); i++) {
getFace[i] = canFace.get(i);
}
return getFace;
}
public static boolean itemExists(int itemId) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
for (Pair<Integer, String> item : ii.getAllItems2()) {
if (item.getLeft() == itemId) {
return true;
}
}
return false;
}
public int setRandomAvatar(int ticket, int... args_all) {
if (!haveItem(ticket)) {
return -1;
}
gainItem(ticket, (short) -1);
int args = args_all[Randomizer.nextInt(args_all.length)];
if (args < 100) {
c.getPlayer().setSkinColor((byte) args);
c.getPlayer().updateSingleStat(MapleStat.SKIN, args);
} else if (args < 30000) {
c.getPlayer().setFace(args);
c.getPlayer().updateSingleStat(MapleStat.FACE, args);
} else {
c.getPlayer().setHair(args);
c.getPlayer().updateSingleStat(MapleStat.HAIR, args);
}
c.getPlayer().equipChanged();
return 1;
}
public int setAvatar(int ticket, int args) {
if (!haveItem(ticket)) {
return -1;
}
gainItem(ticket, (short) -1);
if (args < 100) {
c.getPlayer().setSkinColor((byte) args);
c.getPlayer().updateSingleStat(MapleStat.SKIN, args);
} else if (args < 30000) {
c.getPlayer().setFace(args);
c.getPlayer().updateSingleStat(MapleStat.FACE, args);
} else {
c.getPlayer().setHair(args);
c.getPlayer().updateSingleStat(MapleStat.HAIR, args);
}
c.getPlayer().equipChanged();
return 1;
}
public void sendStorage() {
c.getPlayer().setConversation(4);
c.getPlayer().getStorage().sendStorage(c, id);
}
public void openShop(int id) {
MapleShopFactory.getInstance().getShop(id).sendShop(c);
}
public void openShopNPC(int id) {
MapleShopFactory.getInstance().getShop(id).sendShop(c, this.id);
}
public int gainGachaponItem(int id, int quantity) {
return gainGachaponItem(id, quantity, c.getPlayer().getMap().getStreetName());
}
public int gainGachaponItem(int id, int quantity, final String msg) {
try {
if (!MapleItemInformationProvider.getInstance().itemExists(id)) {
return -1;
}
final Item item = MapleInventoryManipulator.addbyId_Gachapon(c, id, (short) quantity);
if (item == null) {
return -1;
}
final byte rareness = ItemConstants.gachaponRareItem(item.getItemId());
if (rareness > 0) {
World.Broadcast.broadcastMessage(CWvsContext.getGachaponMega(c.getPlayer().getName(), " : got a(n)", item, rareness, msg));
}
c.getSession().write(InfoPacket.getShowItemGain(item.getItemId(), (short) quantity, true));
return item.getItemId();
} catch (Exception e) {
}
return -1;
}
public int useNebuliteGachapon() {
try {
if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNumFreeSlot() < 1
|| c.getPlayer().getInventory(MapleInventoryType.USE).getNumFreeSlot() < 1
|| c.getPlayer().getInventory(MapleInventoryType.SETUP).getNumFreeSlot() < 1
|| c.getPlayer().getInventory(MapleInventoryType.ETC).getNumFreeSlot() < 1
|| c.getPlayer().getInventory(MapleInventoryType.CASH).getNumFreeSlot() < 1) {
return -1;
}
int grade; // Default D
final int chance = Randomizer.nextInt(100); // cannot gacha S, only from alien cube.
if (chance < 1) { // Grade A
grade = 3;
} else if (chance < 3) { // Grade B
grade = 2;
} else if (chance < 40) { // Grade C
grade = 1;
} else { // grade == 0
grade = Randomizer.nextInt(100) < 25 ? 5 : 0; // 25% again to get premium ticket piece
}
int newId = 0;
if (grade == 5) {
newId = 4420000;
} else {
final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
final List<StructItemOption> pots = new LinkedList<>(ii.getAllSocketInfo(grade).values());
while (newId == 0) {
StructItemOption pot = pots.get(Randomizer.nextInt(pots.size()));
if (pot != null) {
newId = pot.opID;
}
}
}
final Item item = MapleInventoryManipulator.addbyId_Gachapon(c, newId, (short) 1);
if (item == null) {
return -1;
}
if (grade >= 3 && grade != 5) {
World.Broadcast.broadcastMessage(CWvsContext.getGachaponMega(c.getPlayer().getName(), " : got a(n)", item, (byte) 0, "Maple World"));
}
c.getSession().write(InfoPacket.getShowItemGain(newId, (short) 1, true));
gainItem(2430748, (short) 1);
gainItemSilent(5220094, (short) -1);
return item.getItemId();
} catch (Exception e) {
System.out.println("[Error] Failed to use Nebulite Gachapon. " + e);
}
return -1;
}
public void changeJob(short job) {
c.getPlayer().changeJob(job);
}
public void startQuest(int idd) {
MapleQuest.getInstance(idd).start(getPlayer(), id);
}
public void completeQuest(int idd) {
MapleQuest.getInstance(idd).complete(getPlayer(), id);
}
public void forfeitQuest(int idd) {
MapleQuest.getInstance(idd).forfeit(getPlayer());
}
public void forceStartQuest() {
MapleQuest.getInstance(id2).forceStart(getPlayer(), getNpc(), null);
}
@Override
public void forceStartQuest(int idd) {
MapleQuest.getInstance(idd).forceStart(getPlayer(), getNpc(), null);
}
public void forceStartQuest(String customData) {
MapleQuest.getInstance(id2).forceStart(getPlayer(), getNpc(), customData);
}
public void forceCompleteQuest() {
MapleQuest.getInstance(id2).forceComplete(getPlayer(), getNpc());
}
@Override
public void forceCompleteQuest(final int idd) {
MapleQuest.getInstance(idd).forceComplete(getPlayer(), getNpc());
}
public String getQuestCustomData() {
return c.getPlayer().getQuestNAdd(MapleQuest.getInstance(id2)).getCustomData();
}
public String getQuestCustomData(int quest) {
return c.getPlayer().getQuestNAdd(MapleQuest.getInstance(quest)).getCustomData();
}
public void setQuestCustomData(String customData) {
getPlayer().getQuestNAdd(MapleQuest.getInstance(id2)).setCustomData(customData);
}
public long getMeso() {
return getPlayer().getMeso();
}
public void gainAp(final int amount) {
c.getPlayer().gainAp((short) amount);
}
public void expandInventory(byte type, int amt) {
c.getPlayer().expandInventory(type, amt);
}
public void unequipEverything() {
MapleInventory equipped = getPlayer().getInventory(MapleInventoryType.EQUIPPED);
MapleInventory equip = getPlayer().getInventory(MapleInventoryType.EQUIP);
List<Short> ids = new LinkedList<>();
for (Item item : equipped.newList()) {
ids.add(item.getPosition());
}
for (short itemid : ids) {
MapleInventoryManipulator.unequip(getC(), itemid, equip.getNextFreeSlot());
}
}
public void equip(int itemId, byte slot) {
equip(itemId, slot, true);
}
public void equip(int itemId, byte slot, boolean add) {
MapleInventory equip = getPlayer().getInventory(MapleInventoryType.EQUIP);
Equip eqp = null;
for (Item item : equip.newList()) {
if (item.getItemId() == itemId) {
eqp = (Equip) item;
}
}
if (eqp == null) {
if (add) {
final MapleItemInformationProvider li = MapleItemInformationProvider.getInstance();
Item item = li.getEquipById(itemId);
item.setPosition(equip.getNextFreeSlot());
item.setGMLog("從腳本 " + this.id + "(" + id2 + ")[" + script + "] 中獲得, 時間 " + FileoutputUtil.CurrentReadable_Time());
eqp = (Equip) item;
MapleInventoryManipulator.addbyItem(c, eqp);
} else {
return;
}
}
MapleInventoryManipulator.equip(getC(), eqp.getPosition(), slot);
}
public void unequip(int itemId) {
unequip(itemId, false);
}
public void unequip(int itemId, boolean remove) {
MapleInventory equipped = getPlayer().getInventory(MapleInventoryType.EQUIPPED);
MapleInventory equip = getPlayer().getInventory(MapleInventoryType.EQUIP);
Equip eqp = null;
for (Item item : equipped.newList()) {
if (item.getItemId() == itemId) {
eqp = (Equip) item;
}
}
if (eqp == null) {
return;
}
MapleInventoryManipulator.unequip(getC(), eqp.getPosition(), equip.getNextFreeSlot());
if (remove) {
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.EQUIP, eqp.getPosition(), (short) 1, remove);
}
}
public final void clearSkills() {
final Map<Skill, SkillEntry> skills = new HashMap<>(getPlayer().getSkills());
final Map<Skill, SkillEntry> newList = new HashMap<>();
for (Entry<Skill, SkillEntry> skill : skills.entrySet()) {
newList.put(skill.getKey(), new SkillEntry((byte) 0, (byte) 0, -1));
}
getPlayer().changeSkillsLevel(newList);
newList.clear();
skills.clear();
}
public boolean hasSkill(int skillid) {
Skill theSkill = SkillFactory.getSkill(skillid);
if (theSkill != null) {
return c.getPlayer().getSkillLevel(theSkill) > 0;
}
return false;
}
public void showEffect(boolean broadcast, String effect) {
if (broadcast) {
c.getPlayer().getMap().broadcastMessage(CField.showEffect(effect));
} else {
c.getSession().write(CField.showEffect(effect));
}
}
public void playSound(boolean broadcast, String sound) {
if (broadcast) {
c.getPlayer().getMap().broadcastMessage(CField.playSound(sound));
} else {
c.getSession().write(CField.playSound(sound));
}
}
public void getDirectionInfo(byte type, int value) {
getDirectionInfo(type, value, 0);
}
public void getDirectionInfo(byte type, int value, int value2) {
getDirectionEffect(type, "", value, value2, 0, 0, 0, 0, 0, 0);
}
public void getDirectionInfo(String data, int value, int x, int y, int a, int b) {
getDirectionEffect(2, data, value, x, y, a, b, 0, 0, 0);
}
public void getDirectionInfoNew(byte type, int value) {
getDirectionInfoNew(type, value, 0, 0);
}
public void getDirectionInfoNew(byte type, int value, int a, int b) {
getDirectionEffect(5, "", type, value, a, b, 0, 0, 0, 0);
}
public void getDirectionEffect(int mod, String data, int value, int value2, int value3, int a1, int a2, int a3, int a4, int npc) {
c.getSession().write(UIPacket.getDirectionEffect(mod, data, value, value2, value3, a1, a2, a3, a4, npc));
lastMsg = 0x12;
}
public void playMovie(String data) {
playMovie(data, true);
}
@Override
public void playMovie(String data, boolean show) {
super.playMovie(data, show);
lastMsg = 0x13;
}
public void updateBuddyCapacity(int capacity) {
c.getPlayer().setBuddyCapacity((byte) capacity);
}
public int getBuddyCapacity() {
return c.getPlayer().getBuddyCapacity();
}
public int partyMembersInMap() {
int inMap = 0;
if (getPlayer().getParty() == null) {
return inMap;
}
for (MapleCharacter char2 : getPlayer().getMap().getCharactersThreadsafe()) {
if (char2.getParty() != null && char2.getParty().getId() == getPlayer().getParty().getId()) {
inMap++;
}
}
return inMap;
}
public List<MapleCharacter> getPartyMembers() {
if (getPlayer().getParty() == null) {
return null;
}
List<MapleCharacter> chars = new LinkedList<>(); // creates an empty array full of shit..
for (MaplePartyCharacter chr : getPlayer().getParty().getMembers()) {
for (ChannelServer channel : ChannelServer.getAllInstances()) {
MapleCharacter ch = channel.getPlayerStorage().getCharacterById(chr.getId());
if (ch != null) { // double check <3
chars.add(ch);
}
}
}
return chars;
}
public void warpPartyWithExp(int mapId, int exp) {
if (getPlayer().getParty() == null) {
warp(mapId, 0);
gainExp(exp);
return;
}
MapleMap target = getMap(mapId);
for (MaplePartyCharacter chr : getPlayer().getParty().getMembers()) {
MapleCharacter curChar = c.getChannelServer().getPlayerStorage().getCharacterByName(chr.getName());
if ((curChar.getEventInstance() == null && getPlayer().getEventInstance() == null) || curChar.getEventInstance() == getPlayer().getEventInstance()) {
curChar.changeMap(target, target.getPortal(0));
curChar.gainExp(exp, true, false, true);
}
}
}
public void warpPartyWithExpMeso(int mapId, int exp, int meso) {
if (getPlayer().getParty() == null) {
warp(mapId, 0);
gainExp(exp);
gainMeso(meso);
return;
}
MapleMap target = getMap(mapId);
for (MaplePartyCharacter chr : getPlayer().getParty().getMembers()) {
MapleCharacter curChar = c.getChannelServer().getPlayerStorage().getCharacterByName(chr.getName());
if ((curChar.getEventInstance() == null && getPlayer().getEventInstance() == null) || curChar.getEventInstance() == getPlayer().getEventInstance()) {
curChar.changeMap(target, target.getPortal(0));
curChar.gainExp(exp, true, false, true);
curChar.gainMeso(meso, true);
}
}
}
public MapleSquad getSquad(String type) {
return c.getChannelServer().getMapleSquad(type);
}
public int getSquadAvailability(String type) {
final MapleSquad squad = c.getChannelServer().getMapleSquad(type);
if (squad == null) {
return -1;
}
return squad.getStatus();
}
public boolean registerExpedition(String type, int minutes, String startText) {
if (c.getChannelServer().getMapleSquad(type) == null) {
final MapleSquad squad = new MapleSquad(c.getChannel(), type, c.getPlayer(), minutes * 60 * 1000, startText);
final boolean ret = c.getChannelServer().addMapleSquad(squad, type);
if (ret) {
final MapleMap map = c.getPlayer().getMap();
map.broadcastMessage(CField.getClock(minutes * 60));
map.broadcastMessage(CWvsContext.broadcastMsg(-6, startText));
} else {
squad.clear();
}
return ret;
}
return false;
}
public boolean registerSquad(String type, int minutes, String startText) {
if (c.getChannelServer().getMapleSquad(type) == null) {
final MapleSquad squad = new MapleSquad(c.getChannel(), type, c.getPlayer(), minutes * 60 * 1000, startText);
final boolean ret = c.getChannelServer().addMapleSquad(squad, type);
if (ret) {
final MapleMap map = c.getPlayer().getMap();
map.broadcastMessage(CField.getClock(minutes * 60));
map.broadcastMessage(CWvsContext.broadcastMsg(6, c.getPlayer().getName() + startText));
} else {
squad.clear();
}
return ret;
}
return false;
}
public boolean getSquadList(String type, byte type_) {
try {
final MapleSquad squad = c.getChannelServer().getMapleSquad(type);
if (squad == null) {
return false;
}
if (type_ == 0 || type_ == 3) { // Normal viewing
sendNext(squad.getSquadMemberString(type_));
} else if (type_ == 1) { // Squad Leader banning, Check out banned participant
sendSimple(squad.getSquadMemberString(type_));
} else if (type_ == 2) {
if (squad.getBannedMemberSize() > 0) {
sendSimple(squad.getSquadMemberString(type_));
} else {
sendNext(squad.getSquadMemberString(type_));
}
}
return true;
} catch (NullPointerException ex) {
FileoutputUtil.outputFileError(FileoutputUtil.ScriptEx_Log, ex);
return false;
}
}
//public void teachSkill(int id, int skillevel, byte masterlevel, long expiration) {
// getPlayer().changeSkillLevelAll(SkillFactory.getSkill(id), skillevel, masterlevel, expiration);
//}
public byte isSquadLeader(String type) {
final MapleSquad squad = c.getChannelServer().getMapleSquad(type);
if (squad == null) {
return -1;
} else {
if (squad.getLeader() != null && squad.getLeader().getId() == c.getPlayer().getId()) {
return 1;
} else {
return 0;
}
}
}
public boolean reAdd(String eim, String squad) {
EventInstanceManager eimz = getDisconnected(eim);
MapleSquad squadz = getSquad(squad);
if (eimz != null && squadz != null) {
squadz.reAddMember(getPlayer());
eimz.registerPlayer(getPlayer());
return true;
}
return false;
}
public void banMember(String type, int pos) {
final MapleSquad squad = c.getChannelServer().getMapleSquad(type);
if (squad != null) {
squad.banMember(pos);
}
}
public void acceptMember(String type, int pos) {
final MapleSquad squad = c.getChannelServer().getMapleSquad(type);
if (squad != null) {
squad.acceptMember(pos);
}
}
public int addMember(String type, boolean join) {
try {
final MapleSquad squad = c.getChannelServer().getMapleSquad(type);
if (squad != null) {
return squad.addMember(c.getPlayer(), join);
}
return -1;
} catch (NullPointerException ex) {
FileoutputUtil.outputFileError(FileoutputUtil.ScriptEx_Log, ex);
return -1;
}
}
public byte isSquadMember(String type) {
final MapleSquad squad = c.getChannelServer().getMapleSquad(type);
if (squad == null) {
return -1;
} else {
if (squad.getMembers().contains(c.getPlayer())) {
return 1;
} else if (squad.isBanned(c.getPlayer())) {
return 2;
} else {
return 0;
}
}
}
public void resetReactors() {
getPlayer().getMap().resetReactors();
}
public void genericGuildMessage(int code) {
c.getSession().write(GuildPacket.genericGuildMessage((byte) code));
}
public void disbandGuild() {
final int gid = c.getPlayer().getGuildId();
if (gid <= 0 || c.getPlayer().getGuildRank() != 1) {
return;
}
World.Guild.disbandGuild(gid);
}
public void increaseGuildCapacity(boolean trueMax) {
if (c.getPlayer().getMeso() < 500000 && !trueMax) {
c.getSession().write(CWvsContext.broadcastMsg(1, "You do not have enough mesos."));
return;
}
final int gid = c.getPlayer().getGuildId();
if (gid <= 0) {
return;
}
if (World.Guild.increaseGuildCapacity(gid, trueMax)) {
if (!trueMax) {
c.getPlayer().gainMeso(-500000, true, true);
} else {
gainGP(-25000);
}
sendNext("Your guild capacity has been raised...");
} else if (!trueMax) {
sendNext("Please check if your guild capacity is full. (Limit: 100)");
} else {
sendNext("Please check if your guild capacity is full, if you have the GP needed or if subtracting GP would decrease a guild level. (Limit: 200)");
}
}
public void displayGuildRanks() {
c.getSession().write(GuildPacket.showGuildRanks(id, MapleGuildRanking.getInstance().getRank()));
}
public boolean removePlayerFromInstance() {
if (c.getPlayer().getEventInstance() != null) {
c.getPlayer().getEventInstance().removePlayer(c.getPlayer());
return true;
}
return false;
}
public boolean isPlayerInstance() {
return c.getPlayer().getEventInstance() != null;
}
public void makeTaintedEquip(byte slot) {
Equip sel = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(slot);
sel.setStr((short) 69);
sel.setDex((short) 69);
sel.setInt((short) 69);
sel.setLuk((short) 69);
sel.setHp((short) 69);
sel.setMp((short) 69);
sel.setWatk((short) 69);
sel.setMatk((short) 69);
sel.setWdef((short) 69);
sel.setMdef((short) 69);
sel.setAcc((short) 69);
sel.setAvoid((short) 69);
sel.setHands((short) 69);
sel.setSpeed((short) 69);
sel.setJump((short) 69);
sel.setUpgradeSlots((byte) 69);
sel.setViciousHammer((byte) 69);
sel.setEnhance((byte) 69);
c.getPlayer().equipChanged();
c.getPlayer().fakeRelog();
}
public void changeStat(byte slot, int type, int amount) {
Equip sel = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(slot);
switch (type) {
case 0:
sel.setStr((short) amount);
break;
case 1:
sel.setDex((short) amount);
break;
case 2:
sel.setInt((short) amount);
break;
case 3:
sel.setLuk((short) amount);
break;
case 4:
sel.setHp((short) amount);
break;
case 5:
sel.setMp((short) amount);
break;
case 6:
sel.setWatk((short) amount);
break;
case 7:
sel.setMatk((short) amount);
break;
case 8:
sel.setWdef((short) amount);
break;
case 9:
sel.setMdef((short) amount);
break;
case 10:
sel.setAcc((short) amount);
break;
case 11:
sel.setAvoid((short) amount);
break;
case 12:
sel.setHands((short) amount);
break;
case 13:
sel.setSpeed((short) amount);
break;
case 14:
sel.setJump((short) amount);
break;
case 15:
sel.setUpgradeSlots((byte) amount);
break;
case 16:
sel.setViciousHammer((byte) amount);
break;
case 17:
sel.setLevel((byte) amount);
break;
case 18:
sel.setEnhance((byte) amount);
break;
case 19:
sel.setPotential(amount, 1, false);
sel.updateState(false);
break;
case 20:
sel.setPotential(amount, 2, false);
sel.updateState(false);
break;
case 21:
sel.setPotential(amount, 3, false);
sel.updateState(false);
break;
case 22:
sel.setPotential(amount, 1, true);
sel.updateState(true);
break;
case 23:
sel.setPotential(amount, 2, true);
sel.updateState(true);
break;
case 24:
sel.setOwner(getText());
break;
default:
break;
}
c.getPlayer().equipChanged();
c.getPlayer().fakeRelog();
}
public void openPackageDeliverer() {
c.getPlayer().setConversation(2);
c.getSession().write(CField.sendPackageMSG((byte) 9, null));
}
public void openMerchantItemStore() {
c.getPlayer().setConversation(3);
HiredMerchantHandler.displayMerch(c);
c.getSession().write(CWvsContext.enableActions());
}
public void sendPVPWindow() {
c.getSession().write(UIPacket.openUI(0x32));
c.getSession().write(CField.sendPVPMaps());
}
public void sendAzwanWindow() {
c.getSession().write(UIPacket.openUI(0x46));
}
public void sendOpenJobChangeUI() {
c.getSession().write(UIPacket.openUI(0xA4)); // job selections change depending on ur job
}
public void sendTimeGateWindow() {
c.getSession().write(UIPacket.openUI(0xA8));
}
public void sendRepairWindow() {
c.getSession().write(UIPacket.openUIOption(0x21, id));
}
public void sendJewelCraftWindow() {
c.getSession().write(UIPacket.openUIOption(0x68, id));
}
public void sendRedLeaf(boolean viewonly, boolean autocheck) {
if (autocheck) {
viewonly = c.getPlayer().getFriendShipToAdd() == 0;
}
c.getSession().write(UIPacket.sendRedLeaf(viewonly ? 0 : c.getPlayer().getFriendShipToAdd(), viewonly));
}
public void sendProfessionWindow() {
c.getSession().write(UIPacket.openUI(42));
}
public void sendQuestWindow() {
c.getSession().write(UIPacket.openUI(6));
}
public void sendBeastTamerGiftWindow() {
c.getSession().write(UIPacket.openUI(194));
}
public void sendCassandrasCollectionWindow() {
c.getSession().write(UIPacket.openUI(127));
}
public void sendLuckyLuckyMonstoryWindow() {
c.getSession().write(UIPacket.openUI(120));
}
public void OpenUI(int ui) {
c.getPlayer().getMap().broadcastMessage(UIPacket.openUI(ui));
}
public void getMulungRanking() {
c.getSession().write(CWvsContext.getMulungRanking());
}
public final int getDojoPoints() {
return dojo_getPts();
}
public final int getDojoRecord() {
return c.getPlayer().getIntNoRecord(GameConstants.DOJO_RECORD);
}
public void setDojoRecord(final boolean reset, final boolean take, int amount) {
if (reset) {
c.getPlayer().getQuestNAdd(MapleQuest.getInstance(GameConstants.DOJO_RECORD)).setCustomData("0");
c.getPlayer().getQuestNAdd(MapleQuest.getInstance(GameConstants.DOJO)).setCustomData("0");
} else if (take) {
c.getPlayer().getQuestNAdd(MapleQuest.getInstance(GameConstants.DOJO_RECORD)).setCustomData(String.valueOf(c.getPlayer().getIntRecord(GameConstants.DOJO_RECORD) - amount));
c.getPlayer().getQuestNAdd(MapleQuest.getInstance(GameConstants.DOJO)).setCustomData(String.valueOf(c.getPlayer().getIntRecord(GameConstants.DOJO_RECORD) - amount));
} else {
c.getPlayer().getQuestNAdd(MapleQuest.getInstance(GameConstants.DOJO_RECORD)).setCustomData(String.valueOf(c.getPlayer().getIntRecord(GameConstants.DOJO_RECORD) + 1));
}
}
public boolean start_DojoAgent(final boolean dojo, final boolean party, final int mapid) {
if (dojo) {
return Event_DojoAgent.warpStartDojo(c.getPlayer(), party, getMap(mapid));
}
return Event_DojoAgent.warpStartAgent(c.getPlayer(), party);
}
public boolean start_PyramidSubway(final int pyramid) {
if (pyramid >= 0) {
return Event_PyramidSubway.warpStartPyramid(c.getPlayer(), pyramid);
}
return Event_PyramidSubway.warpStartSubway(c.getPlayer());
}
public boolean bonus_PyramidSubway(final int pyramid) {
if (pyramid >= 0) {
return Event_PyramidSubway.warpBonusPyramid(c.getPlayer(), pyramid);
}
return Event_PyramidSubway.warpBonusSubway(c.getPlayer());
}
public final short getKegs() {
return c.getChannelServer().getFireWorks().getKegsPercentage();
}
public void giveKegs(final int kegs) {
c.getChannelServer().getFireWorks().giveKegs(c.getPlayer(), kegs);
}
public final short getSunshines() {
return c.getChannelServer().getFireWorks().getSunsPercentage();
}
public void addSunshines(final int kegs) {
c.getChannelServer().getFireWorks().giveSuns(c.getPlayer(), kegs);
}
public final short getDecorations() {
return c.getChannelServer().getFireWorks().getDecsPercentage();
}
public void addDecorations(final int kegs) {
try {
c.getChannelServer().getFireWorks().giveDecs(c.getPlayer(), kegs);
} catch (Exception e) {
}
}
public final MapleCarnivalParty getCarnivalParty() {
return c.getPlayer().getCarnivalParty();
}
public final MapleCarnivalChallenge getNextCarnivalRequest() {
return c.getPlayer().getNextCarnivalRequest();
}
public final MapleCarnivalChallenge getCarnivalChallenge(MapleCharacter chr) {
return new MapleCarnivalChallenge(chr);
}
public void maxStats() {
Map<MapleStat, Integer> statup = new EnumMap<>(MapleStat.class);
c.getPlayer().getStat().str = (short) 999;
c.getPlayer().getStat().dex = (short) 999;
c.getPlayer().getStat().int_ = (short) 999;
c.getPlayer().getStat().luk = (short) 999;
int overrDemon = MapleJob.is惡魔殺手(c.getPlayer().getJob()) ? GameConstants.getMPByJob(c.getPlayer().getJob()) : 500000;
c.getPlayer().getStat().maxhp = 500000;
c.getPlayer().getStat().maxmp = overrDemon;
c.getPlayer().getStat().setHp(500000, c.getPlayer());
c.getPlayer().getStat().setMp(overrDemon, c.getPlayer());
statup.put(MapleStat.STR, 999);
statup.put(MapleStat.DEX, 999);
statup.put(MapleStat.LUK, 999);
statup.put(MapleStat.INT, 999);
statup.put(MapleStat.HP, 500000);
statup.put(MapleStat.MAXHP, 500000);
statup.put(MapleStat.MP, overrDemon);
statup.put(MapleStat.MAXMP, overrDemon);
c.getPlayer().getStat().recalcLocalStats(c.getPlayer());
//c.getSession().write(CWvsContext.updatePlayerStats(statup, c.getPlayer().getJob()));
}
public int setAndroid(int args) {
if (args < 30000) {
c.getPlayer().getAndroid().setFace(args);
c.getPlayer().getAndroid().saveToDb();
} else {
c.getPlayer().getAndroid().setHair(args);
c.getPlayer().getAndroid().saveToDb();
}
CField.updateAndroidLook(c.getPlayer(), c.getPlayer().getAndroid());
c.getPlayer().setAndroid(c.getPlayer().getAndroid()); //Respawn it
c.getPlayer().equipChanged();
return 1;
}
public int getAndroidStat(final String type) {
switch (type) {
case "HAIR":
return c.getPlayer().getAndroid().getHair();
case "FACE":
return c.getPlayer().getAndroid().getFace();
case "GENDER":
int itemid = c.getPlayer().getAndroid().getItemId();
if (itemid == 1662000 || itemid == 1662002) {
return 0;
} else {
return 1;
}
}
return -1;
}
public void reloadChar() {
getPlayer().getClient().getSession().write(CField.getCharInfo(getPlayer()));
getPlayer().getMap().removePlayer(getPlayer());
getPlayer().getMap().addPlayer(getPlayer());
}
public void askAndroid(String text, int... args) {
c.getSession().write(CField.NPCPacket.getAndroidTalkStyle(id, text, args));
lastMsg = 10;
}
@Override
public MapleCharacter getChar() {
return getPlayer();
}
public static int editEquipById(MapleCharacter chr, int max, int itemid, String stat, int newval) {
return editEquipById(chr, max, itemid, stat, (short) newval);
}
public static int editEquipById(MapleCharacter chr, int max, int itemid, String stat, short newval) {
// Is it an equip?
if (!MapleItemInformationProvider.getInstance().isEquip(itemid)) {
return -1;
}
// Get List
List<Item> equips = chr.getInventory(MapleInventoryType.EQUIP).listById(itemid);
List<Item> equipped = chr.getInventory(MapleInventoryType.EQUIPPED).listById(itemid);
// Do you have any?
if (equips.isEmpty() && equipped.isEmpty()) {
return 0;
}
int edited = 0;
// edit items
for (Item itm : equips) {
Equip e = (Equip) itm;
if (edited >= max) {
break;
}
edited++;
switch (stat) {
case "str":
e.setStr(newval);
break;
case "dex":
e.setDex(newval);
break;
case "int":
e.setInt(newval);
break;
case "luk":
e.setLuk(newval);
break;
case "watk":
e.setWatk(newval);
break;
case "matk":
e.setMatk(newval);
break;
default:
return -2;
}
}
for (Item itm : equipped) {
Equip e = (Equip) itm;
if (edited >= max) {
break;
}
edited++;
switch (stat) {
case "str":
e.setStr(newval);
break;
case "dex":
e.setDex(newval);
break;
case "int":
e.setInt(newval);
break;
case "luk":
e.setLuk(newval);
break;
case "watk":
e.setWatk(newval);
break;
case "matk":
e.setMatk(newval);
break;
default:
return -2;
}
}
// Return items edited
return (edited);
}
public int getReborns() { // tjat
return getPlayer().getReborns();
}
public Triple<String, Map<Integer, String>, Long> getSpeedRun(String typ) {
final ExpeditionType expedtype = ExpeditionType.valueOf(typ);
if (SpeedRunner.getSpeedRunData(expedtype) != null) {
return SpeedRunner.getSpeedRunData(expedtype);
}
return new Triple<String, Map<Integer, String>, Long>("", new HashMap<Integer, String>(), 0L);
}
public boolean getSR(Triple<String, Map<Integer, String>, Long> ma, int sel) {
if (ma.mid.get(sel) == null || ma.mid.get(sel).length() <= 0) {
dispose();
return false;
}
sendOk(ma.mid.get(sel));
return true;
}
public Equip getEquip(int itemid) {
return (Equip) MapleItemInformationProvider.getInstance().getEquipById(itemid);
}
public void setExpiration(Object statsSel, long expire) {
if (statsSel instanceof Equip) {
((Equip) statsSel).setExpiration(System.currentTimeMillis() + (expire * 24 * 60 * 60 * 1000));
}
}
public void setLock(Object statsSel) {
if (statsSel instanceof Equip) {
Equip eq = (Equip) statsSel;
if (eq.getExpiration() == -1) {
eq.setFlag((byte) (eq.getFlag() | ItemFlag.LOCK.getValue()));
} else {
eq.setFlag((byte) (eq.getFlag() | ItemFlag.UNTRADABLE.getValue()));
}
}
}
public boolean addFromDrop(Object statsSel) {
if (statsSel instanceof Item) {
final Item it = (Item) statsSel;
return MapleInventoryManipulator.checkSpace(getClient(), it.getItemId(), it.getQuantity(), it.getOwner()) && MapleInventoryManipulator.addFromDrop(getClient(), it, false);
}
return false;
}
public int getVPoints() {
return getPlayer().getVPoints();
}
public void setVPoints(int vpoints) {
getPlayer().setVPoints(getPlayer().getVPoints() + vpoints);
}
public int getDPoints() {
return getPlayer().getVPoints();
}
public void setDPoints(int dpoints) {
getPlayer().setDPoints(getPlayer().getDPoints() + dpoints);
}
public int getEPoints() {
return getPlayer().getEPoints();
}
public void setEPoints(int epoints) {
getPlayer().setEPoints(getPlayer().getEPoints() + epoints);
}
public boolean replaceItem(int slot, int invType, Object statsSel, int offset, String type) {
return replaceItem(slot, invType, statsSel, offset, type, false);
}
public boolean replaceItem(int slot, int invType, Object statsSel, int offset, String type, boolean takeSlot) {
MapleInventoryType inv = MapleInventoryType.getByType((byte) invType);
if (inv == null) {
return false;
}
Item item = getPlayer().getInventory(inv).getItem((byte) slot);
if (item == null || statsSel instanceof Item) {
item = (Item) statsSel;
}
if (offset > 0) {
if (inv != MapleInventoryType.EQUIP) {
return false;
}
Equip eq = (Equip) item;
if (takeSlot) {
if (eq.getUpgradeSlots() < 1) {
return false;
} else {
eq.setUpgradeSlots((byte) (eq.getUpgradeSlots() - 1));
}
if (eq.getExpiration() == -1) {
eq.setFlag((byte) (eq.getFlag() | ItemFlag.LOCK.getValue()));
} else {
eq.setFlag((byte) (eq.getFlag() | ItemFlag.UNTRADABLE.getValue()));
}
}
if (type.equalsIgnoreCase("Slots")) {
eq.setUpgradeSlots((byte) (eq.getUpgradeSlots() + offset));
eq.setViciousHammer((byte) (eq.getViciousHammer() + offset));
} else if (type.equalsIgnoreCase("Level")) {
eq.setLevel((byte) (eq.getLevel() + offset));
} else if (type.equalsIgnoreCase("Hammer")) {
eq.setViciousHammer((byte) (eq.getViciousHammer() + offset));
} else if (type.equalsIgnoreCase("STR")) {
eq.setStr((short) (eq.getStr() + offset));
} else if (type.equalsIgnoreCase("DEX")) {
eq.setDex((short) (eq.getDex() + offset));
} else if (type.equalsIgnoreCase("INT")) {
eq.setInt((short) (eq.getInt() + offset));
} else if (type.equalsIgnoreCase("LUK")) {
eq.setLuk((short) (eq.getLuk() + offset));
} else if (type.equalsIgnoreCase("HP")) {
eq.setHp((short) (eq.getHp() + offset));
} else if (type.equalsIgnoreCase("MP")) {
eq.setMp((short) (eq.getMp() + offset));
} else if (type.equalsIgnoreCase("WATK")) {
eq.setWatk((short) (eq.getWatk() + offset));
} else if (type.equalsIgnoreCase("MATK")) {
eq.setMatk((short) (eq.getMatk() + offset));
} else if (type.equalsIgnoreCase("WDEF")) {
eq.setWdef((short) (eq.getWdef() + offset));
} else if (type.equalsIgnoreCase("MDEF")) {
eq.setMdef((short) (eq.getMdef() + offset));
} else if (type.equalsIgnoreCase("ACC")) {
eq.setAcc((short) (eq.getAcc() + offset));
} else if (type.equalsIgnoreCase("Avoid")) {
eq.setAvoid((short) (eq.getAvoid() + offset));
} else if (type.equalsIgnoreCase("Hands")) {
eq.setHands((short) (eq.getHands() + offset));
} else if (type.equalsIgnoreCase("Speed")) {
eq.setSpeed((short) (eq.getSpeed() + offset));
} else if (type.equalsIgnoreCase("Jump")) {
eq.setJump((short) (eq.getJump() + offset));
} else if (type.equalsIgnoreCase("ItemEXP")) {
eq.setItemEXP(eq.getItemEXP() + offset);
} else if (type.equalsIgnoreCase("Expiration")) {
eq.setExpiration(eq.getExpiration() + offset);
} else if (type.equalsIgnoreCase("Flag")) {
eq.setFlag((byte) (eq.getFlag() + offset));
}
item = eq.copy();
}
MapleInventoryManipulator.removeFromSlot(getClient(), inv, (short) slot, item.getQuantity(), false);
return MapleInventoryManipulator.addFromDrop(getClient(), item, false);
}
public boolean replaceItem(int slot, int invType, Object statsSel, int upgradeSlots) {
return replaceItem(slot, invType, statsSel, upgradeSlots, "Slots");
}
public boolean isCash(final int itemId) {
return MapleItemInformationProvider.getInstance().isCash(itemId);
}
public int getTotalStat(final int itemId) {
return MapleItemInformationProvider.getInstance().getTotalStat((Equip) MapleItemInformationProvider.getInstance().getEquipById(itemId));
}
public int getReqLevel(final int itemId) {
return MapleItemInformationProvider.getInstance().getReqLevel(itemId);
}
public void directionEffect(String data, int value, int x, int y, int npc) {
c.getSession().write(UIPacket.getDirectionEffect(data, value, x, y, npc));
}
public void introEnableUI(boolean enable) {
introEnableUI(enable ? 1 : 0);
}
public void introEnableUI(boolean enable, boolean enable2) {
introEnableUI(enable ? 1 : 0, enable2 ? 1 : 0);
}
public MapleStatEffect getEffect(int buff) {
return MapleItemInformationProvider.getInstance().getItemEffect(buff);
}
public void buffGuild(final int buff, final int duration, final String msg) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
if (ii.getItemEffect(buff) != null && getPlayer().getGuildId() > 0) {
final MapleStatEffect mse = ii.getItemEffect(buff);
for (ChannelServer cserv : ChannelServer.getAllInstances()) {
for (MapleCharacter chr : cserv.getPlayerStorage().getAllCharacters()) {
if (chr.getGuildId() == getPlayer().getGuildId()) {
mse.applyTo(chr, chr, true, null, duration);
chr.dropMessage(5, "Your guild has gotten a " + msg + " buff.");
}
}
}
}
}
public boolean createAlliance(String alliancename) {
MapleParty pt = c.getPlayer().getParty();
MapleCharacter otherChar = c.getChannelServer().getPlayerStorage().getCharacterById(pt.getMemberByIndex(1).getId());
if (otherChar == null || otherChar.getId() == c.getPlayer().getId()) {
return false;
}
try {
return World.Alliance.createAlliance(alliancename, c.getPlayer().getId(), otherChar.getId(), c.getPlayer().getGuildId(), otherChar.getGuildId());
} catch (Exception re) {
return false;
}
}
public boolean addCapacityToAlliance() {
try {
final MapleGuild gs = World.Guild.getGuild(c.getPlayer().getGuildId());
if (gs != null && c.getPlayer().getGuildRank() == 1 && c.getPlayer().getAllianceRank() == 1) {
if (World.Alliance.getAllianceLeader(gs.getAllianceId()) == c.getPlayer().getId() && World.Alliance.changeAllianceCapacity(gs.getAllianceId())) {
gainMeso(-MapleGuildAlliance.CHANGE_CAPACITY_COST);
return true;
}
}
} catch (Exception re) {
}
return false;
}
public boolean disbandAlliance() {
try {
final MapleGuild gs = World.Guild.getGuild(c.getPlayer().getGuildId());
if (gs != null && c.getPlayer().getGuildRank() == 1 && c.getPlayer().getAllianceRank() == 1) {
if (World.Alliance.getAllianceLeader(gs.getAllianceId()) == c.getPlayer().getId() && World.Alliance.disbandAlliance(gs.getAllianceId())) {
return true;
}
}
} catch (Exception re) {
}
return false;
}
public byte getLastMsg() {
return lastMsg;
}
public final void setLastMsg(final byte last) {
this.lastMsg = last;
}
public final void maxAllSkills() {
HashMap<Skill, SkillEntry> sa = new HashMap<>();
for (Skill skil : SkillFactory.getAllSkills()) {
if (GameConstants.isApplicableSkill(skil.getId()) && skil.getId() < 90000000) { //no db/additionals/resistance skills
sa.put(skil, new SkillEntry((byte) skil.getMaxLevel(), (byte) skil.getMaxLevel(), SkillFactory.getDefaultSExpiry(skil)));
}
}
getPlayer().changeSkillsLevel(sa);
}
public final void maxSkillsByJob() {
HashMap<Skill, SkillEntry> sa = new HashMap<>();
for (Skill skil : SkillFactory.getAllSkills()) {
if (GameConstants.isApplicableSkill(skil.getId()) && skil.canBeLearnedBy(getPlayer().getJob()) && !skil.isInvisible()) { //no db/additionals/resistance skills
sa.put(skil, new SkillEntry((byte) skil.getMaxLevel(), (byte) skil.getMaxLevel(), SkillFactory.getDefaultSExpiry(skil)));
}
}
getPlayer().changeSkillsLevel(sa);
}
public final void removeSkillsByJob() {
HashMap<Skill, SkillEntry> sa = new HashMap<>();
for (Skill skil : SkillFactory.getAllSkills()) {
if (GameConstants.isApplicableSkill(skil.getId()) && skil.canBeLearnedBy(getPlayer().getJob())) { //no db/additionals/resistance skills
sa.put(skil, new SkillEntry((byte) -1, (byte) skil.getMaxLevel(), SkillFactory.getDefaultSExpiry(skil)));
}
}
getPlayer().changeSkillsLevel(sa);
}
public final void maxSkillsByJobId(int jobid) {
HashMap<Skill, SkillEntry> sa = new HashMap<>();
for (Skill skil : SkillFactory.getAllSkills()) {
if (GameConstants.isApplicableSkill(skil.getId()) && skil.canBeLearnedBy(getPlayer().getJob()) && skil.getId() >= jobid * 1000000 && skil.getId() < (jobid + 1) * 1000000 && !skil.isInvisible()) {
sa.put(skil, new SkillEntry((byte) skil.getMaxLevel(), (byte) skil.getMaxLevel(), SkillFactory.getDefaultSExpiry(skil)));
}
}
getPlayer().changeSkillsLevel(sa);
}
public final void resetStats(int str, int dex, int z, int luk) {
c.getPlayer().resetStats(str, dex, z, luk);
}
public void killAllMonsters(int mapid) {
MapleMap map = c.getChannelServer().getMapFactory().getMap(mapid);
map.killAllMonsters(false); // No drop.
}
public final void killAllMobs() {
c.getPlayer().getMap().killAllMonsters(true);
}
public final void levelUp() {
c.getPlayer().levelUp();
}
public void cleardrops() {
MapleMonsterInformationProvider.getInstance().clearDrops();
}
public final boolean dropItem(int slot, int invType, int quantity) {
MapleInventoryType inv = MapleInventoryType.getByType((byte) invType);
if (inv == null) {
return false;
}
return MapleInventoryManipulator.drop(c, inv, (short) slot, (short) quantity, true);
}
public final List<Integer> getAllPotentialInfo() {
List<Integer> list = new ArrayList<>(MapleItemInformationProvider.getInstance().getAllPotentialInfo().keySet());
Collections.sort(list);
return list;
}
public final List<Integer> getAllPotentialInfoSearch(String content) {
List<Integer> list = new ArrayList<>();
for (Entry<Integer, List<StructItemOption>> i : MapleItemInformationProvider.getInstance().getAllPotentialInfo().entrySet()) {
for (StructItemOption ii : i.getValue()) {
if (ii.toString().contains(content)) {
list.add(i.getKey());
}
}
}
Collections.sort(list);
return list;
}
public void MakeGMItem(byte slot, MapleCharacter player) {
MapleInventory equip = player.getInventory(MapleInventoryType.EQUIP);
Equip eu = (Equip) equip.getItem(slot);
int item = equip.getItem(slot).getItemId();
short hand = eu.getHands();
byte level = eu.getLevel();
Equip nItem = new Equip(item, slot, (byte) 0);
nItem.setStr((short) 32767); // STR
nItem.setDex((short) 32767); // DEX
nItem.setInt((short) 32767); // INT
nItem.setLuk((short) 32767); //LUK
nItem.setUpgradeSlots((byte) 0);
nItem.setHands(hand);
nItem.setLevel(level);
player.getInventory(MapleInventoryType.EQUIP).removeItem(slot);
player.getInventory(MapleInventoryType.EQUIP).addFromDB(nItem);
}
public final String getPotentialInfo(final int id) {
final List<StructItemOption> potInfo = MapleItemInformationProvider.getInstance().getPotentialInfo(id);
final StringBuilder builder = new StringBuilder("#b#ePOTENTIAL INFO FOR ID: ");
builder.append(id);
builder.append("#n#k\r\n\r\n");
int minLevel = 1, maxLevel = 10;
for (StructItemOption item : potInfo) {
builder.append("#eLevels ");
builder.append(minLevel);
builder.append("~");
builder.append(maxLevel);
builder.append(": #n");
builder.append(item.get(potInfo.toString()));
minLevel += 10;
maxLevel += 10;
builder.append("\r\n");
}
return builder.toString();
}
public final void sendRPS() {
c.getSession().write(CField.getRPSMode((byte) 8, -1, -1, -1));
}
public final void setQuestRecord(Object ch, final int questid, final String data) {
((MapleCharacter) ch).getQuestNAdd(MapleQuest.getInstance(questid)).setCustomData(data);
}
public final void doWeddingEffect(final Object ch) {
final MapleCharacter chr = (MapleCharacter) ch;
final MapleCharacter player = getPlayer();
getMap().broadcastMessage(CWvsContext.yellowChat(player.getName() + ", do you take " + chr.getName() + " as your wife and promise to stay beside her through all downtimes, crashes, and lags?"));
CloneTimer.getInstance().schedule(new Runnable() {
@Override
public void run() {
if (chr == null || player == null) {
warpMap(680000500, 0);
} else {
chr.getMap().broadcastMessage(CWvsContext.yellowChat(chr.getName() + ", do you take " + player.getName() + " as your husband and promise to stay beside him through all downtimes, crashes, and lags?"));
}
}
}, 10000);
CloneTimer.getInstance().schedule(new Runnable() {
@Override
public void run() {
if (chr == null || player == null) {
if (player != null) {
setQuestRecord(player, 160001, "3");
setQuestRecord(player, 160002, "0");
} else if (chr != null) {
setQuestRecord(chr, 160001, "3");
setQuestRecord(chr, 160002, "0");
}
warpMap(680000500, 0);
} else {
setQuestRecord(player, 160001, "2");
setQuestRecord(chr, 160001, "2");
sendNPCText(player.getName() + " and " + chr.getName() + ", I wish you two all the best on your " + chr.getClient().getChannelServer().getServerName() + " journey together!", 9201002);
chr.getMap().startExtendedMapEffect("You may now kiss the bride, " + player.getName() + "!", 5120006);
if (chr.getGuildId() > 0) {
World.Guild.guildPacket(chr.getGuildId(), CWvsContext.sendMarriage(false, chr.getName()));
}
if (chr.getFamilyId() > 0) {
World.Family.familyPacket(chr.getFamilyId(), CWvsContext.sendMarriage(true, chr.getName()), chr.getId());
}
if (player.getGuildId() > 0) {
World.Guild.guildPacket(player.getGuildId(), CWvsContext.sendMarriage(false, player.getName()));
}
if (player.getFamilyId() > 0) {
World.Family.familyPacket(player.getFamilyId(), CWvsContext.sendMarriage(true, chr.getName()), player.getId());
}
}
}
}, 20000); //10 sec 10 sec
}
public void putKey(int key, int type, int action) {
getPlayer().changeKeybinding(key, (byte) type, action);
getClient().getSession().write(CField.getKeymap(getPlayer().getKeyLayout(), getPlayer()));
}
public void doRing(final String name, final int itemid) {
PlayersHandler.DoRing(getClient(), name, itemid);
}
public int getNaturalStats(final int itemid, final String it) {
Map<String, Integer> eqStats = MapleItemInformationProvider.getInstance().getEquipStats(itemid);
if (eqStats != null && eqStats.containsKey(it)) {
return eqStats.get(it);
}
return 0;
}
public boolean isEligibleName(String t) {
return MapleCharacterUtil.canCreateChar(t, getPlayer().isGM()) && (!LoginInformationProvider.getInstance().isForbiddenName(t) || getPlayer().isGM());
}
public String checkDrop(int mobId) {
final List<MonsterDropEntry> ranks = MapleMonsterInformationProvider.getInstance().retrieveDrop(mobId);
final List<MonsterGlobalDropEntry> drops = MapleMonsterInformationProvider.getInstance().getGlobalDrop();
if ((ranks != null && ranks.size() > 0) || (drops != null && drops.size() > 0)) {
int num = 0;
int itemId;
int ch;
MonsterDropEntry de;
StringBuilder name = new StringBuilder();
for (int i = 0; i < ranks.size(); i++) {
de = ranks.get(i);
if (de.chance > 0 && (de.questid <= 0 || (de.questid > 0 && MapleQuest.getInstance(de.questid).getName().length() > 0))) {
itemId = de.itemId;
if (num == 0) {
name.append("怪物#e#o").append(mobId).append("##n的掉寶數據如下\r\n");
name.append("--------------------------------------\r\n");
}
String namez = "#z" + itemId + "#";
if (itemId == 0) { //meso
itemId = 4031041; //display sack of cash
namez = (de.Minimum * getClient().getChannelServer().getMesoRate(getPlayer().getWorld())) + "到" + (de.Maximum * getClient().getChannelServer().getMesoRate(getPlayer().getWorld())) + "楓幣";
}
ch = de.chance * getClient().getChannelServer().getDropRate(getPlayer().getWorld());
name.append(num + 1).append(") #i").append(itemId).append(":#").append(namez);
if (c.getPlayer().isIntern()) {
name.append("(").append(itemId).append(")").append(de.questid > 0 && MapleQuest.getInstance(de.questid).getName().length() > 0 ? ("[" + MapleQuest.getInstance(de.questid).toString() + "]") : "").append("\r\n掉寶幾率:").append(Integer.valueOf(ch >= 999999 ? 1000000 : ch).doubleValue() / 10000.0).append("%").append(" 來源:").append(de.addFrom).append("\r\n");
}
name.append("\r\n");
num++;
}
}
//加載全域掉寶
if (drops != null && drops.size() > 0) {
MonsterGlobalDropEntry dge;
for (int i = 0; i < drops.size(); i++) {
dge = drops.get(i);
if (dge.chance > 0 && (dge.questid <= 0 || (dge.questid > 0 && MapleQuest.getInstance(dge.questid).getName().length() > 0))) {
itemId = dge.itemId;
String namez = "#z" + itemId + "#";
if (itemId == 0) { //meso
itemId = 4031041; //display sack of cash
namez = (dge.Minimum * c.getChannelServer().getMesoRate(c.getPlayer().getWorld())) + "到" + (dge.Maximum * c.getChannelServer().getMesoRate(c.getPlayer().getWorld())) + "楓幣";
}
ch = dge.chance * c.getChannelServer().getDropRate(c.getPlayer().getWorld());
name.append(num + 1).append(") #i").append(itemId).append(":#").append(namez);
if (c.getPlayer().isIntern()) {
name.append("(").append(itemId).append(")").append(dge.questid > 0 && MapleQuest.getInstance(dge.questid).getName().length() > 0 ? ("[" + MapleQuest.getInstance(dge.questid).toString() + "]") : "").append("\r\n掉寶幾率:").append(Integer.valueOf(ch >= 999999 ? 1000000 : ch).doubleValue() / 10000.0).append("%").append(" 來源:").append(dge.addFrom).append("(全域)\r\n");
}
name.append("\r\n");
num++;
}
}
}
if (name.length() > 0) {
return name.toString();
}
}
return "此怪物無掉寶數據。";
}
public String getLeftPadded(final String in, final char padchar, final int length) {
return StringUtil.getLeftPaddedStr(in, padchar, length);
}
public void handleDivorce() {
if (getPlayer().getMarriageId() <= 0) {
sendNext("Please make sure you have a marriage.");
return;
}
final int chz = World.Find.findChannel(getPlayer().getMarriageId());
if (chz == -1) {
//sql queries
try {
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("UPDATE queststatus SET customData = ? WHERE characterid = ? AND (quest = ? OR quest = ?)");
ps.setString(1, "0");
ps.setInt(2, getPlayer().getMarriageId());
ps.setInt(3, 160001);
ps.setInt(4, 160002);
ps.executeUpdate();
ps.close();
ps = con.prepareStatement("UPDATE characters SET marriageid = ? WHERE id = ?");
ps.setInt(1, 0);
ps.setInt(2, getPlayer().getMarriageId());
ps.executeUpdate();
ps.close();
} catch (SQLException e) {
outputFileError(e);
return;
}
setQuestRecord(getPlayer(), 160001, "0");
setQuestRecord(getPlayer(), 160002, "0");
getPlayer().setMarriageId(0);
sendNext("You have been successfully divorced...");
return;
} else if (chz < -1) {
sendNext("Please make sure your partner is logged on.");
return;
}
MapleCharacter cPlayer = ChannelServer.getInstance(chz).getPlayerStorage().getCharacterById(getPlayer().getMarriageId());
if (cPlayer != null) {
cPlayer.dropMessage(1, "Your partner has divorced you.");
cPlayer.setMarriageId(0);
setQuestRecord(cPlayer, 160001, "0");
setQuestRecord(getPlayer(), 160001, "0");
setQuestRecord(cPlayer, 160002, "0");
setQuestRecord(getPlayer(), 160002, "0");
getPlayer().setMarriageId(0);
sendNext("You have been successfully divorced...");
} else {
sendNext("An error occurred...");
}
}
public String getReadableMillis(long startMillis, long endMillis) {
return StringUtil.getReadableMillis(startMillis, endMillis);
}
public void sendUltimateExplorer() {
getClient().getSession().write(CWvsContext.ultimateExplorer());
}
public void sendPendant(boolean b) {
c.getSession().write(CWvsContext.pendantSlot(b));
}
public Triple<Integer, Integer, Integer> getCompensation() {
Triple<Integer, Integer, Integer> ret = null;
try {
try (PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement("SELECT * FROM compensationlog_confirmed WHERE chrname LIKE ?")) {
ps.setString(1, getPlayer().getName());
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
ret = new Triple<>(rs.getInt("value"), rs.getInt("taken"), rs.getInt("donor"));
}
}
}
return ret;
} catch (SQLException e) {
FileoutputUtil.outputFileError(FileoutputUtil.ScriptEx_Log, e);
return ret;
}
}
public boolean deleteCompensation(int taken) {
try {
try (PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement("UPDATE compensationlog_confirmed SET taken = ? WHERE chrname LIKE ?")) {
ps.setInt(1, taken);
ps.setString(2, getPlayer().getName());
ps.executeUpdate();
}
return true;
} catch (SQLException e) {
FileoutputUtil.outputFileError(FileoutputUtil.ScriptEx_Log, e);
return false;
}
}
/*
* Start of Custom Features
*/
public void gainAPS(int gain) {
getPlayer().gainAPS(gain);
}
/*
* End of Custom Features
*/
public void changeJobById(short job) {
c.getPlayer().changeJob(job);
}
public int getJobId() {
return getPlayer().getJob();
}
public int getLevel() {
return getPlayer().getLevel();
}
public int getEquipId(byte slot) {
MapleInventory equip = getPlayer().getInventory(MapleInventoryType.EQUIP);
Equip eu = (Equip) equip.getItem(slot);
return equip.getItem(slot).getItemId();
}
public int getUseId(byte slot) {
MapleInventory use = getPlayer().getInventory(MapleInventoryType.USE);
return use.getItem(slot).getItemId();
}
public int getSetupId(byte slot) {
MapleInventory setup = getPlayer().getInventory(MapleInventoryType.SETUP);
return setup.getItem(slot).getItemId();
}
public int getCashId(byte slot) {
MapleInventory cash = getPlayer().getInventory(MapleInventoryType.CASH);
return cash.getItem(slot).getItemId();
}
public int getETCId(byte slot) {
MapleInventory etc = getPlayer().getInventory(MapleInventoryType.ETC);
return etc.getItem(slot).getItemId();
}
public String EquipList(MapleClient c) {
StringBuilder str = new StringBuilder();
MapleInventory equip = c.getPlayer().getInventory(MapleInventoryType.EQUIP);
List<String> stra = new LinkedList<>();
for (Item item : equip.list()) {
stra.add("#L" + item.getPosition() + "##v" + item.getItemId() + "##l");
}
for (String strb : stra) {
str.append(strb);
}
return str.toString();
}
public String UseList(MapleClient c) {
StringBuilder str = new StringBuilder();
MapleInventory use = c.getPlayer().getInventory(MapleInventoryType.USE);
List<String> stra = new LinkedList<>();
for (Item item : use.list()) {
stra.add("#L" + item.getPosition() + "##v" + item.getItemId() + "##l");
}
for (String strb : stra) {
str.append(strb);
}
return str.toString();
}
public String CashList(MapleClient c) {
StringBuilder str = new StringBuilder();
MapleInventory cash = c.getPlayer().getInventory(MapleInventoryType.CASH);
List<String> stra = new LinkedList<>();
for (Item item : cash.list()) {
stra.add("#L" + item.getPosition() + "##v" + item.getItemId() + "##l");
}
for (String strb : stra) {
str.append(strb);
}
return str.toString();
}
public String ETCList(MapleClient c) {
StringBuilder str = new StringBuilder();
MapleInventory etc = c.getPlayer().getInventory(MapleInventoryType.ETC);
List<String> stra = new LinkedList<>();
for (Item item : etc.list()) {
stra.add("#L" + item.getPosition() + "##v" + item.getItemId() + "##l");
}
for (String strb : stra) {
str.append(strb);
}
return str.toString();
}
public String SetupList(MapleClient c) {
StringBuilder str = new StringBuilder();
MapleInventory setup = c.getPlayer().getInventory(MapleInventoryType.SETUP);
List<String> stra = new LinkedList<>();
for (Item item : setup.list()) {
stra.add("#L" + item.getPosition() + "##v" + item.getItemId() + "##l");
}
for (String strb : stra) {
str.append(strb);
}
return str.toString();
}
public String PotentialedEquipList(MapleClient c) {
StringBuilder str = new StringBuilder();
MapleInventory equip = c.getPlayer().getInventory(MapleInventoryType.EQUIP);
List<String> stra = new LinkedList<>();
for (Item item : equip.list()) {
Equip eq = (Equip) item;
if (eq.getPotential(1, true) != 0) {
stra.add("\r\n#L" + item.getPosition() + "##v" + item.getItemId() + "# - " + (eq.getPotential(2, true) != 0 ? 2 : 1) + " additional potential lines #l");
}
}
for (String strb : stra) {
str.append(strb);
}
return str.toString();
}
public String EquipPotentialList(short slot) {
Equip equip = (Equip) getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(slot);
StringBuilder sb = new StringBuilder();
int[] potentials;
potentials = new int[]{equip.getPotential(1, false), equip.getPotential(2, false), equip.getPotential(3, false)};
for (int i : potentials) {
StructItemOption op = MapleItemInformationProvider.getInstance().getPotentialInfo(equip.getPotential(1, false)).get(MapleItemInformationProvider.getInstance().getReqLevel(equip.getItemId()) / 10);
sb.append("\r\nPotential ").append(i).append(" - ").append(op.toString());
}
return sb.toString();
}
public void showFredrick() {
HiredMerchantHandler.showFredrick(c);
}
public String searchId(int type, String search) {
return MapleInventoryManipulator.searchId(type, search);
}
public int parseInt(String s) {
return Integer.parseInt(s);
}
public byte parseByte(String s) {
return Byte.parseByte(s);
}
public short parseShort(String s) {
return Short.parseShort(s);
}
public long parseLong(String s) {
return Long.parseLong(s);
}
public void getEventEnvelope(int questid, int time) {
CWvsContext.getEventEnvelope(questid, time);
}
public void write(Object o) {
c.getSession().write(o);
}
public void openUIOption(int type) {
CField.UIPacket.openUIOption(type, id);
}
public void sendAttackOnTitanScore(int type) {
c.getSession().write(CField.UIPacket.openUIOption(type, 1));
}
public void showHilla() {
try {
c.getSession().write(CField.MapEff("phantom/hillah"));
MapleNPC hilla = new MapleNPC(1402400, "Hilla");
hilla.setPosition(new Point(-131, -2));
hilla.setCy(-7);
hilla.setF(1);
hilla.setFh(12);
hilla.setRx0(-181);
hilla.setRx1(-81);
MapleNPC guard1 = new MapleNPC(1402401, "Hilla's Guard");
guard1.setPosition(new Point(-209, -2));
guard1.setCy(-7);
guard1.setF(1);
guard1.setFh(12);
guard1.setRx0(-259);
guard1.setRx1(-159);
MapleNPC guard2 = new MapleNPC(1402401, "Hilla's Guard");
guard2.setPosition(new Point(-282, -2));
guard2.setCy(-7);
guard2.setF(1);
guard2.setFh(12);
guard2.setRx0(-332);
guard2.setRx1(-232);
MapleNPC guard3 = new MapleNPC(1402401, "Hilla's Guard");
guard3.setPosition(new Point(-59, -2));
guard3.setCy(-7);
guard3.setF(1);
guard3.setFh(12);
guard3.setRx0(-109);
guard3.setRx1(-9);
c.getSession().write(NPCPacket.spawnNPC(hilla, true));
c.getSession().write(NPCPacket.spawnNPC(guard1, true));
c.getSession().write(NPCPacket.spawnNPC(guard2, true));
c.getSession().write(NPCPacket.spawnNPC(guard3, true));
Thread.sleep(6000);
} catch (InterruptedException e) {
}
NPCScriptManager.getInstance().start(c.getPlayer().getClient(), 1104201, "PTtutor500_2");
}
public void showSkaia() {
try {
c.getSession().write(CField.MapEff("phantom/skaia"));
Thread.sleep(8000);
} catch (InterruptedException e) {
}
NPCScriptManager.getInstance().start(c.getPlayer().getClient(), 1104201, "PTtutor500_3");
}
public void showPhantomWait() {
try {
c.getSession().write(CField.MapEff("phantom/phantom"));
Thread.sleep(2000);
} catch (InterruptedException e) {
}
NPCScriptManager.getInstance().start(c.getPlayer().getClient(), 1104201, "PTtutor500_4");
}
public void movePhantom() {
try {
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 3, 2));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 2000));
Thread.sleep(2000);
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 3, 0));
} catch (InterruptedException e) {
}
NPCScriptManager.getInstance().start(c.getPlayer().getClient(), 1104201, "PTtutor500_1");
}
public void showPhantomMovie() {
warp(150000000);
try {
c.getSession().write(UIPacket.playMovie("phantom.avi", true));
Thread.sleep(4 * 60 * 1000); //4 minutes
} catch (InterruptedException e) {
}
MapleQuest.getInstance(25000).forceComplete(c.getPlayer(), 1402000);
c.getSession().write(CField.UIPacket.getDirectionStatus(false));
c.getSession().write(CField.UIPacket.IntroEnableUI(0));
}
public void mihileNeinheartDisappear() {
try {
c.getSession().write(UIPacket.getDirectionInfo("Effect/Direction7.img/effect/tuto/step0/4", 2000, 0, -100, 1, 0));
c.getSession().write(UIPacket.getDirectionFacialExpression(6, 2000));
c.getPlayer().getClient().getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 2000));
Thread.sleep(2000);
NPCScriptManager.getInstance().start(c, 1106000, "tuto002");
} catch (InterruptedException e) {
}
}
public void mihileMove913070001() {
try {
c.getPlayer().getClient().getSession().write(CField.UIPacket.getDirectionInfo((byte) 3, 2));
c.getPlayer().getClient().getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 800));
Thread.sleep(800);
} catch (InterruptedException e) {
}
c.getSession().write(CField.UIPacket.IntroEnableUI(0));
while (c.getPlayer().getLevel() < 2) {
c.getPlayer().levelUp();
}
c.getPlayer().setExp(0);
warp(913070001, 0);
c.getSession().write(CWvsContext.enableActions());
}
public void mihileSoul() {
try {
c.getSession().write(UIPacket.getDirectionInfo("Effect/Direction7.img/effect/tuto/soul/0", 4000, 0, -100, 1, 0));
Thread.sleep(4000);
} catch (InterruptedException e) {
}
NPCScriptManager.getInstance().start(c, 1106000, "tuto003");
}
public void mihileMove913070050() {
try {
c.getPlayer().getClient().getSession().write(CField.UIPacket.getDirectionInfo((byte) 3, 2));
c.getPlayer().getClient().getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 6000));
Thread.sleep(5000);
c.getPlayer().getClient().getSession().write(CField.UIPacket.getDirectionInfo((byte) 3, 0));
NPCScriptManager.getInstance().start(c, 1106001, "tuto005");
} catch (InterruptedException e) {
}
}
public void mihileAssailantSummon() {
for (int i = 0; i < 10; i++) {
c.getPlayer().getMap().spawnMonster_sSack(MapleLifeFactory.getMonster(9001050), new Point(240, 65), 0);
}
c.getSession().write(CWvsContext.enableActions());
}
public List<Triple<Short, String, Integer>> rankList(short[] ranks, String[] names, int[] values) {
List<Triple<Short, String, Integer>> list = new LinkedList();
if (ranks.length != names.length || names.length != values.length || values.length != ranks.length) {
return null;
}
for (int i = 0; i < ranks.length; i++) {
list.add(new Triple<>(ranks[i], names[i], values[i]));
}
return list;
}
public void displayRank(int npcid, List<Triple<Short, String, Integer>> list) {
if (ServerConfig.LOG_PACKETS) {
System.out.println("調用位置: " + new java.lang.Throwable().getStackTrace()[0]);
}
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.GUILD_OPERATION.getValue());
mplew.write(0x50);
mplew.writeInt(npcid);
mplew.writeInt(list.size());
for (Triple<Short, String, Integer> info : list) {
mplew.writeShort(info.getLeft()); //Rank
mplew.writeMapleAsciiString(info.getMid()); //Name
mplew.writeInt(info.getRight()); //Value
mplew.writeZeroBytes(16);
}
c.getSession().write(mplew.getPacket());
}
public void dragonShoutReward(int reward) {
int itemid;
switch (reward) {
case 0:
itemid = 1102207;
break;
case 1:
itemid = 1122080;
break;
case 2:
itemid = 2041213;
break;
case 3:
itemid = 2022704;
break;
default:
itemid = 2022704;
break;
}
final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
final MapleInventoryType invtype = GameConstants.getInventoryType(itemid);
if (!MapleInventoryManipulator.checkSpace(c, itemid, 1, "")) {
return;
}
if (invtype.equals(MapleInventoryType.EQUIP) && !ItemConstants.類型.可充值道具(itemid)) {
final Equip item = (Equip) (ii.getEquipById(itemid));
switch (reward) {
case 0: //9% ATT, 9% MAGIC, 30% Boss Damage
item.setPotential(40051, 1, false); //9% Att
item.setPotential(40052, 2, false); //9% Magic
item.setPotential(40601, 3, false); //30% Boss Damage
item.updateState(false);
break;
case 1: //30% All Stat
item.setPotential(40086, 1, false); //9% All Stat
item.setPotential(40086, 2, false); //9% All Stat
item.setPotential(40086, 3, false); //9% All Stat
item.setSocket1(ii.getSocketInfo(3063280).opID); //3% All Stat
item.updateState(false);
break;
}
item.setOwner("Hyperious");
item.setGMLog("從腳本 " + this.id + "(" + id2 + ")[" + script + "] (The Dragon's Shout PQ)中獲得 時間: " + FileoutputUtil.CurrentReadable_Time());
final String name = ii.getName(itemid);
if (itemid / 10000 == 114 && name != null && name.length() > 0) { //medal
final String msg = "<" + name + ">獲得稱號。";
c.getPlayer().dropMessage(-1, msg);
c.getPlayer().dropMessage(5, msg);
}
MapleInventoryManipulator.addbyItem(c, item.copy());
} else {
MapleInventoryManipulator.addById(c, itemid, (short) 1, "Hyperious", null, 0, MapleInventoryManipulator.DAY, "從腳本 " + this.id + "(" + id2 + ")[" + script + "] 中獲得 時間: " + FileoutputUtil.CurrentReadable_Time());
}
c.getSession().write(InfoPacket.getShowItemGain(itemid, (short) 1, true));
}
public String searchData(int type, String search) {
return SearchGenerator.searchData(type, search);
}
public boolean foundData(int type, String search) {
return SearchGenerator.foundData(type, search);
}
public boolean partyHaveItem(int itemid, short quantity) {
if (getPlayer().getParty() == null) {
return false;
}
for (MaplePartyCharacter chr : getPlayer().getParty().getMembers()) {
for (ChannelServer channel : ChannelServer.getAllInstances()) {
MapleCharacter ch = channel.getPlayerStorage().getCharacterById(chr.getId());
if (ch != null) {
if (!ch.haveItem(itemid, quantity)) {
return false;
}
}
}
}
return true;
}
public final boolean scrollItem(final short scroll, final short item) {
return InventoryHandler.UseUpgradeScroll(scroll, item, (short) 0, getClient(), getPlayer(), 0, false);
}
public long currentTimeMillis() {
return System.currentTimeMillis();
}
/*
public final int WEAPON_RENTAL = 57463816;
public int weaponRentalState() {
if (c.getPlayer().getIntNoRecord(WEAPON_RENTAL) == 0) {
return 0;
}
return (System.currentTimeMillis() / (60 * 1000) - c.getPlayer().getIntNoRecord(WEAPON_RENTAL)) >= 15 ? 1 : 2;
}
public void setWeaponRentalUnavailable() {
c.getPlayer().getQuestNAdd(MapleQuest.getInstance(WEAPON_RENTAL)).setCustomData("" + System.currentTimeMillis() / (60 * 1000));
}
*/
public MapleQuest getQuestById(int questId) {
return MapleQuest.getInstance(questId);
}
public int getEquipLevelById(int itemId) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
return ii.getEquipStats(itemId).get("reqLevel");
}
public void sendGMBoard(String url) {
c.getSession().write(CWvsContext.gmBoard(c.getNextClientIncrenement(), url));
}
public void addPendantSlot(int days) {
c.getPlayer().getQuestNAdd(MapleQuest.getInstance(GameConstants.墜飾欄)).setCustomData(String.valueOf(System.currentTimeMillis() + ((long) days * 24 * 60 * 60 * 1000)));
c.getSession().write(CField.updatePendantSlot(System.currentTimeMillis() + ((long) days * 24 * 60 * 60 * 1000)));
}
public void setPendantSlot(long time) {
c.getPlayer().getQuestNAdd(MapleQuest.getInstance(GameConstants.墜飾欄)).setCustomData(String.valueOf(time));
c.getSession().write(CField.updatePendantSlot(time));
}
public long getCustomMeso() {
return c.getPlayer().getLongNoRecord(GameConstants.CUSTOM_BANK);
}
public void setCustomMeso(long meso) {
c.getPlayer().getQuestNAdd(MapleQuest.getInstance(GameConstants.CUSTOM_BANK)).setCustomData(meso + "");
}
public void enter_931060110() {
try {
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/menuUI", 6000, 285, 186, 1, 0));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 900));
Thread.sleep(900);
c.getSession().write(CWvsContext.getTopMsg("First, click MENU at the bottom of the screen."));
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/mouseMoveToMenu", 1740, -114, -14, 1, 3));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 1680));
Thread.sleep(1680);
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/mouseClick", 1440, 246, 196, 1, 3));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 1440));
Thread.sleep(1440);
c.getSession().write(CWvsContext.getTopMsg("Now, select Go to Farm."));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 600));
Thread.sleep(600);
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/menuOpen", 50000, 285, 186, 1, 2));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 600));
Thread.sleep(600);
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/mouseMoveToMyfarm", 750, 246, 196, 1, 2));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 720));
Thread.sleep(720);
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/menuMouseOver", 50000, 285, 186, 1, 2));
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/mouseClick", 50000, 246, 166, 1, 3));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 1440));
Thread.sleep(1440);
} catch (InterruptedException ex) {
}
}
public void enter_931060120() {
try {
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/character", 120000, -200, 0, 1, 1));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 1200));
Thread.sleep(1200);
c.getSession().write(CWvsContext.getTopMsg("Hover over any other character..."));
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/mouseMoveToChar", 1680, -400, -210, 1, 3));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 1650));
Thread.sleep(1650);
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/mouseUp", 600, -190, -30, 1, 3));
c.getSession().write(CWvsContext.getTopMsg("Then right-click."));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 540));
Thread.sleep(540);
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/mouseClick", 1200, -190, -30, 1, 3));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 1200));
Thread.sleep(1200);
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/characterMenu", 50000, -200, 0, 1, 2));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 900));
Thread.sleep(900);
c.getSession().write(CWvsContext.getTopMsg("When the Character Menu appears, click Go to Farm."));
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/mouseMoveToOtherfarm", 1440, -190, -30, 1, 5));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 1380));
Thread.sleep(1380);
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/menuMouseOver", 50000, -200, 0, 1, 4));
c.getSession().write(UIPacket.getDirectionInfo("Effect/CharacterEff.img/farmEnterTuto/mouseClick", 60000, -130, 150, 1, 6));
c.getSession().write(CField.UIPacket.getDirectionInfo((byte) 1, 1200));
Thread.sleep(1200);
} catch (InterruptedException ex) {
}
}
public void showJettWanted() {
try {
c.getSession().write(CField.UIPacket.getDirectionInfo(1, 1000));
Thread.sleep(1000);
c.getSession().write(CField.environmentChange("newPirate/pendant_w", 13));
c.getSession().write(UIPacket.getDirectionFacialExpression(5, 3000));
c.getSession().write(UIPacket.getDirectionInfo("Effect/DirectionNewPirate.img/newPirate/balloonMsg1/1", 2000, 0, -80, 0, 0));
c.getSession().write(CField.UIPacket.getDirectionInfo(1, 3000));
Thread.sleep(3000);
c.getSession().write(CField.UIPacket.getDirectionInfo(3, 1));
} catch (InterruptedException ex) {
}
NPCScriptManager.getInstance().dispose(c);
c.removeClickedNPC();
NPCScriptManager.getInstance().start(c, 9270083, "np_tuto_0_2");
}
public void np_tuto_0_2() {
try {
c.getSession().write(CField.UIPacket.getDirectionInfo(3, 2));
c.getSession().write(CField.UIPacket.getDirectionInfo(1, 10));
Thread.sleep(10);
c.getSession().write(UIPacket.getDirectionFacialExpression(5, 3000));
c.getSession().write(UIPacket.getDirectionInfo("Effect/DirectionNewPirate.img/newPirate/balloonMsg1/1", 2000, 0, -80, 0, 0));
c.getSession().write(CField.UIPacket.getDirectionInfo(1, 1000));
Thread.sleep(1000);
} catch (InterruptedException ex) {
}
NPCScriptManager.getInstance().dispose(c);
c.removeClickedNPC();
NPCScriptManager.getInstance().start(c, 9270083, "np_tuto_0_3");
}
public void spawnJettGuards() {
try {
c.getSession().write(CField.UIPacket.getDirectionInfo(3, 2));
c.getSession().write(CField.UIPacket.getDirectionInfo(1, 300));
Thread.sleep(300);
c.getSession().write(CField.UIPacket.getDirectionInfo(3, 0));
c.getSession().write(UIPacket.getDirectionInfo("Effect/DirectionNewPirate.img/newPirate/balloonMsg1/3", 2000, 0, -80, 0, 0));
c.getSession().write(CField.UIPacket.getDirectionInfo(1, 500));
Thread.sleep(500);
c.getSession().write(UIPacket.getDirectionInfo("Effect/DirectionNewPirate.img/newPirate/attack_tuto", 2000, 0, -80, 0, 0));
} catch (InterruptedException ex) {
}
c.getSession().write(CField.UIPacket.IntroEnableUI(0));
c.getSession().write(CWvsContext.getTopMsg("Eliminate all Guards."));
forceStartQuest(53245);
spawnMob(9420564, 3, 600, -120);
}
public static String getMobImg(int mob) {
MapleMonster monster = MapleLifeFactory.getMonster(mob);
if (monster.getStats().getLink() != 0) {
mob = monster.getStats().getLink();
}
String mobStr = String.valueOf(mob);
while (mobStr.length() < 7) {
String newStr = "0" + mobStr;
mobStr = newStr;
}
return "#fMob/" + mobStr + ".img/stand/0#";
}
public void showKannaMovie() {
try {
c.getSession().write(UIPacket.playMovie("JPKanna.avi", true));
Thread.sleep(1 * 60 * 1000);
} catch (InterruptedException e) {
}
c.getSession().write(CField.UIPacket.getDirectionStatus(false));
c.getSession().write(CField.UIPacket.IntroEnableUI(0));
}
public void showMapleLeafScene() {
try {
c.getSession().write(UIPacket.getDirectionStatus(true));
c.getSession().write(CField.UIPacket.IntroEnableUI(1));
c.getSession().write(CField.environmentChange("adventureStory/mapleLeaf/0", 13));
c.getSession().write(CField.UIPacket.getDirectionInfo(1, 1800));
Thread.sleep(1800);
} catch (InterruptedException ex) {
}
c.getSession().write(CField.UIPacket.IntroEnableUI(0));
NPCScriptManager.getInstance().dispose(c);
c.removeClickedNPC();
NPCScriptManager.getInstance().start(c, 10306, "ExplorerTut08");
}
public void showBeastTamerTutScene() {
c.getSession().write(CField.UIPacket.IntroEnableUI(0));
NPCScriptManager.getInstance().dispose(c);
c.removeClickedNPC();
NPCScriptManager.getInstance().start(c, 9390305, "BeastTamerTut01");
}
public void showBeastTamerTutScene1() {
try {
c.getSession().write(UIPacket.getDirectionStatus(true));
c.getSession().write(CField.UIPacket.getDirectionInfo(1, 1000));
c.getSession().write(CField.UIPacket.getDirectionInfo(1, 1000));
Thread.sleep(2000);
c.getSession().write(UIPacket.getDirectionInfo("Effect/Direction14.img/effect/ShamanBT/balloonMsg/10", 2000, 0, -120, 1, 0));
c.getSession().write(CField.UIPacket.getDirectionInfo(1, 800));
Thread.sleep(800);
c.getSession().write(CField.UIPacket.getDirectionInfoNew((byte) 0, 1000, 700, 0));
c.getSession().write(CField.UIPacket.getDirectionInfo(1, 1200));
Thread.sleep(1200);
c.getSession().write(UIPacket.getDirectionInfo("Effect/Direction14.img/effect/ShamanBT/BalloonMsg1/7", 2000, 571, -120, 1, 0));
c.getSession().write(CField.environmentChange("ShamanBTTuto/sound0", 5));
c.getSession().write(UIPacket.getDirectionInfo(1, 3000));
Thread.sleep(3000);
c.getSession().write(UIPacket.getDirectionInfo(1, 1000));
c.getSession().write(UIPacket.getDirectionInfo(1, 500));
Thread.sleep(1500);
c.getSession().write(UIPacket.getDirectionFacialExpression(4, 5000));
Thread.sleep(3000);
} catch (InterruptedException ex) {
}
NPCScriptManager.getInstance().dispose(c);
c.removeClickedNPC();
NPCScriptManager.getInstance().start(c, 9390305, "BeastTamerTut02");
}
public String getSkillMenu(int skillMaster, int job) {
String menu = "";
int bookMin = 3;
int bookMax = 3;
if (MapleJob.is龍魔導士(job)) {
bookMin = 9;
bookMax = 9;
} else if (MapleJob.is神之子(job)) {
bookMin = 0;
bookMax = 1;
} else if (MapleJob.is影武者(job)) {
if (skillMaster < 20) {
bookMin = 2;
bookMax = 4;
} else {
bookMin = 5;
bookMax = 5;
}
} else if (!GameConstants.isSeparatedSp(job)) {
bookMin = 0;
bookMax = 0;
}
for (Map.Entry<Skill, SkillEntry> ret : c.getPlayer().getSkills().entrySet()) {
int skillBook = GameConstants.getSkillBookBySkill(ret.getKey().getId());
int skillJob = ret.getKey().getId() / 100000;
if (skillBook < bookMin || skillBook > bookMax || skillJob != job / 10) {
continue;
}
if ((ret.getKey().getMaxLevel() > 10 || skillMaster < 20) && ret.getValue().masterlevel < ret.getKey().getMaxLevel()) {
if (skillMaster > 20) {
if (ret.getValue().masterlevel >= 30 || ret.getValue().masterlevel < 20 || ret.getKey().getMaxLevel() <= 20) {
continue;
}
} else if (skillMaster > 10) {
if (ret.getValue().masterlevel >= 20) {
continue;
}
}
menu += "\r\n#L" + ret.getKey().getId() + "# #s" + ret.getKey().getId() + "# #fn字體##fs14##e#q" + ret.getKey().getId() + "##n#fs##fn##l";
}
}
return menu;
}
public boolean canUseSkillBook(int skillId, int masterLevel) {
if (masterLevel > 0) {
int job = skillId / 10000;
if (masterLevel == 10 && (MapleJob.中忍.getId() > job || MapleJob.隱忍.getId() < job)) {
return false;
}
final Skill CurrSkillData = SkillFactory.getSkill(skillId);
int skillLevel = c.getPlayer().getSkillLevel(CurrSkillData);
if (skillLevel >= CurrSkillData.getMaxLevel()) {
return false;
}
if ((skillLevel >= 5 && masterLevel <= 20) || (skillLevel >= 15 && masterLevel <= 30 && masterLevel > 20)) {
return true;
}
}
return false;
}
public void useSkillBook(int skillId, int masterLevel) {
final Skill CurrSkillData = SkillFactory.getSkill(skillId);
if (masterLevel == 10) {
masterLevel = CurrSkillData.getMaxLevel();
}
masterLevel = masterLevel > CurrSkillData.getMaxLevel() ? CurrSkillData.getMaxLevel() : masterLevel;
c.getPlayer().changeSingleSkillLevel(CurrSkillData, c.getPlayer().getSkillLevel(CurrSkillData), (byte) masterLevel);
c.getPlayer().getMap().broadcastMessage(CWvsContext.useSkillBook(c.getPlayer(), 0, 0, true, true));
c.getSession().write(CWvsContext.enableActions());
}
public void getDemonSelection() {
c.getSession().write(NPCPacket.getDemonSelection());
lastMsg = 0x17;
}
public void checkMedalQuest() {
MapleQuest.MedalQuest m = null;
for (MapleQuest.MedalQuest mq : MapleQuest.MedalQuest.values()) {
for (int i : mq.maps) {
if (c.getPlayer().getMapId() == i) {
m = mq;
break;
}
}
}
if (m != null && c.getPlayer().getLevel() >= m.level && c.getPlayer().getQuestStatus(m.questid) != 2) {
if (c.getPlayer().getQuestStatus(m.lquestid) != 1) {
MapleQuest.getInstance(m.lquestid).forceStart(c.getPlayer(), 0, "0");
}
if (c.getPlayer().getQuestStatus(m.questid) != 1) {
MapleQuest.getInstance(m.questid).forceStart(c.getPlayer(), 0, null);
final StringBuilder sb = new StringBuilder("enter=");
for (int i = 0; i < m.maps.length; i++) {
sb.append("0");
}
c.getPlayer().updateInfoQuest(m.questid - 2005, sb.toString());
MapleQuest.getInstance(m.questid - 1995).forceStart(c.getPlayer(), 0, "0");
}
String quest = c.getPlayer().getInfoQuest(m.questid - 2005);
if (quest.length() != m.maps.length + 6) { //enter= is 6
final StringBuilder sb = new StringBuilder("enter=");
for (int i = 0; i < m.maps.length; i++) {
sb.append("0");
}
quest = sb.toString();
c.getPlayer().updateInfoQuest(m.questid - 2005, quest);
}
final MapleQuestStatus stat = c.getPlayer().getQuestNAdd(MapleQuest.getInstance(m.questid - 1995));
if (stat.getCustomData() == null) { //just a check.
stat.setCustomData("0");
}
int number = Integer.parseInt(stat.getCustomData());
final StringBuilder sb = new StringBuilder("enter=");
boolean changedd = false;
for (int i = 0; i < m.maps.length; i++) {
boolean changed = false;
if (c.getPlayer().getMapId() == m.maps[i]) {
if (quest.substring(i + 6, i + 7).equals("0")) {
sb.append("1");
changed = true;
changedd = true;
}
}
if (!changed) {
sb.append(quest.substring(i + 6, i + 7));
}
}
if (changedd) {
number++;
c.getPlayer().updateInfoQuest(m.questid - 2005, sb.toString());
MapleQuest.getInstance(m.questid - 1995).forceStart(c.getPlayer(), 0, String.valueOf(number));
c.getPlayer().dropMessage(-1, "探險" + number + "/" + m.maps.length + "個地區");
c.getPlayer().dropMessage(-1, "稱號- " + String.valueOf(m) + "挑戰中");
c.getSession().write(CWvsContext.showQuestMsg("稱號- " + String.valueOf(m) + "挑戰中" + number + "/" + m.maps.length + "完成"));
}
}
}
}