From 6eb877d340d3dcfebcfba305f6c8ed3ee4e57b6d Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Thu, 19 Nov 2015 21:47:41 +0100 Subject: [PATCH] Improved the player update event system. --- .../massivecraft/massivecore/MassiveCore.java | 17 +- .../massivecore/CmdMassiveCoreBufferAdd.java | 6 +- .../CmdMassiveCoreBufferClear.java | 4 +- .../CmdMassiveCoreBufferPrint.java | 4 +- .../massivecore/CmdMassiveCoreBufferSet.java | 4 +- .../CmdMassiveCoreBufferWhitespace.java | 6 +- .../command/type/TypeStringCommand.java | 6 +- ...EngineMassiveCoreCommandRegistration.java} | 10 +- .../EngineMassiveCoreDestination.java} | 11 +- .../EngineMassiveCoreMain.java} | 15 +- .../engine/EngineMassiveCorePlayerUpdate.java | 140 ++++++++++ .../EngineMassiveCoreVariable.java} | 12 +- .../EngineMassiveCoreWorldNameSet.java} | 11 +- .../event/EventMassiveCorePlayerUpdate.java | 242 ++++++++++++++++- .../massivecraft/massivecore/util/MUtil.java | 10 +- .../massivecore/util/PlayerUtil.java | 257 ------------------ 16 files changed, 447 insertions(+), 308 deletions(-) rename src/com/massivecraft/massivecore/{MassiveCoreEngineCommandRegistration.java => engine/EngineMassiveCoreCommandRegistration.java} (90%) rename src/com/massivecraft/massivecore/{MassiveCoreEngineDestination.java => engine/EngineMassiveCoreDestination.java} (92%) rename src/com/massivecraft/massivecore/{MassiveCoreEngineMain.java => engine/EngineMassiveCoreMain.java} (93%) create mode 100644 src/com/massivecraft/massivecore/engine/EngineMassiveCorePlayerUpdate.java rename src/com/massivecraft/massivecore/{MassiveCoreEngineVariable.java => engine/EngineMassiveCoreVariable.java} (87%) rename src/com/massivecraft/massivecore/{MassiveCoreEngineWorldNameSet.java => engine/EngineMassiveCoreWorldNameSet.java} (79%) diff --git a/src/com/massivecraft/massivecore/MassiveCore.java b/src/com/massivecraft/massivecore/MassiveCore.java index 4fa6d8aa..16e8ea13 100644 --- a/src/com/massivecraft/massivecore/MassiveCore.java +++ b/src/com/massivecraft/massivecore/MassiveCore.java @@ -44,6 +44,12 @@ import com.massivecraft.massivecore.command.massivecore.CmdMassiveCoreBuffer; import com.massivecraft.massivecore.command.massivecore.CmdMassiveCoreCmdurl; import com.massivecraft.massivecore.command.massivecore.CmdMassiveCoreStore; import com.massivecraft.massivecore.command.massivecore.CmdMassiveCoreUsys; +import com.massivecraft.massivecore.engine.EngineMassiveCoreCommandRegistration; +import com.massivecraft.massivecore.engine.EngineMassiveCoreDestination; +import com.massivecraft.massivecore.engine.EngineMassiveCoreMain; +import com.massivecraft.massivecore.engine.EngineMassiveCorePlayerUpdate; +import com.massivecraft.massivecore.engine.EngineMassiveCoreVariable; +import com.massivecraft.massivecore.engine.EngineMassiveCoreWorldNameSet; import com.massivecraft.massivecore.integration.vault.IntegrationVault; import com.massivecraft.massivecore.mixin.EngineTeleportMixinCause; import com.massivecraft.massivecore.mson.Mson; @@ -184,13 +190,14 @@ public class MassiveCore extends MassivePlugin // Engine EngineCollTick.get().activate(); - MassiveCoreEngineMain.get().activate(); - MassiveCoreEngineVariable.get().activate(); + EngineMassiveCoreMain.get().activate(); + EngineMassiveCoreVariable.get().activate(); EngineScheduledTeleport.get().activate(); EngineTeleportMixinCause.get().activate(); - MassiveCoreEngineWorldNameSet.get().activate(); - MassiveCoreEngineCommandRegistration.get().activate(); - MassiveCoreEngineDestination.get().activate(); + EngineMassiveCoreWorldNameSet.get().activate(); + EngineMassiveCoreCommandRegistration.get().activate(); + EngineMassiveCoreDestination.get().activate(); + EngineMassiveCorePlayerUpdate.get().activate(); PlayerUtil.get().activate(); EngineChestGui.get().activate(); EngineGank.get().activate(); diff --git a/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferAdd.java b/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferAdd.java index 8a7b3871..00f55d54 100644 --- a/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferAdd.java +++ b/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferAdd.java @@ -1,11 +1,11 @@ package com.massivecraft.massivecore.command.massivecore; -import com.massivecraft.massivecore.MassiveCoreEngineVariable; import com.massivecraft.massivecore.MassiveCorePerm; import com.massivecraft.massivecore.MassiveException; import com.massivecraft.massivecore.command.MassiveCommand; import com.massivecraft.massivecore.command.requirement.RequirementHasPerm; import com.massivecraft.massivecore.command.type.primitive.TypeString; +import com.massivecraft.massivecore.engine.EngineMassiveCoreVariable; public class CmdMassiveCoreBufferAdd extends MassiveCommand { @@ -34,9 +34,9 @@ public class CmdMassiveCoreBufferAdd extends MassiveCommand { String string = this.readArg(); - String buffer = MassiveCoreEngineVariable.getBuffer(sender); + String buffer = EngineMassiveCoreVariable.getBuffer(sender); buffer += string; - MassiveCoreEngineVariable.setBuffer(sender, buffer); + EngineMassiveCoreVariable.setBuffer(sender, buffer); msg("Buffer Add"); } diff --git a/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferClear.java b/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferClear.java index 7c1fdec3..1a85d301 100644 --- a/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferClear.java +++ b/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferClear.java @@ -1,9 +1,9 @@ package com.massivecraft.massivecore.command.massivecore; -import com.massivecraft.massivecore.MassiveCoreEngineVariable; import com.massivecraft.massivecore.MassiveCorePerm; import com.massivecraft.massivecore.command.MassiveCommand; import com.massivecraft.massivecore.command.requirement.RequirementHasPerm; +import com.massivecraft.massivecore.engine.EngineMassiveCoreVariable; public class CmdMassiveCoreBufferClear extends MassiveCommand { @@ -27,7 +27,7 @@ public class CmdMassiveCoreBufferClear extends MassiveCommand @Override public void perform() { - MassiveCoreEngineVariable.setBuffer(sender, ""); + EngineMassiveCoreVariable.setBuffer(sender, ""); msg("Buffer Clear"); } diff --git a/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferPrint.java b/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferPrint.java index 27541a0e..b1f76fef 100644 --- a/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferPrint.java +++ b/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferPrint.java @@ -1,9 +1,9 @@ package com.massivecraft.massivecore.command.massivecore; -import com.massivecraft.massivecore.MassiveCoreEngineVariable; import com.massivecraft.massivecore.MassiveCorePerm; import com.massivecraft.massivecore.command.MassiveCommand; import com.massivecraft.massivecore.command.requirement.RequirementHasPerm; +import com.massivecraft.massivecore.engine.EngineMassiveCoreVariable; public class CmdMassiveCoreBufferPrint extends MassiveCommand { @@ -27,7 +27,7 @@ public class CmdMassiveCoreBufferPrint extends MassiveCommand @Override public void perform() { - String buffer = MassiveCoreEngineVariable.getBuffer(sender); + String buffer = EngineMassiveCoreVariable.getBuffer(sender); if (buffer == null || buffer.length() == 0) { msg("Nothing to print. Your buffer is empty."); diff --git a/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferSet.java b/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferSet.java index ed41addf..bc2f5818 100644 --- a/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferSet.java +++ b/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferSet.java @@ -1,11 +1,11 @@ package com.massivecraft.massivecore.command.massivecore; -import com.massivecraft.massivecore.MassiveCoreEngineVariable; import com.massivecraft.massivecore.MassiveCorePerm; import com.massivecraft.massivecore.MassiveException; import com.massivecraft.massivecore.command.MassiveCommand; import com.massivecraft.massivecore.command.requirement.RequirementHasPerm; import com.massivecraft.massivecore.command.type.primitive.TypeString; +import com.massivecraft.massivecore.engine.EngineMassiveCoreVariable; public class CmdMassiveCoreBufferSet extends MassiveCommand { @@ -34,7 +34,7 @@ public class CmdMassiveCoreBufferSet extends MassiveCommand { String string = this.readArg(); - MassiveCoreEngineVariable.setBuffer(sender, string); + EngineMassiveCoreVariable.setBuffer(sender, string); msg("Buffer was Set"); } diff --git a/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferWhitespace.java b/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferWhitespace.java index 6064e3ed..75dc2ecc 100644 --- a/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferWhitespace.java +++ b/src/com/massivecraft/massivecore/command/massivecore/CmdMassiveCoreBufferWhitespace.java @@ -1,11 +1,11 @@ package com.massivecraft.massivecore.command.massivecore; -import com.massivecraft.massivecore.MassiveCoreEngineVariable; import com.massivecraft.massivecore.MassiveCorePerm; import com.massivecraft.massivecore.MassiveException; import com.massivecraft.massivecore.command.MassiveCommand; import com.massivecraft.massivecore.command.requirement.RequirementHasPerm; import com.massivecraft.massivecore.command.type.primitive.TypeInteger; +import com.massivecraft.massivecore.engine.EngineMassiveCoreVariable; import com.massivecraft.massivecore.util.Txt; public class CmdMassiveCoreBufferWhitespace extends MassiveCommand @@ -37,9 +37,9 @@ public class CmdMassiveCoreBufferWhitespace extends MassiveCommand String string = Txt.repeat(" ", times); - String buffer = MassiveCoreEngineVariable.getBuffer(sender); + String buffer = EngineMassiveCoreVariable.getBuffer(sender); buffer += string; - MassiveCoreEngineVariable.setBuffer(sender, buffer); + EngineMassiveCoreVariable.setBuffer(sender, buffer); msg("Buffer Whitespace"); } diff --git a/src/com/massivecraft/massivecore/command/type/TypeStringCommand.java b/src/com/massivecraft/massivecore/command/type/TypeStringCommand.java index ecb7a087..3504e581 100644 --- a/src/com/massivecraft/massivecore/command/type/TypeStringCommand.java +++ b/src/com/massivecraft/massivecore/command/type/TypeStringCommand.java @@ -11,9 +11,9 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.SimpleCommandMap; -import com.massivecraft.massivecore.MassiveCoreEngineCommandRegistration; import com.massivecraft.massivecore.MassiveException; import com.massivecraft.massivecore.collections.MassiveList; +import com.massivecraft.massivecore.engine.EngineMassiveCoreCommandRegistration; import com.massivecraft.massivecore.util.Txt; // We operate without the leading slash as much as possible. @@ -111,8 +111,8 @@ public class TypeStringCommand extends TypeAbstract public static Map getKnownCommands() { - SimpleCommandMap simpleCommandMap = MassiveCoreEngineCommandRegistration.getSimpleCommandMap(); - Map knownCommands = MassiveCoreEngineCommandRegistration.getSimpleCommandMapDotKnownCommands(simpleCommandMap); + SimpleCommandMap simpleCommandMap = EngineMassiveCoreCommandRegistration.getSimpleCommandMap(); + Map knownCommands = EngineMassiveCoreCommandRegistration.getSimpleCommandMapDotKnownCommands(simpleCommandMap); return knownCommands; } diff --git a/src/com/massivecraft/massivecore/MassiveCoreEngineCommandRegistration.java b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreCommandRegistration.java similarity index 90% rename from src/com/massivecraft/massivecore/MassiveCoreEngineCommandRegistration.java rename to src/com/massivecraft/massivecore/engine/EngineMassiveCoreCommandRegistration.java index 08e570dd..d6a1572c 100644 --- a/src/com/massivecraft/massivecore/MassiveCoreEngineCommandRegistration.java +++ b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreCommandRegistration.java @@ -1,4 +1,4 @@ -package com.massivecraft.massivecore; +package com.massivecraft.massivecore.engine; import java.lang.reflect.Field; import java.util.HashMap; @@ -12,18 +12,20 @@ import org.bukkit.command.Command; import org.bukkit.command.SimpleCommandMap; import org.bukkit.plugin.Plugin; +import com.massivecraft.massivecore.EngineAbstract; +import com.massivecraft.massivecore.MassiveCore; import com.massivecraft.massivecore.command.MassiveCommand; import com.massivecraft.massivecore.command.MassiveCoreBukkitCommand; import com.massivecraft.massivecore.util.ReflectionUtil; -public class MassiveCoreEngineCommandRegistration extends EngineAbstract +public class EngineMassiveCoreCommandRegistration extends EngineAbstract { // -------------------------------------------- // // INSTANCE & CONSTRUCT // -------------------------------------------- // - private static MassiveCoreEngineCommandRegistration i = new MassiveCoreEngineCommandRegistration(); - public static MassiveCoreEngineCommandRegistration get() { return i; } + private static EngineMassiveCoreCommandRegistration i = new EngineMassiveCoreCommandRegistration(); + public static EngineMassiveCoreCommandRegistration get() { return i; } // -------------------------------------------- // // OVERRIDE diff --git a/src/com/massivecraft/massivecore/MassiveCoreEngineDestination.java b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreDestination.java similarity index 92% rename from src/com/massivecraft/massivecore/MassiveCoreEngineDestination.java rename to src/com/massivecraft/massivecore/engine/EngineMassiveCoreDestination.java index 646f9bcc..0a06f273 100644 --- a/src/com/massivecraft/massivecore/MassiveCoreEngineDestination.java +++ b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreDestination.java @@ -1,4 +1,4 @@ -package com.massivecraft.massivecore; +package com.massivecraft.massivecore.engine; import java.util.Arrays; import java.util.List; @@ -11,6 +11,9 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.plugin.Plugin; +import com.massivecraft.massivecore.EngineAbstract; +import com.massivecraft.massivecore.MassiveCore; +import com.massivecraft.massivecore.MassiveException; import com.massivecraft.massivecore.collections.MassiveSet; import com.massivecraft.massivecore.command.type.TypePS; import com.massivecraft.massivecore.command.type.TypeWorldId; @@ -28,14 +31,14 @@ import com.massivecraft.massivecore.teleport.DestinationUtil; import com.massivecraft.massivecore.teleport.DestinationWorld; import com.massivecraft.massivecore.util.IdUtil; -public class MassiveCoreEngineDestination extends EngineAbstract +public class EngineMassiveCoreDestination extends EngineAbstract { // -------------------------------------------- // // INSTANCE & CONSTRUCT // -------------------------------------------- // - private static MassiveCoreEngineDestination i = new MassiveCoreEngineDestination(); - public static MassiveCoreEngineDestination get() { return i; } + private static EngineMassiveCoreDestination i = new EngineMassiveCoreDestination(); + public static EngineMassiveCoreDestination get() { return i; } // -------------------------------------------- // // OVERRIDE diff --git a/src/com/massivecraft/massivecore/MassiveCoreEngineMain.java b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreMain.java similarity index 93% rename from src/com/massivecraft/massivecore/MassiveCoreEngineMain.java rename to src/com/massivecraft/massivecore/engine/EngineMassiveCoreMain.java index 8a9c379e..24f7683d 100644 --- a/src/com/massivecraft/massivecore/MassiveCoreEngineMain.java +++ b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreMain.java @@ -1,4 +1,4 @@ -package com.massivecraft.massivecore; +package com.massivecraft.massivecore.engine; import java.util.HashMap; import java.util.HashSet; @@ -27,6 +27,13 @@ import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.plugin.Plugin; +import com.massivecraft.massivecore.EngineAbstract; +import com.massivecraft.massivecore.MassiveCore; +import com.massivecraft.massivecore.MassiveCoreMConf; +import com.massivecraft.massivecore.Predicate; +import com.massivecraft.massivecore.PredicateStartsWithIgnoreCase; +import com.massivecraft.massivecore.SenderPresence; +import com.massivecraft.massivecore.SenderType; import com.massivecraft.massivecore.collections.MassiveMap; import com.massivecraft.massivecore.event.EventMassiveCoreAfterPlayerRespawn; import com.massivecraft.massivecore.event.EventMassiveCoreAfterPlayerTeleport; @@ -43,14 +50,14 @@ import com.massivecraft.massivecore.util.MUtil; import com.massivecraft.massivecore.util.SmokeUtil; import com.massivecraft.massivecore.xlib.gson.JsonElement; -public class MassiveCoreEngineMain extends EngineAbstract +public class EngineMassiveCoreMain extends EngineAbstract { // -------------------------------------------- // // INSTANCE & CONSTRUCT // -------------------------------------------- // - private static MassiveCoreEngineMain i = new MassiveCoreEngineMain(); - public static MassiveCoreEngineMain get() { return i; } + private static EngineMassiveCoreMain i = new EngineMassiveCoreMain(); + public static EngineMassiveCoreMain get() { return i; } // -------------------------------------------- // // OVERRIDE diff --git a/src/com/massivecraft/massivecore/engine/EngineMassiveCorePlayerUpdate.java b/src/com/massivecraft/massivecore/engine/EngineMassiveCorePlayerUpdate.java new file mode 100644 index 00000000..5ccb4906 --- /dev/null +++ b/src/com/massivecraft/massivecore/engine/EngineMassiveCorePlayerUpdate.java @@ -0,0 +1,140 @@ +package com.massivecraft.massivecore.engine; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageEvent; +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.plugin.Plugin; + +import com.massivecraft.massivecore.EngineAbstract; +import com.massivecraft.massivecore.MassiveCore; +import com.massivecraft.massivecore.event.EventMassiveCoreAfterPlayerRespawn; +import com.massivecraft.massivecore.event.EventMassiveCoreAfterPlayerTeleport; +import com.massivecraft.massivecore.event.EventMassiveCorePlayerUpdate; +import com.massivecraft.massivecore.util.MUtil; + +/** + * This event triggers the EventMassiveCorePlayerUpdate on every block change. + * It also runs it in reset mode rather than update mode upon world change. + */ +public class EngineMassiveCorePlayerUpdate extends EngineAbstract +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static EngineMassiveCorePlayerUpdate i = new EngineMassiveCorePlayerUpdate(); + public static EngineMassiveCorePlayerUpdate get() { return i; } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public Plugin getPlugin() + { + return MassiveCore.get(); + } + + // -------------------------------------------- // + // UPDATE + // -------------------------------------------- // + + public static void update(Player player, boolean current) + { + // If this player is actually a player and not an NPC ... + if (MUtil.isntPlayer(player)) return; + + // ... and the player is alive ... + if (player.isDead()) return; + + // ... store data for no cheat plus bug fix ... + if (player.isFlying()) + { + setLastFlyActive(player, System.currentTimeMillis()); + } + + // ... then trigger an update. + EventMassiveCorePlayerUpdate.run(player, current); + } + + // We reset to default values as early as we can on join. + // This is for the sake of security. + // Old insane values left in the player dat files will be reset. + // If they were wanted they will have to be redeclared by the responsible plugin again. + // NOTE: Can't be cancelled + @EventHandler(priority = EventPriority.LOWEST) + public void update(PlayerJoinEvent event) + { + update(event.getPlayer(), false); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void update(EventMassiveCoreAfterPlayerTeleport event) + { + update(event.getPlayer(), true); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void update(EventMassiveCoreAfterPlayerRespawn event) + { + update(event.getPlayer(), true); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void update(PlayerChangedWorldEvent event) + { + update(event.getPlayer(), true); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void update(PlayerMoveEvent event) + { + // Only on block change! + if (MUtil.isSameBlock(event)) return; + + update(event.getPlayer(), true); + } + + // -------------------------------------------- // + // FIX NO CHEAT PLUS BUG + // -------------------------------------------- // + + 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 fixNoCheatPlusBug(EntityDamageEvent event) + { + // If a player ... + if (MUtil.isntPlayer(event.getEntity())) 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); + } + +} diff --git a/src/com/massivecraft/massivecore/MassiveCoreEngineVariable.java b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreVariable.java similarity index 87% rename from src/com/massivecraft/massivecore/MassiveCoreEngineVariable.java rename to src/com/massivecraft/massivecore/engine/EngineMassiveCoreVariable.java index 654ecf1c..b9686381 100644 --- a/src/com/massivecraft/massivecore/MassiveCoreEngineVariable.java +++ b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreVariable.java @@ -1,4 +1,4 @@ -package com.massivecraft.massivecore; +package com.massivecraft.massivecore.engine; import java.util.HashMap; import java.util.List; @@ -17,18 +17,22 @@ import org.bukkit.inventory.meta.BookMeta; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.Plugin; +import com.massivecraft.massivecore.EngineAbstract; +import com.massivecraft.massivecore.MassiveCore; +import com.massivecraft.massivecore.MassiveCoreMConf; +import com.massivecraft.massivecore.MassiveCorePerm; import com.massivecraft.massivecore.util.IdUtil; import com.massivecraft.massivecore.util.MUtil; import com.massivecraft.massivecore.util.Txt; -public class MassiveCoreEngineVariable extends EngineAbstract +public class EngineMassiveCoreVariable extends EngineAbstract { // -------------------------------------------- // // INSTANCE & CONSTRUCT // -------------------------------------------- // - private static MassiveCoreEngineVariable i = new MassiveCoreEngineVariable(); - public static MassiveCoreEngineVariable get() { return i; } + private static EngineMassiveCoreVariable i = new EngineMassiveCoreVariable(); + public static EngineMassiveCoreVariable get() { return i; } // -------------------------------------------- // // OVERRIDE diff --git a/src/com/massivecraft/massivecore/MassiveCoreEngineWorldNameSet.java b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreWorldNameSet.java similarity index 79% rename from src/com/massivecraft/massivecore/MassiveCoreEngineWorldNameSet.java rename to src/com/massivecraft/massivecore/engine/EngineMassiveCoreWorldNameSet.java index c39350fd..422afc33 100644 --- a/src/com/massivecraft/massivecore/MassiveCoreEngineWorldNameSet.java +++ b/src/com/massivecraft/massivecore/engine/EngineMassiveCoreWorldNameSet.java @@ -1,4 +1,4 @@ -package com.massivecraft.massivecore; +package com.massivecraft.massivecore.engine; import java.util.Collections; import java.util.Set; @@ -12,14 +12,17 @@ import org.bukkit.event.world.WorldLoadEvent; import org.bukkit.event.world.WorldUnloadEvent; import org.bukkit.plugin.Plugin; -public class MassiveCoreEngineWorldNameSet extends EngineAbstract +import com.massivecraft.massivecore.EngineAbstract; +import com.massivecraft.massivecore.MassiveCore; + +public class EngineMassiveCoreWorldNameSet extends EngineAbstract { // -------------------------------------------- // // INSTANCE & CONSTRUCT // -------------------------------------------- // - private static MassiveCoreEngineWorldNameSet i = new MassiveCoreEngineWorldNameSet(); - public static MassiveCoreEngineWorldNameSet get() { return i; } + private static EngineMassiveCoreWorldNameSet i = new EngineMassiveCoreWorldNameSet(); + public static EngineMassiveCoreWorldNameSet get() { return i; } // -------------------------------------------- // // OVERRIDE diff --git a/src/com/massivecraft/massivecore/event/EventMassiveCorePlayerUpdate.java b/src/com/massivecraft/massivecore/event/EventMassiveCorePlayerUpdate.java index b9c782a1..d943e4b9 100644 --- a/src/com/massivecraft/massivecore/event/EventMassiveCorePlayerUpdate.java +++ b/src/com/massivecraft/massivecore/event/EventMassiveCorePlayerUpdate.java @@ -1,10 +1,26 @@ package com.massivecraft.massivecore.event; +import java.util.Set; + +import org.bukkit.entity.Damageable; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; -import com.massivecraft.massivecore.util.PlayerUtil; +import com.massivecraft.massivecore.collections.MassiveSet; +import com.massivecraft.massivecore.util.MUtil; +/** + * The purpose of this event is to allow multiple plugins to have a say about these player properties. + * + * It would have been great if the properties were event driven themselves. + * Meaning Bukkit could run an event to calculate the value every time it was asked for. + * That is however not the case. + * + * So instead I trigger this event every once. + * This is done from EngineMassiveCorePlayerUpdate. + * + * The plugins wanting to have a say about the values can just listen to this event at the priority they want and modify values they care for. + */ public class EventMassiveCorePlayerUpdate extends EventMassiveCore { // -------------------------------------------- // @@ -38,17 +54,231 @@ public class EventMassiveCorePlayerUpdate extends EventMassiveCore public float getFlySpeed() { return this.flySpeed; } public void setFlySpeed(float flySpeed) { this.flySpeed = flySpeed; } + private float walkSpeed; + public float getWalkSpeed() { return this.walkSpeed; } + public void setWalkSpeed(float walkSpeed) { this.walkSpeed = walkSpeed; } + // -------------------------------------------- // // CONSTRUCT // -------------------------------------------- // + // The boolean current decides if we use the current values or the default ones. + // With current true it will be an "update". + // With current false it will be a "reset". - public EventMassiveCorePlayerUpdate(Player player) + public EventMassiveCorePlayerUpdate(Player player, boolean current) { this.player = player; - this.maxHealth = PlayerUtil.getMaxHealth(player); - this.flyAllowed = PlayerUtil.isFlyAllowed(player); - this.flyActive = PlayerUtil.isFlyActive(player); - this.flySpeed = PlayerUtil.getFlySpeed(player); + + this.maxHealth = getMaxHealth(player, current); + this.flyAllowed = isFlyAllowed(player, current); + this.flyActive = isFlyActive(player, current); + this.flySpeed = getFlySpeed(player, current); + this.walkSpeed = getWalkSpeed(player, current); + } + + // -------------------------------------------- // + // RUN + // -------------------------------------------- // + + public static void run(Player player, boolean current) + { + if (MUtil.isntPlayer(player)) return; + + EventMassiveCorePlayerUpdate event = new EventMassiveCorePlayerUpdate(player, current); + event.run(); + + setMaxHealth(player, event.getMaxHealth()); + setFlyAllowed(player, event.isFlyAllowed()); + setFlyActive(player, event.isFlyActive()); + setFlySpeed(player, event.getFlySpeed()); + setWalkSpeed(player, event.getWalkSpeed()); + } + + public static void run(Player player) + { + run(player, true); + } + + // -------------------------------------------- // + // 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, boolean current) + { + if ( ! current) return 20D; + + Damageable d = (Damageable) player; + return d.getMaxHealth(); + } + + public static double getMaxHealth(Player player) + { + return getMaxHealth(player, true); + } + + public static boolean resetMaxHealth(Player player) + { + return setMaxHealth(player, getMaxHealth(player, false)); + } + + // -------------------------------------------- // + // FLY ALLOWED + // -------------------------------------------- // + + // For backwards version compatibility we use the enumeration names rather than the enumerations themselves. + public static Set FLY_DEFAULT_GAME_MODE_NAMES = new MassiveSet( + "CREATIVE", + "SPECTATOR" + ); + + 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, boolean current) + { + if ( ! current) return FLY_DEFAULT_GAME_MODE_NAMES.contains(player.getGameMode().name()); + + return player.getAllowFlight(); + } + + public static boolean isFlyAllowed(Player player) + { + return isFlyAllowed(player, true); + } + + public static boolean resetFlyAllowed(Player player) + { + return setFlyAllowed(player, isFlyAllowed(player, false)); + } + + // -------------------------------------------- // + // FLY ACTIVE + // -------------------------------------------- // + + public static boolean setFlyActive(Player player, boolean active) + { + // 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, boolean current) + { + if ( ! current) return FLY_DEFAULT_GAME_MODE_NAMES.contains(player.getGameMode().name()); + + return player.isFlying(); + } + + public static boolean isFlyActive(Player player) + { + return isFlyActive(player, true); + } + + public static boolean resetFlyActive(Player player) + { + return setFlyActive(player, isFlyActive(player, false)); + } + + // -------------------------------------------- // + // 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, boolean current) + { + if ( ! current) return DEFAULT_FLY_SPEED; + + return player.getFlySpeed(); + } + + public static float getFlySpeed(Player player) + { + return getFlySpeed(player, true); + } + + public static boolean resetFlySpeed(Player player) + { + return setFlySpeed(player, getFlySpeed(player, false)); + } + + // -------------------------------------------- // + // WALK SPEED + // -------------------------------------------- // + + public final static float DEFAULT_WALK_SPEED = 0.2f; + + public static boolean setWalkSpeed(Player player, float speed) + { + // NoChange + if (getWalkSpeed(player) == speed) return false; + + // Apply + player.setWalkSpeed(speed); + + // Return + return true; + } + + public static float getWalkSpeed(Player player, boolean current) + { + if ( ! current) return DEFAULT_WALK_SPEED; + + return player.getWalkSpeed(); + } + + public static float getWalkSpeed(Player player) + { + return getWalkSpeed(player, true); + } + + public static boolean resetWalkSpeed(Player player) + { + return setWalkSpeed(player, getWalkSpeed(player, false)); } } diff --git a/src/com/massivecraft/massivecore/util/MUtil.java b/src/com/massivecraft/massivecore/util/MUtil.java index fb4cdaea..876964d9 100644 --- a/src/com/massivecraft/massivecore/util/MUtil.java +++ b/src/com/massivecraft/massivecore/util/MUtil.java @@ -59,12 +59,12 @@ import org.bukkit.projectiles.ProjectileSource; import com.massivecraft.massivecore.CaseInsensitiveComparator; import com.massivecraft.massivecore.MassiveCore; -import com.massivecraft.massivecore.MassiveCoreEngineMain; -import com.massivecraft.massivecore.MassiveCoreEngineWorldNameSet; import com.massivecraft.massivecore.Predicate; import com.massivecraft.massivecore.collections.MassiveList; import com.massivecraft.massivecore.collections.MassiveSet; import com.massivecraft.massivecore.collections.MassiveTreeSet; +import com.massivecraft.massivecore.engine.EngineMassiveCoreMain; +import com.massivecraft.massivecore.engine.EngineMassiveCoreWorldNameSet; import com.massivecraft.massivecore.util.extractor.Extractor; import com.massivecraft.massivecore.util.extractor.ExtractorPlayer; import com.massivecraft.massivecore.util.extractor.ExtractorPlayerName; @@ -224,7 +224,7 @@ public class MUtil if (address != null) return getIp(address); String id = IdUtil.getId(player); - PlayerLoginEvent event = MassiveCoreEngineMain.idToPlayerLoginEvent.get(id); + PlayerLoginEvent event = EngineMassiveCoreMain.idToPlayerLoginEvent.get(id); if (event != null) return getIp(event); return null; @@ -1178,7 +1178,7 @@ public class MUtil if (MUtil.isntPlayer(player)) return null; UUID uuid = player.getUniqueId(); - return MassiveCoreEngineMain.kickedPlayerReasons.get(uuid); + return EngineMassiveCoreMain.kickedPlayerReasons.get(uuid); } public static boolean causedByKick(PlayerQuitEvent event) @@ -1282,7 +1282,7 @@ public class MUtil public static Set getLoadedWorldNames() { - return MassiveCoreEngineWorldNameSet.get().getWorldNames(); + return EngineMassiveCoreWorldNameSet.get().getWorldNames(); } // -------------------------------------------- // diff --git a/src/com/massivecraft/massivecore/util/PlayerUtil.java b/src/com/massivecraft/massivecore/util/PlayerUtil.java index 0ac2feb2..6d12f34d 100644 --- a/src/com/massivecraft/massivecore/util/PlayerUtil.java +++ b/src/com/massivecraft/massivecore/util/PlayerUtil.java @@ -7,8 +7,6 @@ import java.util.UUID; import java.util.concurrent.ConcurrentSkipListSet; import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.entity.Damageable; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -16,7 +14,6 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerAnimationEvent; import org.bukkit.event.player.PlayerAnimationType; import org.bukkit.event.player.PlayerChangedWorldEvent; @@ -28,9 +25,6 @@ import org.bukkit.plugin.Plugin; import com.massivecraft.massivecore.EngineAbstract; import com.massivecraft.massivecore.MassiveCore; -import com.massivecraft.massivecore.event.EventMassiveCorePlayerUpdate; -import com.massivecraft.massivecore.event.EventMassiveCoreAfterPlayerRespawn; -import com.massivecraft.massivecore.event.EventMassiveCoreAfterPlayerTeleport; public class PlayerUtil extends EngineAbstract { @@ -362,255 +356,4 @@ public class PlayerUtil extends EngineAbstract */ } - // -------------------------------------------- // - // SETTINGS BY EVENT - // -------------------------------------------- // - - public static void update(Player player) - { - if (MUtil.isntPlayer(player)) return; - - EventMassiveCorePlayerUpdate event = new EventMassiveCorePlayerUpdate(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) - { - if (MUtil.isntPlayer(player)) return; - - 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(); - if (MUtil.isntPlayer(player)) return; - - // ... and the player is alive ... - if (player.isDead()) return; - - // ... trigger. - reset(player); - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void update(EventMassiveCoreAfterPlayerTeleport event) - { - // If we have a player ... - Player player = event.getPlayer(); - if (MUtil.isntPlayer(player)) return; - - // ... and the player is alive ... - if (player.isDead()) return; - - // ... trigger. - update(player); - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void update(EventMassiveCoreAfterPlayerRespawn event) - { - // If we have a player ... - Player player = event.getPlayer(); - if (MUtil.isntPlayer(player)) return; - - // ... 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(); - if (MUtil.isntPlayer(player)) return; - - // ... 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(); - if (MUtil.isntPlayer(player)) return; - - // ... 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) - { - Damageable d = (Damageable) player; - return d.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; - } - }