mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-15 07:01:36 +08:00
Add BlockData#getAsString(boolean) to hide unspecified states
This commit is contained in:
parent
bb6f384a83
commit
4b843638ea
40
nms-patches/ArgumentBlock.patch
Normal file
40
nms-patches/ArgumentBlock.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
--- a/net/minecraft/server/ArgumentBlock.java
|
||||||
|
+++ b/net/minecraft/server/ArgumentBlock.java
|
||||||
|
@@ -41,7 +41,7 @@
|
||||||
|
private static final Function<SuggestionsBuilder, CompletableFuture<Suggestions>> h = SuggestionsBuilder::buildFuture;
|
||||||
|
private final StringReader i;
|
||||||
|
private final boolean j;
|
||||||
|
- private final Map<IBlockState<?>, Comparable<?>> k = Maps.newHashMap();
|
||||||
|
+ private final Map<IBlockState<?>, Comparable<?>> k = Maps.newLinkedHashMap(); // CraftBukkit - stable
|
||||||
|
private final Map<String, String> l = Maps.newHashMap();
|
||||||
|
private MinecraftKey m = new MinecraftKey("");
|
||||||
|
private BlockStateList<Block, IBlockData> n;
|
||||||
|
@@ -222,7 +222,7 @@
|
||||||
|
if (comparable instanceof Integer) {
|
||||||
|
suggestionsbuilder.suggest((Integer) comparable);
|
||||||
|
} else {
|
||||||
|
- suggestionsbuilder.suggest(iblockstate.a(comparable));
|
||||||
|
+ suggestionsbuilder.suggest(iblockstate.a((T) comparable)); // CraftBukkit - decompile error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -488,8 +488,8 @@
|
||||||
|
Optional optional = iblockstate.b(s);
|
||||||
|
|
||||||
|
if (optional.isPresent()) {
|
||||||
|
- this.o = (IBlockData) this.o.set(iblockstate, (Comparable) optional.get());
|
||||||
|
- this.k.put(iblockstate, optional.get());
|
||||||
|
+ this.o = (IBlockData) this.o.set(iblockstate, (T) optional.get()); // CraftBukkit - decompile error
|
||||||
|
+ this.k.put(iblockstate, (Comparable) optional.get()); // CraftBukkit - decompile error
|
||||||
|
} else {
|
||||||
|
this.i.setCursor(i);
|
||||||
|
throw ArgumentBlock.e.createWithContext(this.i, this.m.toString(), iblockstate.a(), s);
|
||||||
|
@@ -526,7 +526,7 @@
|
||||||
|
private static <T extends Comparable<T>> void a(StringBuilder stringbuilder, IBlockState<T> iblockstate, Comparable<?> comparable) {
|
||||||
|
stringbuilder.append(iblockstate.a());
|
||||||
|
stringbuilder.append('=');
|
||||||
|
- stringbuilder.append(iblockstate.a(comparable));
|
||||||
|
+ stringbuilder.append(iblockstate.a((T) comparable)); // CraftBukkit - decompile error
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompletableFuture<Suggestions> a(SuggestionsBuilder suggestionsbuilder) {
|
@ -43,15 +43,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -646,7 +653,7 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString() {
|
|
||||||
- return "Block{" + IRegistry.BLOCK.getKey(this) + "}";
|
|
||||||
+ return IRegistry.BLOCK.getKey(this).toString(); // CraftBukkit - cheap hack
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean c(Block block) {
|
|
||||||
@@ -1395,8 +1402,14 @@
|
@@ -1395,8 +1402,14 @@
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package org.bukkit.craftbukkit.block.data;
|
package org.bukkit.craftbukkit.block.data;
|
||||||
|
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.collect.BiMap;
|
import com.google.common.collect.BiMap;
|
||||||
@ -12,6 +13,7 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import net.minecraft.server.ArgumentBlock;
|
import net.minecraft.server.ArgumentBlock;
|
||||||
import net.minecraft.server.Block;
|
import net.minecraft.server.Block;
|
||||||
|
import net.minecraft.server.BlockDataAbstract;
|
||||||
import net.minecraft.server.BlockStateBoolean;
|
import net.minecraft.server.BlockStateBoolean;
|
||||||
import net.minecraft.server.BlockStateEnum;
|
import net.minecraft.server.BlockStateEnum;
|
||||||
import net.minecraft.server.BlockStateInteger;
|
import net.minecraft.server.BlockStateInteger;
|
||||||
@ -29,7 +31,7 @@ import org.bukkit.craftbukkit.util.CraftMagicNumbers;
|
|||||||
public class CraftBlockData implements BlockData {
|
public class CraftBlockData implements BlockData {
|
||||||
|
|
||||||
private IBlockData state;
|
private IBlockData state;
|
||||||
private Set<IBlockState<?>> parsedStates;
|
private Map<IBlockState<?>, Comparable<?>> parsedStates;
|
||||||
|
|
||||||
protected CraftBlockData() {
|
protected CraftBlockData() {
|
||||||
throw new AssertionError("Template Constructor");
|
throw new AssertionError("Template Constructor");
|
||||||
@ -102,7 +104,7 @@ public class CraftBlockData implements BlockData {
|
|||||||
CraftBlockData clone = (CraftBlockData) this.clone();
|
CraftBlockData clone = (CraftBlockData) this.clone();
|
||||||
clone.parsedStates = null;
|
clone.parsedStates = null;
|
||||||
|
|
||||||
for (IBlockState parsed : craft.parsedStates) {
|
for (IBlockState parsed : craft.parsedStates.keySet()) {
|
||||||
clone.state = clone.state.set(parsed, craft.state.get(parsed));
|
clone.state = clone.state.set(parsed, craft.state.get(parsed));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,7 +240,12 @@ public class CraftBlockData implements BlockData {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getAsString() {
|
public String getAsString() {
|
||||||
return state.toString();
|
return toString(((BlockDataAbstract) state).b());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAsString(boolean hideUnspecified) {
|
||||||
|
return (hideUnspecified && parsedStates != null) ? toString(parsedStates) : getAsString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -255,6 +262,29 @@ public class CraftBlockData implements BlockData {
|
|||||||
return "CraftBlockData{" + state.toString() + "}";
|
return "CraftBlockData{" + state.toString() + "}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Mimicked from BlockDataAbstract#toString()
|
||||||
|
public String toString(Map<IBlockState<?>, Comparable<?>> states) {
|
||||||
|
StringBuilder stateString = new StringBuilder(IRegistry.BLOCK.getKey(state.getBlock()).toString());
|
||||||
|
|
||||||
|
if (!states.isEmpty()) {
|
||||||
|
stateString.append('[');
|
||||||
|
stateString.append(states.entrySet().stream().map(STATE_TO_VALUE).collect(Collectors.joining(",")));
|
||||||
|
stateString.append(']');
|
||||||
|
}
|
||||||
|
|
||||||
|
return stateString.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// BlockDataAbstract#b. Should PAIL public in future release but is mimicked for now to avoid a decompile error patch
|
||||||
|
private static final Function<Map.Entry<IBlockState<?>, Comparable<?>>, String> STATE_TO_VALUE = (entry) -> {
|
||||||
|
if (entry == null) {
|
||||||
|
return "<NULL>";
|
||||||
|
}
|
||||||
|
|
||||||
|
IBlockState state = entry.getKey();
|
||||||
|
return state.a() + "=" + state.a(entry.getValue());
|
||||||
|
};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
return obj instanceof CraftBlockData && state.equals(((CraftBlockData) obj).state);
|
return obj instanceof CraftBlockData && state.equals(((CraftBlockData) obj).state);
|
||||||
@ -473,7 +503,7 @@ public class CraftBlockData implements BlockData {
|
|||||||
|
|
||||||
IBlockData blockData;
|
IBlockData blockData;
|
||||||
Block block = CraftMagicNumbers.getBlock(material);
|
Block block = CraftMagicNumbers.getBlock(material);
|
||||||
Set<IBlockState<?>> parsed = null;
|
Map<IBlockState<?>, Comparable<?>> parsed = null;
|
||||||
|
|
||||||
// Data provided, use it
|
// Data provided, use it
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
@ -487,8 +517,8 @@ public class CraftBlockData implements BlockData {
|
|||||||
ArgumentBlock arg = new ArgumentBlock(reader, false).a(false);
|
ArgumentBlock arg = new ArgumentBlock(reader, false).a(false);
|
||||||
Preconditions.checkArgument(!reader.canRead(), "Spurious trailing data");
|
Preconditions.checkArgument(!reader.canRead(), "Spurious trailing data");
|
||||||
|
|
||||||
blockData = arg.b();
|
blockData = arg.b(); // PAIL rename getBlockData
|
||||||
parsed = arg.a().keySet();
|
parsed = arg.a(); // PAIL rename getStateMap
|
||||||
} catch (CommandSyntaxException ex) {
|
} catch (CommandSyntaxException ex) {
|
||||||
throw new IllegalArgumentException("Could not parse data: " + data, ex);
|
throw new IllegalArgumentException("Could not parse data: " + data, ex);
|
||||||
}
|
}
|
||||||
|
@ -152,4 +152,21 @@ public class BlockDataTest extends AbstractTestingBase {
|
|||||||
Assert.assertTrue(one.matches(two));
|
Assert.assertTrue(one.matches(two));
|
||||||
Assert.assertFalse(two.matches(one));
|
Assert.assertFalse(two.matches(one));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAsString() {
|
||||||
|
String dataString = "minecraft:chest[facing=east,waterlogged=true]";
|
||||||
|
BlockData data = CraftBlockData.newData(null, dataString);
|
||||||
|
|
||||||
|
Assert.assertThat(data.getAsString(true), is(dataString));
|
||||||
|
Assert.assertThat(data.getAsString(false), is("minecraft:chest[facing=east,type=single,waterlogged=true]"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetAsString2() {
|
||||||
|
Chest data = (Chest) CraftBlockData.fromData(Blocks.CHEST.getBlockData().set(BlockChest.FACING, EnumDirection.EAST));
|
||||||
|
|
||||||
|
Assert.assertThat(data.getAsString(true), is("minecraft:chest[facing=east,type=single,waterlogged=false]"));
|
||||||
|
Assert.assertThat(data.getAsString(false), is("minecraft:chest[facing=east,type=single,waterlogged=false]"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user