From 801d1f6643f882337a4411c7afa8516e5d98d69d Mon Sep 17 00:00:00 2001 From: Cxom Date: Thu, 20 Dec 2018 06:35:03 -0500 Subject: [PATCH] Refactor HealthPad and ElytraPad --- .../trinoxtion/movement/MovementSystem.java | 19 ++-- .../trinoxtion/movement/pads/ElytraPad.java | 88 +++++++++++-------- .../trinoxtion/movement/pads/HealthPad.java | 61 ++++++------- 3 files changed, 85 insertions(+), 83 deletions(-) diff --git a/src/com/trinoxtion/movement/MovementSystem.java b/src/com/trinoxtion/movement/MovementSystem.java index 7bc6acb..44033fc 100644 --- a/src/com/trinoxtion/movement/MovementSystem.java +++ b/src/com/trinoxtion/movement/MovementSystem.java @@ -24,16 +24,11 @@ public void addPlayer(Player player){ }; - //Both????? - private Set mcs = new HashSet<>(); - - + private Set movementComponents = new HashSet<>(); //----------CONSTRUTCTOR---------------// - public MovementSystem(MovementComponent... mcs){ - - this.mcs.addAll(Arrays.asList(mcs)); - + public MovementSystem(MovementComponent... movementComponents){ + this.movementComponents.addAll(Arrays.asList(movementComponents)); MovementPlusPlus.registerEvents(this); } //-------------------------------------// @@ -53,7 +48,7 @@ public void removePlayer(UUID uuid) { } private void removePlayer(MovementPlayer mp){ - mcs.forEach(mcs -> mcs.onQuit(mp)); + movementComponents.forEach(mcs -> mcs.onQuit(mp)); mp.restore(); MovementPlusPlus.deregisterPlayer(mp.getUUID()); } @@ -63,7 +58,7 @@ private void removePlayer(MovementPlayer mp){ public boolean hasComponent(MovementComponent movementComponent) { - return mcs.contains(movementComponent); + return movementComponents.contains(movementComponent); } @@ -96,7 +91,7 @@ public void onMovement(PlayerMoveEvent e){ if (usesThisSystem(e.getPlayer())){ MovementPlayer mp = MovementPlusPlus.getMovementPlayer(e.getPlayer()); - mcs.forEach(mcs -> mcs.onMovement(e, mp)); + movementComponents.forEach(mcs -> mcs.onMovement(e, mp)); } } @@ -113,7 +108,7 @@ public void onPlayerDeath(PlayerDeathEvent e) { if (usesThisSystem(e.getEntity().getUniqueId())) { MovementPlayer mp = MovementPlusPlus.getMovementPlayer(e.getEntity().getUniqueId()); - mcs.forEach(mcs -> mcs.onDeath(mp)); + movementComponents.forEach(mcs -> mcs.onDeath(mp)); } } diff --git a/src/com/trinoxtion/movement/pads/ElytraPad.java b/src/com/trinoxtion/movement/pads/ElytraPad.java index fd58ad9..c7c5bc5 100644 --- a/src/com/trinoxtion/movement/pads/ElytraPad.java +++ b/src/com/trinoxtion/movement/pads/ElytraPad.java @@ -34,56 +34,66 @@ public ElytraPad(Material material, byte data, float height, float cost, boolean public static final ElytraPad ELYTRA_PAD = new ElytraPad(Material.PINK_GLAZED_TERRACOTTA, JumpPad.STRONG_TRAMPOLINE); - private static Map elytrad = new HashMap<>(); - -// @Deprecated -// public static void elytraPad(MovementPlayer mp){ -// Player player = mp.getPlayer(); -// Vector vector = player.getVelocity(); -// if(player.getLocation().subtract(0, 1, 0).getBlock().getType() == ELYTRA_PAD){ -// player.setVelocity(new Vector(vector.getX() * 2, 16.0/9, vector.getZ() * 2)); -// if (!elytrad.containsKey(player.getUniqueId())){ -// elytrad.put(player.getUniqueId(), player.getInventory().getChestplate()); -// } -// player.getInventory().setChestplate(new ItemStack(Material.ELYTRA)); -// mp.setJumping(); -// } -// } + private static Map playersWithElytra = new HashMap<>(); @Override - public void onMovement(PlayerMoveEvent event, MovementPlayer mp) { - if (event.getPlayer().isOnGround()) { reset(event.getPlayer()); } - super.onMovement(event, mp); - if (mp.isJumping() && !elytrad.containsKey(mp.getUUID())){ - elytrad.put(mp.getUUID(), mp.getPlayer().getInventory().getChestplate()); - mp.getPlayer().getInventory().setChestplate(new ItemStack(Material.ELYTRA)); - } + public void onMovement(PlayerMoveEvent event, MovementPlayer movementPlayer) { + resetElytraIfOnGround(movementPlayer); + + // We extend Jumppad, so call parent onMovement() func to initiate jumping + super.onMovement(event, movementPlayer); + + giveElytraIfJumping(movementPlayer); } -// @EventHandler(priority = EventPriority.LOW) -// public void onLand(PlayerMoveEvent e){ -// if (e.getTo().getY() <= e.getFrom().getY() -// && e.getTo().clone().subtract(0, -.5, 0).getBlock().getType().isSolid() -// && !e.getPlayer().isGliding()){ -// reset(e.getPlayer()); -// } -// } - @Override - public void onQuit(MovementPlayer mp){ - reset(mp.getPlayer()); + public void onQuit(MovementPlayer movementPlayer){ + resetElytra(movementPlayer); } @Override - public void onDeath(MovementPlayer mp){ - reset(mp.getPlayer()); + public void onDeath(MovementPlayer movementPlayer){ + resetElytra(movementPlayer); + } + + private static void giveElytraIfJumping(MovementPlayer movementPlayer) { + Player player = movementPlayer.getPlayer(); + if (movementPlayer.isJumping() && !hasElytra(player)){ + giveElytra(player); + } + } + + private static void giveElytra(Player player) { + ItemStack chestplateToSave = player.getInventory().getChestplate(); + + playersWithElytra.put(player.getUniqueId(), chestplateToSave); + + player.getInventory().setChestplate(new ItemStack(Material.ELYTRA)); } - private static void reset(Player player){ - if (elytrad.containsKey(player.getUniqueId())){ - player.getInventory().setChestplate(elytrad.get(player.getUniqueId())); - elytrad.remove(player.getUniqueId()); + private static void resetElytraIfOnGround(MovementPlayer movementPlayer){ + Player player = movementPlayer.getPlayer(); + if (player.isOnGround()) { + resetElytra(player); } } + private static void resetElytra(MovementPlayer movementPlayer) { + resetElytra(movementPlayer.getPlayer()); + } + private static void resetElytra(Player player){ + if (hasElytra(player)){ + removeElytra(player); + } + } + + private static boolean hasElytra(Player player) { + return playersWithElytra.containsKey(player.getUniqueId()); + } + + private static void removeElytra(Player player) { + player.getInventory().setChestplate(playersWithElytra.get(player.getUniqueId())); + playersWithElytra.remove(player.getUniqueId()); + } + } diff --git a/src/com/trinoxtion/movement/pads/HealthPad.java b/src/com/trinoxtion/movement/pads/HealthPad.java index d72dc0a..1f28206 100644 --- a/src/com/trinoxtion/movement/pads/HealthPad.java +++ b/src/com/trinoxtion/movement/pads/HealthPad.java @@ -6,7 +6,6 @@ import org.bukkit.Material; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; @@ -17,13 +16,10 @@ public class HealthPad extends SimplePad implements Listener { public static final HealthPad DEFAULT = new HealthPad(Material.QUARTZ_BLOCK, (byte) 1); - //This is for cancelling, but is it necessary or just cleaned on reload regardless? How is an async task time stopped? - //TODO - @SuppressWarnings("unused") - private final BukkitTask healthTask; + private static final double DEFAULT_RATE_IN_SECONDS = 0.6; + private BukkitTask healthTask; private final long rateInTicks; - private Set playersOnPads = new HashSet<>(); public HealthPad(Material material){ @@ -31,7 +27,7 @@ public HealthPad(Material material){ } public HealthPad(Material material, byte data) { - this(material, data, 0.6); + this(material, data, DEFAULT_RATE_IN_SECONDS); } public HealthPad(Material material, byte data, double rateInSeconds){ @@ -40,30 +36,34 @@ public HealthPad(Material material, byte data, double rateInSeconds){ MovementPlusPlus.registerEvents(this); - healthTask = new BukkitRunnable(){ - public void run(){ - playersOnPads.forEach(mp -> { - mp.getPlayer().setHealth(Math.min(mp.getPlayer().getHealth() + 0.5, 20)); - }); - } - }.runTaskTimerAsynchronously(MovementPlusPlus.getPlugin(), rateInTicks / 2, rateInTicks); + startHealthTask(); + } + + + public void startHealthTask() { + if (healthTask == null) { + healthTask = new BukkitRunnable(){ + public void run(){ + doHealthPadTick(); + } + }.runTaskTimerAsynchronously(MovementPlusPlus.getPlugin(), rateInTicks / 2, rateInTicks); + } + } + + public void stopHealthTask() { + if (healthTask != null) { + healthTask.cancel(); + healthTask = null; + } + } + + private void doHealthPadTick() { + playersOnPads.forEach(this::incrementHealth); } -// @EventHandler -// public void onPlayerMove(PlayerMoveEvent e) { -// Player player = e.getPlayer(); -// Bukkit.broadcastMessage(player.getName() + " uses this component: " + usesThisComponent(player)); -// if (usesThisComponent(player)){ -// MovementPlayer mp = MovementPlusPlus.getMovementPlayer(player); -// if (player.getLocation().getBlock().getRelative(0, -1, 0).getType() == this.material) { -// playersOnPads.add(mp); -// Bukkit.broadcastMessage(player.getName() + " added to healthpad list"); -// } else { -// playersOnPads.remove(mp); -// Bukkit.broadcastMessage(player.getName() + " removed from healthpad list"); -// } -// } -// } + private void incrementHealth(MovementPlayer movementPlayer) { + movementPlayer.getPlayer().setHealth(Math.min(movementPlayer.getPlayer().getHealth() + 0.5, 20)); + } @Override public void onMovement(PlayerMoveEvent event, MovementPlayer mp) { @@ -72,7 +72,6 @@ public void onMovement(PlayerMoveEvent event, MovementPlayer mp) { } else { playersOnPads.remove(mp); } - } @Override @@ -85,7 +84,5 @@ public void onDeath(MovementPlayer mp){ playersOnPads.remove(mp); } - - }