package me.illusion.canvastest.canvas; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ClientboundMapItemDataPacket; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.decoration.ItemFrame; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.phys.Vec3; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_18_R1.map.CraftMapView; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.MapMeta; import org.bukkit.map.MapView; import java.util.ArrayList; public class CanvasFrame { private final Location location; private final MapView view; private final ItemFrame nmsFrame; private final int face; public CanvasFrame(Location location, MapView view) { this.location = location; this.view = view; this.face = getFace(location); nmsFrame = new ItemFrame(EntityType.ITEM_FRAME, getLevel(location)); nmsFrame.setPos(new Vec3(location.getX(), location.getY(), location.getZ())); nmsFrame.setItem(CraftItemStack.asNMSCopy(getMapItem())); } private ItemStack getMapItem() { ItemStack map = new ItemStack(Material.FILLED_MAP); MapMeta meta = (MapMeta) map.getItemMeta(); meta.setMapView(view); map.setItemMeta(meta); return map; } public void displayTo(Player player) { ClientboundAddEntityPacket spawnPacket = new ClientboundAddEntityPacket(nmsFrame, face); ClientboundSetEntityDataPacket metadataPacket = new ClientboundSetEntityDataPacket(nmsFrame.getId(), nmsFrame.getEntityData(), false); ClientboundMapItemDataPacket mapPacket = new ClientboundMapItemDataPacket(view.getId(), (byte) 3, false, new ArrayList<>(), new MapItemSavedData.MapPatch(0, 0, 128, 128, getColors(player))); ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); serverPlayer.connection.send(spawnPacket); serverPlayer.connection.send(metadataPacket); serverPlayer.connection.send(mapPacket); } private byte[] getColors(Player bukkitPlayer) { CraftMapView craftView = (CraftMapView) view; CraftPlayer craftPlayer = (CraftPlayer) bukkitPlayer; return craftView.render(craftPlayer).buffer; } // --- NMS --- private static ServerLevel getLevel(Location bukkitLocation) { return ((CraftWorld) bukkitLocation.getWorld()).getHandle(); } private static int getFace(Location bukkitLocation) { /* 0 = down 1 = up 2 = north 3 = south 4 = west 5 = east */ float yaw = bukkitLocation.getYaw(); if (yaw < 0) { yaw += 360; } if (yaw >= 45 && yaw < 135) { return 2; } else if (yaw >= 135 && yaw < 225) { return 3; } else if (yaw >= 225 && yaw < 315) { return 4; } else if (yaw >= 315 || yaw < 45) { return 5; } else { return 2; } } }