mirror of
https://github.com/boy0001/FastAsyncWorldedit.git
synced 2025-01-04 07:28:17 +01:00
CUI using structure blocks (config option)
This commit is contained in:
parent
18c031919b
commit
eddb4d8b2d
@ -17,6 +17,8 @@ import com.boydti.fawe.bukkit.regions.Worldguard;
|
|||||||
import com.boydti.fawe.bukkit.util.BukkitTaskMan;
|
import com.boydti.fawe.bukkit.util.BukkitTaskMan;
|
||||||
import com.boydti.fawe.bukkit.util.ItemUtil;
|
import com.boydti.fawe.bukkit.util.ItemUtil;
|
||||||
import com.boydti.fawe.bukkit.util.VaultUtil;
|
import com.boydti.fawe.bukkit.util.VaultUtil;
|
||||||
|
import com.boydti.fawe.bukkit.util.cui.CUIListener;
|
||||||
|
import com.boydti.fawe.bukkit.util.cui.StructureCUI;
|
||||||
import com.boydti.fawe.bukkit.util.image.BukkitImageListener;
|
import com.boydti.fawe.bukkit.util.image.BukkitImageListener;
|
||||||
import com.boydti.fawe.bukkit.util.image.BukkitImageViewer;
|
import com.boydti.fawe.bukkit.util.image.BukkitImageViewer;
|
||||||
import com.boydti.fawe.bukkit.v0.BukkitQueue_0;
|
import com.boydti.fawe.bukkit.v0.BukkitQueue_0;
|
||||||
@ -39,6 +41,7 @@ import com.boydti.fawe.util.Jars;
|
|||||||
import com.boydti.fawe.util.MainUtil;
|
import com.boydti.fawe.util.MainUtil;
|
||||||
import com.boydti.fawe.util.ReflectionUtils;
|
import com.boydti.fawe.util.ReflectionUtils;
|
||||||
import com.boydti.fawe.util.TaskManager;
|
import com.boydti.fawe.util.TaskManager;
|
||||||
|
import com.boydti.fawe.util.cui.CUI;
|
||||||
import com.boydti.fawe.util.image.ImageViewer;
|
import com.boydti.fawe.util.image.ImageViewer;
|
||||||
import com.boydti.fawe.util.metrics.BStats;
|
import com.boydti.fawe.util.metrics.BStats;
|
||||||
import com.sk89q.bukkit.util.FallbackRegistrationListener;
|
import com.sk89q.bukkit.util.FallbackRegistrationListener;
|
||||||
@ -74,8 +77,12 @@ public class FaweBukkit implements IFawe, Listener {
|
|||||||
private VaultUtil vault;
|
private VaultUtil vault;
|
||||||
private WorldEditPlugin worldedit;
|
private WorldEditPlugin worldedit;
|
||||||
private ItemUtil itemUtil;
|
private ItemUtil itemUtil;
|
||||||
private boolean listening;
|
|
||||||
private BukkitImageListener listener;
|
private boolean listeningImages;
|
||||||
|
private BukkitImageListener imageListener;
|
||||||
|
|
||||||
|
private boolean listeningCui;
|
||||||
|
private CUIListener cuiListener;
|
||||||
|
|
||||||
public VaultUtil getVault() {
|
public VaultUtil getVault() {
|
||||||
return this.vault;
|
return this.vault;
|
||||||
@ -138,11 +145,33 @@ public class FaweBukkit implements IFawe, Listener {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CUI getCUI(FawePlayer player) {
|
||||||
|
if (Settings.IMP.EXPERIMENTAL.VANILLA_CUI) {
|
||||||
|
switch (getVersion()) {
|
||||||
|
case v1_12_R1: {
|
||||||
|
if (listeningCui && cuiListener == null) return null;
|
||||||
|
listeningCui = true;
|
||||||
|
if (cuiListener == null) {
|
||||||
|
Plugin protocolLib = Bukkit.getPluginManager().getPlugin("ProtocolLib");
|
||||||
|
if (protocolLib != null && protocolLib.isEnabled()) {
|
||||||
|
cuiListener = new CUIListener(plugin);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new StructureCUI(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized ImageViewer getImageViewer(FawePlayer fp) {
|
public synchronized ImageViewer getImageViewer(FawePlayer fp) {
|
||||||
if (listening && listener == null) return null;
|
if (listeningImages && imageListener == null) return null;
|
||||||
try {
|
try {
|
||||||
listening = true;
|
listeningImages = true;
|
||||||
PluginManager manager = Bukkit.getPluginManager();
|
PluginManager manager = Bukkit.getPluginManager();
|
||||||
if (manager.getPlugin("PacketListenerApi") == null) {
|
if (manager.getPlugin("PacketListenerApi") == null) {
|
||||||
File output = new File(plugin.getDataFolder().getParentFile(), "PacketListenerAPI_v3.6.0-SNAPSHOT.jar");
|
File output = new File(plugin.getDataFolder().getParentFile(), "PacketListenerAPI_v3.6.0-SNAPSHOT.jar");
|
||||||
@ -159,8 +188,8 @@ public class FaweBukkit implements IFawe, Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
BukkitImageViewer viewer = new BukkitImageViewer((Player) fp.parent);
|
BukkitImageViewer viewer = new BukkitImageViewer((Player) fp.parent);
|
||||||
if (listener == null) {
|
if (imageListener == null) {
|
||||||
this.listener = new BukkitImageListener(plugin);
|
this.imageListener = new BukkitImageListener(plugin);
|
||||||
}
|
}
|
||||||
return viewer;
|
return viewer;
|
||||||
} catch (Throwable ignore) {}
|
} catch (Throwable ignore) {}
|
||||||
|
@ -19,13 +19,13 @@ public class CUIListener implements Listener {
|
|||||||
public void onPlayerMove(PlayerMoveEvent event) {
|
public void onPlayerMove(PlayerMoveEvent event) {
|
||||||
Location from = event.getFrom();
|
Location from = event.getFrom();
|
||||||
Location to = event.getTo();
|
Location to = event.getTo();
|
||||||
if ((int) from.getX() != (int) to.getX() || (int) from.getZ() != (int) to.getZ()) {
|
if ((int) from.getX() >> 2 != (int) to.getX() >> 2 || (int) from.getZ() >> 2 != (int) to.getZ() >> 2) {
|
||||||
FawePlayer<Object> player = FawePlayer.wrap(event.getPlayer());
|
FawePlayer<Object> player = FawePlayer.wrap(event.getPlayer());
|
||||||
CUI cui = player.getMeta("CUI");
|
CUI cui = player.getMeta("CUI");
|
||||||
if (cui instanceof StructureCUI) {
|
if (cui instanceof StructureCUI) {
|
||||||
StructureCUI sCui = (StructureCUI) cui;
|
StructureCUI sCui = (StructureCUI) cui;
|
||||||
|
sCui.update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
@ -1,22 +1,37 @@
|
|||||||
package com.boydti.fawe.bukkit.util.cui;
|
package com.boydti.fawe.bukkit.util.cui;
|
||||||
|
|
||||||
|
import com.boydti.fawe.FaweCache;
|
||||||
|
import com.boydti.fawe.bukkit.v0.BukkitQueue_0;
|
||||||
import com.boydti.fawe.object.FawePlayer;
|
import com.boydti.fawe.object.FawePlayer;
|
||||||
import com.boydti.fawe.util.cui.CUI;
|
import com.boydti.fawe.util.cui.CUI;
|
||||||
|
import com.comphenix.protocol.PacketType;
|
||||||
|
import com.comphenix.protocol.ProtocolLibrary;
|
||||||
|
import com.comphenix.protocol.ProtocolManager;
|
||||||
|
import com.comphenix.protocol.events.PacketContainer;
|
||||||
|
import com.comphenix.protocol.wrappers.BlockPosition;
|
||||||
|
import com.comphenix.protocol.wrappers.nbt.NbtCompound;
|
||||||
|
import com.comphenix.protocol.wrappers.nbt.NbtFactory;
|
||||||
import com.sk89q.worldedit.Vector;
|
import com.sk89q.worldedit.Vector;
|
||||||
import com.sk89q.worldedit.Vector2D;
|
|
||||||
import com.sk89q.worldedit.internal.cui.CUIEvent;
|
import com.sk89q.worldedit.internal.cui.CUIEvent;
|
||||||
import com.sk89q.worldedit.internal.cui.SelectionPointEvent;
|
import com.sk89q.worldedit.internal.cui.SelectionPointEvent;
|
||||||
import com.sk89q.worldedit.internal.cui.SelectionShapeEvent;
|
import com.sk89q.worldedit.internal.cui.SelectionShapeEvent;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.UUID;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
public class StructureCUI extends CUI {
|
public class StructureCUI extends CUI {
|
||||||
private boolean cuboid;
|
private boolean cuboid = true;
|
||||||
private Map<Vector2D, Material> chunkMap = new HashMap<>();
|
|
||||||
|
private Vector pos1;
|
||||||
|
private Vector pos2;
|
||||||
|
|
||||||
|
private Vector remove;
|
||||||
|
private int combined;
|
||||||
|
|
||||||
public StructureCUI(FawePlayer player) {
|
public StructureCUI(FawePlayer player) {
|
||||||
super(player);
|
super(player);
|
||||||
@ -28,24 +43,129 @@ public class StructureCUI extends CUI {
|
|||||||
clear();
|
clear();
|
||||||
this.cuboid = event.getParameters()[0].equalsIgnoreCase("cuboid");
|
this.cuboid = event.getParameters()[0].equalsIgnoreCase("cuboid");
|
||||||
} else if (cuboid && event instanceof SelectionPointEvent) {
|
} else if (cuboid && event instanceof SelectionPointEvent) {
|
||||||
|
SelectionPointEvent spe = (SelectionPointEvent) event;
|
||||||
|
String[] param = spe.getParameters();
|
||||||
|
int id = Integer.parseInt(param[0]);
|
||||||
|
int x = Integer.parseInt(param[1]);
|
||||||
|
int y = Integer.parseInt(param[2]);
|
||||||
|
int z = Integer.parseInt(param[3]);
|
||||||
|
Vector pos = new Vector(x, y, z);
|
||||||
|
if (id == 0) {
|
||||||
|
pos1 = pos;
|
||||||
|
} else {
|
||||||
|
pos2 = pos;
|
||||||
|
}
|
||||||
|
update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void draw(Vector pos1, Vector pos2) {
|
private int viewDistance() {
|
||||||
Player player = this.<Player>getPlayer().parent;
|
Player player = this.<Player>getPlayer().parent;
|
||||||
Location position = player.getLocation();
|
|
||||||
|
|
||||||
int view;
|
|
||||||
if (Bukkit.getVersion().contains("paper")) {
|
if (Bukkit.getVersion().contains("paper")) {
|
||||||
view = player.getViewDistance();
|
return player.getViewDistance();
|
||||||
} else {
|
} else {
|
||||||
view = Bukkit.getViewDistance();
|
return Bukkit.getViewDistance();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clear() {
|
public void clear() {
|
||||||
|
pos1 = null;
|
||||||
|
pos2 = null;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void update() {
|
||||||
|
Player player = this.<Player>getPlayer().parent;
|
||||||
|
Location playerLoc = player.getLocation();
|
||||||
|
if (remove != null) {
|
||||||
|
int cx = playerLoc.getBlockX() >> 4;
|
||||||
|
int cz = playerLoc.getBlockZ() >> 4;
|
||||||
|
int viewDistance = viewDistance();
|
||||||
|
if (Math.abs(cx - (remove.getBlockX() >> 4)) <= viewDistance && Math.abs(cz - (remove.getBlockZ() >> 4)) <= viewDistance) {
|
||||||
|
Location removeLoc = new Location(player.getWorld(), remove.getX(), remove.getY(), remove.getZ());
|
||||||
|
player.sendBlockChange(removeLoc, FaweCache.getId(combined), (byte) FaweCache.getData(combined));
|
||||||
|
}
|
||||||
|
remove = null;
|
||||||
|
}
|
||||||
|
if (pos1 == null || pos2 == null) return;
|
||||||
|
Vector min = Vector.getMinimum(pos1, pos2);
|
||||||
|
Vector max = Vector.getMaximum(pos1, pos2);
|
||||||
|
|
||||||
|
// Position
|
||||||
|
double rotX = playerLoc.getYaw();
|
||||||
|
double rotY = playerLoc.getPitch();
|
||||||
|
double xz = Math.cos(Math.toRadians(rotY));
|
||||||
|
int x = (int) (playerLoc.getX() - (-xz * Math.sin(Math.toRadians(rotX))) * 3);
|
||||||
|
int z = (int) (playerLoc.getZ() - (xz * Math.cos(Math.toRadians(rotX))) * 3);
|
||||||
|
int y = Math.min(Math.min(255, max.getBlockY() + 32), playerLoc.getBlockY() + 3);
|
||||||
|
|
||||||
|
int minX = Math.max(Math.min(32, min.getBlockX() - x), -32);
|
||||||
|
int maxX = Math.max(Math.min(32, max.getBlockX() - x + 1), -32);
|
||||||
|
|
||||||
|
int minY = Math.max(Math.min(32, min.getBlockY() - y), -32);
|
||||||
|
int maxY = Math.max(Math.min(32, max.getBlockY() - y + 1), -32);
|
||||||
|
|
||||||
|
int minZ = Math.max(Math.min(32, min.getBlockZ() - z), -32);
|
||||||
|
int maxZ = Math.max(Math.min(32, max.getBlockZ() - z + 1), -32);
|
||||||
|
|
||||||
|
int sizeX = Math.min(32, maxX - minX);
|
||||||
|
int sizeY = Math.min(32, maxY - minY);
|
||||||
|
int sizeZ = Math.min(32, maxZ - minZ);
|
||||||
|
if (sizeX == 0 || sizeY == 0 || sizeZ == 0) return;
|
||||||
|
|
||||||
|
int posX = Math.max(minX, maxX - 48);
|
||||||
|
int posY = Math.max(minY, maxY - 48);
|
||||||
|
int posZ = Math.max(minZ, maxZ - 48);
|
||||||
|
|
||||||
|
|
||||||
|
// NBT
|
||||||
|
HashMap<String, Object> tag = new HashMap<>();
|
||||||
|
tag.put("name", UUID.randomUUID().toString());
|
||||||
|
tag.put("author", "Empire92"); // :D
|
||||||
|
tag.put("metadata", "");
|
||||||
|
tag.put("x", x);
|
||||||
|
tag.put("y", y);
|
||||||
|
tag.put("z", z);
|
||||||
|
tag.put("posX", posX);
|
||||||
|
tag.put("posY", posY);
|
||||||
|
tag.put("posZ", posZ);
|
||||||
|
tag.put("sizeX", sizeX);
|
||||||
|
tag.put("sizeY", sizeY);
|
||||||
|
tag.put("sizeZ", sizeZ);
|
||||||
|
tag.put("rotation", "NONE");
|
||||||
|
tag.put("mirror", "NONE");
|
||||||
|
tag.put("mode", "SAVE");
|
||||||
|
tag.put("ignoreEntities", true);
|
||||||
|
tag.put("powered", false);
|
||||||
|
tag.put("showair", false);
|
||||||
|
tag.put("showboundingbox", true);
|
||||||
|
tag.put("integrity", 1.0f);
|
||||||
|
tag.put("seed", 0);
|
||||||
|
tag.put("id", "minecraft:structure_block");
|
||||||
|
Object nmsTag = BukkitQueue_0.fromNative(FaweCache.asTag(tag));
|
||||||
|
NbtCompound compound = NbtFactory.fromNMSCompound(nmsTag);
|
||||||
|
|
||||||
|
// Type
|
||||||
|
int type = 7;
|
||||||
|
|
||||||
|
// Packet
|
||||||
|
PacketContainer containter = new PacketContainer(PacketType.Play.Server.TILE_ENTITY_DATA);
|
||||||
|
containter.getBlockPositionModifier().write(0, new BlockPosition(x, y, z));
|
||||||
|
containter.getIntegers().write(0, type);
|
||||||
|
containter.getNbtModifier().write(0, compound);
|
||||||
|
|
||||||
|
ProtocolManager manager = ProtocolLibrary.getProtocolManager();
|
||||||
|
try {
|
||||||
|
|
||||||
|
Block block = player.getWorld().getBlockAt(x, y, z);
|
||||||
|
remove = new Vector(x, y, z);
|
||||||
|
combined = FaweCache.getCombined(block.getTypeId(), block.getData());
|
||||||
|
|
||||||
|
Location blockLoc = new Location(player.getWorld(), x, y, z);
|
||||||
|
player.sendBlockChange(blockLoc, Material.STRUCTURE_BLOCK, (byte) 0);
|
||||||
|
manager.sendServerPacket(player, containter);
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -310,6 +310,10 @@ public class Settings extends Config {
|
|||||||
"Allows brushes to be persistent",
|
"Allows brushes to be persistent",
|
||||||
})
|
})
|
||||||
public boolean PERSISTENT_BRUSHES = false;
|
public boolean PERSISTENT_BRUSHES = false;
|
||||||
|
@Comment({
|
||||||
|
"Enable CUI without needing the mod installed (Requires ProtocolLib)",
|
||||||
|
})
|
||||||
|
public boolean VANILLA_CUI = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user