From 86d71c693192d2d9c1c222a5e5247ab01bb8b24f Mon Sep 17 00:00:00 2001 From: stfwi Date: Wed, 8 May 2019 21:19:08 +0200 Subject: [PATCH 1/2] Passive fluid accumulator non-experimental. Electrical furnace non-experimental. Fixed version-check URL. Opt-out configs added. --- 1.12/gradle.properties | 2 +- 1.12/meta/update.json | 5 +- 1.12/readme.md | 12 +++-- .../engineersdecor/ModEngineersDecor.java | 2 +- .../blocks/BlockDecorFurnace.java | 8 ++-- .../blocks/BlockDecorFurnaceElectrical.java | 43 +++++++++++++----- .../BlockDecorPassiveFluidAccumulator.java | 16 +++---- .../wile/engineersdecor/blocks/ModBlocks.java | 6 +-- .../wile/engineersdecor/detail/ModConfig.java | 18 +++++++- .../blockstates/small_electrical_furnace.json | 5 +- .../small_electrical_furnace_model.json | 15 +++--- .../small_electrical_furnace_back_lit.png | Bin 0 -> 893 bytes ...all_electrical_furnace_back_lit.png.mcmeta | 1 + .../small_electrical_furnace_front_lit.png | Bin 0 -> 876 bytes ...ll_electrical_furnace_front_lit.png.mcmeta | 1 + .../small_electrical_furnace_gloom_off.png | Bin 184 -> 0 bytes .../small_electrical_furnace_gloom_on.png | Bin 693 -> 0 bytes ...all_electrical_furnace_gloom_on.png.mcmeta | 1 - .../small_electrical_furnace_radiator.png | Bin 0 -> 448 bytes meta/update.json | 5 +- 20 files changed, 93 insertions(+), 47 deletions(-) create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_back_lit.png create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_back_lit.png.mcmeta create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_front_lit.png create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_front_lit.png.mcmeta delete mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_gloom_off.png delete mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_gloom_on.png delete mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_gloom_on.png.mcmeta create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_radiator.png diff --git a/1.12/gradle.properties b/1.12/gradle.properties index 4b6c77f..87dd61a 100644 --- a/1.12/gradle.properties +++ b/1.12/gradle.properties @@ -4,4 +4,4 @@ org.gradle.jvmargs=-Xmx8G version_minecraft=1.12.2 version_forge=14.23.5.2768 version_jei=4.10.0.198 -version_engineersdecor=1.0.4 +version_engineersdecor=1.0.5-b1 diff --git a/1.12/meta/update.json b/1.12/meta/update.json index 15eb6a0..ac6a737 100644 --- a/1.12/meta/update.json +++ b/1.12/meta/update.json @@ -1,7 +1,8 @@ { "homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/", "1.12.2": { - "1.0.4": "[R] Release based on v1.0.3-b9. Release-to-release changes: * Crafting table: Quick crafting history re-fab, JEI integration. * Rendering improvements and issue fixes (stairs, ambient occlusion, optifine, etc). * Walls with texture variations. * Thin/thick steel poles with support feet/heads. * Horizontal steel double-T support beams added. * Fluid pipe valves added: Check valve, redstone controlled valve, analog redstone controlled valve. Support pressuzized transfer. * Tooltip documentation (CTRL-SHIFT) for stairs added. * Internal code cleanups. * Recipes tuned.\n[E] Added pass-through electrical furnace (experimental, see config).", + "1.0.5-b1": "[A] Added passive fluid accumulator.\n[A] Added small electrical passthrough-furnace.\n[F] Fixed version check URL.\n[M] Opt-out config options for valves, passive fluid accumulator, and furni.", + "1.0.4": "[R] Release based on v1.0.4-b9. Release-to-release changes: * Crafting table: Quick crafting history re-fab, JEI integration. * Rendering improvements and issue fixes (stairs, ambient occlusion, optifine, etc). * Walls with texture variations. * Thin/thick steel poles with support feet/heads. * Horizontal steel double-T support beams added. * Fluid pipe valves added: Check valve, redstone controlled valve, analog redstone controlled valve. Support pressurized transfer. * Tool tip documentation (CTRL-SHIFT) for stairs added. * Internal code cleanups. * Recipes tuned.\n[E] Added pass-through electrical furnace (experimental, see config).", "1.0.4-b9": "[F] Inserting fluids with pressurized tag only into IE piping.\n[F] Valve redstone connector rendering does not check for \"can connect redstone\" but only for \"can provide power\".\n[M] Valves are adapted to be detected as pipe by IE.", "1.0.4-b8": "[F] Fixed stairs rendering without smooth light (thanks rastot9).\n[E] Added passive fluid accumulator (experimental feature, see config).", "1.0.4-b7": "[F] Fixed recipe loading issue if IE is not installed.\n[M] Valves support IE pressurized fluid transfer.", @@ -34,6 +35,6 @@ }, "promos": { "1.12.2-recommended": "1.0.4", - "1.12.2-latest": "1.0.4" + "1.12.2-latest": "1.0.5-b1" } } \ No newline at end of file diff --git a/1.12/readme.md b/1.12/readme.md index 6549ddd..bb8a036 100644 --- a/1.12/readme.md +++ b/1.12/readme.md @@ -10,8 +10,14 @@ Mod sources for Minecraft version 1.12.2. ---- ## Revision history + - v1.0.5-b1 [A] Added passive fluid accumulator. + [A] Added small electrical passthrough-furnace. + [F] Fixed version check URL. + [M] Opt-out config options for valves, passive fluid accumulator, + and furni. + ------------------------------------------------------------------- - - v1.0.4 [R] Release based on v1.0.3-b9. Release-to-release changes: + - v1.0.4 [R] Release based on v1.0.4-b9. Release-to-release changes: * Crafting table: Quick crafting history re-fab, JEI integration. * Rendering improvements and issue fixes (stairs, ambient occlusion, optifine, etc). @@ -19,8 +25,8 @@ Mod sources for Minecraft version 1.12.2. * Thin/thick steel poles with support feet/heads. * Horizontal steel double-T support beams added. * Fluid pipe valves added: Check valve, redstone controlled valve, - analog redstone controlled valve. Support pressuzized transfer. - * Tooltip documentation (CTRL-SHIFT) for stairs added. + analog redstone controlled valve. Support pressurized transfer. + * Tool tip documentation (CTRL-SHIFT) for stairs added. * Internal code cleanups. * Recipes tuned. ------------------------------------------------------------------- diff --git a/1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java b/1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java index aad5da8..95b24f5 100644 --- a/1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java +++ b/1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java @@ -48,7 +48,7 @@ import javax.annotation.Nonnull; version = ModEngineersDecor.MODVERSION, dependencies = "required-after:forge@[14.23.5.2768,);before:immersiveengineering", useMetadata = true, - updateJSON = "https://raw.githubusercontent.com/stfwi/engineersdecor/develop/meta/update.json", + updateJSON = "https://raw.githubusercontent.com/stfwi/engineers-decor/develop/meta/update.json", certificateFingerprint = ((ModEngineersDecor.MODFINGERPRINT==("@"+"MOD_SIGNSHA1"+"@")) ? "" : ModEngineersDecor.MODFINGERPRINT) ) @SuppressWarnings({"unused", "ConstantConditions"}) diff --git a/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorFurnace.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorFurnace.java index c5317ca..6bb7c42 100644 --- a/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorFurnace.java +++ b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorFurnace.java @@ -11,7 +11,6 @@ package wile.engineersdecor.blocks; import wile.engineersdecor.ModEngineersDecor; import wile.engineersdecor.detail.ExtItems; -import net.minecraft.stats.StatList; import net.minecraft.block.properties.PropertyBool; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.Block; @@ -41,6 +40,7 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.util.math.MathHelper; import net.minecraft.util.*; +import net.minecraft.stats.StatList; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.energy.IEnergyStorage; @@ -109,9 +109,9 @@ public class BlockDecorFurnace extends BlockDecorDirected NBTTagCompound inventory_nbt = stack.getTagCompound().getCompoundTag("inventory"); if(inventory_nbt.isEmpty()) return; final TileEntity te = world.getTileEntity(pos); - if(!(te instanceof BTileEntity)) return; - ((BTileEntity)te).readnbt(inventory_nbt); - ((BTileEntity)te).markDirty(); + if(!(te instanceof BlockDecorFurnace.BTileEntity)) return; + ((BlockDecorFurnace.BTileEntity)te).readnbt(inventory_nbt); + ((BlockDecorFurnace.BTileEntity)te).markDirty(); } @Override diff --git a/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorFurnaceElectrical.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorFurnaceElectrical.java index 92c9694..65a73cf 100644 --- a/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorFurnaceElectrical.java +++ b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorFurnaceElectrical.java @@ -4,20 +4,20 @@ * @copyright (C) 2019 Stefan Wilhelm * @license MIT (see https://opensource.org/licenses/MIT) * - * ED electrical furnace. + * ED small electrical pass-through furnace. */ package wile.engineersdecor.blocks; import wile.engineersdecor.ModEngineersDecor; -import net.minecraft.stats.StatList; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.world.World; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.tileentity.TileEntity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.init.Items; @@ -29,6 +29,7 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.*; +import net.minecraft.stats.StatList; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.energy.IEnergyStorage; @@ -62,6 +63,20 @@ public class BlockDecorFurnaceElectrical extends BlockDecorFurnace return true; } + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) + { + world.setBlockState(pos, state.withProperty(LIT, false)); + if(world.isRemote) return; + if((!stack.hasTagCompound()) || (!stack.getTagCompound().hasKey("inventory"))) return; + NBTTagCompound inventory_nbt = stack.getTagCompound().getCompoundTag("inventory"); + if(inventory_nbt.isEmpty()) return; + final TileEntity te = world.getTileEntity(pos); + if(!(te instanceof BlockDecorFurnaceElectrical.BTileEntity)) return; + ((BlockDecorFurnaceElectrical.BTileEntity)te).readnbt(inventory_nbt); + ((BlockDecorFurnaceElectrical.BTileEntity)te).markDirty(); + } + @Override @SideOnly(Side.CLIENT) public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rnd) @@ -382,7 +397,7 @@ public class BlockDecorFurnaceElectrical extends BlockDecorFurnace { return 7; } public boolean isBurning() - { return burntime_left_ > 0; } + { return (burntime_left_ > 0); } private boolean transferItems(final int index_from, final int index_to, int count) { @@ -622,6 +637,14 @@ public class BlockDecorFurnaceElectrical extends BlockDecorFurnace return true; } + private void sync_blockstate() + { + final IBlockState state = world.getBlockState(pos); + if((state.getBlock() instanceof BlockDecorFurnaceElectrical) && (state.getValue(LIT) != isBurning())) { + world.setBlockState(pos, state.withProperty(LIT, isBurning()), 2); + } + } + @Override public void update() { @@ -631,7 +654,8 @@ public class BlockDecorFurnaceElectrical extends BlockDecorFurnace if(was_burning) burntime_left_ -= TICK_INTERVAL; if(burntime_left_ < 0) burntime_left_ = 0; if(world.isRemote) return; - boolean dirty = false; + boolean update_blockstate = (was_burning != isBurning()); + boolean dirty = update_blockstate; boolean shift_in = false; boolean shift_out = false; if(--fifo_timer_ <= 0) { @@ -649,7 +673,7 @@ public class BlockDecorFurnaceElectrical extends BlockDecorFurnace } else { // smelt if(!isBurning() && can_smelt) { - if(heat_up()) dirty = true; + if(heat_up()) { dirty = true; update_blockstate = true; } } if(isBurning() && can_smelt) { if(heat_up()) dirty = true; @@ -667,14 +691,11 @@ public class BlockDecorFurnaceElectrical extends BlockDecorFurnace } } else if(proc_time_elapsed_ > 0) { proc_time_elapsed_ -= ((stacks_.get(SMELTING_INPUT_SLOT_NO)).isEmpty() ? 20 : 1); - if(proc_time_elapsed_ < 0) { proc_time_elapsed_ = 0; shift_out = true; } + if(proc_time_elapsed_ < 0) { proc_time_elapsed_ = 0; shift_out = true; update_blockstate = true; } } - if(was_burning != isBurning()) { + if(update_blockstate) { dirty = true; - final IBlockState state = world.getBlockState(pos); - if(state.getBlock() instanceof BlockDecorFurnace) { - world.setBlockState(pos, state.withProperty(LIT, isBurning())); - } + sync_blockstate(); } if(adjacent_inventory_shift(shift_in, shift_out)) dirty = true; if(dirty) markDirty(); diff --git a/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorPassiveFluidAccumulator.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorPassiveFluidAccumulator.java index 5bfd95b..e8f565c 100644 --- a/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorPassiveFluidAccumulator.java +++ b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorPassiveFluidAccumulator.java @@ -15,8 +15,6 @@ package wile.engineersdecor.blocks; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.EnumHand; -import net.minecraftforge.fml.common.gameevent.PlayerEvent; -import wile.engineersdecor.ModEngineersDecor; import wile.engineersdecor.detail.ModAuxiliaries; import net.minecraft.block.Block; import net.minecraft.block.SoundType; @@ -41,7 +39,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -public class BlockDecorPassiveFluidAccumulator extends BlockDecorDirected implements ModAuxiliaries.IExperimentalFeature +public class BlockDecorPassiveFluidAccumulator extends BlockDecorDirected { public BlockDecorPassiveFluidAccumulator(@Nonnull String registryName, long config, @Nullable Material material, float hardness, float resistance, @Nullable SoundType sound, @Nonnull AxisAlignedBB unrotatedAABB) { super(registryName, config, material, hardness, resistance, sound, unrotatedAABB); } @@ -59,7 +57,7 @@ public class BlockDecorPassiveFluidAccumulator extends BlockDecorDirected implem if(world.isRemote) return true; TileEntity te = world.getTileEntity(pos); if(!(te instanceof BTileEntity)) return true; - ((BTileEntity)te).debug_info_dump(player); + ((BTileEntity)te).send_device_stats(player); return true; } @@ -70,7 +68,7 @@ public class BlockDecorPassiveFluidAccumulator extends BlockDecorDirected implem // Tile entity //-------------------------------------------------------------------------------------------------------------------- - public static class BTileEntity extends TileEntity implements IFluidHandler, IFluidTankProperties, ICapabilityProvider, ITickable, ModAuxiliaries.IExperimentalFeature + public static class BTileEntity extends TileEntity implements IFluidHandler, IFluidTankProperties, ICapabilityProvider, ITickable { protected static int tick_idle_interval = 20; // ca 1000ms, simulates suction delay and saves CPU when not drained. protected static int max_flowrate = 1000; @@ -83,15 +81,13 @@ public class BlockDecorPassiveFluidAccumulator extends BlockDecorDirected implem private int tick_timer_ = 0; private int round_robin_ = 0; private boolean initialized_ = false; - - private int total_volume_filled_ = 0; private int total_volume_drained_ = 0; - @Deprecated - public void debug_info_dump(EntityPlayer player) + + public void send_device_stats(EntityPlayer player) { int t_vol = (tank_==null) ? 0 : (tank_.amount); - ModAuxiliaries.playerChatMessage(player,"pfacc I:" + total_volume_filled_ + " O:" + total_volume_drained_ + " B:" + t_vol); + ModAuxiliaries.playerChatMessage(player,"" + t_vol + "mB"); } public void block_changed() diff --git a/1.12/src/main/java/wile/engineersdecor/blocks/ModBlocks.java b/1.12/src/main/java/wile/engineersdecor/blocks/ModBlocks.java index ee7d7d8..ec63845 100644 --- a/1.12/src/main/java/wile/engineersdecor/blocks/ModBlocks.java +++ b/1.12/src/main/java/wile/engineersdecor/blocks/ModBlocks.java @@ -285,12 +285,12 @@ public class ModBlocks THIN_STEEL_POLE_HEAD, THICK_STEEL_POLE_HEAD, STEEL_DOUBLE_T_SUPPORT, - STRAIGHT_CHECK_VALVE, STRAIGHT_REDSTONE_VALVE, STRAIGHT_REDSTONE_ANALOG_VALVE, STRAIGHT_PIPE_VALVE_TEI + STRAIGHT_CHECK_VALVE, STRAIGHT_REDSTONE_VALVE, STRAIGHT_REDSTONE_ANALOG_VALVE, STRAIGHT_PIPE_VALVE_TEI, + PASSIVE_FLUID_ACCUMULATOR, PASSIVE_FLUID_ACCUMULATOR_TEI, + SMALL_ELECTRICAL_FURNACE, SMALL_ELECTRICAL_FURNACE_TEI }; private static final Object dev_content[] = { - PASSIVE_FLUID_ACCUMULATOR, PASSIVE_FLUID_ACCUMULATOR_TEI, - SMALL_ELECTRICAL_FURNACE, SMALL_ELECTRICAL_FURNACE_TEI }; //-------------------------------------------------------------------------------------------------------------------- diff --git a/1.12/src/main/java/wile/engineersdecor/detail/ModConfig.java b/1.12/src/main/java/wile/engineersdecor/detail/ModConfig.java index d892d79..1e901f6 100644 --- a/1.12/src/main/java/wile/engineersdecor/detail/ModConfig.java +++ b/1.12/src/main/java/wile/engineersdecor/detail/ModConfig.java @@ -75,6 +75,11 @@ public class ModConfig @Config.RequiresMcRestart public boolean without_lab_furnace = false; + @Config.Comment({"Disable small electrical pass-through furnace."}) + @Config.Name("Without electrical furnace") + @Config.RequiresMcRestart + public boolean without_electrical_furnace = false; + @Config.Comment({"Disable treated wood table, stool, windowsill, pole, etc."}) @Config.Name("Without tr. wood furniture") @Config.RequiresMcRestart @@ -110,6 +115,14 @@ public class ModConfig @Config.Comment({"Disable history refabrication feature of the treated wood crafting table."}) @Config.Name("Without crafting table history") public boolean without_crafting_table_history = false; + + @Config.Comment({"Disable check valve, and redstone controlled valves."}) + @Config.Name("Without valves") + public boolean without_valves = false; + + @Config.Comment({"Disable the passive fluid accumulator."}) + @Config.Name("Without fluid accumulator") + public boolean without_passive_fluid_accumulator = false; } @Config.Comment({ @@ -276,12 +289,15 @@ public class ModConfig if(optout.without_ie_concrete_wall && rn.startsWith("concrete_wall")) return true; if(optout.without_panzer_glass && rn.startsWith("panzerglass_")) return true; if(optout.without_crafting_table && (block instanceof BlockDecorCraftingTable)) return true; - if(optout.without_lab_furnace && (block instanceof BlockDecorFurnace)) return true; + if(optout.without_lab_furnace && ((block instanceof BlockDecorFurnace)) && (!(block instanceof BlockDecorFurnaceElectrical))) return true; + if(optout.without_electrical_furnace && (block instanceof BlockDecorFurnaceElectrical)) return true; + if(optout.without_passive_fluid_accumulator && (block instanceof BlockDecorPassiveFluidAccumulator)) return true; if(optout.without_windows && rn.endsWith("_window")) return true; if(optout.without_light_sources && rn.endsWith("_light")) return true; if(optout.without_ladders && (block instanceof BlockDecorLadder)) return true; if(optout.without_walls && rn.endsWith("_wall")) return true; if(optout.without_stairs && rn.endsWith("_stairs")) return true; + if(optout.without_valves && rn.contains("_pipe_valve")) return true; if(optout.without_treated_wood_furniture) { if(block instanceof BlockDecorChair) return true; if(rn.equals("treated_wood_pole")) return true; diff --git a/1.12/src/main/resources/assets/engineersdecor/blockstates/small_electrical_furnace.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/small_electrical_furnace.json index 75fc6ec..f0c937f 100644 --- a/1.12/src/main/resources/assets/engineersdecor/blockstates/small_electrical_furnace.json +++ b/1.12/src/main/resources/assets/engineersdecor/blockstates/small_electrical_furnace.json @@ -7,6 +7,9 @@ "normal": [{}], "inventory": [{}], "facing": { "north": {"y":0}, "south": {"y":180}, "west": {"y":-90}, "east": {"y":90}, "up":{}, "down":{} }, - "lit": { "false":{ "textures":{ "gloom": "engineersdecor:blocks/furnace/small_electrical_furnace_gloom_off" } }, "true":{}} + "lit": { "false":{}, "true":{ "textures": { + "front": "engineersdecor:blocks/furnace/small_electrical_furnace_front_lit", + "back": "engineersdecor:blocks/furnace/small_electrical_furnace_back_lit" + }}} } } diff --git a/1.12/src/main/resources/assets/engineersdecor/models/block/furnace/small_electrical_furnace_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/furnace/small_electrical_furnace_model.json index f28842c..f72e9d6 100644 --- a/1.12/src/main/resources/assets/engineersdecor/models/block/furnace/small_electrical_furnace_model.json +++ b/1.12/src/main/resources/assets/engineersdecor/models/block/furnace/small_electrical_furnace_model.json @@ -7,7 +7,8 @@ "left": "engineersdecor:blocks/furnace/small_electrical_furnace_left", "right": "engineersdecor:blocks/furnace/small_electrical_furnace_right", "front": "engineersdecor:blocks/furnace/small_electrical_furnace_front", - "back": "engineersdecor:blocks/furnace/small_electrical_furnace_back" + "back": "engineersdecor:blocks/furnace/small_electrical_furnace_back", + "radiator": "engineersdecor:blocks/furnace/small_electrical_furnace_radiator" }, "elements": [ { @@ -15,9 +16,9 @@ "to": [13.75, 17, 15], "rotation": {"angle": 45, "axis": "z", "origin": [15.5, 13.5, 8]}, "faces": { - "north": {"uv": [0, 0, 1, 5.5], "texture": "#front"}, - "east": {"uv": [0, 1, 5, 15], "rotation": 90, "texture": "#top"}, - "south": {"uv": [0, 0, 1, 5.5], "texture": "#back"} + "north": {"uv": [0, 0, 1, 5.5], "texture": "#radiator"}, + "east": {"uv": [0, 1, 5, 15], "rotation": 90, "texture": "#radiator"}, + "south": {"uv": [0, 0, 1, 5.5], "texture": "#radiator"} } }, { @@ -25,9 +26,9 @@ "to": [3.25, 17, 15], "rotation": {"angle": -45, "axis": "z", "origin": [0.5, 13.5, 8]}, "faces": { - "north": {"uv": [0, 0, 1, 5.5], "texture": "#front"}, - "south": {"uv": [0, 0, 1, 5.5], "texture": "#back"}, - "west": {"uv": [0, 1, 5, 15], "rotation": 270, "texture": "#top"} + "north": {"uv": [0, 0, 1, 5.5], "texture": "#radiator"}, + "south": {"uv": [0, 0, 1, 5.5], "texture": "#radiator"}, + "west": {"uv": [11, 1, 16, 15], "rotation": 270, "texture": "#radiator"} } }, { diff --git a/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_back_lit.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_back_lit.png new file mode 100644 index 0000000000000000000000000000000000000000..e1a73d3c5e23ccf0a9d7cc1e3b590e2d39a40950 GIT binary patch literal 893 zcmV-@1A_dCP)$Nbsg*V8dYVrTCv;hrvE7=03vU!<#Nfz#RYxeQ)?y0$YQZzx7#5i zgb;9dR23Bwj-R`eb0&m92!TJZey05J6CyHti_iXAYoienK~)JMOrBJgS}PBK{Lbg! zennLQSS%LA7$=9VHS}mvL|7~qwAK(2%#3f>zwo`^Oa=hX&(Dc5(pnpx9;J0%M=1q& zXS>~!bEcFs<>3DQ9)Maaecw+ZL{;VN>}-;qbEW~RO3oRp6%iqK9bPNB>!3kOiS>F- z6cI#~o12?2s&NeG81KvV>C=yYFQagK`$;A+ySs@8ec!*!gQLO^9{fLf zV5JaboJs*4(6R4{DRJ>nJQxo(lxOb_>`TGFh6gE(J+G=rYtS6?MmwlE$%8&8l2^W& zXIuj@1hT;6ZpY(b?93UrKJ!3d@<6=ON2OF}vmbCXsu_Jy<}tjQ)HiuBo6YcQ?A>vM zO>GQTQ2}!(65i)Qe|~wA2l;~sA3XTac~DAutGc9=$T_oGeZ~7g57&B7p>beBt!TCP zc>s`AIZJ^Y##?%8&eke2-Ond@Fv}UYfn}HYZk|c;I6ThX-gp>{M{lR!2WEv{m047( z2AV`#8wY2o&d!{8Y~zzWD23a7<)IZcG-|Em{5w1~A!|I%gT>|h?}Pcj!Gpg5)-q7} TCf^ap00000NkvXXu0mjfg|(a3 literal 0 HcmV?d00001 diff --git a/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_back_lit.png.mcmeta b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_back_lit.png.mcmeta new file mode 100644 index 0000000..e82fabf --- /dev/null +++ b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_back_lit.png.mcmeta @@ -0,0 +1 @@ +{ "animation":{ "frames": [0,1,2], "frametime":16, "interpolate":true }} \ No newline at end of file diff --git a/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_front_lit.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_front_lit.png new file mode 100644 index 0000000000000000000000000000000000000000..850b21d86c9df48dbe469b6106e3ea3b3f2b53b8 GIT binary patch literal 876 zcmV-y1C#uTP)HD6$yE`I+^Ye3tVPL=CFYCiF5D}Oe8KAX>s$ymU>~=d;mDU;;7Z;4< z$iu?}x3{;52qMBf)Xa#8WucU^T>tRx4c~wLBPk_PN~~6^CE2`30aO)LrIf;Evtge5 z<+kzDuLEX=siN{L|@aQ8*YIF8g>$!5ms=_y^;VP>S1@Cd9mQc6Sw0GsU=H^U?7a!1aY z!{IO~$X&HK%-lzJ zXTHhv>jUUlE4)??7K{X8Mzab`(yL5vb$4>ktX3bj28w|F2gGRct%9)XYbZ65SV$*QPMByxAU2+RYEI3B`Rc(5)VSffwMy6-4C(W~(E zJTRK`G&ZKQ`H2Vla~>2C`Xmgs(Wzh&th4^1iLdftyO5yD6Z~Pym*@de3BnLM`k00Pyc>vHSWs?&n30ak=Y7EV& zOBt{7pb%|jS28L>pOtk^th2JO%5T*eiPw41T4kN4hx*d7Z_W?`9#}w&AglZ}53E)` zj*Tu9Qet17aKS@(4y9;*od+jh{h0^6;KBCa;KA>AVW<3+`8(+V0000;t4gcSDc+Qt_bDn3ifd%#x5 z#54csE*+OQA`YUHPWY%?j!J&>*LuTS>8YNwOspIYEU*4Fr3r_69B<#&!I6{vTjs^( d$NQD{F=p_{zuxql$r@-YgQu&X%Q~loCIIb@K0yEg diff --git a/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_gloom_on.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_gloom_on.png deleted file mode 100644 index 02da0360fe33acdd23c7f887409f9b706e6c3f4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 693 zcmV;m0!safP)h649aa%+62aP!(pEtsjg}G%ksyf1T<#-oF8j_{>_#MlyWk-f@0RZ_&rUJ>Fuz$j zySU{1#ijh^l>iAa5+5Aw*oLVdo1-q0wlo5d>|mAh$!X`2q7r$R?i2Q z7jwqvPjK}3N#sZy@_l0Vm6gZu>iOW&+a@9%j5pv8?mw$aK1hHB_~$-AK)|h-ghM0X zKx?vH{W)JdKSQH6L1-#@Ho&r79B1`atgZlH^>rU)fSG|AZicEN8fy5UJ)im@0TN&| zKKO>}!Bp;8jOBa~K!ny*l@G*OzIYl5O=7mou(yp59h%DOi=8??5LTYO2NbgirIAFn zuvDcFX68~KBtQa;!Uw%>=>u1ABbp(A9{8X#FCg5!vV?n+ILyiSGQC^`akN_j`LBEHJfCE@D zvAYpMz^OAIxN-OPGG>vy|A}E|gZ-UNoXCUcyEW&75DFi}94{-7a(_^nSkiou00}TE zAM|!mQNWA55c6O1g4X-LaO?U7@@&9x`y<)bCh>b89Sb~MAFG=eifmvp2XovVQBZCC bhk4-#zUdTDfe9UT00000NkvXXu0mjf1t2%c diff --git a/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_gloom_on.png.mcmeta b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_gloom_on.png.mcmeta deleted file mode 100644 index e745021..0000000 --- a/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_gloom_on.png.mcmeta +++ /dev/null @@ -1 +0,0 @@ -{ "animation":{ "frames": [0,1,2,3,4,5,6,7], "frametime":8, "interpolate":true }} \ No newline at end of file diff --git a/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_radiator.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_electrical_furnace_radiator.png new file mode 100644 index 0000000000000000000000000000000000000000..d54c0994f9125a8a8b56f5e3b3b080c73fafb302 GIT binary patch literal 448 zcmV;x0YCnUP)i@X7>Nj z8X$toxT@UTv zOQ!v1Ai*#>}QEjL*f?lzugUE8I6J|8?O423b Date: Sun, 12 May 2019 17:54:04 +0200 Subject: [PATCH 2/2] Signs added. Experimental waste incinerator added. --- 1.12/gradle.properties | 2 +- 1.12/meta/update.json | 5 +- 1.12/readme.md | 11 + .../engineersdecor/ModEngineersDecor.java | 3 + .../blocks/BlockDecorPipeValve.java | 1 - .../blocks/BlockDecorWasteIncinerator.java | 691 ++++++++++++++++++ .../wile/engineersdecor/blocks/ModBlocks.java | 36 +- .../blockstates/sign_danger.json | 9 + .../blockstates/sign_hotwire.json | 9 + .../blockstates/sign_mindstep.json | 9 + .../blockstates/small_waste_incinerator.json | 11 + .../assets/engineersdecor/lang/en_us.lang | 12 + .../assets/engineersdecor/lang/ru_ru.lang | 12 + .../small_waste_incinerator_model.json | 35 + .../models/block/sign/sign_danger_model.json | 4 + .../models/block/sign/sign_hotwire_model.json | 4 + .../block/sign/sign_mindstep_model.json | 4 + .../block/sign/sign_triangular_model.json | 191 +++++ .../stairs/decor_inner_stairs_model.json | 1 - .../stairs/decor_outer_stairs_model.json | 1 - .../stairs/decor_straight_stairs_model.json | 1 - .../engineersdecor/recipes/_constants.json | 8 + .../recipes/sign_danger_recipe.json | 16 + .../recipes/sign_hotwire_recipe.json | 23 + .../sign_hotwire_recipe_backcycle.json | 16 + .../small_waste_incinerator_recipe.json | 33 + .../small_waste_incinerator_bottom.png | Bin 0 -> 587 bytes .../furnace/small_waste_incinerator_side.png | Bin 0 -> 845 bytes .../small_waste_incinerator_side.png.mcmeta | 1 + .../furnace/small_waste_incinerator_top.png | Bin 0 -> 581 bytes .../blocks/sign/sign_danger_texture.png | Bin 0 -> 1280 bytes .../blocks/sign/sign_hotwire_texture.png | Bin 0 -> 1138 bytes .../blocks/sign/sign_mindstep_texture.png | Bin 0 -> 1786 bytes .../gui/small_waste_incinerator_gui.png | Bin 0 -> 23196 bytes meta/update.json | 5 +- readme.md | 33 +- 36 files changed, 1174 insertions(+), 13 deletions(-) create mode 100644 1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorWasteIncinerator.java create mode 100644 1.12/src/main/resources/assets/engineersdecor/blockstates/sign_danger.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/blockstates/sign_hotwire.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/blockstates/sign_mindstep.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/blockstates/small_waste_incinerator.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/models/block/furnace/small_waste_incinerator_model.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/models/block/sign/sign_danger_model.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/models/block/sign/sign_hotwire_model.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/models/block/sign/sign_mindstep_model.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/models/block/sign/sign_triangular_model.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/recipes/sign_danger_recipe.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/recipes/sign_hotwire_recipe.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/recipes/sign_hotwire_recipe_backcycle.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/recipes/small_waste_incinerator_recipe.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_waste_incinerator_bottom.png create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_waste_incinerator_side.png create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_waste_incinerator_side.png.mcmeta create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_waste_incinerator_top.png create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/sign/sign_danger_texture.png create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/sign/sign_hotwire_texture.png create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/sign/sign_mindstep_texture.png create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/gui/small_waste_incinerator_gui.png diff --git a/1.12/gradle.properties b/1.12/gradle.properties index 87dd61a..57d8755 100644 --- a/1.12/gradle.properties +++ b/1.12/gradle.properties @@ -4,4 +4,4 @@ org.gradle.jvmargs=-Xmx8G version_minecraft=1.12.2 version_forge=14.23.5.2768 version_jei=4.10.0.198 -version_engineersdecor=1.0.5-b1 +version_engineersdecor=1.0.5 diff --git a/1.12/meta/update.json b/1.12/meta/update.json index ac6a737..4612750 100644 --- a/1.12/meta/update.json +++ b/1.12/meta/update.json @@ -1,6 +1,7 @@ { "homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/", "1.12.2": { + "1.0.5": "[R] Release based on v1.0.5-b1. Release-to-release changes: * Small electrical passthrough-furnace added. * Passive fluid accumulator added. * Config options added. * Sign plates added. * Minor bug fixes.\n[A] Added sign \"Electrical hazzard\"/\"Caution hot wire\".\n[A] Added sign \"Caution dangerous there\" (skull/bones).", "1.0.5-b1": "[A] Added passive fluid accumulator.\n[A] Added small electrical passthrough-furnace.\n[F] Fixed version check URL.\n[M] Opt-out config options for valves, passive fluid accumulator, and furni.", "1.0.4": "[R] Release based on v1.0.4-b9. Release-to-release changes: * Crafting table: Quick crafting history re-fab, JEI integration. * Rendering improvements and issue fixes (stairs, ambient occlusion, optifine, etc). * Walls with texture variations. * Thin/thick steel poles with support feet/heads. * Horizontal steel double-T support beams added. * Fluid pipe valves added: Check valve, redstone controlled valve, analog redstone controlled valve. Support pressurized transfer. * Tool tip documentation (CTRL-SHIFT) for stairs added. * Internal code cleanups. * Recipes tuned.\n[E] Added pass-through electrical furnace (experimental, see config).", "1.0.4-b9": "[F] Inserting fluids with pressurized tag only into IE piping.\n[F] Valve redstone connector rendering does not check for \"can connect redstone\" but only for \"can provide power\".\n[M] Valves are adapted to be detected as pipe by IE.", @@ -34,7 +35,7 @@ "1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table." }, "promos": { - "1.12.2-recommended": "1.0.4", - "1.12.2-latest": "1.0.5-b1" + "1.12.2-recommended": "1.0.5", + "1.12.2-latest": "1.0.5" } } \ No newline at end of file diff --git a/1.12/readme.md b/1.12/readme.md index bb8a036..1a9342e 100644 --- a/1.12/readme.md +++ b/1.12/readme.md @@ -10,6 +10,17 @@ Mod sources for Minecraft version 1.12.2. ---- ## Revision history + ------------------------------------------------------------------- + - v1.0.5 [R] Release based on v1.0.5-b1. Release-to-release changes: + * Small electrical passthrough-furnace added. + * Passive fluid accumulator added. + * Config options added. + * Sign plates added. + * Minor bug fixes. + ------------------------------------------------------------------- + [A] Added sign "Electrical hazzard"/"Caution hot wire". + [A] Added sign "Caution dangerous there" (skull/bones). + - v1.0.5-b1 [A] Added passive fluid accumulator. [A] Added small electrical passthrough-furnace. [F] Fixed version check URL. diff --git a/1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java b/1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java index 95b24f5..5d70363 100644 --- a/1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java +++ b/1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java @@ -154,6 +154,7 @@ public class ModEngineersDecor public static final int GUIID_CRAFTING_TABLE = 213101; public static final int GUIID_SMALL_LAB_FURNACE = 213102; public static final int GUIID_ELECTRICAL_LAB_FURNACE = 213103; + public static final int GUIID_SMALL_WASTE_INCINERATOR = 213104; @Override public Object getServerGuiElement(final int guiid, final EntityPlayer player, final World world, int x, int y, int z) @@ -164,6 +165,7 @@ public class ModEngineersDecor case GUIID_CRAFTING_TABLE: return BlockDecorCraftingTable.getServerGuiElement(player, world, pos, te); case GUIID_SMALL_LAB_FURNACE: return BlockDecorFurnace.getServerGuiElement(player, world, pos, te); case GUIID_ELECTRICAL_LAB_FURNACE: return BlockDecorFurnaceElectrical.getServerGuiElement(player, world, pos, te); + case GUIID_SMALL_WASTE_INCINERATOR: return BlockDecorWasteIncinerator.getServerGuiElement(player, world, pos, te); } return null; } @@ -178,6 +180,7 @@ public class ModEngineersDecor case GUIID_CRAFTING_TABLE: return BlockDecorCraftingTable.getClientGuiElement(player, world, pos, te); case GUIID_SMALL_LAB_FURNACE: return BlockDecorFurnace.getClientGuiElement(player, world, pos, te); case GUIID_ELECTRICAL_LAB_FURNACE: return BlockDecorFurnaceElectrical.getClientGuiElement(player, world, pos, te); + case GUIID_SMALL_WASTE_INCINERATOR: return BlockDecorWasteIncinerator.getClientGuiElement(player, world, pos, te); } return null; } diff --git a/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorPipeValve.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorPipeValve.java index d86cb90..aefe2ce 100644 --- a/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorPipeValve.java +++ b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorPipeValve.java @@ -243,7 +243,6 @@ public class BlockDecorPipeValve extends BlockDecorDirected } int n_filled = forward_fluid_handler().fill(res, doFill); filling_ = false; - //if(n_filled > 0) System.out.println("F:" + resource.amount + "->" + n_filled); return n_filled; } diff --git a/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorWasteIncinerator.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorWasteIncinerator.java new file mode 100644 index 0000000..e674434 --- /dev/null +++ b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorWasteIncinerator.java @@ -0,0 +1,691 @@ +/* + * @file BlockDecorWasteIncinerator.java + * @author Stefan Wilhelm (wile) + * @copyright (C) 2019 Stefan Wilhelm + * @license MIT (see https://opensource.org/licenses/MIT) + * + * Trash/void/nullifier device with internal fifos. + */ +package wile.engineersdecor.blocks; + +import wile.engineersdecor.ModEngineersDecor; +import net.minecraft.block.properties.PropertyBool; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.Block; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.world.World; +import net.minecraft.world.Explosion; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.init.SoundEvents; +import net.minecraft.item.*; +import net.minecraft.inventory.*; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.*; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.energy.CapabilityEnergy; +import net.minecraftforge.energy.IEnergyStorage; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Random; + +public class BlockDecorWasteIncinerator extends BlockDecor +{ + public static final PropertyBool LIT = BlockDecorFurnace.LIT; + + public BlockDecorWasteIncinerator(@Nonnull String registryName, long config, @Nullable Material material, float hardness, float resistance, @Nullable SoundType sound, @Nonnull AxisAlignedBB unrotatedAABB) + { + super(registryName, config, material, hardness, resistance, sound, unrotatedAABB); + setLightOpacity(0); + } + + @Override + protected BlockStateContainer createBlockState() + { return new BlockStateContainer(this, LIT); } + + @Override + public IBlockState getStateFromMeta(int meta) + { return getDefaultState().withProperty(LIT, (meta & 0x4)!=0); } + + @Override + public int getMetaFromState(IBlockState state) + { return (state.getValue(LIT) ? 4 : 0); } + + @Override + @SuppressWarnings("deprecation") + public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) + { return getDefaultState().withProperty(LIT, false); } + + @Override + @SuppressWarnings("deprecation") + public boolean hasComparatorInputOverride(IBlockState state) + { return true; } + + @Override + @SuppressWarnings("deprecation") + public int getComparatorInputOverride(IBlockState blockState, World world, BlockPos pos) + { return Container.calcRedstone(world.getTileEntity(pos)); } + + @Override + public boolean hasTileEntity(IBlockState state) + { return true; } + + @Nullable + public TileEntity createTileEntity(World world, IBlockState state) + { return new BlockDecorWasteIncinerator.BTileEntity(); } + + @Override + public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) + { + if(world.isRemote) return; + if((!stack.hasTagCompound()) || (!stack.getTagCompound().hasKey("inventory"))) return; + NBTTagCompound inventory_nbt = stack.getTagCompound().getCompoundTag("inventory"); + if(inventory_nbt.isEmpty()) return; + final TileEntity te = world.getTileEntity(pos); + if(!(te instanceof BlockDecorWasteIncinerator.BTileEntity)) return; + ((BlockDecorWasteIncinerator.BTileEntity)te).readnbt(inventory_nbt); + ((BlockDecorWasteIncinerator.BTileEntity)te).markDirty(); + } + + @Override + public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest) + { + if(world.isRemote) return true; + TileEntity te = world.getTileEntity(pos); + if(!(te instanceof BTileEntity)) return super.removedByPlayer(state, world, pos, player, willHarvest); + ItemStack stack = new ItemStack(this, 1); + NBTTagCompound inventory_nbt = new NBTTagCompound(); + ItemStackHelper.saveAllItems(inventory_nbt, ((BTileEntity)te).stacks_, false); + if(!inventory_nbt.isEmpty()) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setTag("inventory", inventory_nbt); + stack.setTagCompound(nbt); + } + world.spawnEntity(new EntityItem(world, pos.getX()+0.5, pos.getY()+0.5, pos.getZ()+0.5, stack)); + world.setBlockToAir(pos); + world.removeTileEntity(pos); + return false; + } + + @Override + public void onBlockExploded(World world, BlockPos pos, Explosion explosion) + { + if(world.isRemote) return; + TileEntity te = world.getTileEntity(pos); + if(!(te instanceof BTileEntity)) return; + for(ItemStack stack: ((BTileEntity)te).stacks_) { + if(!stack.isEmpty()) world.spawnEntity(new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(), stack)); + } + ((BTileEntity)te).reset(); + super.onBlockExploded(world, pos, explosion); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) + { + if(world.isRemote) return true; + player.openGui(ModEngineersDecor.instance, ModEngineersDecor.GuiHandler.GUIID_SMALL_WASTE_INCINERATOR, world, pos.getX(), pos.getY(), pos.getZ()); + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rnd) + { + if((state.getBlock()!=this) || (!state.getValue(LIT))) return; + final double rv = rnd.nextDouble(); + if(rv > 0.5) return; + final double x=0.5+pos.getX(), y=0.5+pos.getY(), z=0.5+pos.getZ(); + final double xr=rnd.nextDouble()*0.4-0.2, yr=rnd.nextDouble()*0.5, zr=rnd.nextDouble()*0.4-0.2; + world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, x+xr, y+yr, z+zr, 0.0, 0.0, 0.0); + } + + //-------------------------------------------------------------------------------------------------------------------- + // ModEngineersDecor.GuiHandler connectors + //-------------------------------------------------------------------------------------------------------------------- + + public static Object getServerGuiElement(final EntityPlayer player, final World world, final BlockPos pos, final TileEntity te) + { return (te instanceof BTileEntity) ? (new BContainer(player.inventory, world, pos, (BTileEntity)te)) : null; } + + public static Object getClientGuiElement(final EntityPlayer player, final World world, final BlockPos pos, final TileEntity te) + { return (te instanceof BTileEntity) ? (new BGui(player.inventory, world, pos, (BTileEntity)te)) : null; } + + //-------------------------------------------------------------------------------------------------------------------- + // GUI + //-------------------------------------------------------------------------------------------------------------------- + + @SideOnly(Side.CLIENT) + private static class BGui extends GuiContainer + { + private final BTileEntity te; + + public BGui(InventoryPlayer playerInventory, World world, BlockPos pos, BTileEntity te) + { super(new BContainer(playerInventory, world, pos, te)); this.te = te; } + + @Override + public void initGui() + { super.initGui(); } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) + { + drawDefaultBackground(); + super.drawScreen(mouseX, mouseY, partialTicks); + renderHoveredToolTip(mouseX, mouseY); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) + { + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + mc.getTextureManager().bindTexture(new ResourceLocation(ModEngineersDecor.MODID, "textures/gui/small_waste_incinerator_gui.png")); + final int x0=(width-xSize)/2, y0=(height-ySize)/2, w=xSize, h=ySize; + drawTexturedModalRect(x0, y0, 0, 0, w, h); + } + } + + //-------------------------------------------------------------------------------------------------------------------- + // container + //-------------------------------------------------------------------------------------------------------------------- + + public static class BContainer extends Container + { + private static final int PLAYER_INV_START_SLOTNO = BTileEntity.NUM_OF_SLOTS; + private final World world; + private final BlockPos pos; + private final EntityPlayer player; + private final BTileEntity te; + private int proc_time_needed_; + + public BContainer(InventoryPlayer playerInventory, World world, BlockPos pos, BTileEntity te) + { + this.player = playerInventory.player; + this.world = world; + this.pos = pos; + this.te = te; + int i=-1; + addSlotToContainer(new Slot(te, ++i, 13, 9)); + addSlotToContainer(new Slot(te, ++i, 37, 12)); + addSlotToContainer(new Slot(te, ++i, 54, 13)); + addSlotToContainer(new Slot(te, ++i, 71, 14)); + addSlotToContainer(new Slot(te, ++i, 88, 15)); + addSlotToContainer(new Slot(te, ++i, 105, 16)); + addSlotToContainer(new Slot(te, ++i, 122, 17)); + addSlotToContainer(new Slot(te, ++i, 139, 18)); + addSlotToContainer(new Slot(te, ++i, 144, 38)); + addSlotToContainer(new Slot(te, ++i, 127, 39)); + addSlotToContainer(new Slot(te, ++i, 110, 40)); + addSlotToContainer(new Slot(te, ++i, 93, 41)); + addSlotToContainer(new Slot(te, ++i, 76, 42)); + addSlotToContainer(new Slot(te, ++i, 59, 43)); + addSlotToContainer(new Slot(te, ++i, 42, 44)); + addSlotToContainer(new Slot(te, ++i, 17, 58)); + for(int x=0; x<9; ++x) { + addSlotToContainer(new Slot(playerInventory, x, 8+x*18, 144)); // player slots: 0..8 + } + for(int y=0; y<3; ++y) { + for(int x=0; x<9; ++x) { + addSlotToContainer(new Slot(playerInventory, x+y*9+9, 8+x*18, 86+y*18)); // player slots: 9..35 + } + } + } + + @Override + public void addListener(IContainerListener listener) + { super.addListener(listener); listener.sendAllWindowProperties(this, te); } + + @Override + public void detectAndSendChanges() + { + super.detectAndSendChanges(); + for(int i=0; i=0) && (index= PLAYER_INV_START_SLOTNO) && (index <= PLAYER_INV_START_SLOTNO+36)) { + // Player slot + if(!mergeItemStack(slot_stack, 0, PLAYER_INV_START_SLOTNO-1, true)) return ItemStack.EMPTY; + } else { + // invalid slot + return ItemStack.EMPTY; + } + if(slot_stack.isEmpty()) { + slot.putStack(ItemStack.EMPTY); + } else { + slot.onSlotChanged(); + } + if(slot_stack.getCount() == transferred.getCount()) return ItemStack.EMPTY; + slot.onTake(player, slot_stack); + return transferred; + } + } + + //-------------------------------------------------------------------------------------------------------------------- + // Tile entity + //-------------------------------------------------------------------------------------------------------------------- + + public static class BTileEntity extends TileEntity implements ITickable, ISidedInventory, IEnergyStorage, IItemHandler + { + public static final int TICK_INTERVAL = 20; + public static final int ENERGIZED_TICK_INTERVAL = 5; + public static final int MAX_ENERGY_BUFFER = 16000; + public static final int MAX_ENERGY_TRANSFER = 256; + public static final int DEFAULT_ENERGY_CONSUMPTION = 16; + public static final int NUM_OF_SLOTS = 16; + public static final int INPUT_SLOT_NO = 0; + public static final int BURN_SLOT_NO = NUM_OF_SLOTS-1; + + private static int energy_consumption = DEFAULT_ENERGY_CONSUMPTION; + + private int tick_timer_; + private int check_timer_; + private int energy_stored_; + protected NonNullList stacks_; + + public static void on_config(int speed_percent, int fuel_efficiency_percent, int boost_energy_per_tick) + { + energy_consumption = MathHelper.clamp(boost_energy_per_tick, 16, 512); + ModEngineersDecor.logger.info("Config waste incinerator boost energy consumption:" + energy_consumption); + } + + public BTileEntity() + { reset(); } + + protected void reset() + { + stacks_ = NonNullList.withSize(NUM_OF_SLOTS, ItemStack.EMPTY); + check_timer_ = 0; + tick_timer_ = 0; + } + + public void readnbt(NBTTagCompound compound) + { + reset(); + ItemStackHelper.loadAllItems(compound, stacks_); + while(stacks_.size() < NUM_OF_SLOTS) stacks_.add(ItemStack.EMPTY); + energy_stored_ = compound.getInteger("Energy"); + } + + protected void writenbt(NBTTagCompound compound) + { + compound.setInteger("Energy", MathHelper.clamp(energy_stored_,0 , MAX_ENERGY_BUFFER)); + ItemStackHelper.saveAllItems(compound, stacks_); + } + + private ItemStack shiftStacks(final int index_from, final int index_to) + { + if(index_from >= index_to) return ItemStack.EMPTY; + ItemStack out_stack = ItemStack.EMPTY; + ItemStack stack = stacks_.get(index_from); + for(int i=index_from+1; i<=index_to; ++i) { + out_stack = stacks_.get(i); + stacks_.set(i, stack); + stack = out_stack; + } + stacks_.set(index_from, ItemStack.EMPTY); + return out_stack; + } + + private boolean transferItems(final int index_from, final int index_to, int count) + { + ItemStack from = stacks_.get(index_from); + if(from.isEmpty()) return false; + ItemStack to = stacks_.get(index_to); + if(from.getCount() < count) count = from.getCount(); + if(count <= 0) return false; + boolean changed = true; + if(to.isEmpty()) { + stacks_.set(index_to, from.splitStack(count)); + } else if(to.getCount() >= to.getMaxStackSize()) { + changed = false; + } else if((!from.isItemEqual(to)) || (!ItemStack.areItemStackTagsEqual(from, to))) { + changed = false; + } else { + if((to.getCount()+count) >= to.getMaxStackSize()) { + from.shrink(to.getMaxStackSize()-to.getCount()); + to.setCount(to.getMaxStackSize()); + } else { + from.shrink(count); + to.grow(count); + } + } + if(from.isEmpty() && from!=ItemStack.EMPTY) { + stacks_.set(index_from, ItemStack.EMPTY); + changed = true; + } + return changed; + } + + // TileEntity ------------------------------------------------------------------------------ + + @Override + public boolean shouldRefresh(World world, BlockPos pos, IBlockState os, IBlockState ns) + { return (os.getBlock() != ns.getBlock()) || (!(ns.getBlock() instanceof BlockDecorWasteIncinerator)); } + + @Override + public void readFromNBT(NBTTagCompound compound) + { super.readFromNBT(compound); readnbt(compound); } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound compound) + { super.writeToNBT(compound); writenbt(compound); return compound; } + + // IWorldNamable --------------------------------------------------------------------------- + + @Override + public String getName() + { final Block block=getBlockType(); return (block!=null) ? (block.getTranslationKey() + ".name") : (""); } + + @Override + public boolean hasCustomName() + { return false; } + + @Override + public ITextComponent getDisplayName() + { return new TextComponentTranslation(getName(), new Object[0]); } + + // IInventory ------------------------------------------------------------------------------ + + @Override + public int getSizeInventory() + { return stacks_.size(); } + + @Override + public boolean isEmpty() + { for(ItemStack stack: stacks_) { if(!stack.isEmpty()) return false; } return true; } + + @Override + public ItemStack getStackInSlot(int index) + { return (index < getSizeInventory()) ? stacks_.get(index) : ItemStack.EMPTY; } + + @Override + public ItemStack decrStackSize(int index, int count) + { return ItemStackHelper.getAndSplit(stacks_, index, count); } + + @Override + public ItemStack removeStackFromSlot(int index) + { return ItemStackHelper.getAndRemove(stacks_, index); } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) + { + stacks_.set(index, stack); + if(stack.getCount() > getInventoryStackLimit()) stack.setCount(getInventoryStackLimit()); + markDirty(); + } + + @Override + public int getInventoryStackLimit() + { return 64; } + + @Override + public void markDirty() + { super.markDirty(); } + + @Override + public boolean isUsableByPlayer(EntityPlayer player) + { return ((world.getTileEntity(pos) == this) && (player.getDistanceSq(pos.getX()+0.5d, pos.getY()+0.5d, pos.getZ()+0.5d) <= 64.0d)); } + + @Override + public void openInventory(EntityPlayer player) + {} + + @Override + public void closeInventory(EntityPlayer player) + { markDirty(); } + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) + { return index==0; } + + @Override + public int getField(int id) + { return 0; } + + @Override + public void setField(int id, int value) + {} + + @Override + public int getFieldCount() + { return 4; } + + @Override + public void clear() + { stacks_.clear(); } + + // ISidedInventory ---------------------------------------------------------------------------- + + private static final int[] SIDED_INV_SLOTS = new int[] { INPUT_SLOT_NO }; + + @Override + public int[] getSlotsForFace(EnumFacing side) + { return SIDED_INV_SLOTS; } + + @Override + public boolean canInsertItem(int index, ItemStack itemStackIn, EnumFacing direction) + { return isItemValidForSlot(index, itemStackIn); } + + @Override + public boolean canExtractItem(int index, ItemStack stack, EnumFacing direction) + { return false; } + + // IEnergyStorage ---------------------------------------------------------------------------- + + public boolean canExtract() + { return false; } + + public boolean canReceive() + { return true; } + + public int getMaxEnergyStored() + { return MAX_ENERGY_BUFFER; } + + public int getEnergyStored() + { return energy_stored_; } + + public int extractEnergy(int maxExtract, boolean simulate) + { return 0; } + + public int receiveEnergy(int maxReceive, boolean simulate) + { + if(energy_stored_ >= MAX_ENERGY_BUFFER) return 0; + int n = Math.min(maxReceive, (MAX_ENERGY_BUFFER - energy_stored_)); + if(n > MAX_ENERGY_TRANSFER) n = MAX_ENERGY_TRANSFER; + if(!simulate) {energy_stored_ += n; markDirty(); } + return n; + } + + // IItemHandler -------------------------------------------------------------------------------- + + @Override + public int getSlots() + { return 1; } + + @Override + public int getSlotLimit(int index) + { return getInventoryStackLimit(); } + + @Override + public boolean isItemValid(int slot, @Nonnull ItemStack stack) + { return true; } + + @Override + @Nonnull + public ItemStack insertItem(int index, @Nonnull ItemStack stack, boolean simulate) + { + if(stack.isEmpty()) return ItemStack.EMPTY; + if(index != 0) return ItemStack.EMPTY; + int slotno = 0; + ItemStack slotstack = getStackInSlot(slotno); + if(!slotstack.isEmpty()) + { + if(slotstack.getCount() >= Math.min(slotstack.getMaxStackSize(), getSlotLimit(index))) return stack; + if(!ItemHandlerHelper.canItemStacksStack(stack, slotstack)) return stack; + if(!canInsertItem(slotno, stack, EnumFacing.UP) || (!isItemValidForSlot(slotno, stack))) return stack; + int n = Math.min(stack.getMaxStackSize(), getSlotLimit(index)) - slotstack.getCount(); + if(stack.getCount() <= n) { + if(!simulate) { + ItemStack copy = stack.copy(); + copy.grow(slotstack.getCount()); + setInventorySlotContents(slotno, copy); + } + return ItemStack.EMPTY; + } else { + stack = stack.copy(); + if(!simulate) { + ItemStack copy = stack.splitStack(n); + copy.grow(slotstack.getCount()); + setInventorySlotContents(slotno, copy); + return stack; + } else { + stack.shrink(n); + return stack; + } + } + } else { + if(!canInsertItem(slotno, stack, EnumFacing.UP) || (!isItemValidForSlot(slotno, stack))) return stack; + int n = Math.min(stack.getMaxStackSize(), getSlotLimit(index)); + if(n < stack.getCount()) { + stack = stack.copy(); + if(!simulate) { + setInventorySlotContents(slotno, stack.splitStack(n)); + return stack; + } else { + stack.shrink(n); + return stack; + } + } else { + if(!simulate) setInventorySlotContents(slotno, stack); + return ItemStack.EMPTY; + } + } + } + + @Override + @Nonnull + public ItemStack extractItem(int index, int amount, boolean simulate) + { return ItemStack.EMPTY; } + + // Capability export ---------------------------------------------------------------------------- + + @Override + public boolean hasCapability(Capability cap, EnumFacing facing) + { return ((cap==CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) || (cap==CapabilityEnergy.ENERGY)) || super.hasCapability(cap, facing); } + + @Override + @SuppressWarnings("unchecked") + @Nullable + public T getCapability(Capability capability, @Nullable EnumFacing facing) + { + if((facing != null) && (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)) { + return (T)this; + } else if(capability == CapabilityEnergy.ENERGY) { + return (T)this; + } else { + return super.getCapability(capability, facing); + } + } + + // ITickable ------------------------------------------------------------------------------------ + + @Override + public void update() + { + if(--tick_timer_ > 0) return; + tick_timer_ = TICK_INTERVAL; + if(world.isRemote) return; + boolean dirty = false; + ItemStack processing_stack = stacks_.get(BURN_SLOT_NO); + final boolean was_processing = !processing_stack.isEmpty(); + boolean is_processing = was_processing; + boolean new_stack_processing = false; + if((!stacks_.get(0).isEmpty()) && transferItems(0, 1, getInventoryStackLimit())) dirty = true; + ItemStack first_stack = stacks_.get(0); + boolean shift = !first_stack.isEmpty(); + if(is_processing) { + processing_stack.shrink(1); + if(processing_stack.getCount() <= 0) { + processing_stack = ItemStack.EMPTY; + is_processing = false; + } + stacks_.set(BURN_SLOT_NO, processing_stack); + if(energy_stored_ >= (energy_consumption * TICK_INTERVAL)) { + energy_stored_ -= (energy_consumption * TICK_INTERVAL); + tick_timer_ = ENERGIZED_TICK_INTERVAL; + } + dirty = true; + } + if(shift) { + int max_shift_slot_no = BURN_SLOT_NO-1; + for(int i=1; i79(Ql+=H`a| zevi8o0PgSad3bnW97m>UVwxuAd8XFdP%X8pw)Q^WGWi9bO^+Ci=LC}aq@JBOc7{QmJBKT%t)R>T+yAv9rwyHiSO7A@ic ze44-U`Tg*!;a|NF@%ox@ zqOm+uN}-g3h%^K_=hrz{^1UE=3wOzhsy4&{V7uKi3`1*vtB0z#dB{0)dwWaY_eU2} zN-f&}UDq{!wN~bN#>`%Mzub>8(wP~X&4%rE%i(Zn6Q`=AlrS?&DfE5cCNt;EZnq=G Z$RG6MVmwkd4~75$002ovPDHLkV1iA82>bv5 literal 0 HcmV?d00001 diff --git a/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_waste_incinerator_side.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_waste_incinerator_side.png new file mode 100644 index 0000000000000000000000000000000000000000..c4ae7c7bb07c1ba69185a3be170d2033627aced7 GIT binary patch literal 845 zcmV-T1G4;yP)`k>&7A|UAPfksia^(z{R+%JMq)_0R&wLwoo@BC?bM%8Sp|vucX~*jM{5* zZ_b~2=XG(;Jp|g7xNy`}<5L6GViNQlcmdHa0devtFXA5@W>7`imAe zS65dV4u_OwNqF<#J+eGURY3$bL!2Xa@?%O^=h=CWrGyUw08?!(ECO1rWQG$#x^SIH zn~7?xNEN!>C9}3lgr%D|`-|>uZ}a8l%Y0E3e6_vZzG%kEjT^mH%y5g4Z1JjdhzM(I zYxvhcqDRj4Y#Ifno#CFZwpW6-9XWt{&0kUt-cS&;_k92sza_b!-W zK=8g((AgN=y4C0K_jJno@i)A@@+(c#^mDMhyNdwQS&~n#UbQUC5bsGTfpds+y;O0I zloF|Hr>geF8Y7|i4T$&c(8Sob46qmx=g=5id!53CitzpQ>kNlOg7;K)O^CUlamvk-`PP#Xqtx4PhaKjwfjs7{3r#BZbelN4h}dyJ*6lL zWN&ZJR2AnOF-9(ad+)ipF8&W81gfecs45E{WLehpAj`5R@?f#6D!@}7JmtaTJP5nH z|05oV2sroedGJg~ytDK(>C!4+|Mnbzl{}FLZoz{`j~;P;eojh>5CR_!zvJ4q0dKrE z;Nwd_;GDxb$6zpEYio-<&k+%1G#Xi1mXGluq>}gFN{|wterwcWwVg~=&d$#MJ0AQ4 XkCWE_*5V~N00000NkvXXu0mjfj%R}Y literal 0 HcmV?d00001 diff --git a/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_waste_incinerator_side.png.mcmeta b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_waste_incinerator_side.png.mcmeta new file mode 100644 index 0000000..9b7ccbf --- /dev/null +++ b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_waste_incinerator_side.png.mcmeta @@ -0,0 +1 @@ +{ "animation":{ "frames": [0,1], "frametime":32, "interpolate":true }} \ No newline at end of file diff --git a/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_waste_incinerator_top.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/furnace/small_waste_incinerator_top.png new file mode 100644 index 0000000000000000000000000000000000000000..582cfeba96e137815bddcc427caa116f430a3a28 GIT binary patch literal 581 zcmV-L0=oT)P)lHhQEIAFrXC) zi)4uiAyOa50f(^f+VE?wBR+(HPbo3aGnbc_066C;rO;ZV z){3ekBB&}M1XPuaiwn-r&rcAnwE*;QYi;-;gyH|s?6NF_ly1F;qd_lO9_7(@i`J=R)mud1r2hrgY#uCDn0WzW~ouk3ca zkkrWPl;0&eyhW`2OIW8yKy%+}zwCB4e#0g0+@fD*z&LYWR`m7~|;F`RJqe zBAxKQdRs~vm#*&~_;K7G*9F!mw#FC^hXc#9jN~raK25EaloF~+jFJ2Mds0fL0w1*v z;JqLCT5IH-5s`m(-{V#Fw1varz&y{qy}c1*931rIF6o>zAq0#uTwhIFm79VTvT##D+EOW&Zrr%2 zP!LL`77=3oNMn3xJ~V1yl9_wDnCVMmVoY93(-{Wl-OJ29|KItabKl6DFElDEcoF7=e>Z?f)q~C~9DCqz*_}OmmPNrVSN*l&>ulZePFcDjps;oO z7OoB7Ae&nrg(n6OIwffx8@BZVaPYu>a{0t8`$gh&`2+_K>_>sl?xj`^OhFd=L*jt6Q98DEQ{U1G2!pqZ zw69r%=Xo?Y_)JYrbF(-?7=&E^{R&SvHKHi@Mn?GYt1p?-#rKHC`+zE87?N*pL1WbU zx-50sYSwqWL^7Eq2m;mtSFa9pZ{!vlpEWsuNqyn5DR2rF$NH|G_<02dV}x}tzsSCQ zpE5pvmr`kxy?Z~21CFt(pumP5yPxO<@A2Xl4ERkg<@J$>h_xR5{YN-``YZtb{YSWc zdx8glmZ+|(Mv1s*mO#Nim#_Y8q1>m8(y?VbRoPlVW9u zv$KQF&JNP)G^J9BQt2UnzMb8BpeF0{#pfqc9GPrxQ3~^_U^;Z9tn%txUHHwdSR?fI z?WCoxfiUnmbm%Z*gxcy=s47V>$y6}K!_qX<(*cJMAHsS8LxV-WIe7}_91~-sod53Y z1uMcVRQFDywxJ1C#i?@i*a?OPi%gb^05tkORjDd6=?n=kK~*Y4p|%cy$x@M_!6HYG zoxnMVbFeB~_t?HLhk#R9Wnt~6x5+m)$NRk?Mld4W9>2>|elC8EATm=RB2n6kqhr+P z>QL24fK!}v+#eg|mmf~eqcG0{#xtmMj1CWBOaw@bK}0YDcZTkl`>#A=90iQRgoaT! zP{oCyu`3tyLOFnm(i9EtYe^+j{C4&X>OullR6&d-Wk9SKm7xK|Vgzs@r9g2SqAD0` zNLeY*i*sNsK@eb@R+CGm7`$|WOe!%qfONuRd}M?|eLZz)4;2sRlrU6`5j<-V5ker-J(1%ev2Ug;e?lGGR%FHiH$x8F0c|HZ@$2?U9!>>qk~71jhGB8YP|x3+`9<)40G z^ztkRT z*Jo!r`|)w^+Uk46>K-s7gg|3!8wQveJGOUn^VV$&g#vZ?90r^m8B2l_Pi`2SilvA0 z!iphK1CP=(Fr19HQ0eKmW!=;Vb~pKiiv3WXZ6Yxh3Nb zrM{uKsuz|ha4#s41iJPOplVpP-ml!tiox3pkps2Qq8FpU8vWo-N_PJJ;E_tE$=C3#jfBzJ{E!{!yeuqY3xLBYfJ zz58g~+M4Y5f;hp6K)M6Qt3l-c0uiamPL(2-0=hXr$NA4sEXfN?Jm4aSsWSKHHJpnD z66eyCTYWB<2aHnzQ=2cuVK75O#l*I(7g7K>?%ZX|P0h`0 z&PSL;aqNTPoDg}Bh!9lp&ZkcI5>b~6ltWzSog?y#+XIUFh`;9Ni5g4Pc(+sm@t&I7 z3*4NUr<`Q6suLI9DPH2;(YuQCPx#07*qoM6N<$ Ef~_JE;Q#;t literal 0 HcmV?d00001 diff --git a/1.12/src/main/resources/assets/engineersdecor/textures/blocks/sign/sign_mindstep_texture.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/sign/sign_mindstep_texture.png new file mode 100644 index 0000000000000000000000000000000000000000..3e3ce826ef3421043ae2711e37ee1756b1a229ae GIT binary patch literal 1786 zcmV#L_t(o!+n?E&mKh;$3JIgo*%oV zbJfeVN+hBV-hDu(!j3nQ(Kt)=C8 zU!c$K^FBN0crmm4>^?;|+1=Th**Ry<_j`VfJpI^V8=(kBW5VDPK?KY|1cDQyrnW;c zz|4rMgSo*8(i`uV>)uLKsG}0JS+e_)FEbjA(HkESLcj?`)g;Jy8dX%mIYHHMPQbtb zH6sW(0TIVi6_MdMVu(0U!#iQQ|6xK1-2C8u!lF@b-TsKp0|(eyDzRB27-EJO5E`Ny zh=Ly@u|d2;aX3@dEbrP-15?8VKNuG$fMN(vmAn7B&F237ETa;FcWm0HxI1%pf930l z^vu;hWM#ggG26?At@dH75zBpMM)Q~75^jG&F&Ps8&@4wlM3M<}JBiD0k#&l!L|b1S zV>a7nV`EQJBJ;q^P%~5^gn%p?oD)HjZdZNbg5a`3^bgP%e&Ek`To8emFI?ix^Cu|EBEy%FZI#H17}oKrMIc!Kn2g6=U;(J}js+;o zg6}``9e(-xTL{7>JJ*r)rSq3K`@<8IWq}B6ZEtthOTyAE(mIGGxWE1ALEAI&1Pnd? zRh)NB#^c0N5vqEDK;9KpRRsc zz4neVa{G^Ovu8ZvlVyWLz~vA;olYpG1ope#zBedfD-JloE~ zpQ9{FZr!@gwd*%He(XyfH1uF-UBNr>K3P6shNAd>%ytgUI${;Yv=@F>v0yX`EEbFI z`_RFM0AsPUWH#Gkb8~+OgR!>0SXKbRiOXbIEnZBEflIPBj=;Tp^UlW+n9a5mL|K`E zP@v6q&XOw%kzi&hhT`z7g2j5s?Z?1*U2)-+%ZLb1JpMJxX#v3AjR)Dg@n85KmRIcPoEqJ2k_o=V`Mm0|Paa?c0<|EUrci7^kX$TiYzDdAuxtfkS`?ix zmqo$PUVLHT``$YQp)8B89_RyT!x{yX1iN4aafyT?wu;fc@G$_xz{CdZ4&HP0$l-2| ztyMyBKesgVt|Ot@8clmaLoBP5Gub=uUQK5Ajt~OVV%n>Gtyh*=rwrEn27(uYmo^fD zqJ#`ZYx?wWYZ=K(r3H>1JIZJ@LZdPnjfgSgy*0~HDTK@>68tI;l-s`Ff;;k zf4Pa8;hksS-i@Jun+`DhU8=SMNb*n7RG+P#X3Stb3OuxVfG`S7CSxAhwJXiB`(w5Bel*fK zq0a@wXw-;k=0MKX+88ctDM*L606WVi&N3Z`q9UKfy zBTdFk%rm;N#rDmR81De_sfN%<-56>SGf5?#mu_5C!Figd!3U41GCp)1nN0ZXZ+|9C zM}e)ociDg70DC5>4veap1XPU}(_u7tpT`96d`{tpmq0m*G%@vg=Lmi{9#PbXba*kx z&Do6bg?)^?L!N%@kOecG7!kKJ*IFgwox=-6HGEFDt-~~?n5C312qV85cOsp++XclG cwRAlHFNMUQF1*@bGXMYp07*qoM6N<$f@uIxH2?qr literal 0 HcmV?d00001 diff --git a/1.12/src/main/resources/assets/engineersdecor/textures/gui/small_waste_incinerator_gui.png b/1.12/src/main/resources/assets/engineersdecor/textures/gui/small_waste_incinerator_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..ed6b1c08d3298605a0a2580b1da76944eee58ae6 GIT binary patch literal 23196 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 Su#es&4KUC#d5F<=iu)gc{%mRh literal 0 HcmV?d00001 diff --git a/meta/update.json b/meta/update.json index bd9c5c1..d0ea261 100644 --- a/meta/update.json +++ b/meta/update.json @@ -1,6 +1,7 @@ { "homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/", "1.12.2": { + "1.0.5": "[R] Release based on v1.0.5-b1. Release-to-release changes: * Small electrical passthrough-furnace added. * Passive fluid accumulator added. * Config options added. * Sign plates added. * Minor bug fixes.\n[A] Added sign \"Electrical hazzard\"/\"Caution hot wire\".\n[A] Added sign \"Caution dangerous there\" (skull/bones).", "1.0.5-b1": "[A] Added passive fluid accumulator.\n[A] Added small electrical passthrough-furnace.\n[F] Fixed version check URL.\n[M] Opt-out config options for valves, passive fluid accumulator, and furni.", "1.0.4": "[R] Release based on v1.0.4-b9. Release-to-release changes: * Crafting table: Quick crafting history re-fab, JEI integration. * Rendering improvements and issue fixes (stairs, ambient occlusion, optifine, etc). * Walls with texture variations. * Thin/thick steel poles with support feet/heads. * Horizontal steel double-T support beams added. * Fluid pipe valves added: Check valve, redstone controlled valve, analog redstone controlled valve. Support pressurized transfer. * Tool tip documentation (CTRL-SHIFT) for stairs added. * Internal code cleanups. * Recipes tuned.\n[E] Added pass-through electrical furnace (experimental, see config).", "1.0.4-b9": "[F] Inserting fluids with pressurized tag only into IE piping.\n[F] Valve redstone connector rendering does not check for \"can connect redstone\" but only for \"can provide power\".\n[M] Valves are adapted to be detected as pipe by IE.", @@ -43,8 +44,8 @@ "1.0.0-a1": "[A] Initial port to 1.13.2 with Forge beta." }, "promos": { - "1.12.2-recommended": "1.0.4", - "1.12.2-latest": "1.0.5-b1", + "1.12.2-recommended": "1.0.5", + "1.12.2-latest": "1.0.5", "1.13.2-recommended": "", "1.13.2-latest": "1.0.4-b3" } diff --git a/readme.md b/readme.md index 2e23713..d194f46 100644 --- a/readme.md +++ b/readme.md @@ -17,7 +17,8 @@ Main distribution channel for this mod is CurseForge: ---- ### Details -The mod has its focus decorative blocks. Current feature set: +The mod has its focus decorative blocks and devices helping you to build nice +looking manufacturing contraptions. Current feature set: - *Treated wood crafting table*: 3x3 crafting table with IE style GUI and a model fitting better in the engineer's workshop. Keeps its inventory, has eight additional @@ -30,6 +31,13 @@ The mod has its focus decorative blocks. Current feature set: (storage tray). Keeps inventory when relocated. Crafted with one cobblestone furnace, one hopper, and seven metal plates. +- *Small electrical furnace*: Pass-through electrical furnace. Can pull items out + input side inventories, inserts items into inventories at the output side. Internal + fifo slots. Automatically bypasses items that cannot be cooked or smelted. Electrical + RF/FE power can be applied on all sides. Items can be inserted or drawn from all + sides (e.g. with filtered hopper or whatever). Fits ideally into a conveyor belt + line/lane. Consumption and efficiency tunable via config. + - Rebar (steel) reinforced concrete: Expensive but creeper-proof. Crafted 3x3 from four concrete blocks and five steel rods. Texture design oriented at the IE concrete, slightly darker, eight (position dependent) random texture variations with rust @@ -93,8 +101,27 @@ The mod has its focus decorative blocks. Current feature set: wall, or floor. Light level like a torch. Thin, hence not blocking the way. Allows illuminating places where electrical light installations are problematic. -- *Fluid pipe check valve*: IE fluid pipe styled straight valve that conducts fluids - only in one direction. Crafted from 3x3 from three fluid pipes. +- *Fluid pipe check valve*: Check valve: IE fluid pipe styled straight valve that + conducts fluids only in one direction. Crafted from 3x3 from three fluid pipes. + Supports IE pressurized fluid transfer. + +- *Redstone controlled valves*: Conduct only in one direction, on-off + variant (open on redstone power) and analog variant (closed at power 0, linear + flow slope, fully open at power 15). Support IE pressurized fluid transfer. + +- *Passive fluid accumulator*: Block with one output and five input sides, that + draws fluids out of adjacent tanks when a pump drains fluid from the output port. + Implicit round-robin balanced drain from adjacent blocks. Random initial fluid + drip-in to allow pumps to detect that fluids can be drained. The accumulator + has a vacuum suction delay. + +- *Industrial signs*: "Danger", "electrical hazard", etc. + +- *Small waste incinerator*: Buffered and delayed item disposal device. 16 fifo + slots are filled when new items are pushed in from any side. A GUI allows to + take out accidentally trashed items or put in items to get rid of. When the fifo + is full, the oldest stack will be disposed. The processing speed can be increased + by connecting electrical RF/FE power. More to come slowly but steadily.