1.18 #77
@ -24,6 +24,7 @@ import de.steamwar.bausystem.entities.DetonatorEntity15;
|
||||
import de.steamwar.bausystem.entities.SimulatorEntity15;
|
||||
import de.steamwar.bausystem.entities.TraceEntity15;
|
||||
import de.steamwar.bausystem.features.detonator.AbstractDetonatorEntity;
|
||||
import de.steamwar.bausystem.features.other.NoClipCommand;
|
||||
import de.steamwar.bausystem.features.simulator.AbstractSimulatorEntity;
|
||||
import de.steamwar.bausystem.features.tracer.AbstractTraceEntity;
|
||||
import de.steamwar.bausystem.features.warp.AbstractWarpEntity;
|
||||
@ -46,7 +47,7 @@ import java.util.function.LongSupplier;
|
||||
|
||||
public class NMSWrapper15 implements NMSWrapper.INMSWrapper {
|
||||
|
||||
private static final Reflection.FieldAccessor<EnumGamemode> playerGameMode = Reflection.getField(PlayerInteractManager.class, "gamemode", EnumGamemode.class);
|
||||
private static final Reflection.FieldAccessor<EnumGamemode> playerGameMode = Reflection.getField(PlayerInteractManager.class, EnumGamemode.class, 0);
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public void setInternalGameMode(Player player, GameMode gameMode) {
|
||||
@ -84,6 +85,12 @@ public class NMSWrapper15 implements NMSWrapper.INMSWrapper {
|
||||
});
|
||||
}
|
||||
|
||||
private static final Reflection.FieldAccessor<Integer> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, int.class, 0);
|
||||
@Override
|
||||
public void setGameStateChangeReason(Object packet) {
|
||||
gameStateChangeReason.set(packet, 3);
|
||||
}
|
||||
|
||||
private static final int threshold = 2048;
|
||||
@Override
|
||||
public boolean checkItemStack(ItemStack item) {
|
||||
|
@ -1,102 +0,0 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2022 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.utils;
|
||||
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.WorldEditException;
|
||||
import com.sk89q.worldedit.extent.clipboard.Clipboard;
|
||||
import de.steamwar.bausystem.region.Color;
|
||||
import de.steamwar.bausystem.region.PasteOptions;
|
||||
import de.steamwar.bausystem.region.Point;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class FlatteningWrapper18 implements FlatteningWrapper.IFlatteningWrapper {
|
||||
|
||||
@Override
|
||||
public boolean isNoBook(ItemStack item) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isUnpusheable(Material material) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBreakingOnPush(Material material) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isWorldEditCommand(String command) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSelection(Player p, Point minPoint, Point maxPoint) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public EditSession paste(File file, Point pastePoint, PasteOptions pasteOptions) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EditSession paste(Clipboard clipboard, Point pastePoint, PasteOptions pasteOptions) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void changeColor(Clipboard clipboard, Color color) throws WorldEditException {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean backup(Point minPoint, Point maxPoint, File file) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inWater(World world, Vector tntPosition) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Material getTraceShowMaterial() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Material getTraceHideMaterial() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Material getTraceXZMaterial() {
|
||||
return null;
|
||||
}
|
||||
}
|
@ -19,62 +19,145 @@
|
||||
|
||||
package de.steamwar.bausystem.utils;
|
||||
|
||||
import com.comphenix.tinyprotocol.Reflection;
|
||||
import com.comphenix.tinyprotocol.TinyProtocol;
|
||||
import de.steamwar.bausystem.entities.DetonatorEntity18;
|
||||
import de.steamwar.bausystem.entities.SimulatorEntity18;
|
||||
import de.steamwar.bausystem.entities.TraceEntity18;
|
||||
import de.steamwar.bausystem.entities.WarpEntity18;
|
||||
import de.steamwar.bausystem.features.detonator.AbstractDetonatorEntity;
|
||||
import de.steamwar.bausystem.features.other.NoClipCommand;
|
||||
import de.steamwar.bausystem.features.simulator.AbstractSimulatorEntity;
|
||||
import de.steamwar.bausystem.features.tracer.AbstractTraceEntity;
|
||||
import de.steamwar.bausystem.features.warp.AbstractWarpEntity;
|
||||
import net.minecraft.SystemUtils;
|
||||
import net.minecraft.nbt.NBTBase;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.network.protocol.Packet;
|
||||
import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata;
|
||||
import net.minecraft.network.protocol.game.PacketPlayOutEntityTeleport;
|
||||
import net.minecraft.network.protocol.game.PacketPlayOutEntityVelocity;
|
||||
import net.minecraft.network.protocol.game.PacketPlayOutGameStateChange;
|
||||
import net.minecraft.server.level.PlayerInteractManager;
|
||||
import net.minecraft.world.level.EnumGamemode;
|
||||
import net.minecraft.world.phys.Vec3D;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity;
|
||||
import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer;
|
||||
import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.LongSupplier;
|
||||
|
||||
public class NMSWrapper18 implements NMSWrapper.INMSWrapper {
|
||||
|
||||
private static final Reflection.FieldAccessor<EnumGamemode> playerGameMode = Reflection.getField(PlayerInteractManager.class, "gamemode", EnumGamemode.class);
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public void setInternalGameMode(Player player, GameMode gameMode) {
|
||||
playerGameMode.set(((CraftPlayer) player).getHandle().d, EnumGamemode.a(gameMode.getValue()));
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(LongSupplier longSupplier) {
|
||||
|
||||
SystemUtils.a = () -> System.nanoTime() + longSupplier.getAsLong();
|
||||
}
|
||||
|
||||
private static final List<Packet<?>> packets = new ArrayList<>();
|
||||
private static final Vec3D noMotion = new Vec3D(0, 0, 0);
|
||||
@Override
|
||||
public void createTickCache(World world) {
|
||||
packets.clear();
|
||||
world.getEntities().stream().filter(entity -> !(entity instanceof Player)).forEach(entity -> {
|
||||
packets.add(new PacketPlayOutEntityVelocity(entity.getEntityId(), noMotion));
|
||||
packets.add(new PacketPlayOutEntityTeleport(((CraftEntity) entity).getHandle()));
|
||||
|
||||
if (entity instanceof TNTPrimed) {
|
||||
net.minecraft.world.entity.Entity serverEntity = ((CraftEntity) entity).getHandle();
|
||||
packets.add(new PacketPlayOutEntityMetadata(serverEntity.ae(), serverEntity.ai(), true));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendTickPackets() {
|
||||
|
||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||
for (Packet<?> p : packets) {
|
||||
TinyProtocol.instance.sendPacket(player, p);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static final Reflection.FieldAccessor<PacketPlayOutGameStateChange.a> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 0);
|
||||
@Override
|
||||
public void setGameStateChangeReason(Object packet) {
|
||||
gameStateChangeReason.set(packet, PacketPlayOutGameStateChange.d);
|
||||
}
|
||||
|
||||
private static final int threshold = 2048;
|
||||
@Override
|
||||
public boolean checkItemStack(ItemStack item) {
|
||||
net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);
|
||||
NBTTagCompound tag = nmsItem.s();
|
||||
if (tag != null && tag.e("BlockEntityTag")) {
|
||||
NBTTagCompound blockTag = tag.p("BlockEntityTag");
|
||||
if (blockTag.e("Items")) {
|
||||
return drillDown(blockTag.c("Items", 10), 0, 0) > threshold;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private int drillDown(NBTTagList items, int layer, int start) {
|
||||
if (layer > 2) return start + threshold;
|
||||
int invalid = start;
|
||||
for (NBTBase nbtBase : items) {
|
||||
if (!(nbtBase instanceof NBTTagCompound))
|
||||
continue;
|
||||
NBTTagCompound slot = (NBTTagCompound) nbtBase;
|
||||
if (slot.e("tag")) {
|
||||
invalid += slot.f("Count");
|
||||
NBTTagCompound iTag = slot.p("tag");
|
||||
if (iTag.e("BlockEntityTag")) {
|
||||
NBTTagCompound blockTag = iTag.p("BlockEntityTag");
|
||||
if (blockTag.e("Items")) {
|
||||
invalid = drillDown(blockTag.c("Items", 10), layer + 1, invalid);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (invalid > threshold)
|
||||
break;
|
||||
}
|
||||
return invalid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractWarpEntity createWarp(World world, Vector position, String name) {
|
||||
return null;
|
||||
return new WarpEntity18(world, position, name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractSimulatorEntity createSimulator(World world, Vector tntPosition, boolean highlight) {
|
||||
return null;
|
||||
return new SimulatorEntity18(world, tntPosition, highlight);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractDetonatorEntity constructDetonator(World world, Vector position) {
|
||||
return null;
|
||||
return new DetonatorEntity18(world, position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AbstractTraceEntity createTrace(World world, Vector tntPosition, boolean tnt) {
|
||||
return null;
|
||||
return new TraceEntity18(world, tntPosition, tnt);
|
||||
}
|
||||
}
|
||||
|
@ -19,12 +19,12 @@
|
||||
|
||||
package de.steamwar.bausystem;
|
||||
|
||||
import com.comphenix.tinyprotocol.TinyProtocol;
|
||||
import de.steamwar.bausystem.configplayer.Config;
|
||||
import de.steamwar.bausystem.linkage.LinkageUtils;
|
||||
import de.steamwar.bausystem.region.loader.PrototypeLoader;
|
||||
import de.steamwar.bausystem.region.loader.RegionLoader;
|
||||
import de.steamwar.bausystem.region.loader.Updater;
|
||||
import de.steamwar.bausystem.utils.ProtocolAPI;
|
||||
import de.steamwar.bausystem.worlddata.WorldData;
|
||||
import de.steamwar.message.Message;
|
||||
import de.steamwar.scoreboard.SWScoreboard;
|
||||
@ -89,7 +89,7 @@ public class BauSystem extends JavaPlugin implements Listener {
|
||||
|
||||
WorldData.write();
|
||||
Config.getInstance().saveAll();
|
||||
ProtocolAPI.tinyProtocol.close();
|
||||
TinyProtocol.instance.close();
|
||||
}
|
||||
|
||||
private void fixLogging() {
|
||||
|
@ -45,7 +45,7 @@ import java.util.Set;
|
||||
@Linked(LinkageType.LISTENER)
|
||||
public class DetonatorListener implements Listener {
|
||||
|
||||
public static final Class<?> useEntity = Reflection.getClass("{nms}.PacketPlayInUseEntity");
|
||||
public static final Class<?> useEntity = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUseEntity");
|
||||
private static final Reflection.FieldAccessor<Integer> entityIdFieldAccessor = Reflection.getField(useEntity, int.class, 0);
|
||||
|
||||
private static final Set<Player> HAS_UPDATED = new HashSet<>();
|
||||
|
@ -20,6 +20,7 @@
|
||||
package de.steamwar.bausystem.features.other;
|
||||
|
||||
import com.comphenix.tinyprotocol.Reflection;
|
||||
import com.comphenix.tinyprotocol.TinyProtocol;
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.tpslimit.TPSUtils;
|
||||
@ -28,6 +29,7 @@ import de.steamwar.bausystem.linkage.Linked;
|
||||
import de.steamwar.bausystem.utils.NMSWrapper;
|
||||
import de.steamwar.bausystem.utils.ProtocolAPI;
|
||||
import de.steamwar.command.SWCommand;
|
||||
import de.steamwar.core.Core;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
|
||||
@ -46,28 +48,26 @@ import java.util.function.BiFunction;
|
||||
@Linked(LinkageType.LISTENER)
|
||||
public class NoClipCommand extends SWCommand implements Listener {
|
||||
|
||||
private static final Class<?> playerInfoPacket = Reflection.getClass("{nms}.PacketPlayOutPlayerInfo");
|
||||
private static final Reflection.ConstructorInvoker playerInfoConstructor = Reflection.getConstructor(playerInfoPacket);
|
||||
private static final Class<?> playerInfoActionClass = Reflection.getClass("{nms}.PacketPlayOutPlayerInfo$EnumPlayerInfoAction");
|
||||
private static final Class<?> playerInfoPacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutPlayerInfo");
|
||||
private static final Class<?> playerInfoActionClass = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutPlayerInfo$EnumPlayerInfoAction");
|
||||
private static final Reflection.FieldAccessor<?> playerInfoAction = Reflection.getField(playerInfoPacket, playerInfoActionClass, 0);
|
||||
private static final Object updateGamemode = playerInfoActionClass.getEnumConstants()[1];
|
||||
private static final Reflection.FieldAccessor<List> playerInfoData = Reflection.getField(playerInfoPacket, List.class, 0);
|
||||
private static final Class<?> playerInfoDataClass = Reflection.getClass("{nms}.PacketPlayOutPlayerInfo$PlayerInfoData");
|
||||
private static final Class<?> enumGamemode = Reflection.getClass("{nms}.EnumGamemode");
|
||||
private static final Object spectator = enumGamemode.getEnumConstants()[4];
|
||||
private static final Class<?> iChatBaseComponent = Reflection.getClass("{nms}.IChatBaseComponent");
|
||||
private static final Class<?> playerInfoDataClass = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutPlayerInfo$PlayerInfoData");
|
||||
private static final Class<?> enumGamemode = Reflection.getClass("{nms.world.level}.EnumGamemode");
|
||||
private static final Object spectator = enumGamemode.getEnumConstants()[Core.getVersion() > 15 ? 3 : 4];
|
||||
private static final Class<?> iChatBaseComponent = Reflection.getClass("{nms.network.chat}.IChatBaseComponent");
|
||||
|
||||
private static final Reflection.ConstructorInvoker playerInfoDataConstructor = Reflection.getConstructor(playerInfoDataClass, playerInfoPacket, GameProfile.class, int.class, enumGamemode, iChatBaseComponent);
|
||||
private static final Reflection.ConstructorInvoker playerInfoDataConstructor = Core.getVersion() > 15 ? Reflection.getConstructor(playerInfoDataClass, GameProfile.class, int.class, enumGamemode, iChatBaseComponent) : Reflection.getConstructor(playerInfoDataClass, playerInfoPacket, GameProfile.class, int.class, enumGamemode, iChatBaseComponent);
|
||||
|
||||
private static final Class<?> gameStateChange = Reflection.getClass("{nms}.PacketPlayOutGameStateChange");
|
||||
private static final Reflection.FieldAccessor<Integer> integerFieldAccessor = Reflection.getField(gameStateChange, int.class, 0);
|
||||
public static final Class<?> gameStateChange = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutGameStateChange");
|
||||
private static final Reflection.FieldAccessor<Float> floatFieldAccessor = Reflection.getField(gameStateChange, float.class, 0);
|
||||
|
||||
private static final Class<?> position = Reflection.getClass("{nms}.PacketPlayInFlying$PacketPlayInPosition");
|
||||
private static final Class<?> positionLook = Reflection.getClass("{nms}.PacketPlayInFlying$PacketPlayInPositionLook");
|
||||
private static final Class<?> useItem = Reflection.getClass("{nms}.PacketPlayInUseItem");
|
||||
private static final Class<?> blockDig = Reflection.getClass("{nms}.PacketPlayInBlockDig");
|
||||
private static final Class<?> windowClick = Reflection.getClass("{nms}.PacketPlayInWindowClick");
|
||||
private static final Class<?> position = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInPosition");
|
||||
private static final Class<?> positionLook = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInPositionLook");
|
||||
private static final Class<?> useItem = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUseItem");
|
||||
private static final Class<?> blockDig = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInBlockDig");
|
||||
private static final Class<?> windowClick = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInWindowClick");
|
||||
|
||||
@Getter
|
||||
private static final List<Player> NOCLIPS = new ArrayList<>();
|
||||
@ -110,12 +110,12 @@ public class NoClipCommand extends SWCommand implements Listener {
|
||||
((CraftPlayer) player).getHandle().abilities.canInstantlyBuild = true;
|
||||
|
||||
Object gameStateChangeObject = Reflection.newInstance(gameStateChange);
|
||||
integerFieldAccessor.set(gameStateChangeObject, 3);
|
||||
NMSWrapper.impl.setGameStateChangeReason(gameStateChangeObject);
|
||||
floatFieldAccessor.set(gameStateChangeObject, 1F);
|
||||
|
||||
NOCLIPS.add(player);
|
||||
BauSystem.MESSAGE.send("OTHER_NOCLIP_SLOT_INFO", player);
|
||||
ProtocolAPI.tinyProtocol.sendPacket(player, gameStateChangeObject);
|
||||
TinyProtocol.instance.sendPacket(player, gameStateChangeObject);
|
||||
pseudoSpectator(player);
|
||||
}
|
||||
}
|
||||
@ -154,13 +154,13 @@ public class NoClipCommand extends SWCommand implements Listener {
|
||||
}
|
||||
|
||||
private static void pseudoSpectator(Player player) {
|
||||
ProtocolAPI.tinyProtocol.sendPacket(player, playerInfoPacket(updateGamemode, new GameProfile(player.getUniqueId(), player.getName()), spectator));
|
||||
TinyProtocol.instance.sendPacket(player, playerInfoPacket(updateGamemode, new GameProfile(player.getUniqueId(), player.getName()), spectator));
|
||||
}
|
||||
|
||||
private static Object playerInfoPacket(Object action, GameProfile profile, Object mode) {
|
||||
Object packet = playerInfoConstructor.invoke();
|
||||
Object packet = Reflection.newInstance(playerInfoPacket);
|
||||
playerInfoAction.set(packet, action);
|
||||
playerInfoData.set(packet, Collections.singletonList(playerInfoDataConstructor.invoke(packet, profile, 0, mode, null)));
|
||||
playerInfoData.set(packet, Collections.singletonList(Core.getVersion() > 15 ? playerInfoDataConstructor.invoke(profile, 0, mode, null) : playerInfoDataConstructor.invoke(packet, profile, 0, mode, null)));
|
||||
return packet;
|
||||
}
|
||||
}
|
@ -20,14 +20,13 @@
|
||||
package de.steamwar.bausystem.features.world;
|
||||
|
||||
import com.comphenix.tinyprotocol.Reflection;
|
||||
import com.comphenix.tinyprotocol.TinyProtocol;
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.linkage.LinkageType;
|
||||
import de.steamwar.bausystem.linkage.Linked;
|
||||
import de.steamwar.bausystem.utils.ProtocolAPI;
|
||||
import net.minecraft.server.v1_15_R1.BlockPosition;
|
||||
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;
|
||||
@ -36,16 +35,23 @@ import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
@Linked(LinkageType.LISTENER)
|
||||
public class SignEdit implements Listener {
|
||||
|
||||
public static final Class<?> openSign = Reflection.getClass("{nms}.PacketPlayOutOpenSignEditor");
|
||||
private static final Reflection.FieldAccessor<net.minecraft.server.v1_15_R1.BlockPosition> blockPositionFieldAccessor = Reflection.getField(openSign, net.minecraft.server.v1_15_R1.BlockPosition.class, 0);
|
||||
private static final Class<?> blockPosition = Reflection.getClass("{nms.core}.BlockPosition");
|
||||
private static final Class<?> craftBlock = Reflection.getClass("{obc}.CraftBlock");
|
||||
private static final Class<?> craftWorld = Reflection.getClass("{obc}.CraftWorld");
|
||||
private static final Class<?> generatorAccess = Reflection.getClass("{nms.world.level}.GeneratorAccess");
|
||||
private static final Reflection.MethodInvoker getPosition = Reflection.getTypedMethod(craftBlock, "getPosition", blockPosition);
|
||||
private static final Reflection.MethodInvoker getWorldHandle = Reflection.getTypedMethod(craftWorld, "getHandle", null);
|
||||
private static final Reflection.MethodInvoker at = Reflection.getTypedMethod(craftBlock, "at", generatorAccess, blockPosition);
|
||||
|
||||
public static final Class<?> updateSign = Reflection.getClass("{nms}.PacketPlayInUpdateSign");
|
||||
private static final Reflection.FieldAccessor<BlockPosition> getBlockPositionFieldAccessor = Reflection.getField(updateSign, BlockPosition.class, 0);
|
||||
private static final Class<?> openSign = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutOpenSignEditor");
|
||||
private static final Reflection.FieldAccessor<?> blockPositionFieldAccessor = Reflection.getField(openSign, blockPosition, 0);
|
||||
|
||||
private static final Class<?> updateSign = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUpdateSign");
|
||||
private static final Reflection.FieldAccessor<?> getBlockPositionFieldAccessor = Reflection.getField(updateSign, blockPosition, 0);
|
||||
private static final Reflection.FieldAccessor<String[]> stringFieldAccessor = Reflection.getField(updateSign, String[].class, 0);
|
||||
|
||||
@EventHandler
|
||||
@ -66,18 +72,16 @@ public class SignEdit implements Listener {
|
||||
sign.update();
|
||||
|
||||
Object openSignObject = Reflection.newInstance(openSign);
|
||||
Vector vector = event.getClickedBlock().getLocation().toVector();
|
||||
blockPositionFieldAccessor.set(openSignObject, new BlockPosition(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ()));
|
||||
ProtocolAPI.tinyProtocol.sendPacket(player, openSignObject);
|
||||
blockPositionFieldAccessor.set(openSignObject, getPosition.invoke(event.getClickedBlock()));
|
||||
TinyProtocol.instance.sendPacket(player, openSignObject);
|
||||
}
|
||||
|
||||
{
|
||||
ProtocolAPI.setIncomingHandler(updateSign, (player, o) -> {
|
||||
Bukkit.getScheduler().runTask(BauSystem.getInstance(), () -> {
|
||||
BlockPosition position = getBlockPositionFieldAccessor.get(o);
|
||||
String[] lines = stringFieldAccessor.get(o);
|
||||
|
||||
Block signLoc = new Location(player.getWorld(), position.getX(), position.getY(), position.getZ()).getBlock();
|
||||
Block signLoc = (Block) at.invoke(null, getWorldHandle.invoke(player.getWorld()), getBlockPositionFieldAccessor.get(o));
|
||||
if (!signLoc.getType().name().contains("SIGN"))
|
||||
return;
|
||||
|
||||
|
@ -45,6 +45,8 @@ public class NMSWrapper {
|
||||
void createTickCache(World world);
|
||||
void sendTickPackets();
|
||||
|
||||
void setGameStateChangeReason(Object packet);
|
||||
|
||||
boolean checkItemStack(ItemStack item);
|
||||
|
||||
AbstractWarpEntity createWarp(World world, Vector position, String name);
|
||||
|
@ -34,8 +34,6 @@ public class ProtocolAPI {
|
||||
private static final Map<Class<?>, BiFunction<Player, Object, Object>> outgoingHandler = new HashMap<>();
|
||||
private static final Map<Class<?>, BiFunction<Player, Object, Object>> incomingHandler = new HashMap<>();
|
||||
|
||||
public static final TinyProtocol tinyProtocol = TinyProtocol.instance;
|
||||
|
||||
static {
|
||||
TinyProtocol.instance.setOutFilter((receiver, channel, packet) -> {
|
||||
BiFunction<Player, Object, Object> handler = outgoingHandler.get(packet.getClass());
|
||||
@ -70,6 +68,6 @@ public class ProtocolAPI {
|
||||
}
|
||||
|
||||
public static void broadcastPacket(Object packet) {
|
||||
Bukkit.getOnlinePlayers().stream().map(tinyProtocol::getChannel).filter(tinyProtocol::hasInjected).forEach(channel -> tinyProtocol.sendPacket(channel, packet));
|
||||
Bukkit.getOnlinePlayers().stream().map(TinyProtocol.instance::getChannel).filter(TinyProtocol.instance::hasInjected).forEach(channel -> TinyProtocol.instance.sendPacket(channel, packet));
|
||||
}
|
||||
}
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren