1.12: ModBlocks class renamed to ModContent. Mineal Smelter released. Window sub models stripped (issue #19). Block opacity of full blocks fixed (issue #50). Factory Dropper continuous mode added (issue #51). Experimental features added.

This commit is contained in:
stfwi 2019-09-10 18:14:42 +02:00
parent 64186ec813
commit 462e14166c
104 changed files with 3812 additions and 158 deletions

View file

@ -1,10 +1,11 @@
{
"homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
"1.12.2": {
"1.0.12-b1": "[A] Mineal Smelter non-experimental now.\n[M] Window submodels stripped (reopened issue #19, thx overchoice).\n[M] Opaque full block light opacity fixed (issue #50, thx Illomiurge).\n[M] Factory Dropper: Added pulse/continuous mode in GUI (issue #51, thx Aristine for the CR).",
"1.0.11": "[R] Release based on v1.0.11-b3. Release-to-release changes: * Steel floor grating improvments. * Minor model box fixes. * Standalone recipes added. * Language updates.",
"1.0.11-b3": "[M] Added missing standalone recipes for pipe valves, passive fluid accumulator, and waste incinerator.",
"1.0.11-b2": "[F] Fixed Floor Grating issue, which could have caused a crash.\n[M] Lang update ru-ru (Shellyoung, PR #47).",
"1.0.11-b1": "[M] Lang update ru-ru (Shellyoung, PR #45).\n[F] Fixed bounding box of the Steel Table.\n[M] Steel Floor Frating: Items fall through.",
"1.0.11-b1": "[M] Lang update ru-ru (Shellyoung, PR #45).\n[F] Fixed bounding box of the Steel Table.\n[M] Steel Floor Grating: Items fall through.",
"1.0.10": "[R] Release based on v1.0.10-b2. Release-to-release changes: * Steel table added. * Steel floor grating added. * Treated wood side table added. * Exit Sign added. * Recipe fixes.",
"1.0.10-b2": "[A] Steel table added.\n[A] Steel floor grating added.",
"1.0.10-b1": "[A] Treated wood side table added.\n[F] Fixed recipe collision of Metal Rung Ladder (issue #37, thx ProsperCraft for reporting).\n[A] Added Exit Sign (texture design by J. Carver).",
@ -55,6 +56,6 @@
},
"promos": {
"1.12.2-recommended": "1.0.11",
"1.12.2-latest": "1.0.11"
"1.12.2-latest": "1.0.12-b1"
}
}

View file

@ -10,7 +10,11 @@ Mod sources for Minecraft version 1.12.2.
----
## Version history
~ v1.0.12-b1 [M] Window submodels stripped (issue #19).
- v1.0.12-b1 [A] Mineal Smelter non-experimental now.
[M] Window submodels stripped (reopened issue #19, thx overchoice).
[M] Opaque full block light opacity fixed (issue #50, thx Illomiurge).
[M] Factory Dropper: Added pulse/continuous mode in GUI (issue #51,
thx Aristine for the CR).
-------------------------------------------------------------------
- v1.0.11 [R] Release based on v1.0.11-b3. Release-to-release changes:
@ -28,7 +32,7 @@ Mod sources for Minecraft version 1.12.2.
- v1.0.11-b1 [M] Lang update ru-ru (Shellyoung, PR #45).
[F] Fixed bounding box of the Steel Table.
[M] Steel Floor Frating: Items fall through.
[M] Steel Floor Grating: Items fall through.
-------------------------------------------------------------------
- v1.0.10 [R] Release based on v1.0.10-b2. Release-to-release changes:

View file

@ -10,11 +10,11 @@
* Note: Straight forward definition of different blocks/entities
* to make recipes, models and texture definitions easier.
*/
package wile.engineersdecor.blocks;
package wile.engineersdecor;
import wile.engineersdecor.ModEngineersDecor;
import wile.engineersdecor.detail.ModAuxiliaries;
import wile.engineersdecor.detail.ModConfig;
import wile.engineersdecor.detail.*;
import wile.engineersdecor.blocks.*;
import wile.engineersdecor.items.*;
import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
@ -35,7 +35,7 @@ import java.util.Collections;
import javax.annotation.Nonnull;
@SuppressWarnings("unused")
public class ModBlocks
public class ModContent
{
//--------------------------------------------------------------------------------------------------------------------
//-- Blocks
@ -73,6 +73,8 @@ public class ModBlocks
public static final BlockDecorGlassBlock PANZERGLASS_BLOCK = new BlockDecorGlassBlock("panzerglass_block", 0, Material.GLASS, 1f, 2000f, SoundType.GLASS);
public static final BlockDecorSlab PANZERGLASS_SLAB = new BlockDecorSlab("panzerglass_slab", BlockDecor.CFG_TRANSLUCENT, Material.GLASS, 1f, 2000f, SoundType.GLASS);
public static final BlockDecorFull TREATED_WOOD_FLOOR = new BlockDecorFull("treated_wood_floor", 0, Material.WOOD, 0.5f, 10f, SoundType.WOOD);
//--------------------------------------------------------------------------------------------------------------------
public static final BlockDecorCraftingTable TREATED_WOOD_CRAFTING_TABLE = new BlockDecorCraftingTable(
@ -85,7 +87,7 @@ public class ModBlocks
public static final BlockDecorFurnace SMALL_LAB_FURNACE = new BlockDecorFurnace(
"small_lab_furnace",
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_LOOK_PLACEMENT|BlockDecor.CFG_OPPOSITE_PLACEMENT|
BlockDecor.CFG_ELECTRICAL,
BlockDecor.CFG_ELECTRICAL,
Material.IRON, 0.5f, 15f, SoundType.METAL,
ModAuxiliaries.getPixeledAABB(1,0,1, 15,15,16)
);
@ -118,12 +120,26 @@ public class ModBlocks
ModAuxiliaries.getPixeledAABB(1.1,0,1.1, 14.9,16,14.9)
);
public static final BlockDecorSolarPanel SMALL_SOLAR_PANEL = new BlockDecorSolarPanel(
"small_solar_panel",
BlockDecor.CFG_LOOK_PLACEMENT,
Material.IRON, 1f, 15f, SoundType.METAL,
ModAuxiliaries.getPixeledAABB(0,0,0, 16,11.5,16)
);
public static final BlockDecorTreeCutter SMALL_TREE_CUTTER = new BlockDecorTreeCutter(
"small_tree_cutter",
BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_LOOK_PLACEMENT|BlockDecor.CFG_FLIP_PLACEMENT_SHIFTCLICK,
Material.IRON, 1f, 15f, SoundType.METAL,
ModAuxiliaries.getPixeledAABB(0,0,0, 16,8,16)
);
//--------------------------------------------------------------------------------------------------------------------
public static final BlockDecorPipeValve STRAIGHT_CHECK_VALVE = new BlockDecorPipeValve(
"straight_pipe_valve",
BlockDecor.CFG_FACING_PLACEMENT|BlockDecor.CFG_OPPOSITE_PLACEMENT|BlockDecor.CFG_FLIP_PLACEMENT_SHIFTCLICK|
BlockDecor.CFG_CUTOUT,
BlockDecor.CFG_CUTOUT,
Material.IRON, 0.7f, 15f, SoundType.METAL,
ModAuxiliaries.getPixeledAABB(4,4,0, 12,12,16)
);
@ -131,7 +147,7 @@ public class ModBlocks
public static final BlockDecorPipeValve STRAIGHT_REDSTONE_VALVE = new BlockDecorPipeValve(
"straight_pipe_valve_redstone",
BlockDecor.CFG_FACING_PLACEMENT|BlockDecor.CFG_OPPOSITE_PLACEMENT|BlockDecor.CFG_FLIP_PLACEMENT_SHIFTCLICK|
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_REDSTONE_CONTROLLED,
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_REDSTONE_CONTROLLED,
Material.IRON, 0.7f, 15f, SoundType.METAL,
ModAuxiliaries.getPixeledAABB(4,4,0, 12,12,16)
);
@ -139,7 +155,7 @@ public class ModBlocks
public static final BlockDecorPipeValve STRAIGHT_REDSTONE_ANALOG_VALVE = new BlockDecorPipeValve(
"straight_pipe_valve_redstone_analog",
BlockDecor.CFG_FACING_PLACEMENT|BlockDecor.CFG_OPPOSITE_PLACEMENT|BlockDecor.CFG_FLIP_PLACEMENT_SHIFTCLICK|
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_REDSTONE_CONTROLLED|BlockDecor.CFG_ANALOG,
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_REDSTONE_CONTROLLED|BlockDecor.CFG_ANALOG,
Material.IRON, 0.7f, 15f, SoundType.METAL,
ModAuxiliaries.getPixeledAABB(4,4,0, 12,12,16)
);
@ -147,7 +163,7 @@ public class ModBlocks
public static final BlockDecorPassiveFluidAccumulator PASSIVE_FLUID_ACCUMULATOR = new BlockDecorPassiveFluidAccumulator(
"passive_fluid_accumulator",
BlockDecor.CFG_FACING_PLACEMENT|BlockDecor.CFG_OPPOSITE_PLACEMENT|BlockDecor.CFG_FLIP_PLACEMENT_SHIFTCLICK|
BlockDecor.CFG_CUTOUT,
BlockDecor.CFG_CUTOUT,
Material.IRON, 0.7f, 15f, SoundType.METAL,
ModAuxiliaries.getPixeledAABB(0,0,0, 16,16,16)
);
@ -408,8 +424,16 @@ public class ModBlocks
BlockDecorMineralSmelter.BTileEntity.class, "te_small_mineral_smelter"
);
private static final TileEntityRegistrationData SMALL_SOLAR_PANEL_TEI = new TileEntityRegistrationData(
BlockDecorSolarPanel.BTileEntity.class, "te_small_solar_panel"
);
private static final TileEntityRegistrationData SMALL_TREE_CUTTER_TEI = new TileEntityRegistrationData(
BlockDecorTreeCutter.BTileEntity.class, "te_small_tree_cutter"
);
//--------------------------------------------------------------------------------------------------------------------
//-- Registration list
//-- Block registration list
//--------------------------------------------------------------------------------------------------------------------
private static final Object content[] = {
@ -420,6 +444,7 @@ public class ModBlocks
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,
SMALL_MINERAL_SMELTER, SMALL_MINERAL_SMELTER_TEI,
CLINKER_BRICK_BLOCK,
CLINKER_BRICK_SLAB,
CLINKER_BRICK_STAIRS,
@ -467,11 +492,47 @@ public class ModBlocks
};
private static final Object dev_content[] = {
SMALL_MINERAL_SMELTER, SMALL_MINERAL_SMELTER_TEI,
PANZERGLASS_SLAB, // check if another class is needed due to is_side_visible
SIGN_MINDSTEP,
PANZERGLASS_SLAB, // @todo: check if another class is needed due to is_side_visible
SMALL_SOLAR_PANEL,SMALL_SOLAR_PANEL_TEI, // @todo: check power tuning <= Peltier generator
TREATED_WOOD_FLOOR, // @todo: check if textures need improvement
SMALL_TREE_CUTTER,SMALL_TREE_CUTTER_TEI, // @todo: test
};
//--------------------------------------------------------------------------------------------------------------------
//-- Items
//--------------------------------------------------------------------------------------------------------------------
private static final Item[] modItems = {
};
private static final ArrayList<Item> registeredItems = new ArrayList<>();
@Nonnull
public static List<Item> getRegisteredItems()
{ return Collections.unmodifiableList(registeredItems); }
public static final void registerItems(RegistryEvent.Register<Item> event)
{
// Config based registry selection
int num_registrations_skipped = 0;
ArrayList<Item> allItems = new ArrayList<>();
Collections.addAll(allItems, modItems);
final boolean woor = ModConfig.isWithoutOptOutRegistration();
for(Item e:allItems) {
if((!woor) || (!ModConfig.isOptedOut(e))) {
registeredItems.add(e);
} else {
++num_registrations_skipped;
}
}
for(Item e:registeredItems) event.getRegistry().register(e);
ModEngineersDecor.logger.info("Registered " + Integer.toString(registeredItems.size()) + " items.");
if(num_registrations_skipped > 0) {
ModEngineersDecor.logger.info("Skipped registration of " + num_registrations_skipped + " items.");
}
}
//--------------------------------------------------------------------------------------------------------------------
//-- Init
//--------------------------------------------------------------------------------------------------------------------
@ -531,6 +592,9 @@ public class ModBlocks
for(Block e:registeredBlocks) {
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(e), 0, new ModelResourceLocation(e.getRegistryName(), "inventory"));
}
for(Item e:registeredItems) {
if(e instanceof ItemDecor) ((ItemDecor)e).initModel();
}
}
// Invoked from CommonProxy.registerItems()

View file

@ -10,7 +10,6 @@ package wile.engineersdecor;
import wile.engineersdecor.detail.*;
import wile.engineersdecor.blocks.*;
import wile.engineersdecor.items.*;
import net.minecraft.world.World;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.client.multiplayer.WorldClient;
@ -124,11 +123,11 @@ public class ModEngineersDecor
{
@SubscribeEvent
public static void registerBlocks(final RegistryEvent.Register<Block> event)
{ ModBlocks.registerBlocks(event); }
{ ModContent.registerBlocks(event); }
@SubscribeEvent
public static void registerItems(final RegistryEvent.Register<Item> event)
{ ModBlocks.registerItemBlocks(event); ModItems.registerItems(event); }
{ ModContent.registerItemBlocks(event); ModContent.registerItems(event); }
@SubscribeEvent
public static void registerRecipes(RegistryEvent.Register<IRecipe> event)
@ -137,14 +136,14 @@ public class ModEngineersDecor
@SideOnly(Side.CLIENT)
@SubscribeEvent
public static void registerModels(final ModelRegistryEvent event)
{ ModBlocks.initModels(); ModItems.initModels(); }
{ ModContent.initModels(); }
}
public static final CreativeTabs CREATIVE_TAB_ENGINEERSDECOR = (new CreativeTabs("tabengineersdecor") {
@Override
@SideOnly(Side.CLIENT)
public @Nonnull ItemStack createIcon()
{ return new ItemStack(ModBlocks.SIGN_MODLOGO); }
{ return new ItemStack(ModContent.SIGN_MODLOGO); }
});
//--------------------------------------------------------------------------------------------------------------------

View file

@ -37,6 +37,7 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.List;
public class BlockDecor extends Block
{
@ -77,9 +78,8 @@ public class BlockDecor extends Block
setHardness((hardness > 0) ? hardness : 5.0f);
setResistance((resistance > 0) ? resistance : 10.0f);
setSoundType((sound==null) ? SoundType.STONE : sound);
setLightOpacity(0);
// @todo double check that instance variable
// not sure here ... if((config & CFG_TRANSLUCENT) != 0) this.translucent = true;
if(((config & (CFG_CUTOUT|CFG_TRANSLUCENT))!=0)) setLightOpacity(0);
if((config & CFG_TRANSLUCENT) != 0) this.translucent = true;
this.config = config;
this.aabb = boundingboxes;
}
@ -192,5 +192,4 @@ public class BlockDecor extends Block
@SuppressWarnings("deprecation")
public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos)
{}
}

View file

@ -248,7 +248,7 @@ public class BlockDecorDropper extends BlockDecorDirected
Networking.PacketTileNotify.sendToServer(te, nbt);
} else if(isPointInRegion(162, 66, 7, 9, mouseX, mouseY)) {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setInteger("manual_trigger", 1);
nbt.setInteger("drop_logic", container.fields_[5] ^ BTileEntity.DROPLOGIC_CONTINUOUS);
Networking.PacketTileNotify.sendToServer(te, nbt);
} else if(isPointInRegion(132, 66, 9, 9, mouseX, mouseY)) {
NBTTagCompound nbt = new NBTTagCompound();
@ -322,8 +322,10 @@ public class BlockDecorDropper extends BlockDecorDirected
{
int filter_gate_offset = ((container.fields_[5] & BTileEntity.DROPLOGIC_FILTER_ANDGATE) != 0) ? 11 : 0;
int extern_gate_offset = ((container.fields_[5] & BTileEntity.DROPLOGIC_EXTERN_ANDGATE) != 0) ? 11 : 0;
int pulse_mode_offset = ((container.fields_[5] & BTileEntity.DROPLOGIC_CONTINUOUS ) != 0) ? 10 : 0;
drawTexturedModalRect(x0+132, y0+66, 179+filter_gate_offset, 66, 9, 9);
drawTexturedModalRect(x0+148, y0+66, 179+extern_gate_offset, 66, 9, 9);
drawTexturedModalRect(x0+162, y0+66, 200+pulse_mode_offset, 66, 9, 9);
}
// drop timer running indicator
{
@ -456,10 +458,11 @@ public class BlockDecorDropper extends BlockDecorDirected
public static final int MAX_DROP_COUNT = 32;
public static final int DROP_PERIOD_OFFSET = 10;
///
public static final int DROPLOGIC_FILTER_ANDGATE = 0x1;
public static final int DROPLOGIC_EXTERN_ANDGATE = 0x2;
public static final int DROPLOGIC_SILENT_DROP = 0x4;
public static final int DROPLOGIC_SILENT_OPEN = 0x8;
public static final int DROPLOGIC_FILTER_ANDGATE = 0x01;
public static final int DROPLOGIC_EXTERN_ANDGATE = 0x02;
public static final int DROPLOGIC_SILENT_DROP = 0x04;
public static final int DROPLOGIC_SILENT_OPEN = 0x08;
public static final int DROPLOGIC_CONTINUOUS = 0x10;
///
private int filter_matches_[] = new int[CTRL_SLOTS_SIZE];
private int open_timer_ = 0;
@ -799,8 +802,10 @@ public class BlockDecorDropper extends BlockDecorDirected
if(--tick_timer_ > 0) return;
tick_timer_ = TICK_INTERVAL;
boolean dirty = block_power_updated_;
boolean redstone_trigger = (block_power_signal_ && block_power_updated_);
final boolean continuous_mode = (drop_logic_ & DROPLOGIC_CONTINUOUS)!=0;
boolean redstone_trigger = (block_power_signal_ && ((block_power_updated_) || (continuous_mode)));
boolean filter_trigger;
boolean filter_defined = false;
boolean trigger;
// Trigger logic
{
@ -808,9 +813,9 @@ public class BlockDecorDropper extends BlockDecorDirected
for(int i=INPUT_SLOTS_FIRST; i<(INPUT_SLOTS_FIRST+INPUT_SLOTS_SIZE); ++i) {
if(stacks_.get(i).getCount() >= drop_count_) { droppable_slot_found = true; break; }
}
int filter_nset = 0;
// From filters / inventory checks
{
int filter_nset = 0;
int last_filter_matches_[] = filter_matches_.clone();
boolean slot_assigned = false;
for(int ci=0; ci<CTRL_SLOTS_SIZE; ++ci) {
@ -836,12 +841,13 @@ public class BlockDecorDropper extends BlockDecorDirected
if(filter_matches_[i] > 1) ++nmatched;
if(filter_matches_[i] != last_filter_matches_[i]) dirty = true;
}
filter_trigger = ((filter_nset >0) && (nmatched > 0));
filter_defined = (filter_nset > 0);
filter_trigger = ((filter_nset > 0) && (nmatched > 0));
if(((drop_logic_ & DROPLOGIC_FILTER_ANDGATE) != 0) && (nmatched != filter_nset)) filter_trigger = false;
}
// gates
{
if(filter_nset > 0) {
if(filter_defined) {
trigger = ((drop_logic_ & DROPLOGIC_EXTERN_ANDGATE) != 0) ? (filter_trigger && redstone_trigger) : (filter_trigger || redstone_trigger);
} else {
trigger = redstone_trigger;

View file

@ -54,4 +54,8 @@ public class BlockDecorFull extends BlockDecor
public boolean isNormalCube(IBlockState state)
{ return true; }
@Override
public int getLightValue(IBlockState state, IBlockAccess world, BlockPos pos)
{ return (int)((config & CFG_LIGHT_VALUE_MASK) >> CFG_LIGHT_VALUE_SHIFT); }
}

View file

@ -15,6 +15,7 @@ import net.minecraft.block.properties.PropertyInteger;
import net.minecraft.util.EnumHand;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import wile.engineersdecor.ModContent;
import wile.engineersdecor.detail.ModAuxiliaries;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.material.Material;
@ -108,9 +109,9 @@ public class BlockDecorHorizontalSupport extends BlockDecor
final EnumFacing dfacing = dstate.getValue(BlockDecorStraightPole.FACING);
final BlockDecorStraightPole pole = (BlockDecorStraightPole)dstate.getBlock();
if((dfacing.getAxis() == EnumFacing.Axis.Y)) {
if((pole==ModBlocks.THICK_STEEL_POLE) || ((pole==ModBlocks.THICK_STEEL_POLE_HEAD) && (dfacing==EnumFacing.UP))) {
if((pole==ModContent.THICK_STEEL_POLE) || ((pole==ModContent.THICK_STEEL_POLE_HEAD) && (dfacing==EnumFacing.UP))) {
down_connector = 2;
} else if((pole==ModBlocks.THIN_STEEL_POLE) || ((pole==ModBlocks.THIN_STEEL_POLE_HEAD) && (dfacing==EnumFacing.UP))) {
} else if((pole==ModContent.THIN_STEEL_POLE) || ((pole==ModContent.THIN_STEEL_POLE_HEAD) && (dfacing==EnumFacing.UP))) {
down_connector = 1;
}
}

View file

@ -0,0 +1,177 @@
/*
* @file BlockDecorDirected.java
* @author Stefan Wilhelm (wile)
* @copyright (C) 2019 Stefan Wilhelm
* @license MIT (see https://opensource.org/licenses/MIT)
*
* Smaller (cutout) block with a defined facing.
*/
package wile.engineersdecor.blocks;
import net.minecraft.util.math.MathHelper;
import net.minecraftforge.energy.CapabilityEnergy;
import net.minecraftforge.energy.IEnergyStorage;
import wile.engineersdecor.ModEngineersDecor;
import net.minecraft.block.properties.PropertyInteger;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.BlockFaceShape;
import net.minecraft.block.state.IBlockState;
import net.minecraft.block.SoundType;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ITickable;
import net.minecraft.world.World;
import net.minecraft.world.IBlockAccess;
import net.minecraft.util.EnumHand;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class BlockDecorSolarPanel extends BlockDecor
{
public static final PropertyInteger EXPOSITION = PropertyInteger.create("exposition", 0, 4);
public BlockDecorSolarPanel(@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 boolean isOpaqueCube(IBlockState state)
{ return false; }
@Override
public boolean isFullCube(IBlockState state)
{ return false; }
@Override
public boolean isNormalCube(IBlockState state)
{ return false; }
@Override
public boolean canCreatureSpawn(IBlockState state, IBlockAccess world, BlockPos pos, net.minecraft.entity.EntityLiving.SpawnPlacementType type)
{ return false; }
@Override
public int getLightValue(IBlockState state, IBlockAccess world, BlockPos pos)
{ return 0; }
@Override
public BlockFaceShape getBlockFaceShape(IBlockAccess world, IBlockState state, BlockPos pos, EnumFacing face)
{ return BlockFaceShape.UNDEFINED; }
@Override
public IBlockState getStateFromMeta(int meta)
{ return this.getDefaultState().withProperty(EXPOSITION, (meta & 0x7)); }
@Override
public int getMetaFromState(IBlockState state)
{ return state.getValue(EXPOSITION); }
@Override
protected BlockStateContainer createBlockState()
{ return new BlockStateContainer(this, EXPOSITION); }
@Override
public boolean canPlaceBlockOnSide(World world, BlockPos pos, EnumFacing side)
{ return super.canPlaceBlockOnSide(world, pos, side); }
@Override
public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand)
{ return getDefaultState().withProperty(EXPOSITION, 0); }
@Override
public boolean hasTileEntity(IBlockState state)
{ return true; }
@Override
@Nullable
public TileEntity createTileEntity(World world, IBlockState state)
{ return new BlockDecorSolarPanel.BTileEntity(); }
//--------------------------------------------------------------------------------------------------------------------
// Tile entity
//--------------------------------------------------------------------------------------------------------------------
public static class BTileEntity extends TileEntity implements ITickable
{
public static final int DEFAULT_PEAK_POWER = 45;
public static final int TICK_INTERVAL = 8;
public static final int ACCUMULATION_INTERVAL = 4;
private static final EnumFacing transfer_directions_[] = {EnumFacing.DOWN, EnumFacing.EAST, EnumFacing.SOUTH, EnumFacing.WEST, EnumFacing.NORTH };
private static int peak_power_per_tick_ = DEFAULT_PEAK_POWER;
private static int max_power_storage_ = 10000;
private int tick_timer_ = 0;
private int recalc_timer_ = 0;
private int accumulated_power_ = 0;
public static void on_config(int peak_power_per_tick)
{
peak_power_per_tick_ = peak_power_per_tick;
ModEngineersDecor.logger.info("Config small solar panel: Peak production:" + peak_power_per_tick_ + "/tick");
}
//------------------------------------------------------------------------------------------------------------------
public BTileEntity()
{}
public void readnbt(NBTTagCompound nbt, boolean update_packet)
{ accumulated_power_ = nbt.getInteger("energy"); }
protected void writenbt(NBTTagCompound nbt, boolean update_packet)
{ nbt.setInteger("energy", accumulated_power_); }
// TileEntity ------------------------------------------------------------------------------
@Override
public boolean shouldRefresh(World world, BlockPos pos, IBlockState os, IBlockState ns)
{ return (os.getBlock() != ns.getBlock()) || (!(ns.getBlock() instanceof BlockDecorSolarPanel)); }
@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; }
@Override
public void update()
{
if((world.isRemote) || (--tick_timer_ > 0)) return;
tick_timer_ = TICK_INTERVAL;
if(!world.canSeeSky(pos)) { tick_timer_ = TICK_INTERVAL * 5; return; }
if(accumulated_power_ > 0) {
for(int i=0; (i<transfer_directions_.length) && (accumulated_power_>0); ++i) {
final EnumFacing f = transfer_directions_[i];
TileEntity te = world.getTileEntity(pos.offset(f));
if((te==null) || (!(te.hasCapability(CapabilityEnergy.ENERGY, f.getOpposite())))) continue;
IEnergyStorage es = te.getCapability(CapabilityEnergy.ENERGY, f.getOpposite());
if(!es.canReceive()) continue;
accumulated_power_ = MathHelper.clamp(accumulated_power_-es.receiveEnergy(accumulated_power_, false),0, accumulated_power_);
}
}
if(--recalc_timer_ > 0) return;
recalc_timer_ = ACCUMULATION_INTERVAL + ((int)(Math.random()+.5));
IBlockState state = world.getBlockState(pos);
int theta = ((((int)(world.getCelestialAngleRadians(1f) * (180.0/Math.PI)))+90) % 360);
int e = 2;
if(theta > 340) e = 2;
else if(theta < 45) e = 0;
else if(theta < 80) e = 1;
else if(theta < 100) e = 2;
else if(theta < 135) e = 3;
else if(theta < 190) e = 4;
IBlockState nstate = state.withProperty(EXPOSITION, e);
if(nstate != state) world.setBlockState(pos, nstate, 1|2);
double rf = Math.abs(1.0-(((double)Math.abs(MathHelper.clamp(theta, 0, 180)-90))/90));
rf = Math.sqrt(rf) * world.getSunBrightnessFactor(1f) * ((TICK_INTERVAL*ACCUMULATION_INTERVAL)+2) * peak_power_per_tick_;
accumulated_power_ = Math.min(accumulated_power_+(int)rf, max_power_storage_);
}
}
}

View file

@ -0,0 +1,209 @@
/*
* @file BlockFurnace.java
* @author Stefan Wilhelm (wile)
* @copyright (C) 2019 Stefan Wilhelm
* @license MIT (see https://opensource.org/licenses/MIT)
*
* ED Lab furnace.
*/
package wile.engineersdecor.blocks;
import wile.engineersdecor.ModEngineersDecor;
import wile.engineersdecor.detail.TreeCutting;
import net.minecraft.block.properties.PropertyBool;
import net.minecraft.block.state.BlockStateContainer;
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.EntityLivingBase;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.init.SoundEvents;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
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.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Random;
public class BlockDecorTreeCutter extends BlockDecorDirectedHorizontal
{
public static final PropertyBool ACTIVE = PropertyBool.create("active");
public BlockDecorTreeCutter(@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, FACING, ACTIVE); }
@Override
public IBlockState getStateFromMeta(int meta)
{ return getDefaultState().withProperty(FACING, EnumFacing.byHorizontalIndex(meta & 0x3)).withProperty(ACTIVE, (meta & 0x4)!=0); }
@Override
public int getMetaFromState(IBlockState state)
{ return (state.getValue(FACING).getHorizontalIndex() & 0x3) | (state.getValue(ACTIVE) ? 4 : 0); }
@Override
public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand)
{ return super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand).withProperty(ACTIVE, false); }
@Override
public boolean hasTileEntity(IBlockState state)
{ return true; }
@Override
@Nullable
public TileEntity createTileEntity(World world, IBlockState state)
{ return new BlockDecorTreeCutter.BTileEntity(); }
@Override
@SideOnly(Side.CLIENT)
public void randomDisplayTick(IBlockState state, World world, BlockPos pos, Random rnd)
{
if((state.getBlock()!=this) || (!state.getValue(ACTIVE))) return;
final double rv = rnd.nextDouble();
if(rv > 0.8) return;
final double x=0.5+pos.getX(), y=0.5+pos.getY(), z=0.5+pos.getZ();
final double xc=0.52, xr=rnd.nextDouble()*0.4-0.2, yr=(y-0.3+rnd.nextDouble()*0.2);
switch(state.getValue(FACING)) {
case WEST: world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, x-xc, yr, z+xr, 0.0, 0.0, 0.0); break;
case EAST: world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, x+xc, yr, z+xr, 0.0, 0.0, 0.0); break;
case NORTH: world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, x+xr, yr, z-xc, 0.0, 0.0, 0.0); break;
default: world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, x+xr, yr, z+xc, 0.0, 0.0, 0.0); break;
}
}
//--------------------------------------------------------------------------------------------------------------------
// Tile entity
//--------------------------------------------------------------------------------------------------------------------
public static class BTileEntity extends TileEntity implements ITickable, IEnergyStorage
{
public static final int IDLE_TICK_INTERVAL = 40;
public static final int TICK_INTERVAL = 5;
public static final int BOOST_FACTOR = 6;
public static final int DEFAULT_BOOST_ENERGY = 64;
public static final int DEFAULT_CUTTING_TIME_NEEDED = 20 * 60; // 60 secs, so that people don't come to the bright idea to carry one with them.
private static int boost_energy_consumption = DEFAULT_BOOST_ENERGY;
private static int cutting_time_needed = DEFAULT_CUTTING_TIME_NEEDED;
private int tick_timer_;
private int proc_time_elapsed_; // small, not saved in nbt.
private int boost_energy_; // small, not saved in nbt.
public static void on_config(int boost_energy_per_tick)
{
boost_energy_consumption = TICK_INTERVAL * MathHelper.clamp(boost_energy_per_tick, 16, 512);
ModEngineersDecor.logger.info("Config tree cutter: Boost energy consumption:" + boost_energy_consumption + "rf/t");
}
public BTileEntity()
{}
// TileEntity ------------------------------------------------------------------------------
@Override
public boolean shouldRefresh(World world, BlockPos pos, IBlockState os, IBlockState ns)
{ return (os.getBlock() != ns.getBlock()) || (!(ns.getBlock() instanceof BlockDecorTreeCutter)); }
// IEnergyStorage ----------------------------------------------------------------------------
@Override
public boolean canExtract()
{ return false; }
@Override
public boolean canReceive()
{ return true; }
@Override
public int getMaxEnergyStored()
{ return boost_energy_consumption; }
@Override
public int getEnergyStored()
{ return boost_energy_; }
@Override
public int extractEnergy(int maxExtract, boolean simulate)
{ return 0; }
@Override
public int receiveEnergy(int maxReceive, boolean simulate)
{ // only speedup support, no buffering, not in nbt -> no markdirty
if((boost_energy_ >= boost_energy_consumption) || (maxReceive < boost_energy_consumption)) return 0;
if(!simulate) boost_energy_ = boost_energy_consumption;
return boost_energy_consumption;
}
// Capability export ----------------------------------------------------------------------------
@Override
public boolean hasCapability(Capability<?> cap, EnumFacing facing)
{ return ((cap==CapabilityEnergy.ENERGY)) || super.hasCapability(cap, facing); }
@Override
@SuppressWarnings("unchecked")
@Nullable
public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing)
{
if(capability == CapabilityEnergy.ENERGY) {
return (T)this;
} else {
return super.getCapability(capability, facing);
}
}
// ITickable ------------------------------------------------------------------------------------
@Override
public void update()
{
if(--tick_timer_ > 0) return;
if(world.isRemote) {
if(!world.getBlockState(pos).getValue(ACTIVE)) {
tick_timer_ = TICK_INTERVAL;
} else {
tick_timer_ = 1;
world.playSound(pos.getX(), pos.getY(), pos.getZ(), SoundEvents.BLOCK_WOOD_HIT, SoundCategory.BLOCKS, 0.1f, 1.0f, false);
}
} else {
tick_timer_ = TICK_INTERVAL;
final IBlockState device_state = world.getBlockState(pos);
final BlockPos tree_pos = pos.offset(device_state.getValue(FACING));
final IBlockState tree_state = world.getBlockState(tree_pos);
if(!TreeCutting.canChop(tree_state) || (world.isBlockPowered(pos))) {
if(device_state.getValue(ACTIVE)) world.setBlockState(pos, device_state.withProperty(ACTIVE, false), 1|2);
proc_time_elapsed_ = 0;
tick_timer_ = IDLE_TICK_INTERVAL;
return;
}
proc_time_elapsed_ += TICK_INTERVAL;
if(boost_energy_ >= boost_energy_consumption) { boost_energy_ = 0; proc_time_elapsed_ += TICK_INTERVAL*BOOST_FACTOR; }
boolean active = true;
if(proc_time_elapsed_ >= cutting_time_needed) {
proc_time_elapsed_ = 0;
TreeCutting.chopTree(world, tree_state, tree_pos, 512, false);
world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), SoundEvents.BLOCK_WOOD_BREAK, SoundCategory.BLOCKS, 1.0f, 1.0f);
active = false;
}
if(device_state.getValue(ACTIVE) != active) {
world.setBlockState(pos, device_state.withProperty(ACTIVE, active), 1|2);
}
}
}
}
}

