diff --git a/src/com/massivecraft/mcore/EngineMainMCore.java b/src/com/massivecraft/mcore/EngineMainMCore.java index 2dd18a92..376f3870 100644 --- a/src/com/massivecraft/mcore/EngineMainMCore.java +++ b/src/com/massivecraft/mcore/EngineMainMCore.java @@ -15,7 +15,6 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDamageByBlockEvent; -import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerKickEvent; @@ -23,7 +22,6 @@ import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerLoginEvent.Result; import org.bukkit.event.player.PlayerChatTabCompleteEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerTeleportEvent; @@ -42,7 +40,6 @@ import com.massivecraft.mcore.event.MCoreSenderUnregisterEvent; import com.massivecraft.mcore.mixin.Mixin; import com.massivecraft.mcore.store.Coll; import com.massivecraft.mcore.store.SenderColl; -import com.massivecraft.mcore.util.FlyUtil; import com.massivecraft.mcore.util.IdUtil; import com.massivecraft.mcore.util.SmokeUtil; import com.massivecraft.mcore.util.Txt; @@ -73,45 +70,6 @@ public class EngineMainMCore extends EngineAbstract MCorePlayerLeaveEvent.player2event.clear(); } - // -------------------------------------------- // - // FLY UTIL & EVENT - // -------------------------------------------- // - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void updateFly(PlayerMoveEvent event) - { - // If a player ... - Player player = event.getPlayer(); - - // ... moved from one block to another ... - if (event.getFrom().getBlock().equals(event.getTo().getBlock())) return; - - // ... and the player is alive ... - if (player.isDead()) return; - - // ... trigger a fly update. - FlyUtil.update(player); - } - - @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) - public void negateNoCheatPlusBug(EntityDamageEvent event) - { - // If a player ... - if ( ! (event.getEntity() instanceof Player)) return; - Player player = (Player)event.getEntity(); - - // ... is taking fall damage ... - if (event.getCause() != DamageCause.FALL) return; - - // ... within 2 seconds of flying ... - Long lastActive = FlyUtil.getLastActive(player); - if (lastActive == null) return; - if (System.currentTimeMillis() - lastActive > 2000) return; - - // ... cancel the event. - event.setCancelled(true); - } - // -------------------------------------------- // // RECIPIENT CHAT // -------------------------------------------- // diff --git a/src/com/massivecraft/mcore/MCore.java b/src/com/massivecraft/mcore/MCore.java index d0d41b87..5d73ceb2 100644 --- a/src/com/massivecraft/mcore/MCore.java +++ b/src/com/massivecraft/mcore/MCore.java @@ -161,8 +161,8 @@ public class MCore extends MPlugin EngineScheduledTeleport.get().activate(); EngineTeleportMixinCause.get().activate(); EngineWorldNameSet.get().activate(); - EngineCommandRegistration.get().activate(); // TODO: Make all engines - PlayerUtil.get().setup(); + EngineCommandRegistration.get().activate(); + PlayerUtil.get().activate(); // Tasks Bukkit.getScheduler().scheduleSyncRepeatingTask(this, this.collTickTask, 1, 1); diff --git a/src/com/massivecraft/mcore/event/EventMCorePlayerUpdate.java b/src/com/massivecraft/mcore/event/EventMCorePlayerUpdate.java new file mode 100644 index 00000000..4d94987d --- /dev/null +++ b/src/com/massivecraft/mcore/event/EventMCorePlayerUpdate.java @@ -0,0 +1,55 @@ +package com.massivecraft.mcore.event; + +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; + +import com.massivecraft.mcore.util.PlayerUtil; + +public class EventMCorePlayerUpdate extends MCoreEvent +{ + // -------------------------------------------- // + // REQUIRED EVENT CODE + // -------------------------------------------- // + + private static final HandlerList handlers = new HandlerList(); + @Override public HandlerList getHandlers() { return handlers; } + public static HandlerList getHandlerList() { return handlers; } + + // -------------------------------------------- // + // FIELD + // -------------------------------------------- // + + private final Player player; + public Player getPlayer() { return this.player; } + + private double maxHealth; + public double getMaxHealth() { return this.maxHealth; } + public void setMaxHealth(double maxHealth) { this.maxHealth = maxHealth; } + + private boolean flyAllowed; + public boolean isFlyAllowed() { return this.flyAllowed; } + public void setAllowed(boolean flyAllowed) { this.flyAllowed = flyAllowed; } + + private boolean flyActive; + public boolean isFlyActive() { return this.flyActive; } + public void setFlyActive(boolean flyActive) { this.flyActive = flyActive; } + + private float flySpeed; + public float getFlySpeed() { return this.flySpeed; } + public void setFlySpeed(float flySpeed) { this.flySpeed = flySpeed; } + + // -------------------------------------------- // + // CONSTRUCT + // -------------------------------------------- // + + public EventMCorePlayerUpdate(Player player) + { + this.player = player; + this.maxHealth = PlayerUtil.getMaxHealth(player); + this.flyAllowed = PlayerUtil.isFlyAllowed(player); + this.flyActive = PlayerUtil.isFlyActive(player); + this.flySpeed = PlayerUtil.getFlySpeed(player); + } + +} + diff --git a/src/com/massivecraft/mcore/event/MCorePlayerFlyEvent.java b/src/com/massivecraft/mcore/event/MCorePlayerFlyEvent.java deleted file mode 100644 index f1a35da4..00000000 --- a/src/com/massivecraft/mcore/event/MCorePlayerFlyEvent.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.massivecraft.mcore.event; - -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; - -import com.massivecraft.mcore.util.FlyUtil; - -public class MCorePlayerFlyEvent extends MCoreEvent -{ - // -------------------------------------------- // - // CONSTANTS - // -------------------------------------------- // - - public final static float DEFAULT_SPEED = 0.1f; - - // -------------------------------------------- // - // REQUIRED EVENT CODE - // -------------------------------------------- // - - private static final HandlerList handlers = new HandlerList(); - @Override public HandlerList getHandlers() { return handlers; } - public static HandlerList getHandlerList() { return handlers; } - - // -------------------------------------------- // - // FIELD - // -------------------------------------------- // - - private final Player player; - public Player getPlayer() { return this.player; } - - private boolean allowed; - public boolean isAllowed() { return this.allowed; } - public void setAllowed(boolean allowed) { this.allowed = allowed; } - - private boolean active; - public boolean isActive() { return this.active; } - public void setActive(boolean active) { this.active = active; } - - private float speed; - public float getSpeed() { return this.speed; } - public void setSpeed(float speed) { this.speed = speed; } - - // -------------------------------------------- // - // CONSTRUCT - // -------------------------------------------- // - - public MCorePlayerFlyEvent(Player player, boolean allowed, boolean active, float speed) - { - this.player = player; - this.allowed = allowed; - this.active = active; - this.speed = speed; - } - - public MCorePlayerFlyEvent(Player player) - { - this.player = player; - this.allowed = FlyUtil.isAllowed(player); - this.active = FlyUtil.isActive(player); - this.speed = FlyUtil.getSpeed(player); - } - -} - diff --git a/src/com/massivecraft/mcore/money/Money.java b/src/com/massivecraft/mcore/money/Money.java index baef124e..ff544b0b 100644 --- a/src/com/massivecraft/mcore/money/Money.java +++ b/src/com/massivecraft/mcore/money/Money.java @@ -24,6 +24,7 @@ public class Money if (account == null) return null; // ... but if something is supplied we must manage to extract an id. + // NOTE: This ID is the name for now, later all money plugins will probably support UUIDs. String ret = MUtil.extract(String.class, "accountId", account); if (ret == null) throw new IllegalArgumentException("extraction of accountId from object failed"); return ret; diff --git a/src/com/massivecraft/mcore/util/FlyUtil.java b/src/com/massivecraft/mcore/util/FlyUtil.java deleted file mode 100644 index a98487cc..00000000 --- a/src/com/massivecraft/mcore/util/FlyUtil.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.massivecraft.mcore.util; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -import org.bukkit.GameMode; -import org.bukkit.entity.Player; - -import com.massivecraft.mcore.event.MCorePlayerFlyEvent; - -public class FlyUtil -{ - // -------------------------------------------- // - // CONSTANTS - // -------------------------------------------- // - - public final static float DEFAULT_SPEED = 0.1f; - - // -------------------------------------------- // - // LAST ALLOWED - // -------------------------------------------- // - - public static Map idToLastActive = new HashMap(); - - public static Long getLastActive(Player player) - { - return idToLastActive.get(player.getUniqueId()); - } - - public static void setLastActive(Player player, Long millis) - { - idToLastActive.put(player.getUniqueId(), millis); - } - - // -------------------------------------------- // - // UPDATE BY EVENT - // -------------------------------------------- // - - public static void update(Player player) - { - MCorePlayerFlyEvent event = new MCorePlayerFlyEvent(player); - event.run(); - - setAllowed(player, event.isAllowed()); - setActive(player, event.isActive()); - setSpeed(player, event.getSpeed()); - } - - public static void reset(Player player) - { - setAllowed(player, player.getGameMode() == GameMode.CREATIVE); - setActive(player, player.getGameMode() == GameMode.CREATIVE); - setSpeed(player, DEFAULT_SPEED); - update(player); - } - - // -------------------------------------------- // - // ALLOWED - // -------------------------------------------- // - - public static boolean setAllowed(Player player, boolean allowed) - { - // NoChange - if (isAllowed(player) == allowed) return false; - - // Apply - player.setFallDistance(0); - player.setAllowFlight(allowed); - player.setFallDistance(0); - - // Return - return true; - } - - public static boolean isAllowed(Player player) - { - return player.getAllowFlight(); - } - - // -------------------------------------------- // - // ACTIVE - // -------------------------------------------- // - - public static boolean setActive(Player player, boolean active) - { - // Last Active Update - if (active) - { - setLastActive(player, System.currentTimeMillis()); - } - - // NoChange - if (isActive(player) == active) return false; - - // Apply - player.setFallDistance(0); - player.setFlying(active); - player.setFallDistance(0); - - // Return - return true; - } - - public static boolean isActive(Player player) - { - return player.isFlying(); - } - - // -------------------------------------------- // - // ACTIVE - // -------------------------------------------- // - - public static boolean setSpeed(Player player, float speed) - { - // NoChange - if (getSpeed(player) == speed) return false; - - // Apply - player.setFallDistance(0); - player.setFlySpeed(speed); - player.setFallDistance(0); - - // Return - return true; - } - - public static float getSpeed(Player player) - { - return player.getFlySpeed(); - } - -} diff --git a/src/com/massivecraft/mcore/util/MUtil.java b/src/com/massivecraft/mcore/util/MUtil.java index 69dfd742..34e11549 100644 --- a/src/com/massivecraft/mcore/util/MUtil.java +++ b/src/com/massivecraft/mcore/util/MUtil.java @@ -53,6 +53,7 @@ import com.massivecraft.mcore.util.extractor.ExtractorPlayer; import com.massivecraft.mcore.util.extractor.ExtractorPlayerName; import com.massivecraft.mcore.util.extractor.ExtractorSender; import com.massivecraft.mcore.util.extractor.ExtractorSenderId; +import com.massivecraft.mcore.util.extractor.ExtractorSenderName; import com.massivecraft.mcore.util.extractor.ExtractorWorld; import com.massivecraft.mcore.util.extractor.ExtractorWorldName; @@ -696,7 +697,9 @@ public class MUtil registerExtractor(World.class, "world", ExtractorWorld.get()); registerExtractor(String.class, "worldName", ExtractorWorldName.get()); - registerExtractor(String.class, "accountId", ExtractorSenderId.get()); + // The accountId extractor is used for the money mixin. + // For now we act on the name instead of the ID since vault needs names. + registerExtractor(String.class, "accountId", ExtractorSenderName.get()); } } diff --git a/src/com/massivecraft/mcore/util/PeriodUtil.java b/src/com/massivecraft/mcore/util/PeriodUtil.java index 9f4bbe33..e5346dda 100644 --- a/src/com/massivecraft/mcore/util/PeriodUtil.java +++ b/src/com/massivecraft/mcore/util/PeriodUtil.java @@ -3,6 +3,8 @@ package com.massivecraft.mcore.util; import java.util.HashMap; import java.util.Map; +import org.bukkit.Bukkit; + public class PeriodUtil { // -------------------------------------------- // @@ -30,6 +32,31 @@ public class PeriodUtil } } + // -------------------------------------------- // + // TICKS STORE + // -------------------------------------------- // + + private static Map objectToTicks = new HashMap(); + + public static long getTicks(Object object) + { + Long ret = objectToTicks.get(object); + if (ret == null) ret = 0L; + return ret; + } + + public static void setTicks(Object object, Long ticks) + { + if (ticks == null || ticks == 0) + { + objectToTicks.remove(object); + } + else + { + objectToTicks.put(object, ticks); + } + } + // -------------------------------------------- // // RANDOM SIMPLE // -------------------------------------------- // @@ -51,11 +78,18 @@ public class PeriodUtil public static boolean isNewPeriod(Object object, long length, long now) { + // If the ticks are the same we are fine! + long currentTicks = Bukkit.getWorlds().get(0).getTime(); + long lastTicks = getTicks(object); + if (currentTicks == lastTicks) return true; + + // Otherwise period must be new! long currentPeriod = getPeriod(length, now); long lastPeriod = getLastPeriod(object, length); - if (currentPeriod == lastPeriod) return false; + // And then we log data + setTicks(object, currentTicks); setMillis(object, now); return true; diff --git a/src/com/massivecraft/mcore/util/PlayerUtil.java b/src/com/massivecraft/mcore/util/PlayerUtil.java index f45a51b4..14a9ce52 100644 --- a/src/com/massivecraft/mcore/util/PlayerUtil.java +++ b/src/com/massivecraft/mcore/util/PlayerUtil.java @@ -7,19 +7,26 @@ import java.util.UUID; import java.util.concurrent.ConcurrentSkipListSet; import org.bukkit.Bukkit; +import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.plugin.Plugin; +import com.massivecraft.mcore.EngineAbstract; import com.massivecraft.mcore.MCore; +import com.massivecraft.mcore.event.EventMCorePlayerUpdate; +import com.massivecraft.mcore.event.MCoreAfterPlayerRespawnEvent; +import com.massivecraft.mcore.event.MCoreAfterPlayerTeleportEvent; -public class PlayerUtil implements Listener +public class PlayerUtil extends EngineAbstract { // -------------------------------------------- // // INSTANCE & CONSTRUCT @@ -29,38 +36,72 @@ public class PlayerUtil implements Listener public static PlayerUtil get() { return i; } // -------------------------------------------- // - // FIELDS + // OVERRIDE // -------------------------------------------- // - private static Set joinedPlayerNames = new ConcurrentSkipListSet(String.CASE_INSENSITIVE_ORDER); - - private static Map idToDeath = new HashMap(); - - private static Map idToLastMoveMillis = new HashMap(); - - // -------------------------------------------- // - // SETUP - // -------------------------------------------- // - - public void setup() + @Override + public void activate() { + super.activate(); + idToDeath.clear(); - joinedPlayerNames.clear(); + joinedPlayerIds.clear(); for (Player player : Bukkit.getOnlinePlayers()) { - joinedPlayerNames.add(player.getName()); + joinedPlayerIds.add(player.getUniqueId()); } idToLastMoveMillis.clear(); + } + + @Override + public Plugin getPlugin() + { + return MCore.get(); + } + + // -------------------------------------------- // + // IS JOINED + // -------------------------------------------- // + + private static Set joinedPlayerIds = new ConcurrentSkipListSet(); + + @EventHandler(priority = EventPriority.MONITOR) + public void isJoined(PlayerJoinEvent event) + { + final UUID id = event.getPlayer().getUniqueId(); + Bukkit.getScheduler().scheduleSyncDelayedTask(MCore.get(), new Runnable() + { + @Override + public void run() + { + joinedPlayerIds.add(id); + } + }); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void isJoined(PlayerQuitEvent event) + { + final UUID id = event.getPlayer().getUniqueId(); + joinedPlayerIds.remove(id); + } + + public static boolean isJoined(Player player) + { + if (player == null) throw new NullPointerException("player was null"); + final UUID id = player.getUniqueId(); + return joinedPlayerIds.contains(id); - Bukkit.getPluginManager().registerEvents(this, MCore.get()); } // -------------------------------------------- // // LAST MOVE & STAND STILL (MILLIS) // -------------------------------------------- // + private static Map idToLastMoveMillis = new HashMap(); + public static void setLastMoveMillis(Player player, long millis) { if (player == null) return; @@ -72,6 +113,25 @@ public class PlayerUtil implements Listener setLastMoveMillis(player, System.currentTimeMillis()); } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void setLastMoveMillis(PlayerMoveEvent event) + { + if (MUtil.isSameBlock(event)) return; + setLastMoveMillis(event.getPlayer()); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void setLastMoveMillis(PlayerJoinEvent event) + { + setLastMoveMillis(event.getPlayer()); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void setLastMoveMillis(PlayerChangedWorldEvent event) + { + setLastMoveMillis(event.getPlayer()); + } + public static long getLastMoveMillis(Player player) { if (player == null) return 0; @@ -94,31 +154,14 @@ public class PlayerUtil implements Listener return ret; } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void setLastMoveMillis(PlayerMoveEvent event) - { - if (MUtil.isSameBlock(event)) return; - setLastMoveMillis(event.getPlayer()); - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void setLastMoveMillis(PlayerJoinEvent event) - { - setLastMoveMillis(event.getPlayer()); - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void setLastMoveMillis(PlayerChangedWorldEvent event) - { - setLastMoveMillis(event.getPlayer()); - } - // -------------------------------------------- // // IS DUPLICATE DEATH EVENT // -------------------------------------------- // // Some times when players die the PlayerDeathEvent is fired twice. // We want to ignore the extra calls. + private static Map idToDeath = new HashMap(); + public static boolean isDuplicateDeathEvent(PlayerDeathEvent event) { // Prepare the lowercase name ... @@ -152,37 +195,6 @@ public class PlayerUtil implements Listener isDuplicateDeathEvent(event); } - // -------------------------------------------- // - // IS JOINED - // -------------------------------------------- // - - @EventHandler(priority = EventPriority.MONITOR) - public void joinMonitor(PlayerJoinEvent event) - { - final String playerName = event.getPlayer().getName(); - Bukkit.getScheduler().scheduleSyncDelayedTask(MCore.get(), new Runnable() - { - @Override - public void run() - { - joinedPlayerNames.add(playerName); - } - }); - } - - @EventHandler(priority = EventPriority.MONITOR) - public void quitMonitor(PlayerQuitEvent event) - { - final String playerName = event.getPlayer().getName(); - joinedPlayerNames.remove(playerName); - } - - public static boolean isJoined(Player player) - { - if (player == null) throw new NullPointerException("player was null"); - return joinedPlayerNames.contains(player.getName()); - } - // -------------------------------------------- // // PACKET // -------------------------------------------- // @@ -202,4 +214,245 @@ public class PlayerUtil implements Listener */ } + // -------------------------------------------- // + // SETTINGS BY EVENT + // -------------------------------------------- // + + public static void update(Player player) + { + EventMCorePlayerUpdate event = new EventMCorePlayerUpdate(player); + event.run(); + + setMaxHealth(player, event.getMaxHealth()); + setFlyAllowed(player, event.isFlyAllowed()); + setFlyActive(player, event.isFlyActive()); + setFlySpeed(player, event.getFlySpeed()); + } + + public static void reset(Player player) + { + setMaxHealth(player, getMaxHealthDefault(player)); + setFlyAllowed(player, isFlyAllowedDefault(player)); + setFlyActive(player, isFlyActiveDefault(player)); + setFlySpeed(player, getFlySpeedDefault(player)); + + update(player); + } + + // Can't be cancelled + @EventHandler(priority = EventPriority.LOWEST) + public void reset(PlayerJoinEvent event) + { + // If we have a player ... + Player player = event.getPlayer(); + + // ... and the player is alive ... + if (player.isDead()) return; + + // ... trigger. + reset(player); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void update(MCoreAfterPlayerTeleportEvent event) + { + // If we have a player ... + Player player = event.getPlayer(); + + // ... and the player is alive ... + if (player.isDead()) return; + + // ... trigger. + update(player); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void update(MCoreAfterPlayerRespawnEvent event) + { + // If we have a player ... + Player player = event.getPlayer(); + + // ... and the player is alive ... + if (player.isDead()) return; + + // ... trigger. + update(player); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void update(PlayerChangedWorldEvent event) + { + // If we have a player ... + Player player = event.getPlayer(); + + // ... and the player is alive ... + if (player.isDead()) return; + + // ... trigger. + update(player); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void update(PlayerMoveEvent event) + { + // If we have a player ... + Player player = event.getPlayer(); + + // ... and the player is alive ... + if (player.isDead()) return; + + // ... and the player moved from one block to another ... + if (event.getFrom().getBlock().equals(event.getTo().getBlock())) return; + + // ... trigger. + update(player); + } + + // -------------------------------------------- // + // MAX HEALTH + // -------------------------------------------- // + + public static boolean setMaxHealth(Player player, double maxHealth) + { + // NoChange + if (getMaxHealth(player) == maxHealth) return false; + + // Apply + player.setMaxHealth(maxHealth); + + // Return + return true; + } + + public static double getMaxHealth(Player player) + { + return player.getMaxHealth(); + } + + public static double getMaxHealthDefault(Player player) + { + return 20D; + } + + // -------------------------------------------- // + // FLY: ALLOWED + // -------------------------------------------- // + + public static boolean setFlyAllowed(Player player, boolean allowed) + { + // NoChange + if (isFlyAllowed(player) == allowed) return false; + + // Apply + player.setFallDistance(0); + player.setAllowFlight(allowed); + player.setFallDistance(0); + + // Return + return true; + } + + public static boolean isFlyAllowed(Player player) + { + return player.getAllowFlight(); + } + + public static boolean isFlyAllowedDefault(Player player) + { + return player.getGameMode() == GameMode.CREATIVE; + } + + // -------------------------------------------- // + // FLY: ACTIVE + // -------------------------------------------- // + + public static Map idToLastFlyActive = new HashMap(); + public static Long getLastFlyActive(Player player) + { + return idToLastFlyActive.get(player.getUniqueId()); + } + public static void setLastFlyActive(Player player, Long millis) + { + idToLastFlyActive.put(player.getUniqueId(), millis); + } + + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void negateNoCheatPlusBug(EntityDamageEvent event) + { + // If a player ... + if ( ! (event.getEntity() instanceof Player)) return; + Player player = (Player)event.getEntity(); + + // ... is taking fall damage ... + if (event.getCause() != DamageCause.FALL) return; + + // ... within 2 seconds of flying ... + Long lastActive = getLastFlyActive(player); + if (lastActive == null) return; + if (System.currentTimeMillis() - lastActive > 2000) return; + + // ... cancel the event. + event.setCancelled(true); + } + + public static boolean setFlyActive(Player player, boolean active) + { + // Last Active Update + if (active) + { + setLastFlyActive(player, System.currentTimeMillis()); + } + + // NoChange + if (isFlyActive(player) == active) return false; + + // Apply + player.setFallDistance(0); + player.setFlying(active); + player.setFallDistance(0); + + // Return + return true; + } + + public static boolean isFlyActive(Player player) + { + return player.isFlying(); + } + + public static boolean isFlyActiveDefault(Player player) + { + return player.getGameMode() == GameMode.CREATIVE; + } + + // -------------------------------------------- // + // FLY: SPEED + // -------------------------------------------- // + + public final static float DEFAULT_FLY_SPEED = 0.1f; + + public static boolean setFlySpeed(Player player, float speed) + { + // NoChange + if (getFlySpeed(player) == speed) return false; + + // Apply + player.setFallDistance(0); + player.setFlySpeed(speed); + player.setFallDistance(0); + + // Return + return true; + } + + public static float getFlySpeed(Player player) + { + return player.getFlySpeed(); + } + + public static float getFlySpeedDefault(Player player) + { + return DEFAULT_FLY_SPEED; + } + } diff --git a/src/com/massivecraft/mcore/util/extractor/ExtractorLogic.java b/src/com/massivecraft/mcore/util/extractor/ExtractorLogic.java index 7dcfe716..5f3b1083 100644 --- a/src/com/massivecraft/mcore/util/extractor/ExtractorLogic.java +++ b/src/com/massivecraft/mcore/util/extractor/ExtractorLogic.java @@ -86,6 +86,17 @@ public class ExtractorLogic return null; } + // -------------------------------------------- // + // PLAYER + // -------------------------------------------- // + + public static Player playerFromObject(Object o) + { + CommandSender sender = senderFromObject(o); + if (sender instanceof Player) return (Player)sender; + return null; + } + // -------------------------------------------- // // SENDER ID // -------------------------------------------- // @@ -104,14 +115,20 @@ public class ExtractorLogic } // -------------------------------------------- // - // PLAYER + // SENDER NAME // -------------------------------------------- // - public static Player playerFromObject(Object o) + public static String senderNameFromObject(Object o) { + if (o == null) return null; + + String name = IdUtil.getName(o); + if (name != null) return name; + CommandSender sender = senderFromObject(o); - if (sender instanceof Player) return (Player)sender; - return null; + if (sender == null) return null; + + return IdUtil.getName(sender); } // -------------------------------------------- // @@ -120,7 +137,7 @@ public class ExtractorLogic public static String playerNameFromObject(Object o) { - String senderId = senderIdFromObject(o); + String senderId = senderNameFromObject(o); //if (SenderUtil.isPlayerId(senderId)) return senderId; //return null; return senderId; diff --git a/src/com/massivecraft/mcore/util/extractor/ExtractorSenderName.java b/src/com/massivecraft/mcore/util/extractor/ExtractorSenderName.java new file mode 100644 index 00000000..b0c76494 --- /dev/null +++ b/src/com/massivecraft/mcore/util/extractor/ExtractorSenderName.java @@ -0,0 +1,22 @@ +package com.massivecraft.mcore.util.extractor; + +public class ExtractorSenderName implements Extractor +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static ExtractorSenderName i = new ExtractorSenderName(); + public static ExtractorSenderName get() { return i; } + + // -------------------------------------------- // + // OVERRIDE: EXTRACTOR + // -------------------------------------------- // + + @Override + public Object extract(Object o) + { + return ExtractorLogic.senderNameFromObject(o); + } + +}