May ProtocolLib vanish and not come back #264
@ -1,60 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ This file is a part of the SteamWar software.
|
||||
~
|
||||
~ Copyright (C) 2021 SteamWar.de-Serverteam
|
||||
~
|
||||
~ This program is free software: you can redistribute it and/or modify
|
||||
~ it under the terms of the GNU Affero General Public License as published by
|
||||
~ the Free Software Foundation, either version 3 of the License, or
|
||||
~ (at your option) any later version.
|
||||
~
|
||||
~ This program is distributed in the hope that it will be useful,
|
||||
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
~ GNU Affero General Public License for more details.
|
||||
~
|
||||
~ You should have received a copy of the GNU Affero General Public License
|
||||
~ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>steamwar</groupId>
|
||||
<artifactId>BauSystem</artifactId>
|
||||
<version>1.0</version>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
<main.basedir>${project.basedir}/..</main.basedir>
|
||||
</properties>
|
||||
|
||||
<artifactId>BauSystem_15</artifactId>
|
||||
<version>1.0</version>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>steamwar</groupId>
|
||||
<artifactId>BauSystem_Core</artifactId>
|
||||
<version>1.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>steamwar</groupId>
|
||||
<artifactId>WorldEdit</artifactId>
|
||||
<version>1.0</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${main.basedir}/lib/WorldEdit-1.15.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>steamwar</groupId>
|
||||
<artifactId>Spigot</artifactId>
|
||||
<version>1.15</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${main.basedir}/lib/Spigot-1.15.jar</systemPath>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
@ -1,91 +0,0 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem;
|
||||
|
||||
import com.comphenix.protocol.PacketType;
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
import com.comphenix.protocol.events.PacketContainer;
|
||||
import com.comphenix.protocol.wrappers.BlockPosition;
|
||||
import de.steamwar.bausystem.tracer.AbstractTraceEntity;
|
||||
import de.steamwar.bausystem.world.TPSUtils;
|
||||
import net.minecraft.server.v1_15_R1.*;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class CraftbukkitWrapper15 implements CraftbukkitWrapper.ICraftbukkitWrapper {
|
||||
|
||||
private final List<Packet<?>> packets = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public void initTPS() {
|
||||
SystemUtils.a = () -> System.nanoTime() + TPSUtils.getNanoOffset();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createTickCache(World world) {
|
||||
packets.clear();
|
||||
world.getEntities().stream().filter(entity -> !(entity instanceof Player)).forEach(entity -> {
|
||||
packets.add(new PacketPlayOutEntityVelocity(entity.getEntityId(), Vec3D.a));
|
||||
packets.add(new PacketPlayOutEntityTeleport(((CraftEntity) entity).getHandle()));
|
||||
|
||||
if (entity instanceof TNTPrimed) {
|
||||
net.minecraft.server.v1_15_R1.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
||||
packets.add(new PacketPlayOutEntityMetadata(serverEntity.getId(), serverEntity.getDataWatcher(), true));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendTickPackets() {
|
||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||
PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
|
||||
for (Packet<?> p : packets) {
|
||||
connection.sendPacket(p);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void openSignEditor(Player player, Location location) {
|
||||
PacketContainer signOpen = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.OPEN_SIGN_EDITOR);
|
||||
signOpen.getBlockPositionModifier().write(0, new BlockPosition(location.toVector()));
|
||||
try {
|
||||
ProtocolLibrary.getProtocolManager().sendServerPacket(player, signOpen);
|
||||
} catch (InvocationTargetException e) {
|
||||
Bukkit.getLogger().log(Level.SEVERE, "Invocation target exception", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractTraceEntity create(World world, Vector tntPosition, boolean tnt) {
|
||||
return new TraceEntity15(world, tntPosition, tnt);
|
||||
}
|
||||
}
|
@ -1,166 +0,0 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem;
|
||||
|
||||
import de.steamwar.bausystem.world.Detoloader;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.block.data.Openable;
|
||||
import org.bukkit.block.data.Powerable;
|
||||
import org.bukkit.block.data.Waterlogged;
|
||||
import org.bukkit.block.data.type.Switch;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
public class FlatteningWrapper15 implements FlatteningWrapper.IFlatteningWrapper {
|
||||
|
||||
@Override
|
||||
public boolean tntPlaceActionPerform(Location location) {
|
||||
Material m = location.getBlock().getType();
|
||||
if (m != Material.AIR && m != Material.WATER)
|
||||
return false;
|
||||
|
||||
location.getBlock().setType(Material.TNT);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setRedstone(Location location, boolean active) {
|
||||
Block block = location.getBlock();
|
||||
BlockData data = block.getBlockData();
|
||||
if (!(data instanceof Powerable))
|
||||
return false;
|
||||
|
||||
|
||||
Powerable powerable = (Powerable) data;
|
||||
powerable.setPowered(active);
|
||||
block.setBlockData(powerable);
|
||||
|
||||
if (data instanceof Openable) {
|
||||
Openable openable = (Openable) data;
|
||||
openable.setOpen(active);
|
||||
block.setBlockData(openable);
|
||||
}
|
||||
|
||||
if (data instanceof Switch) {
|
||||
Switch swtch = (Switch) data;
|
||||
Block relative;
|
||||
switch (swtch.getFace()) {
|
||||
case FLOOR:
|
||||
relative = block.getRelative(BlockFace.DOWN);
|
||||
break;
|
||||
case CEILING:
|
||||
relative = block.getRelative(BlockFace.UP);
|
||||
break;
|
||||
default:
|
||||
relative = block.getRelative(swtch.getFacing().getOppositeFace());
|
||||
break;
|
||||
}
|
||||
updateBlock(relative);
|
||||
} else if (block.getType() == Material.TRIPWIRE) {
|
||||
updateBlock(block);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void updateBlock(Block block) {
|
||||
BlockData data = block.getBlockData();
|
||||
block.setType(Material.BARRIER, true);
|
||||
block.setBlockData(data, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Detoloader onPlayerInteractLoader(PlayerInteractEvent event) {
|
||||
Block block = event.getClickedBlock();
|
||||
assert block != null;
|
||||
BlockData data = block.getBlockData();
|
||||
if (!(data instanceof Powerable))
|
||||
return new Detoloader("§eUnbekannter Block betätigt (nicht aufgenommen)", -1).setAddBack(false);
|
||||
Powerable powerable = (Powerable) data;
|
||||
Material material = block.getType();
|
||||
|
||||
if (material == Material.LEVER) {
|
||||
return new Detoloader("Hebel", 0).setActive(!powerable.isPowered());
|
||||
} else if (material == Material.STONE_BUTTON) {
|
||||
return new Detoloader("Knopf", Detoloader.STONE_BUTTON);
|
||||
} else if (material.name().contains("PRESSURE_PLATE")) {
|
||||
return new Detoloader("Druckplatte", Detoloader.PRESSURE_PLATE);
|
||||
} else if (material.name().contains("BUTTON")) {
|
||||
return new Detoloader("Knopf", Detoloader.WOODEN_BUTTON);
|
||||
} else if (material == Material.NOTE_BLOCK) {
|
||||
return new Detoloader("Noteblock", Detoloader.NOTE_BLOCK);
|
||||
} else if (material.name().equals("TRIPWIRE")) {
|
||||
return new Detoloader("Tripwire", Detoloader.TRIPWIRE);
|
||||
} else {
|
||||
return new Detoloader("§eUnbekannter Block betätigt (aufgenommen)", 0).setAddBack(false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getLever(Block block) {
|
||||
if (!(block.getBlockData() instanceof Powerable))
|
||||
return false;
|
||||
return ((Powerable) block.getBlockData()).isPowered();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNoBook(ItemStack item) {
|
||||
return item.getType() != Material.WRITABLE_BOOK && item.getType() != Material.WRITTEN_BOOK;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inWater(World world, Vector tntPosition) {
|
||||
Block block = world.getBlockAt(tntPosition.getBlockX(), tntPosition.getBlockY(), tntPosition.getBlockZ());
|
||||
if (block.getType() == Material.WATER)
|
||||
return true;
|
||||
|
||||
BlockData data = block.getBlockData();
|
||||
if (!(data instanceof Waterlogged))
|
||||
return false;
|
||||
|
||||
return ((Waterlogged) data).isWaterlogged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Material getTraceShowMaterial() {
|
||||
return Material.LIME_CONCRETE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Material getTraceHideMaterial() {
|
||||
return Material.RED_CONCRETE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Material getTraceXZMaterial() {
|
||||
return Material.QUARTZ_SLAB;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void giveStick(Player player) {
|
||||
SWUtils.giveItemToPlayer(player, new ItemStack(Material.DEBUG_STICK));
|
||||
}
|
||||
}
|
@ -1,81 +0,0 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem;
|
||||
|
||||
import de.steamwar.bausystem.tracer.AbstractTraceEntity;
|
||||
import net.minecraft.server.v1_15_R1.*;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
class TraceEntity15 extends EntityFallingBlock implements AbstractTraceEntity {
|
||||
|
||||
private static final Vec3D ZERO = new Vec3D(0, 0, 0);
|
||||
private final Vector position;
|
||||
private final boolean tnt;
|
||||
|
||||
private boolean exploded = false;
|
||||
private int references = 0;
|
||||
|
||||
public TraceEntity15(World world, Vector position, boolean tnt) {
|
||||
super(((CraftWorld) world).getHandle(), position.getX(), position.getY(), position.getZ(), tnt ? Blocks.TNT.getBlockData() : Blocks.WHITE_STAINED_GLASS.getBlockData());
|
||||
this.position = position;
|
||||
this.tnt = tnt;
|
||||
|
||||
this.setNoGravity(true);
|
||||
this.ticksLived = -12000;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void display(Player player, boolean exploded) {
|
||||
if (!this.exploded && exploded) {
|
||||
this.setCustomNameVisible(true);
|
||||
this.setCustomName(new ChatComponentText("Bumm"));
|
||||
this.exploded = true;
|
||||
if (references++ > 0)
|
||||
sendDestroy(player);
|
||||
} else if (references++ > 0)
|
||||
return;
|
||||
|
||||
PacketPlayOutSpawnEntity packetPlayOutSpawnEntity = new PacketPlayOutSpawnEntity(getId(), getUniqueID(), position.getX(), position.getY(), position.getZ(), 0, 0, EntityTypes.FALLING_BLOCK, tnt ? Block.getCombinedId(Blocks.TNT.getBlockData()) : Block.getCombinedId(Blocks.WHITE_STAINED_GLASS.getBlockData()), ZERO);
|
||||
PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection;
|
||||
playerConnection.sendPacket(packetPlayOutSpawnEntity);
|
||||
|
||||
PacketPlayOutEntityMetadata packetPlayOutEntityMetadata = new PacketPlayOutEntityMetadata(getId(), datawatcher, true);
|
||||
playerConnection.sendPacket(packetPlayOutEntityMetadata);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hide(Player player, boolean force) {
|
||||
if (!force && --references > 0)
|
||||
return false;
|
||||
|
||||
sendDestroy(player);
|
||||
die();
|
||||
return true;
|
||||
}
|
||||
|
||||
private void sendDestroy(Player player) {
|
||||
PacketPlayOutEntityDestroy packetPlayOutEntityDestroy = new PacketPlayOutEntityDestroy(getId());
|
||||
((CraftPlayer) player).getHandle().playerConnection.sendPacket(packetPlayOutEntityDestroy);
|
||||
}
|
||||
}
|
@ -1,228 +0,0 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2021 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem;
|
||||
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.bukkit.BukkitWorld;
|
||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
|
||||
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
|
||||
import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader;
|
||||
import com.sk89q.worldedit.function.operation.Operations;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.math.transform.AffineTransform;
|
||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||
import com.sk89q.worldedit.regions.selector.CuboidRegionSelector;
|
||||
import com.sk89q.worldedit.session.ClipboardHolder;
|
||||
import com.sk89q.worldedit.world.World;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockType;
|
||||
import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
import de.steamwar.bausystem.world.Color;
|
||||
import de.steamwar.bausystem.world.regions.PasteOptions;
|
||||
import de.steamwar.bausystem.world.regions.Point;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.Objects;
|
||||
|
||||
public class WorldeditWrapper15 implements WorldeditWrapper.IWorldeditWrapper {
|
||||
|
||||
private final WorldEditPlugin WORLDEDIT_PLUGIN = ((WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"));
|
||||
private final World BUKKITWORLD = new BukkitWorld(Bukkit.getWorlds().get(0));
|
||||
|
||||
@Override
|
||||
public void setSelection(Player p, Point minPoint, Point maxPoint) {
|
||||
WORLDEDIT_PLUGIN.getSession(p).setRegionSelector(BUKKITWORLD, new CuboidRegionSelector(BUKKITWORLD, toBlockVector3(minPoint), toBlockVector3(maxPoint)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public EditSession paste(File file, int x, int y, int z, PasteOptions pasteOptions) {
|
||||
Clipboard clipboard;
|
||||
try (ClipboardReader reader = Objects.requireNonNull(ClipboardFormats.findByFile(file)).getReader(new FileInputStream(file))) {
|
||||
clipboard = reader.read();
|
||||
} catch (NullPointerException | IOException e) {
|
||||
throw new SecurityException("Bausystem schematic not found", e);
|
||||
}
|
||||
|
||||
return paste(clipboard, x, y, z, pasteOptions);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EditSession paste(Clipboard clipboard, int x, int y, int z, PasteOptions pasteOptions) {
|
||||
try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(Bukkit.getWorlds().get(0)), -1)) {
|
||||
changeColor(clipboard, pasteOptions.getColor());
|
||||
|
||||
ClipboardHolder ch = new ClipboardHolder(clipboard);
|
||||
BlockVector3 dimensions = clipboard.getDimensions();
|
||||
BlockVector3 v = BlockVector3.at(x, y, z);
|
||||
BlockVector3 offset = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin());
|
||||
if (pasteOptions.isRotate()) {
|
||||
ch.setTransform(new AffineTransform().rotateY(180));
|
||||
v = v.add(dimensions.getX() / 2, 0, dimensions.getZ() / 2).subtract(offset.multiply(-1, 1, -1)).subtract(1, 0, 1);
|
||||
} else {
|
||||
v = v.subtract(dimensions.getX() / 2, 0, dimensions.getZ() / 2).subtract(offset);
|
||||
}
|
||||
|
||||
if (pasteOptions.isReset()) {
|
||||
e.setBlocks(new CuboidRegion(toBlockVector3(pasteOptions.getMinPoint()), toBlockVector3(pasteOptions.getMaxPoint())), BlockTypes.AIR.getDefaultState().toBaseBlock());
|
||||
if (pasteOptions.getWaterLevel() != 0) {
|
||||
e.setBlocks(new CuboidRegion(toBlockVector3(pasteOptions.getMinPoint()), toBlockVector3(pasteOptions.getMaxPoint()).withY(pasteOptions.getWaterLevel())), BlockTypes.WATER.getDefaultState().toBaseBlock());
|
||||
}
|
||||
}
|
||||
Operations.completeBlindly(ch.createPaste(e).to(v).ignoreAirBlocks(pasteOptions.isIgnoreAir()).build());
|
||||
return e;
|
||||
} catch (WorldEditException e) {
|
||||
throw new SecurityException(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWorldEditCommand(String command) {
|
||||
if (command.startsWith("/")) {
|
||||
command = command.replaceFirst("/", "");
|
||||
}
|
||||
command = command.toLowerCase();
|
||||
return WorldEdit.getInstance().getPlatformManager().getPlatformCommandManager().getCommandManager().containsCommand(command);
|
||||
}
|
||||
|
||||
private BlockVector3 toBlockVector3(Point point) {
|
||||
return BlockVector3.at(point.getX(), point.getY(), point.getZ());
|
||||
}
|
||||
|
||||
private void changeColor(Clipboard clipboard, Color color) throws WorldEditException {
|
||||
for (int x = 0; x < clipboard.getDimensions().getX(); x++) {
|
||||
for (int y = 0; y < clipboard.getDimensions().getY(); y++) {
|
||||
for (int z = 0; z < clipboard.getDimensions().getZ(); z++) {
|
||||
BlockVector3 blockPointer = clipboard.getMinimumPoint().add(x, y, z);
|
||||
BaseBlock baseBlock = clipboard.getFullBlock(blockPointer);
|
||||
BlockType blockType = baseBlock.getBlockType();
|
||||
if (blockType != BlockTypes.YELLOW_CONCRETE && blockType != BlockTypes.YELLOW_STAINED_GLASS) {
|
||||
continue;
|
||||
}
|
||||
clipboard.setBlock(blockPointer, mapColor(blockType, color).getDefaultState().toBaseBlock());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private BlockType mapColor(BlockType original, Color color) {
|
||||
switch (color) {
|
||||
case WHITE:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.WHITE_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.WHITE_STAINED_GLASS;
|
||||
}
|
||||
case ORANGE:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.ORANGE_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.ORANGE_STAINED_GLASS;
|
||||
}
|
||||
case MAGENTA:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.MAGENTA_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.MAGENTA_STAINED_GLASS;
|
||||
}
|
||||
case LIGHT_BLUE:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.LIGHT_BLUE_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.LIGHT_BLUE_STAINED_GLASS;
|
||||
}
|
||||
case LIME:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.LIME_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.LIME_STAINED_GLASS;
|
||||
}
|
||||
case PINK:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.PINK_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.PINK_STAINED_GLASS;
|
||||
}
|
||||
case GRAY:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.GRAY_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.GRAY_STAINED_GLASS;
|
||||
}
|
||||
case LIGHT_GRAY:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.LIGHT_GRAY_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.LIGHT_GRAY_STAINED_GLASS;
|
||||
}
|
||||
case CYAN:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.CYAN_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.CYAN_STAINED_GLASS;
|
||||
}
|
||||
case PURPLE:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.PURPLE_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.PURPLE_STAINED_GLASS;
|
||||
}
|
||||
case BLUE:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.BLUE_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.BLUE_STAINED_GLASS;
|
||||
}
|
||||
case BROWN:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.BROWN_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.BROWN_STAINED_GLASS;
|
||||
}
|
||||
case GREEN:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.GREEN_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.GREEN_STAINED_GLASS;
|
||||
}
|
||||
case RED:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.RED_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.RED_STAINED_GLASS;
|
||||
}
|
||||
case BLACK:
|
||||
if (original == BlockTypes.YELLOW_CONCRETE) {
|
||||
return BlockTypes.BLACK_CONCRETE;
|
||||
} else {
|
||||
return BlockTypes.BLACK_STAINED_GLASS;
|
||||
}
|
||||
case YELLOW:
|
||||
default:
|
||||
return original;
|
||||
}
|
||||
}
|
||||
}
|
@ -19,18 +19,15 @@
|
||||
|
||||
package de.steamwar.bausystem.world;
|
||||
|
||||
import com.comphenix.protocol.PacketType;
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
import com.comphenix.protocol.events.PacketAdapter;
|
||||
import com.comphenix.protocol.events.PacketContainer;
|
||||
import com.comphenix.protocol.events.PacketEvent;
|
||||
import com.comphenix.protocol.wrappers.BlockPosition;
|
||||
import com.comphenix.tinyprotocol.Reflection;
|
||||
import com.comphenix.tinyprotocol.TinyProtocol;
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.CraftbukkitWrapper;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.WorldeditWrapper;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.Sign;
|
||||
@ -43,8 +40,47 @@ import org.bukkit.event.block.SignChangeEvent;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class RegionListener implements Listener {
|
||||
|
||||
private final List<Player> signEditing = new ArrayList<>();
|
||||
|
||||
private static final Class<?> updateSign = Reflection.getClass("{nms}.PacketPlayInUpdateSign");
|
||||
private static final Class<?> blockPosition = Reflection.getClass("{nms}.BlockPosition");
|
||||
private static final Reflection.FieldAccessor<?> blockPos = Reflection.getField(updateSign, blockPosition, 0);
|
||||
private static final Reflection.FieldAccessor<String[]> signText = Reflection.getField(updateSign, String[].class, 0);
|
||||
private static final Class<?> baseBlockPosition = Reflection.getClass("{nms}.BaseBlockPosition");
|
||||
private static final Reflection.FieldAccessor<Integer> blockPosX = Reflection.getField(baseBlockPosition, int.class, 0);
|
||||
private static final Reflection.FieldAccessor<Integer> blockPosY = Reflection.getField(baseBlockPosition, int.class, 1);
|
||||
private static final Reflection.FieldAccessor<Integer> blockPosZ = Reflection.getField(baseBlockPosition, int.class, 2);
|
||||
public RegionListener() {
|
||||
TinyProtocol.instance.setInFilter((player, channel, packet) -> {
|
||||
if(!signEditing.contains(player) || !updateSign.isInstance(packet))
|
||||
return packet;
|
||||
|
||||
String[] lines = signText.get(packet);
|
||||
Object pos = blockPos.get(packet);
|
||||
|
||||
Bukkit.getScheduler().runTask(BauSystem.getPlugin(), () -> {
|
||||
Block signLoc = new Location(player.getWorld(), blockPosX.get(pos), blockPosY.get(pos), blockPosZ.get(pos)).getBlock();
|
||||
if (!signLoc.getType().name().contains("SIGN"))
|
||||
return;
|
||||
|
||||
Sign sign = ((Sign) signLoc.getState());
|
||||
for (int i = 0; i < lines.length; i++) {
|
||||
sign.setLine(i, ChatColor.translateAlternateColorCodes('&', lines[i]));
|
||||
}
|
||||
sign.update();
|
||||
|
||||
signEditing.remove(player);
|
||||
});
|
||||
|
||||
return packet;
|
||||
});
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void playerCommandHandler(PlayerCommandPreprocessEvent e) {
|
||||
if (!isWorldEditCommand(e.getMessage().split(" ")[0]))
|
||||
@ -96,30 +132,6 @@ public class RegionListener implements Listener {
|
||||
sign.update();
|
||||
|
||||
CraftbukkitWrapper.impl.openSignEditor(player, event.getClickedBlock().getLocation());
|
||||
|
||||
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(BauSystem.getPlugin(), PacketType.Play.Client.UPDATE_SIGN) {
|
||||
@Override
|
||||
public void onPacketReceiving(PacketEvent event) {
|
||||
if (!event.getPlayer().equals(player))
|
||||
return;
|
||||
Bukkit.getScheduler().runTask(BauSystem.getPlugin(), () -> {
|
||||
PacketContainer packetContainer = event.getPacket();
|
||||
BlockPosition position = packetContainer.getBlockPositionModifier().read(0);
|
||||
String[] lines = packetContainer.getStringArrays().read(0);
|
||||
|
||||
Block signLoc = position.toLocation(player.getWorld()).getBlock();
|
||||
if (!signLoc.getType().name().contains("SIGN"))
|
||||
return;
|
||||
|
||||
Sign sign = ((Sign) signLoc.getState());
|
||||
for (int i = 0; i < lines.length; i++) {
|
||||
sign.setLine(i, ChatColor.translateAlternateColorCodes('&', lines[i]));
|
||||
}
|
||||
sign.update();
|
||||
|
||||
ProtocolLibrary.getProtocolManager().removePacketListener(this);
|
||||
});
|
||||
}
|
||||
});
|
||||
signEditing.add(player);
|
||||
}
|
||||
}
|
||||
|
@ -62,12 +62,6 @@
|
||||
<version>1.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>steamwar</groupId>
|
||||
<artifactId>BauSystem_15</artifactId>
|
||||
<version>1.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>steamwar</groupId>
|
||||
<artifactId>BauSystem_Core</artifactId>
|
||||
|
8
pom.xml
8
pom.xml
@ -71,7 +71,6 @@
|
||||
|
||||
<modules>
|
||||
<module>BauSystem_12</module>
|
||||
<module>BauSystem_15</module>
|
||||
<module>BauSystem_Core</module>
|
||||
<module>BauSystem_Main</module>
|
||||
</modules>
|
||||
@ -84,13 +83,6 @@
|
||||
<scope>system</scope>
|
||||
<systemPath>${main.basedir}/lib/SpigotCore.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>steamwar</groupId>
|
||||
<artifactId>ProtocolLib</artifactId>
|
||||
<version>1.0</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${main.basedir}/lib/ProtocolLib.jar</systemPath>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren