mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-10-30 21:23:00 +00:00 
			
		
		
		
	Expose getters for the detail registry too (#1188)
This commit is contained in:
		| @@ -6,6 +6,8 @@ | ||||
| package dan200.computercraft; | ||||
| 
 | ||||
| import com.google.auto.service.AutoService; | ||||
| import dan200.computercraft.api.detail.BlockReference; | ||||
| import dan200.computercraft.api.detail.DetailRegistry; | ||||
| import dan200.computercraft.api.detail.IDetailProvider; | ||||
| import dan200.computercraft.api.filesystem.IMount; | ||||
| import dan200.computercraft.api.filesystem.IWritableMount; | ||||
| @@ -24,12 +26,16 @@ import dan200.computercraft.core.asm.GenericMethod; | ||||
| import dan200.computercraft.core.filesystem.FileMount; | ||||
| import dan200.computercraft.core.filesystem.ResourceMount; | ||||
| import dan200.computercraft.impl.ComputerCraftAPIService; | ||||
| import dan200.computercraft.impl.detail.DetailRegistryImpl; | ||||
| import dan200.computercraft.shared.*; | ||||
| import dan200.computercraft.shared.computer.core.ServerContext; | ||||
| import dan200.computercraft.shared.peripheral.generic.GenericPeripheralProvider; | ||||
| import dan200.computercraft.shared.peripheral.generic.data.DetailProviders; | ||||
| import dan200.computercraft.shared.peripheral.generic.data.BlockData; | ||||
| import dan200.computercraft.shared.peripheral.generic.data.FluidData; | ||||
| import dan200.computercraft.shared.peripheral.generic.data.ItemData; | ||||
| import dan200.computercraft.shared.peripheral.modem.wireless.WirelessNetwork; | ||||
| import dan200.computercraft.shared.wired.WiredNode; | ||||
| import net.minecraft.item.ItemStack; | ||||
| import net.minecraft.resources.IResourceManager; | ||||
| import net.minecraft.server.MinecraftServer; | ||||
| import net.minecraft.tileentity.TileEntity; | ||||
| @@ -40,6 +46,7 @@ import net.minecraft.world.IBlockReader; | ||||
| import net.minecraft.world.World; | ||||
| import net.minecraftforge.common.capabilities.Capability; | ||||
| import net.minecraftforge.common.util.LazyOptional; | ||||
| import net.minecraftforge.fluids.FluidStack; | ||||
| import net.minecraftforge.fml.ModList; | ||||
| import net.minecraftforge.fml.server.ServerLifecycleHooks; | ||||
| 
 | ||||
| @@ -53,6 +60,10 @@ import static dan200.computercraft.shared.Capabilities.CAPABILITY_WIRED_ELEMENT; | ||||
| @AutoService( ComputerCraftAPIService.class ) | ||||
| public final class ComputerCraftAPIImpl implements ComputerCraftAPIService | ||||
| { | ||||
|     private final DetailRegistry<ItemStack> itemStackDetails = new DetailRegistryImpl<>( ItemData::fillBasic ); | ||||
|     private final DetailRegistry<BlockReference> blockDetails = new DetailRegistryImpl<>( BlockData::fillBasic ); | ||||
|     private final DetailRegistry<FluidStack> fluidStackDetails = new DetailRegistryImpl<>( FluidData::fillBasic ); | ||||
| 
 | ||||
|     private String version; | ||||
| 
 | ||||
|     public static InputStream getResourceFile( MinecraftServer server, String domain, String subPath ) | ||||
| @@ -167,9 +178,26 @@ public final class ComputerCraftAPIImpl implements ComputerCraftAPIService | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     @Deprecated | ||||
|     @SuppressWarnings( "unchecked" ) | ||||
|     public <T> void registerDetailProvider( @Nonnull Class<T> type, @Nonnull IDetailProvider<T> provider ) | ||||
|     { | ||||
|         DetailProviders.registerProvider( type, provider ); | ||||
|         if( type == ItemStack.class ) | ||||
|         { | ||||
|             itemStackDetails.addProvider( (IDetailProvider<ItemStack>) provider ); | ||||
|         } | ||||
|         else if( type == BlockReference.class ) | ||||
|         { | ||||
|             blockDetails.addProvider( (IDetailProvider<BlockReference>) provider ); | ||||
|         } | ||||
|         else if( type == FluidStack.class ) | ||||
|         { | ||||
|             itemStackDetails.addProvider( (IDetailProvider<ItemStack>) provider ); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             throw new IllegalArgumentException( "Unknown detail provider " + type ); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @Nonnull | ||||
| @@ -186,4 +214,22 @@ public final class ComputerCraftAPIImpl implements ComputerCraftAPIService | ||||
|         TileEntity tile = world.getBlockEntity( pos ); | ||||
|         return tile == null ? LazyOptional.empty() : tile.getCapability( CAPABILITY_WIRED_ELEMENT, side ); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public DetailRegistry<ItemStack> getItemStackDetailRegistry() | ||||
|     { | ||||
|         return itemStackDetails; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public DetailRegistry<BlockReference> getBlockInWorldDetailRegistry() | ||||
|     { | ||||
|         return blockDetails; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public DetailRegistry<FluidStack> getFluidStackDetailRegistry() | ||||
|     { | ||||
|         return fluidStackDetails; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -6,6 +6,7 @@ | ||||
| package dan200.computercraft.api; | ||||
| 
 | ||||
| import dan200.computercraft.api.detail.BlockReference; | ||||
| import dan200.computercraft.api.detail.DetailRegistry; | ||||
| import dan200.computercraft.api.detail.IDetailProvider; | ||||
| import dan200.computercraft.api.filesystem.IMount; | ||||
| import dan200.computercraft.api.filesystem.IWritableMount; | ||||
| @@ -234,7 +235,9 @@ public final class ComputerCraftAPI | ||||
|      *                 {@link FluidStack} or {@link ItemStack}. | ||||
|      * @param provider The detail provider to register. | ||||
|      * @param <T>      The type of object that this provider can provide details for. | ||||
|      * @deprecated Use {@link DetailRegistry#addProvider(IDetailProvider)} to register your provider. | ||||
|      */ | ||||
|     @Deprecated | ||||
|     public static <T> void registerDetailProvider( @Nonnull Class<T> type, @Nonnull IDetailProvider<T> provider ) | ||||
|     { | ||||
|         getInstance().registerDetailProvider( type, provider ); | ||||
|   | ||||
| @@ -0,0 +1,32 @@ | ||||
| /* | ||||
|  * This file is part of the public ComputerCraft API - http://www.computercraft.info | ||||
|  * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only. | ||||
|  * For help using the API, and posting your mods, visit the forums at computercraft.info. | ||||
|  */ | ||||
| package dan200.computercraft.api.detail; | ||||
| 
 | ||||
| import dan200.computercraft.impl.ComputerCraftAPIService; | ||||
| import net.minecraft.block.Block; | ||||
| import net.minecraft.item.ItemStack; | ||||
| import net.minecraftforge.fluids.FluidStack; | ||||
| 
 | ||||
| /** | ||||
|  * {@link DetailRegistry}s for built-in Minecraft types. | ||||
|  */ | ||||
| public class DetailRegistries | ||||
| { | ||||
|     /** | ||||
|      * Provides details for {@link ItemStack}s. | ||||
|      */ | ||||
|     public static final DetailRegistry<ItemStack> ITEM_STACK = ComputerCraftAPIService.get().getItemStackDetailRegistry(); | ||||
| 
 | ||||
|     /** | ||||
|      * Provides details for {@link BlockReference}, a reference to a {@link Block} in the world. | ||||
|      */ | ||||
|     public static final DetailRegistry<BlockReference> BLOCK_IN_WORLD = ComputerCraftAPIService.get().getBlockInWorldDetailRegistry(); | ||||
| 
 | ||||
|     /** | ||||
|      * Provides details for {@link FluidStack}. | ||||
|      */ | ||||
|     public static final DetailRegistry<FluidStack> FLUID_STACK = ComputerCraftAPIService.get().getFluidStackDetailRegistry(); | ||||
| } | ||||
| @@ -0,0 +1,49 @@ | ||||
| /* | ||||
|  * This file is part of the public ComputerCraft API - http://www.computercraft.info | ||||
|  * Copyright Daniel Ratcliffe, 2011-2022. This API may be redistributed unmodified and in full only. | ||||
|  * For help using the API, and posting your mods, visit the forums at computercraft.info. | ||||
|  */ | ||||
| package dan200.computercraft.api.detail; | ||||
| 
 | ||||
| import org.jetbrains.annotations.ApiStatus; | ||||
| 
 | ||||
| import java.util.Map; | ||||
| 
 | ||||
| /** | ||||
|  * A registry which provides computer-visible detail about in-game objects such as blocks, items or fluids. | ||||
|  * <p> | ||||
|  * These are used by computer methods such as {@code turtle.getItemDetail()} or {@code turtle.inspect()}. | ||||
|  * <p> | ||||
|  * Specific instances of this registry are available from {@link DetailRegistries} and loader-specific versions | ||||
|  * also in this package. | ||||
|  * | ||||
|  * @param <T> The type of object that this registry provides details for. | ||||
|  */ | ||||
| @ApiStatus.NonExtendable | ||||
| public interface DetailRegistry<T> | ||||
| { | ||||
|     /** | ||||
|      * Registers a detail provider. | ||||
|      * | ||||
|      * @param provider The detail provider to register. | ||||
|      * @see IDetailProvider | ||||
|      */ | ||||
|     void addProvider( IDetailProvider<T> provider ); | ||||
| 
 | ||||
|     /** | ||||
|      * Compute basic details about an object. This is cheaper than computing all details operation, and so is suitable | ||||
|      * for when you need to compute the details for a large number of values. | ||||
|      * | ||||
|      * @param object The object to get details for. | ||||
|      * @return The basic details. | ||||
|      */ | ||||
|     Map<String, Object> getBasicDetails( T object ); | ||||
| 
 | ||||
|     /** | ||||
|      * Compute all details about an object, using {@link #getBasicDetails(Object)} and any registered providers. | ||||
|      * | ||||
|      * @param object The object to get details for. | ||||
|      * @return The computed details. | ||||
|      */ | ||||
|     Map<String, Object> getDetails( T object ); | ||||
| } | ||||
| @@ -9,10 +9,13 @@ import javax.annotation.Nonnull; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| /** | ||||
|  * This interface is used to provide details about a block, fluid, or item. | ||||
|  * Provide details about a block, fluid, or item. | ||||
|  * <p> | ||||
|  * When implementing this interface, be careful to only expose information the player can see through normal gameplay. | ||||
|  * Computers shouldn't break progression or mechanics of other mods. | ||||
|  * | ||||
|  * @param <T> The type of object that this provider can provide details for. | ||||
|  * @see dan200.computercraft.api.ComputerCraftAPI#registerDetailProvider(Class, IDetailProvider) | ||||
|  * @see DetailRegistry | ||||
|  */ | ||||
| @FunctionalInterface | ||||
| public interface IDetailProvider<T> | ||||
| @@ -21,7 +24,7 @@ public interface IDetailProvider<T> | ||||
|      * Provide additional details for the given object. This method is called by functions such as | ||||
|      * {@code turtle.getItemDetail()} and {@code turtle.inspect()}. New properties should be added to the given | ||||
|      * {@link Map}, {@code data}. | ||||
|      * | ||||
|      * <p> | ||||
|      * This method is always called on the server thread, so it is safe to interact with the world here, but you should | ||||
|      * take care to avoid long blocking operations as this will stall the server and other computers. | ||||
|      * | ||||
|   | ||||
| @@ -6,6 +6,8 @@ | ||||
| package dan200.computercraft.impl; | ||||
| 
 | ||||
| import dan200.computercraft.api.ComputerCraftAPI; | ||||
| import dan200.computercraft.api.detail.BlockReference; | ||||
| import dan200.computercraft.api.detail.DetailRegistry; | ||||
| import dan200.computercraft.api.detail.IDetailProvider; | ||||
| import dan200.computercraft.api.filesystem.IMount; | ||||
| import dan200.computercraft.api.filesystem.IWritableMount; | ||||
| @@ -19,12 +21,14 @@ import dan200.computercraft.api.peripheral.IPeripheralProvider; | ||||
| import dan200.computercraft.api.pocket.IPocketUpgrade; | ||||
| import dan200.computercraft.api.redstone.IBundledRedstoneProvider; | ||||
| import dan200.computercraft.api.turtle.ITurtleUpgrade; | ||||
| import net.minecraft.item.ItemStack; | ||||
| import net.minecraft.util.Direction; | ||||
| import net.minecraft.util.math.BlockPos; | ||||
| import net.minecraft.world.IBlockReader; | ||||
| import net.minecraft.world.World; | ||||
| import net.minecraftforge.common.capabilities.Capability; | ||||
| import net.minecraftforge.common.util.LazyOptional; | ||||
| import net.minecraftforge.fluids.FluidStack; | ||||
| import org.jetbrains.annotations.ApiStatus; | ||||
| 
 | ||||
| import javax.annotation.Nonnull; | ||||
| @@ -76,6 +80,7 @@ public interface ComputerCraftAPIService | ||||
| 
 | ||||
|     void registerAPIFactory( @Nonnull ILuaAPIFactory factory ); | ||||
| 
 | ||||
|     @Deprecated | ||||
|     <T> void registerDetailProvider( @Nonnull Class<T> type, @Nonnull IDetailProvider<T> provider ); | ||||
| 
 | ||||
|     @Nonnull | ||||
| @@ -84,6 +89,12 @@ public interface ComputerCraftAPIService | ||||
|     @Nonnull | ||||
|     LazyOptional<IWiredElement> getWiredElementAt( @Nonnull IBlockReader world, @Nonnull BlockPos pos, @Nonnull Direction side ); | ||||
| 
 | ||||
|     DetailRegistry<ItemStack> getItemStackDetailRegistry(); | ||||
| 
 | ||||
|     DetailRegistry<BlockReference> getBlockInWorldDetailRegistry(); | ||||
| 
 | ||||
|     DetailRegistry<FluidStack> getFluidStackDetailRegistry(); | ||||
| 
 | ||||
|     class Instance | ||||
|     { | ||||
|         static final @Nullable ComputerCraftAPIService INSTANCE; | ||||
|   | ||||
| @@ -0,0 +1,55 @@ | ||||
| /* | ||||
|  * This file is part of ComputerCraft - http://www.computercraft.info | ||||
|  * Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission. | ||||
|  * Send enquiries to dratcliffe@gmail.com | ||||
|  */ | ||||
| package dan200.computercraft.impl.detail; | ||||
| 
 | ||||
| import dan200.computercraft.api.detail.DetailRegistry; | ||||
| import dan200.computercraft.api.detail.IDetailProvider; | ||||
| 
 | ||||
| import java.util.*; | ||||
| 
 | ||||
| /** | ||||
|  * Concrete implementation of {@link DetailRegistry}. | ||||
|  * | ||||
|  * @param <T> The type of object that this registry provides details for. | ||||
|  */ | ||||
| public class DetailRegistryImpl<T> implements DetailRegistry<T> | ||||
| { | ||||
|     private final Collection<IDetailProvider<T>> providers = new ArrayList<>(); | ||||
|     private final IDetailProvider<T> basic; | ||||
| 
 | ||||
|     public DetailRegistryImpl( IDetailProvider<T> basic ) | ||||
|     { | ||||
|         this.basic = basic; | ||||
|         providers.add( basic ); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public synchronized void addProvider( IDetailProvider<T> provider ) | ||||
|     { | ||||
|         Objects.requireNonNull( provider, "provider cannot be null" ); | ||||
|         if( !providers.contains( provider ) ) providers.add( provider ); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Map<String, Object> getBasicDetails( T object ) | ||||
|     { | ||||
|         Objects.requireNonNull( object, "object cannot be null" ); | ||||
| 
 | ||||
|         Map<String, Object> map = new HashMap<>( 4 ); | ||||
|         basic.provideDetails( map, object ); | ||||
|         return map; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public Map<String, Object> getDetails( T object ) | ||||
|     { | ||||
|         Objects.requireNonNull( object, "object cannot be null" ); | ||||
| 
 | ||||
|         Map<String, Object> map = new HashMap<>(); | ||||
|         for( IDetailProvider<T> provider : providers ) provider.provideDetails( map, object ); | ||||
|         return map; | ||||
|     } | ||||
| } | ||||
| @@ -7,6 +7,7 @@ package dan200.computercraft.shared; | ||||
| 
 | ||||
| import dan200.computercraft.ComputerCraft; | ||||
| import dan200.computercraft.api.ComputerCraftAPI; | ||||
| import dan200.computercraft.api.detail.DetailRegistries; | ||||
| import dan200.computercraft.api.media.IMedia; | ||||
| import dan200.computercraft.api.network.wired.IWiredElement; | ||||
| import dan200.computercraft.api.peripheral.IPeripheral; | ||||
| @@ -40,6 +41,9 @@ import dan200.computercraft.shared.network.container.HeldItemContainerData; | ||||
| import dan200.computercraft.shared.peripheral.diskdrive.BlockDiskDrive; | ||||
| import dan200.computercraft.shared.peripheral.diskdrive.ContainerDiskDrive; | ||||
| import dan200.computercraft.shared.peripheral.diskdrive.TileDiskDrive; | ||||
| import dan200.computercraft.shared.peripheral.generic.data.BlockData; | ||||
| import dan200.computercraft.shared.peripheral.generic.data.FluidData; | ||||
| import dan200.computercraft.shared.peripheral.generic.data.ItemData; | ||||
| import dan200.computercraft.shared.peripheral.generic.methods.EnergyMethods; | ||||
| import dan200.computercraft.shared.peripheral.generic.methods.FluidMethods; | ||||
| import dan200.computercraft.shared.peripheral.generic.methods.InventoryMethods; | ||||
| @@ -375,6 +379,10 @@ public final class Registry | ||||
|         ComputerCraftAPI.registerGenericCapability( CapabilityEnergy.ENERGY ); | ||||
|         ComputerCraftAPI.registerGenericCapability( CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY ); | ||||
| 
 | ||||
|         DetailRegistries.ITEM_STACK.addProvider( ItemData::fill ); | ||||
|         DetailRegistries.BLOCK_IN_WORLD.addProvider( BlockData::fill ); | ||||
|         DetailRegistries.FLUID_STACK.addProvider( FluidData::fill ); | ||||
| 
 | ||||
|         // Mod integration code. | ||||
|         if( ModList.get().isLoaded( MoreRedIntegration.MOD_ID ) ) MoreRedIntegration.initialise(); | ||||
|     } | ||||
|   | ||||
| @@ -9,9 +9,9 @@ import com.mojang.brigadier.tree.CommandNode; | ||||
| import com.mojang.brigadier.tree.LiteralCommandNode; | ||||
| import dan200.computercraft.ComputerCraft; | ||||
| import dan200.computercraft.api.detail.BlockReference; | ||||
| import dan200.computercraft.api.detail.DetailRegistries; | ||||
| import dan200.computercraft.api.lua.*; | ||||
| import dan200.computercraft.shared.computer.blocks.TileCommandComputer; | ||||
| import dan200.computercraft.shared.peripheral.generic.data.BlockData; | ||||
| import dan200.computercraft.shared.util.NBTUtil; | ||||
| import net.minecraft.command.CommandSource; | ||||
| import net.minecraft.command.Commands; | ||||
| @@ -78,7 +78,7 @@ public class CommandAPI implements ILuaAPI | ||||
|     { | ||||
|         // Get the details of the block | ||||
|         BlockReference block = new BlockReference( world, pos ); | ||||
|         Map<String, Object> table = BlockData.fill( new HashMap<>(), block ); | ||||
|         Map<String, Object> table = DetailRegistries.BLOCK_IN_WORLD.getDetails( block ); | ||||
| 
 | ||||
|         TileEntity tile = block.getBlockEntity(); | ||||
|         if( tile != null ) table.put( "nbt", NBTUtil.toLua( tile.save( new CompoundNBT() ) ) ); | ||||
|   | ||||
| @@ -15,8 +15,7 @@ import java.util.Map; | ||||
| 
 | ||||
| public class BlockData | ||||
| { | ||||
|     @Nonnull | ||||
|     public static <T extends Map<? super String, Object>> T fill( @Nonnull T data, @Nonnull BlockReference block ) | ||||
|     public static void fillBasic( @Nonnull Map<? super String, Object> data, @Nonnull BlockReference block ) | ||||
|     { | ||||
|         BlockState state = block.getState(); | ||||
| 
 | ||||
| @@ -29,11 +28,11 @@ public class BlockData | ||||
|             stateTable.put( property.getName(), getPropertyValue( property, entry.getValue() ) ); | ||||
|         } | ||||
|         data.put( "state", stateTable ); | ||||
|         data.put( "tags", DataHelpers.getTags( state.getBlock().getTags() ) ); | ||||
|     } | ||||
| 
 | ||||
|         DetailProviders.fillData( BlockReference.class, data, block ); | ||||
| 
 | ||||
|         return data; | ||||
|     public static void fill( @Nonnull Map<? super String, Object> data, @Nonnull BlockReference block ) | ||||
|     { | ||||
|         data.put( "tags", DataHelpers.getTags( block.getState().getBlock().getTags() ) ); | ||||
|     } | ||||
| 
 | ||||
|     @SuppressWarnings( { "unchecked", "rawtypes" } ) | ||||
|   | ||||
| @@ -1,43 +0,0 @@ | ||||
| /* | ||||
|  * This file is part of ComputerCraft - http://www.computercraft.info | ||||
|  * Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission. | ||||
|  * Send enquiries to dratcliffe@gmail.com | ||||
|  */ | ||||
| package dan200.computercraft.shared.peripheral.generic.data; | ||||
| 
 | ||||
| import dan200.computercraft.api.detail.BlockReference; | ||||
| import dan200.computercraft.api.detail.IDetailProvider; | ||||
| import net.minecraft.item.ItemStack; | ||||
| import net.minecraftforge.fluids.FluidStack; | ||||
| 
 | ||||
| import java.util.*; | ||||
| 
 | ||||
| public final class DetailProviders | ||||
| { | ||||
|     private static final Map<Class<?>, Collection<IDetailProvider<?>>> allProviders = new HashMap<>(); | ||||
| 
 | ||||
|     public static synchronized <T> void registerProvider( Class<T> type, IDetailProvider<T> provider ) | ||||
|     { | ||||
|         Objects.requireNonNull( type, "type cannot be null" ); | ||||
|         Objects.requireNonNull( provider, "provider cannot be null" ); | ||||
| 
 | ||||
|         if( type != BlockReference.class && type != ItemStack.class && type != FluidStack.class ) | ||||
|         { | ||||
|             throw new IllegalArgumentException( "type must be assignable from BlockReference, ItemStack or FluidStack" ); | ||||
|         } | ||||
| 
 | ||||
|         allProviders.computeIfAbsent( type, k -> new LinkedHashSet<>() ).add( provider ); | ||||
|     } | ||||
| 
 | ||||
|     @SuppressWarnings( "unchecked" ) | ||||
|     public static <T> void fillData( Class<T> type, Map<? super String, Object> data, T value ) | ||||
|     { | ||||
|         Collection<IDetailProvider<T>> providers = (Collection<IDetailProvider<T>>) (Object) allProviders.get( type ); | ||||
|         if( providers == null ) return; | ||||
| 
 | ||||
|         for( IDetailProvider<T> provider : providers ) | ||||
|         { | ||||
|             provider.provideDetails( data, value ); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -12,22 +12,14 @@ import java.util.Map; | ||||
| 
 | ||||
| public class FluidData | ||||
| { | ||||
|     @Nonnull | ||||
|     public static <T extends Map<? super String, Object>> T fillBasic( @Nonnull T data, @Nonnull FluidStack stack ) | ||||
|     public static void fillBasic( @Nonnull Map<? super String, Object> data, @Nonnull FluidStack stack ) | ||||
|     { | ||||
|         data.put( "name", DataHelpers.getId( stack.getFluid() ) ); | ||||
|         data.put( "amount", stack.getAmount() ); | ||||
|         return data; | ||||
|     } | ||||
| 
 | ||||
|     @Nonnull | ||||
|     public static <T extends Map<? super String, Object>> T fill( @Nonnull T data, @Nonnull FluidStack stack ) | ||||
|     public static void fill( @Nonnull Map<? super String, Object> data, @Nonnull FluidStack stack ) | ||||
|     { | ||||
|         fillBasic( data, stack ); | ||||
|         data.put( "tags", DataHelpers.getTags( stack.getFluid().getTags() ) ); | ||||
| 
 | ||||
|         DetailProviders.fillData( FluidStack.class, data, stack ); | ||||
| 
 | ||||
|         return data; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -33,26 +33,18 @@ public class ItemData | ||||
|     { | ||||
|         data.put( "name", DataHelpers.getId( stack.getItem() ) ); | ||||
|         data.put( "count", stack.getCount() ); | ||||
| 
 | ||||
|         return data; | ||||
|     } | ||||
| 
 | ||||
|     @Nonnull | ||||
|     public static <T extends Map<? super String, Object>> T fillBasic( @Nonnull T data, @Nonnull ItemStack stack ) | ||||
|     public static void fillBasic( @Nonnull Map<? super String, Object> data, @Nonnull ItemStack stack ) | ||||
|     { | ||||
|         fillBasicSafe( data, stack ); | ||||
|         String hash = NBTUtil.getNBTHash( stack.getTag() ); | ||||
|         if( hash != null ) data.put( "nbt", hash ); | ||||
|         return data; | ||||
|     } | ||||
| 
 | ||||
|     @Nonnull | ||||
|     public static <T extends Map<? super String, Object>> T fill( @Nonnull T data, @Nonnull ItemStack stack ) | ||||
|     public static void fill( @Nonnull Map<? super String, Object> data, @Nonnull ItemStack stack ) | ||||
|     { | ||||
|         if( stack.isEmpty() ) return data; | ||||
| 
 | ||||
|         fillBasic( data, stack ); | ||||
| 
 | ||||
|         data.put( "displayName", stack.getHoverName().getString() ); | ||||
|         data.put( "maxCount", stack.getMaxStackSize() ); | ||||
| 
 | ||||
| @@ -99,10 +91,6 @@ public class ItemData | ||||
|         { | ||||
|             data.put( "unbreakable", true ); | ||||
|         } | ||||
| 
 | ||||
|         DetailProviders.fillData( ItemStack.class, data, stack ); | ||||
| 
 | ||||
|         return data; | ||||
|     } | ||||
| 
 | ||||
|     @Nullable | ||||
|   | ||||
| @@ -6,13 +6,13 @@ | ||||
| package dan200.computercraft.shared.peripheral.generic.methods; | ||||
| 
 | ||||
| import dan200.computercraft.ComputerCraft; | ||||
| import dan200.computercraft.api.detail.DetailRegistries; | ||||
| import dan200.computercraft.api.lua.LuaException; | ||||
| import dan200.computercraft.api.lua.LuaFunction; | ||||
| import dan200.computercraft.api.peripheral.GenericPeripheral; | ||||
| import dan200.computercraft.api.peripheral.IComputerAccess; | ||||
| import dan200.computercraft.api.peripheral.IPeripheral; | ||||
| import dan200.computercraft.api.peripheral.PeripheralType; | ||||
| import dan200.computercraft.shared.peripheral.generic.data.FluidData; | ||||
| import net.minecraft.fluid.Fluid; | ||||
| import net.minecraft.tileentity.TileEntity; | ||||
| import net.minecraft.util.ResourceLocation; | ||||
| @@ -73,7 +73,7 @@ public class FluidMethods implements GenericPeripheral | ||||
|         for( int i = 0; i < size; i++ ) | ||||
|         { | ||||
|             FluidStack stack = fluids.getFluidInTank( i ); | ||||
|             if( !stack.isEmpty() ) result.put( i + 1, FluidData.fillBasic( new HashMap<>( 4 ), stack ) ); | ||||
|             if( !stack.isEmpty() ) result.put( i + 1, DetailRegistries.FLUID_STACK.getBasicDetails( stack ) ); | ||||
|         } | ||||
| 
 | ||||
|         return result; | ||||
|   | ||||
| @@ -6,13 +6,13 @@ | ||||
| package dan200.computercraft.shared.peripheral.generic.methods; | ||||
| 
 | ||||
| import dan200.computercraft.ComputerCraft; | ||||
| import dan200.computercraft.api.detail.DetailRegistries; | ||||
| import dan200.computercraft.api.lua.LuaException; | ||||
| import dan200.computercraft.api.lua.LuaFunction; | ||||
| import dan200.computercraft.api.peripheral.GenericPeripheral; | ||||
| import dan200.computercraft.api.peripheral.IComputerAccess; | ||||
| import dan200.computercraft.api.peripheral.IPeripheral; | ||||
| import dan200.computercraft.api.peripheral.PeripheralType; | ||||
| import dan200.computercraft.shared.peripheral.generic.data.ItemData; | ||||
| import net.minecraft.inventory.IInventory; | ||||
| import net.minecraft.item.ItemStack; | ||||
| import net.minecraft.tileentity.TileEntity; | ||||
| @@ -96,7 +96,7 @@ public class InventoryMethods implements GenericPeripheral | ||||
|         for( int i = 0; i < size; i++ ) | ||||
|         { | ||||
|             ItemStack stack = inventory.getStackInSlot( i ); | ||||
|             if( !stack.isEmpty() ) result.put( i + 1, ItemData.fillBasic( new HashMap<>( 4 ), stack ) ); | ||||
|             if( !stack.isEmpty() ) result.put( i + 1, DetailRegistries.ITEM_STACK.getBasicDetails( stack ) ); | ||||
|         } | ||||
| 
 | ||||
|         return result; | ||||
| @@ -146,7 +146,7 @@ public class InventoryMethods implements GenericPeripheral | ||||
|         assertBetween( slot, 1, inventory.getSlots(), "Slot out of range (%s)" ); | ||||
| 
 | ||||
|         ItemStack stack = inventory.getStackInSlot( slot - 1 ); | ||||
|         return stack.isEmpty() ? null : ItemData.fill( new HashMap<>(), stack ); | ||||
|         return stack.isEmpty() ? null : DetailRegistries.ITEM_STACK.getDetails( stack ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|   | ||||
| @@ -5,6 +5,7 @@ | ||||
|  */ | ||||
| package dan200.computercraft.shared.turtle.apis; | ||||
| 
 | ||||
| import dan200.computercraft.api.detail.DetailRegistries; | ||||
| import dan200.computercraft.api.lua.*; | ||||
| import dan200.computercraft.api.turtle.ITurtleAccess; | ||||
| import dan200.computercraft.api.turtle.ITurtleCommand; | ||||
| @@ -822,7 +823,7 @@ public class TurtleAPI implements ILuaAPI | ||||
|         if( stack.isEmpty() ) return new Object[] { null }; | ||||
| 
 | ||||
|         Map<String, Object> table = detailed | ||||
|             ? ItemData.fill( new HashMap<>(), stack ) | ||||
|             ? DetailRegistries.ITEM_STACK.getDetails( stack ) | ||||
|             : ItemData.fillBasicSafe( new HashMap<>(), stack ); | ||||
| 
 | ||||
|         TurtleActionEvent event = new TurtleInspectItemEvent( turtle, stack, table, detailed ); | ||||
|   | ||||
| @@ -6,11 +6,11 @@ | ||||
| package dan200.computercraft.shared.turtle.core; | ||||
| 
 | ||||
| import dan200.computercraft.api.detail.BlockReference; | ||||
| import dan200.computercraft.api.detail.DetailRegistries; | ||||
| import dan200.computercraft.api.turtle.ITurtleAccess; | ||||
| import dan200.computercraft.api.turtle.ITurtleCommand; | ||||
| import dan200.computercraft.api.turtle.TurtleCommandResult; | ||||
| import dan200.computercraft.api.turtle.event.TurtleBlockEvent; | ||||
| import dan200.computercraft.shared.peripheral.generic.data.BlockData; | ||||
| import net.minecraft.block.BlockState; | ||||
| import net.minecraft.util.Direction; | ||||
| import net.minecraft.util.math.BlockPos; | ||||
| @@ -18,7 +18,6 @@ import net.minecraft.world.World; | ||||
| import net.minecraftforge.common.MinecraftForge; | ||||
| 
 | ||||
| import javax.annotation.Nonnull; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| public class TurtleInspectCommand implements ITurtleCommand | ||||
| @@ -49,7 +48,7 @@ public class TurtleInspectCommand implements ITurtleCommand | ||||
|             return TurtleCommandResult.failure( "No block to inspect" ); | ||||
|         } | ||||
| 
 | ||||
|         Map<String, Object> table = BlockData.fill( new HashMap<>(), block ); | ||||
|         Map<String, Object> table = DetailRegistries.BLOCK_IN_WORLD.getDetails( block ); | ||||
| 
 | ||||
|         // Fire the event, exiting if it is cancelled | ||||
|         TurtlePlayer turtlePlayer = TurtlePlayer.getWithPosition( turtle, oldPosition, direction ); | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| package dan200.computercraft.ingame | ||||
| 
 | ||||
| import dan200.computercraft.api.ComputerCraftAPI | ||||
| import dan200.computercraft.api.detail.BasicItemDetailProvider | ||||
| import dan200.computercraft.api.detail.DetailRegistries | ||||
| import dan200.computercraft.ingame.api.* | ||||
| import dan200.computercraft.ingame.api.Timeouts.COMPUTER_TIMEOUT | ||||
| import dan200.computercraft.shared.media.items.ItemPrintout | ||||
| @@ -83,8 +83,7 @@ class Turtle_Test { | ||||
|             .thenComputerOk(marker = "initial") | ||||
|             .thenExecute { | ||||
|                 // Register a dummy provider for printout items | ||||
|                 ComputerCraftAPI.registerDetailProvider( | ||||
|                     ItemStack::class.java, | ||||
|                 DetailRegistries.ITEM_STACK.addProvider( | ||||
|                     object : BasicItemDetailProvider<ItemPrintout>("printout", ItemPrintout::class.java) { | ||||
|                         override fun provideDetails(data: MutableMap<in String, Any>, stack: ItemStack, item: ItemPrintout) { | ||||
|                             data["type"] = item.type.toString(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jonathan Coates
					Jonathan Coates