diff --git a/src/main/java/li/cil/oc2/common/util/NBTTagIds.java b/src/main/java/li/cil/oc2/common/util/NBTTagIds.java new file mode 100644 index 00000000..1bc27c2b --- /dev/null +++ b/src/main/java/li/cil/oc2/common/util/NBTTagIds.java @@ -0,0 +1,20 @@ +package li.cil.oc2.common.util; + +import net.minecraftforge.common.util.Constants; + +public final class NBTTagIds { + public static final int TAG_END = Constants.NBT.TAG_END; + public static final int TAG_BYTE = Constants.NBT.TAG_BYTE; + public static final int TAG_SHORT = Constants.NBT.TAG_SHORT; + public static final int TAG_INT = Constants.NBT.TAG_INT; + public static final int TAG_LONG = Constants.NBT.TAG_LONG; + public static final int TAG_FLOAT = Constants.NBT.TAG_FLOAT; + public static final int TAG_DOUBLE = Constants.NBT.TAG_DOUBLE; + public static final int TAG_BYTE_ARRAY = Constants.NBT.TAG_BYTE_ARRAY; + public static final int TAG_STRING = Constants.NBT.TAG_STRING; + public static final int TAG_LIST = Constants.NBT.TAG_LIST; + public static final int TAG_COMPOUND = Constants.NBT.TAG_COMPOUND; + public static final int TAG_INT_ARRAY = Constants.NBT.TAG_INT_ARRAY; + public static final int TAG_LONG_ARRAY = Constants.NBT.TAG_LONG_ARRAY; + public static final int TAG_ANY_NUMERIC = Constants.NBT.TAG_ANY_NUMERIC; +} diff --git a/src/main/java/li/cil/oc2/common/util/TileEntities.java b/src/main/java/li/cil/oc2/common/util/TileEntities.java new file mode 100644 index 00000000..d6fcd796 --- /dev/null +++ b/src/main/java/li/cil/oc2/common/util/TileEntities.java @@ -0,0 +1,40 @@ +package li.cil.oc2.common.util; + +import li.cil.oc2.api.bus.DeviceBusElement; +import li.cil.oc2.common.capabilities.Capabilities; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.Util; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +public final class TileEntities { + private static final Logger LOGGER = LogManager.getLogger(); + private static final Map, Capability> CAPABILITIES = Util.make(() -> { + final HashMap, Capability> map = new HashMap<>(); + + map.put(DeviceBusElement.class, Capabilities.DEVICE_BUS_ELEMENT_CAPABILITY); + + return map; + }); + + public static Optional getInterfaceForSide(final TileEntity tileEntity, final Class type, @Nullable final Direction side) { + final Capability capability = CAPABILITIES.get(type); + if (capability == null) { + LOGGER.warn("Trying to access type with no known capability: [{}]", type); + return Optional.empty(); + } + + final LazyOptional value = tileEntity.getCapability(capability, side).cast(); + + //noinspection ConstantConditions Can be null because we pass in null. + return Optional.ofNullable(value.orElse(null)); + } +} diff --git a/src/main/java/li/cil/oc2/common/util/package-info.java b/src/main/java/li/cil/oc2/common/util/package-info.java new file mode 100644 index 00000000..e3d8ca07 --- /dev/null +++ b/src/main/java/li/cil/oc2/common/util/package-info.java @@ -0,0 +1,7 @@ +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +package li.cil.oc2.common.util; + +import mcp.MethodsReturnNonnullByDefault; + +import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/li/cil/oc2/common/vm/DeviceBusControllerImpl.java b/src/main/java/li/cil/oc2/common/vm/DeviceBusControllerImpl.java index 08c4d0eb..60c29504 100644 --- a/src/main/java/li/cil/oc2/common/vm/DeviceBusControllerImpl.java +++ b/src/main/java/li/cil/oc2/common/vm/DeviceBusControllerImpl.java @@ -7,7 +7,7 @@ import li.cil.oc2.api.bus.DeviceBusElement; import li.cil.oc2.api.device.Device; import li.cil.oc2.api.device.DeviceMethod; import li.cil.oc2.api.device.DeviceMethodParameter; -import li.cil.oc2.common.capabilities.Capabilities; +import li.cil.oc2.common.util.TileEntities; import li.cil.sedna.api.device.Steppable; import li.cil.sedna.api.device.serial.SerialDevice; import net.minecraft.tileentity.TileEntity; @@ -15,7 +15,6 @@ import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; -import net.minecraftforge.common.util.LazyOptional; import javax.annotation.Nullable; import java.io.ByteArrayInputStream; @@ -149,18 +148,18 @@ public class DeviceBusControllerImpl implements DeviceBusController, Steppable { continue; } - final LazyOptional capability = tileEntity.getCapability(Capabilities.DEVICE_BUS_ELEMENT_CAPABILITY, edge.face); + final Optional capability = TileEntities.getInterfaceForSide(tileEntity, DeviceBusElement.class, edge.face); if (capability.isPresent()) { if (busPositions.add(edge.position) && busPositions.size() > MAX_BUS_ELEMENT_COUNT) { elements.clear(); return State.TOO_COMPLEX; } - final DeviceBusElement element = capability.orElseThrow(AssertionError::new); + final DeviceBusElement element = capability.get(); elements.add(element); for (final Direction face : faces) { - final LazyOptional otherCapability = tileEntity.getCapability(Capabilities.DEVICE_BUS_ELEMENT_CAPABILITY, face); + final Optional otherCapability = TileEntities.getInterfaceForSide(tileEntity, DeviceBusElement.class, face); otherCapability.ifPresent(otherElement -> { final boolean isConnectedToIncomingEdge = otherElement == element; if (!isConnectedToIncomingEdge) { @@ -463,20 +462,16 @@ public class DeviceBusControllerImpl implements DeviceBusController, Steppable { methodJson.add("parameters", parametersJson); final DeviceMethodParameter[] parameters = method.getParameters(); - if (parameters != null) { - for (final DeviceMethodParameter parameter : parameters) { - final JsonObject parameterJson = new JsonObject(); + for (final DeviceMethodParameter parameter : parameters) { + final JsonObject parameterJson = new JsonObject(); - parameter.getName().ifPresent(s -> parameterJson.addProperty("name", s)); - parameter.getDescription().ifPresent(s -> parameterJson.addProperty("description", s)); + parameter.getName().ifPresent(s -> parameterJson.addProperty("name", s)); + parameter.getDescription().ifPresent(s -> parameterJson.addProperty("description", s)); - final Class type = parameter.getType(); - if (type != null) { - parameterJson.addProperty("type", type.getSimpleName()); - } + final Class type = parameter.getType(); + parameterJson.addProperty("type", type.getSimpleName()); - parametersJson.add(parameterJson); - } + parametersJson.add(parameterJson); } return methodJson; diff --git a/src/main/java/li/cil/oc2/serialization/NBTSerialization.java b/src/main/java/li/cil/oc2/serialization/NBTSerialization.java index 4e0ce803..37799985 100644 --- a/src/main/java/li/cil/oc2/serialization/NBTSerialization.java +++ b/src/main/java/li/cil/oc2/serialization/NBTSerialization.java @@ -4,9 +4,9 @@ import li.cil.ceres.Ceres; import li.cil.ceres.api.DeserializationVisitor; import li.cil.ceres.api.SerializationException; import li.cil.ceres.api.SerializationVisitor; +import li.cil.oc2.common.util.NBTTagIds; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.ListNBT; -import net.minecraftforge.common.util.Constants; import org.jetbrains.annotations.Contract; import javax.annotation.Nullable; @@ -319,7 +319,7 @@ public final class NBTSerialization { } else if (type.isArray()) { final Class componentType = type.getComponentType(); final li.cil.ceres.api.Serializer serializer = Ceres.getSerializer(componentType); - final ListNBT listNBT = nbt.getList(name, Constants.NBT.TAG_COMPOUND); + final ListNBT listNBT = nbt.getList(name, NBTTagIds.TAG_COMPOUND); final int length = listNBT.size(); Object[] data = (Object[]) into; if (data == null || data.length != length) {