View file

@ -0,0 +1,101 @@
/*
* @file BlockCategories.java
* @author Stefan Wilhelm (wile)
* @copyright (C) 2019 Stefan Wilhelm
* @license MIT (see https://opensource.org/licenses/MIT)
*
* Oredict based block category cache.
*/
package wile.engineersdecor.detail;
import wile.engineersdecor.ModEngineersDecor;
import net.minecraft.block.*;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.state.IBlockState;
import net.minecraft.block.material.Material;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class BlockCategories
{
private static Set<Block> logs_ = new HashSet<Block>();
private static Set<Block> leaves_ = new HashSet<Block>();
public static final Set<Block> logs()
{ return logs_; } // wrap in case immutable needed one time.
public static final Set<Block> leaves()
{ return leaves_; }
public static boolean isLog(IBlockState state)
{
final Block block = state.getBlock();
return (block instanceof BlockLog) || (block instanceof BlockNewLog) || (logs().contains(block));
}
public static boolean isLeaves(IBlockState state)
{
if(state.getMaterial()==Material.LEAVES) return true;
final Block block = state.getBlock();
return (block instanceof BlockLeaves) || (leaves().contains(block));
}
public static final boolean isSameLeaves(IBlockState a, IBlockState b)
{ return (a.getBlock() == b.getBlock()); }
public static final boolean isSameLog(IBlockState a, IBlockState b)
{
// very strange ...
if(a.getBlock()!=b.getBlock()) {
return false;
} else if(a.getBlock() instanceof BlockNewLog) {
return a.getValue(BlockNewLog.VARIANT) == b.getValue(BlockNewLog.VARIANT);
} else if(a.getBlock() instanceof BlockOldLog) {
return a.getValue(BlockOldLog.VARIANT) == b.getValue(BlockOldLog.VARIANT);
} else {
// Uagh, that hurts the heart of performance ...
final IProperty<?> prop = a.getPropertyKeys().stream().filter( (IProperty<?> p) -> (p.getName().contains("variant") || p.getName().contains("type"))).findFirst().orElse(null);
if(prop==null) return false;
return a.getValue(prop).equals(b.getValue(prop));
}
}
public static final void reload()
{
{
HashSet<Block> logs = new HashSet<Block>();
for(final String ore_name : OreDictionary.getOreNames()) {
if(!ore_name.startsWith("logWood")) continue;
final List<ItemStack> stacks = OreDictionary.getOres(ore_name, false);
for(ItemStack stack : stacks) {
final Item item = stack.getItem();
if(!(item instanceof ItemBlock)) continue;
logs.add(((ItemBlock)item).getBlock());
}
}
logs_ = logs;
ModEngineersDecor.logger.info("Found "+logs.size()+" types of 'choppable' log.");
}
{
HashSet<Block> leaves = new HashSet<Block>();
for(final String ore_name : OreDictionary.getOreNames()) {
if(!ore_name.startsWith("treeLeaves")) continue;
final List<ItemStack> stacks = OreDictionary.getOres(ore_name, false);
for(ItemStack stack : stacks) {
final Item item = stack.getItem();
if(!(item instanceof ItemBlock)) continue;
leaves.add(((ItemBlock)item).getBlock());
}
}
leaves_ = leaves;
ModEngineersDecor.logger.info("Found "+leaves.size()+" types of leaves.");
}
}
}

