mirror of
https://github.com/TotalFreedomMC/TF-EssentialsX.git
synced 2025-04-30 02:08:24 +00:00
Essentials API cleanup and teleport possession fixing. (UNSTABLE)
This commit is contained in:
parent
b8300cc35a
commit
f48ed6988d
13 changed files with 492 additions and 345 deletions
|
@ -1,6 +1,7 @@
|
||||||
package com.earth2me.essentials;
|
package com.earth2me.essentials;
|
||||||
|
|
||||||
import com.earth2me.essentials.api.IJails;
|
import com.earth2me.essentials.api.IJails;
|
||||||
|
import com.earth2me.essentials.api.IWarps;
|
||||||
import com.earth2me.essentials.metrics.Metrics;
|
import com.earth2me.essentials.metrics.Metrics;
|
||||||
import com.earth2me.essentials.perm.PermissionsHandler;
|
import com.earth2me.essentials.perm.PermissionsHandler;
|
||||||
import com.earth2me.essentials.register.payment.Methods;
|
import com.earth2me.essentials.register.payment.Methods;
|
||||||
|
@ -39,7 +40,7 @@ public interface IEssentials extends Plugin
|
||||||
|
|
||||||
IJails getJails();
|
IJails getJails();
|
||||||
|
|
||||||
Warps getWarps();
|
IWarps getWarps();
|
||||||
|
|
||||||
Worth getWorth();
|
Worth getWorth();
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.earth2me.essentials;
|
package com.earth2me.essentials;
|
||||||
|
|
||||||
|
import com.earth2me.essentials.api.ITeleport;
|
||||||
import com.earth2me.essentials.commands.IEssentialsCommand;
|
import com.earth2me.essentials.commands.IEssentialsCommand;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -41,32 +42,29 @@ public interface IUser extends Player
|
||||||
Location getHome(Location loc) throws Exception;
|
Location getHome(Location loc) throws Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 'Hidden' Represents when a player is hidden from others.
|
* 'Hidden' Represents when a player is hidden from others. This status includes when the player is hidden via other
|
||||||
* This status includes when the player is hidden via other supported plugins.
|
* supported plugins. Use isVanished() if you want to check if a user is vanished by Essentials.
|
||||||
* Use isVanished() if you want to check if a user is vanished by Essentials.
|
|
||||||
*
|
*
|
||||||
* @return If the user is hidden or not
|
* @return If the user is hidden or not
|
||||||
* @see isVanished
|
* @see isVanished
|
||||||
*/
|
*/
|
||||||
|
|
||||||
boolean isHidden();
|
boolean isHidden();
|
||||||
|
|
||||||
void setHidden(boolean vanish);
|
void setHidden(boolean vanish);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 'Vanished' Represents when a player is hidden from others by Essentials.
|
* 'Vanished' Represents when a player is hidden from others by Essentials. This status does NOT include when the
|
||||||
* This status does NOT include when the player is hidden via other plugins.
|
* player is hidden via other plugins. Use isHidden() if you want to check if a user is vanished by any supported
|
||||||
* Use isHidden() if you want to check if a user is vanished by any supported plugin.
|
* plugin.
|
||||||
*
|
*
|
||||||
* @return If the user is vanished or not
|
* @return If the user is vanished or not
|
||||||
* @see isHidden
|
* @see isHidden
|
||||||
*/
|
*/
|
||||||
|
|
||||||
boolean isVanished();
|
boolean isVanished();
|
||||||
|
|
||||||
void setVanished(boolean vanish);
|
void setVanished(boolean vanish);
|
||||||
|
|
||||||
Teleport getTeleport();
|
ITeleport getTeleport();
|
||||||
|
|
||||||
void setJail(String jail);
|
void setJail(String jail);
|
||||||
|
|
||||||
|
|
|
@ -10,12 +10,9 @@ import org.bukkit.event.player.PlayerRespawnEvent;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
||||||
|
|
||||||
|
|
||||||
public class Teleport implements Runnable, ITeleport
|
public class Teleport implements ITeleport
|
||||||
{
|
{
|
||||||
private static final double MOVE_CONSTANT = 0.3;
|
public class Target
|
||||||
|
|
||||||
|
|
||||||
private class Target
|
|
||||||
{
|
{
|
||||||
private final Location location;
|
private final Location location;
|
||||||
private final String name;
|
private final String name;
|
||||||
|
@ -42,155 +39,40 @@ public class Teleport implements Runnable, ITeleport
|
||||||
return location;
|
return location;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private final IUser user;
|
private final IUser teleportOwner;
|
||||||
private String teleportUserName;
|
|
||||||
private int teleTimer = -1;
|
|
||||||
private long started; // time this task was initiated
|
|
||||||
private long tpdelay; // how long to delay the teleport
|
|
||||||
private int health;
|
|
||||||
// note that I initially stored a clone of the location for reference, but...
|
|
||||||
// when comparing locations, I got incorrect mismatches (rounding errors, looked like)
|
|
||||||
// so, the X/Y/Z values are stored instead and rounded off
|
|
||||||
private long initX;
|
|
||||||
private long initY;
|
|
||||||
private long initZ;
|
|
||||||
private Target teleportTarget;
|
|
||||||
private boolean respawn;
|
|
||||||
private boolean canMove;
|
|
||||||
private Trade chargeFor;
|
|
||||||
private final IEssentials ess;
|
private final IEssentials ess;
|
||||||
private TeleportCause cause;
|
private TimedTeleport timedTeleport;
|
||||||
|
|
||||||
private void initTimer(long delay, Target target, Trade chargeFor, TeleportCause cause)
|
|
||||||
{
|
|
||||||
initTimer(delay, user, target, chargeFor, cause, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initTimer(long delay, IUser teleportUser, Target target, Trade chargeFor, TeleportCause cause, boolean respawn)
|
|
||||||
{
|
|
||||||
this.started = System.currentTimeMillis();
|
|
||||||
this.tpdelay = delay;
|
|
||||||
this.health = teleportUser.getHealth();
|
|
||||||
this.initX = Math.round(teleportUser.getLocation().getX() * MOVE_CONSTANT);
|
|
||||||
this.initY = Math.round(teleportUser.getLocation().getY() * MOVE_CONSTANT);
|
|
||||||
this.initZ = Math.round(teleportUser.getLocation().getZ() * MOVE_CONSTANT);
|
|
||||||
this.teleportUserName = teleportUser.getName();
|
|
||||||
this.teleportTarget = target;
|
|
||||||
this.chargeFor = chargeFor;
|
|
||||||
this.cause = cause;
|
|
||||||
this.respawn = respawn;
|
|
||||||
|
|
||||||
this.canMove = user.isAuthorized("essentials.teleport.timer.move");
|
|
||||||
|
|
||||||
teleTimer = ess.scheduleSyncRepeatingTask(this, 20, 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
|
|
||||||
if (user == null || !user.isOnline() || user.getLocation() == null)
|
|
||||||
{
|
|
||||||
cancel(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
IUser teleportUser = ess.getUser(this.teleportUserName);
|
|
||||||
|
|
||||||
if (teleportUser == null || !teleportUser.isOnline())
|
|
||||||
{
|
|
||||||
cancel(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Location currLocation = teleportUser.getLocation();
|
|
||||||
if (currLocation == null)
|
|
||||||
{
|
|
||||||
cancel(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!canMove
|
|
||||||
&& (Math.round(currLocation.getX() * MOVE_CONSTANT) != initX
|
|
||||||
|| Math.round(currLocation.getY() * MOVE_CONSTANT) != initY
|
|
||||||
|| Math.round(currLocation.getZ() * MOVE_CONSTANT) != initZ
|
|
||||||
|| teleportUser.getHealth() < health))
|
|
||||||
{
|
|
||||||
// user moved, cancel teleport
|
|
||||||
cancel(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
health = teleportUser.getHealth(); // in case user healed, then later gets injured
|
|
||||||
final long now = System.currentTimeMillis();
|
|
||||||
if (now > started + tpdelay)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
cooldown(false);
|
|
||||||
teleportUser.sendMessage(_("teleportationCommencing"));
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (respawn)
|
|
||||||
{
|
|
||||||
teleportUser.getTeleport().respawn(cause);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
teleportUser.getTeleport().now(teleportTarget, cause);
|
|
||||||
}
|
|
||||||
cancel(false);
|
|
||||||
if (chargeFor != null)
|
|
||||||
{
|
|
||||||
chargeFor.charge(user);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Throwable ex)
|
|
||||||
{
|
|
||||||
ess.showError(user.getBase(), ex, "teleport");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
user.sendMessage(_("cooldownWithMessage", ex.getMessage()));
|
|
||||||
if (user != teleportUser)
|
|
||||||
{
|
|
||||||
teleportUser.sendMessage(_("cooldownWithMessage", ex.getMessage()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Teleport(IUser user, IEssentials ess)
|
public Teleport(IUser user, IEssentials ess)
|
||||||
{
|
{
|
||||||
this.user = user;
|
this.teleportOwner = user;
|
||||||
this.ess = ess;
|
this.ess = ess;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cooldown(boolean check) throws Exception
|
public void cooldown(boolean check) throws Exception
|
||||||
{
|
{
|
||||||
final Calendar time = new GregorianCalendar();
|
final Calendar time = new GregorianCalendar();
|
||||||
if (user.getLastTeleportTimestamp() > 0)
|
if (teleportOwner.getLastTeleportTimestamp() > 0)
|
||||||
{
|
{
|
||||||
// Take the current time, and remove the delay from it.
|
// Take the current time, and remove the delay from it.
|
||||||
final double cooldown = ess.getSettings().getTeleportCooldown();
|
final double cooldown = ess.getSettings().getTeleportCooldown();
|
||||||
final Calendar earliestTime = new GregorianCalendar();
|
final Calendar earliestTime = new GregorianCalendar();
|
||||||
earliestTime.add(Calendar.SECOND, -(int)cooldown);
|
earliestTime.add(Calendar.SECOND, -(int)cooldown);
|
||||||
earliestTime.add(Calendar.MILLISECOND, -(int)((cooldown * 1000.0) % 1000.0));
|
earliestTime.add(Calendar.MILLISECOND, -(int)((cooldown * 1000.0) % 1000.0));
|
||||||
// This value contains the most recent time a teleport could have been used that would allow another use.
|
// This value contains the most recent time a teleportPlayer could have been used that would allow another use.
|
||||||
final long earliestLong = earliestTime.getTimeInMillis();
|
final long earliestLong = earliestTime.getTimeInMillis();
|
||||||
|
|
||||||
// When was the last teleport used?
|
// When was the last teleportPlayer used?
|
||||||
final Long lastTime = user.getLastTeleportTimestamp();
|
final Long lastTime = teleportOwner.getLastTeleportTimestamp();
|
||||||
|
|
||||||
if (lastTime > time.getTimeInMillis())
|
if (lastTime > time.getTimeInMillis())
|
||||||
{
|
{
|
||||||
// This is to make sure time didn't get messed up on last kit use.
|
// This is to make sure time didn't get messed up on last teleportPlayer use.
|
||||||
// If this happens, let's give the user the benifit of the doubt.
|
// If this happens, let's give the user the benifit of the doubt.
|
||||||
user.setLastTeleportTimestamp(time.getTimeInMillis());
|
teleportOwner.setLastTeleportTimestamp(time.getTimeInMillis());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (lastTime > earliestLong && !user.isAuthorized("essentials.teleport.cooldown.bypass"))
|
else if (lastTime > earliestLong && !teleportOwner.isAuthorized("essentials.teleport.cooldown.bypass"))
|
||||||
{
|
{
|
||||||
time.setTimeInMillis(lastTime);
|
time.setTimeInMillis(lastTime);
|
||||||
time.add(Calendar.SECOND, (int)cooldown);
|
time.add(Calendar.SECOND, (int)cooldown);
|
||||||
|
@ -201,132 +83,10 @@ public class Teleport implements Runnable, ITeleport
|
||||||
// if justCheck is set, don't update lastTeleport; we're just checking
|
// if justCheck is set, don't update lastTeleport; we're just checking
|
||||||
if (!check)
|
if (!check)
|
||||||
{
|
{
|
||||||
user.setLastTeleportTimestamp(time.getTimeInMillis());
|
teleportOwner.setLastTeleportTimestamp(time.getTimeInMillis());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//If we need to cancel a pending teleport call this method
|
|
||||||
public void cancel(boolean notifyUser)
|
|
||||||
{
|
|
||||||
if (teleTimer == -1)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ess.getServer().getScheduler().cancelTask(teleTimer);
|
|
||||||
if (notifyUser)
|
|
||||||
{
|
|
||||||
user.sendMessage(_("pendingTeleportCancelled"));
|
|
||||||
if (teleportUserName != null && !teleportUserName.equals(user.getName()))
|
|
||||||
{
|
|
||||||
ess.getUser(teleportUserName).sendMessage(_("pendingTeleportCancelled"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
teleTimer = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//The now function is used when you want to skip tp delay when teleporting someone to a location or player.
|
|
||||||
@Override
|
|
||||||
public void now(Location loc, boolean cooldown, TeleportCause cause) throws Exception
|
|
||||||
{
|
|
||||||
if (cooldown)
|
|
||||||
{
|
|
||||||
cooldown(false);
|
|
||||||
}
|
|
||||||
now(new Target(loc), cause);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void now(Player entity, boolean cooldown, TeleportCause cause) throws Exception
|
|
||||||
{
|
|
||||||
if (cooldown)
|
|
||||||
{
|
|
||||||
cooldown(false);
|
|
||||||
}
|
|
||||||
now(new Target(entity), cause);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void now(Target target, TeleportCause cause) throws Exception
|
|
||||||
{
|
|
||||||
cancel(false);
|
|
||||||
user.setLastLocation();
|
|
||||||
user.getBase().teleport(Util.getSafeDestination(target.getLocation()), cause);
|
|
||||||
}
|
|
||||||
|
|
||||||
//The teleport function is used when you want to normally teleport someone to a location or player.
|
|
||||||
//This method is nolonger used internally and will be removed.
|
|
||||||
@Deprecated
|
|
||||||
public void teleport(Location loc, Trade chargeFor) throws Exception
|
|
||||||
{
|
|
||||||
teleport(loc, chargeFor, TeleportCause.PLUGIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void teleport(Location loc, Trade chargeFor, TeleportCause cause) throws Exception
|
|
||||||
{
|
|
||||||
teleport(new Target(loc), chargeFor, cause);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void teleport(Player entity, Trade chargeFor, TeleportCause cause) throws Exception
|
|
||||||
{
|
|
||||||
teleport(new Target(entity), chargeFor, cause);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void teleport(Target target, Trade chargeFor, TeleportCause cause) throws Exception
|
|
||||||
{
|
|
||||||
double delay = ess.getSettings().getTeleportDelay();
|
|
||||||
|
|
||||||
if (chargeFor != null)
|
|
||||||
{
|
|
||||||
chargeFor.isAffordableFor(user);
|
|
||||||
}
|
|
||||||
cooldown(true);
|
|
||||||
if (delay <= 0 || user.isAuthorized("essentials.teleport.timer.bypass"))
|
|
||||||
{
|
|
||||||
cooldown(false);
|
|
||||||
now(target, cause);
|
|
||||||
if (chargeFor != null)
|
|
||||||
{
|
|
||||||
chargeFor.charge(user);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
cancel(false);
|
|
||||||
warnUser(user, delay);
|
|
||||||
initTimer((long)(delay * 1000.0), target, chargeFor, cause);
|
|
||||||
}
|
|
||||||
|
|
||||||
//The teleportToMe function is a wrapper used to handle teleporting players to them, like /tphere
|
|
||||||
public void teleportToMe(User otherUser, Trade chargeFor, TeleportCause cause) throws Exception
|
|
||||||
{
|
|
||||||
Target target = new Target(user);
|
|
||||||
double delay = ess.getSettings().getTeleportDelay();
|
|
||||||
|
|
||||||
if (chargeFor != null)
|
|
||||||
{
|
|
||||||
chargeFor.isAffordableFor(user);
|
|
||||||
}
|
|
||||||
cooldown(true);
|
|
||||||
if (delay <= 0 || user.isAuthorized("essentials.teleport.timer.bypass"))
|
|
||||||
{
|
|
||||||
cooldown(false);
|
|
||||||
otherUser.getTeleport().now(target, cause);
|
|
||||||
if (chargeFor != null)
|
|
||||||
{
|
|
||||||
chargeFor.charge(user);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
cancel(false);
|
|
||||||
warnUser(otherUser, delay);
|
|
||||||
initTimer((long)(delay * 1000.0), otherUser, target, chargeFor, cause, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void warnUser(final IUser user, final double delay)
|
private void warnUser(final IUser user, final double delay)
|
||||||
{
|
{
|
||||||
Calendar c = new GregorianCalendar();
|
Calendar c = new GregorianCalendar();
|
||||||
|
@ -335,38 +95,133 @@ public class Teleport implements Runnable, ITeleport
|
||||||
user.sendMessage(_("dontMoveMessage", Util.formatDateDiff(c.getTimeInMillis())));
|
user.sendMessage(_("dontMoveMessage", Util.formatDateDiff(c.getTimeInMillis())));
|
||||||
}
|
}
|
||||||
|
|
||||||
//The respawn function is a wrapper used to handle tp fallback, on /jail and /home
|
//The now function is used when you want to skip tp delay when teleporting someone to a location or player.
|
||||||
public void respawn(final Trade chargeFor, TeleportCause cause) throws Exception
|
@Override
|
||||||
|
public void now(Location loc, boolean cooldown, TeleportCause cause) throws Exception
|
||||||
{
|
{
|
||||||
double delay = ess.getSettings().getTeleportDelay();
|
if (cooldown)
|
||||||
if (chargeFor != null)
|
|
||||||
{
|
|
||||||
chargeFor.isAffordableFor(user);
|
|
||||||
}
|
|
||||||
cooldown(true);
|
|
||||||
if (delay <= 0 || user.isAuthorized("essentials.teleport.timer.bypass"))
|
|
||||||
{
|
{
|
||||||
cooldown(false);
|
cooldown(false);
|
||||||
respawn(cause);
|
}
|
||||||
|
now(teleportOwner, new Target(loc), cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void now(Player entity, boolean cooldown, TeleportCause cause) throws Exception
|
||||||
|
{
|
||||||
|
if (cooldown)
|
||||||
|
{
|
||||||
|
cooldown(false);
|
||||||
|
}
|
||||||
|
now(teleportOwner, new Target(entity), cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void now(IUser teleportee, Target target, TeleportCause cause) throws Exception
|
||||||
|
{
|
||||||
|
cancel(false);
|
||||||
|
teleportee.setLastLocation();
|
||||||
|
teleportee.getBase().teleport(Util.getSafeDestination(target.getLocation()), cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
//The teleportPlayer function is used when you want to normally teleportPlayer someone to a location or player.
|
||||||
|
//This method is nolonger used internally and will be removed.
|
||||||
|
@Deprecated
|
||||||
|
public void teleport(Location loc, Trade chargeFor) throws Exception
|
||||||
|
{
|
||||||
|
teleport(loc, chargeFor, TeleportCause.PLUGIN);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void teleport(Location loc, Trade chargeFor, TeleportCause cause) throws Exception
|
||||||
|
{
|
||||||
|
teleport(teleportOwner, new Target(loc), chargeFor, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void teleport(Player entity, Trade chargeFor, TeleportCause cause) throws Exception
|
||||||
|
{
|
||||||
|
teleport(teleportOwner, new Target(entity), chargeFor, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void teleportPlayer(IUser teleportee, Location loc, Trade chargeFor, TeleportCause cause) throws Exception
|
||||||
|
{
|
||||||
|
teleport(teleportee, new Target(loc), chargeFor, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void teleportPlayer(IUser teleportee, Player entity, Trade chargeFor, TeleportCause cause) throws Exception
|
||||||
|
{
|
||||||
|
teleport(teleportee, new Target(entity), chargeFor, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void teleport(IUser teleportee, Target target, Trade chargeFor, TeleportCause cause) throws Exception
|
||||||
|
{
|
||||||
|
double delay = ess.getSettings().getTeleportDelay();
|
||||||
|
|
||||||
if (chargeFor != null)
|
if (chargeFor != null)
|
||||||
{
|
{
|
||||||
chargeFor.charge(user);
|
chargeFor.isAffordableFor(teleportOwner);
|
||||||
|
}
|
||||||
|
cooldown(true);
|
||||||
|
if (delay <= 0 || teleportOwner.isAuthorized("essentials.teleport.timer.bypass")
|
||||||
|
|| teleportee.isAuthorized("essentials.teleport.timer.bypass"))
|
||||||
|
{
|
||||||
|
cooldown(false);
|
||||||
|
now(teleportee, target, cause);
|
||||||
|
if (chargeFor != null)
|
||||||
|
{
|
||||||
|
chargeFor.charge(teleportOwner);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
cancel(false);
|
cancel(false);
|
||||||
warnUser(user, delay);
|
warnUser(teleportee, delay);
|
||||||
initTimer((long)(delay * 1000.0), user, null, chargeFor, cause, true);
|
initTimer((long)(delay * 1000.0), teleportee, target, chargeFor, cause, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void respawn(TeleportCause cause) throws Exception
|
//The teleportToMe function is a wrapper used to handle teleporting players to them, like /tphere
|
||||||
|
@Override
|
||||||
|
public void teleportToMe(IUser otherUser, Trade chargeFor, TeleportCause cause) throws Exception
|
||||||
{
|
{
|
||||||
final Player player = user.getBase();
|
Target target = new Target(teleportOwner);
|
||||||
|
teleport(otherUser, target, chargeFor, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
//The respawn function is a wrapper used to handle tp fallback, on /jail and /home
|
||||||
|
@Override
|
||||||
|
public void respawn(final Trade chargeFor, TeleportCause cause) throws Exception
|
||||||
|
{
|
||||||
|
double delay = ess.getSettings().getTeleportDelay();
|
||||||
|
if (chargeFor != null)
|
||||||
|
{
|
||||||
|
chargeFor.isAffordableFor(teleportOwner);
|
||||||
|
}
|
||||||
|
cooldown(true);
|
||||||
|
if (delay <= 0 || teleportOwner.isAuthorized("essentials.teleport.timer.bypass"))
|
||||||
|
{
|
||||||
|
cooldown(false);
|
||||||
|
respawnNow(teleportOwner, cause);
|
||||||
|
if (chargeFor != null)
|
||||||
|
{
|
||||||
|
chargeFor.charge(teleportOwner);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cancel(false);
|
||||||
|
warnUser(teleportOwner, delay);
|
||||||
|
initTimer((long)(delay * 1000.0), teleportOwner, null, chargeFor, cause, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void respawnNow(IUser teleportee, TeleportCause cause) throws Exception
|
||||||
|
{
|
||||||
|
final Player player = teleportee.getBase();
|
||||||
Location bed = player.getBedSpawnLocation();
|
Location bed = player.getBedSpawnLocation();
|
||||||
if (bed != null)
|
if (bed != null)
|
||||||
{
|
{
|
||||||
now(new Target(bed), cause);
|
now(teleportee, new Target(bed), cause);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -376,33 +231,52 @@ public class Teleport implements Runnable, ITeleport
|
||||||
}
|
}
|
||||||
final PlayerRespawnEvent pre = new PlayerRespawnEvent(player, player.getWorld().getSpawnLocation(), false);
|
final PlayerRespawnEvent pre = new PlayerRespawnEvent(player, player.getWorld().getSpawnLocation(), false);
|
||||||
ess.getServer().getPluginManager().callEvent(pre);
|
ess.getServer().getPluginManager().callEvent(pre);
|
||||||
now(new Target(pre.getRespawnLocation()), cause);
|
now(teleportee, new Target(pre.getRespawnLocation()), cause);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//The warp function is a wrapper used to teleport a player to a /warp
|
//The warp function is a wrapper used to teleportPlayer a player to a /warp
|
||||||
public void warp(String warp, Trade chargeFor, TeleportCause cause) throws Exception
|
@Override
|
||||||
|
public void warp(IUser teleportee, String warp, Trade chargeFor, TeleportCause cause) throws Exception
|
||||||
{
|
{
|
||||||
Location loc = ess.getWarps().getWarp(warp);
|
Location loc = ess.getWarps().getWarp(warp);
|
||||||
user.sendMessage(_("warpingTo", warp));
|
teleportee.sendMessage(_("warpingTo", warp));
|
||||||
teleport(new Target(loc), chargeFor, cause);
|
teleport(teleportee, new Target(loc), chargeFor, cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
//The back function is a wrapper used to teleport a player /back to their previous location.
|
//The back function is a wrapper used to teleportPlayer a player /back to their previous location.
|
||||||
|
@Override
|
||||||
public void back(Trade chargeFor) throws Exception
|
public void back(Trade chargeFor) throws Exception
|
||||||
{
|
{
|
||||||
teleport(new Target(user.getLastLocation()), chargeFor, TeleportCause.COMMAND);
|
teleport(teleportOwner, new Target(teleportOwner.getLastLocation()), chargeFor, TeleportCause.COMMAND);
|
||||||
}
|
}
|
||||||
|
|
||||||
//This function is used to throw a user back after a jail sentence
|
//This function is used to throw a user back after a jail sentence
|
||||||
|
@Override
|
||||||
public void back() throws Exception
|
public void back() throws Exception
|
||||||
{
|
{
|
||||||
now(new Target(user.getLastLocation()), TeleportCause.COMMAND);
|
now(teleportOwner, new Target(teleportOwner.getLastLocation()), TeleportCause.COMMAND);
|
||||||
}
|
}
|
||||||
|
|
||||||
//This function handles teleporting to /home
|
//This function handles teleporting to /home
|
||||||
|
@Override
|
||||||
public void home(Location loc, Trade chargeFor) throws Exception
|
public void home(Location loc, Trade chargeFor) throws Exception
|
||||||
{
|
{
|
||||||
teleport(new Target(loc), chargeFor, TeleportCause.COMMAND);
|
teleport(teleportOwner, new Target(loc), chargeFor, TeleportCause.COMMAND);
|
||||||
|
}
|
||||||
|
|
||||||
|
//If we need to cancelTimer a pending teleportPlayer call this method
|
||||||
|
private void cancel(boolean notifyUser)
|
||||||
|
{
|
||||||
|
if (timedTeleport != null)
|
||||||
|
{
|
||||||
|
timedTeleport.cancelTimer(notifyUser);
|
||||||
|
timedTeleport = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initTimer(long delay, IUser teleportUser, Target target, Trade chargeFor, TeleportCause cause, boolean respawn)
|
||||||
|
{
|
||||||
|
timedTeleport = new TimedTeleport(teleportOwner, ess, this, delay, teleportUser, target, chargeFor, cause, respawn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
155
Essentials/src/com/earth2me/essentials/TimedTeleport.java
Normal file
155
Essentials/src/com/earth2me/essentials/TimedTeleport.java
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
package com.earth2me.essentials;
|
||||||
|
|
||||||
|
import static com.earth2me.essentials.I18n._;
|
||||||
|
import com.earth2me.essentials.Teleport.Target;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
||||||
|
|
||||||
|
|
||||||
|
public class TimedTeleport implements Runnable
|
||||||
|
{
|
||||||
|
private static final double MOVE_CONSTANT = 0.3;
|
||||||
|
private final IUser teleportOwner;
|
||||||
|
private final IEssentials ess;
|
||||||
|
private final Teleport teleport;
|
||||||
|
private String timer_teleportee;
|
||||||
|
private int timer_task = -1;
|
||||||
|
private long timer_started; // time this task was initiated
|
||||||
|
private long timer_delay; // how long to delay the teleportPlayer
|
||||||
|
private int timer_health;
|
||||||
|
// note that I initially stored a clone of the location for reference, but...
|
||||||
|
// when comparing locations, I got incorrect mismatches (rounding errors, looked like)
|
||||||
|
// so, the X/Y/Z values are stored instead and rounded off
|
||||||
|
private long timer_initX;
|
||||||
|
private long timer_initY;
|
||||||
|
private long timer_initZ;
|
||||||
|
private Target timer_teleportTarget;
|
||||||
|
private boolean timer_respawn;
|
||||||
|
private boolean timer_canMove;
|
||||||
|
private Trade timer_chargeFor;
|
||||||
|
|
||||||
|
private TeleportCause timer_cause;
|
||||||
|
|
||||||
|
public TimedTeleport(IUser user, IEssentials ess, Teleport teleport, long delay, IUser teleportUser, Target target, Trade chargeFor, TeleportCause cause, boolean respawn)
|
||||||
|
{
|
||||||
|
|
||||||
|
this.teleportOwner = user;
|
||||||
|
this.ess = ess;
|
||||||
|
this.teleport = teleport;
|
||||||
|
this.timer_started = System.currentTimeMillis();
|
||||||
|
this.timer_delay = delay;
|
||||||
|
this.timer_health = teleportUser.getHealth();
|
||||||
|
this.timer_initX = Math.round(teleportUser.getLocation().getX() * MOVE_CONSTANT);
|
||||||
|
this.timer_initY = Math.round(teleportUser.getLocation().getY() * MOVE_CONSTANT);
|
||||||
|
this.timer_initZ = Math.round(teleportUser.getLocation().getZ() * MOVE_CONSTANT);
|
||||||
|
this.timer_teleportee = teleportUser.getName();
|
||||||
|
this.timer_teleportTarget = target;
|
||||||
|
this.timer_chargeFor = chargeFor;
|
||||||
|
this.timer_cause = cause;
|
||||||
|
this.timer_respawn = respawn;
|
||||||
|
this.timer_canMove = user.isAuthorized("essentials.teleport.timer.move");
|
||||||
|
|
||||||
|
timer_task = ess.scheduleSyncRepeatingTask(this, 20, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (teleportOwner == null || !teleportOwner.isOnline() || teleportOwner.getLocation() == null)
|
||||||
|
{
|
||||||
|
cancelTimer(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IUser teleportUser = ess.getUser(this.timer_teleportee);
|
||||||
|
|
||||||
|
if (teleportUser == null || !teleportUser.isOnline())
|
||||||
|
{
|
||||||
|
cancelTimer(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Location currLocation = teleportUser.getLocation();
|
||||||
|
if (currLocation == null)
|
||||||
|
{
|
||||||
|
cancelTimer(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!timer_canMove
|
||||||
|
&& (Math.round(currLocation.getX() * MOVE_CONSTANT) != timer_initX
|
||||||
|
|| Math.round(currLocation.getY() * MOVE_CONSTANT) != timer_initY
|
||||||
|
|| Math.round(currLocation.getZ() * MOVE_CONSTANT) != timer_initZ
|
||||||
|
|| teleportUser.getHealth() < timer_health))
|
||||||
|
{
|
||||||
|
// user moved, cancelTimer teleportPlayer
|
||||||
|
cancelTimer(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
timer_health = teleportUser.getHealth(); // in case user healed, then later gets injured
|
||||||
|
final long now = System.currentTimeMillis();
|
||||||
|
if (now > timer_started + timer_delay)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
teleport.cooldown(false);
|
||||||
|
teleportUser.sendMessage(_("teleportationCommencing"));
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (timer_respawn)
|
||||||
|
{
|
||||||
|
teleport.respawnNow(teleportUser, timer_cause);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
teleport.now(teleportUser, timer_teleportTarget, timer_cause);
|
||||||
|
}
|
||||||
|
cancelTimer(false);
|
||||||
|
if (timer_chargeFor != null)
|
||||||
|
{
|
||||||
|
timer_chargeFor.charge(teleportOwner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Throwable ex)
|
||||||
|
{
|
||||||
|
ess.showError(teleportOwner.getBase(), ex, "teleport");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
teleportOwner.sendMessage(_("cooldownWithMessage", ex.getMessage()));
|
||||||
|
if (teleportOwner != teleportUser)
|
||||||
|
{
|
||||||
|
teleportUser.sendMessage(_("cooldownWithMessage", ex.getMessage()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//If we need to cancelTimer a pending teleportPlayer call this method
|
||||||
|
public void cancelTimer(boolean notifyUser)
|
||||||
|
{
|
||||||
|
if (timer_task == -1)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ess.getServer().getScheduler().cancelTask(timer_task);
|
||||||
|
if (notifyUser)
|
||||||
|
{
|
||||||
|
teleportOwner.sendMessage(_("pendingTeleportCancelled"));
|
||||||
|
if (timer_teleportee != null && !timer_teleportee.equals(teleportOwner.getName()))
|
||||||
|
{
|
||||||
|
ess.getUser(timer_teleportee).sendMessage(_("pendingTeleportCancelled"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
timer_task = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -38,7 +38,8 @@ public class Warps implements IConf, IWarps
|
||||||
return warpPoints.isEmpty();
|
return warpPoints.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<String> getWarpNames()
|
@Override
|
||||||
|
public Collection<String> getList()
|
||||||
{
|
{
|
||||||
final List<String> keys = new ArrayList<String>();
|
final List<String> keys = new ArrayList<String>();
|
||||||
for (StringIgnoreCase stringIgnoreCase : warpPoints.keySet())
|
for (StringIgnoreCase stringIgnoreCase : warpPoints.keySet())
|
||||||
|
@ -87,7 +88,8 @@ public class Warps implements IConf, IWarps
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void delWarp(String name) throws Exception
|
@Override
|
||||||
|
public void removeWarp(String name) throws Exception
|
||||||
{
|
{
|
||||||
EssentialsConf conf = warpPoints.get(new StringIgnoreCase(name));
|
EssentialsConf conf = warpPoints.get(new StringIgnoreCase(name));
|
||||||
if (conf == null)
|
if (conf == null)
|
||||||
|
@ -132,20 +134,6 @@ public class Warps implements IConf, IWarps
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is for api support, and so 3.x will not break this api
|
|
||||||
@Override
|
|
||||||
public Collection<String> getList()
|
|
||||||
{
|
|
||||||
return getWarpNames();
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is for api support, and so 3.x will not break this api
|
|
||||||
@Override
|
|
||||||
public void removeWarp(String name) throws Exception
|
|
||||||
{
|
|
||||||
delWarp(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
//This is here for future 3.x api support. Not implemented here becasue storage is handled differently
|
//This is here for future 3.x api support. Not implemented here becasue storage is handled differently
|
||||||
@Override
|
@Override
|
||||||
public File getWarpFile(String name) throws InvalidNameException
|
public File getWarpFile(String name) throws InvalidNameException
|
||||||
|
@ -153,6 +141,12 @@ public class Warps implements IConf, IWarps
|
||||||
throw new UnsupportedOperationException("Not supported yet.");
|
throw new UnsupportedOperationException("Not supported yet.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getCount()
|
||||||
|
{
|
||||||
|
return getList().size();
|
||||||
|
}
|
||||||
|
|
||||||
private static class StringIgnoreCase
|
private static class StringIgnoreCase
|
||||||
{
|
{
|
||||||
private final String string;
|
private final String string;
|
||||||
|
|
|
@ -1,17 +1,128 @@
|
||||||
package com.earth2me.essentials.api;
|
package com.earth2me.essentials.api;
|
||||||
|
|
||||||
|
import com.earth2me.essentials.IUser;
|
||||||
|
import com.earth2me.essentials.Teleport.Target;
|
||||||
|
import com.earth2me.essentials.Trade;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
||||||
|
|
||||||
|
|
||||||
public interface ITeleport
|
public interface ITeleport
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Used to skip teleport delay when teleporting someone to a location or player.
|
* Used to skip teleportPlayer delay when teleporting someone to a location or player.
|
||||||
* @param loc
|
*
|
||||||
* @param cooldown
|
* @param loc - Where should the player end up
|
||||||
* @param cause
|
* @param cooldown - If cooldown should be enforced
|
||||||
|
* @param cause - The reported teleportPlayer cause
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
void now(Location loc, boolean cooldown, TeleportCause cause) throws Exception;
|
void now(Location loc, boolean cooldown, TeleportCause cause) throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to skip teleportPlayer delay when teleporting someone to a location or player.
|
||||||
|
*
|
||||||
|
* @param entity - Where should the player end up
|
||||||
|
* @param cooldown - If cooldown should be enforced
|
||||||
|
* @param cause - The reported teleportPlayer cause
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
void now(Player entity, boolean cooldown, TeleportCause cause) throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Teleport a player to a specific location
|
||||||
|
*
|
||||||
|
* @param loc - Where should the player end up
|
||||||
|
* @param chargeFor - What the user will be charged if teleportPlayer is successful
|
||||||
|
* @param cause - The reported teleportPlayer cause
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
void teleport(Location loc, Trade chargeFor, TeleportCause cause) throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Teleport a player to a specific player
|
||||||
|
*
|
||||||
|
* @param entity - Where should the player end up
|
||||||
|
* @param chargeFor - What the user will be charged if teleportPlayer is successful
|
||||||
|
* @param cause - The reported teleportPlayer cause
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
void teleport(Player entity, Trade chargeFor, TeleportCause cause) throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Teleport a player to a specific location
|
||||||
|
*
|
||||||
|
* @param otherUser - Which user will be teleported
|
||||||
|
* @param loc - Where should the player end up
|
||||||
|
* @param chargeFor - What the user will be charged if teleportPlayer is successful
|
||||||
|
* @param cause - The reported teleportPlayer cause
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
void teleportPlayer(IUser otherUser, Location loc, Trade chargeFor, TeleportCause cause) throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Teleport a player to a specific player
|
||||||
|
*
|
||||||
|
* @param otherUser - Which user will be teleported
|
||||||
|
* @param entity - Where should the player end up
|
||||||
|
* @param chargeFor - What the user will be charged if teleportPlayer is successful
|
||||||
|
* @param cause - The reported teleportPlayer cause
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
void teleportPlayer(IUser otherUser, Player entity, Trade chargeFor, TeleportCause cause) throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Teleport wrapper used to handle teleporting players to them, like /tphere
|
||||||
|
*
|
||||||
|
* @param otherUser - Which user will be teleported
|
||||||
|
* @param chargeFor - What the user will be charged if teleportPlayer is successful
|
||||||
|
* @param cause - The reported teleportPlayer cause
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void teleportToMe(IUser otherUser, Trade chargeFor, TeleportCause cause) throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Teleport wrapper used to handle tp fallback on /jail and /home
|
||||||
|
*
|
||||||
|
* @param chargeFor - What the user will be charged if teleportPlayer is successful
|
||||||
|
* @param cause - The reported teleportPlayer cause
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void respawn(final Trade chargeFor, TeleportCause cause) throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Teleport wrapper used to handle /warp teleports
|
||||||
|
*
|
||||||
|
* @param otherUser - Which user will be teleported
|
||||||
|
* @param warp - The name of the warp the user will be teleported too.
|
||||||
|
* @param chargeFor - What the user will be charged if teleportPlayer is successful
|
||||||
|
* @param cause - The reported teleportPlayer cause
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void warp(IUser otherUser, String warp, Trade chargeFor, TeleportCause cause) throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Teleport wrapper used to handle /back teleports
|
||||||
|
*
|
||||||
|
* @param chargeFor - What the user will be charged if teleportPlayer is successful
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void back(Trade chargeFor) throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Teleport wrapper used to handle throwing user home after a jail sentence
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void back() throws Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Teleport wrapper used to handle /home teleports
|
||||||
|
*
|
||||||
|
* @param loc - Location where player will be teleported too
|
||||||
|
* @param chargeFor - What the user will be charged if teleportPlayer is successful
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void home(Location loc, Trade chargeFor) throws Exception;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.earth2me.essentials.api;
|
package com.earth2me.essentials.api;
|
||||||
|
|
||||||
|
import com.earth2me.essentials.IConf;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
|
@ -7,7 +8,7 @@ import com.earth2me.essentials.commands.WarpNotFoundException;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
|
|
||||||
|
|
||||||
public interface IWarps
|
public interface IWarps extends IConf
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Get a warp by name
|
* Get a warp by name
|
||||||
|
@ -26,6 +27,13 @@ public interface IWarps
|
||||||
*/
|
*/
|
||||||
Collection<String> getList();
|
Collection<String> getList();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the number of warps
|
||||||
|
*
|
||||||
|
* @return the size of the list of warps
|
||||||
|
*/
|
||||||
|
int getCount();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete a warp from the warp DB
|
* Delete a warp from the warp DB
|
||||||
*
|
*
|
||||||
|
@ -51,13 +59,11 @@ public interface IWarps
|
||||||
boolean isEmpty();
|
boolean isEmpty();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a warp file
|
* Get a warp file note: this is not yet implemented, as 3.x uses different storage methods
|
||||||
* note: this is not yet implemented, as 3.x uses different storage methods
|
|
||||||
*
|
*
|
||||||
* @param name - name of file
|
* @param name - name of file
|
||||||
* @return - an instance of the file
|
* @return - an instance of the file
|
||||||
* @throws InvalidNameException - When the file is not found
|
* @throws InvalidNameException - When the file is not found
|
||||||
*/
|
*/
|
||||||
File getWarpFile(String name) throws InvalidNameException;
|
File getWarpFile(String name) throws InvalidNameException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ public class Commanddelwarp extends EssentialsCommand
|
||||||
{
|
{
|
||||||
throw new NotEnoughArgumentsException();
|
throw new NotEnoughArgumentsException();
|
||||||
}
|
}
|
||||||
ess.getWarps().delWarp(args[0]);
|
ess.getWarps().removeWarp(args[0]);
|
||||||
sender.sendMessage(_("deleteWarp", args[0]));
|
sender.sendMessage(_("deleteWarp", args[0]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package com.earth2me.essentials.commands;
|
||||||
import static com.earth2me.essentials.I18n._;
|
import static com.earth2me.essentials.I18n._;
|
||||||
import com.earth2me.essentials.User;
|
import com.earth2me.essentials.User;
|
||||||
import com.earth2me.essentials.Util;
|
import com.earth2me.essentials.Util;
|
||||||
import com.earth2me.essentials.Warps;
|
import com.earth2me.essentials.api.IWarps;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ public class Commandsetwarp extends EssentialsCommand
|
||||||
}
|
}
|
||||||
|
|
||||||
final Location loc = user.getLocation();
|
final Location loc = user.getLocation();
|
||||||
final Warps warps = ess.getWarps();
|
final IWarps warps = ess.getWarps();
|
||||||
Location warpLoc = null;
|
Location warpLoc = null;
|
||||||
|
|
||||||
try
|
try
|
||||||
|
|
|
@ -4,7 +4,7 @@ import static com.earth2me.essentials.I18n._;
|
||||||
import com.earth2me.essentials.Trade;
|
import com.earth2me.essentials.Trade;
|
||||||
import com.earth2me.essentials.User;
|
import com.earth2me.essentials.User;
|
||||||
import com.earth2me.essentials.Util;
|
import com.earth2me.essentials.Util;
|
||||||
import com.earth2me.essentials.Warps;
|
import com.earth2me.essentials.api.IWarps;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
@ -60,7 +60,7 @@ public class Commandwarp extends EssentialsCommand
|
||||||
throw new NoChargeException();
|
throw new NoChargeException();
|
||||||
}
|
}
|
||||||
User otherUser = getPlayer(server, args, 1, true, false);
|
User otherUser = getPlayer(server, args, 1, true, false);
|
||||||
otherUser.getTeleport().warp(args[0], null, TeleportCause.COMMAND);
|
otherUser.getTeleport().warp(otherUser, args[0], null, TeleportCause.COMMAND);
|
||||||
throw new NoChargeException();
|
throw new NoChargeException();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -68,12 +68,12 @@ public class Commandwarp extends EssentialsCommand
|
||||||
//TODO: Use one of the new text classes, like /help ?
|
//TODO: Use one of the new text classes, like /help ?
|
||||||
private void warpList(final CommandSender sender, final String[] args) throws Exception
|
private void warpList(final CommandSender sender, final String[] args) throws Exception
|
||||||
{
|
{
|
||||||
final Warps warps = ess.getWarps();
|
final IWarps warps = ess.getWarps();
|
||||||
if (warps.isEmpty())
|
if (warps.isEmpty())
|
||||||
{
|
{
|
||||||
throw new Exception(_("noWarpsDefined"));
|
throw new Exception(_("noWarpsDefined"));
|
||||||
}
|
}
|
||||||
final List<String> warpNameList = new ArrayList<String>(warps.getWarpNames());
|
final List<String> warpNameList = new ArrayList<String>(warps.getList());
|
||||||
|
|
||||||
if (sender instanceof User)
|
if (sender instanceof User)
|
||||||
{
|
{
|
||||||
|
@ -118,6 +118,6 @@ public class Commandwarp extends EssentialsCommand
|
||||||
{
|
{
|
||||||
throw new Exception(_("warpUsePermission"));
|
throw new Exception(_("warpUsePermission"));
|
||||||
}
|
}
|
||||||
user.getTeleport().warp(name, charge, TeleportCause.COMMAND);
|
owner.getTeleport().warp(user, name, charge, TeleportCause.COMMAND);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,7 @@ public class MetricsStarter implements Runnable
|
||||||
@Override
|
@Override
|
||||||
public int getValue()
|
public int getValue()
|
||||||
{
|
{
|
||||||
return ess.getWarps().getWarpNames().size();
|
return ess.getWarps().getCount();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@ public class MetricsStarter implements Runnable
|
||||||
{
|
{
|
||||||
enabledGraph.addPlotter(new SimplePlotter("Kits"));
|
enabledGraph.addPlotter(new SimplePlotter("Kits"));
|
||||||
}
|
}
|
||||||
if (ess.getWarps().getWarpNames().size() > 0)
|
if (ess.getWarps().getCount() > 0)
|
||||||
{
|
{
|
||||||
enabledGraph.addPlotter(new SimplePlotter("Warps"));
|
enabledGraph.addPlotter(new SimplePlotter("Warps"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,7 +58,7 @@ public class SignWarp extends EssentialsSign
|
||||||
final Trade charge = getTrade(sign, 3, ess);
|
final Trade charge = getTrade(sign, 3, ess);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
player.getTeleport().warp(warpName, charge, TeleportCause.PLUGIN);
|
player.getTeleport().warp(player, warpName, charge, TeleportCause.PLUGIN);
|
||||||
Trade.log("Sign", "Warp", "Interact", username, null, username, charge, sign.getBlock().getLocation(), ess);
|
Trade.log("Sign", "Warp", "Interact", username, null, username, charge, sign.getBlock().getLocation(), ess);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
|
@ -28,7 +28,7 @@ public class Commandspawn extends EssentialsCommand
|
||||||
if (args.length > 0 && user.isAuthorized("essentials.spawn.others"))
|
if (args.length > 0 && user.isAuthorized("essentials.spawn.others"))
|
||||||
{
|
{
|
||||||
final User otherUser = getPlayer(server, user, args, 0);
|
final User otherUser = getPlayer(server, user, args, 0);
|
||||||
respawn(otherUser, charge);
|
respawn(user, otherUser, charge);
|
||||||
if (!otherUser.equals(user))
|
if (!otherUser.equals(user))
|
||||||
{
|
{
|
||||||
otherUser.sendMessage(_("teleportAtoB", user.getDisplayName(), "spawn"));
|
otherUser.sendMessage(_("teleportAtoB", user.getDisplayName(), "spawn"));
|
||||||
|
@ -37,7 +37,7 @@ public class Commandspawn extends EssentialsCommand
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
respawn(user, charge);
|
respawn(user, user, charge);
|
||||||
}
|
}
|
||||||
throw new NoChargeException();
|
throw new NoChargeException();
|
||||||
}
|
}
|
||||||
|
@ -50,14 +50,22 @@ public class Commandspawn extends EssentialsCommand
|
||||||
throw new NotEnoughArgumentsException();
|
throw new NotEnoughArgumentsException();
|
||||||
}
|
}
|
||||||
final User user = getPlayer(server, args, 0, true, false);
|
final User user = getPlayer(server, args, 0, true, false);
|
||||||
respawn(user, null);
|
respawn(null, user, null);
|
||||||
user.sendMessage(_("teleportAtoB", Console.NAME, "spawn"));
|
user.sendMessage(_("teleportAtoB", Console.NAME, "spawn"));
|
||||||
sender.sendMessage(_("teleporting"));
|
sender.sendMessage(_("teleporting"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void respawn (final User user, final Trade charge) throws Exception {
|
private void respawn(final User teleportOwner, final User teleportee, final Trade charge) throws Exception
|
||||||
|
{
|
||||||
final SpawnStorage spawns = (SpawnStorage)this.module;
|
final SpawnStorage spawns = (SpawnStorage)this.module;
|
||||||
final Location spawn = spawns.getSpawn(user.getGroup());
|
final Location spawn = spawns.getSpawn(teleportee.getGroup());
|
||||||
user.getTeleport().teleport(spawn, charge, TeleportCause.COMMAND);
|
if (teleportOwner == null)
|
||||||
|
{
|
||||||
|
teleportee.getTeleport().now(spawn, false, TeleportCause.COMMAND);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
teleportOwner.getTeleport().teleportPlayer(teleportee, spawn, charge, TeleportCause.COMMAND);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue