/*
OrpheusMS: MapleStory Private Server based on OdinMS
Copyright (C) 2012 Aaron Weiss <aaron@deviant-core.net>
Patrick Huy <patrick.huy@frz.cc>
Matthias Butz <matze@odinms.de>
Jan Christian Meyer <vimes@odinms.de>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package scripting;
import java.util.Arrays;
import java.util.List;
import client.Equip;
import client.IItem;
import client.ISkill;
import client.MapleCharacter;
import client.MapleClient;
import client.MapleInventory;
import client.MapleInventoryType;
import client.MaplePet;
import client.MapleQuestStatus;
import client.SkillFactory;
import constants.ItemConstants;
import java.awt.Point;
import net.server.MapleParty;
import net.server.Server;
import net.server.guild.MapleGuild;
import scripting.event.EventManager;
import scripting.npc.NPCScriptManager;
import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.life.MapleLifeFactory;
import server.life.MapleMonster;
import server.life.MobSkill;
import server.life.MobSkillFactory;
import server.maps.MapleMap;
import server.maps.MapleMapObject;
import server.maps.MapleMapObjectType;
import server.partyquest.Pyramid;
import server.quest.MapleQuest;
import tools.MaplePacketCreator;
public class AbstractPlayerInteraction {
public MapleClient c;
public AbstractPlayerInteraction(MapleClient c) {
this.c = c;
}
public MapleClient getClient() {
return c;
}
public MapleCharacter getPlayer() {
return c.getPlayer();
}
public void warp(int map) {
getPlayer().changeMap(getWarpMap(map), getWarpMap(map).getPortal(0));
}
public void warp(int map, int portal) {
getPlayer().changeMap(getWarpMap(map), getWarpMap(map).getPortal(portal));
}
public void warp(int map, String portal) {
getPlayer().changeMap(getWarpMap(map), getWarpMap(map).getPortal(portal));
}
public void warpMap(int map) {
for (MapleCharacter mc : getPlayer().getMap().getCharacters()) {
mc.changeMap(getWarpMap(map), getWarpMap(map).getPortal(0));
}
}
protected MapleMap getWarpMap(int map) {
MapleMap target;
if (getPlayer().getEventInstance() == null) {
target = c.getChannelServer().getMapFactory().getMap(map);
} else {
target = getPlayer().getEventInstance().getMapInstance(map);
}
return target;
}
public MapleMap getMap(int map) {
return getWarpMap(map);
}
public EventManager getEventManager(String event) {
return getClient().getChannelServer().getEventSM().getEventManager(event);
}
public boolean haveItem(int itemid) {
return haveItem(itemid, 1);
}
public boolean haveItem(int itemid, int quantity) {
return getPlayer().getItemQuantity(itemid, false) >= quantity;
}
public boolean canHold(int itemid) {
return getPlayer().getInventory(MapleItemInformationProvider.getInstance().getInventoryType(itemid)).getNextFreeSlot() > -1;
}
public void openNpc(int npcid) {
NPCScriptManager.getInstance().dispose(c);
NPCScriptManager.getInstance().start(c, npcid, null, null);
}
public void updateQuest(int questid, String status) {
c.announce(MaplePacketCreator.updateQuest((short) questid, status));
}
public MapleQuestStatus.Status getQuestStatus(int id) {
return c.getPlayer().getQuest(MapleQuest.getInstance(id)).getStatus();
}
public boolean isQuestCompleted(int quest) {
try {
return getQuestStatus(quest) == MapleQuestStatus.Status.COMPLETED;
} catch (NullPointerException e) {
return false;
}
}
public boolean isQuestStarted(int quest) {
try {
return getQuestStatus(quest) == MapleQuestStatus.Status.STARTED;
} catch (NullPointerException e) {
return false;
}
}
public int getQuestProgress(int qid) {
return Integer.parseInt(getPlayer().getQuest(MapleQuest.getInstance(29932)).getProgress().get(0));
}
public void gainItem(int id, short quantity) {
gainItem(id, quantity, false);
}
public void gainItem(int id) {
gainItem(id, (short) 1, false);
}
public void gainItem(int id, short quantity, boolean randomStats) {
if (id >= 5000000 && id <= 5000100) {
MapleInventoryManipulator.addById(c, id, (short) 1, null, MaplePet.createPet(id), -1);
}
if (quantity >= 0) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
IItem item = ii.getEquipById(id);
if (!MapleInventoryManipulator.checkSpace(c, id, quantity, "")) {
c.getPlayer().dropMessage(1, "Your inventory is full. Please remove an item from your " + ii.getInventoryType(id).name() + " inventory.");
return;
}
if (ii.getInventoryType(id).equals(MapleInventoryType.EQUIP) && !ItemConstants.isRechargable(item.getItemId())) {
if (randomStats) {
MapleInventoryManipulator.addFromDrop(c, ii.randomizeStats((Equip) item), false);
} else {
MapleInventoryManipulator.addFromDrop(c, (Equip) item, false);
}
} else {
MapleInventoryManipulator.addById(c, id, quantity);
}
} else {
MapleInventoryManipulator.removeById(c, MapleItemInformationProvider.getInstance().getInventoryType(id), id, -quantity, true, false);
}
c.announce(MaplePacketCreator.getShowItemGain(id, quantity, true));
}
public void changeMusic(String songName) {
getPlayer().getMap().broadcastMessage(MaplePacketCreator.musicChange(songName));
}
public void playerMessage(int type, String message) {
c.announce(MaplePacketCreator.serverNotice(type, message));
}
public void message(String message) {
getPlayer().message(message);
}
public void mapMessage(int type, String message) {
getPlayer().getMap().broadcastMessage(MaplePacketCreator.serverNotice(type, message));
}
public void mapEffect(String path) {
c.announce(MaplePacketCreator.mapEffect(path));
}
public void mapSound(String path) {
c.announce(MaplePacketCreator.mapSound(path));
}
public void showIntro(String path) {
c.announce(MaplePacketCreator.showIntro(path));
}
public void showInfo(String path) {
c.announce(MaplePacketCreator.showInfo(path));
c.announce(MaplePacketCreator.enableActions());
}
public void guildMessage(int type, String message) {
if (getGuild() != null) {
getGuild().guildMessage(MaplePacketCreator.serverNotice(type, message));
}
}
public MapleGuild getGuild() {
try {
return Server.getInstance().getGuild(getPlayer().getGuildId(), null);
} catch (Exception e) {
}
return null;
}
public MapleParty getParty() {
return getPlayer().getParty();
}
public boolean isLeader() {
return getParty().getLeader().equals(getPlayer().getMPC());
}
public void givePartyItems(int id, short quantity, List<MapleCharacter> party) {
for (MapleCharacter chr : party) {
MapleClient cl = chr.getClient();
if (quantity >= 0) {
MapleInventoryManipulator.addById(cl, id, quantity);
} else {
MapleInventoryManipulator.removeById(cl, MapleItemInformationProvider.getInstance().getInventoryType(id), id, -quantity, true, false);
}
cl.announce(MaplePacketCreator.getShowItemGain(id, quantity, true));
}
}
public void givePartyExp(int amount, List<MapleCharacter> party) {
for (MapleCharacter chr : party) {
chr.gainExp((amount * chr.getExpRate()), true, true);
}
}
public void removeFromParty(int id, List<MapleCharacter> party) {
for (MapleCharacter chr : party) {
MapleClient cl = chr.getClient();
MapleInventoryType type = MapleItemInformationProvider.getInstance().getInventoryType(id);
MapleInventory iv = cl.getPlayer().getInventory(type);
int possesed = iv.countById(id);
if (possesed > 0) {
MapleInventoryManipulator.removeById(c, MapleItemInformationProvider.getInstance().getInventoryType(id), id, possesed, true, false);
cl.announce(MaplePacketCreator.getShowItemGain(id, (short) -possesed, true));
}
}
}
public void removeAll(int id) {
removeAll(id, c);
}
public void removeAll(int id, MapleClient cl) {
int possessed = cl.getPlayer().getInventory(MapleItemInformationProvider.getInstance().getInventoryType(id)).countById(id);
if (possessed > 0) {
MapleInventoryManipulator.removeById(cl, MapleItemInformationProvider.getInstance().getInventoryType(id), id, possessed, true, false);
cl.announce(MaplePacketCreator.getShowItemGain(id, (short) -possessed, true));
}
}
public int getMapId() {
return c.getPlayer().getMap().getId();
}
public int getPlayerCount(int mapid) {
return c.getChannelServer().getMapFactory().getMap(mapid).getCharacters().size();
}
public void showInstruction(String msg, int width, int height) {
c.announce(MaplePacketCreator.sendHint(msg, width, height));
c.announce(MaplePacketCreator.enableActions());
}
public void disableMinimap() {
c.announce(MaplePacketCreator.disableMinimap());
}
public void resetMap(int mapid) {
getMap(mapid).resetReactors();
getMap(mapid).killAllMonsters();
for (MapleMapObject i : getMap(mapid).getMapObjectsInRange(c.getPlayer().getPosition(), Double.POSITIVE_INFINITY, Arrays.asList(MapleMapObjectType.ITEM))) {
getMap(mapid).removeMapObject(i);
getMap(mapid).broadcastMessage(MaplePacketCreator.removeItemFromMap(i.getObjectId(), 0, c.getPlayer().getId()));
}
}
public void sendClock(MapleClient d, int time) {
d.announce(MaplePacketCreator.getClock((int) (time - System.currentTimeMillis()) / 1000));
}
public void useItem(int id) {
MapleItemInformationProvider.getInstance().getItemEffect(id).applyTo(c.getPlayer());
c.announce(MaplePacketCreator.getItemMessage(id));// Useful shet :3
}
public void giveTutorialSkills() {
if (getPlayer().getMapId() == 914000100) {
ISkill skill = SkillFactory.getSkill(20000018);
ISkill skill0 = SkillFactory.getSkill(20000017);
getPlayer().changeSkillLevel(skill, (byte) 1, 1, -1);
getPlayer().changeSkillLevel(skill0, (byte) 1, 1, -1);
} else if (getPlayer().getMapId() == 914000200) {
ISkill skill = SkillFactory.getSkill(20000015);
ISkill skill0 = SkillFactory.getSkill(20000014);
getPlayer().changeSkillLevel(skill, (byte) 1, 1, -1);
getPlayer().changeSkillLevel(skill0, (byte) 1, 1, -1);
} else if (getPlayer().getMapId() == 914000210) {
ISkill skill = SkillFactory.getSkill(20000016);
getPlayer().changeSkillLevel(skill, (byte) 1, 1, -1);
}
}
public void removeAranPoleArm() {
IItem tempItem = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -11);
MapleInventoryManipulator.removeFromSlot(c.getPlayer().getClient(), MapleInventoryType.EQUIPPED, (byte) -11, tempItem.getQuantity(), false, true);
}
public void spawnMonster(int id, int x, int y) {
MapleMonster monster = MapleLifeFactory.getMonster(id);
monster.setPosition(new Point(x, y));
getPlayer().getMap().spawnMonster(monster);
}
public void spawnGuide() {
c.announce(MaplePacketCreator.spawnGuide(true));
}
public void removeGuide() {
c.announce(MaplePacketCreator.spawnGuide(false));
}
public void displayGuide(int num) {
c.announce(MaplePacketCreator.showInfo("UI/tutorial.img/" + num));
}
public void talkGuide(String message) {
c.announce(MaplePacketCreator.talkGuide(message));
}
public void guideHint(int hint) {
c.announce(MaplePacketCreator.guideHint(hint));
}
public void updateAranIntroState(String mode) {
c.getPlayer().addAreaData(21002, mode);
c.announce(MaplePacketCreator.updateAreaInfo(mode, 21002));
}
public void updateAranIntroState2(String mode) {
c.getPlayer().addAreaData(21019, mode);
c.announce(MaplePacketCreator.updateAreaInfo(mode, 21019));
}
public boolean getAranIntroState(String mode) {
if (c.getPlayer().area_data.contains(mode)) {
return true;
}
return false;
}
public void updateCygnusIntroState(String mode) {
c.getPlayer().addAreaData(20021, mode);
c.announce(MaplePacketCreator.updateAreaInfo(mode, 20021));
}
public boolean getCygnusIntroState(String mode) {
if (c.getPlayer().area_data.contains(mode)) {
return true;
}
return false;
}
public MobSkill getMobSkill(int skill, int level) {
return MobSkillFactory.getMobSkill(skill, level);
}
public void earnTitle(String msg) {
c.announce(MaplePacketCreator.earnTitleMessage(msg));
}
public void showInfoText(String msg) {
c.announce(MaplePacketCreator.showInfoText(msg));
}
public void openUI(byte ui) {
c.announce(MaplePacketCreator.openUI(ui));
}
public void lockUI() {
c.announce(MaplePacketCreator.disableUI(true));
c.announce(MaplePacketCreator.lockUI(true));
}
public void unlockUI() {
c.announce(MaplePacketCreator.disableUI(false));
c.announce(MaplePacketCreator.lockUI(false));
}
public void environmentChange(String env, int mode) {
getPlayer().getMap().broadcastMessage(MaplePacketCreator.environmentChange(env, mode));
}
public Pyramid getPyramid() {
return (Pyramid) getPlayer().getPartyQuest();
}
}