View file

@ -9,6 +9,7 @@
*/
package wile.engineersdecor.detail;
import wile.engineersdecor.ModContent;
import wile.engineersdecor.ModEngineersDecor;
import wile.engineersdecor.blocks.*;
import net.minecraftforge.common.config.Config;
@ -320,6 +321,17 @@ public class ModConfig
@Config.Name("E-furnace: Power consumption")
@Config.RangeInt(min=10, max=256)
public int e_furnace_power_consumption = BlockDecorFurnaceElectrical.BTileEntity.DEFAULT_ENERGY_CONSUMPTION;
@Config.Comment({
"Defines the peak power production (at noon) of the Small Solar Panel. " +
"Note that the agerage power is much less, as no power is produced at all during the night, " +
"and the power curve is nonlinear rising/falling during the day. Bad weather conditions also " +
"decrease the production. " +
"The config value can be changed on-the-fly for tuning."
})
@Config.Name("Solar panel: Peak power")
@Config.RangeInt(min=5, max=128)
public int solar_panel_peak_power = BlockDecorSolarPanel.BTileEntity.DEFAULT_PEAK_POWER;
}
@SuppressWarnings("unused")
@ -340,7 +352,7 @@ public class ModConfig
@SuppressWarnings("unused")
public static final void onPostInit(FMLPostInitializationEvent event)
{ for(Block e:ModBlocks.getRegisteredBlocks()) ModConfig.isOptedOut(e, true); }
{ for(Block e: ModContent.getRegisteredBlocks()) ModConfig.isOptedOut(e, true); }
private static final ArrayList<String> includes_ = new ArrayList<String>();
private static final ArrayList<String> excludes_ = new ArrayList<String>();
@ -360,7 +372,7 @@ public class ModConfig
public static final boolean isOptedOut(final @Nullable Block block, boolean with_log_details)
{
if((block == null) || (optout==null)) return true;
if(block == ModBlocks.SIGN_MODLOGO) return true;
if(block == ModContent.SIGN_MODLOGO) return true;
if((!zmisc.with_experimental) && (block instanceof ModAuxiliaries.IExperimentalFeature)) return true;
final String rn = block.getRegistryName().getPath();
// Force-include/exclude pattern matching
@ -432,6 +444,7 @@ public class ModConfig
BlockDecorCraftingTable.on_config(optout.without_crafting_table_history, false, tweaks.with_crafting_quickmove_buttons);
BlockDecorPipeValve.on_config(tweaks.pipevalve_max_flowrate, tweaks.pipevalve_redstone_slope);
BlockDecorFurnaceElectrical.BTileEntity.on_config(tweaks.e_furnace_speed_percent, tweaks.e_furnace_power_consumption);
BlockDecorSolarPanel.BTileEntity.on_config(tweaks.solar_panel_peak_power);
{
optout.includes = optout.includes.toLowerCase().replaceAll(ModEngineersDecor.MODID+":", "").replaceAll("[^*_,a-z0-9]", "");
if(!optout.includes.isEmpty()) ModEngineersDecor.logger.info("Pattern includes: '" + optout.includes + "'");

View file

@ -0,0 +1,168 @@
/*
* @file TreeCutting.java
* @author Stefan Wilhelm (wile)
* @copyright (C) 2019 Stefan Wilhelm
* @license MIT (see https://opensource.org/licenses/MIT)
*
* Simple tree cutting algorithm.
*/
package wile.engineersdecor.detail;
import com.google.common.collect.ImmutableList;
import net.minecraft.block.Block;
import net.minecraft.block.BlockVine;
import net.minecraft.block.state.IBlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3i;
import net.minecraft.world.World;
import java.util.*;
public class TreeCutting
{
private static final List<Vec3i> hoffsets = ImmutableList.of(
new Vec3i( 1,0, 0), new Vec3i( 1,0, 1), new Vec3i( 0,0, 1),
new Vec3i(-1,0, 1), new Vec3i(-1,0, 0), new Vec3i(-1,0,-1),
new Vec3i( 0,0,-1), new Vec3i( 1,0,-1)
);
private static List<BlockPos> findBlocksAround(final World world, final BlockPos centerPos, final IBlockState leaf_type_state, final Set<BlockPos> checked, int recursion_left)
{
ArrayList<BlockPos> to_decay = new ArrayList<BlockPos>();
for(int y=-1; y<=1; ++y) {
final BlockPos layer = centerPos.add(0,y,0);
for(Vec3i v:hoffsets) {
BlockPos pos = layer.add(v);
if((!checked.contains(pos)) && BlockCategories.isSameLeaves(leaf_type_state, world.getBlockState(pos))) {
checked.add(pos);
to_decay.add(pos);
if(recursion_left > 0) {
to_decay.addAll(findBlocksAround(world, pos, leaf_type_state, checked, recursion_left-1));
}
}
}
}
return to_decay;
}
public static boolean canChop(IBlockState state)
{ return BlockCategories.isLog(state); }
/**
* Chops a tree, returns the damage that the cutting tool shall take
*/
public static int chopTree(World world, IBlockState broken_state, BlockPos startPos, int max_blocks_to_break, boolean without_target_block)
{
if(!BlockCategories.isLog(broken_state)) return 0;
final long ymin = startPos.getY();
final long max_leaf_distance = 6;
Set<BlockPos> checked = new HashSet<BlockPos>();
ArrayList<BlockPos> to_break = new ArrayList<BlockPos>();
ArrayList<BlockPos> to_decay = new ArrayList<BlockPos>();
checked.add(startPos);
// Initial simple layer-up search of same logs. This forms the base corpus, and only leaves and
// leaf-enclosed logs attached to this corpus may be broken/decayed.
{
LinkedList<BlockPos> queue = new LinkedList<BlockPos>();
LinkedList<BlockPos> upqueue = new LinkedList<BlockPos>();
queue.add(startPos);
int cutlevel = 0;
int steps_left = 64;
while(!queue.isEmpty() && (--steps_left >= 0)) {
final BlockPos pos = queue.removeFirst();
// Vertical search
final BlockPos uppos = pos.up();
final IBlockState upstate = world.getBlockState(uppos);
if(!checked.contains(uppos)) {
checked.add(uppos);
if(BlockCategories.isSameLog(upstate, broken_state)) {
// Up is log
upqueue.add(uppos);
to_break.add(uppos);
steps_left = 64;
} else {
boolean isleaf = BlockCategories.isLeaves(upstate);
if(isleaf || world.isAirBlock(uppos) || (upstate.getBlock() instanceof BlockVine)) {
if(isleaf) to_decay.add(uppos);
// Up is air, check adjacent for diagonal up (e.g. Accacia)
for(Vec3i v:hoffsets) {
final BlockPos p = uppos.add(v);
if(checked.contains(p)) continue;
checked.add(p);
final IBlockState st = world.getBlockState(p);
final Block bl = st.getBlock();
if(BlockCategories.isSameLog(st, broken_state)) {
queue.add(p);
to_break.add(p);
} else if(BlockCategories.isLeaves(st)) {
to_decay.add(p);
}
}
}
}
}
// Lateral search
for(Vec3i v:hoffsets) {
final BlockPos p = pos.add(v);
if(checked.contains(p)) continue;
checked.add(p);
if(p.distanceSq(new BlockPos(startPos.getX(), p.getY(), startPos.getZ())) > (3+cutlevel*cutlevel)) continue;
final IBlockState st = world.getBlockState(p);
final Block bl = st.getBlock();
if(BlockCategories.isSameLog(st, broken_state)) {
queue.add(p);
to_break.add(p);
} else if(BlockCategories.isLeaves(st)) {
to_decay.add(p);
}
}
if(queue.isEmpty() && (!upqueue.isEmpty())) {
queue = upqueue;
upqueue = new LinkedList<BlockPos>();
++cutlevel;
}
}
}
{
// Determine lose logs between the leafs
for(BlockPos pos:to_decay) {
int dist = 1;
to_break.addAll(findBlocksAround(world, pos, broken_state, checked, dist));
}
}
if(!to_decay.isEmpty()) {
final IBlockState leaf_type_state = world.getBlockState(to_decay.get(0));
final ArrayList<BlockPos> leafs = to_decay;
to_decay = new ArrayList<BlockPos>();
for(BlockPos pos:leafs) {
int dist = 2;
to_decay.add(pos);
to_decay.addAll(findBlocksAround(world, pos, leaf_type_state, checked, dist));
}
}
if(without_target_block) {
checked.remove(startPos);
} else {
to_break.add(startPos);
}
int num_broken = 0;
Collections.reverse(to_break);
for(BlockPos pos:to_break) {
if(++num_broken > max_blocks_to_break) break;
IBlockState state = world.getBlockState(pos);
world.setBlockToAir(pos);
state.getBlock().dropBlockAsItem(world, pos, state, 0);
}
for(BlockPos pos:to_decay) {
if(++num_broken > max_blocks_to_break) break;
IBlockState state = world.getBlockState(pos);
world.setBlockToAir(pos);
state.getBlock().dropBlockAsItem(world, pos, state, 0);
}
{
// And now the bill.
return MathHelper.clamp(((to_break.size()*6/5)+(to_decay.size()/10)-1), 1, 65535);
}
}
}

View file

@ -9,8 +9,8 @@
package wile.engineersdecor.eapi.jei;
import wile.engineersdecor.ModEngineersDecor;
import wile.engineersdecor.blocks.BlockDecorCraftingTable;
import wile.engineersdecor.blocks.ModBlocks;
import wile.engineersdecor.ModContent;
import wile.engineersdecor.blocks.*;
import wile.engineersdecor.detail.ModConfig;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
@ -25,7 +25,7 @@ public class JEIPlugin implements mezz.jei.api.IModPlugin
{
// Block/item hiding
try {
for(Block e:ModBlocks.getRegisteredBlocks()) {
for(Block e:ModContent.getRegisteredBlocks()) {
if(ModConfig.isOptedOut(e)) {
ItemStack stack = new ItemStack(Item.getItemFromBlock(e));
if(stack != null) {

View file

@ -1,63 +0,0 @@
/*
* @file ModItems.java
* @author Stefan Wilhelm (wile)
* @copyright (C) 2018 Stefan Wilhelm
* @license MIT (see https://opensource.org/licenses/MIT)
*
* Definition and initialisation of items of this module.
*/
package wile.engineersdecor.items;
import wile.engineersdecor.ModEngineersDecor;
import wile.engineersdecor.detail.ModConfig;
import net.minecraft.item.Item;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
import javax.annotation.Nonnull;
@SuppressWarnings("unused")
public class ModItems
{
private static final Item[] modItems = {
};
private static final ArrayList<Item> registeredItems = new ArrayList<>();
@Nonnull
public static List<Item> getRegisteredItems()
{ return Collections.unmodifiableList(registeredItems); }
public static final void registerItems(RegistryEvent.Register<Item> event)
{
// Config based registry selection
int num_registrations_skipped = 0;
ArrayList<Item> allItems = new ArrayList<>();
Collections.addAll(allItems, modItems);
final boolean woor = ModConfig.isWithoutOptOutRegistration();
for(Item e:allItems) {
if((!woor) || (!ModConfig.isOptedOut(e))) {
registeredItems.add(e);
} else {
++num_registrations_skipped;
}
}
for(Item e:registeredItems) event.getRegistry().register(e);
ModEngineersDecor.logger.info("Registered " + Integer.toString(registeredItems.size()) + " items.");
if(num_registrations_skipped > 0) {
ModEngineersDecor.logger.info("Skipped registration of " + num_registrations_skipped + " items.");
}
}
@SideOnly(Side.CLIENT)
public static final void initModels()
{
for(Item e:registeredItems) {
if(e instanceof ItemDecor) ((ItemDecor)e).initModel();
}
}
}

View file

@ -0,0 +1,17 @@
{
"forge_marker": 1,
"defaults": {
"model": "engineersdecor:device/small_solar_panel_model_exp1"
},
"variants": {
"normal": [{}],
"inventory": [{}],
"exposition": {
"0" : { "model": "engineersdecor:device/small_solar_panel_model_exp0" },
"1" : {},
"2" : { "model": "engineersdecor:device/small_solar_panel_model_exp2" },
"3" : { "model": "engineersdecor:device/small_solar_panel_model_exp3" },
"4" : { "model": "engineersdecor:device/small_solar_panel_model_exp4" }
}
}
}

View file

@ -0,0 +1,12 @@
{
"forge_marker": 1,
"defaults": {
"model": "engineersdecor:device/small_tree_cutter_model"
},
"variants": {
"normal": [{}],
"inventory": [{}],
"facing": { "north": {"y":0}, "south": {"y":180}, "west": {"y":-90}, "east": {"y":90}, "up":{}, "down":{} },
"active": { "true":{ "model": "engineersdecor:device/small_tree_cutter_model_active" }, "false":{}}
}
}

View file

@ -0,0 +1,16 @@
{
"forge_marker": 1,
"defaults": {
"model": "engineersdecor:std/decor_full_block_model",
"textures": { "all": "engineersdecor:blocks/furniture/treated_wood_floor_texture_1" }
},
"variants": {
"normal": [
{ "textures":{ "all": "engineersdecor:blocks/furniture/treated_wood_floor_texture_1" }},
{ "textures":{ "all": "engineersdecor:blocks/furniture/treated_wood_floor_texture_2" }},
{ "textures":{ "all": "engineersdecor:blocks/furniture/treated_wood_floor_texture_3" }},
{ "textures":{ "all": "engineersdecor:blocks/furniture/treated_wood_floor_texture_4" }}
],
"inventory": [{}]
}
}

View file

@ -36,6 +36,8 @@ tile.engineersdecor.rebar_concrete_tile_slab.name=Rebar Concrete Tile Slab
tile.engineersdecor.rebar_concrete_tile_slab.help=§6Steel reinforced concrete tile slab.§r Expensive but Creeper-proof like obsidian.
tile.engineersdecor.panzerglass_slab.name=Panzer Glass Slab
tile.engineersdecor.panzerglass_slab.help=§6Reinforced glass slab.§r Expensive, explosion-proof. Dark gray tint, faint structural lines visible.
tile.engineersdecor.treated_wood_floor.name=Treated Wood Floor
tile.engineersdecor.treated_wood_floor.help=§6Decorative floor tiles with texture variations.§r
#-----------------------------------------------------------------------------------------------------------
tile.engineersdecor.rebar_concrete_wall.name=Rebar Concrete Wall
tile.engineersdecor.rebar_concrete_wall.help=§6Steel reinforced concrete wall.§r Expensive but Creeper-proof like obsidian.
@ -155,6 +157,15 @@ tile.engineersdecor.small_mineral_smelter.help=§6High temperature, high insulat
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.
tile.engineersdecor.small_solar_panel.name=Small Solar Panel
tile.engineersdecor.small_solar_panel.help=§6Produces a small amount of power when exposed to sunlight.§r\n\
Useful for charging LF capacitors in remote systems with low consumption. The \
internal charge pump circuit accumulates and frequently transfers RF. Production \
depends on day time and the weather.
tile.engineersdecor.small_tree_cutter.name=Small Tree Cutter
tile.engineersdecor.small_tree_cutter.help=§6Chops grown trees in front of it.§r\n\
Does not collect the lumbers. Deactivate with a redstone signal. \
Provide RF power to boost the cutting speed.
#-----------------------------------------------------------------------------------------------------------
tile.engineersdecor.sign_decor.name=Sign Plate (Engineer's decor)
tile.engineersdecor.sign_decor.help=§6This should not be craftable or visible in JEI. Used for creative tab and screenshots.

View file

@ -36,6 +36,8 @@ tile.engineersdecor.rebar_concrete_tile_slab.name=Железобетонная
tile.engineersdecor.rebar_concrete_tile_slab.help=§6Бетонная плитка, усиленная сталью.§r Дорогая, но взрывоустойчивая, как обсидиан.
tile.engineersdecor.panzerglass_slab.name=Плита из бронированного стекла
tile.engineersdecor.panzerglass_slab.help=§6Усиленная стеклянная плита.§r Дорогая, взрывоустойчивая. Имеет тёмно-серый оттенок, слегка видны структурные линии.
tile.engineersdecor.treated_wood_floor.name=Treated Wood Floor
#tile.engineersdecor.treated_wood_floor.help=§6Decorative floor tiles with texture variations.§r
#-----------------------------------------------------------------------------------------------------------
tile.engineersdecor.rebar_concrete_wall.name=Железобетонная стена
tile.engineersdecor.rebar_concrete_wall.help=§6Стальная железобетонная стена.§r Дорогая, но взрывоустойчивая, как обсидиан.
@ -150,6 +152,15 @@ tile.engineersdecor.small_mineral_smelter.name=Small Mineral Melting Furnace
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.
tile.engineersdecor.small_solar_panel.name=Small Solar Panel
#tile.engineersdecor.small_solar_panel.help=§6Produces a small amount of power when exposed to sunlight.§r\n\
Useful for charging LF capacitors in remote systems with low consumption. The \
internal charge pump circuit accumulates and frequently transfers RF. Production \
depends on day time and the weather.
tile.engineersdecor.small_tree_cutter.name=Small Tree Cutter
#tile.engineersdecor.small_tree_cutter.help=§6Chops grown trees in front of it.§r\n\
Does not collect the lumbers. Deactivate with a redstone signal. \
Provide RF power to boost the cutting speed.
#-----------------------------------------------------------------------------------------------------------
tile.engineersdecor.sign_decor.name=Табличка с надписью (Логотип Engineer's decor)
tile.engineersdecor.sign_decor.help=§Это не должно быть крафтовым или видимым в JEI. Используется для творческой вкладки и скриншотов.

View file

@ -36,6 +36,8 @@ tile.engineersdecor.rebar_concrete_tile_slab.name=Rebar Concrete Tile Slab
#tile.engineersdecor.rebar_concrete_tile_slab.help=§6Steel reinforced concrete tile slab.§r Expensive but Creeper-proof like obsidian.
tile.engineersdecor.panzerglass_slab.name=Panzer Glass Slab
#tile.engineersdecor.panzerglass_slab.help=§6Reinforced glass slab.§r Expensive, explosion-proof. Dark gray tint, faint structural lines visible.
tile.engineersdecor.treated_wood_floor.name=Treated Wood Floor
#tile.engineersdecor.treated_wood_floor.help=§6Decorative floor tiles with texture variations.§r
#-----------------------------------------------------------------------------------------------------------
tile.engineersdecor.rebar_concrete_wall.name=钢筋混凝土墙
tile.engineersdecor.rebar_concrete_wall.help=§6钢筋混凝土墙.§r 昂贵,但像黑曜石一样防苦力怕.
@ -153,6 +155,15 @@ tile.engineersdecor.small_mineral_smelter.name=Small Mineral Melting Furnace
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.
tile.engineersdecor.small_solar_panel.name=Small Solar Panel
#tile.engineersdecor.small_solar_panel.help=§6Produces a small amount of power when exposed to sunlight.§r\n\
Useful for charging LF capacitors in remote systems with low consumption. The \
internal charge pump circuit accumulates and frequently transfers RF. Production \
depends on day time and the weather.
tile.engineersdecor.small_tree_cutter.name=Small Tree Cutter
#tile.engineersdecor.small_tree_cutter.help=§6Chops grown trees in front of it.§r\n\
Does not collect the lumbers. Deactivate with a redstone signal. \
Provide RF power to boost the cutting speed.
#-----------------------------------------------------------------------------------------------------------
tile.engineersdecor.sign_decor.name=Sign Plate (Engineer's decor)
#tile.engineersdecor.sign_decor.help=§6This should not be craftable or visible in JEI. Used for creative tab and screenshots.

View file

@ -0,0 +1,196 @@
{
"parent": "block/cube",
"textures": {
"2": "engineersdecor:blocks/device/small_solar_panel_side",
"m": "engineersdecor:blocks/device/small_solar_panel_parts",
"particle": "engineersdecor:blocks/device/small_solar_panel_parts",
"tb": "engineersdecor:blocks/device/small_solar_panel_topbottom",
"p": "engineersdecor:blocks/device/small_solar_panel_panel"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 2, 16],
"faces": {
"north": {"uv": [0, 14, 16, 16], "texture": "#2"},
"east": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#2"},
"south": {"uv": [0, 14, 16, 16], "texture": "#2"},
"west": {"uv": [0, 14, 16, 16], "texture": "#2"},
"up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#tb"},
"down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#tb"}
}
},
{
"from": [1, 9.5, 0],
"to": [15, 11.5, 16],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [1, 4.5, 15, 6.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [0, 4.5, 16, 6.5], "texture": "#m"},
"south": {"uv": [1, 4.5, 15, 6.5], "texture": "#m"},
"west": {"uv": [0, 4.5, 16, 6.5], "texture": "#m"},
"up": {"uv": [1, 0, 15, 16], "texture": "#p"},
"down": {"uv": [1, 0, 15, 16], "texture": "#m"}
}
},
{
"from": [6, 2, 11],
"to": [10, 8, 13],
"faces": {
"north": {"uv": [6, 8, 10, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 8, 5, 14], "texture": "#m"},
"south": {"uv": [6, 8, 10, 14], "texture": "#2"},
"west": {"uv": [11, 8, 13, 14], "texture": "#m"},
"up": {"uv": [6, 11, 10, 13], "texture": "#m"},
"down": {"uv": [6, 3, 10, 5], "texture": "#m"}
}
},
{
"from": [6.5, 5.5, 9],
"to": [9.5, 9.5, 11],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [6.5, 6.5, 9.5, 10.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [5, 6.5, 7, 10.5], "texture": "#m"},
"south": {"uv": [6.5, 6.5, 9.5, 10.5], "texture": "#m"},
"west": {"uv": [9, 6.5, 11, 10.5], "texture": "#m"},
"up": {"uv": [6.5, 9, 9.5, 11], "texture": "#m"},
"down": {"uv": [6.5, 5, 9.5, 7], "texture": "#m"}
}
},
{
"from": [5, 9, 7],
"to": [11, 9.5, 9],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [5, 6.5, 11, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [7, 6.5, 9, 7], "texture": "#m"},
"south": {"uv": [5, 6.5, 11, 7], "texture": "#m"},
"west": {"uv": [7, 6.5, 9, 7], "texture": "#m"},
"up": {"uv": [5, 7, 11, 9], "texture": "#m"},
"down": {"uv": [5, 7, 11, 9], "texture": "#m"}
}
},
{
"from": [2, 9, 3],
"to": [5, 9.5, 13],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [11, 6.5, 14, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"south": {"uv": [2, 6.5, 5, 7], "texture": "#m"},
"west": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"up": {"uv": [2, 3, 5, 13], "texture": "#m"},
"down": {"uv": [2, 3, 5, 13], "texture": "#m"}
}
},
{
"from": [11, 9, 3],
"to": [14, 9.5, 13],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [2, 6.5, 5, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"south": {"uv": [11, 6.5, 14, 7], "texture": "#m"},
"west": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"up": {"uv": [11, 3, 14, 13], "texture": "#m"},
"down": {"uv": [11, 3, 14, 13], "texture": "#m"}
}
},
{
"from": [6.5, 5.5, 5],
"to": [9.5, 9.5, 7],
"rotation": {"angle": -45, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [6.5, 6.5, 9.5, 10.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [9, 6.5, 11, 10.5], "texture": "#m"},
"south": {"uv": [6.5, 6.5, 9.5, 10.5], "texture": "#m"},
"west": {"uv": [5, 6.5, 7, 10.5], "texture": "#m"},
"up": {"uv": [6.5, 5, 9.5, 7], "texture": "#m"},
"down": {"uv": [6.5, 9, 9.5, 11], "texture": "#m"}
}
},
{
"from": [6, 2, 3],
"to": [10, 8, 5],
"faces": {
"north": {"uv": [6, 8, 10, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 8, 13, 14], "texture": "#m"},
"south": {"uv": [6, 8, 10, 14], "texture": "#2"},
"west": {"uv": [3, 8, 5, 14], "texture": "#m"},
"up": {"uv": [6, 3, 10, 5], "texture": "#m"},
"down": {"uv": [6, 11, 10, 13], "texture": "#m"}
}
},
{
"from": [2, 2, 3],
"to": [6, 3, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [4, 8, 8]},
"faces": {
"north": {"uv": [10, 13, 14, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 13, 13, 14], "texture": "#m"},
"south": {"uv": [2, 13, 6, 14], "texture": "#2"},
"west": {"uv": [3, 13, 5, 14], "texture": "#m"},
"up": {"uv": [2, 3, 6, 5], "texture": "#m"},
"down": {"uv": [2, 11, 6, 13], "texture": "#m"}
}
},
{
"from": [10, 2, 3],
"to": [14, 3, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [12, 8, 8]},
"faces": {
"north": {"uv": [2, 13, 6, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 13, 13, 14], "texture": "#m"},
"south": {"uv": [10, 13, 14, 14], "texture": "#2"},
"west": {"uv": [3, 13, 5, 14], "texture": "#m"},
"up": {"uv": [10, 3, 14, 5], "texture": "#m"},
"down": {"uv": [10, 11, 14, 13], "texture": "#m"}
}
},
{
"from": [10, 2, 11],
"to": [14, 3, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [12, 8, 16]},
"faces": {
"north": {"uv": [2, 13, 6, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 13, 5, 14], "texture": "#m"},
"south": {"uv": [10, 13, 14, 14], "texture": "#2"},
"west": {"uv": [11, 13, 13, 14], "texture": "#m"},
"up": {"uv": [10, 11, 14, 13], "texture": "#m"},
"down": {"uv": [10, 3, 14, 5], "texture": "#m"}
}
},
{
"from": [2, 2, 11],
"to": [6, 3, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [4, 8, 16]},
"faces": {
"north": {"uv": [10, 13, 14, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 13, 5, 14], "texture": "#m"},
"south": {"uv": [2, 13, 6, 14], "texture": "#2"},
"west": {"uv": [11, 13, 13, 14], "texture": "#m"},
"up": {"uv": [2, 11, 6, 13], "texture": "#m"},
"down": {"uv": [2, 3, 6, 5], "texture": "#m"}
}
}
],
"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]
}
}
}

View file

@ -0,0 +1,196 @@
{
"parent": "block/cube",
"textures": {
"2": "engineersdecor:blocks/device/small_solar_panel_side",
"m": "engineersdecor:blocks/device/small_solar_panel_parts",
"particle": "engineersdecor:blocks/device/small_solar_panel_parts",
"tb": "engineersdecor:blocks/device/small_solar_panel_topbottom",
"p": "engineersdecor:blocks/device/small_solar_panel_panel"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 2, 16],
"faces": {
"north": {"uv": [0, 14, 16, 16], "texture": "#2"},
"east": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#2"},
"south": {"uv": [0, 14, 16, 16], "texture": "#2"},
"west": {"uv": [0, 14, 16, 16], "texture": "#2"},
"up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#tb"},
"down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#tb"}
}
},
{
"from": [1, 9.5, 0],
"to": [15, 11.5, 16],
"rotation": {"angle": -22.5, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [1, 4.5, 15, 6.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [0, 4.5, 16, 6.5], "texture": "#m"},
"south": {"uv": [1, 4.5, 15, 6.5], "texture": "#m"},
"west": {"uv": [0, 4.5, 16, 6.5], "texture": "#m"},
"up": {"uv": [1, 0, 15, 16], "texture": "#p"},
"down": {"uv": [1, 0, 15, 16], "texture": "#m"}
}
},
{
"from": [6, 2, 11],
"to": [10, 8, 13],
"faces": {
"north": {"uv": [6, 8, 10, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 8, 5, 14], "texture": "#m"},
"south": {"uv": [6, 8, 10, 14], "texture": "#2"},
"west": {"uv": [11, 8, 13, 14], "texture": "#m"},
"up": {"uv": [6, 11, 10, 13], "texture": "#m"},
"down": {"uv": [6, 3, 10, 5], "texture": "#m"}
}
},
{
"from": [6.5, 5.5, 9],
"to": [9.5, 9.5, 11],
"rotation": {"angle": -22.5, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [6.5, 6.5, 9.5, 10.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [5, 6.5, 7, 10.5], "texture": "#m"},
"south": {"uv": [6.5, 6.5, 9.5, 10.5], "texture": "#m"},
"west": {"uv": [9, 6.5, 11, 10.5], "texture": "#m"},
"up": {"uv": [6.5, 9, 9.5, 11], "texture": "#m"},
"down": {"uv": [6.5, 5, 9.5, 7], "texture": "#m"}
}
},
{
"from": [5, 9, 7],
"to": [11, 9.5, 9],
"rotation": {"angle": -22.5, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [5, 6.5, 11, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [7, 6.5, 9, 7], "texture": "#m"},
"south": {"uv": [5, 6.5, 11, 7], "texture": "#m"},
"west": {"uv": [7, 6.5, 9, 7], "texture": "#m"},
"up": {"uv": [5, 7, 11, 9], "texture": "#m"},
"down": {"uv": [5, 7, 11, 9], "texture": "#m"}
}
},
{
"from": [2, 9, 3],
"to": [5, 9.5, 13],
"rotation": {"angle": -22.5, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [11, 6.5, 14, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"south": {"uv": [2, 6.5, 5, 7], "texture": "#m"},
"west": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"up": {"uv": [2, 3, 5, 13], "texture": "#m"},
"down": {"uv": [2, 3, 5, 13], "texture": "#m"}
}
},
{
"from": [11, 9, 3],
"to": [14, 9.5, 13],
"rotation": {"angle": -22.5, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [2, 6.5, 5, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"south": {"uv": [11, 6.5, 14, 7], "texture": "#m"},
"west": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"up": {"uv": [11, 3, 14, 13], "texture": "#m"},
"down": {"uv": [11, 3, 14, 13], "texture": "#m"}
}
},
{
"from": [6.5, 5.5, 5],
"to": [9.5, 9.5, 7],
"rotation": {"angle": -22.5, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [6.5, 6.5, 9.5, 10.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [9, 6.5, 11, 10.5], "texture": "#m"},
"south": {"uv": [6.5, 6.5, 9.5, 10.5], "texture": "#m"},
"west": {"uv": [5, 6.5, 7, 10.5], "texture": "#m"},
"up": {"uv": [6.5, 5, 9.5, 7], "texture": "#m"},
"down": {"uv": [6.5, 9, 9.5, 11], "texture": "#m"}
}
},
{
"from": [6, 2, 3],
"to": [10, 8, 5],
"faces": {
"north": {"uv": [6, 8, 10, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 8, 13, 14], "texture": "#m"},
"south": {"uv": [6, 8, 10, 14], "texture": "#2"},
"west": {"uv": [3, 8, 5, 14], "texture": "#m"},
"up": {"uv": [6, 3, 10, 5], "texture": "#m"},
"down": {"uv": [6, 11, 10, 13], "texture": "#m"}
}
},
{
"from": [2, 2, 3],
"to": [6, 3, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [4, 8, 8]},
"faces": {
"north": {"uv": [10, 13, 14, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 13, 13, 14], "texture": "#m"},
"south": {"uv": [2, 13, 6, 14], "texture": "#2"},
"west": {"uv": [3, 13, 5, 14], "texture": "#m"},
"up": {"uv": [2, 3, 6, 5], "texture": "#m"},
"down": {"uv": [2, 11, 6, 13], "texture": "#m"}
}
},
{
"from": [10, 2, 3],
"to": [14, 3, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [12, 8, 8]},
"faces": {
"north": {"uv": [2, 13, 6, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 13, 13, 14], "texture": "#m"},
"south": {"uv": [10, 13, 14, 14], "texture": "#2"},
"west": {"uv": [3, 13, 5, 14], "texture": "#m"},
"up": {"uv": [10, 3, 14, 5], "texture": "#m"},
"down": {"uv": [10, 11, 14, 13], "texture": "#m"}
}
},
{
"from": [10, 2, 11],
"to": [14, 3, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [12, 8, 16]},
"faces": {
"north": {"uv": [2, 13, 6, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 13, 5, 14], "texture": "#m"},
"south": {"uv": [10, 13, 14, 14], "texture": "#2"},
"west": {"uv": [11, 13, 13, 14], "texture": "#m"},
"up": {"uv": [10, 11, 14, 13], "texture": "#m"},
"down": {"uv": [10, 3, 14, 5], "texture": "#m"}
}
},
{
"from": [2, 2, 11],
"to": [6, 3, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [4, 8, 16]},
"faces": {
"north": {"uv": [10, 13, 14, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 13, 5, 14], "texture": "#m"},
"south": {"uv": [2, 13, 6, 14], "texture": "#2"},
"west": {"uv": [11, 13, 13, 14], "texture": "#m"},
"up": {"uv": [2, 11, 6, 13], "texture": "#m"},
"down": {"uv": [2, 3, 6, 5], "texture": "#m"}
}
}
],
"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]
}
}
}

