diff --git a/src/main/java/me/profelements/dynatech/items/electric/AntigravityBubble.java b/src/main/java/me/profelements/dynatech/items/electric/AntigravityBubble.java index 387f818f..e3635145 100644 --- a/src/main/java/me/profelements/dynatech/items/electric/AntigravityBubble.java +++ b/src/main/java/me/profelements/dynatech/items/electric/AntigravityBubble.java @@ -9,7 +9,9 @@ import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.Slimefun.Objects.handlers.BlockTicker; import me.profelements.dynatech.items.electric.abstracts.AMachine; + import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Entity; @@ -19,16 +21,20 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.UUID; +/** + * @author ProfElements https://github.com/ProfElements + * @author Fhoz https://github.com/Fhoz +*/ public class AntigravityBubble extends AMachine { - - private final Set enabledPlayers = new HashSet<>(); - + private static final Map> allEnabledPlayers = new HashMap<>(); + private static final Set allUuids = new HashSet<>(); private static final int[] BORDER = new int[] { 1, 2, 6, 7, 9, 10, 11, 15, 16, 17, 19, 20, 24, 25 }; private static final int[] BORDER_IN = new int[] { 3, 4, 5, 12, 14, 21, 22, 23 }; private static final int[] BORDER_OUT = new int[] { 0, 8, 18, 26 }; @@ -57,48 +63,60 @@ public boolean isSynchronized() { @Override public void tick(Block b) { + Set playersInBubble = allEnabledPlayers.getOrDefault(b.getLocation(), new HashSet<>()); Collection bubbledEntities = b.getWorld().getNearbyEntities(b.getLocation(), 25, 25, 25); - for (Entity entity : bubbledEntities) { - if (entity instanceof Player) { + if (entity instanceof Player && getCharge(b.getLocation()) >= getEnergyConsumption()) { Player p = (Player) entity; - + playersInBubble.add(p.getUniqueId()); + allEnabledPlayers.put(b.getLocation(), playersInBubble); if (!p.getAllowFlight()) { - enabledPlayers.add(p.getUniqueId()); p.setAllowFlight(true); removeCharge(b.getLocation(), getEnergyConsumption()); } } } - final Iterator playerIterator = enabledPlayers.iterator(); - while (playerIterator.hasNext()) { - final UUID uuid = playerIterator.next(); + for (UUID uuid : playersInBubble) { Player p = Bukkit.getPlayer(uuid); - if (p != null && !bubbledEntities.contains(p)) { - p.setAllowFlight(false); - p.setFlying(false); - p.setFallDistance(0.0f); - playerIterator.remove(); + allEnabledPlayers.get(b.getLocation()).remove(p.getUniqueId()); + checkPlayer(p.getUniqueId()); } } } + + private void checkPlayer(UUID u) { + allUuids.clear(); + for (Map.Entry> entry : allEnabledPlayers.entrySet()) { + Set uuidSet = entry.getValue(); + for (UUID uuid : uuidSet) { + if (!allUuids.contains(uuid)) { + allUuids.add(uuid); + } + } + } + + if (!allUuids.contains(u)) { + Player p = Bukkit.getPlayer(u); + p.setAllowFlight(false); + p.setFlying(false); + p.setFallDistance(0.0f); + } + } private ItemHandler onBlockBreak() { return new BlockBreakHandler(false, false) { @Override public void onPlayerBreak(BlockBreakEvent e, ItemStack tool, List drops) { - final Iterator playerIterator = enabledPlayers.iterator(); - while (playerIterator.hasNext()) { - final UUID uuid = playerIterator.next(); - Player p = Bukkit.getPlayer(uuid); - if (p != null) { - p.setAllowFlight(false); - p.setFlying(false); - p.setFallDistance(0.0F); - playerIterator.remove(); + if (allEnabledPlayers.get(e.getBlock().getLocation()) != null) { + for (UUID uuid : allEnabledPlayers.get(e.getBlock().getLocation())) { + Player p = Bukkit.getPlayer(uuid); + if (p != null) { + allEnabledPlayers.get(e.getBlock().getLocation()).remove(p.getUniqueId()); + checkPlayer(p.getUniqueId()); + } } } }