From e8876451353155017237cdfe2964e59c8996acc4 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 4 Jun 2023 12:05:00 -0500 Subject: [PATCH 01/17] Remove 1.14.4 --- modules/Movecraft/pom.xml | 6 - modules/v1_14_R1/pom.xml | 59 ---- .../compat/v1_14_R1/IWorldHandler.java | 299 ------------------ .../support/v1_14_R1/IAsyncChunk.java | 60 ---- .../support/v1_14_R1/ISmoothTeleport.java | 113 ------- pom.xml | 3 +- 6 files changed, 1 insertion(+), 539 deletions(-) delete mode 100644 modules/v1_14_R1/pom.xml delete mode 100644 modules/v1_14_R1/src/main/java/net/countercraft/movecraft/compat/v1_14_R1/IWorldHandler.java delete mode 100644 modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/IAsyncChunk.java delete mode 100644 modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/ISmoothTeleport.java diff --git a/modules/Movecraft/pom.xml b/modules/Movecraft/pom.xml index 7280819ef..cc54d4134 100644 --- a/modules/Movecraft/pom.xml +++ b/modules/Movecraft/pom.xml @@ -30,12 +30,6 @@ - - net.countercraft - movecraft-v1_14_r1 - ${revision} - jar - net.countercraft movecraft-v1_16_r3 diff --git a/modules/v1_14_R1/pom.xml b/modules/v1_14_R1/pom.xml deleted file mode 100644 index 4bff5c08a..000000000 --- a/modules/v1_14_R1/pom.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - movecraft-parent - net.countercraft - ${revision} - ../../pom.xml - - 4.0.0 - - movecraft-v1_14_r1 - Movecraft-v1_14_R1 - - - org.bukkit - craftbukkit - 1.14.4-R0.1-SNAPSHOT - provided - - - net.countercraft - movecraft-api - ${revision} - jar - - - - src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - - net/countercraft/movecraft/compat/v1_14_R1/** - net/countercraft/movecraft/support/v1_14_R1/** - - 13 - 13 - - - - org.apache.maven.plugins - maven-jar-plugin - 2.4 - - - net/countercraft/movecraft/compat/v1_14_R1/** - net/countercraft/movecraft/support/v1_14_R1/** - - - - - - - \ No newline at end of file diff --git a/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/compat/v1_14_R1/IWorldHandler.java b/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/compat/v1_14_R1/IWorldHandler.java deleted file mode 100644 index 61472676f..000000000 --- a/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/compat/v1_14_R1/IWorldHandler.java +++ /dev/null @@ -1,299 +0,0 @@ -package net.countercraft.movecraft.compat.v1_14_R1; - -import net.countercraft.movecraft.MovecraftLocation; -import net.countercraft.movecraft.MovecraftRotation; -import net.countercraft.movecraft.WorldHandler; -import net.countercraft.movecraft.craft.Craft; -import net.countercraft.movecraft.util.CollectionUtils; -import net.countercraft.movecraft.util.MathUtils; -import net.countercraft.movecraft.util.hitboxes.HitBox; -import net.minecraft.server.v1_14_R1.Block; -import net.minecraft.server.v1_14_R1.BlockPosition; -import net.minecraft.server.v1_14_R1.Blocks; -import net.minecraft.server.v1_14_R1.Chunk; -import net.minecraft.server.v1_14_R1.ChunkSection; -import net.minecraft.server.v1_14_R1.EnumBlockRotation; -import net.minecraft.server.v1_14_R1.IBlockData; -import net.minecraft.server.v1_14_R1.NextTickListEntry; -import net.minecraft.server.v1_14_R1.StructureBoundingBox; -import net.minecraft.server.v1_14_R1.TileEntity; -import net.minecraft.server.v1_14_R1.World; -import net.minecraft.server.v1_14_R1.WorldServer; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_14_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_14_R1.util.CraftMagicNumbers; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@SuppressWarnings("unused") -public class IWorldHandler extends WorldHandler { - private static final EnumBlockRotation ROTATION[]; - - static { - ROTATION = new EnumBlockRotation[3]; - ROTATION[MovecraftRotation.NONE.ordinal()] = EnumBlockRotation.NONE; - ROTATION[MovecraftRotation.CLOCKWISE.ordinal()] = EnumBlockRotation.CLOCKWISE_90; - ROTATION[MovecraftRotation.ANTICLOCKWISE.ordinal()] = EnumBlockRotation.COUNTERCLOCKWISE_90; - } - - public IWorldHandler() { - String mappings = ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion(); - if (!mappings.equals("11ae498d9cf909730659b6357e7c2afa")) - throw new IllegalStateException("Movecraft is not compatible with this version of Minecraft 1.14: " + mappings); - } - - @Override - public void rotateCraft(@NotNull Craft craft, @NotNull MovecraftLocation originPoint, @NotNull MovecraftRotation rotation) { - //******************************************* - //* Step one: Convert to Positions * - //******************************************* - HashMap rotatedPositions = new HashMap<>(); - MovecraftRotation counterRotation = rotation == MovecraftRotation.CLOCKWISE ? MovecraftRotation.ANTICLOCKWISE : MovecraftRotation.CLOCKWISE; - for (MovecraftLocation newLocation : craft.getHitBox()) { - rotatedPositions.put(locationToPosition(MathUtils.rotateVec(counterRotation, newLocation.subtract(originPoint)).add(originPoint)), locationToPosition(newLocation)); - } - //******************************************* - //* Step two: Get the tiles * - //******************************************* - WorldServer nativeWorld = ((CraftWorld) craft.getWorld()).getHandle(); - List tiles = new ArrayList<>(); - List> tileTicks = new ArrayList<>(); - HitBox testBox = craft.getHitBox(); - BlockPosition position1 = new BlockPosition(testBox.getMidPoint().getX() - testBox.getZLength()/2 - 2, 0, testBox.getMidPoint().getZ() - testBox.getXLength()/2 - 2); - BlockPosition position2 = new BlockPosition(testBox.getMidPoint().getX() + testBox.getZLength()/2 + 3, 0, testBox.getMidPoint().getZ() + testBox.getXLength()/2 + 3); - List> capturedTicks = nativeWorld.getBlockTickList().a(new StructureBoundingBox(position1, position2), true, true); - //get the tiles - for (BlockPosition position : rotatedPositions.keySet()) { - if (nativeWorld.getType(position) == Blocks.AIR.getBlockData()) - continue; - //Find the ticks associated with this location - for (NextTickListEntry entry : capturedTicks) { - if (entry.a.equals(position)) { - tileTicks.add(entry); - } - } - - //Remove the old tile and add it to the list - TileEntity tile = removeTileEntity(nativeWorld, position); - if (tile != null) { - tile.a(ROTATION[rotation.ordinal()]); - tiles.add(tile); - } - } - - //Put back all the ticks we didn't move - capturedTicks.removeAll(tileTicks); - for (NextTickListEntry entry : capturedTicks) { - final long currentTime = nativeWorld.worldData.getTime(); - nativeWorld.getBlockTickList().a(entry.a, (Block) entry.b(), (int) (entry.b - currentTime), entry.c); - } - - //******************************************* - //* Step three: Translate all the blocks * - //******************************************* - // blockedByWater=false means an ocean-going vessel - //TODO: Simplify - //TODO: go by chunks - //TODO: Don't move unnecessary blocks - //get the blocks and rotate them - HashMap blockData = new HashMap<>(); - for (BlockPosition position : rotatedPositions.keySet()) { - blockData.put(position, nativeWorld.getType(position).a(ROTATION[rotation.ordinal()])); - } - //create the new block - for (Map.Entry entry : blockData.entrySet()) { - setBlockFast(nativeWorld, rotatedPositions.get(entry.getKey()), entry.getValue()); - } - - - //******************************************* - //* Step four: replace all the tiles * - //******************************************* - //TODO: go by chunks - for (TileEntity tile : tiles) { - moveTileEntity(nativeWorld, rotatedPositions.get(tile.getPosition()), tile); - } - for (NextTickListEntry entry : tileTicks) { - final long currentTime = nativeWorld.worldData.getTime(); - nativeWorld.getBlockTickList().a(rotatedPositions.get(entry.a), (Block) entry.b(), (int) (entry.b - currentTime), entry.c); - } - //******************************************* - //* Step five: Destroy the leftovers * - //******************************************* - //TODO: add support for pass-through - Collection deletePositions = CollectionUtils.filter(rotatedPositions.keySet(), rotatedPositions.values()); - for (BlockPosition position : deletePositions) { - setBlockFast(nativeWorld, position, Blocks.AIR.getBlockData()); - } - } - - @Override - public void translateCraft(@NotNull Craft craft, @NotNull MovecraftLocation displacement, @NotNull org.bukkit.World world) { - //TODO: Add support for rotations - //A craftTranslateCommand should only occur if the craft is moving to a valid position - //******************************************* - //* Step one: Convert to Positions * - //******************************************* - BlockPosition translateVector = locationToPosition(displacement); - List positions = new ArrayList<>(craft.getHitBox().size()); - craft.getHitBox().forEach((movecraftLocation) -> positions.add(locationToPosition((movecraftLocation)).b(translateVector))); - WorldServer oldNativeWorld = ((CraftWorld) craft.getWorld()).getHandle(); - World nativeWorld = ((CraftWorld) world).getHandle(); - //******************************************* - //* Step two: Get the tiles * - //******************************************* - List tiles = new ArrayList<>(); - List> tileTicks = new ArrayList<>(); - - //Get all ticks within the craft's bounding box - //The function to search for ticks ignores Y position, so we simply set it to 0 - HitBox testBox = craft.getHitBox(); - List> capturedTicks = oldNativeWorld.getBlockTickList().a(new StructureBoundingBox(testBox.getMinX() - 1, testBox.getMinZ() - 1, testBox.getMaxX() + 2, testBox.getMaxZ() + 2), true, true); - //get the tiles - for (BlockPosition position : positions) { - if (oldNativeWorld.getType(position) == Blocks.AIR.getBlockData()) - continue; - - //Find the ticks associated with this location - for (NextTickListEntry entry : capturedTicks) { - if (entry.a.equals(position)) { - tileTicks.add(entry); - } - } - - //Remove the old tile and add it to the list - TileEntity tile = removeTileEntity(oldNativeWorld, position); - if (tile != null) { - tiles.add(tile); - } - } - //Put back the ticks we didn't move - capturedTicks.removeAll(tileTicks); - for (NextTickListEntry entry : capturedTicks) { - final long currentTime = nativeWorld.worldData.getTime(); - nativeWorld.getBlockTickList().a(entry.a, (Block) entry.b(), (int) (entry.b - currentTime), entry.c); - } - //******************************************* - //* Step three: Translate all the blocks * - //******************************************* - // blockedByWater=false means an ocean-going vessel - //TODO: Simplify - //TODO: go by chunks - //TODO: Don't move unnecessary blocks - //get the blocks and translate the positions - List blockData = new ArrayList<>(); - List newPositions = new ArrayList<>(); - for (BlockPosition position : positions) { - blockData.add(oldNativeWorld.getType(position)); - newPositions.add(position.a(translateVector)); - } - //create the new block - for (int i = 0, positionSize = newPositions.size(); i < positionSize; i++) { - setBlockFast(nativeWorld, newPositions.get(i), blockData.get(i)); - } - //******************************************* - //* Step four: replace all the tiles * - //******************************************* - //TODO: go by chunks - for (TileEntity tile : tiles) { - moveTileEntity(nativeWorld, tile.getPosition().a(translateVector), tile); - } - for (NextTickListEntry entry : tileTicks) { - final long currentTime = nativeWorld.worldData.getTime(); - nativeWorld.getBlockTickList().a(entry.a.a(translateVector), (Block) entry.b(), (int) (entry.b - currentTime), entry.c); - } - //******************************************* - //* Step five: Destroy the leftovers * - //******************************************* - List deletePositions = positions; - if (oldNativeWorld == nativeWorld) - deletePositions = CollectionUtils.filter(positions, newPositions); - for (BlockPosition position : deletePositions) { - setBlockFast(oldNativeWorld, position, Blocks.AIR.getBlockData()); - } - } - - @Nullable - private TileEntity removeTileEntity(@NotNull World world, @NotNull BlockPosition position) { - return world.getChunkAtWorldCoords(position).tileEntities.remove(position); - } - - @NotNull - private BlockPosition locationToPosition(@NotNull MovecraftLocation loc) { - return new BlockPosition(loc.getX(), loc.getY(), loc.getZ()); - } - - private void setBlockFast(@NotNull World world, @NotNull BlockPosition position, @NotNull IBlockData data) { - Chunk chunk = world.getChunkAtWorldCoords(position); - ChunkSection chunkSection = chunk.getSections()[position.getY() >> 4]; - if (chunkSection == null) { - // Put a GLASS block to initialize the section. It will be replaced next with the real block. - chunk.setType(position, Blocks.GLASS.getBlockData(), false); - chunkSection = chunk.getSections()[position.getY() >> 4]; - } - if (chunkSection.getType(position.getX() & 15, position.getY() & 15, position.getZ() & 15).equals(data)) { - //Block is already of correct type and data, don't overwrite - return; - } - - chunkSection.setType(position.getX() & 15, position.getY() & 15, position.getZ() & 15, data); - world.notify(position, data, data, 3); - var engine = chunk.e(); - if (engine != null) - engine.a(position); - chunk.markDirty(); - } - - @Override - public void setBlockFast(@NotNull Location location, @NotNull BlockData data) { - setBlockFast(location, MovecraftRotation.NONE, data); - } - - @Override - public void setBlockFast(@NotNull Location location, @NotNull MovecraftRotation rotation, @NotNull BlockData data) { - IBlockData blockData; - if (data instanceof CraftBlockData) { - blockData = ((CraftBlockData) data).getState(); - } - else { - blockData = (IBlockData) data; - } - blockData = blockData.a(ROTATION[rotation.ordinal()]); - World world = ((CraftWorld) (location.getWorld())).getHandle(); - BlockPosition blockPosition = locationToPosition(bukkit2MovecraftLoc(location)); - setBlockFast(world, blockPosition, blockData); - } - - @Override - public void disableShadow(@NotNull Material type) { - // Disabled - } - - private static MovecraftLocation bukkit2MovecraftLoc(Location l) { - return new MovecraftLocation(l.getBlockX(), l.getBlockY(), l.getBlockZ()); - } - - private void moveTileEntity(@NotNull World nativeWorld, @NotNull BlockPosition newPosition, @NotNull TileEntity tile) { - Chunk chunk = nativeWorld.getChunkAtWorldCoords(newPosition); - tile.invalidateBlockCache(); - tile.setWorld(nativeWorld); - tile.setPosition(newPosition); - if (nativeWorld.captureBlockStates) { - tile.setWorld(nativeWorld); - tile.setPosition(newPosition); - nativeWorld.capturedTileEntities.put(newPosition, tile); - return; - } - chunk.tileEntities.put(newPosition, tile); - } - -} \ No newline at end of file diff --git a/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/IAsyncChunk.java b/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/IAsyncChunk.java deleted file mode 100644 index 445da02f9..000000000 --- a/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/IAsyncChunk.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.countercraft.movecraft.support.v1_14_R1; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import net.countercraft.movecraft.MovecraftLocation; -import net.countercraft.movecraft.processing.WorldManager; -import net.countercraft.movecraft.support.AsyncChunk; -import net.minecraft.server.v1_14_R1.BlockPosition; -import net.minecraft.server.v1_14_R1.IBlockData; -import org.bukkit.Chunk; -import org.bukkit.Material; -import org.bukkit.block.BlockState; -import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_14_R1.CraftChunk; -import org.bukkit.craftbukkit.v1_14_R1.block.data.CraftBlockData; -import org.jetbrains.annotations.NotNull; - -@SuppressWarnings("unused") -public class IAsyncChunk extends AsyncChunk { - - private final @NotNull - LoadingCache stateCache = CacheBuilder.newBuilder().maximumSize(100).build(new CacheLoader<>() { - @Override - public BlockState load(@NotNull MovecraftLocation movecraftLocation) { - var block = chunk.getBlock(movecraftLocation.getX(), movecraftLocation.getY(), movecraftLocation.getZ()); - return WorldManager.INSTANCE.executeMain(block::getState); - } - }); - - public IAsyncChunk(@NotNull Chunk chunk) { - super(chunk); - } - - @NotNull - @Override - protected CraftChunk adapt(@NotNull org.bukkit.Chunk chunk) { - return (CraftChunk) chunk; - } - - @NotNull - @Override - public BlockState getState(@NotNull MovecraftLocation location) { - return stateCache.getUnchecked(location); - } - - @Override - @NotNull - public Material getType(@NotNull MovecraftLocation location){ - return CraftBlockData.fromData(chunk.getHandle().getType(new BlockPosition(location.getX(), location.getY(), location.getZ()))).getMaterial(); - } - - @Override - @NotNull - public BlockData getData(@NotNull MovecraftLocation location){ - IBlockData data = chunk.getHandle().getType(new BlockPosition(location.getX(), location.getY(), location.getZ())); - return CraftBlockData.fromData(data); - } - -} diff --git a/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/ISmoothTeleport.java b/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/ISmoothTeleport.java deleted file mode 100644 index f69e195e3..000000000 --- a/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/ISmoothTeleport.java +++ /dev/null @@ -1,113 +0,0 @@ -package net.countercraft.movecraft.support.v1_14_R1; - -import net.countercraft.movecraft.SmoothTeleport; -import net.countercraft.movecraft.util.ReflectUtils; -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Set; - -/** - * Code taken with permission from MicleBrick - * https://www.spigotmc.org/threads/teleport-player-smoothly.317416/ - * Used for 1.14.4 to 1.16.5 - */ -public class ISmoothTeleport extends SmoothTeleport { - private final Set teleportFlags; - - private final Constructor packetConstructor; - private final Constructor vec3D; - - private final Method position; - private final Method sendMethod; - - private final Field connectionField; - private final Field justTeleportedField; - private final Field teleportPosField; - private final Field lastPosXField; - private final Field lastPosYField; - private final Field lastPosZField; - private final Field teleportAwaitField; - private final Field AField; - private final Field eField; - private final Field yaw; - private final Field pitch; - - private static @NotNull Class getNmsClass(String name) throws ClassNotFoundException { - return Class.forName("net.minecraft.server." + ReflectUtils.getVersion() + "." + name); - } - - private void sendPacket(Object packet, Player p) { - try { - Object handle = ReflectUtils.getHandle(p); - Object pConnection = connectionField.get(handle); - sendMethod.invoke(pConnection, packet); - } - catch (Exception e) { - e.printStackTrace(); - } - } - - public ISmoothTeleport() throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException { - Class packet = getNmsClass("Packet"); - Class entity = getNmsClass("Entity"); - Class entityPlayer = getNmsClass("EntityPlayer"); - Class connectionClass = getNmsClass("PlayerConnection"); - Class packetClass = getNmsClass("PacketPlayOutPosition"); - Class vecClass = getNmsClass("Vec3D"); - sendMethod = connectionClass.getMethod("sendPacket", packet); - - position = entity.getDeclaredMethod("setLocation", Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE); - - yaw = ReflectUtils.getField(entity, "yaw"); - pitch = ReflectUtils.getField(entity, "pitch"); - connectionField = ReflectUtils.getField(entityPlayer, "playerConnection"); - - packetConstructor = packetClass.getConstructor(Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE, Set.class, Integer.TYPE); - vec3D = vecClass.getConstructor(Double.TYPE, Double.TYPE, Double.TYPE); - - Object[] enumObjects = getNmsClass("PacketPlayOutPosition$EnumPlayerTeleportFlags").getEnumConstants(); - teleportFlags = Set.of(enumObjects[4], enumObjects[3]); - - justTeleportedField = ReflectUtils.getField(connectionClass, "justTeleported"); - teleportPosField = ReflectUtils.getField(connectionClass, "teleportPos"); - lastPosXField = ReflectUtils.getField(connectionClass, "lastPosX"); - lastPosYField = ReflectUtils.getField(connectionClass, "lastPosY"); - lastPosZField = ReflectUtils.getField(connectionClass, "lastPosZ"); - teleportAwaitField = ReflectUtils.getField(connectionClass, "teleportAwait"); - AField = ReflectUtils.getField(connectionClass, "A"); - eField = ReflectUtils.getField(connectionClass, "e"); - } - - public void teleport(Player player, @NotNull Location location, float yawChange, float pitchChange) { - double x = location.getX(); - double y = location.getY(); - double z = location.getZ(); - Object handle = ReflectUtils.getHandle(player); - try { - position.invoke(handle, x, y, z, yaw.get(handle), pitch.get(handle)); - Object connection = connectionField.get(handle); - justTeleportedField.set(connection, true); - teleportPosField.set(connection, vec3D.newInstance(x, y, z)); - lastPosXField.set(connection, x); - lastPosYField.set(connection, y); - lastPosZField.set(connection, z); - int teleportAwait = teleportAwaitField.getInt(connection) + 1; - if (teleportAwait == Integer.MAX_VALUE) - teleportAwait = 0; - teleportAwaitField.set(connection, teleportAwait); - AField.set(connection, eField.get(connection)); - - Object packet = packetConstructor.newInstance(x, y, z, yawChange, pitchChange, teleportFlags, teleportAwait); - sendPacket(packet, player); - } - catch (IllegalAccessException | IllegalArgumentException | InstantiationException | InvocationTargetException e) { - e.printStackTrace(); - } - } -} diff --git a/pom.xml b/pom.xml index c30b5bfa9..abc39e141 100644 --- a/pom.xml +++ b/pom.xml @@ -9,12 +9,11 @@ http://github.com/apdevteam/Movecraft UTF-8 - 8.0.0_beta-1 + 8.0.0_beta-2_snapshot modules/api - modules/v1_14_R1 modules/v1_16_R3 modules/v1_17_R1 modules/v1_18_R2 From 5299d41c4236db7730d60ab2adc0edbf3f84dd8b Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 4 Jun 2023 12:07:50 -0500 Subject: [PATCH 02/17] Stub out 1.20 world handler based on 1.19.4 --- modules/Movecraft/pom.xml | 6 + modules/v1_20_R1/pom.xml | 94 ++++++ .../compat/v1_19_R3/IWorldHandler.java | 299 ++++++++++++++++++ .../compat/v1_19_R3/NextTickProvider.java | 44 +++ .../support/v1_19_R3/IAsyncChunk.java | 61 ++++ .../support/v1_19_R3/ISmoothTeleport.java | 100 ++++++ pom.xml | 1 + 7 files changed, 605 insertions(+) create mode 100644 modules/v1_20_R1/pom.xml create mode 100644 modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/IWorldHandler.java create mode 100644 modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/NextTickProvider.java create mode 100644 modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/IAsyncChunk.java create mode 100644 modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/ISmoothTeleport.java diff --git a/modules/Movecraft/pom.xml b/modules/Movecraft/pom.xml index cc54d4134..84affee36 100644 --- a/modules/Movecraft/pom.xml +++ b/modules/Movecraft/pom.xml @@ -54,6 +54,12 @@ ${revision} jar + + net.countercraft + movecraft-v1_20_r1 + ${revision} + jar + net.countercraft movecraft-api diff --git a/modules/v1_20_R1/pom.xml b/modules/v1_20_R1/pom.xml new file mode 100644 index 000000000..7b870c896 --- /dev/null +++ b/modules/v1_20_R1/pom.xml @@ -0,0 +1,94 @@ + + + + movecraft-parent + net.countercraft + ${revision} + ../../pom.xml + + 4.0.0 + + movecraft-v1_20_r1 + Movecraft-v1_20_R1 + jar + + + org.spigotmc + spigot + 1.19.4-R0.1-SNAPSHOT + remapped-mojang + provided + + + + net.countercraft + movecraft-api + ${revision} + jar + + + + src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + net/countercraft/movecraft/compat/v1_20_R1/** + net/countercraft/movecraft/support/v1_20_R1/** + + 13 + 13 + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + net/countercraft/movecraft/compat/v1_20_R1/** + net/countercraft/movecraft/support/v1_20_R1/** + + + + + net.md-5 + specialsource-maven-plugin + 1.2.2 + + + package + + remap + + remap-obf + + org.spigotmc:minecraft-server:1.19.4-R0.1-SNAPSHOT:txt:maps-mojang + true + org.spigotmc:spigot:1.19.4-R0.1-SNAPSHOT:jar:remapped-mojang + true + remapped-obf + + + + package + + remap + + remap-spigot + + ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar + org.spigotmc:minecraft-server:1.19.4-R0.1-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.19.4-R0.1-SNAPSHOT:jar:remapped-obf + + + + + + + diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/IWorldHandler.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/IWorldHandler.java new file mode 100644 index 000000000..5822e8433 --- /dev/null +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/IWorldHandler.java @@ -0,0 +1,299 @@ +package net.countercraft.movecraft.compat.v1_19_R3; + +import net.countercraft.movecraft.MovecraftLocation; +import net.countercraft.movecraft.MovecraftRotation; +import net.countercraft.movecraft.WorldHandler; +import net.countercraft.movecraft.craft.Craft; +import net.countercraft.movecraft.util.CollectionUtils; +import net.countercraft.movecraft.util.MathUtils; +import net.countercraft.movecraft.util.UnsafeUtils; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.ticks.ScheduledTick; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_19_R3.util.CraftMagicNumbers; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@SuppressWarnings("unused") +public class IWorldHandler extends WorldHandler { + private static final Rotation ROTATION[]; + + static { + ROTATION = new Rotation[3]; + ROTATION[MovecraftRotation.NONE.ordinal()] = Rotation.NONE; + ROTATION[MovecraftRotation.CLOCKWISE.ordinal()] = Rotation.CLOCKWISE_90; + ROTATION[MovecraftRotation.ANTICLOCKWISE.ordinal()] = Rotation.COUNTERCLOCKWISE_90; + } + + private final NextTickProvider tickProvider = new NextTickProvider(); + + public IWorldHandler() { + String mappings = ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion(); + if (!mappings.equals("3009edc0fff87fa34680686663bd59df")) + throw new IllegalStateException("Movecraft is not compatible with this version of Minecraft 1.19: " + mappings); + } + + @Override + public void rotateCraft(@NotNull Craft craft, @NotNull MovecraftLocation originPoint, @NotNull MovecraftRotation rotation) { + //******************************************* + //* Step one: Convert to Positions * + //******************************************* + HashMap rotatedPositions = new HashMap<>(); + MovecraftRotation counterRotation = rotation == MovecraftRotation.CLOCKWISE ? MovecraftRotation.ANTICLOCKWISE : MovecraftRotation.CLOCKWISE; + for (MovecraftLocation newLocation : craft.getHitBox()) { + rotatedPositions.put(locationToPosition(MathUtils.rotateVec(counterRotation, newLocation.subtract(originPoint)).add(originPoint)), locationToPosition(newLocation)); + } + //******************************************* + //* Step two: Get the tiles * + //******************************************* + ServerLevel nativeWorld = ((CraftWorld) craft.getWorld()).getHandle(); + List tiles = new ArrayList<>(); + //get the tiles + for (BlockPos position : rotatedPositions.keySet()) { + //BlockEntity tile = nativeWorld.removeBlockEntity(position); + BlockEntity tile = removeBlockEntity(nativeWorld, position); + if (tile == null) + continue; +// tile.a(ROTATION[rotation.ordinal()]); + //get the nextTick to move with the tile + tiles.add(new TileHolder(tile, tickProvider.getNextTick(nativeWorld, position), position)); + } + + //******************************************* + //* Step three: Translate all the blocks * + //******************************************* + // blockedByWater=false means an ocean-going vessel + //TODO: Simplify + //TODO: go by chunks + //TODO: Don't move unnecessary blocks + //get the blocks and rotate them + HashMap blockData = new HashMap<>(); + for (BlockPos position : rotatedPositions.keySet()) { + blockData.put(position, nativeWorld.getBlockState(position).rotate(ROTATION[rotation.ordinal()])); + } + //create the new block + for (Map.Entry entry : blockData.entrySet()) { + setBlockFast(nativeWorld, rotatedPositions.get(entry.getKey()), entry.getValue()); + } + + + //******************************************* + //* Step four: replace all the tiles * + //******************************************* + //TODO: go by chunks + for (TileHolder tileHolder : tiles) { + moveBlockEntity(nativeWorld, rotatedPositions.get(tileHolder.getTilePosition()), tileHolder.getTile()); + if (tileHolder.getNextTick() == null) + continue; + final long currentTime = nativeWorld.J.getGameTime(); // J is obfuscated serverLevelData + nativeWorld.getBlockTicks().schedule(new ScheduledTick<>((Block) tileHolder.getNextTick().type(), rotatedPositions.get(tileHolder.getNextTick().pos()), tileHolder.getNextTick().triggerTick() - currentTime, tileHolder.getNextTick().priority(), tileHolder.getNextTick().subTickOrder())); + } + + //******************************************* + //* Step five: Destroy the leftovers * + //******************************************* + //TODO: add support for pass-through + Collection deletePositions = CollectionUtils.filter(rotatedPositions.keySet(), rotatedPositions.values()); + for (BlockPos position : deletePositions) { + setBlockFast(nativeWorld, position, Blocks.AIR.defaultBlockState()); + } + } + + @Override + public void translateCraft(@NotNull Craft craft, @NotNull MovecraftLocation displacement, @NotNull org.bukkit.World world) { + //TODO: Add support for rotations + //A craftTranslateCommand should only occur if the craft is moving to a valid position + //******************************************* + //* Step one: Convert to Positions * + //******************************************* + BlockPos translateVector = locationToPosition(displacement); + List positions = new ArrayList<>(craft.getHitBox().size()); + craft.getHitBox().forEach((movecraftLocation) -> positions.add(locationToPosition((movecraftLocation)).subtract(translateVector))); + ServerLevel oldNativeWorld = ((CraftWorld) craft.getWorld()).getHandle(); + ServerLevel nativeWorld = ((CraftWorld) world).getHandle(); + //******************************************* + //* Step two: Get the tiles * + //******************************************* + List tiles = new ArrayList<>(); + //get the tiles + for (int i = 0, positionsSize = positions.size(); i < positionsSize; i++) { + BlockPos position = positions.get(i); + if (oldNativeWorld.getBlockState(position) == Blocks.AIR.defaultBlockState()) + continue; + //BlockEntity tile = nativeWorld.removeBlockEntity(position); + BlockEntity tile = removeBlockEntity(oldNativeWorld, position); + if (tile == null) + continue; + //get the nextTick to move with the tile + + //nativeWorld.capturedTileEntities.remove(position); + //nativeWorld.getChunkAtWorldCoords(position).getTileEntities().remove(position); + tiles.add(new TileHolder(tile, tickProvider.getNextTick(oldNativeWorld, position), position)); + + } + //******************************************* + //* Step three: Translate all the blocks * + //******************************************* + // blockedByWater=false means an ocean-going vessel + //TODO: Simplify + //TODO: go by chunks + //TODO: Don't move unnecessary blocks + //get the blocks and translate the positions + List blockData = new ArrayList<>(); + List newPositions = new ArrayList<>(); + for (int i = 0, positionsSize = positions.size(); i < positionsSize; i++) { + BlockPos position = positions.get(i); + blockData.add(oldNativeWorld.getBlockState(position)); + newPositions.add(position.offset(translateVector)); + } + //create the new block + for (int i = 0, positionSize = newPositions.size(); i < positionSize; i++) { + setBlockFast(nativeWorld, newPositions.get(i), blockData.get(i)); + } + //******************************************* + //* Step four: replace all the tiles * + //******************************************* + //TODO: go by chunks + for (int i = 0, tilesSize = tiles.size(); i < tilesSize; i++) { + TileHolder tileHolder = tiles.get(i); + moveBlockEntity(nativeWorld, tileHolder.getTilePosition().offset(translateVector), tileHolder.getTile()); + if (tileHolder.getNextTick() == null) + continue; + final long currentTime = nativeWorld.getGameTime(); + nativeWorld.getBlockTicks().schedule(new ScheduledTick<>((Block) tileHolder.getNextTick().type(), tileHolder.getTilePosition().offset(translateVector), tileHolder.getNextTick().triggerTick() - currentTime, tileHolder.getNextTick().priority(), tileHolder.getNextTick().subTickOrder())); + } + //******************************************* + //* Step five: Destroy the leftovers * + //******************************************* + List deletePositions = positions; + if (oldNativeWorld == nativeWorld) + deletePositions = CollectionUtils.filter(positions, newPositions); + for (int i = 0, deletePositionsSize = deletePositions.size(); i < deletePositionsSize; i++) { + BlockPos position = deletePositions.get(i); + setBlockFast(oldNativeWorld, position, Blocks.AIR.defaultBlockState()); + } + } + + @Nullable + private BlockEntity removeBlockEntity(@NotNull Level world, @NotNull BlockPos position) { + return world.getChunkAt(position).blockEntities.remove(position); + } + + @NotNull + private BlockPos locationToPosition(@NotNull MovecraftLocation loc) { + return new BlockPos(loc.getX(), loc.getY(), loc.getZ()); + } + + private void setBlockFast(@NotNull Level world, @NotNull BlockPos position, @NotNull BlockState data) { + LevelChunk chunk = world.getChunkAt(position); + int chunkSection = (position.getY() >> 4) - chunk.getMinSection(); + LevelChunkSection section = chunk.getSections()[chunkSection]; + if (section == null) { + // Put a GLASS block to initialize the section. It will be replaced next with the real block. + chunk.setBlockState(position, Blocks.GLASS.defaultBlockState(), false); + section = chunk.getSections()[chunkSection]; + } + if (section.getBlockState(position.getX() & 15, position.getY() & 15, position.getZ() & 15).equals(data)) { + //Block is already of correct type and data, don't overwrite + return; + } + section.setBlockState(position.getX() & 15, position.getY() & 15, position.getZ() & 15, data); + world.sendBlockUpdated(position, data, data, 3); + world.getLightEngine().checkBlock(position); // boolean corresponds to if chunk section empty + chunk.setUnsaved(true); + } + + @Override + public void setBlockFast(@NotNull Location location, @NotNull BlockData data) { + setBlockFast(location, MovecraftRotation.NONE, data); + } + + @Override + public void setBlockFast(@NotNull Location location, @NotNull MovecraftRotation rotation, @NotNull BlockData data) { + BlockState blockData; + if (data instanceof CraftBlockData) { + blockData = ((CraftBlockData) data).getState(); + } + else { + blockData = (BlockState) data; + } + blockData = blockData.rotate(ROTATION[rotation.ordinal()]); + Level world = ((CraftWorld) (location.getWorld())).getHandle(); + BlockPos BlockPos = locationToPosition(MathUtils.bukkit2MovecraftLoc(location)); + setBlockFast(world, BlockPos, blockData); + } + + @Override + public void disableShadow(@NotNull Material type) { + // Disabled + } + + private void moveBlockEntity(@NotNull Level nativeWorld, @NotNull BlockPos newPosition, @NotNull BlockEntity tile) { + LevelChunk chunk = nativeWorld.getChunkAt(newPosition); + try { + var positionField = BlockEntity.class.getDeclaredField("p"); // p is obfuscated worldPosition + UnsafeUtils.setField(positionField, tile, newPosition); + } + catch (NoSuchFieldException e) { + e.printStackTrace(); + } + tile.setLevel(nativeWorld); + tile.clearRemoved(); + if (nativeWorld.captureBlockStates) { + nativeWorld.capturedTileEntities.put(newPosition, tile); + return; + } + chunk.setBlockEntity(tile); + chunk.blockEntities.put(newPosition, tile); + } + + private static class TileHolder { + @NotNull + private final BlockEntity tile; + @Nullable + private final ScheduledTick nextTick; + @NotNull + private final BlockPos tilePosition; + + public TileHolder(@NotNull BlockEntity tile, @Nullable ScheduledTick nextTick, @NotNull BlockPos tilePosition) { + this.tile = tile; + this.nextTick = nextTick; + this.tilePosition = tilePosition; + } + + + @NotNull + public BlockEntity getTile() { + return tile; + } + + @Nullable + public ScheduledTick getNextTick() { + return nextTick; + } + + @NotNull + public BlockPos getTilePosition() { + return tilePosition; + } + } +} \ No newline at end of file diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/NextTickProvider.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/NextTickProvider.java new file mode 100644 index 000000000..e1b1e3245 --- /dev/null +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/NextTickProvider.java @@ -0,0 +1,44 @@ +package net.countercraft.movecraft.compat.v1_19_R3; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.ticks.LevelTicks; +import net.minecraft.world.ticks.ScheduledTick; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.Queue; + +public class NextTickProvider { + + @Nullable + public ScheduledTick getNextTick(@NotNull ServerLevel world, @NotNull BlockPos position){ + LevelTicks tickList = world.getBlockTicks(); + var box = BoundingBox.encapsulatingPositions(List.of(position)); + if(box.isEmpty()){ + return null; + } + Queue> toRunThisTick; + try { + Field toRunThisTickField = LevelTicks.class.getDeclaredField("g"); + toRunThisTickField.setAccessible(true); + toRunThisTick = (Queue>) toRunThisTickField.get(tickList); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + return null; + } + for (var iter = toRunThisTick.iterator(); iter.hasNext(); ) { + var next = iter.next(); + if (!next.pos().equals(position)) { + continue; + } + iter.remove(); + return next; + } + return null; + } +} diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/IAsyncChunk.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/IAsyncChunk.java new file mode 100644 index 000000000..6a8f29020 --- /dev/null +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/IAsyncChunk.java @@ -0,0 +1,61 @@ +package net.countercraft.movecraft.support.v1_19_R3; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import net.countercraft.movecraft.MovecraftLocation; +import net.countercraft.movecraft.processing.WorldManager; +import net.countercraft.movecraft.support.AsyncChunk; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkStatus; +import org.bukkit.Chunk; +import org.bukkit.Material; +import org.bukkit.block.BlockState; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_19_R3.CraftChunk; +import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class IAsyncChunk extends AsyncChunk { + private final @NotNull LoadingCache stateCache = CacheBuilder.newBuilder().maximumSize(1000).build(new CacheLoader<>() { + @Override + public BlockState load(@NotNull MovecraftLocation movecraftLocation) { + var block = chunk.getBlock(movecraftLocation.getX(), movecraftLocation.getY(), movecraftLocation.getZ()); + return WorldManager.INSTANCE.executeMain(block::getState); + } + }); + + // getHandle needs to be access in the main thread as of 1.19.4 + private final ChunkAccess handle; + + public IAsyncChunk(@NotNull Chunk chunk) { + super(chunk); + handle = this.chunk.getHandle(ChunkStatus.FULL); + } + + @NotNull + @Override + protected CraftChunk adapt(@NotNull org.bukkit.Chunk chunk) { + return (CraftChunk) chunk; + } + + @NotNull + @Override + public BlockState getState(@NotNull MovecraftLocation location) { + return stateCache.getUnchecked(location); + } + + @Override + @NotNull + public Material getType(@NotNull MovecraftLocation location){ + return this.getData(location).getMaterial(); + } + + @Override + @NotNull + public BlockData getData(@NotNull MovecraftLocation location){ + return CraftBlockData.fromData(handle.getBlockState(new BlockPos(location.getX(), location.getY(), location.getZ()))); + } +} diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/ISmoothTeleport.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/ISmoothTeleport.java new file mode 100644 index 000000000..4b37990e9 --- /dev/null +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/ISmoothTeleport.java @@ -0,0 +1,100 @@ +package net.countercraft.movecraft.support.v1_19_R3; + +import net.countercraft.movecraft.SmoothTeleport; +import net.countercraft.movecraft.util.ReflectUtils; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Set; + +/** + * Code derived from code taken with permission from MicleBrick + * https://www.spigotmc.org/threads/teleport-player-smoothly.317416/ + * Used for 1.19.4 + */ +public class ISmoothTeleport extends SmoothTeleport { + private final Set teleportFlags; + + private final Method positionMethod; + private final Method sendMethod; + + private final Constructor vec3Constructor; + private final Constructor packetConstructor; + + private final Field connectionField; + private final Field teleportPosField; + private final Field teleportAwaitField; + private final Field awaitingTeleportTimeField; + private final Field tickCountField; + private final Field yawField; + private final Field pitchField; + + private static @NotNull Class getNmClass(String name) throws ClassNotFoundException { + return Class.forName("net.minecraft." + name); + } + + private void sendPacket(Object packet, Player p) { + try { + Object handle = ReflectUtils.getHandle(p); + Object pConnection = connectionField.get(handle); + sendMethod.invoke(pConnection, packet); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public ISmoothTeleport() throws NoSuchFieldException, NoSuchMethodException, ClassNotFoundException { + Class packetClass = getNmClass("network.protocol.Packet"); + Class positionPacketClass = getNmClass("network.protocol.game.PacketPlayOutPosition"); // ClientboundPlayerPositionPacket + Class entityClass = getNmClass("world.entity.Entity"); + Class playerClass = getNmClass("server.level.EntityPlayer"); // ServerPlayer + Class connectionClass = getNmClass("server.network.PlayerConnection"); // ServerGamePacketListenerImpl + Class vectorClass = getNmClass("world.phys.Vec3D"); // Vec3 + + Object[] flags = getNmClass("world.entity.RelativeMovement").getEnumConstants(); + teleportFlags = Set.of(flags[4], flags[3]); // X_ROT, Y_ROT + + positionMethod = entityClass.getDeclaredMethod("a", Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE); // absMoveTo + sendMethod = connectionClass.getMethod("a", packetClass); // send + + vec3Constructor = vectorClass.getConstructor(Double.TYPE, Double.TYPE, Double.TYPE); + packetConstructor = positionPacketClass.getConstructor(Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE, Set.class, Integer.TYPE); + + connectionField = ReflectUtils.getField(playerClass, "b"); // connection + teleportPosField = ReflectUtils.getField(connectionClass, "D"); // awaitingPositionFromClient + teleportAwaitField = ReflectUtils.getField(connectionClass, "E"); // awaitingTeleport + awaitingTeleportTimeField = ReflectUtils.getField(connectionClass, "F"); // awaitingTeleportTime + tickCountField = ReflectUtils.getField(connectionClass, "j"); // tickCount + yawField = ReflectUtils.getField(entityClass, "aF"); // xRot + pitchField = ReflectUtils.getField(entityClass, "aE"); // yRot + } + + public void teleport(Player player, @NotNull Location location, float yawChange, float pitchChange) { + double x = location.getX(); + double y = location.getY(); + double z = location.getZ(); + Object handle = ReflectUtils.getHandle(player); + try { + positionMethod.invoke(handle, x, y, z, yawField.get(handle), pitchField.get(handle)); + Object connection = connectionField.get(handle); + teleportPosField.set(connection, vec3Constructor.newInstance(x, y, z)); + int teleportAwait = teleportAwaitField.getInt(connection) + 1; + if (teleportAwait == Integer.MAX_VALUE) + teleportAwait = 0; + teleportAwaitField.setInt(connection, teleportAwait); + awaitingTeleportTimeField.set(connection, tickCountField.get(connection)); + + Object packet = packetConstructor.newInstance(x, y, z, yawChange, pitchChange, teleportFlags, teleportAwait); + sendPacket(packet, player); + } + catch (IllegalAccessException | InvocationTargetException | InstantiationException e) { + e.printStackTrace(); + } + } +} diff --git a/pom.xml b/pom.xml index abc39e141..684598f63 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,7 @@ modules/v1_17_R1 modules/v1_18_R2 modules/v1_19_R3 + modules/v1_20_R1 modules/datapack modules/Movecraft From 438d5594721ef0f2ed955224c8167a39c42f3032 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 4 Jun 2023 12:20:29 -0500 Subject: [PATCH 03/17] Remove 1.14.4 --- modules/Movecraft/pom.xml | 6 - modules/v1_14_R1/pom.xml | 59 ---- .../compat/v1_14_R1/IWorldHandler.java | 332 ------------------ .../support/v1_14_R1/IAsyncChunk.java | 60 ---- .../support/v1_14_R1/ISmoothTeleport.java | 113 ------ pom.xml | 3 +- 6 files changed, 1 insertion(+), 572 deletions(-) delete mode 100644 modules/v1_14_R1/pom.xml delete mode 100644 modules/v1_14_R1/src/main/java/net/countercraft/movecraft/compat/v1_14_R1/IWorldHandler.java delete mode 100644 modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/IAsyncChunk.java delete mode 100644 modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/ISmoothTeleport.java diff --git a/modules/Movecraft/pom.xml b/modules/Movecraft/pom.xml index 7280819ef..cc54d4134 100644 --- a/modules/Movecraft/pom.xml +++ b/modules/Movecraft/pom.xml @@ -30,12 +30,6 @@ - - net.countercraft - movecraft-v1_14_r1 - ${revision} - jar - net.countercraft movecraft-v1_16_r3 diff --git a/modules/v1_14_R1/pom.xml b/modules/v1_14_R1/pom.xml deleted file mode 100644 index 4bff5c08a..000000000 --- a/modules/v1_14_R1/pom.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - movecraft-parent - net.countercraft - ${revision} - ../../pom.xml - - 4.0.0 - - movecraft-v1_14_r1 - Movecraft-v1_14_R1 - - - org.bukkit - craftbukkit - 1.14.4-R0.1-SNAPSHOT - provided - - - net.countercraft - movecraft-api - ${revision} - jar - - - - src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - - net/countercraft/movecraft/compat/v1_14_R1/** - net/countercraft/movecraft/support/v1_14_R1/** - - 13 - 13 - - - - org.apache.maven.plugins - maven-jar-plugin - 2.4 - - - net/countercraft/movecraft/compat/v1_14_R1/** - net/countercraft/movecraft/support/v1_14_R1/** - - - - - - - \ No newline at end of file diff --git a/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/compat/v1_14_R1/IWorldHandler.java b/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/compat/v1_14_R1/IWorldHandler.java deleted file mode 100644 index 34c3a60f6..000000000 --- a/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/compat/v1_14_R1/IWorldHandler.java +++ /dev/null @@ -1,332 +0,0 @@ -package net.countercraft.movecraft.compat.v1_14_R1; - -import net.countercraft.movecraft.MovecraftLocation; -import net.countercraft.movecraft.MovecraftRotation; -import net.countercraft.movecraft.WorldHandler; -import net.countercraft.movecraft.craft.Craft; -import net.countercraft.movecraft.util.CollectionUtils; -import net.countercraft.movecraft.util.MathUtils; -import net.countercraft.movecraft.util.UnsafeUtils; -import net.countercraft.movecraft.util.hitboxes.HitBox; -import net.minecraft.server.v1_14_R1.Block; -import net.minecraft.server.v1_14_R1.BlockPosition; -import net.minecraft.server.v1_14_R1.Blocks; -import net.minecraft.server.v1_14_R1.Chunk; -import net.minecraft.server.v1_14_R1.ChunkSection; -import net.minecraft.server.v1_14_R1.Container; -import net.minecraft.server.v1_14_R1.ContainerAccess; -import net.minecraft.server.v1_14_R1.EnumBlockRotation; -import net.minecraft.server.v1_14_R1.IBlockData; -import net.minecraft.server.v1_14_R1.NextTickListEntry; -import net.minecraft.server.v1_14_R1.StructureBoundingBox; -import net.minecraft.server.v1_14_R1.TileEntity; -import net.minecraft.server.v1_14_R1.World; -import net.minecraft.server.v1_14_R1.WorldServer; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_14_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_14_R1.util.CraftMagicNumbers; -import org.bukkit.inventory.InventoryView; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@SuppressWarnings("unused") -public class IWorldHandler extends WorldHandler { - private static final EnumBlockRotation ROTATION[]; - - static { - ROTATION = new EnumBlockRotation[3]; - ROTATION[MovecraftRotation.NONE.ordinal()] = EnumBlockRotation.NONE; - ROTATION[MovecraftRotation.CLOCKWISE.ordinal()] = EnumBlockRotation.CLOCKWISE_90; - ROTATION[MovecraftRotation.ANTICLOCKWISE.ordinal()] = EnumBlockRotation.COUNTERCLOCKWISE_90; - } - - public IWorldHandler() { - String mappings = ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion(); - if (!mappings.equals("11ae498d9cf909730659b6357e7c2afa")) - throw new IllegalStateException("Movecraft is not compatible with this version of Minecraft 1.14: " + mappings); - } - - @Override - public void rotateCraft(@NotNull Craft craft, @NotNull MovecraftLocation originPoint, @NotNull MovecraftRotation rotation) { - //******************************************* - //* Step one: Convert to Positions * - //******************************************* - HashMap rotatedPositions = new HashMap<>(); - MovecraftRotation counterRotation = rotation == MovecraftRotation.CLOCKWISE ? MovecraftRotation.ANTICLOCKWISE : MovecraftRotation.CLOCKWISE; - for (MovecraftLocation newLocation : craft.getHitBox()) { - rotatedPositions.put(locationToPosition(MathUtils.rotateVec(counterRotation, newLocation.subtract(originPoint)).add(originPoint)), locationToPosition(newLocation)); - } - //******************************************* - //* Step two: Get the tiles * - //******************************************* - WorldServer nativeWorld = ((CraftWorld) craft.getWorld()).getHandle(); - List tiles = new ArrayList<>(); - List> tileTicks = new ArrayList<>(); - HitBox testBox = craft.getHitBox(); - BlockPosition position1 = new BlockPosition(testBox.getMidPoint().getX() - testBox.getZLength()/2 - 2, 0, testBox.getMidPoint().getZ() - testBox.getXLength()/2 - 2); - BlockPosition position2 = new BlockPosition(testBox.getMidPoint().getX() + testBox.getZLength()/2 + 3, 0, testBox.getMidPoint().getZ() + testBox.getXLength()/2 + 3); - List> capturedTicks = nativeWorld.getBlockTickList().a(new StructureBoundingBox(position1, position2), true, true); - //get the tiles - for (BlockPosition position : rotatedPositions.keySet()) { - if (nativeWorld.getType(position) == Blocks.AIR.getBlockData()) - continue; - //Find the ticks associated with this location - for (NextTickListEntry entry : capturedTicks) { - if (entry.a.equals(position)) { - tileTicks.add(entry); - } - } - - //Remove the old tile and add it to the list - TileEntity tile = removeTileEntity(nativeWorld, position); - if (tile != null) { - tile.a(ROTATION[rotation.ordinal()]); - tiles.add(tile); - } - } - - //Put back all the ticks we didn't move - capturedTicks.removeAll(tileTicks); - for (NextTickListEntry entry : capturedTicks) { - final long currentTime = nativeWorld.worldData.getTime(); - nativeWorld.getBlockTickList().a(entry.a, (Block) entry.b(), (int) (entry.b - currentTime), entry.c); - } - - //******************************************* - //* Step three: Translate all the blocks * - //******************************************* - // blockedByWater=false means an ocean-going vessel - //TODO: Simplify - //TODO: go by chunks - //TODO: Don't move unnecessary blocks - //get the blocks and rotate them - HashMap blockData = new HashMap<>(); - for (BlockPosition position : rotatedPositions.keySet()) { - blockData.put(position, nativeWorld.getType(position).a(ROTATION[rotation.ordinal()])); - } - //create the new block - for (Map.Entry entry : blockData.entrySet()) { - setBlockFast(nativeWorld, rotatedPositions.get(entry.getKey()), entry.getValue()); - } - - - //******************************************* - //* Step four: replace all the tiles * - //******************************************* - //TODO: go by chunks - for (TileEntity tile : tiles) { - moveTileEntity(nativeWorld, rotatedPositions.get(tile.getPosition()), tile); - } - for (NextTickListEntry entry : tileTicks) { - final long currentTime = nativeWorld.worldData.getTime(); - nativeWorld.getBlockTickList().a(rotatedPositions.get(entry.a), (Block) entry.b(), (int) (entry.b - currentTime), entry.c); - } - //******************************************* - //* Step five: Destroy the leftovers * - //******************************************* - //TODO: add support for pass-through - Collection deletePositions = CollectionUtils.filter(rotatedPositions.keySet(), rotatedPositions.values()); - for (BlockPosition position : deletePositions) { - setBlockFast(nativeWorld, position, Blocks.AIR.getBlockData()); - } - } - - @Override - public void translateCraft(@NotNull Craft craft, @NotNull MovecraftLocation displacement, @NotNull org.bukkit.World world) { - //TODO: Add support for rotations - //A craftTranslateCommand should only occur if the craft is moving to a valid position - //******************************************* - //* Step one: Convert to Positions * - //******************************************* - BlockPosition translateVector = locationToPosition(displacement); - List positions = new ArrayList<>(craft.getHitBox().size()); - craft.getHitBox().forEach((movecraftLocation) -> positions.add(locationToPosition((movecraftLocation)).b(translateVector))); - WorldServer oldNativeWorld = ((CraftWorld) craft.getWorld()).getHandle(); - World nativeWorld = ((CraftWorld) world).getHandle(); - //******************************************* - //* Step two: Get the tiles * - //******************************************* - List tiles = new ArrayList<>(); - List> tileTicks = new ArrayList<>(); - - //Get all ticks within the craft's bounding box - //The function to search for ticks ignores Y position, so we simply set it to 0 - HitBox testBox = craft.getHitBox(); - List> capturedTicks = oldNativeWorld.getBlockTickList().a(new StructureBoundingBox(testBox.getMinX() - 1, testBox.getMinZ() - 1, testBox.getMaxX() + 2, testBox.getMaxZ() + 2), true, true); - //get the tiles - for (BlockPosition position : positions) { - if (oldNativeWorld.getType(position) == Blocks.AIR.getBlockData()) - continue; - - //Find the ticks associated with this location - for (NextTickListEntry entry : capturedTicks) { - if (entry.a.equals(position)) { - tileTicks.add(entry); - } - } - - //Remove the old tile and add it to the list - TileEntity tile = removeTileEntity(oldNativeWorld, position); - if (tile != null) { - tiles.add(tile); - } - } - //Put back the ticks we didn't move - capturedTicks.removeAll(tileTicks); - for (NextTickListEntry entry : capturedTicks) { - final long currentTime = nativeWorld.worldData.getTime(); - nativeWorld.getBlockTickList().a(entry.a, (Block) entry.b(), (int) (entry.b - currentTime), entry.c); - } - //******************************************* - //* Step three: Translate all the blocks * - //******************************************* - // blockedByWater=false means an ocean-going vessel - //TODO: Simplify - //TODO: go by chunks - //TODO: Don't move unnecessary blocks - //get the blocks and translate the positions - List blockData = new ArrayList<>(); - List newPositions = new ArrayList<>(); - for (BlockPosition position : positions) { - blockData.add(oldNativeWorld.getType(position)); - newPositions.add(position.a(translateVector)); - } - //create the new block - for (int i = 0, positionSize = newPositions.size(); i < positionSize; i++) { - setBlockFast(nativeWorld, newPositions.get(i), blockData.get(i)); - } - //******************************************* - //* Step four: replace all the tiles * - //******************************************* - //TODO: go by chunks - for (TileEntity tile : tiles) { - moveTileEntity(nativeWorld, tile.getPosition().a(translateVector), tile); - } - for (NextTickListEntry entry : tileTicks) { - final long currentTime = nativeWorld.worldData.getTime(); - nativeWorld.getBlockTickList().a(entry.a.a(translateVector), (Block) entry.b(), (int) (entry.b - currentTime), entry.c); - } - //******************************************* - //* Step five: Destroy the leftovers * - //******************************************* - List deletePositions = positions; - if (oldNativeWorld == nativeWorld) - deletePositions = CollectionUtils.filter(positions, newPositions); - for (BlockPosition position : deletePositions) { - setBlockFast(oldNativeWorld, position, Blocks.AIR.getBlockData()); - } - } - - @Nullable - private TileEntity removeTileEntity(@NotNull World world, @NotNull BlockPosition position) { - return world.getChunkAtWorldCoords(position).tileEntities.remove(position); - } - - @NotNull - private BlockPosition locationToPosition(@NotNull MovecraftLocation loc) { - return new BlockPosition(loc.getX(), loc.getY(), loc.getZ()); - } - - private void setBlockFast(@NotNull World world, @NotNull BlockPosition position, @NotNull IBlockData data) { - Chunk chunk = world.getChunkAtWorldCoords(position); - ChunkSection chunkSection = chunk.getSections()[position.getY() >> 4]; - if (chunkSection == null) { - // Put a GLASS block to initialize the section. It will be replaced next with the real block. - chunk.setType(position, Blocks.GLASS.getBlockData(), false); - chunkSection = chunk.getSections()[position.getY() >> 4]; - } - if (chunkSection.getType(position.getX() & 15, position.getY() & 15, position.getZ() & 15).equals(data)) { - //Block is already of correct type and data, don't overwrite - return; - } - - chunkSection.setType(position.getX() & 15, position.getY() & 15, position.getZ() & 15, data); - world.notify(position, data, data, 3); - var engine = chunk.e(); - if (engine != null) - engine.a(position); - chunk.markDirty(); - } - - @Override - public void setBlockFast(@NotNull Location location, @NotNull BlockData data) { - setBlockFast(location, MovecraftRotation.NONE, data); - } - - @Override - public void setBlockFast(@NotNull Location location, @NotNull MovecraftRotation rotation, @NotNull BlockData data) { - IBlockData blockData; - if (data instanceof CraftBlockData) { - blockData = ((CraftBlockData) data).getState(); - } - else { - blockData = (IBlockData) data; - } - blockData = blockData.a(ROTATION[rotation.ordinal()]); - World world = ((CraftWorld) (location.getWorld())).getHandle(); - BlockPosition blockPosition = locationToPosition(bukkit2MovecraftLoc(location)); - setBlockFast(world, blockPosition, blockData); - } - - @Override - public void disableShadow(@NotNull Material type) { - // Disabled - } - - @Override - public @Nullable Location getAccessLocation(@NotNull InventoryView inventoryView) { - Container menu = ((CraftInventoryView) inventoryView).getHandle(); - Field field = UnsafeUtils.getFieldOfType(ContainerAccess.class, menu.getClass()); - if (field != null) { - try { - field.setAccessible(true); - return ((ContainerAccess) field.get(menu)).getLocation(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - return null; - } - - @Override - public void setAccessLocation(@NotNull InventoryView inventoryView, @NotNull Location location) { - if (location.getWorld() == null) - return; - WorldServer level = ((CraftWorld) location.getWorld()).getHandle(); - BlockPosition position = new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()); - ContainerAccess access = ContainerAccess.at(level, position); - - Container menu = ((CraftInventoryView) inventoryView).getHandle(); - UnsafeUtils.trySetFieldOfType(ContainerAccess.class, menu, access); - } - - private static MovecraftLocation bukkit2MovecraftLoc(Location l) { - return new MovecraftLocation(l.getBlockX(), l.getBlockY(), l.getBlockZ()); - } - - private void moveTileEntity(@NotNull World nativeWorld, @NotNull BlockPosition newPosition, @NotNull TileEntity tile) { - Chunk chunk = nativeWorld.getChunkAtWorldCoords(newPosition); - tile.invalidateBlockCache(); - tile.setWorld(nativeWorld); - tile.setPosition(newPosition); - if (nativeWorld.captureBlockStates) { - tile.setWorld(nativeWorld); - tile.setPosition(newPosition); - nativeWorld.capturedTileEntities.put(newPosition, tile); - return; - } - chunk.tileEntities.put(newPosition, tile); - } - -} \ No newline at end of file diff --git a/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/IAsyncChunk.java b/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/IAsyncChunk.java deleted file mode 100644 index 445da02f9..000000000 --- a/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/IAsyncChunk.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.countercraft.movecraft.support.v1_14_R1; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import net.countercraft.movecraft.MovecraftLocation; -import net.countercraft.movecraft.processing.WorldManager; -import net.countercraft.movecraft.support.AsyncChunk; -import net.minecraft.server.v1_14_R1.BlockPosition; -import net.minecraft.server.v1_14_R1.IBlockData; -import org.bukkit.Chunk; -import org.bukkit.Material; -import org.bukkit.block.BlockState; -import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_14_R1.CraftChunk; -import org.bukkit.craftbukkit.v1_14_R1.block.data.CraftBlockData; -import org.jetbrains.annotations.NotNull; - -@SuppressWarnings("unused") -public class IAsyncChunk extends AsyncChunk { - - private final @NotNull - LoadingCache stateCache = CacheBuilder.newBuilder().maximumSize(100).build(new CacheLoader<>() { - @Override - public BlockState load(@NotNull MovecraftLocation movecraftLocation) { - var block = chunk.getBlock(movecraftLocation.getX(), movecraftLocation.getY(), movecraftLocation.getZ()); - return WorldManager.INSTANCE.executeMain(block::getState); - } - }); - - public IAsyncChunk(@NotNull Chunk chunk) { - super(chunk); - } - - @NotNull - @Override - protected CraftChunk adapt(@NotNull org.bukkit.Chunk chunk) { - return (CraftChunk) chunk; - } - - @NotNull - @Override - public BlockState getState(@NotNull MovecraftLocation location) { - return stateCache.getUnchecked(location); - } - - @Override - @NotNull - public Material getType(@NotNull MovecraftLocation location){ - return CraftBlockData.fromData(chunk.getHandle().getType(new BlockPosition(location.getX(), location.getY(), location.getZ()))).getMaterial(); - } - - @Override - @NotNull - public BlockData getData(@NotNull MovecraftLocation location){ - IBlockData data = chunk.getHandle().getType(new BlockPosition(location.getX(), location.getY(), location.getZ())); - return CraftBlockData.fromData(data); - } - -} diff --git a/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/ISmoothTeleport.java b/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/ISmoothTeleport.java deleted file mode 100644 index f69e195e3..000000000 --- a/modules/v1_14_R1/src/main/java/net/countercraft/movecraft/support/v1_14_R1/ISmoothTeleport.java +++ /dev/null @@ -1,113 +0,0 @@ -package net.countercraft.movecraft.support.v1_14_R1; - -import net.countercraft.movecraft.SmoothTeleport; -import net.countercraft.movecraft.util.ReflectUtils; -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Set; - -/** - * Code taken with permission from MicleBrick - * https://www.spigotmc.org/threads/teleport-player-smoothly.317416/ - * Used for 1.14.4 to 1.16.5 - */ -public class ISmoothTeleport extends SmoothTeleport { - private final Set teleportFlags; - - private final Constructor packetConstructor; - private final Constructor vec3D; - - private final Method position; - private final Method sendMethod; - - private final Field connectionField; - private final Field justTeleportedField; - private final Field teleportPosField; - private final Field lastPosXField; - private final Field lastPosYField; - private final Field lastPosZField; - private final Field teleportAwaitField; - private final Field AField; - private final Field eField; - private final Field yaw; - private final Field pitch; - - private static @NotNull Class getNmsClass(String name) throws ClassNotFoundException { - return Class.forName("net.minecraft.server." + ReflectUtils.getVersion() + "." + name); - } - - private void sendPacket(Object packet, Player p) { - try { - Object handle = ReflectUtils.getHandle(p); - Object pConnection = connectionField.get(handle); - sendMethod.invoke(pConnection, packet); - } - catch (Exception e) { - e.printStackTrace(); - } - } - - public ISmoothTeleport() throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException { - Class packet = getNmsClass("Packet"); - Class entity = getNmsClass("Entity"); - Class entityPlayer = getNmsClass("EntityPlayer"); - Class connectionClass = getNmsClass("PlayerConnection"); - Class packetClass = getNmsClass("PacketPlayOutPosition"); - Class vecClass = getNmsClass("Vec3D"); - sendMethod = connectionClass.getMethod("sendPacket", packet); - - position = entity.getDeclaredMethod("setLocation", Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE); - - yaw = ReflectUtils.getField(entity, "yaw"); - pitch = ReflectUtils.getField(entity, "pitch"); - connectionField = ReflectUtils.getField(entityPlayer, "playerConnection"); - - packetConstructor = packetClass.getConstructor(Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE, Set.class, Integer.TYPE); - vec3D = vecClass.getConstructor(Double.TYPE, Double.TYPE, Double.TYPE); - - Object[] enumObjects = getNmsClass("PacketPlayOutPosition$EnumPlayerTeleportFlags").getEnumConstants(); - teleportFlags = Set.of(enumObjects[4], enumObjects[3]); - - justTeleportedField = ReflectUtils.getField(connectionClass, "justTeleported"); - teleportPosField = ReflectUtils.getField(connectionClass, "teleportPos"); - lastPosXField = ReflectUtils.getField(connectionClass, "lastPosX"); - lastPosYField = ReflectUtils.getField(connectionClass, "lastPosY"); - lastPosZField = ReflectUtils.getField(connectionClass, "lastPosZ"); - teleportAwaitField = ReflectUtils.getField(connectionClass, "teleportAwait"); - AField = ReflectUtils.getField(connectionClass, "A"); - eField = ReflectUtils.getField(connectionClass, "e"); - } - - public void teleport(Player player, @NotNull Location location, float yawChange, float pitchChange) { - double x = location.getX(); - double y = location.getY(); - double z = location.getZ(); - Object handle = ReflectUtils.getHandle(player); - try { - position.invoke(handle, x, y, z, yaw.get(handle), pitch.get(handle)); - Object connection = connectionField.get(handle); - justTeleportedField.set(connection, true); - teleportPosField.set(connection, vec3D.newInstance(x, y, z)); - lastPosXField.set(connection, x); - lastPosYField.set(connection, y); - lastPosZField.set(connection, z); - int teleportAwait = teleportAwaitField.getInt(connection) + 1; - if (teleportAwait == Integer.MAX_VALUE) - teleportAwait = 0; - teleportAwaitField.set(connection, teleportAwait); - AField.set(connection, eField.get(connection)); - - Object packet = packetConstructor.newInstance(x, y, z, yawChange, pitchChange, teleportFlags, teleportAwait); - sendPacket(packet, player); - } - catch (IllegalAccessException | IllegalArgumentException | InstantiationException | InvocationTargetException e) { - e.printStackTrace(); - } - } -} diff --git a/pom.xml b/pom.xml index c30b5bfa9..abc39e141 100644 --- a/pom.xml +++ b/pom.xml @@ -9,12 +9,11 @@ http://github.com/apdevteam/Movecraft UTF-8 - 8.0.0_beta-1 + 8.0.0_beta-2_snapshot modules/api - modules/v1_14_R1 modules/v1_16_R3 modules/v1_17_R1 modules/v1_18_R2 From 548758619ae174a42f1773c6a5d1a6dd9ca902b2 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 4 Jun 2023 12:20:54 -0500 Subject: [PATCH 04/17] Stub out 1.20 world handler based on 1.19.4 --- modules/Movecraft/pom.xml | 6 + modules/v1_20_R1/pom.xml | 94 ++++++ .../compat/v1_19_R3/IWorldHandler.java | 299 ++++++++++++++++++ .../compat/v1_19_R3/NextTickProvider.java | 44 +++ .../support/v1_19_R3/IAsyncChunk.java | 61 ++++ .../support/v1_19_R3/ISmoothTeleport.java | 100 ++++++ pom.xml | 1 + 7 files changed, 605 insertions(+) create mode 100644 modules/v1_20_R1/pom.xml create mode 100644 modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/IWorldHandler.java create mode 100644 modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/NextTickProvider.java create mode 100644 modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/IAsyncChunk.java create mode 100644 modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/ISmoothTeleport.java diff --git a/modules/Movecraft/pom.xml b/modules/Movecraft/pom.xml index cc54d4134..84affee36 100644 --- a/modules/Movecraft/pom.xml +++ b/modules/Movecraft/pom.xml @@ -54,6 +54,12 @@ ${revision} jar + + net.countercraft + movecraft-v1_20_r1 + ${revision} + jar + net.countercraft movecraft-api diff --git a/modules/v1_20_R1/pom.xml b/modules/v1_20_R1/pom.xml new file mode 100644 index 000000000..7b870c896 --- /dev/null +++ b/modules/v1_20_R1/pom.xml @@ -0,0 +1,94 @@ + + + + movecraft-parent + net.countercraft + ${revision} + ../../pom.xml + + 4.0.0 + + movecraft-v1_20_r1 + Movecraft-v1_20_R1 + jar + + + org.spigotmc + spigot + 1.19.4-R0.1-SNAPSHOT + remapped-mojang + provided + + + + net.countercraft + movecraft-api + ${revision} + jar + + + + src/main/java + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + + net/countercraft/movecraft/compat/v1_20_R1/** + net/countercraft/movecraft/support/v1_20_R1/** + + 13 + 13 + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + net/countercraft/movecraft/compat/v1_20_R1/** + net/countercraft/movecraft/support/v1_20_R1/** + + + + + net.md-5 + specialsource-maven-plugin + 1.2.2 + + + package + + remap + + remap-obf + + org.spigotmc:minecraft-server:1.19.4-R0.1-SNAPSHOT:txt:maps-mojang + true + org.spigotmc:spigot:1.19.4-R0.1-SNAPSHOT:jar:remapped-mojang + true + remapped-obf + + + + package + + remap + + remap-spigot + + ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar + org.spigotmc:minecraft-server:1.19.4-R0.1-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.19.4-R0.1-SNAPSHOT:jar:remapped-obf + + + + + + + diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/IWorldHandler.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/IWorldHandler.java new file mode 100644 index 000000000..5822e8433 --- /dev/null +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/IWorldHandler.java @@ -0,0 +1,299 @@ +package net.countercraft.movecraft.compat.v1_19_R3; + +import net.countercraft.movecraft.MovecraftLocation; +import net.countercraft.movecraft.MovecraftRotation; +import net.countercraft.movecraft.WorldHandler; +import net.countercraft.movecraft.craft.Craft; +import net.countercraft.movecraft.util.CollectionUtils; +import net.countercraft.movecraft.util.MathUtils; +import net.countercraft.movecraft.util.UnsafeUtils; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.ticks.ScheduledTick; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_19_R3.util.CraftMagicNumbers; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@SuppressWarnings("unused") +public class IWorldHandler extends WorldHandler { + private static final Rotation ROTATION[]; + + static { + ROTATION = new Rotation[3]; + ROTATION[MovecraftRotation.NONE.ordinal()] = Rotation.NONE; + ROTATION[MovecraftRotation.CLOCKWISE.ordinal()] = Rotation.CLOCKWISE_90; + ROTATION[MovecraftRotation.ANTICLOCKWISE.ordinal()] = Rotation.COUNTERCLOCKWISE_90; + } + + private final NextTickProvider tickProvider = new NextTickProvider(); + + public IWorldHandler() { + String mappings = ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion(); + if (!mappings.equals("3009edc0fff87fa34680686663bd59df")) + throw new IllegalStateException("Movecraft is not compatible with this version of Minecraft 1.19: " + mappings); + } + + @Override + public void rotateCraft(@NotNull Craft craft, @NotNull MovecraftLocation originPoint, @NotNull MovecraftRotation rotation) { + //******************************************* + //* Step one: Convert to Positions * + //******************************************* + HashMap rotatedPositions = new HashMap<>(); + MovecraftRotation counterRotation = rotation == MovecraftRotation.CLOCKWISE ? MovecraftRotation.ANTICLOCKWISE : MovecraftRotation.CLOCKWISE; + for (MovecraftLocation newLocation : craft.getHitBox()) { + rotatedPositions.put(locationToPosition(MathUtils.rotateVec(counterRotation, newLocation.subtract(originPoint)).add(originPoint)), locationToPosition(newLocation)); + } + //******************************************* + //* Step two: Get the tiles * + //******************************************* + ServerLevel nativeWorld = ((CraftWorld) craft.getWorld()).getHandle(); + List tiles = new ArrayList<>(); + //get the tiles + for (BlockPos position : rotatedPositions.keySet()) { + //BlockEntity tile = nativeWorld.removeBlockEntity(position); + BlockEntity tile = removeBlockEntity(nativeWorld, position); + if (tile == null) + continue; +// tile.a(ROTATION[rotation.ordinal()]); + //get the nextTick to move with the tile + tiles.add(new TileHolder(tile, tickProvider.getNextTick(nativeWorld, position), position)); + } + + //******************************************* + //* Step three: Translate all the blocks * + //******************************************* + // blockedByWater=false means an ocean-going vessel + //TODO: Simplify + //TODO: go by chunks + //TODO: Don't move unnecessary blocks + //get the blocks and rotate them + HashMap blockData = new HashMap<>(); + for (BlockPos position : rotatedPositions.keySet()) { + blockData.put(position, nativeWorld.getBlockState(position).rotate(ROTATION[rotation.ordinal()])); + } + //create the new block + for (Map.Entry entry : blockData.entrySet()) { + setBlockFast(nativeWorld, rotatedPositions.get(entry.getKey()), entry.getValue()); + } + + + //******************************************* + //* Step four: replace all the tiles * + //******************************************* + //TODO: go by chunks + for (TileHolder tileHolder : tiles) { + moveBlockEntity(nativeWorld, rotatedPositions.get(tileHolder.getTilePosition()), tileHolder.getTile()); + if (tileHolder.getNextTick() == null) + continue; + final long currentTime = nativeWorld.J.getGameTime(); // J is obfuscated serverLevelData + nativeWorld.getBlockTicks().schedule(new ScheduledTick<>((Block) tileHolder.getNextTick().type(), rotatedPositions.get(tileHolder.getNextTick().pos()), tileHolder.getNextTick().triggerTick() - currentTime, tileHolder.getNextTick().priority(), tileHolder.getNextTick().subTickOrder())); + } + + //******************************************* + //* Step five: Destroy the leftovers * + //******************************************* + //TODO: add support for pass-through + Collection deletePositions = CollectionUtils.filter(rotatedPositions.keySet(), rotatedPositions.values()); + for (BlockPos position : deletePositions) { + setBlockFast(nativeWorld, position, Blocks.AIR.defaultBlockState()); + } + } + + @Override + public void translateCraft(@NotNull Craft craft, @NotNull MovecraftLocation displacement, @NotNull org.bukkit.World world) { + //TODO: Add support for rotations + //A craftTranslateCommand should only occur if the craft is moving to a valid position + //******************************************* + //* Step one: Convert to Positions * + //******************************************* + BlockPos translateVector = locationToPosition(displacement); + List positions = new ArrayList<>(craft.getHitBox().size()); + craft.getHitBox().forEach((movecraftLocation) -> positions.add(locationToPosition((movecraftLocation)).subtract(translateVector))); + ServerLevel oldNativeWorld = ((CraftWorld) craft.getWorld()).getHandle(); + ServerLevel nativeWorld = ((CraftWorld) world).getHandle(); + //******************************************* + //* Step two: Get the tiles * + //******************************************* + List tiles = new ArrayList<>(); + //get the tiles + for (int i = 0, positionsSize = positions.size(); i < positionsSize; i++) { + BlockPos position = positions.get(i); + if (oldNativeWorld.getBlockState(position) == Blocks.AIR.defaultBlockState()) + continue; + //BlockEntity tile = nativeWorld.removeBlockEntity(position); + BlockEntity tile = removeBlockEntity(oldNativeWorld, position); + if (tile == null) + continue; + //get the nextTick to move with the tile + + //nativeWorld.capturedTileEntities.remove(position); + //nativeWorld.getChunkAtWorldCoords(position).getTileEntities().remove(position); + tiles.add(new TileHolder(tile, tickProvider.getNextTick(oldNativeWorld, position), position)); + + } + //******************************************* + //* Step three: Translate all the blocks * + //******************************************* + // blockedByWater=false means an ocean-going vessel + //TODO: Simplify + //TODO: go by chunks + //TODO: Don't move unnecessary blocks + //get the blocks and translate the positions + List blockData = new ArrayList<>(); + List newPositions = new ArrayList<>(); + for (int i = 0, positionsSize = positions.size(); i < positionsSize; i++) { + BlockPos position = positions.get(i); + blockData.add(oldNativeWorld.getBlockState(position)); + newPositions.add(position.offset(translateVector)); + } + //create the new block + for (int i = 0, positionSize = newPositions.size(); i < positionSize; i++) { + setBlockFast(nativeWorld, newPositions.get(i), blockData.get(i)); + } + //******************************************* + //* Step four: replace all the tiles * + //******************************************* + //TODO: go by chunks + for (int i = 0, tilesSize = tiles.size(); i < tilesSize; i++) { + TileHolder tileHolder = tiles.get(i); + moveBlockEntity(nativeWorld, tileHolder.getTilePosition().offset(translateVector), tileHolder.getTile()); + if (tileHolder.getNextTick() == null) + continue; + final long currentTime = nativeWorld.getGameTime(); + nativeWorld.getBlockTicks().schedule(new ScheduledTick<>((Block) tileHolder.getNextTick().type(), tileHolder.getTilePosition().offset(translateVector), tileHolder.getNextTick().triggerTick() - currentTime, tileHolder.getNextTick().priority(), tileHolder.getNextTick().subTickOrder())); + } + //******************************************* + //* Step five: Destroy the leftovers * + //******************************************* + List deletePositions = positions; + if (oldNativeWorld == nativeWorld) + deletePositions = CollectionUtils.filter(positions, newPositions); + for (int i = 0, deletePositionsSize = deletePositions.size(); i < deletePositionsSize; i++) { + BlockPos position = deletePositions.get(i); + setBlockFast(oldNativeWorld, position, Blocks.AIR.defaultBlockState()); + } + } + + @Nullable + private BlockEntity removeBlockEntity(@NotNull Level world, @NotNull BlockPos position) { + return world.getChunkAt(position).blockEntities.remove(position); + } + + @NotNull + private BlockPos locationToPosition(@NotNull MovecraftLocation loc) { + return new BlockPos(loc.getX(), loc.getY(), loc.getZ()); + } + + private void setBlockFast(@NotNull Level world, @NotNull BlockPos position, @NotNull BlockState data) { + LevelChunk chunk = world.getChunkAt(position); + int chunkSection = (position.getY() >> 4) - chunk.getMinSection(); + LevelChunkSection section = chunk.getSections()[chunkSection]; + if (section == null) { + // Put a GLASS block to initialize the section. It will be replaced next with the real block. + chunk.setBlockState(position, Blocks.GLASS.defaultBlockState(), false); + section = chunk.getSections()[chunkSection]; + } + if (section.getBlockState(position.getX() & 15, position.getY() & 15, position.getZ() & 15).equals(data)) { + //Block is already of correct type and data, don't overwrite + return; + } + section.setBlockState(position.getX() & 15, position.getY() & 15, position.getZ() & 15, data); + world.sendBlockUpdated(position, data, data, 3); + world.getLightEngine().checkBlock(position); // boolean corresponds to if chunk section empty + chunk.setUnsaved(true); + } + + @Override + public void setBlockFast(@NotNull Location location, @NotNull BlockData data) { + setBlockFast(location, MovecraftRotation.NONE, data); + } + + @Override + public void setBlockFast(@NotNull Location location, @NotNull MovecraftRotation rotation, @NotNull BlockData data) { + BlockState blockData; + if (data instanceof CraftBlockData) { + blockData = ((CraftBlockData) data).getState(); + } + else { + blockData = (BlockState) data; + } + blockData = blockData.rotate(ROTATION[rotation.ordinal()]); + Level world = ((CraftWorld) (location.getWorld())).getHandle(); + BlockPos BlockPos = locationToPosition(MathUtils.bukkit2MovecraftLoc(location)); + setBlockFast(world, BlockPos, blockData); + } + + @Override + public void disableShadow(@NotNull Material type) { + // Disabled + } + + private void moveBlockEntity(@NotNull Level nativeWorld, @NotNull BlockPos newPosition, @NotNull BlockEntity tile) { + LevelChunk chunk = nativeWorld.getChunkAt(newPosition); + try { + var positionField = BlockEntity.class.getDeclaredField("p"); // p is obfuscated worldPosition + UnsafeUtils.setField(positionField, tile, newPosition); + } + catch (NoSuchFieldException e) { + e.printStackTrace(); + } + tile.setLevel(nativeWorld); + tile.clearRemoved(); + if (nativeWorld.captureBlockStates) { + nativeWorld.capturedTileEntities.put(newPosition, tile); + return; + } + chunk.setBlockEntity(tile); + chunk.blockEntities.put(newPosition, tile); + } + + private static class TileHolder { + @NotNull + private final BlockEntity tile; + @Nullable + private final ScheduledTick nextTick; + @NotNull + private final BlockPos tilePosition; + + public TileHolder(@NotNull BlockEntity tile, @Nullable ScheduledTick nextTick, @NotNull BlockPos tilePosition) { + this.tile = tile; + this.nextTick = nextTick; + this.tilePosition = tilePosition; + } + + + @NotNull + public BlockEntity getTile() { + return tile; + } + + @Nullable + public ScheduledTick getNextTick() { + return nextTick; + } + + @NotNull + public BlockPos getTilePosition() { + return tilePosition; + } + } +} \ No newline at end of file diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/NextTickProvider.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/NextTickProvider.java new file mode 100644 index 000000000..e1b1e3245 --- /dev/null +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/NextTickProvider.java @@ -0,0 +1,44 @@ +package net.countercraft.movecraft.compat.v1_19_R3; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.ticks.LevelTicks; +import net.minecraft.world.ticks.ScheduledTick; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.Queue; + +public class NextTickProvider { + + @Nullable + public ScheduledTick getNextTick(@NotNull ServerLevel world, @NotNull BlockPos position){ + LevelTicks tickList = world.getBlockTicks(); + var box = BoundingBox.encapsulatingPositions(List.of(position)); + if(box.isEmpty()){ + return null; + } + Queue> toRunThisTick; + try { + Field toRunThisTickField = LevelTicks.class.getDeclaredField("g"); + toRunThisTickField.setAccessible(true); + toRunThisTick = (Queue>) toRunThisTickField.get(tickList); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + return null; + } + for (var iter = toRunThisTick.iterator(); iter.hasNext(); ) { + var next = iter.next(); + if (!next.pos().equals(position)) { + continue; + } + iter.remove(); + return next; + } + return null; + } +} diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/IAsyncChunk.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/IAsyncChunk.java new file mode 100644 index 000000000..6a8f29020 --- /dev/null +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/IAsyncChunk.java @@ -0,0 +1,61 @@ +package net.countercraft.movecraft.support.v1_19_R3; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import net.countercraft.movecraft.MovecraftLocation; +import net.countercraft.movecraft.processing.WorldManager; +import net.countercraft.movecraft.support.AsyncChunk; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkStatus; +import org.bukkit.Chunk; +import org.bukkit.Material; +import org.bukkit.block.BlockState; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_19_R3.CraftChunk; +import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") +public class IAsyncChunk extends AsyncChunk { + private final @NotNull LoadingCache stateCache = CacheBuilder.newBuilder().maximumSize(1000).build(new CacheLoader<>() { + @Override + public BlockState load(@NotNull MovecraftLocation movecraftLocation) { + var block = chunk.getBlock(movecraftLocation.getX(), movecraftLocation.getY(), movecraftLocation.getZ()); + return WorldManager.INSTANCE.executeMain(block::getState); + } + }); + + // getHandle needs to be access in the main thread as of 1.19.4 + private final ChunkAccess handle; + + public IAsyncChunk(@NotNull Chunk chunk) { + super(chunk); + handle = this.chunk.getHandle(ChunkStatus.FULL); + } + + @NotNull + @Override + protected CraftChunk adapt(@NotNull org.bukkit.Chunk chunk) { + return (CraftChunk) chunk; + } + + @NotNull + @Override + public BlockState getState(@NotNull MovecraftLocation location) { + return stateCache.getUnchecked(location); + } + + @Override + @NotNull + public Material getType(@NotNull MovecraftLocation location){ + return this.getData(location).getMaterial(); + } + + @Override + @NotNull + public BlockData getData(@NotNull MovecraftLocation location){ + return CraftBlockData.fromData(handle.getBlockState(new BlockPos(location.getX(), location.getY(), location.getZ()))); + } +} diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/ISmoothTeleport.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/ISmoothTeleport.java new file mode 100644 index 000000000..4b37990e9 --- /dev/null +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/ISmoothTeleport.java @@ -0,0 +1,100 @@ +package net.countercraft.movecraft.support.v1_19_R3; + +import net.countercraft.movecraft.SmoothTeleport; +import net.countercraft.movecraft.util.ReflectUtils; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Set; + +/** + * Code derived from code taken with permission from MicleBrick + * https://www.spigotmc.org/threads/teleport-player-smoothly.317416/ + * Used for 1.19.4 + */ +public class ISmoothTeleport extends SmoothTeleport { + private final Set teleportFlags; + + private final Method positionMethod; + private final Method sendMethod; + + private final Constructor vec3Constructor; + private final Constructor packetConstructor; + + private final Field connectionField; + private final Field teleportPosField; + private final Field teleportAwaitField; + private final Field awaitingTeleportTimeField; + private final Field tickCountField; + private final Field yawField; + private final Field pitchField; + + private static @NotNull Class getNmClass(String name) throws ClassNotFoundException { + return Class.forName("net.minecraft." + name); + } + + private void sendPacket(Object packet, Player p) { + try { + Object handle = ReflectUtils.getHandle(p); + Object pConnection = connectionField.get(handle); + sendMethod.invoke(pConnection, packet); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public ISmoothTeleport() throws NoSuchFieldException, NoSuchMethodException, ClassNotFoundException { + Class packetClass = getNmClass("network.protocol.Packet"); + Class positionPacketClass = getNmClass("network.protocol.game.PacketPlayOutPosition"); // ClientboundPlayerPositionPacket + Class entityClass = getNmClass("world.entity.Entity"); + Class playerClass = getNmClass("server.level.EntityPlayer"); // ServerPlayer + Class connectionClass = getNmClass("server.network.PlayerConnection"); // ServerGamePacketListenerImpl + Class vectorClass = getNmClass("world.phys.Vec3D"); // Vec3 + + Object[] flags = getNmClass("world.entity.RelativeMovement").getEnumConstants(); + teleportFlags = Set.of(flags[4], flags[3]); // X_ROT, Y_ROT + + positionMethod = entityClass.getDeclaredMethod("a", Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE); // absMoveTo + sendMethod = connectionClass.getMethod("a", packetClass); // send + + vec3Constructor = vectorClass.getConstructor(Double.TYPE, Double.TYPE, Double.TYPE); + packetConstructor = positionPacketClass.getConstructor(Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE, Set.class, Integer.TYPE); + + connectionField = ReflectUtils.getField(playerClass, "b"); // connection + teleportPosField = ReflectUtils.getField(connectionClass, "D"); // awaitingPositionFromClient + teleportAwaitField = ReflectUtils.getField(connectionClass, "E"); // awaitingTeleport + awaitingTeleportTimeField = ReflectUtils.getField(connectionClass, "F"); // awaitingTeleportTime + tickCountField = ReflectUtils.getField(connectionClass, "j"); // tickCount + yawField = ReflectUtils.getField(entityClass, "aF"); // xRot + pitchField = ReflectUtils.getField(entityClass, "aE"); // yRot + } + + public void teleport(Player player, @NotNull Location location, float yawChange, float pitchChange) { + double x = location.getX(); + double y = location.getY(); + double z = location.getZ(); + Object handle = ReflectUtils.getHandle(player); + try { + positionMethod.invoke(handle, x, y, z, yawField.get(handle), pitchField.get(handle)); + Object connection = connectionField.get(handle); + teleportPosField.set(connection, vec3Constructor.newInstance(x, y, z)); + int teleportAwait = teleportAwaitField.getInt(connection) + 1; + if (teleportAwait == Integer.MAX_VALUE) + teleportAwait = 0; + teleportAwaitField.setInt(connection, teleportAwait); + awaitingTeleportTimeField.set(connection, tickCountField.get(connection)); + + Object packet = packetConstructor.newInstance(x, y, z, yawChange, pitchChange, teleportFlags, teleportAwait); + sendPacket(packet, player); + } + catch (IllegalAccessException | InvocationTargetException | InstantiationException e) { + e.printStackTrace(); + } + } +} diff --git a/pom.xml b/pom.xml index abc39e141..684598f63 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,7 @@ modules/v1_17_R1 modules/v1_18_R2 modules/v1_19_R3 + modules/v1_20_R1 modules/datapack modules/Movecraft From f3ce10e1798a3949f08f1c6de6fa4f6f4005b079 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 4 Jun 2023 12:23:53 -0500 Subject: [PATCH 05/17] Move classes --- .../{v1_19_R3 => v1_20_R1}/IWorldHandler.java | 34 ++++++++++++++++++- .../NextTickProvider.java | 2 +- .../{v1_19_R3 => v1_20_R1}/IAsyncChunk.java | 2 +- .../ISmoothTeleport.java | 2 +- 4 files changed, 36 insertions(+), 4 deletions(-) rename modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/{v1_19_R3 => v1_20_R1}/IWorldHandler.java (90%) rename modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/{v1_19_R3 => v1_20_R1}/NextTickProvider.java (96%) rename modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/{v1_19_R3 => v1_20_R1}/IAsyncChunk.java (97%) rename modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/{v1_19_R3 => v1_20_R1}/ISmoothTeleport.java (98%) diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/IWorldHandler.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java similarity index 90% rename from modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/IWorldHandler.java rename to modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java index 5822e8433..3bc47e8f1 100644 --- a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/IWorldHandler.java +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java @@ -1,4 +1,4 @@ -package net.countercraft.movecraft.compat.v1_19_R3; +package net.countercraft.movecraft.compat.v1_20_R1; import net.countercraft.movecraft.MovecraftLocation; import net.countercraft.movecraft.MovecraftRotation; @@ -9,6 +9,8 @@ import net.countercraft.movecraft.util.UnsafeUtils; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerLevelAccess; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -23,10 +25,13 @@ import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryView; import org.bukkit.craftbukkit.v1_19_R3.util.CraftMagicNumbers; +import org.bukkit.inventory.InventoryView; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -247,6 +252,33 @@ public void disableShadow(@NotNull Material type) { // Disabled } + @Override + public @Nullable Location getAccessLocation(@NotNull InventoryView inventoryView) { + AbstractContainerMenu menu = ((CraftInventoryView) inventoryView).getHandle(); + Field field = UnsafeUtils.getFieldOfType(ContainerLevelAccess.class, menu.getClass()); + if (field != null) { + try { + field.setAccessible(true); + return ((ContainerLevelAccess) field.get(menu)).getLocation(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public void setAccessLocation(@NotNull InventoryView inventoryView, @NotNull Location location) { + if (location.getWorld() == null) + return; + ServerLevel level = ((CraftWorld) location.getWorld()).getHandle(); + BlockPos position = new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + ContainerLevelAccess access = ContainerLevelAccess.create(level, position); + + AbstractContainerMenu menu = ((CraftInventoryView) inventoryView).getHandle(); + UnsafeUtils.trySetFieldOfType(ContainerLevelAccess.class, menu, access); + } + private void moveBlockEntity(@NotNull Level nativeWorld, @NotNull BlockPos newPosition, @NotNull BlockEntity tile) { LevelChunk chunk = nativeWorld.getChunkAt(newPosition); try { diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/NextTickProvider.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/NextTickProvider.java similarity index 96% rename from modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/NextTickProvider.java rename to modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/NextTickProvider.java index e1b1e3245..a39b7c698 100644 --- a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_19_R3/NextTickProvider.java +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/NextTickProvider.java @@ -1,4 +1,4 @@ -package net.countercraft.movecraft.compat.v1_19_R3; +package net.countercraft.movecraft.compat.v1_20_R1; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/IAsyncChunk.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/IAsyncChunk.java similarity index 97% rename from modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/IAsyncChunk.java rename to modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/IAsyncChunk.java index 6a8f29020..ecf3be9f5 100644 --- a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/IAsyncChunk.java +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/IAsyncChunk.java @@ -1,4 +1,4 @@ -package net.countercraft.movecraft.support.v1_19_R3; +package net.countercraft.movecraft.support.v1_20_R1; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/ISmoothTeleport.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/ISmoothTeleport.java similarity index 98% rename from modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/ISmoothTeleport.java rename to modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/ISmoothTeleport.java index 4b37990e9..780825157 100644 --- a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_19_R3/ISmoothTeleport.java +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/ISmoothTeleport.java @@ -1,4 +1,4 @@ -package net.countercraft.movecraft.support.v1_19_R3; +package net.countercraft.movecraft.support.v1_20_R1; import net.countercraft.movecraft.SmoothTeleport; import net.countercraft.movecraft.util.ReflectUtils; From 0f960338c3b0c2c087f287531896c6e2aac57cef Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Sun, 4 Jun 2023 15:05:40 -0500 Subject: [PATCH 06/17] Remove 1.17.1 --- modules/Movecraft/pom.xml | 6 - modules/v1_17_R1/pom.xml | 94 ----- .../compat/v1_17_R1/IWorldHandler.java | 331 ------------------ .../compat/v1_17_R1/NextTickProvider.java | 30 -- .../support/v1_17_R1/IAsyncChunk.java | 57 --- .../support/v1_17_R1/ISmoothTeleport.java | 100 ------ pom.xml | 1 - 7 files changed, 619 deletions(-) delete mode 100644 modules/v1_17_R1/pom.xml delete mode 100644 modules/v1_17_R1/src/main/java/net/countercraft/movecraft/compat/v1_17_R1/IWorldHandler.java delete mode 100644 modules/v1_17_R1/src/main/java/net/countercraft/movecraft/compat/v1_17_R1/NextTickProvider.java delete mode 100644 modules/v1_17_R1/src/main/java/net/countercraft/movecraft/support/v1_17_R1/IAsyncChunk.java delete mode 100644 modules/v1_17_R1/src/main/java/net/countercraft/movecraft/support/v1_17_R1/ISmoothTeleport.java diff --git a/modules/Movecraft/pom.xml b/modules/Movecraft/pom.xml index 84affee36..b6eada194 100644 --- a/modules/Movecraft/pom.xml +++ b/modules/Movecraft/pom.xml @@ -36,12 +36,6 @@ ${revision} jar - - net.countercraft - movecraft-v1_17_r1 - ${revision} - jar - net.countercraft movecraft-v1_18_r2 diff --git a/modules/v1_17_R1/pom.xml b/modules/v1_17_R1/pom.xml deleted file mode 100644 index 9e8517ca3..000000000 --- a/modules/v1_17_R1/pom.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - - movecraft-parent - net.countercraft - ${revision} - ../../pom.xml - - 4.0.0 - - movecraft-v1_17_r1 - Movecraft-v1_17_R1 - jar - - - org.spigotmc - spigot - 1.17.1-R0.1-SNAPSHOT - remapped-mojang - provided - - - net.countercraft - movecraft-api - ${revision} - jar - - - - src/main/java - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - - net/countercraft/movecraft/compat/v1_17_R1/** - net/countercraft/movecraft/support/v1_17_R1/** - - 13 - 13 - - - - org.apache.maven.plugins - maven-jar-plugin - 2.4 - - - net/countercraft/movecraft/compat/v1_17_R1/** - net/countercraft/movecraft/support/v1_17_R1/** - - - - - net.md-5 - specialsource-maven-plugin - 1.2.2 - - - package - - remap - - remap-obf - - org.spigotmc:minecraft-server:1.17.1-R0.1-SNAPSHOT:txt:maps-mojang - true - org.spigotmc:spigot:1.17.1-R0.1-SNAPSHOT:jar:remapped-mojang - true - remapped-obf - - - - package - - remap - - remap-spigot - - ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - org.spigotmc:minecraft-server:1.17.1-R0.1-SNAPSHOT:csrg:maps-spigot - org.spigotmc:spigot:1.17.1-R0.1-SNAPSHOT:jar:remapped-obf - - - - - - - - \ No newline at end of file diff --git a/modules/v1_17_R1/src/main/java/net/countercraft/movecraft/compat/v1_17_R1/IWorldHandler.java b/modules/v1_17_R1/src/main/java/net/countercraft/movecraft/compat/v1_17_R1/IWorldHandler.java deleted file mode 100644 index 158fc27a2..000000000 --- a/modules/v1_17_R1/src/main/java/net/countercraft/movecraft/compat/v1_17_R1/IWorldHandler.java +++ /dev/null @@ -1,331 +0,0 @@ -package net.countercraft.movecraft.compat.v1_17_R1; - -import net.countercraft.movecraft.MovecraftLocation; -import net.countercraft.movecraft.MovecraftRotation; -import net.countercraft.movecraft.WorldHandler; -import net.countercraft.movecraft.craft.Craft; -import net.countercraft.movecraft.util.CollectionUtils; -import net.countercraft.movecraft.util.MathUtils; -import net.countercraft.movecraft.util.UnsafeUtils; -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.ContainerLevelAccess; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.TickNextTickData; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraft.world.level.chunk.LevelChunkSection; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_17_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_17_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_17_R1.util.CraftMagicNumbers; -import org.bukkit.inventory.InventoryView; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@SuppressWarnings("unused") -public class IWorldHandler extends WorldHandler { - private static final Rotation ROTATION[]; - - static { - ROTATION = new Rotation[3]; - ROTATION[MovecraftRotation.NONE.ordinal()] = Rotation.NONE; - ROTATION[MovecraftRotation.CLOCKWISE.ordinal()] = Rotation.CLOCKWISE_90; - ROTATION[MovecraftRotation.ANTICLOCKWISE.ordinal()] = Rotation.COUNTERCLOCKWISE_90; - } - - private final NextTickProvider tickProvider = new NextTickProvider(); - - public IWorldHandler() { - String mappings = ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion(); - if (!mappings.equals("f0e3dfc7390de285a4693518dd5bd126")) - throw new IllegalStateException("Movecraft is not compatible with this version of Minecraft 1.17: " + mappings); - } - - @Override - public void rotateCraft(@NotNull Craft craft, @NotNull MovecraftLocation originPoint, @NotNull MovecraftRotation rotation) { - //******************************************* - //* Step one: Convert to Positions * - //******************************************* - HashMap rotatedPositions = new HashMap<>(); - MovecraftRotation counterRotation = rotation == MovecraftRotation.CLOCKWISE ? MovecraftRotation.ANTICLOCKWISE : MovecraftRotation.CLOCKWISE; - for (MovecraftLocation newLocation : craft.getHitBox()) { - rotatedPositions.put(locationToPosition(MathUtils.rotateVec(counterRotation, newLocation.subtract(originPoint)).add(originPoint)), locationToPosition(newLocation)); - } - //******************************************* - //* Step two: Get the tiles * - //******************************************* - ServerLevel nativeWorld = ((CraftWorld) craft.getWorld()).getHandle(); - List tiles = new ArrayList<>(); - //get the tiles - for (BlockPos position : rotatedPositions.keySet()) { - //BlockEntity tile = nativeWorld.removeBlockEntity(position); - BlockEntity tile = removeBlockEntity(nativeWorld, position); - if (tile == null) - continue; -// tile.a(ROTATION[rotation.ordinal()]); - //get the nextTick to move with the tile - tiles.add(new TileHolder(tile, tickProvider.getNextTick(nativeWorld, position), position)); - } - - //******************************************* - //* Step three: Translate all the blocks * - //******************************************* - // blockedByWater=false means an ocean-going vessel - //TODO: Simplify - //TODO: go by chunks - //TODO: Don't move unnecessary blocks - //get the blocks and rotate them - HashMap blockData = new HashMap<>(); - for (BlockPos position : rotatedPositions.keySet()) { - blockData.put(position, nativeWorld.getBlockState(position).rotate(ROTATION[rotation.ordinal()])); - } - //create the new block - for (Map.Entry entry : blockData.entrySet()) { - setBlockFast(nativeWorld, rotatedPositions.get(entry.getKey()), entry.getValue()); - } - - - //******************************************* - //* Step four: replace all the tiles * - //******************************************* - //TODO: go by chunks - for (TileHolder tileHolder : tiles) { - moveBlockEntity(nativeWorld, rotatedPositions.get(tileHolder.getTilePosition()), tileHolder.getTile()); - if (tileHolder.getNextTick() == null) - continue; - final long currentTime = nativeWorld.E.getGameTime(); - nativeWorld.getBlockTickList().scheduleTick(rotatedPositions.get(tileHolder.getNextTick().pos), (Block) tileHolder.getNextTick().getType(), (int) (tileHolder.getNextTick().triggerTick - currentTime), tileHolder.getNextTick().priority); - } - - //******************************************* - //* Step five: Destroy the leftovers * - //******************************************* - //TODO: add support for pass-through - Collection deletePositions = CollectionUtils.filter(rotatedPositions.keySet(), rotatedPositions.values()); - for (BlockPos position : deletePositions) { - setBlockFast(nativeWorld, position, Blocks.AIR.defaultBlockState()); - } - } - - @Override - public void translateCraft(@NotNull Craft craft, @NotNull MovecraftLocation displacement, @NotNull org.bukkit.World world) { - //TODO: Add support for rotations - //A craftTranslateCommand should only occur if the craft is moving to a valid position - //******************************************* - //* Step one: Convert to Positions * - //******************************************* - BlockPos translateVector = locationToPosition(displacement); - List positions = new ArrayList<>(craft.getHitBox().size()); - craft.getHitBox().forEach((movecraftLocation) -> positions.add(locationToPosition((movecraftLocation)).e(translateVector))); - ServerLevel oldNativeWorld = ((CraftWorld) craft.getWorld()).getHandle(); - ServerLevel nativeWorld = ((CraftWorld) world).getHandle(); - //******************************************* - //* Step two: Get the tiles * - //******************************************* - List tiles = new ArrayList<>(); - //get the tiles - for (int i = 0, positionsSize = positions.size(); i < positionsSize; i++) { - BlockPos position = positions.get(i); - if (oldNativeWorld.getBlockState(position) == Blocks.AIR.defaultBlockState()) - continue; - //BlockEntity tile = nativeWorld.removeBlockEntity(position); - BlockEntity tile = removeBlockEntity(oldNativeWorld, position); - if (tile == null) - continue; - //get the nextTick to move with the tile - - //nativeWorld.capturedTileEntities.remove(position); - //nativeWorld.getChunkAtWorldCoords(position).getTileEntities().remove(position); - tiles.add(new TileHolder(tile, tickProvider.getNextTick(oldNativeWorld, position), position)); - - } - //******************************************* - //* Step three: Translate all the blocks * - //******************************************* - // blockedByWater=false means an ocean-going vessel - //TODO: Simplify - //TODO: go by chunks - //TODO: Don't move unnecessary blocks - //get the blocks and translate the positions - List blockData = new ArrayList<>(); - List newPositions = new ArrayList<>(); - for (int i = 0, positionsSize = positions.size(); i < positionsSize; i++) { - BlockPos position = positions.get(i); - blockData.add(oldNativeWorld.getBlockState(position)); - newPositions.add(position.f(translateVector)); - } - //create the new block - for (int i = 0, positionSize = newPositions.size(); i < positionSize; i++) { - setBlockFast(nativeWorld, newPositions.get(i), blockData.get(i)); - } - //******************************************* - //* Step four: replace all the tiles * - //******************************************* - //TODO: go by chunks - for (int i = 0, tilesSize = tiles.size(); i < tilesSize; i++) { - TileHolder tileHolder = tiles.get(i); - moveBlockEntity(nativeWorld, tileHolder.getTilePosition().f(translateVector), tileHolder.getTile()); - if (tileHolder.getNextTick() == null) - continue; - final long currentTime = nativeWorld.E.getGameTime(); - nativeWorld.getBlockTickList().scheduleTick(tileHolder.getNextTick().pos.f(translateVector), (Block) tileHolder.getNextTick().getType(), (int) (tileHolder.getNextTick().triggerTick - currentTime), tileHolder.getNextTick().priority); - } - //******************************************* - //* Step five: Destroy the leftovers * - //******************************************* - List deletePositions = positions; - if (oldNativeWorld == nativeWorld) - deletePositions = CollectionUtils.filter(positions, newPositions); - for (int i = 0, deletePositionsSize = deletePositions.size(); i < deletePositionsSize; i++) { - BlockPos position = deletePositions.get(i); - setBlockFast(oldNativeWorld, position, Blocks.AIR.defaultBlockState()); - } - } - - @Nullable - private BlockEntity removeBlockEntity(@NotNull Level world, @NotNull BlockPos position) { - return world.getChunkAt(position).blockEntities.remove(position); - } - - @NotNull - private BlockPos locationToPosition(@NotNull MovecraftLocation loc) { - return new BlockPos(loc.getX(), loc.getY(), loc.getZ()); - } - - private void setBlockFast(@NotNull Level world, @NotNull BlockPos position, @NotNull BlockState data) { - LevelChunk chunk = world.getChunkAt(position); - int chunkSection = (position.getY() >> 4) - chunk.getMinSection(); - LevelChunkSection section = chunk.getSections()[chunkSection]; - if (section == null) { - // Put a GLASS block to initialize the section. It will be replaced next with the real block. - chunk.setBlockState(position, Blocks.GLASS.defaultBlockState(), false); - section = chunk.getSections()[chunkSection]; - } - if (section.getBlockState(position.getX() & 15, position.getY() & 15, position.getZ() & 15).equals(data)) { - //Block is already of correct type and data, don't overwrite - return; - } - section.setBlockState(position.getX() & 15, position.getY() & 15, position.getZ() & 15, data); - world.sendBlockUpdated(position, data, data, 3); - world.getLightEngine().checkBlock(position); // boolean corresponds to if chunk section empty - chunk.markUnsaved(); - } - - @Override - public void setBlockFast(@NotNull Location location, @NotNull BlockData data) { - setBlockFast(location, MovecraftRotation.NONE, data); - } - - @Override - public void setBlockFast(@NotNull Location location, @NotNull MovecraftRotation rotation, @NotNull BlockData data) { - BlockState blockData; - if (data instanceof CraftBlockData) { - blockData = ((CraftBlockData) data).getState(); - } - else { - blockData = (BlockState) data; - } - blockData = blockData.rotate(ROTATION[rotation.ordinal()]); - Level world = ((CraftWorld) (location.getWorld())).getHandle(); - BlockPos BlockPos = locationToPosition(MathUtils.bukkit2MovecraftLoc(location)); - setBlockFast(world, BlockPos, blockData); - } - - @Override - public void disableShadow(@NotNull Material type) { - // Disabled - } - - @Override - public @Nullable Location getAccessLocation(@NotNull InventoryView inventoryView) { - AbstractContainerMenu menu = ((CraftInventoryView) inventoryView).getHandle(); - Field field = UnsafeUtils.getFieldOfType(ContainerLevelAccess.class, menu.getClass()); - if (field != null) { - try { - field.setAccessible(true); - return ((ContainerLevelAccess) field.get(menu)).getLocation(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - return null; - } - - @Override - public void setAccessLocation(@NotNull InventoryView inventoryView, @NotNull Location location) { - if (location.getWorld() == null) - return; - ServerLevel level = ((CraftWorld) location.getWorld()).getHandle(); - BlockPos position = new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()); - ContainerLevelAccess access = ContainerLevelAccess.create(level, position); - - AbstractContainerMenu menu = ((CraftInventoryView) inventoryView).getHandle(); - UnsafeUtils.trySetFieldOfType(ContainerLevelAccess.class, menu, access); - } - - private void moveBlockEntity(@NotNull Level nativeWorld, @NotNull BlockPos newPosition, @NotNull BlockEntity tile) { - LevelChunk chunk = nativeWorld.getChunkAt(newPosition); - try { - var positionField = BlockEntity.class.getDeclaredField("o"); // o is obfuscated worldPosition - UnsafeUtils.setField(positionField, tile, newPosition); - } - catch (NoSuchFieldException e) { - e.printStackTrace(); - } - tile.setLevel(nativeWorld); - tile.clearRemoved(); - if (nativeWorld.captureBlockStates) { - nativeWorld.capturedTileEntities.put(newPosition, tile); - return; - } - chunk.setBlockEntity(tile); - chunk.blockEntities.put(newPosition, tile); - } - - private static class TileHolder { - @NotNull - private final BlockEntity tile; - @Nullable - private final TickNextTickData nextTick; - @NotNull - private final BlockPos tilePosition; - - public TileHolder(@NotNull BlockEntity tile, @Nullable TickNextTickData nextTick, @NotNull BlockPos tilePosition) { - this.tile = tile; - this.nextTick = nextTick; - this.tilePosition = tilePosition; - } - - - @NotNull - public BlockEntity getTile() { - return tile; - } - - @Nullable - public TickNextTickData getNextTick() { - return nextTick; - } - - @NotNull - public BlockPos getTilePosition() { - return tilePosition; - } - } -} \ No newline at end of file diff --git a/modules/v1_17_R1/src/main/java/net/countercraft/movecraft/compat/v1_17_R1/NextTickProvider.java b/modules/v1_17_R1/src/main/java/net/countercraft/movecraft/compat/v1_17_R1/NextTickProvider.java deleted file mode 100644 index 3b574d476..000000000 --- a/modules/v1_17_R1/src/main/java/net/countercraft/movecraft/compat/v1_17_R1/NextTickProvider.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.countercraft.movecraft.compat.v1_17_R1; - -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.ServerTickList; -import net.minecraft.world.level.TickNextTickData; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.logging.Logger; - -public class NextTickProvider { - - @Nullable - public TickNextTickData getNextTick(@NotNull ServerLevel world, @NotNull BlockPos position){ - ServerTickList tickList = world.getBlockTickList(); - var box = BoundingBox.encapsulatingPositions(List.of(position)); - if(box.isEmpty()){ - return null; - } - for(var tick : tickList.fetchTicksInArea(box.get(), false, false)){ - Logger.getAnonymousLogger().info("" + tick); - return tick; - } - return null; - } -} diff --git a/modules/v1_17_R1/src/main/java/net/countercraft/movecraft/support/v1_17_R1/IAsyncChunk.java b/modules/v1_17_R1/src/main/java/net/countercraft/movecraft/support/v1_17_R1/IAsyncChunk.java deleted file mode 100644 index aac0c7749..000000000 --- a/modules/v1_17_R1/src/main/java/net/countercraft/movecraft/support/v1_17_R1/IAsyncChunk.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.countercraft.movecraft.support.v1_17_R1; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; -import net.countercraft.movecraft.MovecraftLocation; -import net.countercraft.movecraft.processing.WorldManager; -import net.countercraft.movecraft.support.AsyncChunk; -import net.minecraft.core.BlockPos; -import org.bukkit.Chunk; -import org.bukkit.Material; -import org.bukkit.block.BlockState; -import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_17_R1.CraftChunk; -import org.bukkit.craftbukkit.v1_17_R1.block.data.CraftBlockData; -import org.jetbrains.annotations.NotNull; - -@SuppressWarnings("unused") -public class IAsyncChunk extends AsyncChunk { - - private final @NotNull LoadingCache stateCache = CacheBuilder.newBuilder().maximumSize(1000).build(new CacheLoader<>() { - @Override - public BlockState load(@NotNull MovecraftLocation movecraftLocation) { - var block = chunk.getBlock(movecraftLocation.getX(), movecraftLocation.getY(), movecraftLocation.getZ()); - return WorldManager.INSTANCE.executeMain(block::getState); - } - }); - - public IAsyncChunk(@NotNull Chunk chunk) { - super(chunk); - } - - @NotNull - @Override - protected CraftChunk adapt(@NotNull org.bukkit.Chunk chunk) { - return (CraftChunk) chunk; - } - - @NotNull - @Override - public BlockState getState(@NotNull MovecraftLocation location) { - return stateCache.getUnchecked(location); - } - - @Override - @NotNull - public Material getType(@NotNull MovecraftLocation location){ - return this.getData(location).getMaterial(); - } - - @Override - @NotNull - public BlockData getData(@NotNull MovecraftLocation location){ - return CraftBlockData.fromData(chunk.getHandle().getBlockState(new BlockPos(location.getX(), location.getY(), location.getZ()))); - } - -} diff --git a/modules/v1_17_R1/src/main/java/net/countercraft/movecraft/support/v1_17_R1/ISmoothTeleport.java b/modules/v1_17_R1/src/main/java/net/countercraft/movecraft/support/v1_17_R1/ISmoothTeleport.java deleted file mode 100644 index 5b0903668..000000000 --- a/modules/v1_17_R1/src/main/java/net/countercraft/movecraft/support/v1_17_R1/ISmoothTeleport.java +++ /dev/null @@ -1,100 +0,0 @@ -package net.countercraft.movecraft.support.v1_17_R1; - -import net.countercraft.movecraft.SmoothTeleport; -import net.countercraft.movecraft.util.ReflectUtils; -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Set; - -/** - * Code derived from code taken with permission from MicleBrick - * https://www.spigotmc.org/threads/teleport-player-smoothly.317416/ - * Used for 1.17.1 - */ -public class ISmoothTeleport extends SmoothTeleport { - private final Set teleportFlags; - - private final Method positionMethod; - private final Method sendMethod; - - private final Constructor vec3Constructor; - private final Constructor packetConstructor; - - private final Field connectionField; - private final Field teleportPosField; - private final Field teleportAwaitField; - private final Field awaitingTeleportTimeField; - private final Field tickCountField; - private final Field yawField; - private final Field pitchField; - - private static @NotNull Class getNmClass(String name) throws ClassNotFoundException { - return Class.forName("net.minecraft." + name); - } - - private void sendPacket(Object packet, Player p) { - try { - Object handle = ReflectUtils.getHandle(p); - Object pConnection = connectionField.get(handle); - sendMethod.invoke(pConnection, packet); - } - catch (Exception e) { - e.printStackTrace(); - } - } - - public ISmoothTeleport() throws NoSuchFieldException, NoSuchMethodException, ClassNotFoundException { - Class packetClass = getNmClass("network.protocol.Packet"); - Class positionPacketClass = getNmClass("network.protocol.game.PacketPlayOutPosition"); // ClientboundPlayerPositionPacket - Class entityClass = getNmClass("world.entity.Entity"); - Class playerClass = getNmClass("server.level.EntityPlayer"); // ServerPlayer - Class connectionClass = getNmClass("server.network.PlayerConnection"); // ServerGamePacketListenerImpl - Class vectorClass = getNmClass("world.phys.Vec3D"); // Vec3 - - Object[] flags = getNmClass("network.protocol.game.PacketPlayOutPosition$EnumPlayerTeleportFlags").getEnumConstants(); // $RelativeArgument - teleportFlags = Set.of(flags[4], flags[3]); // X_ROT, Y_ROT - - positionMethod = entityClass.getDeclaredMethod("setLocation", Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE); // absMoveTo - sendMethod = connectionClass.getMethod("sendPacket", packetClass); // send - - vec3Constructor = vectorClass.getConstructor(Double.TYPE, Double.TYPE, Double.TYPE); - packetConstructor = positionPacketClass.getConstructor(Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE, Set.class, Integer.TYPE, Boolean.TYPE); - - connectionField = ReflectUtils.getField(playerClass, "b"); // connection - teleportPosField = ReflectUtils.getField(connectionClass, "y"); // awaitingPositionFromClient - teleportAwaitField = ReflectUtils.getField(connectionClass, "z"); // awaitingTeleport - awaitingTeleportTimeField = ReflectUtils.getField(connectionClass, "A"); // awaitingTeleportTime - tickCountField = ReflectUtils.getField(connectionClass, "f"); // tickCount - yawField = ReflectUtils.getField(entityClass, "az"); // xRot - pitchField = ReflectUtils.getField(entityClass, "ay"); // yRot - } - - public void teleport(Player player, @NotNull Location location, float yawChange, float pitchChange) { - double x = location.getX(); - double y = location.getY(); - double z = location.getZ(); - Object handle = ReflectUtils.getHandle(player); - try { - positionMethod.invoke(handle, x, y, z, yawField.get(handle), pitchField.get(handle)); - Object connection = connectionField.get(handle); - teleportPosField.set(connection, vec3Constructor.newInstance(x, y, z)); - int teleportAwait = teleportAwaitField.getInt(connection) + 1; - if (teleportAwait == Integer.MAX_VALUE) - teleportAwait = 0; - teleportAwaitField.setInt(connection, teleportAwait); - awaitingTeleportTimeField.set(connection, tickCountField.get(connection)); - - Object packet = packetConstructor.newInstance(x, y, z, yawChange, pitchChange, teleportFlags, teleportAwait, false); - sendPacket(packet, player); - } - catch (IllegalAccessException | InvocationTargetException | InstantiationException e) { - e.printStackTrace(); - } - } -} diff --git a/pom.xml b/pom.xml index 684598f63..f41dd6c17 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,6 @@ modules/api modules/v1_16_R3 - modules/v1_17_R1 modules/v1_18_R2 modules/v1_19_R3 modules/v1_20_R1 From 02331e991398ee1adb8fc9752b951c01a8580a1d Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Mon, 5 Jun 2023 16:10:12 -0500 Subject: [PATCH 07/17] Update to 1.20 RC1 mappings --- modules/v1_20_R1/pom.xml | 13 +++++++------ .../movecraft/compat/v1_20_R1/IWorldHandler.java | 14 +++++++------- .../compat/v1_20_R1/NextTickProvider.java | 2 +- .../movecraft/support/v1_20_R1/IAsyncChunk.java | 4 ++-- .../support/v1_20_R1/ISmoothTeleport.java | 8 ++++---- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/modules/v1_20_R1/pom.xml b/modules/v1_20_R1/pom.xml index 7b870c896..aef01aac3 100644 --- a/modules/v1_20_R1/pom.xml +++ b/modules/v1_20_R1/pom.xml @@ -17,10 +17,11 @@ org.spigotmc spigot - 1.19.4-R0.1-SNAPSHOT + 1.20-R0.1-SNAPSHOT remapped-mojang provided - + + net.countercraft @@ -68,9 +69,9 @@ remap-obf - org.spigotmc:minecraft-server:1.19.4-R0.1-SNAPSHOT:txt:maps-mojang + org.spigotmc:minecraft-server:1.20-R0.1-SNAPSHOT:txt:maps-mojang true - org.spigotmc:spigot:1.19.4-R0.1-SNAPSHOT:jar:remapped-mojang + org.spigotmc:spigot:1.20-R0.1-SNAPSHOT:jar:remapped-mojang true remapped-obf @@ -83,8 +84,8 @@ remap-spigot ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - org.spigotmc:minecraft-server:1.19.4-R0.1-SNAPSHOT:csrg:maps-spigot - org.spigotmc:spigot:1.19.4-R0.1-SNAPSHOT:jar:remapped-obf + org.spigotmc:minecraft-server:1.20-R0.1-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.20-R0.1-SNAPSHOT:jar:remapped-obf diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java index 3bc47e8f1..9d4f350f4 100644 --- a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java @@ -23,10 +23,10 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.v1_19_R3.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R1.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.v1_20_R1.util.CraftMagicNumbers; import org.bukkit.inventory.InventoryView; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -53,8 +53,8 @@ public class IWorldHandler extends WorldHandler { public IWorldHandler() { String mappings = ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion(); - if (!mappings.equals("3009edc0fff87fa34680686663bd59df")) - throw new IllegalStateException("Movecraft is not compatible with this version of Minecraft 1.19: " + mappings); + if (!mappings.equals("TBD")) + throw new IllegalStateException("Movecraft is not compatible with this version of Minecraft 1.20: " + mappings); } @Override @@ -109,7 +109,7 @@ public void rotateCraft(@NotNull Craft craft, @NotNull MovecraftLocation originP moveBlockEntity(nativeWorld, rotatedPositions.get(tileHolder.getTilePosition()), tileHolder.getTile()); if (tileHolder.getNextTick() == null) continue; - final long currentTime = nativeWorld.J.getGameTime(); // J is obfuscated serverLevelData + final long currentTime = nativeWorld.K.getGameTime(); // K is obfuscated serverLevelData nativeWorld.getBlockTicks().schedule(new ScheduledTick<>((Block) tileHolder.getNextTick().type(), rotatedPositions.get(tileHolder.getNextTick().pos()), tileHolder.getNextTick().triggerTick() - currentTime, tileHolder.getNextTick().priority(), tileHolder.getNextTick().subTickOrder())); } diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/NextTickProvider.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/NextTickProvider.java index a39b7c698..62a3b7ddf 100644 --- a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/NextTickProvider.java +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/NextTickProvider.java @@ -24,7 +24,7 @@ public ScheduledTick getNextTick(@NotNull ServerLevel world, @NotNull BlockPo } Queue> toRunThisTick; try { - Field toRunThisTickField = LevelTicks.class.getDeclaredField("g"); + Field toRunThisTickField = LevelTicks.class.getDeclaredField("g"); // g is obfuscated toRunThisTick toRunThisTickField.setAccessible(true); toRunThisTick = (Queue>) toRunThisTickField.get(tickList); } catch (NoSuchFieldException | IllegalAccessException e) { diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/IAsyncChunk.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/IAsyncChunk.java index ecf3be9f5..9723dcbda 100644 --- a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/IAsyncChunk.java +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/IAsyncChunk.java @@ -13,8 +13,8 @@ import org.bukkit.Material; import org.bukkit.block.BlockState; import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_19_R3.CraftChunk; -import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_20_R1.block.data.CraftBlockData; import org.jetbrains.annotations.NotNull; @SuppressWarnings("unused") diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/ISmoothTeleport.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/ISmoothTeleport.java index 780825157..4b35386ce 100644 --- a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/ISmoothTeleport.java +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/ISmoothTeleport.java @@ -15,7 +15,7 @@ /** * Code derived from code taken with permission from MicleBrick * https://www.spigotmc.org/threads/teleport-player-smoothly.317416/ - * Used for 1.19.4 + * Used for 1.20 */ public class ISmoothTeleport extends SmoothTeleport { private final Set teleportFlags; @@ -66,13 +66,13 @@ public ISmoothTeleport() throws NoSuchFieldException, NoSuchMethodException, Cla vec3Constructor = vectorClass.getConstructor(Double.TYPE, Double.TYPE, Double.TYPE); packetConstructor = positionPacketClass.getConstructor(Double.TYPE, Double.TYPE, Double.TYPE, Float.TYPE, Float.TYPE, Set.class, Integer.TYPE); - connectionField = ReflectUtils.getField(playerClass, "b"); // connection + connectionField = ReflectUtils.getField(playerClass, "c"); // connection teleportPosField = ReflectUtils.getField(connectionClass, "D"); // awaitingPositionFromClient teleportAwaitField = ReflectUtils.getField(connectionClass, "E"); // awaitingTeleport awaitingTeleportTimeField = ReflectUtils.getField(connectionClass, "F"); // awaitingTeleportTime tickCountField = ReflectUtils.getField(connectionClass, "j"); // tickCount - yawField = ReflectUtils.getField(entityClass, "aF"); // xRot - pitchField = ReflectUtils.getField(entityClass, "aE"); // yRot + yawField = ReflectUtils.getField(entityClass, "aH"); // xRot + pitchField = ReflectUtils.getField(entityClass, "aG"); // yRot } public void teleport(Player player, @NotNull Location location, float yawChange, float pitchChange) { From 2ec5ecd184da712659b5c13ace6f3578063842ad Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Mon, 5 Jun 2023 16:10:52 -0500 Subject: [PATCH 08/17] Temporarily remove magic numbers check --- .../countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java index 9d4f350f4..be8d44e1f 100644 --- a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java @@ -53,8 +53,8 @@ public class IWorldHandler extends WorldHandler { public IWorldHandler() { String mappings = ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion(); - if (!mappings.equals("TBD")) - throw new IllegalStateException("Movecraft is not compatible with this version of Minecraft 1.20: " + mappings); + // if (!mappings.equals("TBD")) + // throw new IllegalStateException("Movecraft is not compatible with this version of Minecraft 1.20: " + mappings); } @Override From 45fd726063520e6515a0d85754dd7066e09cc3c3 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Wed, 7 Jun 2023 15:51:26 -0500 Subject: [PATCH 09/17] Update CI to 1.20 --- .github/workflows/maven.yml | 143 +++++++++++++--------------------- .github/workflows/publish.yml | 143 +++++++++++++--------------------- 2 files changed, 104 insertions(+), 182 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index b63ba842b..b17355e58 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -8,39 +8,6 @@ on: - cron: '22 13 * * 6' jobs: - # Build 1.14.4 NMS - v1_14_R1: - runs-on: ubuntu-latest - steps: - - name: Set up JDK 13 # 1.14.4 can be built with Java 8 to Java 13 - uses: actions/setup-java@v3 - with: - distribution: 'adopt-hotspot' - java-version: '13' - - name: Cache 1.14.4 Maven package - id: cachePillage - uses: actions/cache@v3 - with: - path: ~/.m2/repository/org/bukkit/craftbukkit/1.14.4-R0.1-SNAPSHOT/ - key: ${{ runner.os }}-v1_14_R1 - restore-keys: ${{ runner.os }}-v1_14_R1 - - name: Cache Maven packages - id: cacheMain - uses: actions/cache@v3 - with: - path: ~/.m2 - key: ${{ runner.os }}-m2_v1_14_R1 - restore-keys: ${{ runner.os }}-m2_v1_14_R1 - - - name: Setup BuildTools - run: mkdir BuildTools && wget -O BuildTools/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar - - name: Check 1.14.4 - id: pillage - run: test -f ~/.m2/repository/org/bukkit/craftbukkit/1.14.4-R0.1-SNAPSHOT/craftbukkit-1.14.4-R0.1-SNAPSHOT.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT - - name: Build 1.14.4 - if: steps.pillage.outputs.sucess != 'true' - run: cd BuildTools && java -jar BuildTools.jar --rev 1.14.4 --compile craftbukkit - # Build 1.16.5 NMS v1_16_R3: runs-on: ubuntu-latest @@ -74,48 +41,6 @@ jobs: if: steps.nether.outputs.sucess != 'true' run: cd BuildTools && java -jar BuildTools.jar --rev 1.16.5 --compile craftbukkit - # Build 1.17.1 NMS - v1_17_R1: - runs-on: ubuntu-latest - steps: - - name: Set up JDK 17 # 1.17.1 can be built with Java 16 to Java 17 - uses: actions/setup-java@v3 - with: - distribution: 'temurin' - java-version: '17' - - name: Cache 1.17.1 Maven package - id: cacheGoats - uses: actions/cache@v3 - with: - path: | - ~/.m2/repository/org/spigotmc/spigot/1.17.1-R0.1-SNAPSHOT/ - ~/.m2/repository/org/spigotmc/spigot-parent/ - ~/.m2/repository/org/spigotmc/minecraft-server/ - key: ${{ runner.os }}-v1_17_R1 - restore-keys: ${{ runner.os }}-v1_17_R1 - - name: Cache Maven packages - id: cacheMain - uses: actions/cache@v3 - with: - path: ~/.m2 - key: ${{ runner.os }}-m2-v1_17_R1 - restore-keys: ${{ runner.os }}-m2-v1_17_R1 - - - name: Setup BuildTools - run: mkdir BuildTools && wget -O BuildTools/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar - - name: Check 1.17.1 Spigot - id: goats - run: test -f ~/.m2/repository/org/spigotmc/spigot/1.17.1-R0.1-SNAPSHOT/spigot-1.17.1-R0.1-SNAPSHOT.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT - - name: Check 1.17.1 Spigot (Mojang) - id: goatsMojang - run: test -f ~/.m2/repository/org/spigotmc/spigot/1.17.1-R0.1-SNAPSHOT/spigot-1.17.1-R0.1-SNAPSHOT-remapped-mojang.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT - - name: Check 1.17.1 Spigot (Obf) - id: goatsObf - run: test -f ~/.m2/repository/org/spigotmc/spigot/1.17.1-R0.1-SNAPSHOT/spigot-1.17.1-R0.1-SNAPSHOT-remapped-obf.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT - - name: Build 1.17.1 - if: steps.goats.outputs.sucess != 'true' || steps.goatsMojang.outputs.sucess != 'true' || steps.goatsObf.outputs.sucess != 'true' - run: cd BuildTools && java -jar BuildTools.jar --rev 1.17.1 --remapped - # Build 1.18.2 NMS v1_18_R2: runs-on: ubuntu-latest @@ -200,10 +125,52 @@ jobs: if: steps.wild.outputs.sucess != 'true' || steps.wildMojang.outputs.sucess != 'true' || steps.wildObf.outputs.sucess != 'true' run: cd BuildTools && java -jar BuildTools.jar --rev 1.19.4 --remapped + # Build 1.20 NMS + v1_20_R1: + runs-on: ubuntu-latest + steps: + - name: Set up JDK 17 # 1.20 can only be built with Java 17 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' + - name: Cache 1.20 Maven package + id: cacheWild_r2 + uses: actions/cache@v3 + with: + path: | + ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/ + ~/.m2/repository/org/spigotmc/spigot-parent/ + ~/.m2/repository/org/spigotmc/minecraft-server/ + key: ${{ runner.os }}-v1_20_R1 + restore-keys: ${{ runner.os }}-v1_20_R1 + - name: Cache Maven packages + id: cacheMain + uses: actions/cache@v3 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-v1_20_R1 + restore-keys: ${{ runner.os }}-m2-v1_20_R1 + + - name: Setup BuildTools + run: mkdir BuildTools && wget -O BuildTools/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar + - name: Check 1.20 Spigot + id: wild + run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/spigot-1.20-R0.1-SNAPSHOT.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT + - name: Check 1.20 Spigot (Mojang) + id: wildMojang + run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/spigot-1.20-R0.1-SNAPSHOT-remapped-mojang.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT + - name: Check 1.20 Spigot (Obf) + id: wildObf + run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/spigot-1.20-R0.1-SNAPSHOT-remapped-obf.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT + - name: Build 1.20 + if: steps.wild.outputs.sucess != 'true' || steps.wildMojang.outputs.sucess != 'true' || steps.wildObf.outputs.sucess != 'true' + run: cd BuildTools && java -jar BuildTools.jar --rev 1.20 --remapped + # Build Movecraft build: runs-on: ubuntu-latest - needs: [v1_14_R1, v1_16_R3, v1_17_R1, v1_18_R2, v1_19_R3] + needs: [v1_16_R3, v1_18_R2, v1_19_R3, v1_20_R1] steps: - name: Checkout Movecraft @@ -219,27 +186,12 @@ jobs: path: ~/.m2 key: ${{ runner.os }}-m2 restore-keys: ${{ runner.os }}-m2 - - name: Cache 1.14.4 Maven package - uses: actions/cache@v3 - with: - path: ~/.m2/repository/org/bukkit/craftbukkit/1.14.4-R0.1-SNAPSHOT/ - key: ${{ runner.os }}-v1_14_R1 - restore-keys: ${{ runner.os }}-v1_14_R1 - name: Cache 1.16.5 Maven package uses: actions/cache@v3 with: path: ~/.m2/repository/org/bukkit/craftbukkit/1.16.5-R0.1-SNAPSHOT/ key: ${{ runner.os }}-v1_16_R3 restore-keys: ${{ runner.os }}-v1_16_R3 - - name: Cache 1.17.1 Maven package - uses: actions/cache@v3 - with: - path: | - ~/.m2/repository/org/spigotmc/spigot/1.17.1-R0.1-SNAPSHOT/ - ~/.m2/repository/org/spigotmc/spigot-parent/ - ~/.m2/repository/org/spigotmc/minecraft-server/ - key: ${{ runner.os }}-v1_17_R1 - restore-keys: ${{ runner.os }}-v1_17_R1 - name: Cache 1.18.2 Maven package uses: actions/cache@v3 with: @@ -258,6 +210,15 @@ jobs: ~/.m2/repository/org/spigotmc/minecraft-server/ key: ${{ runner.os }}-v1_19_R3 restore-keys: ${{ runner.os }}-v1_19_R3 + - name: Cache 1.20 Maven package + uses: actions/cache@v3 + with: + path: | + ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/ + ~/.m2/repository/org/spigotmc/spigot-parent/ + ~/.m2/repository/org/spigotmc/minecraft-server/ + key: ${{ runner.os }}-v1_20_R1 + restore-keys: ${{ runner.os }}-v1_20_R1 - name: Build with Maven run: mvn -T 1C -B package --file pom.xml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 66ee9f7a8..d5ca922e1 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -6,39 +6,6 @@ on: types: [created, prereleased] jobs: - # Build 1.14.4 NMS - v1_14_R1: - runs-on: ubuntu-latest - steps: - - name: Set up JDK 13 # 1.14.4 can be built with Java 8 to Java 13 - uses: actions/setup-java@v3 - with: - distribution: 'adopt-hotspot' - java-version: '13' - - name: Cache 1.14.4 Maven package - id: cachePillage - uses: actions/cache@v3 - with: - path: ~/.m2/repository/org/bukkit/craftbukkit/1.14.4-R0.1-SNAPSHOT/ - key: ${{ runner.os }}-v1_14_R1 - restore-keys: ${{ runner.os }}-v1_14_R1 - - name: Cache Maven packages - id: cacheMain - uses: actions/cache@v3 - with: - path: ~/.m2 - key: ${{ runner.os }}-m2_v1_14_R1 - restore-keys: ${{ runner.os }}-m2_v1_14_R1 - - - name: Setup BuildTools - run: mkdir BuildTools && wget -O BuildTools/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar - - name: Check 1.14.4 - id: pillage - run: test -f ~/.m2/repository/org/bukkit/craftbukkit/1.14.4-R0.1-SNAPSHOT/craftbukkit-1.14.4-R0.1-SNAPSHOT.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT - - name: Build 1.14.4 - if: steps.pillage.outputs.sucess != 'true' - run: cd BuildTools && java -jar BuildTools.jar --rev 1.14.4 --compile craftbukkit - # Build 1.16.5 NMS v1_16_R3: runs-on: ubuntu-latest @@ -72,48 +39,6 @@ jobs: if: steps.nether.outputs.sucess != 'true' run: cd BuildTools && java -jar BuildTools.jar --rev 1.16.5 --compile craftbukkit - # Build 1.17.1 NMS - v1_17_R1: - runs-on: ubuntu-latest - steps: - - name: Set up JDK 17 # 1.17.1 can be built with Java 16 to Java 17 - uses: actions/setup-java@v3 - with: - distribution: 'temurin' - java-version: '17' - - name: Cache 1.17.1 Maven package - id: cacheGoats - uses: actions/cache@v3 - with: - path: | - ~/.m2/repository/org/spigotmc/spigot/1.17.1-R0.1-SNAPSHOT/ - ~/.m2/repository/org/spigotmc/spigot-parent/ - ~/.m2/repository/org/spigotmc/minecraft-server/ - key: ${{ runner.os }}-v1_17_R1 - restore-keys: ${{ runner.os }}-v1_17_R1 - - name: Cache Maven packages - id: cacheMain - uses: actions/cache@v3 - with: - path: ~/.m2 - key: ${{ runner.os }}-m2-v1_17_R1 - restore-keys: ${{ runner.os }}-m2-v1_17_R1 - - - name: Setup BuildTools - run: mkdir BuildTools && wget -O BuildTools/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar - - name: Check 1.17.1 Spigot - id: goats - run: test -f ~/.m2/repository/org/spigotmc/spigot/1.17.1-R0.1-SNAPSHOT/spigot-1.17.1-R0.1-SNAPSHOT.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT - - name: Check 1.17.1 Spigot (Mojang) - id: goatsMojang - run: test -f ~/.m2/repository/org/spigotmc/spigot/1.17.1-R0.1-SNAPSHOT/spigot-1.17.1-R0.1-SNAPSHOT-remapped-mojang.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT - - name: Check 1.17.1 Spigot (Obf) - id: goatsObf - run: test -f ~/.m2/repository/org/spigotmc/spigot/1.17.1-R0.1-SNAPSHOT/spigot-1.17.1-R0.1-SNAPSHOT-remapped-obf.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT - - name: Build 1.17.1 - if: steps.goats.outputs.sucess != 'true' || steps.goatsMojang.outputs.sucess != 'true' || steps.goatsObf.outputs.sucess != 'true' - run: cd BuildTools && java -jar BuildTools.jar --rev 1.17.1 --remapped - # Build 1.18.2 NMS v1_18_R2: runs-on: ubuntu-latest @@ -198,10 +123,52 @@ jobs: if: steps.wild.outputs.sucess != 'true' || steps.wildMojang.outputs.sucess != 'true' || steps.wildObf.outputs.sucess != 'true' run: cd BuildTools && java -jar BuildTools.jar --rev 1.19.4 --remapped + # Build 1.20 NMS + v1_20_R1: + runs-on: ubuntu-latest + steps: + - name: Set up JDK 17 # 1.20 can only be built with Java 17 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' + - name: Cache 1.20 Maven package + id: cacheWild_r2 + uses: actions/cache@v3 + with: + path: | + ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/ + ~/.m2/repository/org/spigotmc/spigot-parent/ + ~/.m2/repository/org/spigotmc/minecraft-server/ + key: ${{ runner.os }}-v1_20_R1 + restore-keys: ${{ runner.os }}-v1_20_R1 + - name: Cache Maven packages + id: cacheMain + uses: actions/cache@v3 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-v1_20_R1 + restore-keys: ${{ runner.os }}-m2-v1_20_R1 + + - name: Setup BuildTools + run: mkdir BuildTools && wget -O BuildTools/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar + - name: Check 1.20 Spigot + id: wild + run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/spigot-1.20-R0.1-SNAPSHOT.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT + - name: Check 1.20 Spigot (Mojang) + id: wildMojang + run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/spigot-1.20-R0.1-SNAPSHOT-remapped-mojang.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT + - name: Check 1.20 Spigot (Obf) + id: wildObf + run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/spigot-1.20-R0.1-SNAPSHOT-remapped-obf.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT + - name: Build 1.20 + if: steps.wild.outputs.sucess != 'true' || steps.wildMojang.outputs.sucess != 'true' || steps.wildObf.outputs.sucess != 'true' + run: cd BuildTools && java -jar BuildTools.jar --rev 1.20 --remapped + # Build Movecraft build: runs-on: ubuntu-latest - needs: [v1_14_R1, v1_16_R3, v1_17_R1, v1_18_R2, v1_19_R3] + needs: [v1_16_R3, v1_18_R2, v1_19_R3, v1_20_R1] steps: - name: Checkout Movecraft @@ -217,27 +184,12 @@ jobs: path: ~/.m2 key: ${{ runner.os }}-m2 restore-keys: ${{ runner.os }}-m2 - - name: Cache 1.14.4 Maven package - uses: actions/cache@v3 - with: - path: ~/.m2/repository/org/bukkit/craftbukkit/1.14.4-R0.1-SNAPSHOT/ - key: ${{ runner.os }}-v1_14_R1 - restore-keys: ${{ runner.os }}-v1_14_R1 - name: Cache 1.16.5 Maven package uses: actions/cache@v3 with: path: ~/.m2/repository/org/bukkit/craftbukkit/1.16.5-R0.1-SNAPSHOT/ key: ${{ runner.os }}-v1_16_R3 restore-keys: ${{ runner.os }}-v1_16_R3 - - name: Cache 1.17.1 Maven package - uses: actions/cache@v3 - with: - path: | - ~/.m2/repository/org/spigotmc/spigot/1.17.1-R0.1-SNAPSHOT/ - ~/.m2/repository/org/spigotmc/spigot-parent/ - ~/.m2/repository/org/spigotmc/minecraft-server/ - key: ${{ runner.os }}-v1_17_R1 - restore-keys: ${{ runner.os }}-v1_17_R1 - name: Cache 1.18.2 Maven package uses: actions/cache@v3 with: @@ -256,6 +208,15 @@ jobs: ~/.m2/repository/org/spigotmc/minecraft-server/ key: ${{ runner.os }}-v1_19_R3 restore-keys: ${{ runner.os }}-v1_19_R3 + - name: Cache 1.20 Maven package + uses: actions/cache@v3 + with: + path: | + ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/ + ~/.m2/repository/org/spigotmc/spigot-parent/ + ~/.m2/repository/org/spigotmc/minecraft-server/ + key: ${{ runner.os }}-v1_20_R1 + restore-keys: ${{ runner.os }}-v1_20_R1 - name: Build with Maven run: mvn -T 1C -B package --file pom.xml From 52939fa9cd4785aee88c021c846429a4cca7ed83 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Wed, 7 Jun 2023 15:56:03 -0500 Subject: [PATCH 10/17] Update readme and setup script --- README.md | 3 +-- setup.sh | 21 +++++++-------------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 460691203..d24223e76 100644 --- a/README.md +++ b/README.md @@ -27,11 +27,10 @@ Please check the [Wiki](https://github.com/APDevTeam/Movecraft/wiki) and [FAQ](h Movecraft uses multiple versions of the Spigot server software for legacy support. As such, you need to run [BuildTools](https://www.spigotmc.org/wiki/buildtools/) for several versions before building the plugin. It doesn't matter where you do this, but inside the Movecraft directory is probably a bad place. We recommend building Spigot 1.14.4 & 1.16.5 with Java 13 and Java 17 to build 1.17.1, 1.18.2 & 1.19.2. Alternatively, you can use GitHub codespaces and run the `setup.sh` script to build all the needed versions automatically. ``` -java -jar BuildTools.jar --rev 1.14.4 --compile craftbukkit java -jar BuildTools.jar --rev 1.16.5 --compile craftbukkit -java -jar BuildTools.jar --rev 1.17.1 --remapped java -jar BuildTools.jar --rev 1.18.2 --remapped java -jar BuildTools.jar --rev 1.19.4 --remapped +java -jar BuildTools.jar --rev 1.20 --remapped ``` Once you have compiled CraftBukkit, it should continue to exist in your local maven repository, and thus you should need to compile each version at most one time. Once complete, run the following to build Movecraft through `maven`. diff --git a/setup.sh b/setup.sh index 8fef79c6b..85adb6c0d 100755 --- a/setup.sh +++ b/setup.sh @@ -26,13 +26,6 @@ else wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar fi -# Build 1.14.4 -if [ -f ~/.m2/repository/org/bukkit/craftbukkit/1.14.4-R0.1-SNAPSHOT/craftbukkit-1.14.4-R0.1-SNAPSHOT.jar ]; then - echo "1.14.4 already exists, skipping build" -else - /usr/lib/jvm/temurin-11-jdk-amd64/bin/java -jar BuildTools.jar --rev 1.14.4 --compile craftbukkit -fi - # Build 1.16.5 if [ -f ~/.m2/repository/org/bukkit/craftbukkit/1.16.5-R0.1-SNAPSHOT/craftbukkit-1.16.5-R0.1-SNAPSHOT.jar ]; then echo "1.16.5 already exists, skipping build" @@ -47,13 +40,6 @@ else java -jar BuildTools.jar --rev 1.18.2 --remapped fi -# Build 1.19.2 -if [ -f ~/.m2/repository/org/spigotmc/spigot/1.19.2-R0.1-SNAPSHOT/spigot-1.19.2-R0.1-SNAPSHOT.jar ]; then - echo "1.19.2 already exists, skipping build" -else - java -jar BuildTools.jar --rev 1.19.2 --remapped -fi - # Build 1.19.4 if [ -f ~/.m2/repository/org/spigotmc/spigot/1.19.4-R0.1-SNAPSHOT/spigot-1.19.4-R0.1-SNAPSHOT.jar ]; then echo "1.19.4 already exists, skipping build" @@ -61,6 +47,13 @@ else java -jar BuildTools.jar --rev 1.19.4 --remapped fi +# Build 1.20 +if [ -f ~/.m2/repository/org/spigotmc/spigot/1.19.4-R0.1-SNAPSHOT/spigot-1.20-R0.1-SNAPSHOT.jar ]; then + echo "1.20 already exists, skipping build" +else + java -jar BuildTools.jar --rev 1.20 --remapped +fi + # Restore git information git config --global user.name "$git_name" git config --global user.email "$git_email" From d1c9ee7abf621e4e8ef8851528b95e88e8fb97cf Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Wed, 7 Jun 2023 15:58:57 -0500 Subject: [PATCH 11/17] Fix filter --- modules/Movecraft/pom.xml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/modules/Movecraft/pom.xml b/modules/Movecraft/pom.xml index b6eada194..3cee2145d 100644 --- a/modules/Movecraft/pom.xml +++ b/modules/Movecraft/pom.xml @@ -171,12 +171,6 @@ true false - - net.countercraft:movecraft-v1_14_r1 - - ** - - net.countercraft:movecraft-v1_16_r3 @@ -184,19 +178,19 @@ - net.countercraft:movecraft-v1_17_r1 + net.countercraft:movecraft-v1_18_r2 ** - net.countercraft:movecraft-v1_18_r2 + net.countercraft:movecraft-v1_19_r3 ** - net.countercraft:movecraft-v1_19_r3 + net.countercraft:movecraft-v1_20_r1 ** From e62c68cc95a1d65c4682691e56b58ea697a49e87 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Wed, 7 Jun 2023 16:28:04 -0500 Subject: [PATCH 12/17] Update mappings link --- modules/v1_20_R1/pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/v1_20_R1/pom.xml b/modules/v1_20_R1/pom.xml index aef01aac3..3891477fa 100644 --- a/modules/v1_20_R1/pom.xml +++ b/modules/v1_20_R1/pom.xml @@ -20,8 +20,7 @@ 1.20-R0.1-SNAPSHOT remapped-mojang provided - - + net.countercraft From 517fff7570b99946bc82652893352eb38cd69d40 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Wed, 7 Jun 2023 16:28:39 -0500 Subject: [PATCH 13/17] Update publish.yml --- .github/workflows/publish.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d5ca922e1..562fc9fcf 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -208,15 +208,15 @@ jobs: ~/.m2/repository/org/spigotmc/minecraft-server/ key: ${{ runner.os }}-v1_19_R3 restore-keys: ${{ runner.os }}-v1_19_R3 - - name: Cache 1.20 Maven package - uses: actions/cache@v3 - with: - path: | - ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/ - ~/.m2/repository/org/spigotmc/spigot-parent/ - ~/.m2/repository/org/spigotmc/minecraft-server/ - key: ${{ runner.os }}-v1_20_R1 - restore-keys: ${{ runner.os }}-v1_20_R1 + - name: Cache 1.20 Maven package + uses: actions/cache@v3 + with: + path: | + ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/ + ~/.m2/repository/org/spigotmc/spigot-parent/ + ~/.m2/repository/org/spigotmc/minecraft-server/ + key: ${{ runner.os }}-v1_20_R1 + restore-keys: ${{ runner.os }}-v1_20_R1 - name: Build with Maven run: mvn -T 1C -B package --file pom.xml From 71f4ba11c870de824e2a229f761f749edb01900e Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Wed, 7 Jun 2023 16:42:24 -0500 Subject: [PATCH 14/17] Re-add mappings number check --- .../countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java index be8d44e1f..6abda1dcd 100644 --- a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java @@ -53,8 +53,8 @@ public class IWorldHandler extends WorldHandler { public IWorldHandler() { String mappings = ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion(); - // if (!mappings.equals("TBD")) - // throw new IllegalStateException("Movecraft is not compatible with this version of Minecraft 1.20: " + mappings); + if (!mappings.equals("34f399b4f2033891290b7f0700e9e47b")) + throw new IllegalStateException("Movecraft is not compatible with this version of Minecraft 1.20: " + mappings); } @Override From 56625647b017824f5a8567045a511ed93ed8639d Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Wed, 7 Jun 2023 16:56:54 -0500 Subject: [PATCH 15/17] Update various mentions to 1.14, upgrade API to 1.16 --- README.md | 2 +- modules/Movecraft/src/main/resources/plugin.yml | 2 +- modules/api/pom.xml | 2 +- .../movecraft/support/v1_16_R3/ISmoothTeleport.java | 2 +- .../countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java | 1 + 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d24223e76..0a27adbdb 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Please check the [Wiki](https://github.com/APDevTeam/Movecraft/wiki) and [FAQ](h [Discord](http://bit.ly/JoinAP-Dev) ## Development Environment -Movecraft uses multiple versions of the Spigot server software for legacy support. As such, you need to run [BuildTools](https://www.spigotmc.org/wiki/buildtools/) for several versions before building the plugin. It doesn't matter where you do this, but inside the Movecraft directory is probably a bad place. We recommend building Spigot 1.14.4 & 1.16.5 with Java 13 and Java 17 to build 1.17.1, 1.18.2 & 1.19.2. Alternatively, you can use GitHub codespaces and run the `setup.sh` script to build all the needed versions automatically. +Movecraft uses multiple versions of the Spigot server software for legacy support. As such, you need to run [BuildTools](https://www.spigotmc.org/wiki/buildtools/) for several versions before building the plugin. It doesn't matter where you do this, but inside the Movecraft directory is probably a bad place. We recommend building Spigot 1.16.5 with Java 13 and Java 17 to build 1.18.2, 1.19.4 & 1.20. Alternatively, you can use GitHub codespaces and run the `setup.sh` script to build all the needed versions automatically. ``` java -jar BuildTools.jar --rev 1.16.5 --compile craftbukkit diff --git a/modules/Movecraft/src/main/resources/plugin.yml b/modules/Movecraft/src/main/resources/plugin.yml index 131144fb0..c51443948 100644 --- a/modules/Movecraft/src/main/resources/plugin.yml +++ b/modules/Movecraft/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: Movecraft version: ${project.version} -api-version: 1.14 +api-version: 1.16 description: The original flight and movement plugin for minecraft. authors: [cccm5, BaccaYarro, TylerS1066, eirik1996, drfiveminusmint, HumorousFool] website: https://github.com/APDevTeam/Movecraft diff --git a/modules/api/pom.xml b/modules/api/pom.xml index 7e4cc9fe1..fe86c9dca 100644 --- a/modules/api/pom.xml +++ b/modules/api/pom.xml @@ -41,7 +41,7 @@ org.spigotmc spigot-api - 1.14.4-R0.1-SNAPSHOT + 1.16.5-R0.1-SNAPSHOT org.jetbrains diff --git a/modules/v1_16_R3/src/main/java/net/countercraft/movecraft/support/v1_16_R3/ISmoothTeleport.java b/modules/v1_16_R3/src/main/java/net/countercraft/movecraft/support/v1_16_R3/ISmoothTeleport.java index ef6e4d848..a77596dc9 100644 --- a/modules/v1_16_R3/src/main/java/net/countercraft/movecraft/support/v1_16_R3/ISmoothTeleport.java +++ b/modules/v1_16_R3/src/main/java/net/countercraft/movecraft/support/v1_16_R3/ISmoothTeleport.java @@ -15,7 +15,7 @@ /** * Code taken with permission from MicleBrick * https://www.spigotmc.org/threads/teleport-player-smoothly.317416/ - * Used for 1.14.4 to 1.16.5 + * Used for 1.16.5 */ public class ISmoothTeleport extends SmoothTeleport { private final Set teleportFlags; diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java index 6abda1dcd..eba40d476 100644 --- a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java @@ -22,6 +22,7 @@ import net.minecraft.world.ticks.ScheduledTick; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.Sign; import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; import org.bukkit.craftbukkit.v1_20_R1.block.data.CraftBlockData; From 713a7fcfbb79b2c178f86eb8f14a50797bdfa84a Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Wed, 14 Jun 2023 16:57:23 -0500 Subject: [PATCH 16/17] Update for 1.20.1 --- .github/workflows/maven.yml | 28 +++++++++---------- .github/workflows/publish.yml | 28 +++++++++---------- README.md | 4 +-- modules/v1_20_R1/pom.xml | 12 ++++---- .../compat/v1_20_R1/IWorldHandler.java | 2 +- .../support/v1_20_R1/ISmoothTeleport.java | 2 +- setup.sh | 8 +++--- 7 files changed, 42 insertions(+), 42 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index b17355e58..ffdc23aba 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -125,21 +125,21 @@ jobs: if: steps.wild.outputs.sucess != 'true' || steps.wildMojang.outputs.sucess != 'true' || steps.wildObf.outputs.sucess != 'true' run: cd BuildTools && java -jar BuildTools.jar --rev 1.19.4 --remapped - # Build 1.20 NMS + # Build 1.20.1 NMS v1_20_R1: runs-on: ubuntu-latest steps: - - name: Set up JDK 17 # 1.20 can only be built with Java 17 + - name: Set up JDK 17 # 1.20.1 can only be built with Java 17 uses: actions/setup-java@v3 with: distribution: 'temurin' java-version: '17' - - name: Cache 1.20 Maven package + - name: Cache 1.20.1 Maven package id: cacheWild_r2 uses: actions/cache@v3 with: path: | - ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/ + ~/.m2/repository/org/spigotmc/spigot/1.20.1-R0.1-SNAPSHOT/ ~/.m2/repository/org/spigotmc/spigot-parent/ ~/.m2/repository/org/spigotmc/minecraft-server/ key: ${{ runner.os }}-v1_20_R1 @@ -154,18 +154,18 @@ jobs: - name: Setup BuildTools run: mkdir BuildTools && wget -O BuildTools/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar - - name: Check 1.20 Spigot + - name: Check 1.20.1 Spigot id: wild - run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/spigot-1.20-R0.1-SNAPSHOT.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT - - name: Check 1.20 Spigot (Mojang) + run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20.1-R0.1-SNAPSHOT/spigot-1.20.1-R0.1-SNAPSHOT.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT + - name: Check 1.20.1 Spigot (Mojang) id: wildMojang - run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/spigot-1.20-R0.1-SNAPSHOT-remapped-mojang.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT - - name: Check 1.20 Spigot (Obf) + run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20.1-R0.1-SNAPSHOT/spigot-1.20.1-R0.1-SNAPSHOT-remapped-mojang.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT + - name: Check 1.20.1 Spigot (Obf) id: wildObf - run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/spigot-1.20-R0.1-SNAPSHOT-remapped-obf.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT - - name: Build 1.20 + run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20.1-R0.1-SNAPSHOT/spigot-1.20.1-R0.1-SNAPSHOT-remapped-obf.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT + - name: Build 1.20.1 if: steps.wild.outputs.sucess != 'true' || steps.wildMojang.outputs.sucess != 'true' || steps.wildObf.outputs.sucess != 'true' - run: cd BuildTools && java -jar BuildTools.jar --rev 1.20 --remapped + run: cd BuildTools && java -jar BuildTools.jar --rev 1.20.1 --remapped # Build Movecraft build: @@ -210,11 +210,11 @@ jobs: ~/.m2/repository/org/spigotmc/minecraft-server/ key: ${{ runner.os }}-v1_19_R3 restore-keys: ${{ runner.os }}-v1_19_R3 - - name: Cache 1.20 Maven package + - name: Cache 1.20.1 Maven package uses: actions/cache@v3 with: path: | - ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/ + ~/.m2/repository/org/spigotmc/spigot/1.20.1-R0.1-SNAPSHOT/ ~/.m2/repository/org/spigotmc/spigot-parent/ ~/.m2/repository/org/spigotmc/minecraft-server/ key: ${{ runner.os }}-v1_20_R1 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 562fc9fcf..fadb71241 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -123,21 +123,21 @@ jobs: if: steps.wild.outputs.sucess != 'true' || steps.wildMojang.outputs.sucess != 'true' || steps.wildObf.outputs.sucess != 'true' run: cd BuildTools && java -jar BuildTools.jar --rev 1.19.4 --remapped - # Build 1.20 NMS + # Build 1.20.1 NMS v1_20_R1: runs-on: ubuntu-latest steps: - - name: Set up JDK 17 # 1.20 can only be built with Java 17 + - name: Set up JDK 17 # 1.20.1 can only be built with Java 17 uses: actions/setup-java@v3 with: distribution: 'temurin' java-version: '17' - - name: Cache 1.20 Maven package + - name: Cache 1.20.1 Maven package id: cacheWild_r2 uses: actions/cache@v3 with: path: | - ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/ + ~/.m2/repository/org/spigotmc/spigot/1.20.1-R0.1-SNAPSHOT/ ~/.m2/repository/org/spigotmc/spigot-parent/ ~/.m2/repository/org/spigotmc/minecraft-server/ key: ${{ runner.os }}-v1_20_R1 @@ -152,18 +152,18 @@ jobs: - name: Setup BuildTools run: mkdir BuildTools && wget -O BuildTools/BuildTools.jar https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar - - name: Check 1.20 Spigot + - name: Check 1.20.1 Spigot id: wild - run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/spigot-1.20-R0.1-SNAPSHOT.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT - - name: Check 1.20 Spigot (Mojang) + run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20.1-R0.1-SNAPSHOT/spigot-1.20.1-R0.1-SNAPSHOT.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT + - name: Check 1.20.1 Spigot (Mojang) id: wildMojang - run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/spigot-1.20-R0.1-SNAPSHOT-remapped-mojang.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT - - name: Check 1.20 Spigot (Obf) + run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20.1-R0.1-SNAPSHOT/spigot-1.20.1-R0.1-SNAPSHOT-remapped-mojang.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT + - name: Check 1.20.1 Spigot (Obf) id: wildObf - run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/spigot-1.20-R0.1-SNAPSHOT-remapped-obf.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT - - name: Build 1.20 + run: test -f ~/.m2/repository/org/spigotmc/spigot/1.20.1-R0.1-SNAPSHOT/spigot-1.20.1-R0.1-SNAPSHOT-remapped-obf.jar && echo "sucess=true" >> $GITHUB_OUTPUT || echo "sucess=false" >> $GITHUB_OUTPUT + - name: Build 1.20.1 if: steps.wild.outputs.sucess != 'true' || steps.wildMojang.outputs.sucess != 'true' || steps.wildObf.outputs.sucess != 'true' - run: cd BuildTools && java -jar BuildTools.jar --rev 1.20 --remapped + run: cd BuildTools && java -jar BuildTools.jar --rev 1.20.1 --remapped # Build Movecraft build: @@ -208,11 +208,11 @@ jobs: ~/.m2/repository/org/spigotmc/minecraft-server/ key: ${{ runner.os }}-v1_19_R3 restore-keys: ${{ runner.os }}-v1_19_R3 - - name: Cache 1.20 Maven package + - name: Cache 1.20.1 Maven package uses: actions/cache@v3 with: path: | - ~/.m2/repository/org/spigotmc/spigot/1.20-R0.1-SNAPSHOT/ + ~/.m2/repository/org/spigotmc/spigot/1.20.1-R0.1-SNAPSHOT/ ~/.m2/repository/org/spigotmc/spigot-parent/ ~/.m2/repository/org/spigotmc/minecraft-server/ key: ${{ runner.os }}-v1_20_R1 diff --git a/README.md b/README.md index 0a27adbdb..57e3592be 100644 --- a/README.md +++ b/README.md @@ -24,13 +24,13 @@ Please check the [Wiki](https://github.com/APDevTeam/Movecraft/wiki) and [FAQ](h [Discord](http://bit.ly/JoinAP-Dev) ## Development Environment -Movecraft uses multiple versions of the Spigot server software for legacy support. As such, you need to run [BuildTools](https://www.spigotmc.org/wiki/buildtools/) for several versions before building the plugin. It doesn't matter where you do this, but inside the Movecraft directory is probably a bad place. We recommend building Spigot 1.16.5 with Java 13 and Java 17 to build 1.18.2, 1.19.4 & 1.20. Alternatively, you can use GitHub codespaces and run the `setup.sh` script to build all the needed versions automatically. +Movecraft uses multiple versions of the Spigot server software for legacy support. As such, you need to run [BuildTools](https://www.spigotmc.org/wiki/buildtools/) for several versions before building the plugin. It doesn't matter where you do this, but inside the Movecraft directory is probably a bad place. We recommend building Spigot 1.16.5 with Java 13 and Java 17 to build 1.18.2, 1.19.4 & 1.20.1. Alternatively, you can use GitHub codespaces and run the `setup.sh` script to build all the needed versions automatically. ``` java -jar BuildTools.jar --rev 1.16.5 --compile craftbukkit java -jar BuildTools.jar --rev 1.18.2 --remapped java -jar BuildTools.jar --rev 1.19.4 --remapped -java -jar BuildTools.jar --rev 1.20 --remapped +java -jar BuildTools.jar --rev 1.20.1 --remapped ``` Once you have compiled CraftBukkit, it should continue to exist in your local maven repository, and thus you should need to compile each version at most one time. Once complete, run the following to build Movecraft through `maven`. diff --git a/modules/v1_20_R1/pom.xml b/modules/v1_20_R1/pom.xml index 3891477fa..9fa32a465 100644 --- a/modules/v1_20_R1/pom.xml +++ b/modules/v1_20_R1/pom.xml @@ -17,10 +17,10 @@ org.spigotmc spigot - 1.20-R0.1-SNAPSHOT + 1.20.1-R0.1-SNAPSHOT remapped-mojang provided - + net.countercraft @@ -68,9 +68,9 @@ remap-obf - org.spigotmc:minecraft-server:1.20-R0.1-SNAPSHOT:txt:maps-mojang + org.spigotmc:minecraft-server:1.20.1-R0.1-SNAPSHOT:txt:maps-mojang true - org.spigotmc:spigot:1.20-R0.1-SNAPSHOT:jar:remapped-mojang + org.spigotmc:spigot:1.20.1-R0.1-SNAPSHOT:jar:remapped-mojang true remapped-obf @@ -83,8 +83,8 @@ remap-spigot ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - org.spigotmc:minecraft-server:1.20-R0.1-SNAPSHOT:csrg:maps-spigot - org.spigotmc:spigot:1.20-R0.1-SNAPSHOT:jar:remapped-obf + org.spigotmc:minecraft-server:1.20.1-R0.1-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.20.1-R0.1-SNAPSHOT:jar:remapped-obf diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java index eba40d476..c870ffa06 100644 --- a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/compat/v1_20_R1/IWorldHandler.java @@ -54,7 +54,7 @@ public class IWorldHandler extends WorldHandler { public IWorldHandler() { String mappings = ((CraftMagicNumbers) CraftMagicNumbers.INSTANCE).getMappingsVersion(); - if (!mappings.equals("34f399b4f2033891290b7f0700e9e47b")) + if (!mappings.equals("bcf3dcb22ad42792794079f9443df2c0")) throw new IllegalStateException("Movecraft is not compatible with this version of Minecraft 1.20: " + mappings); } diff --git a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/ISmoothTeleport.java b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/ISmoothTeleport.java index 4b35386ce..e3c120f23 100644 --- a/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/ISmoothTeleport.java +++ b/modules/v1_20_R1/src/main/java/net/countercraft/movecraft/support/v1_20_R1/ISmoothTeleport.java @@ -15,7 +15,7 @@ /** * Code derived from code taken with permission from MicleBrick * https://www.spigotmc.org/threads/teleport-player-smoothly.317416/ - * Used for 1.20 + * Used for 1.20.1 */ public class ISmoothTeleport extends SmoothTeleport { private final Set teleportFlags; diff --git a/setup.sh b/setup.sh index 85adb6c0d..b58878ee2 100755 --- a/setup.sh +++ b/setup.sh @@ -47,11 +47,11 @@ else java -jar BuildTools.jar --rev 1.19.4 --remapped fi -# Build 1.20 -if [ -f ~/.m2/repository/org/spigotmc/spigot/1.19.4-R0.1-SNAPSHOT/spigot-1.20-R0.1-SNAPSHOT.jar ]; then - echo "1.20 already exists, skipping build" +# Build 1.20.1 +if [ -f ~/.m2/repository/org/spigotmc/spigot/1.20.1-R0.1-SNAPSHOT/spigot-1.20.1-R0.1-SNAPSHOT.jar ]; then + echo "1.20.1 already exists, skipping build" else - java -jar BuildTools.jar --rev 1.20 --remapped + java -jar BuildTools.jar --rev 1.20.1 --remapped fi # Restore git information From 59ad13c87d66278eecf1ef60a3085395ff636427 Mon Sep 17 00:00:00 2001 From: TylerS1066 Date: Wed, 14 Jun 2023 17:24:26 -0500 Subject: [PATCH 17/17] Try and fix hanging cruise and cruise on pilot signs --- .../java/net/countercraft/movecraft/sign/CraftSign.java | 7 +++---- .../java/net/countercraft/movecraft/sign/CruiseSign.java | 6 +++--- .../java/net/countercraft/movecraft/util/SignUtils.java | 6 +++--- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/modules/Movecraft/src/main/java/net/countercraft/movecraft/sign/CraftSign.java b/modules/Movecraft/src/main/java/net/countercraft/movecraft/sign/CraftSign.java index 8247c7984..7147e497d 100644 --- a/modules/Movecraft/src/main/java/net/countercraft/movecraft/sign/CraftSign.java +++ b/modules/Movecraft/src/main/java/net/countercraft/movecraft/sign/CraftSign.java @@ -16,14 +16,13 @@ import net.countercraft.movecraft.localisation.I18nSupport; import net.countercraft.movecraft.processing.functions.Result; import net.countercraft.movecraft.util.Pair; -import net.countercraft.movecraft.util.hitboxes.MutableHitBox; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.BlockState; import org.bukkit.block.Sign; -import org.bukkit.block.data.type.WallSign; +import org.bukkit.block.data.Directional; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -125,8 +124,8 @@ public void onSignClick(@NotNull PlayerInteractEvent event) { if (craft.getType().getBoolProperty(CraftType.CRUISE_ON_PILOT)) { // Setup cruise direction - if (sign.getBlockData() instanceof WallSign) - craft.setCruiseDirection(CruiseDirection.fromBlockFace(((WallSign) sign.getBlockData()).getFacing())); + if (sign.getBlockData() instanceof Directional) + craft.setCruiseDirection(CruiseDirection.fromBlockFace(((Directional) sign.getBlockData()).getFacing())); else craft.setCruiseDirection(CruiseDirection.NONE); diff --git a/modules/Movecraft/src/main/java/net/countercraft/movecraft/sign/CruiseSign.java b/modules/Movecraft/src/main/java/net/countercraft/movecraft/sign/CruiseSign.java index 16597a69f..3c0338131 100644 --- a/modules/Movecraft/src/main/java/net/countercraft/movecraft/sign/CruiseSign.java +++ b/modules/Movecraft/src/main/java/net/countercraft/movecraft/sign/CruiseSign.java @@ -13,7 +13,7 @@ import org.bukkit.World; import org.bukkit.block.BlockState; import org.bukkit.block.Sign; -import org.bukkit.block.data.type.WallSign; +import org.bukkit.block.data.Directional; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -59,13 +59,13 @@ public void onSignClick(@NotNull PlayerInteractEvent event) { Craft c = CraftManager.getInstance().getCraftByPlayer(event.getPlayer()); if (c == null || !c.getType().getBoolProperty(CraftType.CAN_CRUISE)) return; - if (!(sign.getBlockData() instanceof WallSign)) + if (!(sign.getBlockData() instanceof Directional)) return; sign.setLine(0, "Cruise: ON"); sign.update(true); - c.setCruiseDirection(CruiseDirection.fromBlockFace(((WallSign) sign.getBlockData()).getFacing())); + c.setCruiseDirection(CruiseDirection.fromBlockFace(((Directional) sign.getBlockData()).getFacing())); c.setLastCruiseUpdate(System.currentTimeMillis()); c.setCruising(true); c.resetSigns(sign); diff --git a/modules/Movecraft/src/main/java/net/countercraft/movecraft/util/SignUtils.java b/modules/Movecraft/src/main/java/net/countercraft/movecraft/util/SignUtils.java index 233552901..1c988dc88 100644 --- a/modules/Movecraft/src/main/java/net/countercraft/movecraft/util/SignUtils.java +++ b/modules/Movecraft/src/main/java/net/countercraft/movecraft/util/SignUtils.java @@ -3,7 +3,7 @@ import org.bukkit.block.BlockFace; import org.bukkit.block.Sign; import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.type.WallSign; +import org.bukkit.block.data.Directional; public class SignUtils { /** @@ -12,8 +12,8 @@ public class SignUtils { */ public static BlockFace getFacing(Sign sign) { BlockData blockData = sign.getBlockData(); - if(blockData instanceof WallSign){ - return ((WallSign) blockData).getFacing(); + if(blockData instanceof Directional){ + return ((Directional) blockData).getFacing(); } return BlockFace.SELF; }