package javastory.scripting;
import java.awt.Point;
import java.rmi.RemoteException;
import java.util.List;
import javastory.channel.ChannelCharacter;
import javastory.channel.ChannelClient;
import javastory.channel.ChannelServer;
import javastory.channel.Guild;
import javastory.channel.PartyMember;
import javastory.channel.client.Pet;
import javastory.channel.life.LifeFactory;
import javastory.channel.life.Monster;
import javastory.channel.maps.Event_DojoAgent;
import javastory.channel.maps.GameMap;
import javastory.channel.maps.GameMapObject;
import javastory.channel.maps.Reactor;
import javastory.channel.maps.SavedLocationType;
import javastory.channel.packet.PetPacket;
import javastory.channel.server.InventoryManipulator;
import javastory.game.Equip;
import javastory.game.GameConstants;
import javastory.game.Inventory;
import javastory.game.InventoryType;
import javastory.game.Item;
import javastory.game.data.ItemInfoProvider;
import javastory.game.data.SkillInfoProvider;
import javastory.game.quest.QuestStatus;
import javastory.tools.Randomizer;
import javastory.tools.packets.ChannelPackets;
import javastory.tools.packets.UIPacket;
public class AbstractPlayerInteraction {
protected ChannelClient client;
public AbstractPlayerInteraction(final ChannelClient client) {
this.client = client;
}
public final ChannelClient getClient() {
return this.client;
}
public final ChannelCharacter getPlayer() {
return this.client.getPlayer();
}
public final EventManager getEventManager(final String event) {
return ChannelServer.getInstance().getEventSM().getEventManager(event);
}
public final EventInstanceManager getEventInstance() {
return this.client.getPlayer().getEventInstance();
}
public final void warp(final int map) {
final GameMap target = this.getWarpMap(map);
this.client.getPlayer().changeMap(target, target.getPortal(Randomizer.nextInt(target.getPortals().size())));
}
public final void warp(final int mapId, final int portalId) {
final GameMap target = this.getWarpMap(mapId);
this.client.getPlayer().changeMap(target, target.getPortal(portalId));
}
public final void warp(final int mapId, final String portal) {
final GameMap target = this.getWarpMap(mapId);
this.client.getPlayer().changeMap(target, target.getPortal(portal));
}
public final void warpMap(final int mapId, final int portal) {
final GameMap target = this.getMap(mapId);
for (final ChannelCharacter chr : this.client.getPlayer().getMap().getCharacters()) {
chr.changeMap(target, target.getPortal(portal));
}
}
public final void playPortalSE() {
this.client.write(ChannelPackets.showOwnBuffEffect(0, 7));
}
private GameMap getWarpMap(final int map) {
return ChannelServer.getMapFactory().getMap(map);
}
public final GameMap getMap() {
return this.client.getPlayer().getMap();
}
public final GameMap getMap(final int map) {
return this.getWarpMap(map);
}
public final void spawnMob(final int id, final int x, final int y) {
this.spawnMob(id, 1, new Point(x, y));
}
private void spawnMob(final int id, final int qty, final Point pos) {
for (int i = 0; i < qty; i++) {
this.client.getPlayer().getMap().spawnMonsterOnGroundBelow(LifeFactory.getMonster(id), pos);
}
}
public final void killMob(final int ids) {
this.client.getPlayer().getMap().killMonster(ids);
}
public final void killAllMob() {
this.client.getPlayer().getMap().killAllMonsters(true);
}
public final void addHP(final int delta) {
this.client.getPlayer().addHP(delta);
}
public final String getName() {
return this.client.getPlayer().getName();
}
public final boolean haveItem(final int itemid) {
return this.haveItem(itemid, 1);
}
public final boolean haveItem(final int itemid, final int quantity) {
return this.haveItem(itemid, quantity, false, true);
}
public final boolean haveItem(final int itemid, final int quantity, final boolean checkEquipped, final boolean greaterOrEquals) {
return this.client.getPlayer().haveItem(itemid, quantity, checkEquipped, greaterOrEquals);
}
public final boolean canHold(final int itemid) {
return this.client.getPlayer().getInventoryForItem(itemid).getNextFreeSlot() > -1;
}
public final QuestStatus getQuestRecord(final int id) {
return this.client.getPlayer().getQuestStatus(id);
}
public final byte getQuestStatus(final int id) {
return this.client.getPlayer().getQuestCompletionStatus(id);
}
public final void forceStartQuest(final int id, final String data) {
this.client.getPlayer().getQuestStatus(id).start(0, data);
}
public final void forceCompleteQuest(final int id) {
this.client.getPlayer().getQuestStatus(id).complete(0);
}
public void spawnNpc(final int npcId) {
final ChannelCharacter player = this.client.getPlayer();
player.getMap().spawnNpc(npcId, player.getPosition());
}
public final void spawnNpc(final int npcId, final int x, final int y) {
this.client.getPlayer().getMap().spawnNpc(npcId, new Point(x, y));
}
public final void spawnNpc(final int npcId, final Point pos) {
this.client.getPlayer().getMap().spawnNpc(npcId, pos);
}
public final void removeNpc(final int mapid, final int npcId) {
ChannelServer.getMapFactory().getMap(mapid).removeNpc(npcId);
}
public final void forceStartReactor(final int mapid, final int id) {
final GameMap map = ChannelServer.getMapFactory().getMap(mapid);
Reactor react;
for (final GameMapObject remo : map.getAllReactor()) {
react = (Reactor) remo;
if (react.getReactorId() == id) {
react.forceStartReactor(this.client);
break;
}
}
}
public final void destroyReactor(final int mapid, final int id) {
final GameMap map = ChannelServer.getMapFactory().getMap(mapid);
Reactor react;
for (final GameMapObject remo : map.getAllReactor()) {
react = (Reactor) remo;
if (react.getReactorId() == id) {
react.hitReactor(this.client);
break;
}
}
}
public final void hitReactor(final int mapid, final int id) {
final GameMap map = ChannelServer.getMapFactory().getMap(mapid);
Reactor react;
for (final GameMapObject remo : map.getAllReactor()) {
react = (Reactor) remo;
if (react.getReactorId() == id) {
react.hitReactor(this.client);
break;
}
}
}
public final int getJob() {
return this.client.getPlayer().getJobId();
}
public int getJobId() {
return this.getPlayer().getJobId();
}
public final void gainNX(final int amount) {
this.client.getPlayer().modifyCSPoints(1, amount, true);
}
public final void gainItem(final int id, final short quantity) {
this.gainItem(id, quantity, false, 0);
}
public final void gainItem(final int id, final short quantity, final boolean randomStats) {
this.gainItem(id, quantity, randomStats, 0);
}
public final void gainItem(final int id, final short quantity, final long period) {
this.gainItem(id, quantity, false, period);
}
public final void gainItem(final int id, final short quantity, final boolean randomStats, final long period) {
final Inventory inventory = this.client.getPlayer().getInventoryForItem(id);
if (quantity >= 0) {
final ItemInfoProvider ii = ItemInfoProvider.getInstance();
if (!InventoryManipulator.checkSpace(this.client, id, quantity, "")) {
return;
}
if (inventory.getType().equals(InventoryType.EQUIP) && !GameConstants.isThrowingStar(id) && !GameConstants.isBullet(id)) {
final Item item = randomStats ? ii.randomizeStats((Equip) ii.getEquipById(id)) : ii.getEquipById(id);
if (period > 0) {
item.setExpiration(System.currentTimeMillis() + period);
}
InventoryManipulator.addbyItem(this.client, item);
} else {
InventoryManipulator.addById(this.client, id, quantity, "", null, period);
}
} else {
InventoryManipulator.removeById(this.client, inventory, id, -quantity, true, false);
}
this.client.write(ChannelPackets.getShowItemGain(id, quantity, true));
}
public final void changeMusic(final String songName) {
this.getPlayer().getMap().broadcastMessage(ChannelPackets.musicChange(songName));
}
public final void playerMessage(final String message) {
this.playerMessage(5, message); // default playerMessage and mapMessage to use type 5
}
public final void mapMessage(final String message) {
this.mapMessage(5, message);
}
public final void guildMessage(final String message) {
this.guildMessage(5, message);
}
public final void playerMessage(final int type, final String message) {
this.client.write(ChannelPackets.serverNotice(type, message));
}
public final void mapMessage(final int type, final String message) {
this.client.getPlayer().getMap().broadcastMessage(ChannelPackets.serverNotice(type, message));
}
public final void guildMessage(final int type, final String message) {
if (this.getGuild() != null) {
this.getGuild().guildMessage(ChannelPackets.serverNotice(type, message));
}
}
public final Guild getGuild() {
try {
return ChannelServer.getWorldInterface().getGuild(this.getPlayer().getGuildId());
} catch (final RemoteException ex) {
System.err.println("Could not connect to World Server: " + ex);
}
return null;
}
public final boolean isLeader() {
return this.client.getPlayer().getPartyMembership().isLeader();
}
public final boolean isAllPartyMembersAllowedJob(final int job) {
boolean allow = true;
final PartyMember member = this.client.getPlayer().getPartyMembership();
for (final ChannelCharacter chr : ChannelServer.getInstance().getPartyMembers(member.getPartyId())) {
if (chr.getJobId() / 100 != job) {
allow = false;
break;
}
}
return allow;
}
public final boolean allMembersHere() {
boolean allHere = true;
final ChannelCharacter player = this.client.getPlayer();
final PartyMember member = player.getPartyMembership();
for (final ChannelCharacter partymem : ChannelServer.getInstance().getPartyMembers(member.getPartyId())) {
// TODO, store info in MaplePartyCharacter instead
if (partymem.getMapId() != player.getMapId()) {
allHere = false;
break;
}
}
return allHere;
}
public final void warpParty(final int mapId) {
final int cMap = this.client.getPlayer().getMapId();
final GameMap target = this.getMap(mapId);
final PartyMember member = this.client.getPlayer().getPartyMembership();
for (final ChannelCharacter chr : ChannelServer.getInstance().getPartyMembers(member.getPartyId())) {
if (chr != null && chr.getMapId() == cMap) {
chr.changeMap(target, target.getPortal(0));
}
}
}
public final void givePartyItems(final int id, final short quantity, final List<ChannelCharacter> party) {
for (final ChannelCharacter chr : party) {
if (quantity >= 0) {
InventoryManipulator.addById(chr.getClient(), id, quantity);
} else {
InventoryManipulator.removeById(chr.getClient(), chr.getInventoryForItem(id), id, -quantity, true, false);
}
chr.getClient().write(ChannelPackets.getShowItemGain(id, quantity, true));
}
}
public final void givePartyExp(final int amount, final List<ChannelCharacter> party) {
for (final ChannelCharacter chr : party) {
chr.gainExp((int) (amount * ChannelServer.getInstance().getExpRate()), true, true, true);
}
}
public final void removeFromParty(final int id, final List<ChannelCharacter> party) {
for (final ChannelCharacter chr : party) {
final Inventory inventory = chr.getInventoryForItem(id);
final int possesed = inventory.countById(id);
if (possesed > 0) {
InventoryManipulator.removeById(this.client, inventory, id, possesed, true, false);
chr.getClient().write(ChannelPackets.getShowItemGain(id, (short) -possesed, true));
}
}
}
public final void useItem(final int id) {
ItemInfoProvider.getInstance().getItemEffect(id).applyTo(this.client.getPlayer());
this.client.write(UIPacket.getStatusMsg(id));
}
public final void cancelItem(final int id) {
this.client.getPlayer().cancelEffect(ItemInfoProvider.getInstance().getItemEffect(id), false, -1);
}
public final int getMorphState() {
return this.client.getPlayer().getMorphState();
}
public final void removeAll(final int id) {
final Inventory inventory = this.client.getPlayer().getInventoryForItem(id);
final int count = inventory.countById(id);
if (count > 0) {
InventoryManipulator.removeById(this.client, inventory, id, count, true, false);
this.client.write(ChannelPackets.getShowItemGain(id, (short) -count, true));
}
}
public final void gainCloseness(final int closeness, final int index) {
if (this.getPlayer().getPet(index) != null) {
this.getPlayer().getPet(index).setCloseness(this.getPlayer().getPet(index).getCloseness() + closeness);
this.getClient().write(PetPacket.updatePet(this.getPlayer().getPet(index), true));
}
}
public final void gainClosenessAll(final int closeness) {
for (final Pet pet : this.getPlayer().getPets()) {
if (pet != null) {
pet.setCloseness(pet.getCloseness() + closeness);
this.getClient().write(PetPacket.updatePet(pet, true));
}
}
}
public final void resetMap(final int mapid) {
final GameMap map = this.getMap(mapid);
map.resetReactors();
map.killAllMonsters(false);
for (final GameMapObject i : map.getAllItems()) {
map.removeMapObject(i);
}
}
public final void openNpc(final int id) {
NpcScriptManager.getInstance().start(this.getClient(), id);
}
public final int getMapId() {
return this.client.getPlayer().getMap().getId();
}
public final boolean haveMonster(final int mobid) {
for (final GameMapObject obj : this.client.getPlayer().getMap().getAllMonster()) {
final Monster mob = (Monster) obj;
if (mob.getId() == mobid) {
return true;
}
}
return false;
}
public final int getChannelNumber() {
return this.client.getChannelId();
}
public final int getMonsterCount(final int mapid) {
return ChannelServer.getMapFactory().getMap(mapid).getAllMonster().size();
}
public final void teachSkill(final int id, final byte level, final byte masterlevel) {
this.getPlayer().changeSkillLevel(SkillInfoProvider.getSkill(id), level, masterlevel);
}
public final int getPlayerCount(final int mapid) {
return ChannelServer.getMapFactory().getMap(mapid).getCharacterCount();
}
public final void dojo_getUp() {
this.client.write(ChannelPackets.Mulung_DojoUp());
this.client.write(ChannelPackets.Mulung_DojoUp2());
this.client.write(ChannelPackets.instantMapWarp((byte) 6));
}
public final boolean dojoAgent_NextMap(final boolean dojo, final boolean fromresting) {
if (dojo) {
return Event_DojoAgent.warpNextMap(this.client.getPlayer(), fromresting);
}
return Event_DojoAgent.warpNextMap_Agent(this.client.getPlayer(), fromresting);
}
public final int dojo_getPts() {
return this.client.getPlayer().getDojoPoints();
}
public final int getSavedLocation(final String loc) {
final Integer ret = this.client.getPlayer().getSavedLocation(SavedLocationType.fromString(loc));
if (ret == null || ret == -1) {
return 102000000;
}
return ret;
}
public final void saveLocation(final String loc) {
this.client.getPlayer().saveLocation(SavedLocationType.fromString(loc));
}
public final void clearSavedLocation(final String loc) {
this.client.getPlayer().clearSavedLocation(SavedLocationType.fromString(loc));
}
public final void summonMsg(final String msg) {
this.client.write(UIPacket.summonMessage(msg));
}
public final void summonMsg(final int type) {
this.client.write(UIPacket.summonMessage(type));
}
public final void showInstruction(final String msg, final int width, final int height) {
this.client.write(ChannelPackets.sendHint(msg, width, height));
}
public final void playerSummonHint(final boolean summon) {
this.client.write(UIPacket.summonHelper(summon));
}
public final void playerSummonMessage(final int type) {
this.client.write(UIPacket.summonMessage(type));
}
public final void playerSummonMessage(final String message) {
this.client.write(UIPacket.summonMessage(message));
}
public final String getInfoQuest(final int id) {
return this.client.getPlayer().getInfoQuest(id);
}
public final void updateInfoQuest(final int id, final String data) {
this.client.getPlayer().updateInfoQuest(id, data);
}
public final void Aran_Start() {
this.client.write(UIPacket.Aran_Start());
}
public final void AranTutInstructionalBubble(final String data) {
this.client.write(UIPacket.AranTutInstructionalBalloon(data));
}
public final void EvanTutInstructionalBubble(final String data) {
this.client.write(UIPacket.EvanTutInstructionalBalloon(data));
}
public final void EvanDragonEyes() {
this.client.write(UIPacket.EvanDragonEyes());
}
public final void ShowWZEffect(final String data) {
this.client.write(UIPacket.ShowWZEffect(data));
}
public final void EarnTitleMsg(final String data) {
this.client.write(UIPacket.EarnTitleMsg(data));
}
public final void MovieClipIntroUI(final boolean enabled) {
this.client.write(UIPacket.IntroDisableUI(enabled));
this.client.write(UIPacket.IntroLock(enabled));
}
}