diff --git a/.gitignore b/.gitignore index 37de1b5c..46e8b013 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ repo/* *.ipr *.iws out/* +run*.launch # Ignore mac-specific file(s) .DS_Store diff --git a/build.gradle b/build.gradle index 43aaf2f3..f6a94afc 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() maven { name = "forge" - url = "http://files.minecraftforge.net/maven" + url = "https://maven.minecraftforge.net/" } } dependencies { @@ -20,6 +20,7 @@ plugins { apply plugin: 'net.minecraftforge.gradle' apply plugin: 'idea' +apply plugin: 'eclipse' apply plugin: 'maven' loadProperties() @@ -84,6 +85,10 @@ repositories { name "Raoulvdberge Repo" url "https://repo.refinedmods.com/" } + maven { + name "theillusivec4" + url = "https://maven.theillusivec4.top/" + } maven { name = "CurseForge" url = "https://minecraft.curseforge.com/api/maven/" @@ -119,6 +124,8 @@ dependencies { compileOnly fg.deobf("mcjty.theoneprobe:TheOneProbe-1.16:${config.theoneprobe_version}") // https://maven.tterrag.com/mcjty/theoneprobe/ //compile fg.deobf("hwyla:Hwyla-forge-${config.waila_version}") // https://www.curseforge.com/minecraft/mc-mods/hwyla/files/ https://github.com/TehNut/HWYLA and https://github.com/TehNut/temporary-maven-thing/tree/master/maven/mcp/mobius/waila/Hwyla compile fg.deobf("com.refinedmods:refinedstorage:${config.refinedstorage_version}") // https://repo.refinedmods.com/com/raoulvdberge/refinedstorage/ + runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:${config.curios_version}") // https://maven.theillusivec4.top/top/theillusivec4/curios/curios-forge + compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:${config.curios_version}:api") // " } minecraft { diff --git a/build.properties b/build.properties index 448d0d01..6e29b79a 100644 --- a/build.properties +++ b/build.properties @@ -1,6 +1,6 @@ mod_version=1.0.0 minecraft_version=1.16.5 -forge_version=36.0.14 +forge_version=36.2.34 mcp_mappings_channel=snapshot mcp_mappings_version=20201028-1.16.3 cyclopscore_version=1.11.6-64 @@ -18,9 +18,10 @@ tconstruct_version=1.12-2.7.4.37 forestry_version=1.12:5.4.3.129 charset_version=0.4.0-pre10 IC2_version=2.8.7-ex112 -theoneprobe_version=1.16-3.0.0-beta-3 +theoneprobe_version=1.16-3.1.4-22 refinedstorage_version=1.9.9+133 ie_version=0.12-90-521 crafttweakerapi_version=4.1.6.457 crafttweakermain_version=1.12-4.1.6.457 signals_version=1.12.2:1.1.0-2 +curios_version=1.16.5-4.0.8.2 diff --git a/src/main/java/org/cyclops/integrateddynamicscompat/IntegratedDynamicsCompat.java b/src/main/java/org/cyclops/integrateddynamicscompat/IntegratedDynamicsCompat.java index 8dc13105..66c0d411 100644 --- a/src/main/java/org/cyclops/integrateddynamicscompat/IntegratedDynamicsCompat.java +++ b/src/main/java/org/cyclops/integrateddynamicscompat/IntegratedDynamicsCompat.java @@ -18,6 +18,7 @@ import org.cyclops.integrateddynamicscompat.modcompat.capabilities.WorkerDryingBasinTileCompat; import org.cyclops.integrateddynamicscompat.modcompat.capabilities.WorkerMechanicalMachineTileCompat; import org.cyclops.integrateddynamicscompat.modcompat.capabilities.WorkerSqueezerTileCompat; +import org.cyclops.integrateddynamicscompat.modcompat.curios.CuriosModCompat; import org.cyclops.integrateddynamicscompat.modcompat.refinedstorage.RefinedStorageModCompat; import org.cyclops.integrateddynamicscompat.modcompat.top.TopModCompat; import org.cyclops.integrateddynamicscompat.proxy.ClientProxy; @@ -42,6 +43,7 @@ protected void loadModCompats(ModCompatLoader modCompatLoader) { super.loadModCompats(modCompatLoader); modCompatLoader.addModCompat(new TopModCompat()); modCompatLoader.addModCompat(new RefinedStorageModCompat()); + modCompatLoader.addModCompat(new CuriosModCompat()); // TODO: temporarily disable some mod compats // Mod compats // modCompatLoader.addModCompat(new CharsetPipesModCompat()); diff --git a/src/main/java/org/cyclops/integrateddynamicscompat/Reference.java b/src/main/java/org/cyclops/integrateddynamicscompat/Reference.java index 851b0ec2..71ae7d12 100644 --- a/src/main/java/org/cyclops/integrateddynamicscompat/Reference.java +++ b/src/main/java/org/cyclops/integrateddynamicscompat/Reference.java @@ -17,4 +17,5 @@ public class Reference { public static final String MOD_TOP = "theoneprobe"; public static final String MOD_WAILA = "waila"; public static final String MOD_REFINEDSTORAGE = "refinedstorage"; + public static final String MOD_CURIOS = "curios"; } diff --git a/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/CuriosInitializer.java b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/CuriosInitializer.java new file mode 100644 index 00000000..995f1b76 --- /dev/null +++ b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/CuriosInitializer.java @@ -0,0 +1,27 @@ +package org.cyclops.integrateddynamicscompat.modcompat.curios; + +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import org.cyclops.cyclopscore.modcompat.ICompatInitializer; +import org.cyclops.integrateddynamics.core.evaluate.operator.Operators; +import org.cyclops.integrateddynamicscompat.modcompat.curios.operator.CuriosOperators; +import org.cyclops.integrateddynamicscompat.modcompat.curios.variable.CuriosValueTypeListProxyFactories; + +/** + * @author met4000 + */ +public class CuriosInitializer implements ICompatInitializer { + + @Override + public void initialize() { + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); + } + + protected void setup(FMLCommonSetupEvent event) { + CuriosValueTypeListProxyFactories.load(); + + Operators.REGISTRY.register(CuriosOperators.OBJECT_ENTITY_CURIOSINVENTORY); + Operators.REGISTRY.register(CuriosOperators.OBJECT_ENTITY_CURIOSSLOTTYPES); + } + +} diff --git a/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/CuriosModCompat.java b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/CuriosModCompat.java new file mode 100644 index 00000000..44c50cf2 --- /dev/null +++ b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/CuriosModCompat.java @@ -0,0 +1,34 @@ +package org.cyclops.integrateddynamicscompat.modcompat.curios; + +import org.cyclops.cyclopscore.modcompat.ICompatInitializer; +import org.cyclops.cyclopscore.modcompat.IModCompat; +import org.cyclops.integrateddynamicscompat.Reference; + +/** + * Mod compat for the Curios API. + * @author met4000 + * + */ +public class CuriosModCompat implements IModCompat { + + @Override + public String getId() { + return Reference.MOD_CURIOS; + } + + @Override + public boolean isEnabledDefault() { + return true; + } + + @Override + public String getComment() { + return "Curios operators and aspects."; + } + + @Override + public ICompatInitializer createInitializer() { + return new CuriosInitializer(); + } + +} diff --git a/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/helper/L10NValues.java b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/helper/L10NValues.java new file mode 100644 index 00000000..6bfe6dd5 --- /dev/null +++ b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/helper/L10NValues.java @@ -0,0 +1,20 @@ +package org.cyclops.integrateddynamicscompat.modcompat.curios.helper; + +import org.cyclops.integrateddynamics.api.APIReference; +import org.cyclops.integrateddynamicscompat.Reference; + +/** + * L10N entries for curios modcompat. + * @author met4000 + */ +public class L10NValues { + + public static final String LOCAL_NS = Reference.MOD_CURIOS; + public static final String GLOBAL_NS = APIReference.API_OWNER; + + public static final String ERROR_NS = "valuetype." + GLOBAL_NS + ".error." + LOCAL_NS; + public static final String VALUETYPE_ERROR_BADPROXYSTACKSHANDLER = ERROR_NS + ".bad_proxy_stackshandler"; + public static final String VALUETYPE_ERROR_BADPROXYSLOTINDEX = ERROR_NS + ".bad_proxy_slotindex"; + public static final String VALUETYPE_ERROR_BADPROXYVALUE = ERROR_NS + ".bad_proxy_value"; + +} diff --git a/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/operator/CuriosOperators.java b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/operator/CuriosOperators.java new file mode 100644 index 00000000..376022ae --- /dev/null +++ b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/operator/CuriosOperators.java @@ -0,0 +1,54 @@ +package org.cyclops.integrateddynamicscompat.modcompat.curios.operator; + +import java.util.Collections; +import java.util.Optional; +import java.util.function.BiFunction; + +import org.cyclops.integrateddynamics.api.evaluate.operator.IOperator; +import org.cyclops.integrateddynamics.api.evaluate.variable.IValue; +import org.cyclops.integrateddynamics.api.evaluate.variable.IValueType; +import org.cyclops.integrateddynamics.api.evaluate.variable.IValueTypeListProxy; +import org.cyclops.integrateddynamics.core.evaluate.OperatorBuilders; +import org.cyclops.integrateddynamics.core.evaluate.operator.OperatorBase.IFunction; +import org.cyclops.integrateddynamics.core.evaluate.variable.ValueObjectTypeEntity; +import org.cyclops.integrateddynamics.core.evaluate.variable.ValueTypeList; +import org.cyclops.integrateddynamics.core.evaluate.variable.ValueTypes; +import org.cyclops.integrateddynamicscompat.modcompat.curios.variable.ValueTypeListProxyEntityCuriosInventory; +import org.cyclops.integrateddynamicscompat.modcompat.curios.variable.ValueTypeListProxyEntityCuriosSlotTypes; + +import net.minecraft.entity.Entity; +import net.minecraft.world.World; + +/** + * @author met4000 + */ +public class CuriosOperators { + + protected static , V extends IValue> IFunction entityListFunctionFactory(T valueType, BiFunction> proxyFactory) { + return variables -> { + ValueObjectTypeEntity.ValueEntity valueEntity = variables.getValue(0, ValueTypes.OBJECT_ENTITY); + Optional a = valueEntity.getRawValue(); + if (a.isPresent()) { + Entity entity = a.get(); + return ValueTypeList.ValueList.ofFactory(proxyFactory.apply(entity.world, entity)); + } else { + return ValueTypeList.ValueList.ofList(valueType, Collections.emptyList()); + } + }; + } + + /** + * The list of curios itemstacks from an entity + */ + public static final IOperator OBJECT_ENTITY_CURIOSINVENTORY = OperatorBuilders.ENTITY_1_SUFFIX_LONG + .output(ValueTypes.LIST).symbol("curios_inventory").operatorName("curiosinventory") + .function(entityListFunctionFactory(ValueTypes.OBJECT_ITEMSTACK, ValueTypeListProxyEntityCuriosInventory::new)).build(); + + /** + * The list of strings of curios slot types from an entity + */ + public static final IOperator OBJECT_ENTITY_CURIOSSLOTTYPES = OperatorBuilders.ENTITY_1_SUFFIX_LONG + .output(ValueTypes.LIST).symbol("curios_slot_types").operatorName("curiosslottypes") + .function(entityListFunctionFactory(ValueTypes.STRING, ValueTypeListProxyEntityCuriosSlotTypes::new)).build(); + +} diff --git a/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/slot/CuriosSlotProxy.java b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/slot/CuriosSlotProxy.java new file mode 100644 index 00000000..6b22fe1c --- /dev/null +++ b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/slot/CuriosSlotProxy.java @@ -0,0 +1,62 @@ +package org.cyclops.integrateddynamicscompat.modcompat.curios.slot; + +import javax.annotation.Nonnull; + +import org.cyclops.integrateddynamicscompat.proxy.ISlotProxy; + +import net.minecraft.item.ItemStack; +import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler; +import top.theillusivec4.curios.api.type.inventory.IDynamicStackHandler; + +/** + * @author met4000 + */ +public class CuriosSlotProxy implements ISlotProxy { + + protected ICurioStacksHandler curiosStackHandler; + protected int slot; + + public CuriosSlotProxy(@Nonnull ICurioStacksHandler curiosStackHandler, int slot) { + this.curiosStackHandler = curiosStackHandler; + this.slot = slot; + } + + public String getIdentifier() { + return curiosStackHandler.getIdentifier(); + } + + protected IDynamicStackHandler getDynamicStackHandler() { + return curiosStackHandler.getStacks(); + } + + @Override + public ItemStack getStack() { + return getDynamicStackHandler().getStackInSlot(slot); + } + + @Override + public void setStack(ItemStack stack) { + getDynamicStackHandler().setStackInSlot(slot, stack); + } + + @Override + public ItemStack insertItem(ItemStack stack, boolean simulate) { + return getDynamicStackHandler().insertItem(slot, stack, simulate); + } + + @Override + public ItemStack extractItem(int amount, boolean simulate) { + return getDynamicStackHandler().extractItem(slot, amount, simulate); + } + + @Override + public int getSlotLimit() { + return getDynamicStackHandler().getSlotLimit(slot); + } + + @Override + public boolean isItemValid(ItemStack stack) { + return getDynamicStackHandler().isItemValid(slot, stack); + } + +} diff --git a/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/variable/CuriosValueTypeListProxyFactories.java b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/variable/CuriosValueTypeListProxyFactories.java new file mode 100644 index 00000000..1da1d706 --- /dev/null +++ b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/variable/CuriosValueTypeListProxyFactories.java @@ -0,0 +1,21 @@ +package org.cyclops.integrateddynamicscompat.modcompat.curios.variable; + +import org.cyclops.integrateddynamics.Reference; +import org.cyclops.integrateddynamics.core.evaluate.variable.ValueObjectTypeItemStack; +import org.cyclops.integrateddynamics.core.evaluate.variable.ValueTypeListProxyFactories; +import org.cyclops.integrateddynamics.core.evaluate.variable.ValueTypeListProxyNBTFactory; +import org.cyclops.integrateddynamics.core.evaluate.variable.ValueTypeString; + +import net.minecraft.util.ResourceLocation; + +public class CuriosValueTypeListProxyFactories { + public static ValueTypeListProxyNBTFactory ENTITY_CURIOSINVENTORY; + public static ValueTypeListProxyNBTFactory ENTITY_CURIOSSLOTTYPES;; + + public static void load() { + if (ENTITY_CURIOSINVENTORY == null) { + ENTITY_CURIOSINVENTORY = ValueTypeListProxyFactories.REGISTRY.register(new ValueTypeListProxyNBTFactory<>(new ResourceLocation(Reference.MOD_ID, "entity_curios_inventory"), ValueTypeListProxyEntityCuriosInventory.class)); + ENTITY_CURIOSSLOTTYPES = ValueTypeListProxyFactories.REGISTRY.register(new ValueTypeListProxyNBTFactory<>(new ResourceLocation(Reference.MOD_ID, "entity_curios_slot_types"), ValueTypeListProxyEntityCuriosSlotTypes.class)); + } + } +} diff --git a/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/variable/ValueTypeListProxyEntityCuriosInventory.java b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/variable/ValueTypeListProxyEntityCuriosInventory.java new file mode 100644 index 00000000..f2a6a06b --- /dev/null +++ b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/variable/ValueTypeListProxyEntityCuriosInventory.java @@ -0,0 +1,30 @@ +package org.cyclops.integrateddynamicscompat.modcompat.curios.variable; + +import net.minecraft.entity.Entity; +import net.minecraft.world.World; + +import org.cyclops.cyclopscore.persist.nbt.INBTProvider; +import org.cyclops.integrateddynamics.api.evaluate.EvaluationException; +import org.cyclops.integrateddynamics.core.evaluate.variable.ValueObjectTypeItemStack; +import org.cyclops.integrateddynamics.core.evaluate.variable.ValueTypes; + +/** + * A list proxy for the curios inventory of an entity. + * @author met4000 + */ +public class ValueTypeListProxyEntityCuriosInventory extends ValueTypeListProxyEntityCuriosSlotBase implements INBTProvider { + + public ValueTypeListProxyEntityCuriosInventory(World world, Entity entity) { + super(CuriosValueTypeListProxyFactories.ENTITY_CURIOSINVENTORY.getName(), ValueTypes.OBJECT_ITEMSTACK, world, entity); + } + + public ValueTypeListProxyEntityCuriosInventory() { + this(null, null); + } + + @Override + public ValueObjectTypeItemStack.ValueItemStack get(int index) throws EvaluationException { + return ValueObjectTypeItemStack.ValueItemStack.of(getCuriosSlotProxy(index).getStack()); + } + +} diff --git a/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/variable/ValueTypeListProxyEntityCuriosSlotBase.java b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/variable/ValueTypeListProxyEntityCuriosSlotBase.java new file mode 100644 index 00000000..ad51aca4 --- /dev/null +++ b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/variable/ValueTypeListProxyEntityCuriosSlotBase.java @@ -0,0 +1,90 @@ +package org.cyclops.integrateddynamicscompat.modcompat.curios.variable; + +import java.util.Optional; + +import org.cyclops.cyclopscore.persist.nbt.INBTProvider; +import org.cyclops.integrateddynamics.api.evaluate.EvaluationException; +import org.cyclops.integrateddynamics.api.evaluate.variable.IValue; +import org.cyclops.integrateddynamics.api.evaluate.variable.IValueType; +import org.cyclops.integrateddynamics.core.evaluate.variable.ValueTypeListProxyEntityBase; +import org.cyclops.integrateddynamicscompat.modcompat.curios.helper.L10NValues; +import org.cyclops.integrateddynamicscompat.modcompat.curios.slot.CuriosSlotProxy; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.World; +import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; +import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler; + +/** + * @author met4000 + */ +public abstract class ValueTypeListProxyEntityCuriosSlotBase, V extends IValue> extends ValueTypeListProxyEntityBase implements INBTProvider { + + public ValueTypeListProxyEntityCuriosSlotBase(ResourceLocation name, T valueType, World world, Entity entity) { + super(name, valueType, world, entity); + } + + protected Optional getEntityCuriosItemHandler() { + // check entity exists + Entity e = getEntity(); + if (e == null) return Optional.empty(); + + // check entity is a living entity (required for Curios API) + if (!(e instanceof LivingEntity)) return Optional.empty(); + + return CuriosApi.getCuriosHelper().getCuriosHandler((LivingEntity) e).resolve(); // could maybe keep as lazy? + } + + protected Optional getCuriosSlotProxyOptional(int index) throws EvaluationException { + // assuming that `index` is < `getLength()`; does this need to be explicitly checked? + + Optional itemHandlerOptional = getEntityCuriosItemHandler(); + if (!itemHandlerOptional.isPresent()) return Optional.empty(); + ICuriosItemHandler itemHandler = itemHandlerOptional.get(); + + // find the slot offset of the stack handler with the slot we want + // potential race condition, if the curios map is mutated during iteration + int currentGlobalSlot = 0, delta; + ICurioStacksHandler curioStacksHandler = null; + for (ICurioStacksHandler currentCurioStacksHandler : itemHandler.getCurios().values()) { + delta = currentCurioStacksHandler.getSlots(); + if (currentGlobalSlot + delta > index) { + curioStacksHandler = currentCurioStacksHandler; + break; + } + currentGlobalSlot += delta; + } + if (curioStacksHandler == null) + throw new EvaluationException( + new TranslationTextComponent(L10NValues.VALUETYPE_ERROR_BADPROXYSTACKSHANDLER, + String.valueOf(curioStacksHandler))); + + int slotIndex = index - currentGlobalSlot, maxSlotValue = curioStacksHandler.getSlots() - 1; + if (slotIndex > maxSlotValue || slotIndex < 0) + throw new EvaluationException( + new TranslationTextComponent(L10NValues.VALUETYPE_ERROR_BADPROXYSLOTINDEX, + String.valueOf(slotIndex), + String.valueOf(maxSlotValue))); + + return Optional.of(new CuriosSlotProxy(curioStacksHandler, slotIndex)); + } + + protected CuriosSlotProxy getCuriosSlotProxy(int index) throws EvaluationException { + return getCuriosSlotProxyOptional(index).orElseThrow(() -> new EvaluationException( + new TranslationTextComponent(L10NValues.VALUETYPE_ERROR_BADPROXYVALUE, + String.valueOf(index)))); + } + + @Override + public int getLength() { + Optional itemHandlerOptional = getEntityCuriosItemHandler(); + if (!itemHandlerOptional.isPresent()) return 0; + + return itemHandlerOptional.get().getSlots(); + } + +} diff --git a/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/variable/ValueTypeListProxyEntityCuriosSlotTypes.java b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/variable/ValueTypeListProxyEntityCuriosSlotTypes.java new file mode 100644 index 00000000..64106a16 --- /dev/null +++ b/src/main/java/org/cyclops/integrateddynamicscompat/modcompat/curios/variable/ValueTypeListProxyEntityCuriosSlotTypes.java @@ -0,0 +1,30 @@ +package org.cyclops.integrateddynamicscompat.modcompat.curios.variable; + +import net.minecraft.entity.Entity; +import net.minecraft.world.World; + +import org.cyclops.cyclopscore.persist.nbt.INBTProvider; +import org.cyclops.integrateddynamics.api.evaluate.EvaluationException; +import org.cyclops.integrateddynamics.core.evaluate.variable.ValueTypeString; +import org.cyclops.integrateddynamics.core.evaluate.variable.ValueTypes; + +/** + * A list proxy for the curios type of an entity. + * @author met4000 + */ +public class ValueTypeListProxyEntityCuriosSlotTypes extends ValueTypeListProxyEntityCuriosSlotBase implements INBTProvider { + + public ValueTypeListProxyEntityCuriosSlotTypes(World world, Entity entity) { + super(CuriosValueTypeListProxyFactories.ENTITY_CURIOSSLOTTYPES.getName(), ValueTypes.STRING, world, entity); + } + + public ValueTypeListProxyEntityCuriosSlotTypes() { + this(null, null); + } + + @Override + public ValueTypeString.ValueString get(int index) throws EvaluationException { + return ValueTypeString.ValueString.of(getCuriosSlotProxy(index).getIdentifier()); + } + +} diff --git a/src/main/java/org/cyclops/integrateddynamicscompat/proxy/ISlotProxy.java b/src/main/java/org/cyclops/integrateddynamicscompat/proxy/ISlotProxy.java new file mode 100644 index 00000000..9c27aba6 --- /dev/null +++ b/src/main/java/org/cyclops/integrateddynamicscompat/proxy/ISlotProxy.java @@ -0,0 +1,29 @@ +package org.cyclops.integrateddynamicscompat.proxy; + +import javax.annotation.Nonnull; + +import net.minecraft.item.ItemStack; + +/** + * A proxy for a single mutable slot. + * Might duplicate an existing forge interface, but I can't find the javadocs. + * Similar to {@link net.minecraftforge.items.IItemHandlerModifiable}. + * + * @author met4000 + */ +public interface ISlotProxy { + @Nonnull + ItemStack getStack(); + + void setStack(@Nonnull ItemStack stack); + + @Nonnull + ItemStack insertItem(@Nonnull ItemStack stack, boolean simulate); + + @Nonnull + ItemStack extractItem(int amount, boolean simulate); + + int getSlotLimit(); + + boolean isItemValid(@Nonnull ItemStack stack); +} diff --git a/src/main/resources/assets/integrateddynamicscompat/lang/en_us.json b/src/main/resources/assets/integrateddynamicscompat/lang/en_us.json index b5de8a7c..45a9fcc6 100644 --- a/src/main/resources/assets/integrateddynamicscompat/lang/en_us.json +++ b/src/main/resources/assets/integrateddynamicscompat/lang/en_us.json @@ -254,5 +254,18 @@ "aspect.integrateddynamics.write.list.signals.destinations": "Signals Minecart Destinations", "aspect.integrateddynamics.write.list.signals.destinations.info": "Set a new destination list on a minecart.", "aspect.integrateddynamics.write.integer.signals.destindex": "Signals Minecart Destination Index", - "aspect.integrateddynamics.write.integer.signals.destindex.info": "Set the (zero-based) index of a minecart's next destination." + "aspect.integrateddynamics.write.integer.signals.destindex.info": "Set the (zero-based) index of a minecart's next destination.", + + "_comment": "# ----- Curios ----- ##", + + "_comment": "# Value Types", + "valuetype.integrateddynamics.error.curios.bad_proxy_stackshandler": "[Internal Error] Bad curios stacks handler: found '%s'.", + "valuetype.integrateddynamics.error.curios.bad_proxy_slotindex": "[Internal Error] Bad curios slot index: found '%s', expected between '0' and '%s'.", + "valuetype.integrateddynamics.error.curios.bad_proxy_value": "[Internal Error] Bad value from curios proxy at slot '%s'.", + + "_comment": "# Operators", + "operator.integrateddynamics.entity.curiosinventory": "Curios Inventory", + "operator.integrateddynamics.entity.curiosinventory.info": "The list of items the entity is carrying as curios.", + "operator.integrateddynamics.entity.curiosslottypes": "Curios Slot Types", + "operator.integrateddynamics.entity.curiosslottypes.info": "The list of the string type identifiers of the curios slots of the entity." } \ No newline at end of file