View file

@ -0,0 +1,196 @@
{
"parent": "block/cube",
"textures": {
"2": "engineersdecor:blocks/device/small_solar_panel_side",
"m": "engineersdecor:blocks/device/small_solar_panel_parts",
"particle": "engineersdecor:blocks/device/small_solar_panel_parts",
"tb": "engineersdecor:blocks/device/small_solar_panel_topbottom",
"p": "engineersdecor:blocks/device/small_solar_panel_panel"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 2, 16],
"faces": {
"north": {"uv": [0, 14, 16, 16], "texture": "#2"},
"east": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#2"},
"south": {"uv": [0, 14, 16, 16], "texture": "#2"},
"west": {"uv": [0, 14, 16, 16], "texture": "#2"},
"up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#tb"},
"down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#tb"}
}
},
{
"from": [1, 9.5, 0],
"to": [15, 11.5, 16],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [1, 4.5, 15, 6.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [0, 4.5, 16, 6.5], "texture": "#m"},
"south": {"uv": [1, 4.5, 15, 6.5], "texture": "#m"},
"west": {"uv": [0, 4.5, 16, 6.5], "texture": "#m"},
"up": {"uv": [1, 0, 15, 16], "texture": "#p"},
"down": {"uv": [1, 0, 15, 16], "texture": "#m"}
}
},
{
"from": [6, 2, 11],
"to": [10, 8, 13],
"faces": {
"north": {"uv": [6, 8, 10, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 8, 5, 14], "texture": "#m"},
"south": {"uv": [6, 8, 10, 14], "texture": "#2"},
"west": {"uv": [11, 8, 13, 14], "texture": "#m"},
"up": {"uv": [6, 11, 10, 13], "texture": "#m"},
"down": {"uv": [6, 3, 10, 5], "texture": "#m"}
}
},
{
"from": [6.5, 5.5, 9],
"to": [9.5, 9.5, 11],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [6.5, 6.5, 9.5, 10.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [5, 6.5, 7, 10.5], "texture": "#m"},
"south": {"uv": [6.5, 6.5, 9.5, 10.5], "texture": "#m"},
"west": {"uv": [9, 6.5, 11, 10.5], "texture": "#m"},
"up": {"uv": [6.5, 9, 9.5, 11], "texture": "#m"},
"down": {"uv": [6.5, 5, 9.5, 7], "texture": "#m"}
}
},
{
"from": [5, 9, 7],
"to": [11, 9.5, 9],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [5, 6.5, 11, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [7, 6.5, 9, 7], "texture": "#m"},
"south": {"uv": [5, 6.5, 11, 7], "texture": "#m"},
"west": {"uv": [7, 6.5, 9, 7], "texture": "#m"},
"up": {"uv": [5, 7, 11, 9], "texture": "#m"},
"down": {"uv": [5, 7, 11, 9], "texture": "#m"}
}
},
{
"from": [2, 9, 3],
"to": [5, 9.5, 13],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [11, 6.5, 14, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"south": {"uv": [2, 6.5, 5, 7], "texture": "#m"},
"west": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"up": {"uv": [2, 3, 5, 13], "texture": "#m"},
"down": {"uv": [2, 3, 5, 13], "texture": "#m"}
}
},
{
"from": [11, 9, 3],
"to": [14, 9.5, 13],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [2, 6.5, 5, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"south": {"uv": [11, 6.5, 14, 7], "texture": "#m"},
"west": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"up": {"uv": [11, 3, 14, 13], "texture": "#m"},
"down": {"uv": [11, 3, 14, 13], "texture": "#m"}
}
},
{
"from": [6.5, 5.5, 5],
"to": [9.5, 9.5, 7],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [6.5, 6.5, 9.5, 10.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [9, 6.5, 11, 10.5], "texture": "#m"},
"south": {"uv": [6.5, 6.5, 9.5, 10.5], "texture": "#m"},
"west": {"uv": [5, 6.5, 7, 10.5], "texture": "#m"},
"up": {"uv": [6.5, 5, 9.5, 7], "texture": "#m"},
"down": {"uv": [6.5, 9, 9.5, 11], "texture": "#m"}
}
},
{
"from": [6, 2, 3],
"to": [10, 8, 5],
"faces": {
"north": {"uv": [6, 8, 10, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 8, 13, 14], "texture": "#m"},
"south": {"uv": [6, 8, 10, 14], "texture": "#2"},
"west": {"uv": [3, 8, 5, 14], "texture": "#m"},
"up": {"uv": [6, 3, 10, 5], "texture": "#m"},
"down": {"uv": [6, 11, 10, 13], "texture": "#m"}
}
},
{
"from": [2, 2, 3],
"to": [6, 3, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [4, 8, 8]},
"faces": {
"north": {"uv": [10, 13, 14, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 13, 13, 14], "texture": "#m"},
"south": {"uv": [2, 13, 6, 14], "texture": "#2"},
"west": {"uv": [3, 13, 5, 14], "texture": "#m"},
"up": {"uv": [2, 3, 6, 5], "texture": "#m"},
"down": {"uv": [2, 11, 6, 13], "texture": "#m"}
}
},
{
"from": [10, 2, 3],
"to": [14, 3, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [12, 8, 8]},
"faces": {
"north": {"uv": [2, 13, 6, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 13, 13, 14], "texture": "#m"},
"south": {"uv": [10, 13, 14, 14], "texture": "#2"},
"west": {"uv": [3, 13, 5, 14], "texture": "#m"},
"up": {"uv": [10, 3, 14, 5], "texture": "#m"},
"down": {"uv": [10, 11, 14, 13], "texture": "#m"}
}
},
{
"from": [10, 2, 11],
"to": [14, 3, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [12, 8, 16]},
"faces": {
"north": {"uv": [2, 13, 6, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 13, 5, 14], "texture": "#m"},
"south": {"uv": [10, 13, 14, 14], "texture": "#2"},
"west": {"uv": [11, 13, 13, 14], "texture": "#m"},
"up": {"uv": [10, 11, 14, 13], "texture": "#m"},
"down": {"uv": [10, 3, 14, 5], "texture": "#m"}
}
},
{
"from": [2, 2, 11],
"to": [6, 3, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [4, 8, 16]},
"faces": {
"north": {"uv": [10, 13, 14, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 13, 5, 14], "texture": "#m"},
"south": {"uv": [2, 13, 6, 14], "texture": "#2"},
"west": {"uv": [11, 13, 13, 14], "texture": "#m"},
"up": {"uv": [2, 11, 6, 13], "texture": "#m"},
"down": {"uv": [2, 3, 6, 5], "texture": "#m"}
}
}
],
"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]
}
}
}

