geforkt von Mirrors/FastAsyncWorldEdit
Only get the world's tile entity if the block id has a tile entity
Dieser Commit ist enthalten in:
Ursprung
29e823d136
Commit
73dc31b2bb
@ -24,6 +24,7 @@ import java.util.Collection;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import net.minecraft.server.NBTBase;
|
import net.minecraft.server.NBTBase;
|
||||||
@ -75,8 +76,21 @@ class NmsBlock extends BaseBlock implements TileEntityBlock {
|
|||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(NmsBlock.class.getCanonicalName());
|
private static final Logger logger = Logger.getLogger(NmsBlock.class.getCanonicalName());
|
||||||
private static Field compoundMapField;
|
private static Field compoundMapField;
|
||||||
|
private static final Field nmsBlock_isTileEntityField; // The field is deobfuscated but the method isn't. No idea why.
|
||||||
private NBTTagCompound nbtData = null;
|
private NBTTagCompound nbtData = null;
|
||||||
|
|
||||||
|
static {
|
||||||
|
Field field;
|
||||||
|
try {
|
||||||
|
field = net.minecraft.server.Block.class.getDeclaredField("isTileEntity");
|
||||||
|
field.setAccessible(true);
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
logger.severe("Could not find NMS block tile entity field!");
|
||||||
|
field = null;
|
||||||
|
}
|
||||||
|
nmsBlock_isTileEntityField = field;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new instance with a given type ID, data value, and previous
|
* Create a new instance with a given type ID, data value, and previous
|
||||||
* {@link TileEntityBlock}-implementing object.
|
* {@link TileEntityBlock}-implementing object.
|
||||||
@ -164,6 +178,10 @@ class NmsBlock extends BaseBlock implements TileEntityBlock {
|
|||||||
* @return the block, or null
|
* @return the block, or null
|
||||||
*/
|
*/
|
||||||
public static NmsBlock get(World world, Vector position, int type, int data) {
|
public static NmsBlock get(World world, Vector position, int type, int data) {
|
||||||
|
if (!hasTileEntity(type)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
TileEntity te = ((CraftWorld) world).getHandle().getTileEntity(
|
TileEntity te = ((CraftWorld) world).getHandle().getTileEntity(
|
||||||
position.getBlockX(), position.getBlockY(), position.getBlockZ());
|
position.getBlockX(), position.getBlockY(), position.getBlockZ());
|
||||||
|
|
||||||
@ -186,6 +204,9 @@ class NmsBlock extends BaseBlock implements TileEntityBlock {
|
|||||||
*/
|
*/
|
||||||
public static boolean set(World world, Vector position, BaseBlock block) {
|
public static boolean set(World world, Vector position, BaseBlock block) {
|
||||||
NBTTagCompound data = null;
|
NBTTagCompound data = null;
|
||||||
|
if (!hasTileEntity(world.getBlockTypeIdAt(position.getBlockX(), position.getBlockY(), position.getBlockZ()))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (block instanceof NmsBlock) {
|
if (block instanceof NmsBlock) {
|
||||||
NmsBlock nmsProxyBlock = (NmsBlock) block;
|
NmsBlock nmsProxyBlock = (NmsBlock) block;
|
||||||
@ -245,6 +266,26 @@ class NmsBlock extends BaseBlock implements TileEntityBlock {
|
|||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean hasTileEntity(int type) {
|
||||||
|
net.minecraft.server.Block nmsBlock = getNmsBlock(type);
|
||||||
|
if (nmsBlock == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return nmsBlock_isTileEntityField.getBoolean(nmsBlock); // Once we have the field stord, gets are fast
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static net.minecraft.server.Block getNmsBlock(int type) {
|
||||||
|
if (type < 0 || type >= net.minecraft.server.Block.byId.length) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return net.minecraft.server.Block.byId[type];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts from a non-native NMS NBT structure to a native WorldEdit NBT
|
* Converts from a non-native NMS NBT structure to a native WorldEdit NBT
|
||||||
* structure.
|
* structure.
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren