Skip to content

Commit f534c4f

Browse files
committed
Support blockdata in item meta (Closes #1343)
1 parent 7fb7887 commit f534c4f

5 files changed

Lines changed: 82 additions & 2 deletions

File tree

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.laytonsmith.abstraction;
2+
3+
import com.laytonsmith.abstraction.blocks.MCBlockData;
4+
import com.laytonsmith.abstraction.blocks.MCMaterial;
5+
6+
public interface MCBlockDataMeta extends MCItemMeta {
7+
MCBlockData getBlockData(MCMaterial material);
8+
boolean hasBlockData();
9+
void setBlockData(MCBlockData blockData);
10+
}

src/main/java/com/laytonsmith/abstraction/bukkit/BukkitConvertor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@
150150
import org.bukkit.inventory.StonecuttingRecipe;
151151
import org.bukkit.inventory.meta.AxolotlBucketMeta;
152152
import org.bukkit.inventory.meta.BannerMeta;
153+
import org.bukkit.inventory.meta.BlockDataMeta;
153154
import org.bukkit.inventory.meta.BlockStateMeta;
154155
import org.bukkit.inventory.meta.BookMeta;
155156
import org.bukkit.inventory.meta.BundleMeta;
@@ -610,6 +611,9 @@ public static MCItemMeta BukkitGetCorrectMeta(ItemMeta im) {
610611
if(im instanceof SuspiciousStewMeta) {
611612
return new BukkitMCSuspiciousStewMeta((SuspiciousStewMeta) im);
612613
}
614+
if(im instanceof BlockDataMeta) {
615+
return new BukkitMCBlockDataMeta((BlockDataMeta) im);
616+
}
613617
if(Static.getServer().getMinecraftVersion().gte(MCVersion.MC1_17)) {
614618
if(im instanceof BundleMeta) {
615619
return new BukkitMCBundleMeta((BundleMeta) im);
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.laytonsmith.abstraction.bukkit;
2+
3+
import com.laytonsmith.abstraction.MCBlockDataMeta;
4+
import com.laytonsmith.abstraction.blocks.MCBlockData;
5+
import com.laytonsmith.abstraction.blocks.MCMaterial;
6+
import com.laytonsmith.abstraction.bukkit.blocks.BukkitMCBlockData;
7+
import org.bukkit.Material;
8+
import org.bukkit.block.data.BlockData;
9+
import org.bukkit.inventory.meta.BlockDataMeta;
10+
11+
public class BukkitMCBlockDataMeta extends BukkitMCItemMeta implements MCBlockDataMeta {
12+
13+
BlockDataMeta bdm;
14+
15+
public BukkitMCBlockDataMeta(BlockDataMeta meta) {
16+
super(meta);
17+
this.bdm = meta;
18+
}
19+
20+
21+
@Override
22+
public MCBlockData getBlockData(MCMaterial material) {
23+
return new BukkitMCBlockData(this.bdm.getBlockData((Material) material.getHandle()));
24+
}
25+
26+
@Override
27+
public boolean hasBlockData() {
28+
return this.bdm.hasBlockData();
29+
}
30+
31+
@Override
32+
public void setBlockData(MCBlockData blockData) {
33+
this.bdm.setBlockData((BlockData) blockData.getHandle());
34+
}
35+
}

src/main/java/com/laytonsmith/core/ObjectGenerator.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.laytonsmith.abstraction.MCAttributeModifier;
55
import com.laytonsmith.abstraction.MCAxolotlBucketMeta;
66
import com.laytonsmith.abstraction.MCBannerMeta;
7+
import com.laytonsmith.abstraction.MCBlockDataMeta;
78
import com.laytonsmith.abstraction.MCBlockStateMeta;
89
import com.laytonsmith.abstraction.MCBookMeta;
910
import com.laytonsmith.abstraction.MCBrewerInventory;
@@ -556,6 +557,13 @@ public Construct itemMeta(MCItemStack is, Target t) {
556557
}
557558
ma.set("inventory", box, t);
558559
}
560+
} else if(meta instanceof MCBlockDataMeta) {
561+
MCBlockDataMeta mcbdm = (MCBlockDataMeta) meta;
562+
if(mcbdm.hasBlockData()) {
563+
ma.set("blockdata", blockData(mcbdm.getBlockData(is.getType()), t), t);
564+
} else {
565+
ma.set("blockdata", CNull.NULL, t);
566+
}
559567
} else if(meta instanceof MCFireworkEffectMeta) {
560568
MCFireworkEffectMeta mcfem = (MCFireworkEffectMeta) meta;
561569
MCFireworkEffect effect = mcfem.getEffect();
@@ -998,6 +1006,14 @@ public MCItemMeta itemMeta(Mixed c, MCMaterial mat, Target t) throws ConfigRunti
9981006
}
9991007
}
10001008
}
1009+
} else if(meta instanceof MCBlockDataMeta) {
1010+
MCBlockDataMeta mcbdm = (MCBlockDataMeta) meta;
1011+
if(ma.containsKey("blockdata")) {
1012+
Mixed mBlockData = ma.get("blockdata", t);
1013+
if(mBlockData instanceof CArray) {
1014+
mcbdm.setBlockData(blockData((CArray) mBlockData, mat, t));
1015+
}
1016+
}
10011017
} else if(meta instanceof MCFireworkEffectMeta) {
10021018
MCFireworkEffectMeta femeta = (MCFireworkEffectMeta) meta;
10031019
if(ma.containsKey("effect")) {
@@ -2070,16 +2086,20 @@ public MCMaterial material(Mixed name, Target t) {
20702086
}
20712087

20722088
public MCBlockData blockData(CArray ca, Target t) {
2089+
return blockData(ca, null, t);
2090+
}
2091+
2092+
public MCBlockData blockData(CArray ca, MCMaterial blockType, Target t) {
20732093
StringBuilder b = new StringBuilder().append("[");
20742094
boolean first = true;
2095+
String block = null;
20752096
for(String key : ca.stringKeySet()) {
20762097
if(key.equals("block")) {
2077-
String block = ca.get("block", t).val();
2098+
block = ca.get("block", t).val();
20782099
if(Character.isUpperCase(block.charAt(0))) {
20792100
// support material enum input
20802101
block = block.toLowerCase();
20812102
}
2082-
b.insert(0, block);
20832103
} else {
20842104
if(first) {
20852105
first = false;
@@ -2090,6 +2110,13 @@ public MCBlockData blockData(CArray ca, Target t) {
20902110
}
20912111
}
20922112
b.append("]");
2113+
if(block == null) {
2114+
if(blockType == null) {
2115+
throw new CREFormatException("Missing block type for block data.", t);
2116+
}
2117+
block = blockType.name().toLowerCase();
2118+
}
2119+
b.insert(0, block);
20932120
return Static.getServer().createBlockData(b.toString());
20942121
}
20952122

src/main/resources/functionDocs/get_itemmeta

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,8 @@ Below are the available fields in the item meta array. Fields can be null when t
127127
| AxolotlBucket
128128
|
129129
* '''variant''' : (string) The type of axolotl, one of ''%AXOLOTL_TYPES%''.
130+
|-
131+
| BlockData
132+
|
133+
* '''blockdata''' : (array) An array of blockdata (known as block states in vanilla) like is returned from get_blockdata(), or null if none.
130134
|}

0 commit comments

Comments
 (0)