View file

@ -0,0 +1,196 @@
{
"parent": "block/cube",
"textures": {
"2": "engineersdecor:blocks/device/small_solar_panel_side",
"m": "engineersdecor:blocks/device/small_solar_panel_parts",
"particle": "engineersdecor:blocks/device/small_solar_panel_parts",
"tb": "engineersdecor:blocks/device/small_solar_panel_topbottom",
"p": "engineersdecor:blocks/device/small_solar_panel_panel"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 2, 16],
"faces": {
"north": {"uv": [0, 14, 16, 16], "texture": "#2"},
"east": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#2"},
"south": {"uv": [0, 14, 16, 16], "texture": "#2"},
"west": {"uv": [0, 14, 16, 16], "texture": "#2"},
"up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#tb"},
"down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#tb"}
}
},
{
"from": [1, 9.5, 0],
"to": [15, 11.5, 16],
"rotation": {"angle": 22.5, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [1, 4.5, 15, 6.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [0, 4.5, 16, 6.5], "texture": "#m"},
"south": {"uv": [1, 4.5, 15, 6.5], "texture": "#m"},
"west": {"uv": [0, 4.5, 16, 6.5], "texture": "#m"},
"up": {"uv": [1, 0, 15, 16], "texture": "#p"},
"down": {"uv": [1, 0, 15, 16], "texture": "#m"}
}
},
{
"from": [6, 2, 11],
"to": [10, 8, 13],
"faces": {
"north": {"uv": [6, 8, 10, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 8, 5, 14], "texture": "#m"},
"south": {"uv": [6, 8, 10, 14], "texture": "#2"},
"west": {"uv": [11, 8, 13, 14], "texture": "#m"},
"up": {"uv": [6, 11, 10, 13], "texture": "#m"},
"down": {"uv": [6, 3, 10, 5], "texture": "#m"}
}
},
{
"from": [6.5, 5.5, 9],
"to": [9.5, 9.5, 11],
"rotation": {"angle": 22.5, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [6.5, 6.5, 9.5, 10.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [5, 6.5, 7, 10.5], "texture": "#m"},
"south": {"uv": [6.5, 6.5, 9.5, 10.5], "texture": "#m"},
"west": {"uv": [9, 6.5, 11, 10.5], "texture": "#m"},
"up": {"uv": [6.5, 9, 9.5, 11], "texture": "#m"},
"down": {"uv": [6.5, 5, 9.5, 7], "texture": "#m"}
}
},
{
"from": [5, 9, 7],
"to": [11, 9.5, 9],
"rotation": {"angle": 22.5, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [5, 6.5, 11, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [7, 6.5, 9, 7], "texture": "#m"},
"south": {"uv": [5, 6.5, 11, 7], "texture": "#m"},
"west": {"uv": [7, 6.5, 9, 7], "texture": "#m"},
"up": {"uv": [5, 7, 11, 9], "texture": "#m"},
"down": {"uv": [5, 7, 11, 9], "texture": "#m"}
}
},
{
"from": [2, 9, 3],
"to": [5, 9.5, 13],
"rotation": {"angle": 22.5, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [11, 6.5, 14, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"south": {"uv": [2, 6.5, 5, 7], "texture": "#m"},
"west": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"up": {"uv": [2, 3, 5, 13], "texture": "#m"},
"down": {"uv": [2, 3, 5, 13], "texture": "#m"}
}
},
{
"from": [11, 9, 3],
"to": [14, 9.5, 13],
"rotation": {"angle": 22.5, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [2, 6.5, 5, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"south": {"uv": [11, 6.5, 14, 7], "texture": "#m"},
"west": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"up": {"uv": [11, 3, 14, 13], "texture": "#m"},
"down": {"uv": [11, 3, 14, 13], "texture": "#m"}
}
},
{
"from": [6.5, 5.5, 5],
"to": [9.5, 9.5, 7],
"rotation": {"angle": 22.5, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [6.5, 6.5, 9.5, 10.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [9, 6.5, 11, 10.5], "texture": "#m"},
"south": {"uv": [6.5, 6.5, 9.5, 10.5], "texture": "#m"},
"west": {"uv": [5, 6.5, 7, 10.5], "texture": "#m"},
"up": {"uv": [6.5, 5, 9.5, 7], "texture": "#m"},
"down": {"uv": [6.5, 9, 9.5, 11], "texture": "#m"}
}
},
{
"from": [6, 2, 3],
"to": [10, 8, 5],
"faces": {
"north": {"uv": [6, 8, 10, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 8, 13, 14], "texture": "#m"},
"south": {"uv": [6, 8, 10, 14], "texture": "#2"},
"west": {"uv": [3, 8, 5, 14], "texture": "#m"},
"up": {"uv": [6, 3, 10, 5], "texture": "#m"},
"down": {"uv": [6, 11, 10, 13], "texture": "#m"}
}
},
{
"from": [2, 2, 3],
"to": [6, 3, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [4, 8, 8]},
"faces": {
"north": {"uv": [10, 13, 14, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 13, 13, 14], "texture": "#m"},
"south": {"uv": [2, 13, 6, 14], "texture": "#2"},
"west": {"uv": [3, 13, 5, 14], "texture": "#m"},
"up": {"uv": [2, 3, 6, 5], "texture": "#m"},
"down": {"uv": [2, 11, 6, 13], "texture": "#m"}
}
},
{
"from": [10, 2, 3],
"to": [14, 3, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [12, 8, 8]},
"faces": {
"north": {"uv": [2, 13, 6, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 13, 13, 14], "texture": "#m"},
"south": {"uv": [10, 13, 14, 14], "texture": "#2"},
"west": {"uv": [3, 13, 5, 14], "texture": "#m"},
"up": {"uv": [10, 3, 14, 5], "texture": "#m"},
"down": {"uv": [10, 11, 14, 13], "texture": "#m"}
}
},
{
"from": [10, 2, 11],
"to": [14, 3, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [12, 8, 16]},
"faces": {
"north": {"uv": [2, 13, 6, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 13, 5, 14], "texture": "#m"},
"south": {"uv": [10, 13, 14, 14], "texture": "#2"},
"west": {"uv": [11, 13, 13, 14], "texture": "#m"},
"up": {"uv": [10, 11, 14, 13], "texture": "#m"},
"down": {"uv": [10, 3, 14, 5], "texture": "#m"}
}
},
{
"from": [2, 2, 11],
"to": [6, 3, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [4, 8, 16]},
"faces": {
"north": {"uv": [10, 13, 14, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 13, 5, 14], "texture": "#m"},
"south": {"uv": [2, 13, 6, 14], "texture": "#2"},
"west": {"uv": [11, 13, 13, 14], "texture": "#m"},
"up": {"uv": [2, 11, 6, 13], "texture": "#m"},
"down": {"uv": [2, 3, 6, 5], "texture": "#m"}
}
}
],
"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]
}
}
}

