this is nothing great, still similar to pi's original system, just a little cleaner, posting for reviews on ways to improve it or for public use.
Code:
package server.game.content.travel;
import java.util.HashMap;
import java.util.Map;
public enum TeleportType {
ANCIENT(1979, 0, 392, 9),
//LUNAR,
//NORMAL,
//TAB,
//JEWELLERY,
//OBELISK,
NONE(-1, -1, -1, 0),
;
private int anim, endingAnim, gfx, timer;
public int getAnim() {
return anim;
}
public int getEndAnim() {
return endingAnim;
}
public int getGfx() {
return gfx;
}
public int getTimer() {
return timer;
}
private TeleportType(int anim, int endingAnim, int gfx, int timer) {
this.anim = anim;
this.endingAnim = endingAnim;
this.gfx = gfx;
this.timer = timer;
}
private static Map<Integer, TeleportType> teleType = new HashMap<Integer, TeleportType>();
static {
for (final TeleportType type : values()) {
teleType.put(type.ordinal(), type);
}
}
public static TeleportType forId(int id) {
return teleType.get(id);
}
}
Code:
package server.game.content.travel;
import server.event.CycleEvent;
import server.event.CycleEventContainer;
import server.event.CycleEventHandler;
import server.game.entity.Position;
import server.game.entity.players.Player;
import server.world.midi.Sound;
/**
* Handles the movement and teleporting of a player
* @author Final Project
*
*/
public class Teleport {
/**
* What the current teleport type will be
*/
private TeleportType teleportType;
/**
* Sets the teleport type being used
*/
private TeleportType setTeleType(TeleportType type) {
return teleportType = type;
}
/**
* The location of the movement/teleport
*/
private Position newPosition;
/**
* Sets the new location to move to
* @param newPos
* the location to move to
*/
private Position setPosition(Position newPos) {
return newPosition = newPos;
}
/**
* Constructor that begins the new teleport
* @param player
* the player being moved
* @param location
* the location to move the player to
* @param teleType
* the teleport type being used
* @param isForced
* is the movement forced
*/
public Teleport(Player player, Position location, TeleportType teleType, boolean isForced) {
setPosition(location);
setTeleType(teleType);
teleportAction(player, isForced);
}
/**
* The requirements to perform a teleport or movement
* @param teleporter
* the teleporter to check for requirements
* @return
* if the teleporter meets the requirements and can teleport
*/
private boolean canTeleport(Player teleporter) {
if (teleporter.inTrade) {
return false;
}
return true;
}
/**
* The beginning preparations of a movement or teleport
* @param teleporter
* the teleporter being moved or teleported
* @param force
* is the movement or teleport forced
*/
private void teleportAction(Player teleporter, boolean force) {
if (!force) {
if (!canTeleport(teleporter)) {
return;
}
}
if (teleportType != TeleportType.NONE) {
teleporter.getPacketSender().sendSound(Sound.TELEPORT);
}
TeleportType teleType = TeleportType.forId(teleportType.ordinal());
teleporter.startAnimation(teleType.getAnim());
teleporter.gfx0(teleType.getGfx());
teleporter.teleTimer = teleType.getTimer();
CycleEventHandler.getSingleton().addEvent(teleporter, new CycleEvent() {
@Override
public void execute(CycleEventContainer container) {
if (teleporter.teleTimer == 0) {
container.stop();
return;
}
if (teleporter.teleTimer > 0) {
teleporter.teleTimer--;
if (!teleporter.isDead) {
if (teleporter.teleTimer == 5) {
teleporter.teleTimer--;
finalizeTeleport(teleporter);
}
if (teleporter.teleTimer == 9 && teleporter.teleGfx > 0) {
teleporter.teleTimer--;
teleporter.gfx100(teleporter.teleGfx);
}
}
}
}
@Override
public void stop() {
if (teleportType == TeleportType.NONE) {
finalizeTeleport(teleporter);
}
teleporter.teleTimer = 0;
setTeleType(null);
}
}, 1);
teleporter.teleEndAnimation = teleType.getEndAnim();
}
/**
* Finishes the movement or teleport and moves the teleporter to the new location
* @param teleporter
* the teleporter
*/
private void finalizeTeleport(Player teleporter) {
teleporter.teleportToX = newPosition.getX();
teleporter.teleportToY = newPosition.getY();
teleporter.heightLevel = newPosition.getZ();
if (teleporter.teleEndAnimation > 0 && teleportType != TeleportType.NONE) {
teleporter.startAnimation(teleporter.teleEndAnimation);
}
}
}