Recoding TeleporterMixin

This commit is contained in:
Olof Larsson 2013-03-05 17:14:13 +01:00
parent e07241d4d7
commit 941478c574
10 changed files with 156 additions and 156 deletions

View File

@ -5,6 +5,8 @@ import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.bukkit.permissions.Permissible;
import com.massivecraft.mcore.cmd.CmdMcore;
import com.massivecraft.mcore.usys.cmd.CmdUsys;
import com.massivecraft.mcore.util.MUtil;
@ -35,6 +37,12 @@ public class Conf extends SimpleConfig
return ret;
}
public static int getTpdelay(Permissible permissible)
{
if (Permission.NOTPDELAY.has(permissible, false)) return 0;
return Math.max(tpdelay, 0);
}
// -------------------------------------------- //
// META
// -------------------------------------------- //

View File

@ -24,6 +24,7 @@ import com.massivecraft.mcore.store.MStore;
import com.massivecraft.mcore.usys.AspectColl;
import com.massivecraft.mcore.usys.MultiverseColl;
import com.massivecraft.mcore.usys.cmd.CmdUsys;
import com.massivecraft.mcore.util.FirstTeleportUtil;
import com.massivecraft.mcore.util.PlayerUtil;
import com.massivecraft.mcore.util.TimeDiffUtil;
import com.massivecraft.mcore.util.TimeUnit;
@ -115,6 +116,7 @@ public class MCore extends MPlugin
// Register events
InternalListener.get().setup();
ScheduledTeleportEngine.get().setup();
FirstTeleportUtil.get().setup();
// Schedule the collection ticker.
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, this.collTickTask, 1, 1);

View File

@ -1,8 +1,6 @@
package com.massivecraft.mcore.event;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
@ -27,11 +25,11 @@ public class MCorePlayerPSTeleportEvent extends Event implements Cancellable, Ru
@Override public boolean isCancelled() { return this.cancelled; }
@Override public void setCancelled(boolean cancelled) { this.cancelled = cancelled; }
private final Player player;
public Player getPlayer() { return this.player; }
private final String teleporteeId;
public String getTeleporteeId() { return this.teleporteeId; }
private final Location from;
public Location getFrom() { return this.from; }
private final PS from;
public PS getFrom() { return this.from; }
private PS to;
public PS getTo() { return this.to; }
@ -41,9 +39,9 @@ public class MCorePlayerPSTeleportEvent extends Event implements Cancellable, Ru
// CONSTRUCT
// -------------------------------------------- //
public MCorePlayerPSTeleportEvent(Player player, Location from, PS to)
public MCorePlayerPSTeleportEvent(String teleporteeId, PS from, PS to)
{
this.player = player;
this.teleporteeId = teleporteeId;
this.from = from;
this.to = to;
}

View File