View file

@ -0,0 +1,196 @@
{
"parent": "block/cube",
"textures": {
"2": "engineersdecor:blocks/device/small_solar_panel_side",
"m": "engineersdecor:blocks/device/small_solar_panel_parts",
"particle": "engineersdecor:blocks/device/small_solar_panel_parts",
"tb": "engineersdecor:blocks/device/small_solar_panel_topbottom",
"p": "engineersdecor:blocks/device/small_solar_panel_panel"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 2, 16],
"faces": {
"north": {"uv": [0, 14, 16, 16], "texture": "#2"},
"east": {"uv": [0, 14, 16, 16], "rotation": 180, "texture": "#2"},
"south": {"uv": [0, 14, 16, 16], "texture": "#2"},
"west": {"uv": [0, 14, 16, 16], "texture": "#2"},
"up": {"uv": [0, 0, 16, 16], "rotation": 90, "texture": "#tb"},
"down": {"uv": [0, 0, 16, 16], "rotation": 270, "texture": "#tb"}
}
},
{
"from": [1, 9.5, 0],
"to": [15, 11.5, 16],
"rotation": {"angle": 45, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [1, 4.5, 15, 6.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [0, 4.5, 16, 6.5], "texture": "#m"},
"south": {"uv": [1, 4.5, 15, 6.5], "texture": "#m"},
"west": {"uv": [0, 4.5, 16, 6.5], "texture": "#m"},
"up": {"uv": [1, 0, 15, 16], "texture": "#p"},
"down": {"uv": [1, 0, 15, 16], "texture": "#m"}
}
},
{
"from": [6, 2, 11],
"to": [10, 8, 13],
"faces": {
"north": {"uv": [6, 8, 10, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 8, 5, 14], "texture": "#m"},
"south": {"uv": [6, 8, 10, 14], "texture": "#2"},
"west": {"uv": [11, 8, 13, 14], "texture": "#m"},
"up": {"uv": [6, 11, 10, 13], "texture": "#m"},
"down": {"uv": [6, 3, 10, 5], "texture": "#m"}
}
},
{
"from": [6.5, 5.5, 9],
"to": [9.5, 9.5, 11],
"rotation": {"angle": 45, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [6.5, 6.5, 9.5, 10.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [5, 6.5, 7, 10.5], "texture": "#m"},
"south": {"uv": [6.5, 6.5, 9.5, 10.5], "texture": "#m"},
"west": {"uv": [9, 6.5, 11, 10.5], "texture": "#m"},
"up": {"uv": [6.5, 9, 9.5, 11], "texture": "#m"},
"down": {"uv": [6.5, 5, 9.5, 7], "texture": "#m"}
}
},
{
"from": [5, 9, 7],
"to": [11, 9.5, 9],
"rotation": {"angle": 45, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [5, 6.5, 11, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [7, 6.5, 9, 7], "texture": "#m"},
"south": {"uv": [5, 6.5, 11, 7], "texture": "#m"},
"west": {"uv": [7, 6.5, 9, 7], "texture": "#m"},
"up": {"uv": [5, 7, 11, 9], "texture": "#m"},
"down": {"uv": [5, 7, 11, 9], "texture": "#m"}
}
},
{
"from": [2, 9, 3],
"to": [5, 9.5, 13],
"rotation": {"angle": 45, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [11, 6.5, 14, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"south": {"uv": [2, 6.5, 5, 7], "texture": "#m"},
"west": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"up": {"uv": [2, 3, 5, 13], "texture": "#m"},
"down": {"uv": [2, 3, 5, 13], "texture": "#m"}
}
},
{
"from": [11, 9, 3],
"to": [14, 9.5, 13],
"rotation": {"angle": 45, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [2, 6.5, 5, 7], "rotation": 180, "texture": "#m"},
"east": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"south": {"uv": [11, 6.5, 14, 7], "texture": "#m"},
"west": {"uv": [3, 6.5, 13, 7], "texture": "#m"},
"up": {"uv": [11, 3, 14, 13], "texture": "#m"},
"down": {"uv": [11, 3, 14, 13], "texture": "#m"}
}
},
{
"from": [6.5, 5.5, 5],
"to": [9.5, 9.5, 7],
"rotation": {"angle": 45, "axis": "z", "origin": [8, 7, 8]},
"faces": {
"north": {"uv": [6.5, 6.5, 9.5, 10.5], "rotation": 180, "texture": "#m"},
"east": {"uv": [9, 6.5, 11, 10.5], "texture": "#m"},
"south": {"uv": [6.5, 6.5, 9.5, 10.5], "texture": "#m"},
"west": {"uv": [5, 6.5, 7, 10.5], "texture": "#m"},
"up": {"uv": [6.5, 5, 9.5, 7], "texture": "#m"},
"down": {"uv": [6.5, 9, 9.5, 11], "texture": "#m"}
}
},
{
"from": [6, 2, 3],
"to": [10, 8, 5],
"faces": {
"north": {"uv": [6, 8, 10, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 8, 13, 14], "texture": "#m"},
"south": {"uv": [6, 8, 10, 14], "texture": "#2"},
"west": {"uv": [3, 8, 5, 14], "texture": "#m"},
"up": {"uv": [6, 3, 10, 5], "texture": "#m"},
"down": {"uv": [6, 11, 10, 13], "texture": "#m"}
}
},
{
"from": [2, 2, 3],
"to": [6, 3, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [4, 8, 8]},
"faces": {
"north": {"uv": [10, 13, 14, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 13, 13, 14], "texture": "#m"},
"south": {"uv": [2, 13, 6, 14], "texture": "#2"},
"west": {"uv": [3, 13, 5, 14], "texture": "#m"},
"up": {"uv": [2, 3, 6, 5], "texture": "#m"},
"down": {"uv": [2, 11, 6, 13], "texture": "#m"}
}
},
{
"from": [10, 2, 3],
"to": [14, 3, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [12, 8, 8]},
"faces": {
"north": {"uv": [2, 13, 6, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [11, 13, 13, 14], "texture": "#m"},
"south": {"uv": [10, 13, 14, 14], "texture": "#2"},
"west": {"uv": [3, 13, 5, 14], "texture": "#m"},
"up": {"uv": [10, 3, 14, 5], "texture": "#m"},
"down": {"uv": [10, 11, 14, 13], "texture": "#m"}
}
},
{
"from": [10, 2, 11],
"to": [14, 3, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [12, 8, 16]},
"faces": {
"north": {"uv": [2, 13, 6, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 13, 5, 14], "texture": "#m"},
"south": {"uv": [10, 13, 14, 14], "texture": "#2"},
"west": {"uv": [11, 13, 13, 14], "texture": "#m"},
"up": {"uv": [10, 11, 14, 13], "texture": "#m"},
"down": {"uv": [10, 3, 14, 5], "texture": "#m"}
}
},
{
"from": [2, 2, 11],
"to": [6, 3, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [4, 8, 16]},
"faces": {
"north": {"uv": [10, 13, 14, 14], "rotation": 180, "texture": "#2"},
"east": {"uv": [3, 13, 5, 14], "texture": "#m"},
"south": {"uv": [2, 13, 6, 14], "texture": "#2"},
"west": {"uv": [11, 13, 13, 14], "texture": "#m"},
"up": {"uv": [2, 11, 6, 13], "texture": "#m"},
"down": {"uv": [2, 3, 6, 5], "texture": "#m"}
}
}
],
"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]
}
}
}

