Pull out some forge stuff to make it less painful to maybe switch to fabric later.

This commit is contained in:
Florian Nücke
2020-11-29 08:35:56 +01:00
parent 1df8e5e5d9
commit 83b71c96d6
5 changed files with 80 additions and 18 deletions

View File

@@ -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;
}

View File

@@ -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<Class<?>, Capability<?>> CAPABILITIES = Util.make(() -> {
final HashMap<Class<?>, Capability<?>> map = new HashMap<>();
map.put(DeviceBusElement.class, Capabilities.DEVICE_BUS_ELEMENT_CAPABILITY);
return map;
});
public static <T> Optional<T> getInterfaceForSide(final TileEntity tileEntity, final Class<T> 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<T> value = tileEntity.getCapability(capability, side).cast();
//noinspection ConstantConditions Can be null because we pass in null.
return Optional.ofNullable(value.orElse(null));
}
}

View File

@@ -0,0 +1,7 @@
@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
package li.cil.oc2.common.util;
import mcp.MethodsReturnNonnullByDefault;
import javax.annotation.ParametersAreNonnullByDefault;

View File

@@ -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<DeviceBusElement> capability = tileEntity.getCapability(Capabilities.DEVICE_BUS_ELEMENT_CAPABILITY, edge.face);
final Optional<DeviceBusElement> 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<DeviceBusElement> otherCapability = tileEntity.getCapability(Capabilities.DEVICE_BUS_ELEMENT_CAPABILITY, face);
final Optional<DeviceBusElement> 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;

View File

@@ -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) {