1.14: Updated to Forge 1.14.4-28.0.81/20190719-1.14.3, updated recipe condition processing accordingly (issue #49).

This commit is contained in:
stfwi 2019-09-01 15:41:43 +02:00
parent 0147d9faa1
commit 64186ec813
84 changed files with 274 additions and 245 deletions

View file

@ -2,15 +2,7 @@
org.gradle.daemon=false
org.gradle.jvmargs=-Xmx8G
version_minecraft=1.14.4
version_forge_minecraft=1.14.4-28.0.40
version_forge_minecraft=1.14.4-28.0.81
version_fml_mappings=20190719-1.14.3
version_jei=1.14.4:6.0.0.10
version_engineersdecor=1.0.11-b2
#
# jar signing data loaded from signing.properties in the project root.
#
#signing.keystore_file=
#signing.keystore_alias=
#signing.keystore_pass=
#signing.keystore_keypass=
#fingerprint_sha1.fp_sha1=
version_engineersdecor=1.0.11-b3

View file

@ -1,6 +1,7 @@
{
"homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
"1.14.4": {
"1.0.11-b3": "[U] Updated to Forge 1.14.4-28.0.81/20190719-1.14.3.\n[F] Adapted recipe condition to Forge version (issue #49).",
"1.0.11-b2": "[U] JEI dependency update 1.14.4:6.0.0.10.\n[F] Fixed creative ghost block issue (issue #48).\n[M] Updated ru_ru lang file (Shellyoung, PR#47).",
"1.0.11-b1": "[A] Added Steel Table\n[A] Added Treated Wood Side Table\n[A] Added Exit Sign\n[A] Added Steel Floor Grating\n[M] Sign orientation fixed, only blocked vertical placement.",
"1.0.9-b9": "[U] Update to Forge 1.14.4-28.0.40/20190719-1.14.3 for Forge testing.",
@ -21,6 +22,6 @@
},
"promos": {
"1.14.4-recommended": "",
"1.14.4-latest": "1.0.11-b2"
"1.14.4-latest": "1.0.11-b3"
}
}

View file

@ -10,6 +10,9 @@ Mod sources for Minecraft version 1.14.3.
----
## Version history
- v1.0.11-b3 [U] Updated to Forge 1.14.4-28.0.81/20190719-1.14.3.
[F] Adapted recipe condition to Forge version (issue #49).
- v1.0.11-b2 [U] JEI dependency update 1.14.4:6.0.0.10.
[F] Fixed creative ghost block issue (issue #48).
[M] Updated ru_ru lang file (Shellyoung, PR#47).

View file

@ -1,7 +1,7 @@
package wile.engineersdecor;
import wile.engineersdecor.detail.ModConfig;
import wile.engineersdecor.detail.RecipeCondModSpecific;
import wile.engineersdecor.detail.OptionalRecipeCondition;
import wile.engineersdecor.detail.Networking;
import wile.engineersdecor.blocks.*;
import net.minecraft.client.Minecraft;
@ -33,6 +33,7 @@ import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import wile.engineersdecor.detail.OptionalRecipeCondition.Serializer;
import javax.annotation.Nullable;
@ -64,7 +65,7 @@ public class ModEngineersDecor
private void onSetup(final FMLCommonSetupEvent event)
{
LOGGER.info("Registering recipe condition processor ...");
CraftingHelper.register(new ResourceLocation(MODID, "grc"), new RecipeCondModSpecific());
CraftingHelper.register(Serializer.INSTANCE);
Networking.init();
}

View file

@ -10,7 +10,6 @@
package wile.engineersdecor.blocks;
import wile.engineersdecor.detail.ModAuxiliaries;
import wile.engineersdecor.detail.ModConfig;
import net.minecraft.block.*;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.player.PlayerEntity;

View file

@ -11,7 +11,7 @@ package wile.engineersdecor.blocks;
import wile.engineersdecor.ModContent;
import wile.engineersdecor.ModEngineersDecor;
import wile.engineersdecor.detail.ModConfig;
//import wile.engineersdecor.detail.ModConfig;
import net.minecraft.entity.LivingEntity;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.inventory.ItemStackHelper;
@ -40,15 +40,14 @@ import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.energy.CapabilityEnergy;
import net.minecraftforge.energy.IEnergyStorage;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidTankProperties;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
//import net.minecraftforge.fluids.FluidStack;
//import net.minecraftforge.fluids.capability.IFluidHandler;
//import net.minecraftforge.fluids.capability.IFluidTankProperties;
//import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.*;
@ -466,46 +465,46 @@ public class BlockDecorMineralSmelter extends BlockDecorDirectedHorizontal
// IFluidHandler --------------------------------------------------------------------------------
private LazyOptional<IFluidHandler> fluid_handler_ = LazyOptional.of(() -> (IFluidHandler)new BFluidHandler(this));
// @todo: REPLACE lava=null with whatever will work
private static class BFluidHandler implements IFluidHandler, IFluidTankProperties
{
private final FluidStack lava;
private final BTileEntity te;
private final IFluidTankProperties[] props_ = {this};
BFluidHandler(BTileEntity te) {
this.te = te;
//lava = new FluidStack(ForgeRegistries.FLUIDS.getValue(new ResourceLocation("minecraft:lava")), 1);
// lava = new FluidStack(Blocks.LAVA.getFluidState(Blocks.LAVA.getDefaultState()).getFluid(), 1);
// lava = new FluidStack(Fluids.EMPTY, 1);
//new net.minecraftforge.fluids.FluidStack(net.minecraft.fluid.Fluids.LAVA, 1);
lava=null;
}
@Override @Nullable public FluidStack getContents() { return new FluidStack(lava, te.fluid_level()); }
@Override public IFluidTankProperties[] getTankProperties() { return props_; }
@Override public int fill(FluidStack resource, boolean doFill) { return 0; }
@Override public int getCapacity() { return 1000; }
@Override public boolean canFill() { return false; }
@Override public boolean canDrain() { return true; }
@Override public boolean canFillFluidType(FluidStack fluidStack) { return false; }
@Override public boolean canDrainFluidType(FluidStack fluidStack) { return fluidStack.isFluidEqual(lava); }
@Override @Nullable public FluidStack drain(FluidStack resource, boolean doDrain)
{
if((te.fluid_level() <= 0) || (!resource.isFluidEqual(lava))) return null;
FluidStack fs = getContents();
if(doDrain) te.fluid_level_drain(fs.amount);
return fs;
}
@Override @Nullable public FluidStack drain(int maxDrain, boolean doDrain)
{
if(te.fluid_level() <= 0) return null;
maxDrain = (doDrain) ? (te.fluid_level_drain(maxDrain)) : (Math.min(maxDrain, te.fluid_level()));
return new FluidStack(lava, maxDrain);
}
}
// private LazyOptional<IFluidHandler> fluid_handler_ = LazyOptional.of(() -> (IFluidHandler)new BFluidHandler(this));
//
// // @todo: REPLACE lava=null with whatever will work
// private static class BFluidHandler implements IFluidHandler, IFluidTankProperties
// {
// private final FluidStack lava;
// private final BTileEntity te;
// private final IFluidTankProperties[] props_ = {this};
// BFluidHandler(BTileEntity te) {
// this.te = te;
// //lava = new FluidStack(ForgeRegistries.FLUIDS.getValue(new ResourceLocation("minecraft:lava")), 1);
// // lava = new FluidStack(Blocks.LAVA.getFluidState(Blocks.LAVA.getDefaultState()).getFluid(), 1);
// // lava = new FluidStack(Fluids.EMPTY, 1);
// //new net.minecraftforge.fluids.FluidStack(net.minecraft.fluid.Fluids.LAVA, 1);
//lava=null;
// }
// @Override @Nullable public FluidStack getContents() { return new FluidStack(lava, te.fluid_level()); }
// @Override public IFluidTankProperties[] getTankProperties() { return props_; }
// @Override public int fill(FluidStack resource, boolean doFill) { return 0; }
// @Override public int getCapacity() { return 1000; }
// @Override public boolean canFill() { return false; }
// @Override public boolean canDrain() { return true; }
// @Override public boolean canFillFluidType(FluidStack fluidStack) { return false; }
// @Override public boolean canDrainFluidType(FluidStack fluidStack) { return fluidStack.isFluidEqual(lava); }
//
// @Override @Nullable public FluidStack drain(FluidStack resource, boolean doDrain)
// {
// if((te.fluid_level() <= 0) || (!resource.isFluidEqual(lava))) return null;
// FluidStack fs = getContents();
// if(doDrain) te.fluid_level_drain(fs.amount);
// return fs;
// }
//
// @Override @Nullable public FluidStack drain(int maxDrain, boolean doDrain)
// {
// if(te.fluid_level() <= 0) return null;
// maxDrain = (doDrain) ? (te.fluid_level_drain(maxDrain)) : (Math.min(maxDrain, te.fluid_level()));
// return new FluidStack(lava, maxDrain);
// }
// }
// IEnergyStorage ----------------------------------------------------------------------------

View file

@ -15,7 +15,6 @@ package wile.engineersdecor.blocks;
import wile.engineersdecor.ModContent;
import wile.engineersdecor.detail.ModAuxiliaries;
import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.tileentity.TileEntityType;
@ -23,23 +22,20 @@ import net.minecraft.util.Hand;
import net.minecraft.world.IBlockReader;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidTankProperties;
//import net.minecraftforge.common.util.LazyOptional;
//import net.minecraftforge.common.capabilities.ICapabilityProvider;
//import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
//import net.minecraftforge.fluids.capability.IFluidHandler;
//import net.minecraftforge.fluids.capability.IFluidTankProperties;
import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class BlockDecorPassiveFluidAccumulator extends BlockDecorDirected
@ -97,7 +93,7 @@ public class BlockDecorPassiveFluidAccumulator extends BlockDecorDirected
public void send_device_stats(PlayerEntity player)
{
int t_vol = (tank_==null) ? 0 : (tank_.amount);
int t_vol = (tank_==null) ? 0 : (tank_.getAmount());
ModAuxiliaries.playerChatMessage(player,"" + t_vol + "mB");
}

View file

@ -11,7 +11,6 @@ package wile.engineersdecor.blocks;
import wile.engineersdecor.ModContent;
import wile.engineersdecor.ModEngineersDecor;
import blusunrize.immersiveengineering.api.fluid.IFluidPipe;
import net.minecraft.state.BooleanProperty;
import net.minecraft.world.IWorld;
import net.minecraft.item.BlockItemUseContext;
@ -22,19 +21,18 @@ import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.entity.LivingEntity;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.Direction;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidTankProperties;
import net.minecraftforge.fluids.FluidStack;
//import net.minecraftforge.common.util.LazyOptional;
//import net.minecraftforge.common.capabilities.ICapabilityProvider;
//import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
//import net.minecraftforge.fluids.capability.IFluidHandler;
//import net.minecraftforge.fluids.capability.IFluidTankProperties;
//import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nullable;

View file

@ -10,7 +10,6 @@ package wile.engineersdecor.blocks;
import net.minecraft.util.math.*;
import wile.engineersdecor.detail.ModAuxiliaries;
import wile.engineersdecor.detail.ModConfig;
import net.minecraft.block.*;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.player.PlayerEntity;

View file

@ -0,0 +1,116 @@
/*
* @file OptionalRecipeCondition.java
* @author Stefan Wilhelm (wile)
* @copyright (C) 2018 Stefan Wilhelm
* @license MIT (see https://opensource.org/licenses/MIT)
*
* Recipe condition to enable opt'ing out JSON based recipes.
*/
package wile.engineersdecor.detail;
import wile.engineersdecor.ModEngineersDecor;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.JSONUtils;
import net.minecraftforge.common.crafting.conditions.ICondition;
import net.minecraftforge.common.crafting.conditions.IConditionSerializer;
import net.minecraftforge.registries.IForgeRegistry;
import net.minecraftforge.registries.ForgeRegistries;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class OptionalRecipeCondition implements ICondition
{
private static final ResourceLocation NAME = new ResourceLocation(ModEngineersDecor.MODID, "optional");
private final List<ResourceLocation> all_required;
private final List<ResourceLocation> any_missing;
private final @Nullable ResourceLocation result;
public OptionalRecipeCondition(ResourceLocation result, List<ResourceLocation> required, List<ResourceLocation> missing)
{ all_required = required; any_missing = missing; this.result = result; }
@Override
public ResourceLocation getID()
{ return NAME; }
@Override
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append("Optional recipe, all-required: [");
for(ResourceLocation e:all_required) sb.append(e.toString()).append(",");
sb.delete(sb.length()-1, sb.length()).append("], any-missing: [");
for(ResourceLocation e:any_missing) sb.append(e.toString()).append(",");
sb.delete(sb.length()-1, sb.length()).append("]");
return sb.toString();
}
@Override
public boolean test()
{
final IForgeRegistry<Block> block_registry = ForgeRegistries.BLOCKS;
final IForgeRegistry<Item> item_registry = ForgeRegistries.ITEMS;
if(result != null) {
if((!block_registry.containsKey(result)) && (!item_registry.containsKey(result))) return false; // required result not registered
}
if(!all_required.isEmpty()) {
for(ResourceLocation rl:all_required) {
if((!block_registry.containsKey(rl)) && (!item_registry.containsKey(rl))) return false;
}
}
if(!any_missing.isEmpty()) {
for(ResourceLocation rl:any_missing) {
// At least one item missing, enable this recipe as alternative recipe for another one that check the missing item as required item.
// --> e.g. if IE not installed there is no slag. One recipe requires slag, and another one (for the same result) is used if there
// is no slag.
if((!block_registry.containsKey(rl)) && (!item_registry.containsKey(rl))) return true;
}
return false;
}
return true;
}
public static class Serializer implements IConditionSerializer<OptionalRecipeCondition>
{
public static final Serializer INSTANCE = new Serializer();
@Override
public ResourceLocation getID()
{ return OptionalRecipeCondition.NAME; }
@Override
public void write(JsonObject json, OptionalRecipeCondition condition)
{
JsonArray required = new JsonArray();
JsonArray missing = new JsonArray();
for(ResourceLocation e:condition.all_required) required.add(e.toString());
for(ResourceLocation e:condition.any_missing) missing.add(e.toString());
json.add("required", required);
json.add("missing", missing);
if(condition.result != null) json.addProperty("result", condition.result.toString());
}
@Override
public OptionalRecipeCondition read(JsonObject json)
{
List<ResourceLocation> required = new ArrayList<>();
List<ResourceLocation> missing = new ArrayList<>();
ResourceLocation result = null;
if(json.has("result")) result = new ResourceLocation(json.get("result").getAsString());
if(json.has("required")) {
for(JsonElement e:JSONUtils.getJsonArray(json, "required")) required.add(new ResourceLocation(e.getAsString()));
}
if(json.has("missing")) {
for(JsonElement e:JSONUtils.getJsonArray(json, "missing")) missing.add(new ResourceLocation(e.getAsString()));
}
return new OptionalRecipeCondition(result, required, missing);
}
}
}

View file

@ -1,70 +0,0 @@
/*
* @file RecipeCondRegistered.java
* @author Stefan Wilhelm (wile)
* @copyright (C) 2018 Stefan Wilhelm
* @license MIT (see https://opensource.org/licenses/MIT)
*
* Recipe condition to enable opt'ing out JSON based recipes, referenced
* in assets/engineersdecor/recipes/_factories.json with full path (therefore
* I had to make a separate file for that instead of a few lines in
* ModAuxiliaries).
*/
package wile.engineersdecor.detail;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.crafting.IConditionSerializer;
import net.minecraftforge.registries.IForgeRegistry;
import net.minecraftforge.registries.ForgeRegistries;
import com.google.gson.*;
import javax.annotation.Nullable;
import javax.annotation.Nonnull;
import java.util.function.BooleanSupplier;
public class RecipeCondModSpecific implements IConditionSerializer
{
public static final BooleanSupplier RECIPE_INCLUDE = ()->true;
public static final BooleanSupplier RECIPE_EXCLUDE = ()->false;
@Override
public @Nonnull BooleanSupplier parse(@Nullable JsonObject json) {
try {
if(json==null) return RECIPE_EXCLUDE;
final IForgeRegistry<Block> block_registry = ForgeRegistries.BLOCKS;
final IForgeRegistry<Item> item_registry = ForgeRegistries.ITEMS;
final JsonArray items = json.getAsJsonArray("required");
if(items!=null) {
for(JsonElement e: items) {
if(!e.isJsonPrimitive()) continue;
final ResourceLocation rl = new ResourceLocation(((JsonPrimitive)e).getAsString());
if((!block_registry.containsKey(rl)) && (!item_registry.containsKey(rl))) return RECIPE_EXCLUDE; // required item not registered
}
}
final JsonPrimitive result = json.getAsJsonPrimitive("result");
if(result != null) {
final ResourceLocation rl = new ResourceLocation(result.getAsString());
if((!block_registry.containsKey(rl)) && (!item_registry.containsKey(rl))) return RECIPE_EXCLUDE; // required result not registered
}
final JsonArray missing = json.getAsJsonArray("missing");
if((missing!=null) && (missing.size() > 0)) {
for(JsonElement e: missing) {
if(!e.isJsonPrimitive()) continue;
final ResourceLocation rl = new ResourceLocation(((JsonPrimitive)e).getAsString());
// At least one item missing, enable this recipe as alternative recipe for another one that check the missing item as required item.
// --> e.g. if IE not installed there is no slag. One recipe requires slag, and another one (for the same result) is used if there
// is no slag.
if((!block_registry.containsKey(rl)) && (!item_registry.containsKey(rl))) return RECIPE_INCLUDE;
}
return RECIPE_EXCLUDE; // all required there, but there is no item missing, so another recipe
} else {
return RECIPE_INCLUDE; // no missing given, means include if result and required are all there.
}
} catch(Throwable ex) {
ModAuxiliaries.logError("rsgauges::ResultRegisteredCondition failed: " + ex.toString());
}
return RECIPE_EXCLUDE; // skip on exception.
}
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:factory_dropper",
"missing": ["immersiveengineering:material"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:iron_inset_light",
"missing": ["immersiveengineering:material"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:metal_rung_ladder",
"missing": ["immersiveengineering:material"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:metal_rung_steps",
"missing": ["immersiveengineering:material"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:panzerglass_block",
"missing": ["immersiveengineering:stone_decoration"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:passive_fluid_accumulator",
"required": ["engineersdecor:straight_pipe_valve"],
"missing": ["immersiveengineering:fluid_pipe", "immersiveengineering:mechanical_component"]

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:rebar_concrete",
"missing": ["immersiveengineering:concrete"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:sign_hotwire",
"missing": ["immersiveengineering:material"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:slag_brick_block",
"missing": ["immersiveengineering:material"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:small_electrical_furnace",
"missing": ["immersiveengineering:material"],
"required": ["engineersdecor:small_lab_furnace"]

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:small_lab_furnace",
"missing": ["immersiveengineering:material"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:small_mineral_smelter",
"missing": ["immersiveengineering:metal_device1"],
"required": ["engineersdecor:panzerglass_block"]

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:small_waste_incinerator",
"missing": ["immersiveengineering:material"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:steel_framed_window",
"missing": ["immersiveengineering:material"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:straight_pipe_valve",
"required": ["engineersdecor:thick_steel_pole"],
"missing": ["immersiveengineering:fluid_pipe", "immersiveengineering:mechanical_component"]

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:straight_pipe_valve",
"required": ["engineersdecor:straight_pipe_valve"],
"missing": ["immersiveengineering:redstone_connector"]

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:thin_steel_pole",
"missing": ["immersiveengineering:material"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:treated_wood_crafting_table",
"missing": ["immersiveengineering:material"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:treated_wood_ladder",
"missing": ["immersiveengineering:material"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:treated_wood_pole",
"missing": ["immersiveengineering:material"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:treated_wood_stool",
"missing": ["immersiveengineering:material"],
"required": ["engineersdecor:treated_wood_pole"]

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:treated_wood_table",
"missing": ["immersiveengineering:material"],
"required": ["engineersdecor:treated_wood_pole"]

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:treated_wood_window",
"missing": ["immersiveengineering:material"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:treated_wood_windowsill",
"missing": ["immersiveengineering:material"],
"required": ["engineersdecor:treated_wood_pole"]

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:concrete_halfslab",
"required": ["immersiveengineering:concrete_slab"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:halfslab_clinker_brick",
"required": ["engineersdecor:clinker_brick_slab"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:clinker_brick_block"
}
],

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:clinker_brick_slab",
"required": ["engineersdecor:clinker_brick_block"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:clinker_brick_stained_block",
"required": ["engineersdecor:clinker_brick_block"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:clinker_brick_stained_slab",
"required": ["engineersdecor:clinker_brick_stained_block"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:clinker_brick_stained_stairs",
"required": ["engineersdecor:clinker_brick_stained_block"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:clinker_brick_stairs",
"required": ["engineersdecor:clinker_brick_block"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:clinker_brick_block",
"required": ["engineersdecor:clinker_brick_stairs"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:clinker_brick_wall",
"required": ["engineersdecor:clinker_brick_block"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:clinker_brick_block",
"required": ["engineersdecor:clinker_brick_wall"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:panzerglass_block",
"required": ["engineersdecor:rebar_concrete_tile"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:halfslab_rebar_concrete",
"required": ["engineersdecor:rebar_concrete_slab"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:rebar_concrete_slab",
"required": ["engineersdecor:rebar_concrete"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:rebar_concrete_stairs",
"required": ["engineersdecor:rebar_concrete"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:rebar_concrete",
"required": ["engineersdecor:rebar_concrete_stairs"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:rebar_concrete_tile",
"required": ["engineersdecor:rebar_concrete"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:rebar_concrete",
"required": ["engineersdecor:rebar_concrete_tile"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:rebar_concrete_tile_slab",
"required": ["engineersdecor:rebar_concrete_tile"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:rebar_concrete_tile_stairs",
"required": ["engineersdecor:rebar_concrete_tile"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:rebar_concrete_tile",
"required": ["engineersdecor:rebar_concrete_tile_stairs"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:rebar_concrete_wall",
"required": ["engineersdecor:rebar_concrete"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:rebar_concrete",
"required": ["engineersdecor:rebar_concrete_wall"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:sign_danger",
"required": ["engineersdecor:sign_hotwire"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:sign_defense",
"required": ["engineersdecor:sign_danger"]
}

View file

@ -0,0 +1,16 @@
{
"conditions": [
{
"type": "engineersdecor:optional",
"result": "engineersdecor:sign_exit",
"required": ["engineersdecor:sign_factoryarea"]
}
],
"type": "minecraft:crafting_shapeless",
"ingredients": [
{ "item": "engineersdecor:sign_factoryarea" }
],
"result": {
"item": "engineersdecor:sign_exit"
}
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:sign_factoryarea",
"required": ["engineersdecor:sign_defense"]
}

View file

@ -1,14 +1,14 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:sign_hotwire",
"required": ["engineersdecor:sign_factoryarea"]
"required": ["engineersdecor:sign_exit"]
}
],
"type": "minecraft:crafting_shapeless",
"ingredients": [
{ "item": "engineersdecor:sign_factoryarea" }
{ "item": "engineersdecor:sign_exit" }
],
"result": {
"item": "engineersdecor:sign_hotwire"

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:slag_brick_slab",
"required": ["engineersdecor:slag_brick_block"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:slag_brick_stairs",
"required": ["engineersdecor:slag_brick_block"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:slag_brick_block",
"required": ["engineersdecor:slag_brick_stairs"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:slag_brick_wall",
"required": ["engineersdecor:slag_brick_block"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:slag_brick_block",
"required": ["engineersdecor:slag_brick_wall"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:steel_double_t_support",
"required": ["engineersdecor:thin_steel_pole"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:straight_pipe_valve_redstone_analog",
"required": ["engineersdecor:straight_pipe_valve_redstone"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:straight_pipe_valve_redstone",
"required": ["engineersdecor:straight_pipe_valve_redstone_analog"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:thick_steel_pole_head",
"required": ["engineersdecor:thick_steel_pole"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:thick_steel_pole",
"required": ["engineersdecor:thin_steel_pole"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:thick_steel_pole",
"required": ["engineersdecor:thick_steel_pole_head"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:thin_steel_pole_head",
"required": ["engineersdecor:thin_steel_pole"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:thin_steel_pole",
"required": ["engineersdecor:thin_steel_pole_head"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:treated_wood_pole_head",
"required": ["engineersdecor:treated_wood_pole"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:treated_wood_pole_support",
"required": ["engineersdecor:treated_wood_pole_head"]
}

View file

@ -1,7 +1,7 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"type": "engineersdecor:optional",
"result": "engineersdecor:treated_wood_pole",
"required": ["engineersdecor:treated_wood_pole_support"]
}