View file

@ -0,0 +1,217 @@
{
"parent": "block/cube",
"textures": {
"2": "engineersdecor:blocks/device/tree_cutter_side",
"3": "engineersdecor:blocks/device/tree_cutter_top",
"particle": "engineersdecor:blocks/device/tree_cutter_side",
"b": "engineersdecor:blocks/device/tree_cutter_blade_off",
"top": "engineersdecor:blocks/device/tree_cutter_bottom"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 3, 16],
"faces": {
"north": {"uv": [0, 13, 16, 16], "texture": "#2"},
"east": {"uv": [0, 13, 16, 16], "texture": "#2"},
"south": {"uv": [0, 13, 16, 16], "texture": "#2"},
"west": {"uv": [0, 13, 16, 16], "texture": "#2"},
"up": {"uv": [0, 0, 16, 16], "texture": "#3"},
"down": {"uv": [0, 0, 16, 16], "texture": "#top"}
}
},
{
"from": [0, 3, 0],
"to": [3, 8, 16],
"faces": {
"north": {"uv": [13, 0, 16, 5], "texture": "#2"},
"east": {"uv": [0, 3, 16, 8], "texture": "#2"},
"south": {"uv": [0, 8, 3, 13], "texture": "#2"},
"west": {"uv": [0, 8, 16, 13], "texture": "#2"},
"up": {"uv": [0, 0, 3, 16], "texture": "#3"},
"down": {"uv": [0, 0, 3, 16], "texture": "#top"}
}
},
{
"from": [3, 3, 13],
"to": [16, 8, 16],
"faces": {
"north": {"uv": [0, 3, 13, 8], "texture": "#2"},
"east": {"uv": [0, 8, 3, 13], "texture": "#2"},
"south": {"uv": [3, 8, 16, 13], "texture": "#2"},
"west": {"uv": [13, 8, 16, 13], "texture": "#b"},
"up": {"uv": [3, 13, 16, 16], "texture": "#3"},
"down": {"uv": [3, 0, 16, 3], "texture": "#top"}
}
},
{
"from": [15, 3, 0],
"to": [16, 6, 13],
"faces": {
"north": {"uv": [0, 10, 1, 13], "texture": "#2"},
"east": {"uv": [3, 10, 16, 13], "texture": "#2"},
"south": {"uv": [15, 10, 16, 13], "texture": "#b"},
"west": {"uv": [0, 0, 13, 3], "texture": "#2"},
"up": {"uv": [15, 0, 16, 13], "texture": "#3"},
"down": {"uv": [15, 3, 16, 16], "texture": "#top"}
}
},
{
"from": [3, 7, 0],
"to": [5, 8, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [10, 13, 5]},
"faces": {
"north": {"uv": [11, 8, 13, 9], "texture": "#2"},
"east": {"uv": [3, 8, 16, 9], "texture": "#2"},
"south": {"uv": [3, 8, 5, 9], "texture": "#b"},
"west": {"uv": [0, 8, 13, 9], "texture": "#b"},
"up": {"uv": [3, 0, 5, 13], "texture": "#3"},
"down": {"uv": [3, 3, 5, 16], "texture": "#b"}
}
},
{
"from": [5, 6, 12],
"to": [16, 8, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [11, 13, 5]},
"faces": {
"north": {"uv": [0, 0, 11, 2], "texture": "#2"},
"east": {"uv": [3, 8, 4, 10], "texture": "#2"},
"south": {"uv": [5, 8, 16, 10], "texture": "#b"},
"west": {"uv": [12, 8, 13, 10], "texture": "#b"},
"up": {"uv": [5, 12, 16, 13], "texture": "#3"},
"down": {"uv": [5, 3, 16, 4], "texture": "#top"}
}
},
{
"from": [5, 4.5, 4],
"to": [13, 5, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.5, 8]},
"faces": {
"north": {"uv": [3, 11, 11, 11.5], "texture": "#b"},
"east": {"uv": [4, 11, 12, 11.5], "texture": "#b"},
"south": {"uv": [5, 11, 13, 11.5], "texture": "#b"},
"west": {"uv": [4, 11, 12, 11.5], "texture": "#b"},
"up": {"uv": [5, 4, 13, 12], "texture": "#b"},
"down": {"uv": [5, 4, 13, 12], "texture": "#b"}
}
},
{
"from": [8, 5, 7],
"to": [10, 5.5, 9],
"faces": {
"north": {"uv": [6, 10.5, 8, 11], "texture": "#2"},
"east": {"uv": [7, 10.5, 9, 11], "texture": "#b"},
"south": {"uv": [8, 10.5, 10, 11], "texture": "#b"},
"west": {"uv": [7, 10.5, 9, 11], "texture": "#b"},
"up": {"uv": [8, 7, 10, 9], "texture": "#b"},
"down": {"uv": [8, 7, 10, 9], "texture": "#b"}
}
},
{
"from": [8, 4, 7],
"to": [10, 4.5, 9],
"faces": {
"north": {"uv": [6, 11.5, 8, 12], "texture": "#b"},
"east": {"uv": [7, 11.5, 9, 12], "texture": "#b"},
"south": {"uv": [8, 11.5, 10, 12], "texture": "#b"},
"west": {"uv": [7, 11.5, 9, 12], "texture": "#b"},
"up": {"uv": [8, 7, 10, 9], "texture": "#b"},
"down": {"uv": [8, 7, 10, 9], "texture": "#b"}
}
},
{
"from": [3, 3.5, 7],
"to": [10, 4, 9],
"faces": {
"north": {"uv": [8, 6, 15, 6.5], "texture": "#2"},
"east": {"uv": [7, 12, 9, 12.5], "texture": "#2"},
"south": {"uv": [3, 12, 10, 12.5], "texture": "#2"},
"west": {"uv": [7, 12, 9, 12.5], "texture": "#2"},
"up": {"uv": [3, 7, 10, 9], "texture": "#2"},
"down": {"uv": [3, 7, 10, 9], "texture": "#2"}
}
},
{
"from": [3, 5.5, 7],
"to": [10, 6, 9],
"faces": {
"north": {"uv": [6, 10, 13, 10.5], "texture": "#2"},
"east": {"uv": [7, 10, 9, 10.5], "texture": "#2"},
"south": {"uv": [3, 10, 10, 10.5], "texture": "#2"},
"west": {"uv": [7, 10, 9, 10.5], "texture": "#2"},
"up": {"uv": [9, 0, 16, 2], "texture": "#2"},
"down": {"uv": [3, 7, 10, 9], "texture": "#2"}
}
},
{
"from": [6, 4.5, 3],
"to": [12, 5, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.5, 8]},
"faces": {
"north": {"uv": [4, 11, 10, 11.5], "texture": "#b"},
"east": {"uv": [12, 11, 13, 11.5], "texture": "#b"},
"south": {"uv": [6, 11, 12, 11.5], "texture": "#b"},
"west": {"uv": [3, 11, 4, 11.5], "texture": "#b"},
"up": {"uv": [6, 3, 12, 4], "texture": "#b"},
"down": {"uv": [6, 12, 12, 13], "texture": "#b"}
}
},
{
"from": [4, 4.5, 5],
"to": [5, 5, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.5, 8]},
"faces": {
"north": {"uv": [11, 11, 12, 11.5], "texture": "#b"},
"east": {"uv": [5, 11, 11, 11.5], "texture": "#b"},
"south": {"uv": [4, 11, 5, 11.5], "texture": "#b"},
"west": {"uv": [5, 11, 11, 11.5], "texture": "#b"},
"up": {"uv": [4, 5, 5, 11], "texture": "#b"},
"down": {"uv": [4, 5, 5, 11], "texture": "#b"}
}
},
{
"from": [13, 4.5, 5],
"to": [14, 5, 11],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.5, 8]},
"faces": {
"north": {"uv": [2, 11, 3, 11.5], "texture": "#b"},
"east": {"uv": [5, 11, 11, 11.5], "texture": "#b"},
"south": {"uv": [13, 11, 14, 11.5], "texture": "#b"},
"west": {"uv": [5, 11, 11, 11.5], "texture": "#b"},
"up": {"uv": [13, 5, 14, 11], "texture": "#b"},
"down": {"uv": [13, 5, 14, 11], "texture": "#b"}
}
},
{
"from": [6, 4.5, 12],
"to": [12, 5, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.5, 8]},
"faces": {
"north": {"uv": [4, 11, 10, 11.5], "texture": "#b"},
"east": {"uv": [3, 11, 4, 11.5], "texture": "#b"},
"south": {"uv": [6, 11, 12, 11.5], "texture": "#b"},
"west": {"uv": [12, 11, 13, 11.5], "texture": "#b"},
"up": {"uv": [6, 12, 12, 13], "texture": "#b"},
"down": {"uv": [6, 3, 12, 4], "texture": "#b"}
}
}
],
"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]
}
}
}

