Skip to content

Commit

Permalink
ItemTag.map_to_image (#2579)
Browse files Browse the repository at this point in the history
  • Loading branch information
tal5 committed Dec 18, 2023
1 parent f9800e1 commit 156ef7e
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 0 deletions.
Expand Up @@ -8,10 +8,12 @@
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.RecipeChoice;
import org.bukkit.inventory.ShapedRecipe;
import org.bukkit.map.MapView;

import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -79,4 +81,7 @@ public Map<NamespacedKey, BrewingRecipe> getCustomBrewingRecipes() {
throw new UnsupportedOperationException();
}

public byte[] renderMap(MapView mapView, Player player) {
throw new UnsupportedOperationException();
}
}
Expand Up @@ -19,6 +19,7 @@
import com.denizenscript.denizencore.flags.MapTagFlagTracker;
import com.denizenscript.denizencore.objects.*;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.core.ImageTag;
import com.denizenscript.denizencore.objects.core.ListTag;
import com.denizenscript.denizencore.objects.properties.Property;
import com.denizenscript.denizencore.objects.properties.PropertyParser;
Expand All @@ -42,7 +43,11 @@
import org.bukkit.inventory.meta.BlockStateMeta;
import org.bukkit.inventory.meta.Damageable;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.MapMeta;
import org.bukkit.map.MapPalette;
import org.bukkit.map.MapView;

import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
Expand Down Expand Up @@ -745,6 +750,36 @@ else if (container != null) {
tagProcessor.registerMechanism("material", true, MaterialTag.class, (object, mechanism, material) -> {
object.item.setType(material.getMaterial());
});

if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_20)) {

// <--[tag]
// @attribute <ItemTag.map_to_image[<player>]>
// @returns ImageTag
// @description
// Returns an image of a filled map item's contents.
// Must specify a player for the map to render for, as if that player is holding the map.
// Note that this does not include cursors, as their rendering is entirely client-side.
// -->
tagProcessor.registerTag(ImageTag.class, PlayerTag.class, "map_to_image", (attribute, object, input) -> {
if (!(object.getItemMeta() instanceof MapMeta mapMeta)) {
return null;
}
MapView mapView = mapMeta.getMapView();
if (mapView == null) {
attribute.echoError("Invalid map item: must have contents.");
return null;
}
byte[] data = NMSHandler.itemHelper.renderMap(mapView, input.getPlayerEntity());
BufferedImage image = new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB);
for (int x = 0; x < 128; x++) {
for (int y = 0; y < 128; y++) {
image.setRGB(x, y, MapPalette.getColor(data[y * 128 + x]).getRGB());
}
}
return new ImageTag(image);
});
}
}

public String formattedName() {
Expand Down
Expand Up @@ -49,15 +49,19 @@
import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData;
import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftInventoryPlayer;
import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack;
import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftRecipe;
import org.bukkit.craftbukkit.v1_20_R3.map.CraftMapView;
import org.bukkit.craftbukkit.v1_20_R3.util.CraftMagicNumbers;
import org.bukkit.craftbukkit.v1_20_R3.util.CraftNamespacedKey;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.RecipeChoice;
import org.bukkit.inventory.ShapedRecipe;
import org.bukkit.map.MapView;

import java.lang.reflect.Field;
import java.util.*;
Expand Down Expand Up @@ -515,4 +519,9 @@ public Map<NamespacedKey, BrewingRecipe> getCustomBrewingRecipes() {
}
return customBrewingRecipes;
}

@Override
public byte[] renderMap(MapView mapView, Player player) {
return ((CraftMapView) mapView).render((CraftPlayer) player).buffer;
}
}

0 comments on commit 156ef7e

Please sign in to comment.