@ -296,18 +296,6 @@ public class Mixin
{
getTeleportMixin().teleport(teleportee, destinationPs, destinationDesc, delayPermissible);
}
public static void teleport(Player teleportee, PS destinationPs, String destinationDesc, Permissible delayPermissible, CommandSender otherSender, String otherPerm) throws TeleporterException
{
getTeleportMixin().teleport(teleportee, destinationPs, destinationDesc, delayPermissible, otherSender, otherPerm);
}
public static void teleport(Player teleportee, PS destinationPs, String destinationDesc, CommandSender otherSender, String otherPerm) throws TeleporterException
{
getTeleportMixin().teleport(teleportee, destinationPs, destinationDesc, otherSender, otherPerm);
}
public static void teleport(Player teleportee, PS destinationPs, String destinationDesc, int delaySeconds, CommandSender otherSender, String otherPerm) throws TeleporterException
{
getTeleportMixin().teleport(teleportee, destinationPs, destinationDesc, delaySeconds, otherSender, otherPerm);
}
public static void teleport(Player teleportee, PS destinationPs, String destinationDesc, int delaySeconds) throws TeleporterException
{
getTeleportMixin().teleport(teleportee, destinationPs, destinationDesc, delaySeconds);
@ -325,18 +313,6 @@ public class Mixin
{
getTeleportMixin().teleport(teleporteeId, destinationPs, destinationDesc, delayPermissible);
}
public static void teleport(String teleporteeId, PS destinationPs, String destinationDesc, Permissible delayPermissible, CommandSender otherSender, String otherPerm) throws TeleporterException
{
getTeleportMixin().teleport(teleporteeId, destinationPs, destinationDesc, delayPermissible, otherSender, otherPerm);
}
public static void teleport(String teleporteeId, PS destinationPs, String destinationDesc, CommandSender otherSender, String otherPerm) throws TeleporterException
{
getTeleportMixin().teleport(teleporteeId, destinationPs, destinationDesc, otherSender, otherPerm);
}
public static void teleport(String teleporteeId, PS destinationPs, String destinationDesc, int delaySeconds, CommandSender otherSender, String otherPerm) throws TeleporterException
{
getTeleportMixin().teleport(teleporteeId, destinationPs, destinationDesc, delaySeconds, otherSender, otherPerm);
}
public static void teleport(String teleporteeId, PS destinationPs, String destinationDesc, int delaySeconds) throws TeleporterException
{
getTeleportMixin().teleport(teleporteeId, destinationPs, destinationDesc, delaySeconds);

View File

@ -1,7 +1,5 @@
package com.massivecraft.mcore.mixin;
import org.bukkit.entity.Player;
import com.massivecraft.mcore.PS;
public class ScheduledTeleport implements Runnable
@ -10,8 +8,8 @@ public class ScheduledTeleport implements Runnable
// FIELDS & RAW-DATA ACCESS
// -------------------------------------------- //
private final Player teleportee;
public Player getTeleportee() { return this.teleportee; }
private final String teleporteeId;
public String getTeleporteeId() { return this.teleporteeId; }
private final PS destinationPs;
public PS getDestinationPs() { return this.destinationPs; }
@ -31,9 +29,9 @@ public class ScheduledTeleport implements Runnable
// CONSTRUCT
// -------------------------------------------- //
public ScheduledTeleport(Player teleportee, PS destinationPs, String destinationDesc, int delaySeconds)
public ScheduledTeleport(String teleporteeId, PS destinationPs, String destinationDesc, int delaySeconds)
{
this.teleportee = teleportee;
this.teleporteeId = teleporteeId;
this.destinationPs = destinationPs;
this.destinationDesc = destinationDesc;
this.delaySeconds = delaySeconds;
@ -67,14 +65,14 @@ public class ScheduledTeleport implements Runnable
public void run()
{
this.unschedule();
if (!teleportee.isOnline()) return;
try
{
Mixin.teleport(this.teleportee, this.destinationPs, this.destinationDesc);
Mixin.teleport(this.getTeleporteeId(), this.getDestinationPs(), this.getDestinationDesc());
}
catch (TeleporterException e)
{
this.teleportee.sendMessage(e.getMessage());
Mixin.message(this.getTeleporteeId(), e.getMessage());
}
}

View File

@ -4,7 +4,6 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@ -12,6 +11,7 @@ import org.bukkit.event.player.PlayerMoveEvent;
import com.massivecraft.mcore.MCore;
import com.massivecraft.mcore.util.MUtil;
import com.massivecraft.mcore.util.SenderUtil;
public class ScheduledTeleportEngine implements Listener, Runnable
{
@ -26,19 +26,19 @@ public class ScheduledTeleportEngine implements Listener, Runnable
// SCHEDULED TELEPORT INDEX
// -------------------------------------------- //
protected Map<Player, ScheduledTeleport> teleporteeToScheduledTeleport = new ConcurrentHashMap<Player, ScheduledTeleport>();
protected Map<String, ScheduledTeleport> teleporteeIdToScheduledTeleport = new ConcurrentHashMap<String, ScheduledTeleport>();
public boolean isScheduled(ScheduledTeleport st)
{
return this.teleporteeToScheduledTeleport.containsValue(st);
return this.teleporteeIdToScheduledTeleport.containsValue(st);
}
public ScheduledTeleport schedule(ScheduledTeleport st)
{
ScheduledTeleport old = this.teleporteeToScheduledTeleport.get(st.getTeleportee());
ScheduledTeleport old = this.teleporteeIdToScheduledTeleport.get(st.getTeleporteeId());
if (old != null) old.unschedule();
this.teleporteeToScheduledTeleport.put(st.getTeleportee(), st);
this.teleporteeIdToScheduledTeleport.put(st.getTeleporteeId(), st);
st.setDueMillis(System.currentTimeMillis() + st.getDelaySeconds()*1000);
@ -47,11 +47,11 @@ public class ScheduledTeleportEngine implements Listener, Runnable
public boolean unschedule(ScheduledTeleport st)
{
ScheduledTeleport old = this.teleporteeToScheduledTeleport.get(st.getTeleportee());
ScheduledTeleport old = this.teleporteeIdToScheduledTeleport.get(st.getTeleporteeId());
if (old == null) return false;
if (old != st) return false;
return this.teleporteeToScheduledTeleport.remove(st.getTeleportee()) != null;
return this.teleporteeIdToScheduledTeleport.remove(st.getTeleporteeId()) != null;
}
// -------------------------------------------- //
@ -75,14 +75,14 @@ public class ScheduledTeleportEngine implements Listener, Runnable
if (MUtil.isSameBlock(event.getFrom(), event.getTo())) return;
// ... and there is a ScheduledTeleport ...
ScheduledTeleport scheduledTeleport = teleporteeToScheduledTeleport.get(event.getPlayer());
ScheduledTeleport scheduledTeleport = teleporteeIdToScheduledTeleport.get(SenderUtil.getSenderId(event.getPlayer()));
if (scheduledTeleport == null) return;
// ... unschedule it ...
scheduledTeleport.unschedule();
// ... and inform the teleportee.
Mixin.msg(scheduledTeleport.getTeleportee(), "<rose>Cancelled <i>teleport to <h>"+scheduledTeleport.getDestinationDesc()+"<i>.");
Mixin.msg(scheduledTeleport.getTeleporteeId(), "<rose>Cancelled <i>teleport to <h>"+scheduledTeleport.getDestinationDesc()+"<i>.");
}
// -------------------------------------------- //
@ -93,7 +93,7 @@ public class ScheduledTeleportEngine implements Listener, Runnable
public void run()
{
long now = System.currentTimeMillis();
for (ScheduledTeleport st : teleporteeToScheduledTeleport.values())
for (ScheduledTeleport st : teleporteeIdToScheduledTeleport.values())
{
if (st.isDue(now))
{

View File

@ -1,6 +1,5 @@
package com.massivecraft.mcore.mixin;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.permissions.Permissible;
@ -8,12 +7,6 @@ import com.massivecraft.mcore.PS;
public interface TeleportMixin
{
// -------------------------------------------- //
// MESSAGING
// -------------------------------------------- //
public void sendPreTeleportMessage(Player teleportee, String destinationDesc, int delaySeconds);
// -------------------------------------------- //
// PLAYER
// -------------------------------------------- //
@ -23,11 +16,6 @@ public interface TeleportMixin
public void teleport(Player teleportee, PS destinationPs, String destinationDesc) throws TeleporterException;
public void teleport(Player teleportee, PS destinationPs, String destinationDesc, Permissible delayPermissible) throws TeleporterException;
public void teleport(Player teleportee, PS destinationPs, String destinationDesc, Permissible delayPermissible, CommandSender otherSender, String otherPerm) throws TeleporterException;
public void teleport(Player teleportee, PS destinationPs, String destinationDesc, CommandSender otherSender, String otherPerm) throws TeleporterException;
public void teleport(Player teleportee, PS destinationPs, String destinationDesc, int delaySeconds, CommandSender otherSender, String otherPerm) throws TeleporterException;
public void teleport(Player teleportee, PS destinationPs, String destinationDesc, int delaySeconds) throws TeleporterException;
@ -40,11 +28,7 @@ public interface TeleportMixin
public void teleport(String teleporteeId, PS destinationPs, String destinationDesc) throws TeleporterException;
public void teleport(String teleporteeId, PS destinationPs, String destinationDesc, Permissible delayPermissible) throws TeleporterException;
public void teleport(String teleporteeId, PS destinationPs, String destinationDesc, Permissible delayPermissible, CommandSender otherSender, String otherPerm) throws TeleporterException;
public void teleport(String teleporteeId, PS destinationPs, String destinationDesc, CommandSender otherSender, String otherPerm) throws TeleporterException;
public void teleport(String teleporteeId, PS destinationPs, String destinationDesc, int delaySeconds, CommandSender otherSender, String otherPerm) throws TeleporterException;
// The only one not covered in abstract
public void teleport(String teleporteeId, PS destinationPs, String destinationDesc, int delaySeconds) throws TeleporterException;
}

View File

@ -1,15 +1,11 @@
package com.massivecraft.mcore.mixin;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.permissions.Permissible;
import com.massivecraft.mcore.Conf;
import com.massivecraft.mcore.PS;
import com.massivecraft.mcore.Permission;
import com.massivecraft.mcore.util.PermUtil;
import com.massivecraft.mcore.util.SenderUtil;
import com.massivecraft.mcore.util.Txt;
public abstract class TeleportMixinAbstract implements TeleportMixin
{
@ -17,29 +13,6 @@ public abstract class TeleportMixinAbstract implements TeleportMixin
// OVERRIDE
// -------------------------------------------- //
@Override
public void sendPreTeleportMessage(Player teleportee, String destinationDesc, int delaySeconds)
{
if (delaySeconds > 0)
{
if (destinationDesc != null)
{
Mixin.msg(teleportee, "<i>Teleporting to <h>"+destinationDesc+" <i>in <h>"+delaySeconds+"s <i>unless you move.");
}
else
{
Mixin.msg(teleportee, "<i>Teleporting in <h>"+delaySeconds+"s <i>unless you move.");
}
}
else
{
if (destinationDesc != null)
{
Mixin.msg(teleportee, "<i>Teleporting to <h>"+destinationDesc+"<i>.");
}
}
}
@Override
public void teleport(Player teleportee, PS destinationPs) throws TeleporterException
{
@ -55,28 +28,14 @@ public abstract class TeleportMixinAbstract implements TeleportMixin
@Override
public void teleport(Player teleportee, PS destinationPs, String destinationDesc, Permissible delayPermissible) throws TeleporterException
{
int delaySeconds = decideDelaySeconds(delayPermissible);
int delaySeconds = getTpdelay(delayPermissible);
this.teleport(teleportee, destinationPs, destinationDesc, delaySeconds);
}
@Override
public void teleport(Player teleportee, PS destinationPs, String destinationDesc, Permissible delayPermissible, CommandSender otherSender, String otherPerm) throws TeleporterException
public void teleport(Player teleportee, PS destinationPs, String destinationDesc, int delaySeconds) throws TeleporterException
{
int delaySeconds = decideDelaySeconds(delayPermissible);
this.teleport(teleportee, destinationPs, destinationDesc, delaySeconds, otherSender, otherPerm);
}
@Override
public void teleport(Player teleportee, PS destinationPs, String destinationDesc, CommandSender otherSender, String otherPerm) throws TeleporterException
{
this.teleport(teleportee, destinationPs, destinationDesc, 0, otherSender, otherPerm);
}
@Override
public void teleport(Player teleportee, PS destinationPs, String destinationDesc, int delaySeconds, CommandSender otherSender, String otherPerm) throws TeleporterException
{
otherPermCheck(SenderUtil.getSenderId(teleportee), otherSender, otherPerm);
this.teleport(teleportee, destinationPs, destinationDesc, delaySeconds);
this.teleport(SenderUtil.getSenderId(teleportee), destinationPs, destinationDesc, delaySeconds);
}
// ----
@ -96,27 +55,7 @@ public abstract class TeleportMixinAbstract implements TeleportMixin
@Override
public void teleport(String teleporteeId, PS destinationPs, String destinationDesc, Permissible delayPermissible) throws TeleporterException
{
int delaySeconds = decideDelaySeconds(delayPermissible);
this.teleport(teleporteeId, destinationPs, destinationDesc, delaySeconds);
}
@Override
public void teleport(String teleporteeId, PS destinationPs, String destinationDesc, Permissible delayPermissible, CommandSender otherSender, String otherPerm) throws TeleporterException
{
int delaySeconds = decideDelaySeconds(delayPermissible);
this.teleport(teleporteeId, destinationPs, destinationDesc, delaySeconds, otherSender, otherPerm);
}
@Override
public void teleport(String teleporteeId, PS destinationPs, String destinationDesc, CommandSender otherSender, String otherPerm) throws TeleporterException
{
this.teleport(teleporteeId, destinationPs, destinationDesc, 0, otherSender, otherPerm);
}
@Override
public void teleport(String teleporteeId, PS destinationPs, String destinationDesc, int delaySeconds, CommandSender otherSender, String otherPerm) throws TeleporterException
{
otherPermCheck(teleporteeId, otherSender, otherPerm);
int delaySeconds = getTpdelay(delayPermissible);
this.teleport(teleporteeId, destinationPs, destinationDesc, delaySeconds);
}
@ -124,17 +63,12 @@ public abstract class TeleportMixinAbstract implements TeleportMixin
// UTIL
// -------------------------------------------- //
public static int decideDelaySeconds(Permissible delayPermissible)
public static int getTpdelay(Permissible delayPermissible)
{
int ret = Conf.tpdelay;
if (Permission.NOTPDELAY.has(delayPermissible, false))
{
ret = 0;
}
ret = Math.max(ret, 0);
return ret;
return Conf.getTpdelay(delayPermissible);
}
/*
public static void otherPermCheck(String teleporteeId, CommandSender otherSender, String otherPerm) throws TeleporterException
{
String otherSenderId = SenderUtil.getSenderId(otherSender);
@ -147,7 +81,7 @@ public abstract class TeleportMixinAbstract implements TeleportMixin
{
if (!SenderUtil.isPlayerId(teleporteeId)) throw new TeleporterException(Txt.parse("<white>%s <b>is not a player.", Mixin.getDisplayName(teleporteeId)));
if (Mixin.isOffline(teleporteeId)) throw new TeleporterException(Txt.parse("<white>%s <b>is offline.", Mixin.getDisplayName(teleporteeId)));
}
}*/

View File

@ -49,32 +49,50 @@ public class TeleportMixinDefault extends TeleportMixinAbstract
// -------------------------------------------- //
@Override
public void teleport(Player teleportee, PS destinationPs, String destinationDesc, int delaySeconds) throws TeleporterException
public void teleport(String teleporteeId, PS destinationPs, String destinationDesc, int delaySeconds) throws TeleporterException
{
this.sendPreTeleportMessage(teleportee, destinationDesc, delaySeconds);
if (!SenderUtil.isPlayerId(teleporteeId)) throw new TeleporterException(Txt.parse("<white>%s <b>is not a player.", Mixin.getDisplayName(teleporteeId)));
if (delaySeconds > 0)
{
new ScheduledTeleport(teleportee, destinationPs, destinationDesc, delaySeconds).schedule();
// With delay
if (destinationDesc != null)
{
Mixin.msg(teleporteeId, "<i>Teleporting to <h>"+destinationDesc+" <i>in <h>"+delaySeconds+"s <i>unless you move.");
}
else
{
Mixin.msg(teleporteeId, "<i>Teleporting in <h>"+delaySeconds+"s <i>unless you move.");
}
new ScheduledTeleport(teleporteeId, destinationPs, destinationDesc, delaySeconds).schedule();
}
else
{
// Without delay AKA "now"/"at once"
// Run event
MCorePlayerPSTeleportEvent event = new MCorePlayerPSTeleportEvent(teleportee, teleportee.getLocation(), destinationPs.clone());
MCorePlayerPSTeleportEvent event = new MCorePlayerPSTeleportEvent(teleporteeId, Mixin.getSenderPs(teleporteeId), destinationPs.clone());
event.run();
if (event.isCancelled()) return;
if (event.getTo() == null) return;
destinationPs = event.getTo().clone();
teleportEntity(teleportee, destinationPs);
}
if (destinationDesc != null)
{
Mixin.msg(teleporteeId, "<i>Teleporting to <h>"+destinationDesc+"<i>.");
}
@Override
public void teleport(String teleporteeId, PS destinationPs, String destinationDesc, int delaySeconds) throws TeleporterException
{
validateTeleporteeId(teleporteeId);
Player teleportee = SenderUtil.getPlayer(teleporteeId);
this.teleport(teleportee, destinationPs, destinationDesc, delaySeconds);
if (teleportee != null)
{
teleportEntity(teleportee, destinationPs);
}
else
{
Mixin.setSenderPs(teleporteeId, destinationPs.clone());
}
}
}
}

View File

@ -0,0 +1,82 @@
package com.massivecraft.mcore.util;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import com.massivecraft.mcore.MCore;
/**
* The first teleport to ever occur for a player happens soon after the player logged in.
* This is a system one that should not be cancelled since it happens as the player is assigned their entrance position.
* Altering the to-location is possible but altering the world will not matter. Only x, y, z, pitch and yaw are taken into consideration.
* This tool can be used to check if a PlayerTeleportEvent is the first one for the player.
*/
public class FirstTeleportUtil implements Listener
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private static FirstTeleportUtil i = new FirstTeleportUtil();
public static FirstTeleportUtil get() { return i; }
// -------------------------------------------- //
// STATIC
// -------------------------------------------- //
private Map<Player, PlayerTeleportEvent> playerToFirstTeleport;
public static boolean isFirstTeleport(PlayerTeleportEvent event)
{
Player player = event.getPlayer();
PlayerTeleportEvent stored = i.playerToFirstTeleport.get(player);
if (stored == null)
{
i.playerToFirstTeleport.put(player, event);
return true;
}
else
{
return stored == event;
}
}
// -------------------------------------------- //
// SETUP
// -------------------------------------------- //
public void setup()
{
playerToFirstTeleport = new HashMap<Player, PlayerTeleportEvent>();
Bukkit.getPluginManager().registerEvents(this, MCore.get());
}
// -------------------------------------------- //
// LISTENER
// -------------------------------------------- //
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerLoginEventMonitor(PlayerLoginEvent event)
{
Player player = event.getPlayer();
this.playerToFirstTeleport.remove(player);
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerTeleportLowest(PlayerTeleportEvent event)
{
Player player = event.getPlayer();
if (this.playerToFirstTeleport.containsKey(player)) return;
this.playerToFirstTeleport.put(player, event);
}
}