Skip to content

Commit

Permalink
Support blockdata in item meta (Closes #1343)
Browse files Browse the repository at this point in the history
  • Loading branch information
PseudoKnight committed Jan 9, 2023
1 parent 7fb7887 commit f534c4f
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 2 deletions.
10 changes: 10 additions & 0 deletions src/main/java/com/laytonsmith/abstraction/MCBlockDataMeta.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.laytonsmith.abstraction;

import com.laytonsmith.abstraction.blocks.MCBlockData;
import com.laytonsmith.abstraction.blocks.MCMaterial;

public interface MCBlockDataMeta extends MCItemMeta {
MCBlockData getBlockData(MCMaterial material);
boolean hasBlockData();
void setBlockData(MCBlockData blockData);
}
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@
import org.bukkit.inventory.StonecuttingRecipe;
import org.bukkit.inventory.meta.AxolotlBucketMeta;
import org.bukkit.inventory.meta.BannerMeta;
import org.bukkit.inventory.meta.BlockDataMeta;
import org.bukkit.inventory.meta.BlockStateMeta;
import org.bukkit.inventory.meta.BookMeta;
import org.bukkit.inventory.meta.BundleMeta;
Expand Down Expand Up @@ -610,6 +611,9 @@ public static MCItemMeta BukkitGetCorrectMeta(ItemMeta im) {
if(im instanceof SuspiciousStewMeta) {
return new BukkitMCSuspiciousStewMeta((SuspiciousStewMeta) im);
}
if(im instanceof BlockDataMeta) {
return new BukkitMCBlockDataMeta((BlockDataMeta) im);
}
if(Static.getServer().getMinecraftVersion().gte(MCVersion.MC1_17)) {
if(im instanceof BundleMeta) {
return new BukkitMCBundleMeta((BundleMeta) im);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.laytonsmith.abstraction.bukkit;

import com.laytonsmith.abstraction.MCBlockDataMeta;
import com.laytonsmith.abstraction.blocks.MCBlockData;
import com.laytonsmith.abstraction.blocks.MCMaterial;
import com.laytonsmith.abstraction.bukkit.blocks.BukkitMCBlockData;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.bukkit.inventory.meta.BlockDataMeta;

public class BukkitMCBlockDataMeta extends BukkitMCItemMeta implements MCBlockDataMeta {

BlockDataMeta bdm;

public BukkitMCBlockDataMeta(BlockDataMeta meta) {
super(meta);
this.bdm = meta;
}


@Override
public MCBlockData getBlockData(MCMaterial material) {
return new BukkitMCBlockData(this.bdm.getBlockData((Material) material.getHandle()));
}

@Override
public boolean hasBlockData() {
return this.bdm.hasBlockData();
}

@Override
public void setBlockData(MCBlockData blockData) {
this.bdm.setBlockData((BlockData) blockData.getHandle());
}
}
31 changes: 29 additions & 2 deletions src/main/java/com/laytonsmith/core/ObjectGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.laytonsmith.abstraction.MCAttributeModifier;
import com.laytonsmith.abstraction.MCAxolotlBucketMeta;
import com.laytonsmith.abstraction.MCBannerMeta;
import com.laytonsmith.abstraction.MCBlockDataMeta;
import com.laytonsmith.abstraction.MCBlockStateMeta;
import com.laytonsmith.abstraction.MCBookMeta;
import com.laytonsmith.abstraction.MCBrewerInventory;
Expand Down Expand Up @@ -556,6 +557,13 @@ public Construct itemMeta(MCItemStack is, Target t) {
}
ma.set("inventory", box, t);
}
} else if(meta instanceof MCBlockDataMeta) {
MCBlockDataMeta mcbdm = (MCBlockDataMeta) meta;
if(mcbdm.hasBlockData()) {
ma.set("blockdata", blockData(mcbdm.getBlockData(is.getType()), t), t);
} else {
ma.set("blockdata", CNull.NULL, t);
}
} else if(meta instanceof MCFireworkEffectMeta) {
MCFireworkEffectMeta mcfem = (MCFireworkEffectMeta) meta;
MCFireworkEffect effect = mcfem.getEffect();
Expand Down Expand Up @@ -998,6 +1006,14 @@ public MCItemMeta itemMeta(Mixed c, MCMaterial mat, Target t) throws ConfigRunti
}
}
}
} else if(meta instanceof MCBlockDataMeta) {
MCBlockDataMeta mcbdm = (MCBlockDataMeta) meta;
if(ma.containsKey("blockdata")) {
Mixed mBlockData = ma.get("blockdata", t);
if(mBlockData instanceof CArray) {
mcbdm.setBlockData(blockData((CArray) mBlockData, mat, t));
}
}
} else if(meta instanceof MCFireworkEffectMeta) {
MCFireworkEffectMeta femeta = (MCFireworkEffectMeta) meta;
if(ma.containsKey("effect")) {
Expand Down Expand Up @@ -2070,16 +2086,20 @@ public MCMaterial material(Mixed name, Target t) {
}

public MCBlockData blockData(CArray ca, Target t) {
return blockData(ca, null, t);
}

public MCBlockData blockData(CArray ca, MCMaterial blockType, Target t) {
StringBuilder b = new StringBuilder().append("[");
boolean first = true;
String block = null;
for(String key : ca.stringKeySet()) {
if(key.equals("block")) {
String block = ca.get("block", t).val();
block = ca.get("block", t).val();
if(Character.isUpperCase(block.charAt(0))) {
// support material enum input
block = block.toLowerCase();
}
b.insert(0, block);
} else {
if(first) {
first = false;
Expand All @@ -2090,6 +2110,13 @@ public MCBlockData blockData(CArray ca, Target t) {
}
}
b.append("]");
if(block == null) {
if(blockType == null) {
throw new CREFormatException("Missing block type for block data.", t);
}
block = blockType.name().toLowerCase();
}
b.insert(0, block);
return Static.getServer().createBlockData(b.toString());
}

Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/functionDocs/get_itemmeta
Original file line number Diff line number Diff line change
Expand Up @@ -127,4 +127,8 @@ Below are the available fields in the item meta array. Fields can be null when t
| AxolotlBucket
|
* '''variant''' : (string) The type of axolotl, one of ''%AXOLOTL_TYPES%''.
|-
| BlockData
|
* '''blockdata''' : (array) An array of blockdata (known as block states in vanilla) like is returned from get_blockdata(), or null if none.
|}

0 comments on commit f534c4f

Please sign in to comment.