Skip to content

Commit a29fee5

Browse files
committed
Include only existing states in blockdata meta (Fixes #1350)
This is only fixed in 1.20.6 or later. Setting only specified blockdata meta was fixed upstream in 1.21.3.
1 parent 275ad80 commit a29fee5

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed

src/main/java/com/laytonsmith/abstraction/MCItemMeta.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ public interface MCItemMeta extends AbstractionObject {
122122

123123
MCBlockData getBlockData(MCMaterial material);
124124

125+
Map<String, String> getExistingBlockData();
126+
125127
boolean hasBlockData();
126128

127129
void setBlockData(MCBlockData blockData);

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.google.common.collect.LinkedHashMultimap;
44
import com.google.common.collect.Multimap;
5+
import com.laytonsmith.PureUtilities.Common.ReflectionUtils;
6+
import com.laytonsmith.PureUtilities.Common.ReflectionUtils.ReflectionException;
57
import com.laytonsmith.abstraction.AbstractionObject;
68
import com.laytonsmith.abstraction.MCAttributeModifier;
79
import com.laytonsmith.abstraction.MCItemMeta;
@@ -22,6 +24,10 @@
2224

2325
import com.laytonsmith.abstraction.enums.bukkit.BukkitMCEnchantment;
2426
import com.laytonsmith.abstraction.enums.bukkit.BukkitMCItemFlag;
27+
import com.laytonsmith.core.MSLog;
28+
import com.laytonsmith.core.MSLog.Tags;
29+
import com.laytonsmith.core.constructs.Target;
30+
import org.bukkit.Bukkit;
2531
import org.bukkit.Material;
2632
import org.bukkit.attribute.Attribute;
2733
import org.bukkit.attribute.AttributeModifier;
@@ -195,6 +201,20 @@ public MCBlockData getBlockData(MCMaterial material) {
195201
return new BukkitMCBlockData(((BlockDataMeta) this.im).getBlockData((Material) material.getHandle()));
196202
}
197203

204+
@Override
205+
public Map<String, String> getExistingBlockData() {
206+
try {
207+
Class clz = Class.forName(Bukkit.getServer().getClass().getPackage().getName() + ".inventory.CraftMetaItem");
208+
return (Map<String, String>) ReflectionUtils.get(clz, this.im, "blockData");
209+
} catch (ClassNotFoundException e) {
210+
MSLog.GetLogger().e(Tags.GENERAL, "Failed to get CraftMetaItem class.", Target.UNKNOWN);
211+
return null;
212+
} catch (ReflectionException ex) {
213+
MSLog.GetLogger().e(Tags.GENERAL, "Failed to get blockData from CraftMetaItem.", Target.UNKNOWN);
214+
return null;
215+
}
216+
}
217+
198218
@Override
199219
public boolean hasBlockData() {
200220
return ((BlockDataMeta) this.im).hasBlockData();

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

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,9 @@
105105
import java.util.ArrayList;
106106
import java.util.HashMap;
107107
import java.util.List;
108+
import java.util.Locale;
108109
import java.util.Map;
110+
import java.util.Map.Entry;
109111
import java.util.Random;
110112
import java.util.Set;
111113
import java.util.UUID;
@@ -490,7 +492,17 @@ public Construct itemMeta(MCItemStack is, Target t) {
490492
} else if(material.isBlock()) {
491493
// Block items only
492494
if(meta.hasBlockData()) {
493-
ma.set("blockdata", blockData(meta.getBlockData(is.getType()), t), t);
495+
if(Static.getServer().getMinecraftVersion().gte(MCVersion.MC1_20_6)) {
496+
// return only existing states
497+
Map<String, String> blockData = meta.getExistingBlockData();
498+
if(blockData != null) {
499+
ma.set("blockdata", blockData(is.getType(), blockData, t), t);
500+
} else {
501+
ma.set("blockdata", CNull.NULL, t);
502+
}
503+
} else {
504+
ma.set("blockdata", blockData(meta.getBlockData(is.getType()), t), t);
505+
}
494506
} else {
495507
ma.set("blockdata", CNull.NULL, t);
496508
}
@@ -2510,9 +2522,18 @@ public CArray blockData(MCBlockData blockdata, Target t) {
25102522
return ca;
25112523
}
25122524

2525+
public CArray blockData(MCMaterial mat, Map<String, String> blockData, Target t) {
2526+
CArray ca = CArray.GetAssociativeArray(t);
2527+
ca.set("block", new CString(mat.getName().toLowerCase(Locale.ROOT), t), t);
2528+
for(Entry<String, String> entry : blockData.entrySet()) {
2529+
ca.set(entry.getKey(), blockState(entry.getValue()), t);
2530+
}
2531+
return ca;
2532+
}
2533+
25132534
private Construct blockState(String value) {
2514-
if(value.length() < 3 && Character.isDigit(value.charAt(0))) {
2515-
// integer states range from 0-25
2535+
int ch = value.charAt(0);
2536+
if(ch >= '0' && ch <= '9') {
25162537
try {
25172538
return new CInt(Long.parseLong(value), Target.UNKNOWN);
25182539
} catch (NumberFormatException e) {

0 commit comments

Comments
 (0)