Skip to content
This repository has been archived by the owner on Aug 27, 2022. It is now read-only.

Fixed Antigravity Bubbles #14

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 {
Sefiraat marked this conversation as resolved.
Show resolved Hide resolved

private final Set<UUID> enabledPlayers = new HashSet<>();
Sefiraat marked this conversation as resolved.
Show resolved Hide resolved

private static final Map<Location, Set<UUID>> allEnabledPlayers = new HashMap<>();
private static final Set<UUID> 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 };
Expand Down Expand Up @@ -57,48 +63,60 @@ public boolean isSynchronized() {

@Override
public void tick(Block b) {
Set<UUID> playersInBubble = allEnabledPlayers.getOrDefault(b.getLocation(), new HashSet<>());
Collection<Entity> 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<UUID> 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) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ill look at this method when I'm back at my PC tomorrow and also give this a good general test

allUuids.clear();
for (Map.Entry<Location, Set<UUID>> entry : allEnabledPlayers.entrySet()) {
Set<UUID> 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<ItemStack> drops) {
final Iterator<UUID> 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());
}
}
}
}
Expand Down