View file

@ -0,0 +1,221 @@
{
"parent": "block/cube",
"textures": {
"2": "engineersdecor:blocks/device/tree_cutter_side",
"3": "engineersdecor:blocks/device/tree_cutter_top",
"particle": "engineersdecor:blocks/device/tree_cutter_side",
"b": "engineersdecor:blocks/device/tree_cutter_blade",
"top": "engineersdecor:blocks/device/tree_cutter_bottom"
},
"elements": [
{
"from": [0, 0, 0],
"to": [16, 3, 16],
"faces": {
"north": {"uv": [0, 13, 16, 16], "texture": "#2"},
"east": {"uv": [0, 13, 16, 16], "texture": "#2"},
"south": {"uv": [0, 13, 16, 16], "texture": "#2"},
"west": {"uv": [0, 13, 16, 16], "texture": "#2"},
"up": {"uv": [0, 0, 16, 16], "texture": "#3"},
"down": {"uv": [0, 0, 16, 16], "texture": "#top"}
}
},
{
"from": [0, 3, 0],
"to": [3, 8, 16],
"faces": {
"north": {"uv": [13, 0, 16, 5], "texture": "#2"},
"east": {"uv": [0, 3, 16, 8], "texture": "#2"},
"south": {"uv": [0, 8, 3, 13], "texture": "#2"},
"west": {"uv": [0, 8, 16, 13], "texture": "#2"},
"up": {"uv": [0, 0, 3, 16], "texture": "#3"},
"down": {"uv": [0, 0, 3, 16], "texture": "#top"}
}
},
{
"from": [3, 3, 13],
"to": [16, 8, 16],
"faces": {
"north": {"uv": [0, 3, 13, 8], "texture": "#2"},
"east": {"uv": [0, 8, 3, 13], "texture": "#2"},
"south": {"uv": [3, 8, 16, 13], "texture": "#2"},
"west": {"uv": [13, 8, 16, 13], "texture": "#b"},
"up": {"uv": [3, 13, 16, 16], "texture": "#3"},
"down": {"uv": [3, 0, 16, 3], "texture": "#top"}
}
},
{
"from": [15, 3, 0],
"to": [16, 6, 13],
"faces": {
"north": {"uv": [0, 10, 1, 13], "texture": "#2"},
"east": {"uv": [3, 10, 16, 13], "texture": "#2"},
"south": {"uv": [15, 10, 16, 13], "texture": "#b"},
"west": {"uv": [0, 0, 13, 3], "texture": "#2"},
"up": {"uv": [15, 0, 16, 13], "texture": "#3"},
"down": {"uv": [15, 3, 16, 16], "texture": "#top"}
}
},
{
"from": [3, 7, 0],
"to": [5, 8, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [10, 13, 5]},
"faces": {
"north": {"uv": [11, 8, 13, 9], "texture": "#2"},
"east": {"uv": [3, 8, 16, 9], "texture": "#2"},
"south": {"uv": [3, 8, 5, 9], "texture": "#b"},
"west": {"uv": [0, 8, 13, 9], "texture": "#b"},
"up": {"uv": [3, 0, 5, 13], "texture": "#3"},
"down": {"uv": [3, 3, 5, 16], "texture": "#b"}
}
},
{
"from": [5, 6, 12],
"to": [16, 8, 13],
"rotation": {"angle": 0, "axis": "y", "origin": [11, 13, 5]},
"faces": {
"north": {"uv": [0, 0, 11, 2], "texture": "#2"},
"east": {"uv": [3, 8, 4, 10], "texture": "#2"},
"south": {"uv": [5, 8, 16, 10], "texture": "#b"},
"west": {"uv": [12, 8, 13, 10], "texture": "#b"},
"up": {"uv": [5, 12, 16, 13], "texture": "#3"},
"down": {"uv": [5, 3, 16, 4], "texture": "#top"}
}
},
{
"from": [5, 4.5, -3],
"to": [13, 5, 5],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.5, 1]},
"faces": {
"north": {"uv": [5, 13, 13, 13.5], "texture": "#b"},
"east": {"uv": [11, 11, 16, 11.5], "texture": "#b"},
"south": {"uv": [5, 11, 13, 11.5], "texture": "#b"},
"west": {"uv": [0, 11, 5, 11.5], "texture": "#b"},
"up": {"uv": [5, 4, 13, 12], "texture": "#b"},
"down": {"uv": [5, 4, 13, 12], "texture": "#b"}
}
},
{
"from": [8, 5, 0],
"to": [10, 5.5, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1]},
"faces": {
"north": {"uv": [6, 10.5, 8, 11], "texture": "#2"},
"east": {"uv": [14, 10.5, 16, 11], "texture": "#b"},
"south": {"uv": [8, 10.5, 10, 11], "texture": "#b"},
"west": {"uv": [0, 10.5, 2, 11], "texture": "#b"},
"up": {"uv": [8, 0, 10, 2], "texture": "#b"},
"down": {"uv": [8, 14, 10, 16], "texture": "#b"}
}
},
{
"from": [8, 4, 0],
"to": [10, 4.5, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1]},
"faces": {
"north": {"uv": [6, 11.5, 8, 12], "texture": "#b"},
"east": {"uv": [14, 11.5, 16, 12], "texture": "#b"},
"south": {"uv": [8, 11.5, 10, 12], "texture": "#b"},
"west": {"uv": [0, 11.5, 2, 12], "texture": "#b"},
"up": {"uv": [8, 0, 10, 2], "texture": "#b"},
"down": {"uv": [8, 14, 10, 16], "texture": "#b"}
}
},
{
"from": [3, 3.5, 0],
"to": [10, 4, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1]},
"faces": {
"north": {"uv": [8, 6, 15, 6.5], "texture": "#2"},
"east": {"uv": [7, 12, 9, 12.5], "texture": "#2"},
"south": {"uv": [3, 12, 10, 12.5], "texture": "#2"},
"west": {"uv": [7, 12, 9, 12.5], "texture": "#2"},
"up": {"uv": [3, 7, 10, 9], "texture": "#2"},
"down": {"uv": [3, 7, 10, 9], "texture": "#2"}
}
},
{
"from": [3, 5.5, 0],
"to": [10, 6, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 1]},
"faces": {
"north": {"uv": [6, 10, 13, 10.5], "texture": "#2"},
"east": {"uv": [7, 10, 9, 10.5], "texture": "#2"},
"south": {"uv": [3, 10, 10, 10.5], "texture": "#2"},
"west": {"uv": [7, 10, 9, 10.5], "texture": "#2"},
"up": {"uv": [9, 0, 16, 2], "texture": "#2"},
"down": {"uv": [3, 7, 10, 9], "texture": "#2"}
}
},
{
"from": [6, 4.5, -4],
"to": [12, 5, -3],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.5, 1]},
"faces": {
"north": {"uv": [7, 12, 13, 12.5], "texture": "#b"},
"east": {"uv": [16, 11, 16, 11.5], "texture": "#b"},
"south": {"uv": [6, 11, 12, 11.5], "texture": "#b"},
"west": {"uv": [0, 11, 0, 11.5], "texture": "#b"},
"up": {"uv": [6, 12, 12, 13], "texture": "#b"},
"down": {"uv": [6, 3, 12, 4], "texture": "#b"}
}
},
{
"from": [4, 4.5, -2],
"to": [5, 5, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.5, 1]},
"faces": {
"north": {"uv": [11, 12, 12, 12.5], "texture": "#b"},
"east": {"uv": [12, 11, 16, 11.5], "texture": "#b"},
"south": {"uv": [4, 11, 5, 11.5], "texture": "#b"},
"west": {"uv": [0, 11, 4, 11.5], "texture": "#b"},
"up": {"uv": [4, 4, 5, 12], "texture": "#b"},
"down": {"uv": [4, 5, 5, 11], "texture": "#b"}
}
},
{
"from": [13, 4.5, -2],
"to": [14, 5, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.5, 1]},
"faces": {
"north": {"uv": [2, 11, 3, 11.5], "texture": "#b"},
"east": {"uv": [6, 12, 10, 12.5], "texture": "#b"},
"south": {"uv": [13, 11, 14, 11.5], "texture": "#b"},
"west": {"uv": [0, 11, 4, 11.5], "texture": "#b"},
"up": {"uv": [13, 5, 14, 11], "texture": "#b"},
"down": {"uv": [13, 5, 14, 11], "texture": "#b"}
}
},
{
"from": [6, 4.5, 5],
"to": [12, 5, 6],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7.5, 1]},
"faces": {
"north": {"uv": [4, 11, 10, 11.5], "texture": "#b"},
"east": {"uv": [10, 11, 11, 11.5], "texture": "#b"},
"south": {"uv": [6, 11, 12, 11.5], "texture": "#b"},
"west": {"uv": [5, 11, 6, 11.5], "texture": "#b"},
"up": {"uv": [6, 12, 12, 13], "texture": "#b"},
"down": {"uv": [6, 10, 12, 11], "texture": "#b"}
}
}
],
"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]
}
}
}

View file

@ -1,5 +1,6 @@
{
"parent": "block/cube",
"parent": "block/cube",
"ambientocclusion": false,
"textures": {
"glass": "engineersdecor:blocks/glass/window_glass_texture"
},

View file

@ -31,6 +31,10 @@
"ingredient": { "type": "forge:ore_dict", "ore": "blockSteel" },
"name": "blockSteel"
},
{
"ingredient": { "type": "forge:ore_dict", "ore": "blockLead" },
"name": "blockLead"
},
{
"ingredient": { "type": "forge:ore_dict", "ore": "plateIron" },
"name": "plateIron"
@ -39,6 +43,10 @@
"ingredient": { "type": "forge:ore_dict", "ore": "ingotSteel" },
"name": "ingotSteel"
},
{
"ingredient": { "type": "forge:ore_dict", "ore": "ingotLead" },
"name": "ingotLead"
},
{
"ingredient": { "type": "forge:ore_dict", "ore": "plateSteel" },
"name": "plateSteel"

View file

@ -0,0 +1,37 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"result": "engineersdecor:small_solar_panel",
"required": ["immersiveengineering:metal_device1"]
}
],
"type": "minecraft:crafting_shaped",
"pattern": [
"QQQ",
" S ",
"LRL"
],
"key": {
"Q": {
"item": "minecraft:quartz",
"data": 0
},
"S": {
"item": "#ingotSteel",
"data": 0
},
"R": {
"item": "minecraft:redstone_block",
"data": 0
},
"L": {
"item": "#blockLead",
"data": 0
}
},
"result": {
"item": "engineersdecor:small_solar_panel",
"count": 1
}
}

View file

@ -0,0 +1,41 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"result": "engineersdecor:small_tree_cutter",
"required": ["immersiveengineering:material"]
}
],
"type": "minecraft:crafting_shaped",
"pattern": [
"PPP",
"PAO",
"CRC"
],
"key": {
"O": {
"item": "minecraft:observer",
"data": 0
},
"P": {
"item": "#plateAnyFerroMetal",
"data": 0
},
"A": {
"item": "minecraft:iron_axe",
"data": 0
},
"R": {
"item": "minecraft:redstone_block",
"data": 0
},
"C": {
"item": "#anyMechanicalComponent",
"data": 0
}
},
"result": {
"item": "engineersdecor:small_tree_cutter",
"count": 1
}
}

View file

@ -0,0 +1,24 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"result": "engineersdecor:treated_wood_floor",
"required": ["immersiveengineering:material"]
}
],
"type": "minecraft:crafting_shaped",
"pattern": [
"SSS",
"SSS"
],
"key": {
"S": {
"item": "#slabTreatedWood",
"data": 0
}
},
"result": {
"item": "engineersdecor:treated_wood_floor",
"count": 1
}
}

View file

@ -0,0 +1,38 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"result": "engineersdecor:small_mineral_smelter",
"required": ["engineersdecor:panzerglass_block"],
"missing": ["immersiveengineering:metal_device1"]
}
],
"type": "minecraft:crafting_shaped",
"pattern": [
"SOS",
"GBO",
"SOS"
],
"key": {
"G": {
"item": "engineersdecor:panzerglass_block",
"data": 0
},
"S": {
"item": "#ingotIron",
"data": 0
},
"B": {
"item": "#anyLavaItem",
"data": 0
},
"O": {
"item": "#blockObsidian",
"data": 0
}
},
"result": {
"item": "engineersdecor:small_mineral_smelter",
"count": 1
}
}

View file

@ -0,0 +1,33 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"result": "engineersdecor:small_solar_panel",
"missing": ["immersiveengineering:metal_device1"]
}
],
"type": "minecraft:crafting_shaped",
"pattern": [
"QQQ",
" S ",
"SRS"
],
"key": {
"Q": {
"item": "minecraft:quartz",
"data": 0
},
"S": {
"item": "minecraft:iron_ingot",
"data": 0
},
"R": {
"item": "minecraft:redstone_block",
"data": 0
}
},
"result": {
"item": "engineersdecor:small_solar_panel",
"count": 1
}
}

View file

@ -0,0 +1,37 @@
{
"conditions": [
{
"type": "engineersdecor:grc",
"result": "engineersdecor:small_tree_cutter",
"missing": ["immersiveengineering:material"]
}
],
"type": "minecraft:crafting_shaped",
"pattern": [
"PPP",
"PAO",
"PRP"
],
"key": {
"O": {
"item": "minecraft:observer",
"data": 0
},
"P": {
"item": "#ingotIron",
"data": 0
},
"A": {
"item": "minecraft:iron_axe",
"data": 0
},
"R": {
"item": "minecraft:redstone_block",
"data": 0
}
},
"result": {
"item": "engineersdecor:small_tree_cutter",
"count": 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 637 B

View file

@ -0,0 +1 @@
{ "animation":{ "frames": [0,1], "frametime":2, "interpolate":false }}

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 649 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 654 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Before After
Before After