diff --git a/src/main/java/li/cil/oc2/api/bus/device/object/ObjectDevice.java b/src/main/java/li/cil/oc2/api/bus/device/object/ObjectDevice.java index c196f8c0..93e3fe10 100644 --- a/src/main/java/li/cil/oc2/api/bus/device/object/ObjectDevice.java +++ b/src/main/java/li/cil/oc2/api/bus/device/object/ObjectDevice.java @@ -5,6 +5,7 @@ import li.cil.oc2.api.bus.device.rpc.RPCMethod; import javax.annotation.Nullable; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import static java.util.Collections.emptyList; @@ -42,6 +43,17 @@ public final class ObjectDevice implements RPCDevice { } } + /** + * Creates a new object device with methods in the specified object and the + * specified list of type names. + * + * @param object the object containing methods provided by this device. + * @param typeNames the type names of the device. + */ + public ObjectDevice(final Object object, final String... typeNames) { + this(object, Arrays.asList(typeNames)); + } + /** * Creates a new object device with methods in the specified object and the specified * type name. For convenience, the type name may be {@code null}, in which case using diff --git a/src/main/java/li/cil/oc2/common/bus/ItemHandlerDeviceBusElement.java b/src/main/java/li/cil/oc2/common/bus/ItemHandlerDeviceBusElement.java index 81467def..09b2aa3d 100644 --- a/src/main/java/li/cil/oc2/common/bus/ItemHandlerDeviceBusElement.java +++ b/src/main/java/li/cil/oc2/common/bus/ItemHandlerDeviceBusElement.java @@ -1,10 +1,13 @@ package li.cil.oc2.common.bus; +import li.cil.oc2.api.bus.device.rpc.RPCDevice; +import li.cil.oc2.common.bus.device.rpc.TypeNameRPCDevice; import li.cil.oc2.common.bus.device.util.ItemDeviceInfo; import li.cil.oc2.common.util.ItemDeviceUtils; import li.cil.oc2.common.util.NBTTagIds; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.ResourceLocation; import java.util.Collections; import java.util.HashSet; @@ -24,6 +27,7 @@ public class ItemHandlerDeviceBusElement extends AbstractGroupingItemDeviceBusEl public void updateDevices(final int slot, final ItemStack stack) { if (!stack.isEmpty()) { final HashSet newDevices = new HashSet<>(deviceLookup.apply(stack)); + insertItemNameDevice(stack, newDevices); importDeviceDataFromItemStack(stack, newDevices); setDevicesForGroup(slot, newDevices); } else { @@ -65,4 +69,13 @@ public class ItemHandlerDeviceBusElement extends AbstractGroupingItemDeviceBusEl } }); } + + private void insertItemNameDevice(final ItemStack stack, final HashSet devices) { + if (devices.stream().anyMatch(info -> info.device instanceof RPCDevice)) { + final ResourceLocation registryName = stack.getItem().getRegistryName(); + if (registryName != null) { + devices.add(new ItemDeviceInfo(null, new TypeNameRPCDevice(registryName.toString()))); + } + } + } } diff --git a/src/main/java/li/cil/oc2/common/bus/TileEntityDeviceBusElement.java b/src/main/java/li/cil/oc2/common/bus/TileEntityDeviceBusElement.java index 2275712f..ff110644 100644 --- a/src/main/java/li/cil/oc2/common/bus/TileEntityDeviceBusElement.java +++ b/src/main/java/li/cil/oc2/common/bus/TileEntityDeviceBusElement.java @@ -3,6 +3,8 @@ package li.cil.oc2.common.bus; import li.cil.oc2.api.bus.BlockDeviceBusElement; import li.cil.oc2.api.bus.DeviceBus; import li.cil.oc2.api.bus.DeviceBusElement; +import li.cil.oc2.api.bus.device.rpc.RPCDevice; +import li.cil.oc2.common.bus.device.rpc.TypeNameRPCDevice; import li.cil.oc2.common.bus.device.util.BlockDeviceInfo; import li.cil.oc2.common.bus.device.util.Devices; import li.cil.oc2.common.capabilities.Capabilities; @@ -101,6 +103,8 @@ public class TileEntityDeviceBusElement extends AbstractGroupingBlockDeviceBusEl } } + insertBlockNameDevice(world, pos, newDevices); + setDevicesForGroup(index, newDevices); } @@ -153,4 +157,13 @@ public class TileEntityDeviceBusElement extends AbstractGroupingBlockDeviceBusEl capability.ifPresent(DeviceBus::scheduleScan); } } + + private void insertBlockNameDevice(final World world, final BlockPos pos, final HashSet devices) { + if (devices.stream().anyMatch(info -> info.device instanceof RPCDevice)) { + final String blockName = WorldUtils.getBlockName(world, pos); + if (blockName != null) { + devices.add(new BlockDeviceInfo(null, new TypeNameRPCDevice(blockName))); + } + } + } } diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/block/BlockStateDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/block/BlockStateDeviceProvider.java index 4edbd647..181b9371 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/provider/block/BlockStateDeviceProvider.java +++ b/src/main/java/li/cil/oc2/common/bus/device/provider/block/BlockStateDeviceProvider.java @@ -5,7 +5,6 @@ import li.cil.oc2.api.bus.device.object.Callbacks; import li.cil.oc2.api.bus.device.object.ObjectDevice; import li.cil.oc2.api.bus.device.provider.BlockDeviceQuery; import li.cil.oc2.common.bus.device.provider.util.AbstractBlockDeviceProvider; -import li.cil.oc2.common.util.WorldUtils; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; @@ -29,7 +28,6 @@ public final class BlockStateDeviceProvider extends AbstractBlockDeviceProvider return LazyOptional.empty(); } - final String typeName = WorldUtils.getBlockName(world, position); - return LazyOptional.of(() -> new ObjectDevice(block, typeName)); + return LazyOptional.of(() -> new ObjectDevice(block)); } } diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/block/EnergyStorageBlockDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/block/EnergyStorageBlockDeviceProvider.java index 8fbecd53..92c7fcce 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/provider/block/EnergyStorageBlockDeviceProvider.java +++ b/src/main/java/li/cil/oc2/common/bus/device/provider/block/EnergyStorageBlockDeviceProvider.java @@ -12,10 +12,6 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.energy.IEnergyStorage; public final class EnergyStorageBlockDeviceProvider extends AbstractTileEntityCapabilityDeviceProvider { - private static final String ENERGY_STORAGE_TYPE_NAME = "energyStorage"; - - /////////////////////////////////////////////////////////////////// - public EnergyStorageBlockDeviceProvider() { super(() -> Capabilities.ENERGY_STORAGE); } @@ -24,7 +20,7 @@ public final class EnergyStorageBlockDeviceProvider extends AbstractTileEntityCa @Override protected LazyOptional getBlockDevice(final BlockDeviceQuery query, final IEnergyStorage value) { - return LazyOptional.of(() -> new ObjectDevice(new EnergyStorageDevice(value), ENERGY_STORAGE_TYPE_NAME)); + return LazyOptional.of(() -> new ObjectDevice(new EnergyStorageDevice(value), "energy_storage")); } /////////////////////////////////////////////////////////////////// diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/block/FluidHandlerBlockDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/block/FluidHandlerBlockDeviceProvider.java index 9366b419..186b3b90 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/provider/block/FluidHandlerBlockDeviceProvider.java +++ b/src/main/java/li/cil/oc2/common/bus/device/provider/block/FluidHandlerBlockDeviceProvider.java @@ -13,10 +13,6 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; public final class FluidHandlerBlockDeviceProvider extends AbstractTileEntityCapabilityDeviceProvider { - private static final String FLUID_HANDLER_TYPE_NAME = "fluidHandler"; - - /////////////////////////////////////////////////////////////////// - public FluidHandlerBlockDeviceProvider() { super(() -> Capabilities.FLUID_HANDLER); } @@ -25,7 +21,7 @@ public final class FluidHandlerBlockDeviceProvider extends AbstractTileEntityCap @Override protected LazyOptional getBlockDevice(final BlockDeviceQuery query, final IFluidHandler value) { - return LazyOptional.of(() -> new ObjectDevice(new FluidHandlerDevice(value), FLUID_HANDLER_TYPE_NAME)); + return LazyOptional.of(() -> new ObjectDevice(new FluidHandlerDevice(value), "fluid_handler")); } /////////////////////////////////////////////////////////////////// diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/block/ItemHandlerBlockDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/block/ItemHandlerBlockDeviceProvider.java index f12fba18..39da1e86 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/provider/block/ItemHandlerBlockDeviceProvider.java +++ b/src/main/java/li/cil/oc2/common/bus/device/provider/block/ItemHandlerBlockDeviceProvider.java @@ -13,10 +13,6 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.IItemHandler; public final class ItemHandlerBlockDeviceProvider extends AbstractTileEntityCapabilityDeviceProvider { - private static final String ITEM_HANDLER_TYPE_NAME = "itemHandler"; - - /////////////////////////////////////////////////////////////////// - public ItemHandlerBlockDeviceProvider() { super(() -> Capabilities.ITEM_HANDLER); } @@ -25,7 +21,7 @@ public final class ItemHandlerBlockDeviceProvider extends AbstractTileEntityCapa @Override protected LazyOptional getBlockDevice(final BlockDeviceQuery query, final IItemHandler value) { - return LazyOptional.of(() -> new ObjectDevice(new ItemHandlerDevice(value), ITEM_HANDLER_TYPE_NAME)); + return LazyOptional.of(() -> new ObjectDevice(new ItemHandlerDevice(value), "item_handler")); } /////////////////////////////////////////////////////////////////// diff --git a/src/main/java/li/cil/oc2/common/bus/device/provider/block/TileEntityDeviceProvider.java b/src/main/java/li/cil/oc2/common/bus/device/provider/block/TileEntityDeviceProvider.java index 900c7ebc..31d008ec 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/provider/block/TileEntityDeviceProvider.java +++ b/src/main/java/li/cil/oc2/common/bus/device/provider/block/TileEntityDeviceProvider.java @@ -5,7 +5,6 @@ import li.cil.oc2.api.bus.device.object.Callbacks; import li.cil.oc2.api.bus.device.object.ObjectDevice; import li.cil.oc2.api.bus.device.provider.BlockDeviceQuery; import li.cil.oc2.common.bus.device.provider.util.AbstractTileEntityDeviceProvider; -import li.cil.oc2.common.util.WorldUtils; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.LazyOptional; @@ -13,10 +12,7 @@ public final class TileEntityDeviceProvider extends AbstractTileEntityDeviceProv @Override public LazyOptional getBlockDevice(final BlockDeviceQuery query, final TileEntity tileEntity) { if (Callbacks.hasMethods(tileEntity)) { - return LazyOptional.of(() -> { - final String typeName = WorldUtils.getBlockName(query.getWorld(), query.getQueryPosition()); - return new ObjectDevice(tileEntity, typeName); - }); + return LazyOptional.of(() -> new ObjectDevice(tileEntity)); } else { return LazyOptional.empty(); } diff --git a/src/main/java/li/cil/oc2/common/bus/device/rpc/RPCDeviceList.java b/src/main/java/li/cil/oc2/common/bus/device/rpc/RPCDeviceList.java index 66d44867..82b1492e 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/rpc/RPCDeviceList.java +++ b/src/main/java/li/cil/oc2/common/bus/device/rpc/RPCDeviceList.java @@ -23,6 +23,7 @@ public final class RPCDeviceList implements RPCDevice { return devices.stream() .map(RPCDevice::getTypeNames) .flatMap(Collection::stream) + .distinct() .collect(Collectors.toList()); } diff --git a/src/main/java/li/cil/oc2/common/bus/device/rpc/TypeNameRPCDevice.java b/src/main/java/li/cil/oc2/common/bus/device/rpc/TypeNameRPCDevice.java new file mode 100644 index 00000000..3f5f5bb1 --- /dev/null +++ b/src/main/java/li/cil/oc2/common/bus/device/rpc/TypeNameRPCDevice.java @@ -0,0 +1,26 @@ +package li.cil.oc2.common.bus.device.rpc; + +import li.cil.oc2.api.bus.device.ItemDevice; +import li.cil.oc2.api.bus.device.rpc.RPCDevice; +import li.cil.oc2.api.bus.device.rpc.RPCMethod; + +import java.util.Collections; +import java.util.List; + +public final class TypeNameRPCDevice implements RPCDevice, ItemDevice { + private final String typeName; + + public TypeNameRPCDevice(final String typeName) { + this.typeName = typeName; + } + + @Override + public List getTypeNames() { + return Collections.singletonList(typeName); + } + + @Override + public List getMethods() { + return Collections.emptyList(); + } +} diff --git a/src/main/java/li/cil/oc2/common/bus/device/util/AbstractDeviceInfo.java b/src/main/java/li/cil/oc2/common/bus/device/util/AbstractDeviceInfo.java index b189bbce..9badae41 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/util/AbstractDeviceInfo.java +++ b/src/main/java/li/cil/oc2/common/bus/device/util/AbstractDeviceInfo.java @@ -3,15 +3,16 @@ package li.cil.oc2.common.bus.device.util; import li.cil.oc2.api.bus.device.Device; import net.minecraftforge.registries.IForgeRegistryEntry; +import javax.annotation.Nullable; import java.util.Objects; public abstract class AbstractDeviceInfo, TDevice extends Device> { - public final TProvider provider; + @Nullable public final TProvider provider; public final TDevice device; /////////////////////////////////////////////////////////////////// - protected AbstractDeviceInfo(final TProvider provider, final TDevice device) { + protected AbstractDeviceInfo(@Nullable final TProvider provider, final TDevice device) { this.provider = provider; this.device = device; } @@ -23,7 +24,7 @@ public abstract class AbstractDeviceInfo that = (AbstractDeviceInfo) o; - return provider.equals(that.provider) && device.equals(that.device); + return Objects.equals(provider, that.provider) && device.equals(that.device); } @Override diff --git a/src/main/java/li/cil/oc2/common/bus/device/util/BlockDeviceInfo.java b/src/main/java/li/cil/oc2/common/bus/device/util/BlockDeviceInfo.java index 2ca9edc5..6e4ad16c 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/util/BlockDeviceInfo.java +++ b/src/main/java/li/cil/oc2/common/bus/device/util/BlockDeviceInfo.java @@ -3,8 +3,10 @@ package li.cil.oc2.common.bus.device.util; import li.cil.oc2.api.bus.device.Device; import li.cil.oc2.api.bus.device.provider.BlockDeviceProvider; +import javax.annotation.Nullable; + public final class BlockDeviceInfo extends AbstractDeviceInfo { - public BlockDeviceInfo(final BlockDeviceProvider blockDeviceProvider, final Device device) { + public BlockDeviceInfo(@Nullable final BlockDeviceProvider blockDeviceProvider, final Device device) { super(blockDeviceProvider, device); } } diff --git a/src/main/java/li/cil/oc2/common/bus/device/util/ItemDeviceInfo.java b/src/main/java/li/cil/oc2/common/bus/device/util/ItemDeviceInfo.java index c99bed8c..d7701f61 100644 --- a/src/main/java/li/cil/oc2/common/bus/device/util/ItemDeviceInfo.java +++ b/src/main/java/li/cil/oc2/common/bus/device/util/ItemDeviceInfo.java @@ -3,8 +3,10 @@ package li.cil.oc2.common.bus.device.util; import li.cil.oc2.api.bus.device.ItemDevice; import li.cil.oc2.api.bus.device.provider.ItemDeviceProvider; +import javax.annotation.Nullable; + public class ItemDeviceInfo extends AbstractDeviceInfo { - public ItemDeviceInfo(final ItemDeviceProvider itemDeviceProvider, final ItemDevice device) { + public ItemDeviceInfo(@Nullable final ItemDeviceProvider itemDeviceProvider, final ItemDevice device) { super(itemDeviceProvider, device); } }