From 297b840b65838e7c93b8672c5445c6a794fde5ca Mon Sep 17 00:00:00 2001 From: stfwi Date: Sat, 26 Oct 2019 19:08:05 +0200 Subject: [PATCH] 1.12: Added Factory Block Placer/Planter. --- 1.12/gradle.properties | 2 +- 1.12/meta/update.json | 3 +- 1.12/readme.md | 3 + .../java/wile/engineersdecor/ModContent.java | 42 +- .../engineersdecor/ModEngineersDecor.java | 3 + .../blocks/BlockDecorPlacer.java | 714 ++++++++++++++++++ .../wile/engineersdecor/detail/ModConfig.java | 6 + .../blockstates/factory_placer.json | 11 + .../assets/engineersdecor/lang/en_us.lang | 8 +- .../assets/engineersdecor/lang/ru_ru.lang | 8 +- .../assets/engineersdecor/lang/zh_cn.lang | 8 +- .../block/device/factory_placer_model.json | 170 +++++ .../factory_placer_recipe_standalone.json | 33 + .../dependent/factory_placer_recipe.json | 33 + .../blocks/device/factory_placer_bottom.png | Bin 0 -> 478 bytes .../blocks/device/factory_placer_side.png | Bin 0 -> 652 bytes .../blocks/device/factory_placer_top.png | Bin 0 -> 527 bytes .../textures/gui/factory_placer_gui.png | Bin 0 -> 15570 bytes 1.14/gradle.properties | 2 +- 1.14/meta/update.json | 3 +- 1.14/readme.md | 3 +- .../java/wile/engineersdecor/ModContent.java | 7 + .../blockstates/iron_floor_edge_light.json | 7 + .../blockstates/iron_inset_light.json | 9 +- .../assets/engineersdecor/lang/en_us.json | 8 +- .../assets/engineersdecor/lang/ru_ru.json | 2 + .../assets/engineersdecor/lang/zh_cn.json | 2 + .../block/light/floor_edge_light_model.json | 92 +++ .../models/item/iron_floor_edge_light.json | 1 + .../blocks/iron_floor_edge_light.json | 21 + .../iron_floor_edge_light_recipe.json | 16 + .../iron_inset_light_recipe_backcycle.json | 16 + meta/update.json | 6 +- 33 files changed, 1190 insertions(+), 49 deletions(-) create mode 100644 1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorPlacer.java create mode 100644 1.12/src/main/resources/assets/engineersdecor/blockstates/factory_placer.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/models/block/device/factory_placer_model.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/recipes/alternative/factory_placer_recipe_standalone.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/recipes/dependent/factory_placer_recipe.json create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/device/factory_placer_bottom.png create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/device/factory_placer_side.png create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/blocks/device/factory_placer_top.png create mode 100644 1.12/src/main/resources/assets/engineersdecor/textures/gui/factory_placer_gui.png create mode 100644 1.14/src/main/resources/assets/engineersdecor/blockstates/iron_floor_edge_light.json create mode 100644 1.14/src/main/resources/assets/engineersdecor/models/block/light/floor_edge_light_model.json create mode 100644 1.14/src/main/resources/assets/engineersdecor/models/item/iron_floor_edge_light.json create mode 100644 1.14/src/main/resources/data/engineersdecor/loot_tables/blocks/iron_floor_edge_light.json create mode 100644 1.14/src/main/resources/data/engineersdecor/recipes/independent/iron_floor_edge_light_recipe.json create mode 100644 1.14/src/main/resources/data/engineersdecor/recipes/independent/iron_inset_light_recipe_backcycle.json diff --git a/1.12/gradle.properties b/1.12/gradle.properties index 14b9159..567581f 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.14 +version_engineersdecor=1.0.15-b1 diff --git a/1.12/meta/update.json b/1.12/meta/update.json index f8dab6a..8dca4a5 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.15-b1": "[A] Added Floor Edge Light.\n[A] Added Factory Block Placer and Planter.", "1.0.14": "[R] Release based on v1.0.14-b1. Release-to-release changes: * Factory Hopper added. * Small Waste Incinerator improved. * Lang updates. * Recipe fixes.", "1.0.14-b1": "[A] Factory Hopper added (configurable hopper and item collector).\n[M] Small Waste Incinerator Fifo shifting improved.\n[M] Lang file zh_cn updated (scikirbypoke, PR#53).\n[F] Fixed conditional recipe constant for redstone pipe valve (thx @albert_ac).", "1.0.13": "[R] Release based on v1.0.13-b2. Release-to-release changes: * Small Tree Cutter device added. * Small Solar Panel added. * Steel Mesh Fence added. * Broad Window Sill added.", @@ -63,6 +64,6 @@ }, "promos": { "1.12.2-recommended": "1.0.14", - "1.12.2-latest": "1.0.14" + "1.12.2-latest": "1.0.15-b1" } } \ No newline at end of file diff --git a/1.12/readme.md b/1.12/readme.md index c139624..43fded1 100644 --- a/1.12/readme.md +++ b/1.12/readme.md @@ -10,6 +10,9 @@ Mod sources for Minecraft version 1.12.2. ---- ## Version history + - v1.0.15-b1 [A] Added Floor Edge Light. + [A] Added Factory Block Placer and Planter. + ------------------------------------------------------------------- - v1.0.14 [R] Release based on v1.0.14-b1. Release-to-release changes: * Factory Hopper added. diff --git a/1.12/src/main/java/wile/engineersdecor/ModContent.java b/1.12/src/main/java/wile/engineersdecor/ModContent.java index a5aa34d..3a54ead 100644 --- a/1.12/src/main/java/wile/engineersdecor/ModContent.java +++ b/1.12/src/main/java/wile/engineersdecor/ModContent.java @@ -32,34 +32,7 @@ import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import wile.engineersdecor.blocks.BlockDecor; -import wile.engineersdecor.blocks.BlockDecorChair; -import wile.engineersdecor.blocks.BlockDecorCraftingTable; -import wile.engineersdecor.blocks.BlockDecorDirected; -import wile.engineersdecor.blocks.BlockDecorDropper; -import wile.engineersdecor.blocks.BlockDecorFence; -import wile.engineersdecor.blocks.BlockDecorFloorGrating; -import wile.engineersdecor.blocks.BlockDecorFull; -import wile.engineersdecor.blocks.BlockDecorFurnace; -import wile.engineersdecor.blocks.BlockDecorFurnaceElectrical; -import wile.engineersdecor.blocks.BlockDecorGlassBlock; -import wile.engineersdecor.blocks.BlockDecorHalfSlab; -import wile.engineersdecor.blocks.BlockDecorHopper; -import wile.engineersdecor.blocks.BlockDecorHorizontalSupport; -import wile.engineersdecor.blocks.BlockDecorLadder; -import wile.engineersdecor.blocks.BlockDecorMineralSmelter; -import wile.engineersdecor.blocks.BlockDecorPassiveFluidAccumulator; -import wile.engineersdecor.blocks.BlockDecorPipeValve; -import wile.engineersdecor.blocks.BlockDecorSlab; -import wile.engineersdecor.blocks.BlockDecorSolarPanel; -import wile.engineersdecor.blocks.BlockDecorStairs; -import wile.engineersdecor.blocks.BlockDecorStraightPole; -import wile.engineersdecor.blocks.BlockDecorTest; -import wile.engineersdecor.blocks.BlockDecorTreeCutter; -import wile.engineersdecor.blocks.BlockDecorWall; -import wile.engineersdecor.blocks.BlockDecorWasteIncinerator; -import wile.engineersdecor.blocks.BlockDecorWindow; -import wile.engineersdecor.blocks.BlockDecorWindowSill; +import wile.engineersdecor.blocks.*; import wile.engineersdecor.detail.ModAuxiliaries; import wile.engineersdecor.detail.ModConfig; import wile.engineersdecor.detail.ModTesrs; @@ -144,6 +117,13 @@ public class ModContent ModAuxiliaries.getPixeledAABB(2,2,2, 14,14,14) ); + public static final BlockDecorPlacer FACTORY_PLACER = new BlockDecorPlacer( + "factory_placer", + BlockDecor.CFG_LOOK_PLACEMENT|BlockDecor.CFG_FLIP_PLACEMENT_SHIFTCLICK|BlockDecor.CFG_REDSTONE_CONTROLLED, + Material.IRON, 1f, 15f, SoundType.METAL, + ModAuxiliaries.getPixeledAABB(2,2,2, 14,14,14) + ); + public static final BlockDecorWasteIncinerator SMALL_WASTE_INCINERATOR = new BlockDecorWasteIncinerator( "small_waste_incinerator", BlockDecor.CFG_DEFAULT|BlockDecor.CFG_ELECTRICAL, @@ -490,6 +470,9 @@ public class ModContent private static final TileEntityRegistrationData FACTORY_HOPPER_TEI = new TileEntityRegistrationData( BlockDecorHopper.BTileEntity.class, "te_factory_hopper" ); + private static final TileEntityRegistrationData FACTORY_PLACER_TEI = new TileEntityRegistrationData( + BlockDecorPlacer.BTileEntity.class, "te_factory_placer" + ); private static final TileEntityRegistrationData SMALL_MINERAL_SMELTER_TEI = new TileEntityRegistrationData( BlockDecorMineralSmelter.BTileEntity.class, "te_small_mineral_smelter" ); @@ -513,6 +496,7 @@ public class ModContent SMALL_ELECTRICAL_FURNACE, SMALL_ELECTRICAL_FURNACE_TEI, FACTORY_HOPPER,FACTORY_HOPPER_TEI, FACTORY_DROPPER, FACTORY_DROPPER_TEI, + FACTORY_PLACER, FACTORY_PLACER_TEI, SMALL_WASTE_INCINERATOR, WASTE_INCINERATOR_TEI, STRAIGHT_CHECK_VALVE, STRAIGHT_REDSTONE_VALVE, STRAIGHT_REDSTONE_ANALOG_VALVE, STRAIGHT_PIPE_VALVE_TEI, PASSIVE_FLUID_ACCUMULATOR, PASSIVE_FLUID_ACCUMULATOR_TEI, @@ -551,6 +535,7 @@ public class ModContent TREATED_WOOD_WINDOWSILL, TREATED_WOOD_BROAD_WINDOWSILL, INSET_LIGHT_IRON, + FLOOR_EDGE_LIGHT_IRON, TREATED_WOOD_POLE_SUPPORT, TREATED_WOOD_POLE_HEAD, THIN_STEEL_POLE, @@ -572,7 +557,6 @@ public class ModContent PANZERGLASS_SLAB, // @todo: check if another class is needed due to is_side_visible TREATED_WOOD_FLOOR, // @todo: check if textures need improvement TEST_BLOCK,TEST_BLOCK_TEI, - FLOOR_EDGE_LIGHT_IRON }; //-------------------------------------------------------------------------------------------------------------------- diff --git a/1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java b/1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java index 0f790ba..50f30a3 100644 --- a/1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java +++ b/1.12/src/main/java/wile/engineersdecor/ModEngineersDecor.java @@ -159,6 +159,7 @@ public class ModEngineersDecor public static final int GUIID_SMALL_WASTE_INCINERATOR = 213104; public static final int GUIID_FACTORY_DROPPER = 213105; public static final int GUIID_FACTORY_HOPPER = 213106; + public static final int GUIID_FACTORY_PLACER = 213107; @Override public Object getServerGuiElement(final int guiid, final EntityPlayer player, final World world, int x, int y, int z) @@ -172,6 +173,7 @@ public class ModEngineersDecor case GUIID_SMALL_WASTE_INCINERATOR: return BlockDecorWasteIncinerator.getServerGuiElement(player, world, pos, te); case GUIID_FACTORY_DROPPER: return BlockDecorDropper.getServerGuiElement(player, world, pos, te); case GUIID_FACTORY_HOPPER: return BlockDecorHopper.getServerGuiElement(player, world, pos, te); + case GUIID_FACTORY_PLACER: return BlockDecorPlacer.getServerGuiElement(player, world, pos, te); } return null; } @@ -189,6 +191,7 @@ public class ModEngineersDecor case GUIID_SMALL_WASTE_INCINERATOR: return BlockDecorWasteIncinerator.getClientGuiElement(player, world, pos, te); case GUIID_FACTORY_DROPPER: return BlockDecorDropper.getClientGuiElement(player, world, pos, te); case GUIID_FACTORY_HOPPER: return BlockDecorHopper.getClientGuiElement(player, world, pos, te); + case GUIID_FACTORY_PLACER: return BlockDecorPlacer.getClientGuiElement(player, world, pos, te); } return null; } diff --git a/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorPlacer.java b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorPlacer.java new file mode 100644 index 0000000..70e0234 --- /dev/null +++ b/1.12/src/main/java/wile/engineersdecor/blocks/BlockDecorPlacer.java @@ -0,0 +1,714 @@ +/* + * @file BlockDecorPlacer.java + * @author Stefan Wilhelm (wile) + * @copyright (C) 2019 Stefan Wilhelm + * @license MIT (see https://opensource.org/licenses/MIT) + * + * Block placer and planter, factory automation suitable. + */ +package wile.engineersdecor.blocks; + + + + +import wile.engineersdecor.ModEngineersDecor; +import wile.engineersdecor.detail.Networking; +import net.minecraft.init.Blocks; +import net.minecraft.init.SoundEvents; + + +import net.minecraft.world.IBlockAccess; +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.block.state.BlockFaceShape; +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.item.*; +import net.minecraft.inventory.*; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.util.math.*; +import net.minecraft.util.*; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraftforge.common.IPlantable; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.items.wrapper.SidedInvWrapper; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.IOException; + + +public class BlockDecorPlacer extends BlockDecorDirected +{ + public BlockDecorPlacer(@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); } + + @Override + public BlockFaceShape getBlockFaceShape(IBlockAccess world, IBlockState state, BlockPos pos, EnumFacing face) + { return BlockFaceShape.SOLID; } + + @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; } + + @Override + @Nullable + public TileEntity createTileEntity(World world, IBlockState state) + { return new 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("tedata"))) return; + NBTTagCompound te_nbt = stack.getTagCompound().getCompoundTag("tedata"); + if(te_nbt.isEmpty()) return; + final TileEntity te = world.getTileEntity(pos); + if(!(te instanceof BTileEntity)) return; + ((BTileEntity)te).readnbt(te_nbt, false); + ((BTileEntity)te).reset_rtstate(); + ((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 te_nbt = new NBTTagCompound(); + ((BTileEntity) te).writenbt(te_nbt, false); + if(!te_nbt.isEmpty()) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setTag("tedata", te_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_rtstate(); + 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_FACTORY_PLACER, world, pos.getX(), pos.getY(), pos.getZ()); + return true; + } + + @Override + public void neighborChanged(IBlockState state, World world, BlockPos pos, Block block, BlockPos neighborPos) + { + if(!(world instanceof World) || (((World) world).isRemote)) return; + TileEntity te = world.getTileEntity(pos); + if(!(te instanceof BTileEntity)) return; + ((BTileEntity)te).block_updated(); + } + + //-------------------------------------------------------------------------------------------------------------------- + // 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 mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException + { + super.mouseClicked(mouseX, mouseY, mouseButton); + BContainer container = (BContainer)inventorySlots; + if(container.fields_.length != 3) return; + int mx = mouseX - getGuiLeft(), my = mouseY - getGuiTop(); + if(!isPointInRegion(126, 1, 49, 60, mouseX, mouseY)) { + return; + } else if(isPointInRegion(133, 49, 9, 9, mouseX, mouseY)) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setInteger("manual_trigger", 1); + Networking.PacketTileNotify.sendToServer(te, nbt); + } else if(isPointInRegion(145, 49, 9, 9, mouseX, mouseY)) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setInteger("logic", container.fields_[0] ^ BTileEntity.LOGIC_INVERTED); + Networking.PacketTileNotify.sendToServer(te, nbt); + } else if(isPointInRegion(159, 49, 7, 9, mouseX, mouseY)) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setInteger("logic", container.fields_[0] ^ BTileEntity.LOGIC_CONTINUOUS); + Networking.PacketTileNotify.sendToServer(te, nbt); + } + } + + @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/factory_placer_gui.png")); + final int x0=getGuiLeft(), y0=getGuiTop(), w=getXSize(), h=getYSize(); + drawTexturedModalRect(x0, y0, 0, 0, w, h); + BContainer container = (BContainer)inventorySlots; + if(container.fields_.length != 3) return; // no init, no cake. + // active slot + { + int slot_index = container.fields_[2]; + if((slot_index < 0) || (slot_index >= BTileEntity.NUM_OF_SLOTS)) slot_index = 0; + int x = (x0+10+((slot_index % 6) * 18)); + int y = (y0+8+((slot_index / 6) * 17)); + drawTexturedModalRect(x, y, 200, 8, 18, 18); + } + // redstone input + { + if(container.fields_[1] != 0) { + drawTexturedModalRect(x0+133, y0+49, 217, 49, 9, 9); + } + } + // trigger logic + { + int inverter_offset = ((container.fields_[0] & BTileEntity.LOGIC_INVERTED) != 0) ? 11 : 0; + drawTexturedModalRect(x0+145, y0+49, 177+inverter_offset, 49, 9, 9); + int pulse_mode_offset = ((container.fields_[0] & BTileEntity.LOGIC_CONTINUOUS ) != 0) ? 9 : 0; + drawTexturedModalRect(x0+159, y0+49, 199+pulse_mode_offset, 49, 9, 9); + } + } + } + + //-------------------------------------------------------------------------------------------------------------------- + // 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 fields_[] = new int[3]; + + 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; + // device slots (stacks 0 to 17) + for(int y=0; y<3; ++y) { + for(int x=0; x<6; ++x) { + int xpos = 11+x*18, ypos = 9+y*17; + addSlotToContainer(new Slot(te, ++i, xpos, ypos)); + } + } + // player slots + for(int x=0; x<9; ++x) { + addSlotToContainer(new Slot(playerInventory, x, 8+x*18, 129)); // 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, 71+y*18)); // player slots: 9..35 + } + } + } + + public BlockPos getPos() + { return pos; } + + @Override + public void addListener(IContainerListener listener) + { super.addListener(listener); listener.sendAllWindowProperties(this, te); } + + @Override + public void detectAndSendChanges() + { + super.detectAndSendChanges(); + for(int il=0; il= fields_.length)) return; + fields_[id] = value; + te.setField(id, value); + } + + @Override + public boolean canInteractWith(EntityPlayer player) + { return (world.getBlockState(pos).getBlock() instanceof BlockDecorPlacer) && (player.getDistanceSq(pos) <= 64); } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) + { + Slot slot = inventorySlots.get(index); + if((slot==null) || (!slot.getHasStack())) return ItemStack.EMPTY; + ItemStack slot_stack = slot.getStack(); + ItemStack transferred = slot_stack.copy(); + if((index>=0) && (index= PLAYER_INV_START_SLOTNO) && (index <= PLAYER_INV_START_SLOTNO+36)) { + // Player slot + if(!mergeItemStack(slot_stack, 0, BTileEntity.NUM_OF_SLOTS, false)) 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, Networking.IPacketReceiver + { + public static final int TICK_INTERVAL = 40; + public static final int NUM_OF_SLOTS = 18; + /// + public static final int LOGIC_INVERTED = 0x01; + public static final int LOGIC_CONTINUOUS = 0x02; + /// + private boolean block_power_signal_ = false; + private boolean block_power_updated_ = false; + private int logic_ = LOGIC_INVERTED|LOGIC_CONTINUOUS; + private int current_slot_index_ = 0; + private int tick_timer_ = 0; + protected NonNullList stacks_; + + public static void on_config(int cooldown_ticks) + { + // ModEngineersDecor.logger.info("Config factory placer:"); + } + + public BTileEntity() + { + stacks_ = NonNullList.withSize(NUM_OF_SLOTS, ItemStack.EMPTY); + reset_rtstate(); + } + + public void reset_rtstate() + { + block_power_signal_ = false; + block_power_updated_ = false; + } + + public void readnbt(NBTTagCompound nbt, boolean update_packet) + { + stacks_ = NonNullList.withSize(NUM_OF_SLOTS, ItemStack.EMPTY); + ItemStackHelper.loadAllItems(nbt, stacks_); + while(stacks_.size() < NUM_OF_SLOTS) stacks_.add(ItemStack.EMPTY); + block_power_signal_ = nbt.getBoolean("powered"); + current_slot_index_ = nbt.getInteger("act_slot_index"); + logic_ = nbt.getInteger("logic"); + } + + protected void writenbt(NBTTagCompound nbt, boolean update_packet) + { + ItemStackHelper.saveAllItems(nbt, stacks_); + nbt.setBoolean("powered", block_power_signal_); + nbt.setInteger("act_slot_index", current_slot_index_); + nbt.setInteger("logic", logic_); + } + + public void block_updated() + { + boolean powered = world.isBlockPowered(pos); + if(block_power_signal_ != powered) block_power_updated_ = true; + block_power_signal_ = powered; + if(block_power_updated_) { + tick_timer_ = 1; + } else if(tick_timer_ > 4) { + tick_timer_ = 4; + } + } + + public boolean is_input_slot(int index) + { return (index >= 0) && (index < NUM_OF_SLOTS); } + + // TileEntity ------------------------------------------------------------------------------ + + @Override + public boolean shouldRefresh(World world, BlockPos pos, IBlockState os, IBlockState ns) + { return (os.getBlock() != ns.getBlock()) || (!(ns.getBlock() instanceof BlockDecorPlacer)); } + + @Override + public void readFromNBT(NBTTagCompound nbt) + { super.readFromNBT(nbt); readnbt(nbt, false); } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound nbt) + { super.writeToNBT(nbt); writenbt(nbt, false); return nbt; } + + // 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()); + if(tick_timer_ > 8) tick_timer_ = 8; + 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 true; } + + @Override + public int getField(int id) + { + switch(id) { + case 0: return logic_; + case 1: return block_power_signal_ ? 1 : 0; + case 2: return current_slot_index_; + default: return 0; + } + } + + @Override + public void setField(int id, int value) + { + switch(id) { + case 0: logic_ = value; return; + case 1: block_power_signal_ = (value != 0); return; + case 2: current_slot_index_ = MathHelper.clamp(value, 0, NUM_OF_SLOTS-1); return; + default: return; + } + } + + @Override + public int getFieldCount() + { return 3; } + + @Override + public void clear() + { stacks_.clear(); } + + // ISidedInventory ---------------------------------------------------------------------------- + + private final IItemHandler item_handler_ = new SidedInvWrapper(this, EnumFacing.UP); + private static final int[] SIDED_INV_SLOTS; + static { + SIDED_INV_SLOTS = new int[NUM_OF_SLOTS]; + for(int i=0; i cap, EnumFacing facing) + { return (cap==CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) || super.hasCapability(cap, facing); } + + @Override + @SuppressWarnings("unchecked") + @Nullable + public T getCapability(Capability capability, @Nullable EnumFacing facing) + { + if(capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) return (T)item_handler_; + return super.getCapability(capability, facing); + } + + // IPacketReceiver ------------------------------------------------------------------------------- + + @Override + public void onServerPacketReceived(NBTTagCompound nbt) + {} + + @Override + public void onClientPacketReceived(EntityPlayer player, NBTTagCompound nbt) + { + if(nbt.hasKey("logic")) logic_ = nbt.getInteger("logic"); + if(nbt.hasKey("manual_trigger") && (nbt.getInteger("manual_trigger")!=0)) { block_power_signal_=true; block_power_updated_=true; tick_timer_=1; } + markDirty(); + } + + // ITickable and aux methods --------------------------------------------------------------------- + + private static int next_slot(int i) + { return (i= NUM_OF_SLOTS) current_slot_index_ = 0; + current_stack = stacks_.get(current_slot_index_); + if(!current_stack.isEmpty()) break; + current_slot_index_ = next_slot(current_slot_index_); + } + if(current_stack.isEmpty()) { current_slot_index_ = 0; return false; } + boolean no_space = false; + final Item item = current_stack.getItem(); + Block block = (item instanceof IPlantable) ? (((IPlantable)item).getPlant(world, pos).getBlock()) : Block.getBlockFromItem(item); + if(block == Blocks.AIR) { + if(item != null) { + return spit_out(facing); // Item not accepted + } else { + // try next slot + } + } else if(block instanceof IPlantable) { + if(world.isAirBlock(placement_pos)) { + // plant here, block below has to be valid soil. + IBlockState soilstate = world.getBlockState(placement_pos.down()); + if(!soilstate.getBlock().canSustainPlant(soilstate, world, pos, EnumFacing.UP, (IPlantable)block)) { + block = Blocks.AIR; + } + } else { + // adjacent block is the soil, plant above if the soil is valid. + IBlockState soilstate = world.getBlockState(placement_pos); + if(soilstate.getBlock() == block) { + // The plant is already planted from the case above. + block = Blocks.AIR; + no_space = true; + } else if(!world.isAirBlock(placement_pos.up())) { + // If this is the soil an air block is needed above, if that is blocked we can't plant. + block = Blocks.AIR; + no_space = true; + } else if(!soilstate.getBlock().canSustainPlant(soilstate, world, pos, EnumFacing.UP, (IPlantable)block)) { + // Would be space above, but it's not the right soil for the plant. + block = Blocks.AIR; + } else { + // Ok, plant above. + placement_pos = placement_pos.up(); + } + } + } else if(!world.getBlockState(placement_pos).getBlock().isReplaceable(world, placement_pos)) { + block = Blocks.AIR; + no_space = true; + } + // System.out.println("PLACE " + current_stack + " --> " + block + " at " + placement_pos.subtract(pos) + "( item=" + item + ")"); + if(block != Blocks.AIR) { + try { + final FakePlayer placer = net.minecraftforge.common.util.FakePlayerFactory.getMinecraft((net.minecraft.world.WorldServer)world); + final IBlockState placement_state = (placer==null) ? (block.getDefaultState()) : (block.getStateForPlacement(world, placement_pos, EnumFacing.DOWN,0.5f,0.5f,0f, 0, placer, EnumHand.MAIN_HAND)); + if(placement_state == null) { + return spit_out(facing); + } else if(item instanceof ItemBlock) { + ItemStack placement_stack = current_stack.copy(); + placement_stack.setCount(1); + ((ItemBlock)item).placeBlockAt(placement_stack, placer, world, placement_pos, EnumFacing.DOWN, 0.5f,0.5f,0f, placement_state); + SoundType stype = block.getSoundType(placement_state, world, pos, null); + if(stype != null) world.playSound(null, placement_pos, stype.getPlaceSound(), SoundCategory.BLOCKS, stype.getVolume()*0.6f, stype.getPitch()); + } else { + if(world.setBlockState(placement_pos, placement_state, 1|2|8)) { + SoundType stype = block.getSoundType(placement_state, world, pos, null); + if(stype != null) world.playSound(null, placement_pos, stype.getPlaceSound(), SoundCategory.BLOCKS, stype.getVolume()*0.6f, stype.getPitch()); + } + } + current_stack.shrink(1); + stacks_.set(current_slot_index_, current_stack); + return true; + } catch(Throwable e) { + // The block really needs a player or other issues happened during placement. + // A hard crash should not be fired here, instead spit out the item to indicated that this + // block is not compatible. + System.out.println("Exception while trying to place " + e); + world.setBlockToAir(placement_pos); + return spit_out(facing); + } + } + if((!no_space) && (!current_stack.isEmpty())) { + // There is space, but the current plant cannot be planted there, so try next. + for(int i=0; i 0) return; + tick_timer_ = TICK_INTERVAL; + // Cycle init + boolean dirty = block_power_updated_; + boolean rssignal = ((logic_ & LOGIC_INVERTED)!=0)==(!block_power_signal_); + boolean trigger = (rssignal && ((block_power_updated_) || ((logic_ & LOGIC_CONTINUOUS)!=0))); + final IBlockState state = world.getBlockState(pos); + if(state == null) { block_power_signal_= false; return; } + final EnumFacing placer_facing = state.getValue(FACING); + // Trigger edge detection for next cycle + { + boolean tr = world.isBlockPowered(pos); + block_power_updated_ = (block_power_signal_ != tr); + block_power_signal_ = tr; + if(block_power_updated_) dirty = true; + } + // Placing + if(trigger && try_place(placer_facing)) dirty = true; + if(dirty) markDirty(); + if(trigger && (tick_timer_ > TICK_INTERVAL)) tick_timer_ = TICK_INTERVAL; + } + } +} 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 646519a..46b2788 100644 --- a/1.12/src/main/java/wile/engineersdecor/detail/ModConfig.java +++ b/1.12/src/main/java/wile/engineersdecor/detail/ModConfig.java @@ -168,6 +168,11 @@ public class ModConfig @Config.RequiresMcRestart public boolean without_factory_hopper = false; + @Config.Comment({"Disable the Factory Block Placer."}) + @Config.Name("Without factory placer") + @Config.RequiresMcRestart + public boolean without_factory_placer = false; + @Config.Comment({"Disable horizontal half-block slab."}) @Config.Name("Without slabs") @Config.RequiresMcRestart @@ -411,6 +416,7 @@ public class ModConfig if(block instanceof BlockDecorWasteIncinerator) return optout.without_waste_incinerator; if(block instanceof BlockDecorDropper) return optout.without_factory_dropper; if(block instanceof BlockDecorHopper) return optout.without_factory_hopper; + if(block instanceof BlockDecorPlacer) return optout.without_factory_placer; if(block instanceof BlockDecorHalfSlab) return optout.without_halfslabs; if(block instanceof BlockDecorLadder) return optout.without_ladders; if(block instanceof BlockDecorWindow) return optout.without_windows; diff --git a/1.12/src/main/resources/assets/engineersdecor/blockstates/factory_placer.json b/1.12/src/main/resources/assets/engineersdecor/blockstates/factory_placer.json new file mode 100644 index 0000000..7bf51c6 --- /dev/null +++ b/1.12/src/main/resources/assets/engineersdecor/blockstates/factory_placer.json @@ -0,0 +1,11 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "engineersdecor:device/factory_placer_model" + }, + "variants": { + "normal": [{}], + "inventory": [{}], + "facing": { "north":{"y":0}, "south":{"y":180}, "west":{"y":270}, "east":{"y":90}, "up": {"x":-90}, "down": {"x":90} } + } +} diff --git a/1.12/src/main/resources/assets/engineersdecor/lang/en_us.lang b/1.12/src/main/resources/assets/engineersdecor/lang/en_us.lang index cac4332..7d49338 100644 --- a/1.12/src/main/resources/assets/engineersdecor/lang/en_us.lang +++ b/1.12/src/main/resources/assets/engineersdecor/lang/en_us.lang @@ -159,7 +159,13 @@ tile.engineersdecor.factory_dropper.help=§6Dropper suitable for advanced factor Pre-opens shutter door when internal trigger conditions are met. Drops all matching stacks \ simultaneously. Click on all elements in the GUI to see how it works. tile.engineersdecor.factory_hopper.name=Factory Hopper -tile.engineersdecor.factory_hopper.help=§6Hopper suitable for advanced factory automation.§r +tile.engineersdecor.factory_hopper.help=§6Hopper suitable for advanced factory automation.§r Can transfer half-stacks, max collection range 9x9.\n\ + GUI Slider controls: Collection range (0 to 4), insertion delay (0.5s to 10s), insertion stack size (1 to 32).\n\ + GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default). +tile.engineersdecor.factory_placer.name=Factory Block Placer +tile.engineersdecor.factory_placer.help=§6Allows placing blocks and planting crops or trees.§r\n\ + GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default).\n\ + Also supports spike planing from underneath the soil. Spits out items that it cannot place or plant. tile.engineersdecor.small_mineral_smelter.name=Small Mineral Melting Furnace tile.engineersdecor.small_mineral_smelter.help=§6High temperature, high insulation electrical stone melting furnace.§r\n\ Heats up mineral blocks to magma blocks, and finally to lava. Due to the \ diff --git a/1.12/src/main/resources/assets/engineersdecor/lang/ru_ru.lang b/1.12/src/main/resources/assets/engineersdecor/lang/ru_ru.lang index 0484a25..62bea02 100644 --- a/1.12/src/main/resources/assets/engineersdecor/lang/ru_ru.lang +++ b/1.12/src/main/resources/assets/engineersdecor/lang/ru_ru.lang @@ -155,7 +155,13 @@ tile.engineersdecor.factory_dropper.help=§6Выбрасыватель подх когда выполняются условия внутреннего запуска. Сбрасывает все соответствующие стеки одновременно. \ Нажмите на все элементы в GUI, чтобы увидеть, как это работает. tile.engineersdecor.factory_hopper.name=Factory Hopper -#tile.engineersdecor.factory_hopper.help=§6Hopper suitable for advanced factory automation.§r +#tile.engineersdecor.factory_hopper.help=§6Hopper suitable for advanced factory automation.§r Can transfer half-stacks, max collection range 9x9.\n\ + GUI Slider controls: Collection range (0 to 4), insertion delay (0.5s to 10s), insertion stack size (1 to 32).\n\ + GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default). +tile.engineersdecor.factory_placer.name=Factory Block Placer +#tile.engineersdecor.factory_placer.help=§6Allows placing blocks and planting crops or trees.§r\n\ + GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default).\n\ + Also supports spike planing from underneath the soil. Spits out items that it cannot place or plant. tile.engineersdecor.small_mineral_smelter.name=Small Mineral Melting Furnace #tile.engineersdecor.small_mineral_smelter.help=§6High temperature, high insulation electrical stone melting furnace.§r\n\ Heats up mineral blocks to magma blocks, and finally to lava. Due to the \ diff --git a/1.12/src/main/resources/assets/engineersdecor/lang/zh_cn.lang b/1.12/src/main/resources/assets/engineersdecor/lang/zh_cn.lang index d19e6ca..c7ba933 100644 --- a/1.12/src/main/resources/assets/engineersdecor/lang/zh_cn.lang +++ b/1.12/src/main/resources/assets/engineersdecor/lang/zh_cn.lang @@ -158,7 +158,13 @@ tile.engineersdecor.factory_dropper.help=§6适用于高级工厂自动化的掉 当内部触发条件满足时,预先打开卷帘门。所有符合条件的物品\ 会同时掉落。点击GUI的各处来了解如何运作。 tile.engineersdecor.factory_hopper.name=Factory Hopper -#tile.engineersdecor.factory_hopper.help=§6Hopper suitable for advanced factory automation.§r +#tile.engineersdecor.factory_hopper.help=§6Hopper suitable for advanced factory automation.§r Can transfer half-stacks, max collection range 9x9.\n\ + GUI Slider controls: Collection range (0 to 4), insertion delay (0.5s to 10s), insertion stack size (1 to 32).\n\ + GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default). +tile.engineersdecor.factory_placer.name=Factory Block Placer +#tile.engineersdecor.factory_placer.help=§6Allows placing blocks and planting crops or trees.§r\n\ + GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default).\n\ + Also supports spike planing from underneath the soil. Spits out items that it cannot place or plant. tile.engineersdecor.small_mineral_smelter.name=小型矿物熔炼炉 tile.engineersdecor.small_mineral_smelter.help=§6高温、高绝缘电熔石炉。§r\n\ 把矿物块加热成岩浆块,最后变成熔岩。由于\ diff --git a/1.12/src/main/resources/assets/engineersdecor/models/block/device/factory_placer_model.json b/1.12/src/main/resources/assets/engineersdecor/models/block/device/factory_placer_model.json new file mode 100644 index 0000000..1f4b4f0 --- /dev/null +++ b/1.12/src/main/resources/assets/engineersdecor/models/block/device/factory_placer_model.json @@ -0,0 +1,170 @@ +{ + "parent": "block/cube", + "textures": { + "top": "engineersdecor:blocks/device/factory_placer_top", + "bottom": "engineersdecor:blocks/device/factory_placer_bottom", + "side": "engineersdecor:blocks/device/factory_placer_side", + "particle": "engineersdecor:blocks/device/factory_placer_side" + }, + "elements": [ + { + "from": [0, 0, 3], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#bottom"}, + "east": {"uv": [3, 0, 16, 16], "rotation": 180, "texture": "#side"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#top"}, + "west": {"uv": [3, 0, 16, 16], "texture": "#side"}, + "up": {"uv": [3, 0, 16, 16], "rotation": 90, "texture": "#side"}, + "down": {"uv": [3, 0, 16, 16], "rotation": 270, "texture": "#side"} + } + }, + { + "from": [15, 0, 0], + "to": [16, 16, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 7]}, + "faces": { + "north": {"uv": [0, 0, 1, 16], "texture": "#bottom"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#side"}, + "south": {"uv": [14, 0, 16, 16], "texture": "#top"}, + "west": {"uv": [0, 0, 1, 16], "texture": "#side"}, + "up": {"uv": [14, 0, 15, 1], "rotation": 90, "texture": "#side"}, + "down": {"uv": [14, 15, 16, 16], "texture": "#side"} + } + }, + { + "from": [15, 0, 2], + "to": [16, 16, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11]}, + "faces": { + "north": {"uv": [0, 0, 1, 16], "texture": "#bottom"}, + "east": {"uv": [2, 0, 3, 16], "rotation": 180, "texture": "#side"}, + "south": {"uv": [15, 0, 16, 16], "texture": "#top"}, + "west": {"uv": [2, 0, 4, 16], "texture": "#side"}, + "up": {"uv": [15, 2, 16, 4], "rotation": 90, "texture": "#side"}, + "down": {"uv": [15, 12, 16, 14], "rotation": 270, "texture": "#side"} + } + }, + { + "from": [0, 0, 0], + "to": [1, 16, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 7]}, + "faces": { + "north": {"uv": [15, 0, 16, 16], "texture": "#bottom"}, + "east": {"uv": [15, 0, 16, 16], "texture": "#side"}, + "south": {"uv": [0, 0, 2, 16], "texture": "#top"}, + "west": {"uv": [0, 0, 1, 16], "texture": "#side"}, + "up": {"uv": [0, 0, 1, 1], "rotation": 90, "texture": "#side"}, + "down": {"uv": [0, 15, 2, 16], "texture": "#side"} + } + }, + { + "from": [0, 0, 2], + "to": [1, 16, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11]}, + "faces": { + "north": {"uv": [15, 0, 16, 16], "texture": "#bottom"}, + "east": {"uv": [2, 0, 3, 16], "texture": "#side"}, + "south": {"uv": [0, 0, 1, 16], "texture": "#top"}, + "west": {"uv": [2, 0, 3, 16], "texture": "#side"}, + "up": {"uv": [0, 2, 1, 3], "rotation": 90, "texture": "#side"}, + "down": {"uv": [0, 13, 1, 14], "rotation": 270, "texture": "#side"} + } + }, + { + "from": [0, 15, 1], + "to": [1, 16, 2], + "faces": { + "north": {"uv": [15, 0, 16, 1], "texture": "#bottom"}, + "east": {"uv": [14, 0, 15, 1], "texture": "#side"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#top"}, + "west": {"uv": [1, 0, 2, 1], "texture": "#side"}, + "up": {"uv": [1, 0, 2, 1], "rotation": 90, "texture": "#side"}, + "down": {"uv": [0, 14, 1, 15], "rotation": 270, "texture": "#side"} + } + }, + { + "from": [15, 15, 1], + "to": [16, 16, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [23, 8, 8]}, + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#bottom"}, + "east": {"uv": [14, 0, 15, 1], "texture": "#side"}, + "south": {"uv": [15, 0, 16, 1], "texture": "#top"}, + "west": {"uv": [1, 0, 2, 1], "texture": "#side"}, + "up": {"uv": [15, 1, 16, 2], "rotation": 90, "texture": "#side"}, + "down": {"uv": [15, 14, 16, 15], "rotation": 270, "texture": "#side"} + } + }, + { + "from": [15, 0, 1], + "to": [16, 1, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [23, -7, 8]}, + "faces": { + "north": {"uv": [0, 15, 1, 16], "texture": "#bottom"}, + "east": {"uv": [14, 15, 15, 16], "texture": "#side"}, + "south": {"uv": [15, 15, 16, 16], "texture": "#top"}, + "west": {"uv": [1, 15, 2, 16], "texture": "#side"}, + "up": {"uv": [15, 1, 16, 2], "rotation": 90, "texture": "#side"}, + "down": {"uv": [15, 14, 16, 15], "rotation": 270, "texture": "#side"} + } + }, + { + "from": [0, 0, 1], + "to": [1, 1, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -7, 8]}, + "faces": { + "north": {"uv": [15, 15, 16, 16], "texture": "#bottom"}, + "east": {"uv": [14, 15, 15, 16], "texture": "#side"}, + "south": {"uv": [0, 15, 1, 16], "texture": "#top"}, + "west": {"uv": [1, 15, 2, 16], "texture": "#side"}, + "up": {"uv": [0, 1, 1, 2], "rotation": 90, "texture": "#side"}, + "down": {"uv": [0, 14, 1, 15], "texture": "#side"} + } + }, + { + "from": [1, 15, 2], + "to": [15, 16, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11]}, + "faces": { + "north": {"uv": [1, 0, 15, 1], "texture": "#bottom"}, + "east": {"uv": [12, 0, 14, 1], "texture": "#side"}, + "south": {"uv": [1, 0, 15, 1], "texture": "#top"}, + "west": {"uv": [2, 0, 4, 1], "texture": "#side"}, + "up": {"uv": [2, 1, 3, 15], "rotation": 90, "texture": "#side"}, + "down": {"uv": [2, 1, 3, 15], "rotation": 270, "texture": "#side"} + } + }, + { + "from": [1, 0, 2], + "to": [15, 1, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 11]}, + "faces": { + "north": {"uv": [1, 15, 15, 16], "texture": "#bottom"}, + "east": {"uv": [12, 15, 14, 16], "texture": "#side"}, + "south": {"uv": [1, 15, 15, 16], "texture": "#top"}, + "west": {"uv": [2, 15, 4, 16], "texture": "#side"}, + "up": {"uv": [2, 1, 3, 15], "rotation": 180, "texture": "#side"}, + "down": {"uv": [2, 1, 3, 15], "rotation": 270, "texture": "#side"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [85, 3, -10], + "translation": [1.75, -0.75, -2.25], + "scale": [0.35, 0.35, 0.35] + }, + "ground": { + "translation": [0, -0.75, 0], + "scale": [0.2, 0.2, 0.2] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/1.12/src/main/resources/assets/engineersdecor/recipes/alternative/factory_placer_recipe_standalone.json b/1.12/src/main/resources/assets/engineersdecor/recipes/alternative/factory_placer_recipe_standalone.json new file mode 100644 index 0000000..198db2a --- /dev/null +++ b/1.12/src/main/resources/assets/engineersdecor/recipes/alternative/factory_placer_recipe_standalone.json @@ -0,0 +1,33 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:factory_placer", + "missing": ["immersiveengineering:material"] + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + "WWW", + "WDP", + "WWW" + ], + "key": { + "D": { + "item": "minecraft:dispenser", + "data": 0 + }, + "P": { + "item": "#ingotIron", + "data": 0 + }, + "W": { + "item": "#plankWood", + "data": 0 + } + }, + "result": { + "item": "engineersdecor:factory_placer", + "count": 1 + } +} diff --git a/1.12/src/main/resources/assets/engineersdecor/recipes/dependent/factory_placer_recipe.json b/1.12/src/main/resources/assets/engineersdecor/recipes/dependent/factory_placer_recipe.json new file mode 100644 index 0000000..012c836 --- /dev/null +++ b/1.12/src/main/resources/assets/engineersdecor/recipes/dependent/factory_placer_recipe.json @@ -0,0 +1,33 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:factory_placer", + "required": ["immersiveengineering:material"] + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + "WWW", + "WDP", + "WWW" + ], + "key": { + "D": { + "item": "minecraft:dispenser", + "data": 0 + }, + "P": { + "item": "#plateIron", + "data": 0 + }, + "W": { + "item": "#plankTreatedWood", + "data": 0 + } + }, + "result": { + "item": "engineersdecor:factory_placer", + "count": 1 + } +} diff --git a/1.12/src/main/resources/assets/engineersdecor/textures/blocks/device/factory_placer_bottom.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/device/factory_placer_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..40de3fc528332002da999bad45c622c482ff690e GIT binary patch literal 478 zcmV<40U`d0P)$k^0x| zRF%4gSw?r*1!Osu`qvf$=6!U`q%RT@5Mv+TYq?&pJ;sQtVrI0~0O-Bbdj~*7c)ecZ ztg46zwN@g)Hz#`%2y zA~+llq?A~eg_IKWJhLnd%d(7^)9FMAfoNtNk4JufeyFt$R3DsLE5NYQb@H+P2j!YN U)}m`PQUCw|07*qoM6N<$g4e;)s{jB1 literal 0 HcmV?d00001 diff --git a/1.12/src/main/resources/assets/engineersdecor/textures/blocks/device/factory_placer_side.png b/1.12/src/main/resources/assets/engineersdecor/textures/blocks/device/factory_placer_side.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd474e3f5ccedefdc56a99d30d4e42f12dcf9bb GIT binary patch literal 652 zcmV;70(1R|P); zWOk>k%E4#`yOXB7sHVPiPRq^BO>H(C+#NGRMA&RLR23pZL||q_1XYEql9>RgD%x6O z97j|Y5n;F6addQqnPFzQJMPXf47Ao5hJoE~$9B5~z*}pG2qHpNaesf$^Yb%TS6BS? z+fOVjt8f)Qefx#GyE~qqo*2gwUq)R0c}lLb*lbLH>fe?cfdef}O*#ex5cGM|fP0w_^MWRY1E1;~mF z;7jwO!NNPmeE+eLbBUtpAJ}Gwt11zJs?u6xnkG~Px7n4AD^A#>Y%#COw6WBx**;EHdYss^a_oo~j}u=)L3a6mx(84u=l^#mfR)w945=fYurj zF~2N|YN7}mcX}4`!T-+34!%gYPb*Vn5%nTeTkI2;fW-rnALe0=2M;sT$hiHC=WHC?L8`T051G_l|B mQB`{HsOtKiMTBu20r(eT1vqCr<9b*C0000lDhCh3JO9V&> z5FwNj@)oJnq)y8_<`wb`*C0W;4GmQkZfC}Jie)!fCv;-Jc3NHG9z{mB9l*FzHxqjPHPQY z*hB;s;ltSpEu4)OAm31uo=KQ8^*F#WcRy&bYfg2?%UmS-)*zB30hz@!Lqst4!V`A2 zk(pEvRB}e~z~|3U^slJB_d|pt@c!)G{}D2odaPo)JGSouPmUsZ%-&c=Z2JkouOkS9 zm3``2#6^(q!N(&AziU4*nVA`?IwwVsBB;QEy^e7h21JC~oz@*yVd{>)VMQjULgakz zy|4RWr4+8Nu6TZa=JVI@xI3!4zLJ^$*!k}6j&U4$eSJlH?>sy_@bvTquqxbpCo^fS zty5YWFT0SLvkxvVE;v0s<>lptVHnmmuC)>oY&IKIm1&wVo4t2)bHg-E`~eTnlD;QT Rtvmn#002ovPDHLkV1oRy=vV*% literal 0 HcmV?d00001 diff --git a/1.12/src/main/resources/assets/engineersdecor/textures/gui/factory_placer_gui.png b/1.12/src/main/resources/assets/engineersdecor/textures/gui/factory_placer_gui.png new file mode 100644 index 0000000000000000000000000000000000000000..5e475217bc81440842ff6d0c8757f9321c9d1398 GIT binary patch literal 15570 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 literal 0 HcmV?d00001 diff --git a/1.14/gradle.properties b/1.14/gradle.properties index 4d132b7..2901257 100644 --- a/1.14/gradle.properties +++ b/1.14/gradle.properties @@ -2,7 +2,7 @@ org.gradle.daemon=false org.gradle.jvmargs=-Xmx8G version_minecraft=1.14.4 -version_forge_minecraft=1.14.4-28.1.61 +version_forge_minecraft=1.14.4-28.1.68 version_fml_mappings=20190719-1.14.3 version_jei=1.14.4:6.0.0.10 version_engineersdecor=1.0.15-b1 diff --git a/1.14/meta/update.json b/1.14/meta/update.json index a4e0007..3d45423 100644 --- a/1.14/meta/update.json +++ b/1.14/meta/update.json @@ -1,6 +1,7 @@ { "homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/", "1.14.4": { + "1.0.15-b1": "[A] Added Floor Edge Light.\n[U] Updated to Forge1.14.4-28.1.68/20190719-1.14.3.", "1.0.14-b1": "[U] Updated to Forge 1.14.4-28.1.40/20190719-1.14.3.\n[A] Factory Hopper added (configurable hopper and item collector).\n[M] Switched to integrated loot table generation.\n[M] Lang file zh_cn updated (scikirbypoke, PR#53).", "1.0.13-b2": "[A] Added Steel Mesh Fence.\n[A] Added Broad Window Sill.", "1.0.12-b3": "[U] Updated to Forge 1.14.4-28.1.10/20190719-1.14.3.\n[A] Crafting Table: Added recipe collision resolver, also applies to crafting history refabrication.\n[A] Crafting Table: Added rendering of placed items on the top surface of the table.\n[A] Waterlogging of non-full-blocks added.", @@ -27,6 +28,6 @@ }, "promos": { "1.14.4-recommended": "", - "1.14.4-latest": "1.0.14-b1" + "1.14.4-latest": "1.0.15-b1" } } \ No newline at end of file diff --git a/1.14/readme.md b/1.14/readme.md index 1dde662..4dc4ce9 100644 --- a/1.14/readme.md +++ b/1.14/readme.md @@ -11,7 +11,8 @@ Mod sources for Minecraft version 1.14.4. ## Version history - ~ v1.0.15-b1 [U] Updated to Forge1.14.4-28.1.61/20190719-1.14.3. + - v1.0.15-b1 [A] Added Floor Edge Light. + [U] Updated to Forge1.14.4-28.1.68/20190719-1.14.3. - v1.0.14-b1 [U] Updated to Forge 1.14.4-28.1.40/20190719-1.14.3. [A] Factory Hopper added (configurable hopper and item collector). diff --git a/1.14/src/main/java/wile/engineersdecor/ModContent.java b/1.14/src/main/java/wile/engineersdecor/ModContent.java index 91a8d0e..e088255 100644 --- a/1.14/src/main/java/wile/engineersdecor/ModContent.java +++ b/1.14/src/main/java/wile/engineersdecor/ModContent.java @@ -222,6 +222,12 @@ public class ModContent ModAuxiliaries.getPixeledAABB(5.2,5.2,15.7, 10.8,10.8,16.0) )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "iron_inset_light")); + public static final BlockDecorDirected.WaterLoggable FLOOR_EDGE_LIGHT_IRON = (BlockDecorDirected.WaterLoggable)(new BlockDecorDirected.WaterLoggable( + BlockDecor.CFG_CUTOUT|BlockDecor.CFG_LOOK_PLACEMENT|BlockDecor.CFG_HORIZIONTAL, + Block.Properties.create(Material.IRON, MaterialColor.IRON).hardnessAndResistance(2f, 15f).sound(SoundType.METAL).lightValue(15), + ModAuxiliaries.getPixeledAABB(5,0,0, 11,2,1) + )).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "iron_floor_edge_light")); + public static final BlockDecor.WaterLoggable STEEL_TABLE = (BlockDecor.WaterLoggable)(new BlockDecor.WaterLoggable( BlockDecor.CFG_CUTOUT|BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_LOOK_PLACEMENT, Block.Properties.create(Material.WOOD, MaterialColor.WOOD).hardnessAndResistance(2f, 15f).sound(SoundType.WOOD), @@ -511,6 +517,7 @@ public class ModContent STEEL_FRAMED_WINDOW, STEEL_TABLE, INSET_LIGHT_IRON, + FLOOR_EDGE_LIGHT_IRON, STEEL_FLOOR_GRATING, STEEL_MESH_FENCE, TREATED_WOOD_POLE, diff --git a/1.14/src/main/resources/assets/engineersdecor/blockstates/iron_floor_edge_light.json b/1.14/src/main/resources/assets/engineersdecor/blockstates/iron_floor_edge_light.json new file mode 100644 index 0000000..7192b29 --- /dev/null +++ b/1.14/src/main/resources/assets/engineersdecor/blockstates/iron_floor_edge_light.json @@ -0,0 +1,7 @@ +{ + "forge_marker": 1, + "defaults": { "model": "engineersdecor:block/light/floor_edge_light_model" }, + "variants": { + "facing": { "north":{"y":0}, "south":{"y":180}, "west":{"y":270}, "east":{"y":90}, "up": {"x":-90}, "down": {"x":90} } + } +} diff --git a/1.14/src/main/resources/assets/engineersdecor/blockstates/iron_inset_light.json b/1.14/src/main/resources/assets/engineersdecor/blockstates/iron_inset_light.json index fad3008..990d97e 100644 --- a/1.14/src/main/resources/assets/engineersdecor/blockstates/iron_inset_light.json +++ b/1.14/src/main/resources/assets/engineersdecor/blockstates/iron_inset_light.json @@ -1,13 +1,6 @@ { "forge_marker": 1, - "defaults": { - "model": "engineersdecor:block/light/inset_light_model", - "textures": { - "light": "engineersdecor:block/light/lamp_glass_warm_square_texture", - "side": "engineersdecor:block/iestyle/steel_texture", - "particle": "engineersdecor:block/iestyle/steel_texture" - } - }, + "defaults": { "model": "engineersdecor:block/light/inset_light_model" }, "variants": { "facing": { "north":{"y":0}, "south":{"y":180}, "west":{"y":270}, "east":{"y":90}, "up": {"x":-90}, "down": {"x":90} } } diff --git a/1.14/src/main/resources/assets/engineersdecor/lang/en_us.json b/1.14/src/main/resources/assets/engineersdecor/lang/en_us.json index e1ae1bf..bfada25 100644 --- a/1.14/src/main/resources/assets/engineersdecor/lang/en_us.json +++ b/1.14/src/main/resources/assets/engineersdecor/lang/en_us.json @@ -128,7 +128,9 @@ "block.engineersdecor.treated_wood_side_table": "Treated Wood Side Table", "block.engineersdecor.treated_wood_side_table.help": "§6Needed after the work's done.", "block.engineersdecor.iron_inset_light": "Inset Light", - "block.engineersdecor.iron_inset_light.help": "§6Small glowstone light source, sunk into the floor, ceiling or wall.§r\n Useful to light up places where electrical light installations are problematic. Light level like a torch.", + "block.engineersdecor.iron_inset_light.help": "§6Small glowstone light source, sunk into the floor, ceiling or wall.§r\n Useful to light up places where electrical light installations are problematic.", + "block.engineersdecor.iron_floor_edge_light": "Inset Floor Edge Light", + "block.engineersdecor.iron_floor_edge_light.help": "§6Small glowstone light source, placed at the edge of a floor block.§r\n Useful to light up places where electrical light installations are problematic.", "block.engineersdecor.treated_wood_window": "Treated Wood Window", "block.engineersdecor.treated_wood_window.help": "§6Wood framed triple glazed window. Well insulating.§r Does not connect to adjacent blocks like glass panes.", "block.engineersdecor.treated_wood_windowsill": "Treated Wood Window Sill", @@ -156,7 +158,9 @@ "block.engineersdecor.factory_dropper": "Factory Dropper", "block.engineersdecor.factory_dropper.help": "§6Dropper suitable for advanced factory automation.§r Has twelve round-robin selected slots. Drop force, angle, stack size, and cool-down delay adjustable in the GUI. Three stack compare slots with logical AND or OR can be used as internal trigger source. Internal trigger can be AND'ed or OR'ed with the external redstone signal trigger. Trigger simulation buttons for testing. Pre-opens shutter door when internal trigger conditions are met. Drops all matching stacks simultaneously. Click on all elements in the GUI to see how it works.", "block.engineersdecor.factory_hopper": "Factory Hopper", - "block.engineersdecor.factory_hopper.help": "§6Hopper suitable for advanced factory automation.§r", + "block.engineersdecor.factory_hopper.help": "§6Hopper suitable for advanced factory automation.§r Can transfer half-stacks, max collection range 9x9.\n GUI Slider controls: Collection range (0 to 4), insertion delay (0.5s to 10s), insertion stack size (1 to 32).\\n GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default).", + "block.engineersdecor.factory_placer": "Factory Block Placer", + "block.engineersdecor.factory_placer.help": "§6Allows placing blocks and planting crops or trees.§r\n GUI Redstone controls: Not inverted / inverted (default), pulse mode / continuous mode (default).\\n Also supports spike planing from underneath the soil. Spits out items that it cannot place or plant.", "block.engineersdecor.small_mineral_smelter": "Small Mineral Melting Furnace", "block.engineersdecor.small_mineral_smelter.help": "§6High temperature, high insulation electrical stone melting furnace.§r\n Heats up mineral blocks to magma blocks, and finally to lava. Due to the miniturized device size the process is rather inefficient - much time and energy is needed to liquefy a stone block.", "block.engineersdecor.small_solar_panel": "Small Solar Panel", diff --git a/1.14/src/main/resources/assets/engineersdecor/lang/ru_ru.json b/1.14/src/main/resources/assets/engineersdecor/lang/ru_ru.json index ab4689c..5a4c147 100644 --- a/1.14/src/main/resources/assets/engineersdecor/lang/ru_ru.json +++ b/1.14/src/main/resources/assets/engineersdecor/lang/ru_ru.json @@ -128,6 +128,7 @@ "block.engineersdecor.treated_wood_side_table.help": "§6Needed after the work's done.", "block.engineersdecor.iron_inset_light": "Встраиваемый осветитель", "block.engineersdecor.iron_inset_light.help": "§6Маленький источник света, интегрируемый в стены, пол или потолок.§r\n Полезно для освещения мест, где проблематичны электрические осветительные установки. Уровень света - как факел.", + "block.engineersdecor.iron_floor_edge_light": "Inset Floor Edge Light", "block.engineersdecor.treated_wood_window": "Обработанное деревянное окно", "block.engineersdecor.treated_wood_window.help": "§6Деревянный каркас окна с тройным остеклением. Ну и шумоизоляция.", "block.engineersdecor.treated_wood_windowsill": "Обработанный деревянный подоконник", @@ -153,6 +154,7 @@ "block.engineersdecor.factory_dropper": "Фабричный выбрасыватель", "block.engineersdecor.factory_dropper.help": "§6Выбрасыватель подходит для продвинутой автоматизации производства.§r Имеет 12 выборочных слотов. Сила броска, угол, размер стопки и задержка настраиваются в GUI. 3 слота сравнения стека с логическим И или ИЛИ могут использоваться в качестве внутреннего источника запуска. Внутренний триггер может быть И или ИЛИ с внешним триггерным сигналом красного камня. Триггерные кнопки симуляции для тестирования. Предварительно открывает дверцу затвора, когда выполняются условия внутреннего запуска. Сбрасывает все соответствующие стеки одновременно. Нажмите на все элементы в GUI, чтобы увидеть, как это работает.", "block.engineersdecor.factory_hopper": "Factory Hopper", + "block.engineersdecor.factory_placer": "Factory Block Placer", "block.engineersdecor.small_mineral_smelter": "Small Mineral Melting Furnace", "block.engineersdecor.small_solar_panel": "Small Solar Panel", "block.engineersdecor.small_tree_cutter": "Small Tree Cutter", diff --git a/1.14/src/main/resources/assets/engineersdecor/lang/zh_cn.json b/1.14/src/main/resources/assets/engineersdecor/lang/zh_cn.json index 652efb5..3c34032 100644 --- a/1.14/src/main/resources/assets/engineersdecor/lang/zh_cn.json +++ b/1.14/src/main/resources/assets/engineersdecor/lang/zh_cn.json @@ -129,6 +129,7 @@ "block.engineersdecor.treated_wood_side_table.help": "§6干完活后需要喝杯茶。", "block.engineersdecor.iron_inset_light": "嵌入灯", "block.engineersdecor.iron_inset_light.help": "§6小型荧石光源,能嵌入地板、天花板或墙里。§r\n 用于照亮电力光源难以安装的地方。 亮度与火把一样。", + "block.engineersdecor.iron_floor_edge_light": "Inset Floor Edge Light", "block.engineersdecor.treated_wood_window": "防腐木窗", "block.engineersdecor.treated_wood_window.help": "§6木框三层玻璃窗。绝缘良好。§r不像玻璃板一样连接到相邻方块。", "block.engineersdecor.treated_wood_windowsill": "防腐木窗台", @@ -156,6 +157,7 @@ "block.engineersdecor.factory_dropper": "工厂掉落器", "block.engineersdecor.factory_dropper.help": "§6适用于高级工厂自动化的掉落器。§r有十二个轮询选择的储物格。 掉落的力度、角度、一叠数量和冷却延时可在GUI调节。三个 内部比较槽带有逻辑与或逻辑或功能,可用作内部触发源。内部触发 还能和外部红石信号触发再进行逻辑与或逻辑或。触发模拟按钮仅作测试用途。 当内部触发条件满足时,预先打开卷帘门。所有符合条件的物品 会同时掉落。点击GUI的各处来了解如何运作。", "block.engineersdecor.factory_hopper": "Factory Hopper", + "block.engineersdecor.factory_placer": "Factory Block Placer", "block.engineersdecor.small_mineral_smelter": "小型矿物熔炼炉", "block.engineersdecor.small_mineral_smelter.help": "§6高温、高绝缘电熔石炉。§r\n 把矿物块加热成岩浆块,最后变成熔岩。由于 小型化的设备大小,该过程效率不高,需要大量时间和能源 来液化一块石头。", "block.engineersdecor.small_solar_panel": "小型太阳能板", diff --git a/1.14/src/main/resources/assets/engineersdecor/models/block/light/floor_edge_light_model.json b/1.14/src/main/resources/assets/engineersdecor/models/block/light/floor_edge_light_model.json new file mode 100644 index 0000000..9b0fe3f --- /dev/null +++ b/1.14/src/main/resources/assets/engineersdecor/models/block/light/floor_edge_light_model.json @@ -0,0 +1,92 @@ +{ + "parent": "block/cube", + "textures": { + "light": "engineersdecor:block/light/lamp_glass_warm_square_texture", + "side": "engineersdecor:block/iestyle/steel_texture", + "particle": "engineersdecor:block/iestyle/steel_texture" + }, + "elements": [ + { + "from": [6, 0.1875, 0.5], + "to": [10, 1.8125, 1], + "faces": { + "north": {"uv": [6, 14.1875, 10, 15.8125], "texture": "#light"}, + "south": {"uv": [6, 14.1875, 10, 15.8125], "texture": "#light"}, + "up": {"uv": [6, 0.5, 10, 1], "texture": "#light"} + } + }, + { + "from": [10, 0.1875, 0.5], + "to": [11, 1.8125, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8.125]}, + "faces": { + "north": {"uv": [5, 14.1875, 6, 15.8125], "texture": "#side"}, + "east": {"uv": [15, 14.1875, 15.5, 15.8125], "texture": "#side"}, + "south": {"uv": [10, 14.1875, 11, 15.8125], "texture": "#side"}, + "west": {"uv": [0.5, 14.1875, 1, 15.8125], "texture": "#side"}, + "up": {"uv": [10, 0.5, 11, 1], "texture": "#side"}, + "down": {"uv": [10, 15, 11, 15.5], "texture": "#side"} + } + }, + { + "from": [5, 0.1875, 0.5], + "to": [6, 1.8125, 1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8.125]}, + "faces": { + "north": {"uv": [10, 14.1875, 11, 15.8125], "texture": "#side"}, + "east": {"uv": [15, 14.1875, 15.5, 15.8125], "texture": "#side"}, + "south": {"uv": [5, 14.1875, 6, 15.8125], "texture": "#side"}, + "west": {"uv": [0.5, 14.1875, 1, 15.8125], "texture": "#side"}, + "up": {"uv": [5, 0.5, 6, 1], "texture": "#side"}, + "down": {"uv": [5, 15, 6, 15.5], "texture": "#side"} + } + }, + { + "from": [5, 0, 0], + "to": [11, 2, 0.5], + "faces": { + "north": {"uv": [5, 14, 11, 16], "texture": "#side"}, + "east": {"uv": [15.5, 14, 16, 16], "texture": "#side"}, + "south": {"uv": [5, 14, 11, 16], "texture": "#side"}, + "west": {"uv": [0, 14, 0.5, 16], "texture": "#side"}, + "up": {"uv": [5, 0, 11, 0.5], "texture": "#side"}, + "down": {"uv": [5, 15.5, 11, 16], "texture": "#side"} + } + }, + { + "from": [5, 0, 0.5], + "to": [11, 0.1875, 1], + "faces": { + "north": {"uv": [5, 15.8125, 11, 16], "texture": "#side"}, + "east": {"uv": [15, 15.8125, 15.5, 16], "texture": "#side"}, + "south": {"uv": [5, 15.8125, 11, 16], "texture": "#side"}, + "west": {"uv": [0.5, 15.8125, 1, 16], "texture": "#side"}, + "up": {"uv": [5, 0.5, 11, 1], "texture": "#side"}, + "down": {"uv": [5, 15, 11, 15.5], "texture": "#side"} + } + } + ], + "display": { + "thirdperson_righthand": { + "rotation": [0, -6, 96], + "translation": [-5.5, 0.5, 4.75], + "scale": [0.7, 0.7, 0.7] + }, + "firstperson_righthand": { + "translation": [-3, -0.75, 1.25] + }, + "ground": { + "translation": [0, 2.5, 6], + "scale": [0.7, 0.7, 0.7] + }, + "gui": { + "rotation": [30, 30, 0], + "translation": [7.5, 3, 0], + "scale": [2, 2, 2] + }, + "fixed": { + "rotation": [0, 180, 0], + "translation": [0, 0, -7.8] + } + } +} \ No newline at end of file diff --git a/1.14/src/main/resources/assets/engineersdecor/models/item/iron_floor_edge_light.json b/1.14/src/main/resources/assets/engineersdecor/models/item/iron_floor_edge_light.json new file mode 100644 index 0000000..67564cb --- /dev/null +++ b/1.14/src/main/resources/assets/engineersdecor/models/item/iron_floor_edge_light.json @@ -0,0 +1 @@ +{ "parent": "engineersdecor:block/light/floor_edge_light_model" } \ No newline at end of file diff --git a/1.14/src/main/resources/data/engineersdecor/loot_tables/blocks/iron_floor_edge_light.json b/1.14/src/main/resources/data/engineersdecor/loot_tables/blocks/iron_floor_edge_light.json new file mode 100644 index 0000000..be9749c --- /dev/null +++ b/1.14/src/main/resources/data/engineersdecor/loot_tables/blocks/iron_floor_edge_light.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "name": "iron_floor_edge_light_dlt", + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_name", + "source": "block_entity" + } + ], + "name": "engineersdecor:iron_floor_edge_light" + } + ] + } + ] +} \ No newline at end of file diff --git a/1.14/src/main/resources/data/engineersdecor/recipes/independent/iron_floor_edge_light_recipe.json b/1.14/src/main/resources/data/engineersdecor/recipes/independent/iron_floor_edge_light_recipe.json new file mode 100644 index 0000000..af166c9 --- /dev/null +++ b/1.14/src/main/resources/data/engineersdecor/recipes/independent/iron_floor_edge_light_recipe.json @@ -0,0 +1,16 @@ +{ + "conditions": [ + { + "type": "engineersdecor:optional", + "result": "engineersdecor:iron_floor_edge_light", + "required": ["engineersdecor:iron_inset_light"] + } + ], + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { "item": "engineersdecor:iron_inset_light" } + ], + "result": { + "item": "engineersdecor:iron_floor_edge_light" + } +} diff --git a/1.14/src/main/resources/data/engineersdecor/recipes/independent/iron_inset_light_recipe_backcycle.json b/1.14/src/main/resources/data/engineersdecor/recipes/independent/iron_inset_light_recipe_backcycle.json new file mode 100644 index 0000000..6b25158 --- /dev/null +++ b/1.14/src/main/resources/data/engineersdecor/recipes/independent/iron_inset_light_recipe_backcycle.json @@ -0,0 +1,16 @@ +{ + "conditions": [ + { + "type": "engineersdecor:optional", + "result": "engineersdecor:iron_inset_light", + "required": ["engineersdecor:iron_floor_edge_light"] + } + ], + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { "item": "engineersdecor:iron_floor_edge_light" } + ], + "result": { + "item": "engineersdecor:iron_inset_light" + } +} diff --git a/meta/update.json b/meta/update.json index 3eb43b3..a70d1e5 100644 --- a/meta/update.json +++ b/meta/update.json @@ -2,11 +2,12 @@ "homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/", "promos": { "1.12.2-recommended": "1.0.14", - "1.12.2-latest": "1.0.14", + "1.12.2-latest": "1.0.15-b1", "1.14.4-recommended": "", - "1.14.4-latest": "1.0.14-b1" + "1.14.4-latest": "1.0.15-b1" }, "1.12.2": { + "1.0.15-b1": "[A] Added Floor Edge Light.\n[A] Added Factory Block Placer and Planter.", "1.0.14": "[R] Release based on v1.0.14-b1. Release-to-release changes: * Factory Hopper added. * Small Waste Incinerator improved. * Lang updates. * Recipe fixes.", "1.0.14-b1": "[A] Factory Hopper added (configurable hopper and item collector).\n[M] Small Waste Incinerator Fifo shifting improved.\n[M] Lang file zh_cn updated (scikirbypoke, PR#53).\n[F] Fixed conditional recipe constant for redstone pipe valve (thx @albert_ac).", "1.0.13": "[R] Release based on v1.0.13-b2. Release-to-release changes: * Small Tree Cutter device added. * Small Solar Panel added. * Steel Mesh Fence added. * Broad Window Sill added.", @@ -68,6 +69,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." }, "1.14.4": { + "1.0.15-b1": "[A] Added Floor Edge Light.\n[U] Updated to Forge1.14.4-28.1.68/20190719-1.14.3.", "1.0.14-b1": "[U] Updated to Forge 1.14.4-28.1.40/20190719-1.14.3.\n[A] Factory Hopper added (configurable hopper and item collector).\n[M] Switched to integrated loot table generation.\n[M] Lang file zh_cn updated (scikirbypoke, PR#53).", "1.0.13-b2": "[A] Added Steel Mesh Fence.\n[A] Added Broad Window Sill.", "1.0.12-b3": "[U] Updated to Forge 1.14.4-28.1.10/20190719-1.14.3.\n[A] Crafting Table: Added recipe collision resolver, also applies to crafting history refabrication.\n[A] Crafting Table: Added rendering of placed items on the top surface of the table.\n[A] Waterlogging of non-full-blocks added.",