package javastory.channel.server;
import java.awt.Point;
import javastory.channel.ChannelCharacter;
import javastory.channel.ChannelClient;
import javastory.channel.ChannelServer;
import javastory.channel.anticheat.CheatingOffense;
import javastory.channel.maps.GameMap;
import javastory.scripting.PortalScriptManager;
import javastory.tools.packets.ChannelPackets;
import javastory.wz.WzData;
import javastory.wz.WzDataTool;
public class PortalFactory {
private int nextDoorPortal = 0x80;
public Portal createPortal(final WzData data) {
GenericPortal portal = new GenericPortal(this.nextDoorPortal, data);
if (portal.getType() == Portal.DOOR_PORTAL) {
this.nextDoorPortal++;
}
return portal;
}
private class GenericPortal implements Portal {
private String name, target, scriptName;
private Point position;
private int targetmap;
private final int type;
private int id;
public GenericPortal(final int currentDoorId, final WzData data) {
this.type = WzDataTool.getInt("pt", data);
this.name = WzDataTool.getString("pn", data);
if (this.type == Portal.DOOR_PORTAL) {
this.id = currentDoorId;
} else {
this.id = Integer.parseInt(this.name);
}
this.target = WzDataTool.getString("tn", data);
this.targetmap = WzDataTool.getInt("tm", data);
this.position = WzDataTool.getPoint("x", "y", data);
String script = WzDataTool.getString("script", data, null);
if (script != null && script.equals("")) {
script = null;
}
this.scriptName = script;
}
@Override
public final int getId() {
return this.id;
}
@Override
public final String getName() {
return this.name;
}
@Override
public final Point getPosition() {
return this.position;
}
@Override
public final String getTarget() {
return this.target;
}
@Override
public final int getTargetMapId() {
return this.targetmap;
}
@Override
public final int getType() {
return this.type;
}
@Override
public final String getScriptName() {
return this.scriptName;
}
@Override
public final void enterPortal(final ChannelClient c) {
final ChannelCharacter player = c.getPlayer();
if (this.getPosition().distanceSq(player.getPosition()) > 22500) {
player.getCheatTracker().registerOffense(CheatingOffense.USING_FARAWAY_PORTAL);
}
if (this.getScriptName() != null) {
final GameMap currentmap = player.getMap();
try {
PortalScriptManager.getInstance().executePortalScript(this, c);
if (player.getMap() == currentmap) { // Character is still on
// the same map.
c.write(ChannelPackets.enableActions());
}
} catch (final Exception e) {
c.write(ChannelPackets.enableActions());
e.printStackTrace();
}
} else if (this.getTargetMapId() != 999999999) {
final GameMap to = ChannelServer.getMapFactory().getMap(this.getTargetMapId());
player.changeMap(to, to.getPortal(this.getTarget()) == null ? to.getPortal(0) : to.getPortal(this.getTarget()));
}
}
}
}