forked from SteamWar/SteamWar
Make Techhider more robust
This commit is contained in:
+15
-8
@@ -41,6 +41,7 @@ import org.bukkit.event.entity.EntityPickupItemEvent;
|
||||
import org.bukkit.event.player.*;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
@@ -48,7 +49,7 @@ import java.util.Set;
|
||||
public class SpectatorListener implements Listener {
|
||||
|
||||
private static final TechHider techHider;
|
||||
private static final Set<Player> NO_TECHHIDER = new HashSet<>();
|
||||
private static final Set<Player> NO_TECHHIDER = Collections.synchronizedSet(new HashSet<>());
|
||||
|
||||
static {
|
||||
Set<Material> materials = new HashSet<>();
|
||||
@@ -100,14 +101,14 @@ public class SpectatorListener implements Listener {
|
||||
materials.remove(Material.BARRIER);
|
||||
materials.remove(Material.STONE);
|
||||
techHider = new TechHider((TechHider.LocationEvaluator) (player, i, i1) -> {
|
||||
return Permission.BUILD.hasPermission(player) || NO_TECHHIDER.contains(player);
|
||||
return NO_TECHHIDER.contains(player);
|
||||
}, Material.END_STONE, materials, new HashSet<>());
|
||||
}
|
||||
|
||||
private static void enableOrDisableTechhider() {
|
||||
boolean enable = Bukkit.getOnlinePlayers()
|
||||
.stream()
|
||||
.anyMatch(player -> !(Permission.BUILD.hasPermission(player) || NO_TECHHIDER.contains(player)));
|
||||
.anyMatch(player -> !NO_TECHHIDER.contains(player));
|
||||
if (enable) {
|
||||
techHider.enable();
|
||||
} else {
|
||||
@@ -141,6 +142,9 @@ public class SpectatorListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
if (Permission.BUILD.hasPermission(event.getPlayer())) {
|
||||
NO_TECHHIDER.add(event.getPlayer());
|
||||
}
|
||||
enableOrDisableTechhider();
|
||||
if (BauSystem.DEV_SERVER) return;
|
||||
if (event.getPlayer().getUniqueId().equals(BauServer.getInstance().getOwner())) {
|
||||
@@ -163,6 +167,14 @@ public class SpectatorListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onBauMemberUpdate(BauMemberUpdateEvent event) {
|
||||
event.getChanged().forEach(player -> {
|
||||
if (Permission.BUILD.hasPermission(player)) {
|
||||
NO_TECHHIDER.add(player);
|
||||
} else {
|
||||
NO_TECHHIDER.remove(player);
|
||||
}
|
||||
resendChunks(player);
|
||||
});
|
||||
enableOrDisableTechhider();
|
||||
if (!anySupervisorOnline(null) && !BauSystem.DEV_SERVER) {
|
||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||
@@ -170,11 +182,6 @@ public class SpectatorListener implements Listener {
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
event.getChanged().forEach(player -> {
|
||||
NO_TECHHIDER.remove(player);
|
||||
resendChunks(player);
|
||||
});
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
|
||||
@@ -29,6 +29,8 @@ import de.steamwar.core.CraftbukkitWrapper;
|
||||
import de.steamwar.linkage.Linked;
|
||||
import de.steamwar.linkage.LinkedInstance;
|
||||
import de.steamwar.techhider.legacy.TechHider;
|
||||
import io.papermc.paper.event.player.PlayerFailMoveEvent;
|
||||
import io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason;
|
||||
import net.md_5.bungee.api.ChatMessageType;
|
||||
import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
@@ -96,27 +98,12 @@ public class XrayCommand extends SWCommand implements Listener, ScoreboardElemen
|
||||
});
|
||||
}
|
||||
|
||||
{
|
||||
BiFunction<Player, ServerboundMovePlayerPacket, Object> positionSetter = (player, packet) -> {
|
||||
Region region = Region.getRegion(player.getLocation());
|
||||
if (hidden.containsKey(region) && hidden.get(region).contains(player)) {
|
||||
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
|
||||
ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle();
|
||||
if (packet.hasPos) {
|
||||
serverPlayer.setPosRaw(packet.x, packet.y, packet.z);
|
||||
}
|
||||
if (packet.hasRot) {
|
||||
serverPlayer.setXRot(packet.xRot);
|
||||
serverPlayer.setYRot(packet.yRot);
|
||||
}
|
||||
}, 0);
|
||||
return null;
|
||||
}
|
||||
return packet;
|
||||
};
|
||||
|
||||
TinyProtocol.instance.addFilter(ServerboundMovePlayerPacket.Pos.class, positionSetter);
|
||||
TinyProtocol.instance.addFilter(ServerboundMovePlayerPacket.PosRot.class, positionSetter);
|
||||
@EventHandler
|
||||
public void onFailMove(PlayerFailMoveEvent event) {
|
||||
if (event.getFailReason() != FailReason.CLIPPED_INTO_BLOCK) return;
|
||||
Region region = Region.getRegion(event.getTo());
|
||||
if (!hidden.containsKey(region) || !hidden.get(region).contains(event.getPlayer())) return;
|
||||
event.setAllowed(true);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
|
||||
Reference in New Issue
Block a user