Release merge v1.0.16-mc1.12.2.
This commit is contained in:
commit
0fc6e6900a
354 changed files with 5669 additions and 1859 deletions
|
@ -4,4 +4,4 @@ org.gradle.jvmargs=-Xmx8G
|
|||
version_minecraft=1.12.2
|
||||
version_forge=14.23.5.2768
|
||||
version_jei=4.10.0.198
|
||||
version_engineersdecor=1.0.15
|
||||
version_engineersdecor=1.0.16
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
{
|
||||
"homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
|
||||
"1.12.2": {
|
||||
"1.0.16": "[R] Release based on v1.0.16-b3. Release-to-release changes: * Added Gas Concrete blocks/walls/stairs/slabs/slab slices. * Added Fluid Collection Funnel * Crafting yield for Clinker/Slag bricks increased. * Block Placer improvements (cocoa planting) and fixes. * Block breaker compat improvements and fixes. * Recipe compat auto detection fixes. * Feature opt-out and tweak config options for mod packs improved.",
|
||||
"1.0.16-b3": "[M] Increased slag brick recipe yield to 8.\n[A] Small Block Placer can plant Cocoa.\n[F] Fixed Small Block Placer seed detection issue (issue #64, thx Federsavo).\n[F] Fixed incorrectly enabled alternative recipes for fluid accumulator and check valve when IE is installed.\n[M] Slightly nerfed the Small Solar Panel default peak power output (does not affect existing configurations).",
|
||||
"1.0.16-b2": "[A] Added Gas Concrete (including slab, wall, stairs, and slab slice).\n[A] Added explicit RF-power-required option for Small Block Breaker and Small Tree Cutter (issue #63).\n[M] Increased clinker brick recipe yield to 8 for the master builders needs.\n[F] Fixed item-on-ground display glitch (issue #61, thx Federsavo for the hint).\n[F] Fixed sign bounding boxes (issue #62, thx angela/themartin).",
|
||||
"1.0.16-b1": "[A] Added Fluid Collection Funnel.\n[A] Added config opt-outs for Breaker, Placer, Fluid Funnel, Mineral Smelter.\n[A] Added configs tweaks for Small Block Breaker and Small Tree Cutter (cffr#185).\n[F] Fixed Block Placer discarding item metadata/variants while placing (issue #60).\n[F] Fixed Block Breaker duping empty shulker boxes, model updated.",
|
||||
"1.0.15": "[R] Release based on v1.0.15-b2. Release-to-release changes: * Added Small Block Breaker * Small Tree Cutter fixes and compatability improved. * Crafting table compat fixes.\n[M] Small Tree Cutter log detection bug fixed (issue #59).\n[M] Small Tree Cutter supports Menril chopping (issue #54).",
|
||||
"1.0.15-b2": "[A] Added Small Block Breaker\n[M] Crafting Table: Allowing NBT \"Damage\" mismatch only items that are declared damagable (issue #56).\n[M] Tree Cutter: Loosened the strict mod namespace requirement for Dynamic Trees log detection (issue #52) to enable checking DT compat mod log blocks.",
|
||||
"1.0.15-b1": "[A] Added Floor Edge Light.\n[A] Added Factory Block Placer and Planter.",
|
||||
|
@ -65,7 +69,7 @@
|
|||
"1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table."
|
||||
},
|
||||
"promos": {
|
||||
"1.12.2-recommended": "1.0.15",
|
||||
"1.12.2-latest": "1.0.15"
|
||||
"1.12.2-recommended": "1.0.16",
|
||||
"1.12.2-latest": "1.0.16"
|
||||
}
|
||||
}
|
|
@ -10,6 +10,37 @@ Mod sources for Minecraft version 1.12.2.
|
|||
----
|
||||
## Version history
|
||||
|
||||
-------------------------------------------------------------------
|
||||
- v1.0.16 [R] Release based on v1.0.16-b3. Release-to-release changes:
|
||||
* Added Gas Concrete blocks/walls/stairs/slabs/slab slices.
|
||||
* Added Fluid Collection Funnel
|
||||
* Crafting yield for Clinker/Slag bricks increased.
|
||||
* Block Placer improvements (cocoa planting) and fixes.
|
||||
* Block breaker compat improvements and fixes.
|
||||
* Recipe compat auto detection fixes.
|
||||
* Feature opt-out and tweak config options for mod packs improved.
|
||||
-------------------------------------------------------------------
|
||||
|
||||
- v1.0.16-b3 [M] Increased slag brick recipe yield to 8.
|
||||
[A] Small Block Placer can plant Cocoa.
|
||||
[F] Fixed Small Block Placer seed detection issue (issue #64, thx Federsavo).
|
||||
[F] Fixed incorrectly enabled alternative recipes for fluid accumulator and check valve
|
||||
when IE is installed.
|
||||
[M] Slightly nerfed the Small Solar Panel default peak power output (does not affect
|
||||
existing configurations).
|
||||
|
||||
- v1.0.16-b2 [A] Added Gas Concrete (including slab, wall, stairs, and slab slice).
|
||||
[A] Added explicit RF-power-required option for Small Block Breaker and Small Tree Cutter (issue #63).
|
||||
[M] Increased clinker brick recipe yield to 8 for the master builders needs.
|
||||
[F] Fixed item-on-ground display glitch (issue #61, thx Federsavo for the hint).
|
||||
[F] Fixed sign bounding boxes (issue #62, thx angela/themartin).
|
||||
|
||||
- v1.0.16-b1 [A] Added Fluid Collection Funnel.
|
||||
[A] Added config opt-outs for Breaker, Placer, Fluid Funnel, Mineral Smelter.
|
||||
[A] Added configs tweaks for Small Block Breaker and Small Tree Cutter (cffr#185).
|
||||
[F] Fixed Block Placer discarding item metadata/variants while placing (issue #60).
|
||||
[F] Fixed Block Breaker duping empty shulker boxes, model updated.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
- v1.0.15 [R] Release based on v1.0.15-b2. Release-to-release changes:
|
||||
* Added Small Block Breaker
|
||||
|
|
|
@ -70,6 +70,11 @@ public class ModContent
|
|||
|
||||
public static final BlockDecorWall CONCRETE_WALL = new BlockDecorWall("concrete_wall", BlockDecor.CFG_DEFAULT, Material.ROCK, 5f, 20f, SoundType.STONE);
|
||||
|
||||
public static final BlockDecorFull GAS_CONCRETE_BLOCK = new BlockDecorFull("gas_concrete", 0, Material.ROCK, 1.5f, 10f, SoundType.STONE);
|
||||
public static final BlockDecorStairs GAS_CONCRETE_STAIRS = new BlockDecorStairs("gas_concrete_stairs", REBAR_CONCRETE_BLOCK.getDefaultState());
|
||||
public static final BlockDecorWall GAS_CONCRETE_WALL = new BlockDecorWall("gas_concrete_wall", BlockDecor.CFG_DEFAULT, Material.ROCK, 1.5f, 10f, SoundType.STONE);
|
||||
public static final BlockDecorSlab GAS_CONCRETE_SLAB = new BlockDecorSlab("gas_concrete_slab", BlockDecor.CFG_DEFAULT, Material.ROCK, 1.5f, 10f, SoundType.STONE);
|
||||
|
||||
public static final BlockDecorLadder METAL_RUNG_LADDER = new BlockDecorLadder("metal_rung_ladder", 0, Material.IRON, 0.5f, 20f, SoundType.METAL);
|
||||
public static final BlockDecorLadder METAL_RUNG_STEPS = new BlockDecorLadder("metal_rung_steps", 0, Material.IRON, 0.5f, 20f, SoundType.METAL);
|
||||
public static final BlockDecorLadder TREATED_WOOD_LADDER = new BlockDecorLadder("treated_wood_ladder", 0, Material.WOOD, 0.5f, 10f, SoundType.WOOD);
|
||||
|
@ -138,6 +143,13 @@ public class ModContent
|
|||
ModAuxiliaries.getPixeledAABB(1.1,0,1.1, 14.9,16,14.9)
|
||||
);
|
||||
|
||||
public static final BlockDecorMilker SMALL_MILKING_MACHINE = new BlockDecorMilker(
|
||||
"small_milking_machine",
|
||||
BlockDecor.CFG_LOOK_PLACEMENT|BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_CUTOUT|BlockDecor.CFG_ELECTRICAL,
|
||||
Material.IRON, 1f, 15f, SoundType.METAL,
|
||||
ModAuxiliaries.getPixeledAABB(0,0,0, 16,16,13)
|
||||
);
|
||||
|
||||
public static final BlockDecorSolarPanel SMALL_SOLAR_PANEL = new BlockDecorSolarPanel(
|
||||
"small_solar_panel",
|
||||
BlockDecor.CFG_LOOK_PLACEMENT,
|
||||
|
@ -350,51 +362,51 @@ public class ModContent
|
|||
|
||||
public static final BlockDecorDirected SIGN_MODLOGO = new BlockDecorDirected(
|
||||
"sign_decor",
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_OPPOSITE_PLACEMENT|(1<<BlockDecor.CFG_LIGHT_VALUE_SHIFT),
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_OPPOSITE_PLACEMENT|(1<<BlockDecor.CFG_LIGHT_VALUE_SHIFT),
|
||||
Material.WOOD, 0.1f, 1000f, SoundType.WOOD,
|
||||
ModAuxiliaries.getPixeledAABB(0,0,15.6, 16,16,16)
|
||||
ModAuxiliaries.getPixeledAABB(0,0,0, 16,16,0.5)
|
||||
);
|
||||
|
||||
public static final BlockDecorDirected SIGN_HOTWIRE = new BlockDecorDirected(
|
||||
"sign_hotwire",
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_OPPOSITE_PLACEMENT|(1<<BlockDecor.CFG_LIGHT_VALUE_SHIFT),
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_OPPOSITE_PLACEMENT|(1<<BlockDecor.CFG_LIGHT_VALUE_SHIFT),
|
||||
Material.WOOD, 0.1f, 1f, SoundType.WOOD,
|
||||
ModAuxiliaries.getPixeledAABB(2,2,15.6, 14,14,16)
|
||||
ModAuxiliaries.getPixeledAABB(2,2,0, 14,14,0.5)
|
||||
);
|
||||
|
||||
public static final BlockDecorDirected SIGN_MINDSTEP = new BlockDecorDirected(
|
||||
"sign_mindstep",
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_OPPOSITE_PLACEMENT|(1<<BlockDecor.CFG_LIGHT_VALUE_SHIFT),
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_OPPOSITE_PLACEMENT|(1<<BlockDecor.CFG_LIGHT_VALUE_SHIFT),
|
||||
Material.WOOD, 0.1f, 1f, SoundType.WOOD,
|
||||
ModAuxiliaries.getPixeledAABB(2,2,15.6, 14,14,16)
|
||||
ModAuxiliaries.getPixeledAABB(0,0,0, 16,16,0.5)
|
||||
);
|
||||
|
||||
public static final BlockDecorDirected SIGN_DANGER = new BlockDecorDirected(
|
||||
"sign_danger",
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_OPPOSITE_PLACEMENT|(1<<BlockDecor.CFG_LIGHT_VALUE_SHIFT),
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_OPPOSITE_PLACEMENT|(1<<BlockDecor.CFG_LIGHT_VALUE_SHIFT),
|
||||
Material.WOOD, 0.1f, 1f, SoundType.WOOD,
|
||||
ModAuxiliaries.getPixeledAABB(2,2,15.6, 14,14,16)
|
||||
ModAuxiliaries.getPixeledAABB(2,2,0, 14,14,0.5)
|
||||
);
|
||||
|
||||
public static final BlockDecorDirected SIGN_DEFENSE = new BlockDecorDirected(
|
||||
"sign_defense",
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_OPPOSITE_PLACEMENT|(1<<BlockDecor.CFG_LIGHT_VALUE_SHIFT),
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_OPPOSITE_PLACEMENT|(1<<BlockDecor.CFG_LIGHT_VALUE_SHIFT),
|
||||
Material.WOOD, 0.1f, 1f, SoundType.WOOD,
|
||||
ModAuxiliaries.getPixeledAABB(2,2,15.6, 14,14,16)
|
||||
ModAuxiliaries.getPixeledAABB(0,0,0, 16,16,0.5)
|
||||
);
|
||||
|
||||
public static final BlockDecorDirected SIGN_FACTORY_AREA = new BlockDecorDirected(
|
||||
"sign_factoryarea",
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_OPPOSITE_PLACEMENT,
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_OPPOSITE_PLACEMENT,
|
||||
Material.WOOD, 0.1f, 1f, SoundType.WOOD,
|
||||
ModAuxiliaries.getPixeledAABB(2,2,15.6, 15,15,16)
|
||||
ModAuxiliaries.getPixeledAABB(1,1,0, 15,15,0.5)
|
||||
);
|
||||
|
||||
public static final BlockDecorDirected SIGN_EXIT = new BlockDecorDirected(
|
||||
"sign_exit",
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_OPPOSITE_PLACEMENT,
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_OPPOSITE_PLACEMENT,
|
||||
Material.WOOD, 0.1f, 1f, SoundType.WOOD,
|
||||
ModAuxiliaries.getPixeledAABB(3,7,15.6, 13,13,16)
|
||||
ModAuxiliaries.getPixeledAABB(3,7,0, 13,13,0.5)
|
||||
);
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -409,6 +421,11 @@ public class ModContent
|
|||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_HARD_IE_DEPENDENT,
|
||||
Material.ROCK, 1.0f, 10f, SoundType.STONE
|
||||
);
|
||||
public static final BlockDecorHalfSlab HALFSLAB_GAS_CONCRETE = new BlockDecorHalfSlab(
|
||||
"halfslab_gas_concrete",
|
||||
BlockDecor.CFG_CUTOUT,
|
||||
Material.ROCK, 1.5f, 10f, SoundType.STONE
|
||||
);
|
||||
public static final BlockDecorHalfSlab HALFSLAB_TREATEDWOOD = new BlockDecorHalfSlab(
|
||||
"halfslab_treated_wood",
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_HARD_IE_DEPENDENT,
|
||||
|
@ -493,6 +510,9 @@ public class ModContent
|
|||
private static final TileEntityRegistrationData SMALL_MINERAL_SMELTER_TEI = new TileEntityRegistrationData(
|
||||
BlockDecorMineralSmelter.BTileEntity.class, "te_small_mineral_smelter"
|
||||
);
|
||||
private static final TileEntityRegistrationData SMALL_MILKING_MACHINE_TEI = new TileEntityRegistrationData(
|
||||
BlockDecorMilker.BTileEntity.class, "te_small_milking_machine"
|
||||
);
|
||||
private static final TileEntityRegistrationData SMALL_SOLAR_PANEL_TEI = new TileEntityRegistrationData(
|
||||
BlockDecorSolarPanel.BTileEntity.class, "te_small_solar_panel"
|
||||
);
|
||||
|
@ -523,6 +543,7 @@ public class ModContent
|
|||
SMALL_SOLAR_PANEL,SMALL_SOLAR_PANEL_TEI,
|
||||
SMALL_MINERAL_SMELTER, SMALL_MINERAL_SMELTER_TEI,
|
||||
STRAIGHT_CHECK_VALVE, STRAIGHT_REDSTONE_VALVE, STRAIGHT_REDSTONE_ANALOG_VALVE, STRAIGHT_PIPE_VALVE_TEI,
|
||||
SMALL_FLUID_FUNNEL,SMALL_FLUID_FUNNEL_TEI,
|
||||
PASSIVE_FLUID_ACCUMULATOR, PASSIVE_FLUID_ACCUMULATOR_TEI,
|
||||
CLINKER_BRICK_BLOCK,
|
||||
CLINKER_BRICK_SLAB,
|
||||
|
@ -542,6 +563,10 @@ public class ModContent
|
|||
REBAR_CONCRETE_TILE,
|
||||
REBAR_CONCRETE_TILE_SLAB,
|
||||
REBAR_CONCRETE_TILE_STAIRS,
|
||||
GAS_CONCRETE_BLOCK,
|
||||
GAS_CONCRETE_SLAB,
|
||||
GAS_CONCRETE_STAIRS,
|
||||
GAS_CONCRETE_WALL,
|
||||
CONCRETE_WALL,
|
||||
PANZERGLASS_BLOCK,
|
||||
METAL_RUNG_LADDER,
|
||||
|
@ -568,17 +593,17 @@ public class ModContent
|
|||
STEEL_MESH_FENCE,
|
||||
SIGN_HOTWIRE, SIGN_DANGER, SIGN_DEFENSE, SIGN_FACTORY_AREA, SIGN_EXIT, SIGN_MODLOGO,
|
||||
TREATED_WOOD_SIDE_TABLE,
|
||||
HALFSLAB_REBARCONCRETE, HALFSLAB_CONCRETE, HALFSLAB_TREATEDWOOD,
|
||||
HALFSLAB_REBARCONCRETE, HALFSLAB_CONCRETE, HALFSLAB_GAS_CONCRETE, HALFSLAB_TREATEDWOOD,
|
||||
HALFSLAB_SHEETMETALIRON, HALFSLAB_SHEETMETALSTEEL, HALFSLAB_SHEETMETALCOPPER,
|
||||
HALFSLAB_SHEETMETALGOLD, HALFSLAB_SHEETMETALALUMINIUM,
|
||||
};
|
||||
|
||||
private static final Object dev_content[] = {
|
||||
SIGN_MINDSTEP,
|
||||
SIGN_MINDSTEP, // @todo: somehow make this sign look good.
|
||||
PANZERGLASS_SLAB, // @todo: check if another class is needed due to is_side_visible
|
||||
TREATED_WOOD_FLOOR, // @todo: check if textures need improvement
|
||||
TEST_BLOCK,TEST_BLOCK_TEI,
|
||||
SMALL_FLUID_FUNNEL,SMALL_FLUID_FUNNEL_TEI
|
||||
SMALL_MILKING_MACHINE,SMALL_MILKING_MACHINE_TEI
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -16,7 +16,6 @@ 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.item.ItemStack;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.init.Blocks;
|
||||
|
@ -113,16 +112,19 @@ public class BlockDecorBreaker extends BlockDecorDirected
|
|||
private static int boost_energy_consumption = DEFAULT_BOOST_ENERGY;
|
||||
private static int breaking_reluctance = DEFAULT_BREAKING_RELUCTANCE;
|
||||
private static int min_breaking_time = DEFAULT_MIN_BREAKING_TIME;
|
||||
private static boolean requires_power = false;
|
||||
private int tick_timer_;
|
||||
private int active_timer_;
|
||||
private int proc_time_elapsed_;
|
||||
private int boost_energy_;
|
||||
|
||||
public static void on_config(int boost_energy_per_tick, int breaking_time_per_hardness, int min_breaking_time_ticks)
|
||||
public static void on_config(int boost_energy_per_tick, int breaking_time_per_hardness, int min_breaking_time_ticks, boolean power_required)
|
||||
{
|
||||
boost_energy_consumption = TICK_INTERVAL * MathHelper.clamp(boost_energy_per_tick, 16, 512);
|
||||
breaking_reluctance = MathHelper.clamp(breaking_time_per_hardness, 5, 50);
|
||||
min_breaking_time = MathHelper.clamp(min_breaking_time_ticks, 10, 100);
|
||||
ModEngineersDecor.logger.info("Config block breaker: Boost energy consumption:" + boost_energy_consumption + "rf/t, reluctance=" + breaking_reluctance + "/hrdn, break time offset=" + min_breaking_time );
|
||||
requires_power = power_required;
|
||||
ModEngineersDecor.logger.info("Config block breaker: Boost energy consumption:" + (boost_energy_consumption/TICK_INTERVAL) + "rf/t, reluctance=" + breaking_reluctance + "t/hrdn, break time offset=" + min_breaking_time + "t");
|
||||
}
|
||||
|
||||
public BTileEntity()
|
||||
|
@ -208,13 +210,12 @@ public class BlockDecorBreaker extends BlockDecorDirected
|
|||
return true;
|
||||
}
|
||||
|
||||
private boolean breakBlock(IBlockState state, BlockPos pos, World world)
|
||||
private static boolean breakBlock(IBlockState state, BlockPos pos, World world)
|
||||
{
|
||||
if(world.isRemote || world.restoringBlockSnapshots) return false; // retry next cycle
|
||||
NonNullList<ItemStack> drops = NonNullList.create();
|
||||
state.getBlock().getDrops(drops, world, pos, state, 0);
|
||||
final Block block = state.getBlock();
|
||||
block.dropBlockAsItem(world, pos, state, 0);
|
||||
world.setBlockToAir(pos);
|
||||
for(ItemStack drop:drops) spawnAsEntity(world, pos, drop);
|
||||
SoundType stype = state.getBlock().getSoundType(state, world, pos, null);
|
||||
if(stype != null) world.playSound(null, pos, stype.getPlaceSound(), SoundCategory.BLOCKS, stype.getVolume()*0.6f, stype.getPitch());
|
||||
return true;
|
||||
|
@ -252,14 +253,19 @@ public class BlockDecorBreaker extends BlockDecorDirected
|
|||
tick_timer_ = IDLE_TICK_INTERVAL;
|
||||
return;
|
||||
}
|
||||
proc_time_elapsed_ += TICK_INTERVAL;
|
||||
boolean active = true;
|
||||
int time_needed = (int)(target_state.getBlockHardness(world, pos) * breaking_reluctance) + min_breaking_time;
|
||||
if(boost_energy_ >= boost_energy_consumption) {
|
||||
boost_energy_ = 0;
|
||||
proc_time_elapsed_ += TICK_INTERVAL * BOOST_FACTOR;
|
||||
proc_time_elapsed_ += TICK_INTERVAL * (1+BOOST_FACTOR);
|
||||
time_needed += min_breaking_time * (3*BOOST_FACTOR/5);
|
||||
active_timer_ = 2;
|
||||
} else if(!requires_power) {
|
||||
proc_time_elapsed_ += TICK_INTERVAL;
|
||||
active_timer_ = 1024;
|
||||
} else if(active_timer_ > 0) {
|
||||
--active_timer_;
|
||||
}
|
||||
boolean active = (active_timer_ > 0);
|
||||
time_needed = MathHelper.clamp(time_needed, min_breaking_time, MAX_BREAKING_TIME);
|
||||
if(proc_time_elapsed_ >= time_needed) {
|
||||
proc_time_elapsed_ = 0;
|
||||
|
|
|
@ -0,0 +1,567 @@
|
|||
/*
|
||||
* @file BlockDecorMilker.java
|
||||
* @author Stefan Wilhelm (wile)
|
||||
* @copyright (C) 2019 Stefan Wilhelm
|
||||
* @license MIT (see https://opensource.org/licenses/MIT)
|
||||
*
|
||||
* Frequently attracts and milks nearby cows
|
||||
*/
|
||||
package wile.engineersdecor.blocks;
|
||||
|
||||
import wile.engineersdecor.ModEngineersDecor;
|
||||
import net.minecraft.entity.passive.EntityCow;
|
||||
import net.minecraft.init.SoundEvents;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.block.state.BlockFaceShape;
|
||||
import net.minecraft.block.state.BlockStateContainer;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.properties.PropertyBool;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.Explosion;
|
||||
import net.minecraft.entity.MoverType;
|
||||
import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.item.*;
|
||||
import net.minecraft.util.*;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.energy.CapabilityEnergy;
|
||||
import net.minecraftforge.energy.IEnergyStorage;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
import net.minecraftforge.items.wrapper.PlayerMainInvWrapper;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidRegistry;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||
import net.minecraftforge.fluids.capability.IFluidTankProperties;
|
||||
import wile.engineersdecor.detail.ExtItems;
|
||||
import wile.engineersdecor.detail.ItemHandling;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.UUID;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
||||
{
|
||||
public static final PropertyBool FILLED = PropertyBool.create("filled");
|
||||
public static final PropertyBool ACTIVE = PropertyBool.create("active");
|
||||
|
||||
public BlockDecorMilker(@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, FILLED, ACTIVE); }
|
||||
|
||||
@Override
|
||||
public IBlockState getStateFromMeta(int meta)
|
||||
{ return super.getStateFromMeta(meta).withProperty(FILLED, ((meta & 0x4)!=0)).withProperty(ACTIVE, ((meta & 0x8)!=0)) ; }
|
||||
|
||||
@Override
|
||||
public int getMetaFromState(IBlockState state)
|
||||
{ return super.getMetaFromState(state) | (state.getValue(FILLED)?0x4:0x00) | (state.getValue(ACTIVE)?0x8:0x00); }
|
||||
|
||||
@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(FILLED, false).withProperty(ACTIVE, false); }
|
||||
|
||||
@Override
|
||||
public BlockFaceShape getBlockFaceShape(IBlockAccess world, IBlockState state, BlockPos pos, EnumFacing face)
|
||||
{ return BlockFaceShape.UNDEFINED; }
|
||||
|
||||
@Override
|
||||
public boolean isPassable(IBlockAccess worldIn, BlockPos pos)
|
||||
{ return false; }
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public boolean hasComparatorInputOverride(IBlockState state)
|
||||
{ return true; }
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public int getComparatorInputOverride(IBlockState state, World world, BlockPos pos)
|
||||
{
|
||||
BTileEntity te = getTe(world, pos);
|
||||
return (te==null) ? 0 : MathHelper.clamp((16 * te.fluid_level())/BTileEntity.TANK_CAPACITY, 0, 15);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasTileEntity(IBlockState state)
|
||||
{ return true; }
|
||||
|
||||
@Nullable
|
||||
public TileEntity createTileEntity(World world, IBlockState state)
|
||||
{ return new BlockDecorMilker.BTileEntity(); }
|
||||
|
||||
@Override
|
||||
public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest)
|
||||
{
|
||||
if(world.isRemote) return true;
|
||||
BTileEntity te = getTe(world, pos);
|
||||
if(te==null) return super.removedByPlayer(state, world, pos, player, willHarvest);
|
||||
final NBTTagCompound te_nbt = te.destroy_getnbt();
|
||||
ItemStack stack = new ItemStack(this, 1);
|
||||
if((te_nbt!=null) && !te_nbt.isEmpty()) {
|
||||
NBTTagCompound nbt = stack.getTagCompound();
|
||||
if(nbt == null) nbt = new NBTTagCompound();
|
||||
nbt.setTag("tedata", te_nbt);
|
||||
stack.setTagCompound(nbt);
|
||||
}
|
||||
world.spawnEntity(new EntityItem(world, pos.getX()+0.5, pos.getY()+0.5, pos.getZ()+0.5, stack));
|
||||
world.setBlockToAir(pos);
|
||||
world.removeTileEntity(pos);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBlockExploded(World world, BlockPos pos, Explosion explosion)
|
||||
{ super.onBlockExploded(world, pos, explosion); } // currently nothing to do here
|
||||
|
||||
@Override
|
||||
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
|
||||
{
|
||||
if(world.isRemote) return true;
|
||||
BTileEntity te = getTe(world, pos);
|
||||
if(te==null) return true;
|
||||
final ItemStack in_stack = player.getHeldItem(hand);
|
||||
final ItemStack out_stack = BTileEntity.milk_filled_container_item(in_stack);
|
||||
if(out_stack.isEmpty()) return FluidUtil.interactWithFluidHandler(player, hand, te.fluid_handler());
|
||||
boolean drained = false;
|
||||
IItemHandler player_inventory = new PlayerMainInvWrapper(player.inventory);
|
||||
if(te.fluid_level() >= BTileEntity.BUCKET_SIZE) {
|
||||
final ItemStack insert_stack = out_stack.copy();
|
||||
ItemStack remainder = ItemHandlerHelper.insertItemStacked(player_inventory, insert_stack, false);
|
||||
if(remainder.getCount() < insert_stack.getCount()) {
|
||||
te.drain(BTileEntity.BUCKET_SIZE);
|
||||
in_stack.shrink(1);
|
||||
drained = true;
|
||||
if(remainder.getCount() > 0) {
|
||||
final EntityItem ei = new EntityItem(world, player.posX, player.posY + 0.5, player.posZ, remainder);
|
||||
ei.setPickupDelay(40);
|
||||
ei.motionX = 0;
|
||||
ei.motionZ = 0;
|
||||
world.spawnEntity(ei);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(drained) {
|
||||
world.playSound(null, pos, SoundEvents.ITEM_BUCKET_FILL, SoundCategory.BLOCKS, 0.8f, 1f);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private BTileEntity getTe(World world, BlockPos pos)
|
||||
{ final TileEntity te=world.getTileEntity(pos); return (!(te instanceof BTileEntity)) ? (null) : ((BTileEntity)te); }
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
// Tile entity
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static class BTileEntity extends TileEntity implements ITickable, ICapabilityProvider, IEnergyStorage
|
||||
{
|
||||
public static final int BUCKET_SIZE = 1000;
|
||||
public static final int TICK_INTERVAL = 80;
|
||||
public static final int PROCESSING_TICK_INTERVAL = 20;
|
||||
public static final int TANK_CAPACITY = BUCKET_SIZE * 12;
|
||||
public static final int MAX_MILKING_TANK_LEVEL = TANK_CAPACITY-500;
|
||||
public static final int FILLED_INDICATION_THRESHOLD = BUCKET_SIZE;
|
||||
public static final int MAX_ENERGY_BUFFER = 16000;
|
||||
public static final int MAX_ENERGY_TRANSFER = 512;
|
||||
public static final int DEFAULT_ENERGY_CONSUMPTION = 0;
|
||||
private static final EnumFacing FLUID_TRANSFER_DIRECTRIONS[] = {EnumFacing.DOWN,EnumFacing.EAST,EnumFacing.SOUTH,EnumFacing.WEST,EnumFacing.NORTH};
|
||||
private enum MilkingState { IDLE, PICKED, COMING, POSITIONING, MILKING, LEAVING, WAITING }
|
||||
|
||||
private static FluidStack milk_fluid_ = new FluidStack(FluidRegistry.WATER, 0);
|
||||
private static HashMap<ItemStack, ItemStack> milk_containers_ = new HashMap<>();
|
||||
private static int energy_consumption = DEFAULT_ENERGY_CONSUMPTION;
|
||||
private int tick_timer_;
|
||||
private int energy_stored_;
|
||||
private int tank_level_ = 0;
|
||||
private UUID tracked_cow_ = null;
|
||||
private MilkingState state_ = MilkingState.IDLE;
|
||||
private int state_timeout_ = 0;
|
||||
private int state_timer_ = 0;
|
||||
private BlockPos tracked_cow_original_position_ = null;
|
||||
|
||||
public static void on_config(int energy_consumption_per_tick)
|
||||
{
|
||||
energy_consumption = MathHelper.clamp(energy_consumption_per_tick, 0, 128);
|
||||
{
|
||||
Fluid milk = FluidRegistry.getFluid("milk");
|
||||
if(milk != null) milk_fluid_ = new FluidStack(milk, BUCKET_SIZE);
|
||||
}
|
||||
{
|
||||
milk_containers_.put(new ItemStack(Items.BUCKET), new ItemStack(Items.MILK_BUCKET));
|
||||
if(ExtItems.BOTTLED_MILK_BOTTLE_DRINKLABLE!=null) milk_containers_.put(new ItemStack(Items.GLASS_BOTTLE), new ItemStack(ExtItems.BOTTLED_MILK_BOTTLE_DRINKLABLE));
|
||||
}
|
||||
ModEngineersDecor.logger.info(
|
||||
"Config milker energy consumption:" + energy_consumption + "rf/t"
|
||||
+ ((milk_fluid_==null)?"":" [milk fluid available]")
|
||||
+ ((ExtItems.BOTTLED_MILK_BOTTLE_DRINKLABLE==null)?"":" [bottledmilk mod available]")
|
||||
);
|
||||
}
|
||||
|
||||
public BTileEntity()
|
||||
{ reset(); }
|
||||
|
||||
public void reset()
|
||||
{
|
||||
tank_level_ = 0;
|
||||
energy_stored_ = 0;
|
||||
tick_timer_ = 0;
|
||||
tracked_cow_ = null;
|
||||
state_ = MilkingState.IDLE;
|
||||
state_timeout_ = 0;
|
||||
}
|
||||
|
||||
public NBTTagCompound destroy_getnbt()
|
||||
{
|
||||
final UUID cowuid = tracked_cow_;
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
writenbt(nbt, false); reset();
|
||||
if(cowuid == null) return nbt;
|
||||
world.getEntitiesWithinAABB(EntityCow.class, new AxisAlignedBB(pos).grow(16, 16, 16), e->e.getPersistentID().equals(cowuid)).forEach(e->e.setNoAI(false));
|
||||
return nbt;
|
||||
}
|
||||
|
||||
public void readnbt(NBTTagCompound nbt, boolean update_packet)
|
||||
{
|
||||
tank_level_ = nbt.getInteger("tank");
|
||||
energy_stored_ = nbt.getInteger("energy");
|
||||
}
|
||||
|
||||
protected void writenbt(NBTTagCompound nbt, boolean update_packet)
|
||||
{
|
||||
if(tank_level_ > 0) nbt.setInteger("tank", tank_level_);
|
||||
if(energy_stored_ > 0) nbt.setInteger("energy", energy_stored_ );
|
||||
}
|
||||
|
||||
private IFluidHandler fluid_handler()
|
||||
{ return fluid_handler_; }
|
||||
|
||||
private int fluid_level()
|
||||
{ return MathHelper.clamp(tank_level_, 0, TANK_CAPACITY); }
|
||||
|
||||
private void drain(int amount)
|
||||
{ tank_level_ = MathHelper.clamp(tank_level_-BUCKET_SIZE, 0, TANK_CAPACITY); markDirty(); }
|
||||
|
||||
// TileEntity ------------------------------------------------------------------------------
|
||||
|
||||
@Override
|
||||
public boolean shouldRefresh(World world, BlockPos pos, IBlockState os, IBlockState ns)
|
||||
{ return (os.getBlock() != ns.getBlock()) || (!(ns.getBlock() instanceof BlockDecorMilker)); }
|
||||
|
||||
@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; }
|
||||
|
||||
// IEnergyStorage ----------------------------------------------------------------------------
|
||||
|
||||
@Override
|
||||
public boolean canExtract()
|
||||
{ return false; }
|
||||
|
||||
@Override
|
||||
public boolean canReceive()
|
||||
{ return true; }
|
||||
|
||||
@Override
|
||||
public int getMaxEnergyStored()
|
||||
{ return MAX_ENERGY_BUFFER; }
|
||||
|
||||
@Override
|
||||
public int getEnergyStored()
|
||||
{ return energy_stored_; }
|
||||
|
||||
@Override
|
||||
public int extractEnergy(int maxExtract, boolean simulate)
|
||||
{ return 0; }
|
||||
|
||||
@Override
|
||||
public int receiveEnergy(int maxReceive, boolean simulate)
|
||||
{
|
||||
if(energy_stored_ >= MAX_ENERGY_BUFFER) return 0;
|
||||
int n = Math.min(maxReceive, (MAX_ENERGY_BUFFER - energy_stored_));
|
||||
if(n > MAX_ENERGY_TRANSFER) n = MAX_ENERGY_TRANSFER;
|
||||
if(!simulate) {energy_stored_ += n; markDirty(); }
|
||||
return n;
|
||||
}
|
||||
|
||||
// IFluidHandler / IFluidTankProperties ---------------------------------------------------------------------
|
||||
|
||||
private static class BFluidHandler implements IFluidHandler, IFluidTankProperties
|
||||
{
|
||||
private final BTileEntity te;
|
||||
private final IFluidTankProperties[] props_ = {this};
|
||||
BFluidHandler(BTileEntity te) { this.te=te; }
|
||||
@Override @Nullable public FluidStack getContents() { return new FluidStack(milk_fluid_, te.fluid_level()); }
|
||||
@Override public IFluidTankProperties[] getTankProperties() { return props_; }
|
||||
@Override public int fill(FluidStack resource, boolean doFill) { return 0; }
|
||||
@Override public int getCapacity() { return TANK_CAPACITY; }
|
||||
@Override public boolean canFill() { return false; }
|
||||
@Override public boolean canDrain() { return (milk_fluid_.amount > 0); }
|
||||
@Override public boolean canFillFluidType(FluidStack fs) { return false; }
|
||||
@Override public boolean canDrainFluidType(FluidStack fs) { return fs.isFluidEqual(milk_fluid_); }
|
||||
|
||||
@Override @Nullable public FluidStack drain(FluidStack resource, boolean doDrain)
|
||||
{ return (!resource.isFluidEqual(milk_fluid_)) ? (null) : drain(resource.amount, doDrain); }
|
||||
|
||||
@Override @Nullable public FluidStack drain(int maxDrain, boolean doDrain)
|
||||
{
|
||||
if(te.fluid_level() <= 0) return null;
|
||||
FluidStack fs = milk_fluid_.copy();
|
||||
fs.amount = Math.min(fs.amount, te.fluid_level());
|
||||
if(doDrain) te.tank_level_ -= fs.amount;
|
||||
return fs;
|
||||
}
|
||||
}
|
||||
|
||||
private final BFluidHandler fluid_handler_ = new BFluidHandler(this);
|
||||
|
||||
// ICapabilityProvider ---------------------------------------------------------------------------
|
||||
|
||||
@Override
|
||||
public boolean hasCapability(Capability<?> cap, EnumFacing facing)
|
||||
{
|
||||
if((cap==CapabilityEnergy.ENERGY) && (energy_consumption>0)) return true;
|
||||
if((cap==CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) && (milk_fluid_.amount>0)) return true;
|
||||
return super.hasCapability(cap, facing);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
@Nullable
|
||||
public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing)
|
||||
{
|
||||
if(capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) {
|
||||
return (T)fluid_handler_;
|
||||
} else if(capability == CapabilityEnergy.ENERGY) {
|
||||
return (T)this;
|
||||
} else {
|
||||
return super.getCapability(capability, facing);
|
||||
}
|
||||
}
|
||||
|
||||
// ITickable ------------------------------------------------------------------------------------
|
||||
|
||||
private void log(String s)
|
||||
{} // may be enabled with config, for dev was println
|
||||
|
||||
private static ItemStack milk_filled_container_item(ItemStack stack)
|
||||
{ return milk_containers_.entrySet().stream().filter(e->e.getKey().isItemEqual(stack)).map(Map.Entry::getValue).findFirst().orElse(ItemStack.EMPTY); }
|
||||
|
||||
private void fill_adjacent_inventory_item_containers(EnumFacing block_facing)
|
||||
{
|
||||
// Check inventory existence, back to down is preferred, otherwise sort back into same inventory.
|
||||
IItemHandler src = ItemHandling.itemhandler(world, pos.offset(block_facing), block_facing.getOpposite());
|
||||
IItemHandler dst = ItemHandling.itemhandler(world, pos.down(), EnumFacing.UP);
|
||||
if(src==null) { src = dst; } else if(dst==null) { dst = src; }
|
||||
if((src==null) || (dst==null)) return;
|
||||
while((tank_level_ >= BUCKET_SIZE)) {
|
||||
boolean inserted = false;
|
||||
for(Entry<ItemStack,ItemStack> e:milk_containers_.entrySet()) {
|
||||
if(ItemHandling.extract(src, e.getKey(), 1, true).isEmpty()) continue;
|
||||
if(!ItemHandling.insert(dst, e.getValue().copy(), false).isEmpty()) continue;
|
||||
ItemHandling.extract(src, e.getKey(), 1, false);
|
||||
tank_level_ -= BUCKET_SIZE;
|
||||
inserted = true;
|
||||
}
|
||||
if(!inserted) break;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean milking_process()
|
||||
{
|
||||
if((tracked_cow_ == null) && (fluid_level() >= MAX_MILKING_TANK_LEVEL)) return false; // nothing to do
|
||||
final EnumFacing facing = world.getBlockState(getPos()).getValue(FACING).getOpposite();
|
||||
EntityCow cow = null;
|
||||
{
|
||||
AxisAlignedBB aabb = new AxisAlignedBB(pos.offset(facing, 3)).grow(4, 2, 4);
|
||||
final List<EntityCow> cows = world.getEntitiesWithinAABB(EntityCow.class, aabb,
|
||||
e->(((tracked_cow_==null) && (!e.isChild() && !e.isInLove()))||(e.getPersistentID().equals(tracked_cow_)))
|
||||
);
|
||||
if(cows.size() == 1) {
|
||||
cow = cows.get(0); // tracked or only one
|
||||
} else if(cows.size() > 1) {
|
||||
cow = cows.get(world.rand.nextInt(cows.size()-1)); // pick one
|
||||
}
|
||||
}
|
||||
if((state_ != MilkingState.IDLE) && ((state_timeout_ -= PROCESSING_TICK_INTERVAL) <= 0)) { log("Cow motion timeout"); cow = null; }
|
||||
if((cow == null) || (cow.isDead) || ((tracked_cow_ != null) && (!tracked_cow_.equals(cow.getPersistentID())))) { tracked_cow_ = null; cow = null; }
|
||||
if(tracked_cow_ == null) state_ = MilkingState.IDLE;
|
||||
if(cow == null) return false; // retry next cycle
|
||||
tick_timer_ = PROCESSING_TICK_INTERVAL;
|
||||
state_timer_ -= PROCESSING_TICK_INTERVAL;
|
||||
if(state_timer_ > 0) return false;
|
||||
switch(state_) { // Let's do this the old school FSA sequencing way ...
|
||||
case IDLE: {
|
||||
final List<EntityLivingBase> blocking_entities = world.getEntitiesWithinAABB(EntityLivingBase.class, new AxisAlignedBB(pos.offset(facing)).grow(0.5, 0.5, 0.5));
|
||||
if(blocking_entities.size() > 0) { tick_timer_ = TICK_INTERVAL; return false; } // an entity is blocking the way
|
||||
if(cow.getLeashed() || cow.isChild() || cow.isInLove() || (!cow.onGround) || cow.isBeingRidden() || cow.isSprinting()) return false;
|
||||
tracked_cow_ = cow.getPersistentID();
|
||||
state_ = MilkingState.PICKED;
|
||||
state_timeout_ = 200;
|
||||
tracked_cow_original_position_ = cow.getPosition();
|
||||
log("Idle: Picked cow" + tracked_cow_);
|
||||
return false;
|
||||
}
|
||||
case PICKED: {
|
||||
if(cow.hasPath()) return false;
|
||||
BlockPos p = getPos().offset(facing).offset(facing.rotateY());
|
||||
if(!cow.getNavigator().tryMoveToXYZ(p.getX(), p.getY(), p.getZ(),1.0)) {
|
||||
log("Picked: No path");
|
||||
tracked_cow_ = null;
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
return false;
|
||||
}
|
||||
state_ = MilkingState.COMING;
|
||||
state_timeout_ = 300; // 15s should be enough
|
||||
log("Picked: coming");
|
||||
return false;
|
||||
}
|
||||
case COMING: {
|
||||
BlockPos p = getPos().offset(facing).offset(facing.rotateY());
|
||||
if(cow.getPosition().distanceSq(p) > 1) {
|
||||
if(cow.hasPath()) return false;
|
||||
if(!cow.getNavigator().tryMoveToXYZ(p.getX(), p.getY(), p.getZ(),1.0)) {
|
||||
log("Coming: lost path");
|
||||
tracked_cow_ = null;
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
return false;
|
||||
} else {
|
||||
state_timeout_ -= 100;
|
||||
}
|
||||
} else {
|
||||
BlockPos next_p = getPos().offset(facing);
|
||||
if(!cow.getNavigator().tryMoveToXYZ(next_p.getX(), next_p.getY(), next_p.getZ(), 1.0)) {
|
||||
log("Coming: No path");
|
||||
tracked_cow_ = null;
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
return false;
|
||||
}
|
||||
log("Coming: position reached");
|
||||
state_ = MilkingState.POSITIONING;
|
||||
state_timeout_ = 100; // 5s
|
||||
}
|
||||
return false;
|
||||
}
|
||||
case POSITIONING: {
|
||||
BlockPos p = getPos().offset(facing);
|
||||
if(p.distanceSqToCenter(cow.posX, cow.posY, cow.posZ) > 0.45) {
|
||||
if(cow.hasPath()) return false;
|
||||
if(!cow.getNavigator().tryMoveToXYZ(p.getX(), p.getY(), p.getZ(), 1.0)) {
|
||||
log("Positioning: lost path");
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
} else {
|
||||
state_timeout_ -= 25;
|
||||
}
|
||||
tracked_cow_ = null;
|
||||
return false;
|
||||
}
|
||||
cow.setNoAI(true);
|
||||
cow.move(MoverType.SELF, p.getX()+0.5-cow.posX, 0,p.getZ()+0.5-cow.posZ);
|
||||
world.playSound(null, pos, SoundEvents.ENTITY_COW_MILK, SoundCategory.BLOCKS, 0.5f, 1f);
|
||||
state_timeout_ = 600;
|
||||
state_ = MilkingState.MILKING;
|
||||
state_timer_ = 30;
|
||||
log("Positioning: start milking");
|
||||
return false;
|
||||
}
|
||||
case MILKING: {
|
||||
tank_level_ = MathHelper.clamp(tank_level_+BUCKET_SIZE, 0, TANK_CAPACITY);
|
||||
state_timeout_ = 600;
|
||||
state_ = MilkingState.LEAVING;
|
||||
state_timer_ = 20;
|
||||
BlockPos p = (tracked_cow_original_position_ != null) ? (tracked_cow_original_position_) : getPos().offset(facing.rotateYCCW(),2);
|
||||
cow.setNoAI(false);
|
||||
cow.getNavigator().tryMoveToXYZ(p.getX(), p.getY(), p.getZ(), 1.0);
|
||||
log("Milking: done, leave");
|
||||
return true;
|
||||
}
|
||||
case LEAVING: {
|
||||
BlockPos p = (tracked_cow_original_position_ != null) ? (tracked_cow_original_position_) : getPos().offset(facing.rotateYCCW(),2);
|
||||
cow.getNavigator().tryMoveToXYZ(p.getX(), p.getY(), p.getZ(), 1.0);
|
||||
state_timeout_ = 600;
|
||||
state_timer_ = 500;
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
state_ = MilkingState.WAITING;
|
||||
log("Leaving: process done");
|
||||
return true;
|
||||
}
|
||||
case WAITING: {
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
return true; // wait for the timeout to kick in until starting with the next.
|
||||
}
|
||||
default: {
|
||||
tracked_cow_ = null;
|
||||
}
|
||||
}
|
||||
return (tracked_cow_ != null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update()
|
||||
{
|
||||
if((world.isRemote) || ((--tick_timer_ > 0))) return;
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
final IBlockState block_state = world.getBlockState(pos);
|
||||
boolean dirty = false;
|
||||
if(energy_consumption > 0) {
|
||||
if(energy_stored_ <= 0) return;
|
||||
energy_stored_ = MathHelper.clamp(energy_stored_-energy_consumption, 0, MAX_ENERGY_BUFFER);
|
||||
}
|
||||
// Track and milk cows
|
||||
if(milking_process()) dirty = true;
|
||||
// Fluid transfer
|
||||
if((milk_fluid_.amount > 0) && (fluid_level() >= BUCKET_SIZE)) {
|
||||
for(EnumFacing facing: FLUID_TRANSFER_DIRECTRIONS) {
|
||||
IFluidHandler fh = FluidUtil.getFluidHandler(world, pos.offset(facing), facing.getOpposite());
|
||||
if(fh == null) continue;
|
||||
FluidStack fs = milk_fluid_.copy();
|
||||
fs.amount = BUCKET_SIZE;
|
||||
int nfilled = MathHelper.clamp(fh.fill(fs, true), 0, BUCKET_SIZE);
|
||||
if(nfilled <= 0) continue;
|
||||
tank_level_ -= nfilled;
|
||||
if(tank_level_ < 0) tank_level_ = 0;
|
||||
dirty = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Adjacent inventory update, only done just after milking to prevent waste of server cpu.
|
||||
if(dirty && (fluid_level() >= BUCKET_SIZE)) {
|
||||
fill_adjacent_inventory_item_containers(block_state.getValue(FACING));
|
||||
}
|
||||
// State update
|
||||
IBlockState new_state = block_state.withProperty(FILLED, fluid_level()>=FILLED_INDICATION_THRESHOLD).withProperty(ACTIVE, state_==MilkingState.MILKING);
|
||||
if(block_state != new_state) world.setBlockState(pos, new_state,1|2|16);
|
||||
if(dirty) markDirty();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -9,9 +9,8 @@
|
|||
*/
|
||||
package wile.engineersdecor.blocks;
|
||||
|
||||
import net.minecraft.block.state.BlockFaceShape;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import wile.engineersdecor.ModEngineersDecor;
|
||||
import net.minecraft.block.state.BlockFaceShape;
|
||||
import net.minecraft.block.properties.PropertyInteger;
|
||||
import net.minecraft.block.state.BlockStateContainer;
|
||||
import net.minecraft.block.Block;
|
||||
|
@ -19,6 +18,7 @@ import net.minecraft.block.SoundType;
|
|||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.Explosion;
|
||||
import net.minecraft.entity.item.EntityItem;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
|
|
|
@ -11,10 +11,10 @@ package wile.engineersdecor.blocks;
|
|||
import wile.engineersdecor.ModEngineersDecor;
|
||||
import wile.engineersdecor.detail.Networking;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.init.Items;
|
||||
import net.minecraft.init.SoundEvents;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.block.*;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.block.state.BlockFaceShape;
|
||||
|
@ -24,6 +24,7 @@ import net.minecraft.entity.item.EntityItem;
|
|||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.item.*;
|
||||
|
@ -45,6 +46,8 @@ import net.minecraftforge.fml.relauncher.SideOnly;
|
|||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
|
||||
public class BlockDecorPlacer extends BlockDecorDirected
|
||||
|
@ -338,22 +341,37 @@ public class BlockDecorPlacer extends BlockDecorDirected
|
|||
|
||||
public static class BTileEntity extends TileEntity implements ITickable, ISidedInventory, Networking.IPacketReceiver
|
||||
{
|
||||
@FunctionalInterface private interface SpecialPlacementFunction{ EnumActionResult apply(ItemStack stack, World world, BlockPos pos);}
|
||||
public static final int TICK_INTERVAL = 40;
|
||||
public static final int NUM_OF_SLOTS = 18;
|
||||
///
|
||||
public static final int LOGIC_INVERTED = 0x01;
|
||||
public static final int LOGIC_CONTINUOUS = 0x02;
|
||||
public static final int DEFAULT_LOGIC = LOGIC_INVERTED|LOGIC_CONTINUOUS;
|
||||
public static HashMap<ItemStack, SpecialPlacementFunction> special_placement_conversions = new HashMap<>();
|
||||
///
|
||||
private boolean block_power_signal_ = false;
|
||||
private boolean block_power_updated_ = false;
|
||||
private int logic_ = LOGIC_INVERTED|LOGIC_CONTINUOUS;
|
||||
private int logic_ = DEFAULT_LOGIC;
|
||||
private int current_slot_index_ = 0;
|
||||
private int tick_timer_ = 0;
|
||||
protected NonNullList<ItemStack> stacks_;
|
||||
|
||||
public static void on_config(int cooldown_ticks)
|
||||
public static void on_config()
|
||||
{
|
||||
// ModEngineersDecor.logger.info("Config factory placer:");
|
||||
special_placement_conversions.put(new ItemStack(Items.DYE, 1, 3), (stack,world,pos)->{ // cocoa
|
||||
if(world.getBlockState(pos).getBlock() instanceof BlockCocoa) return EnumActionResult.PASS;
|
||||
if(!Blocks.COCOA.canPlaceBlockAt(world, pos)) return EnumActionResult.FAIL;
|
||||
for(EnumFacing facing:EnumFacing.HORIZONTALS) {
|
||||
IBlockState st = world.getBlockState(pos.offset(facing));
|
||||
if(!(st.getBlock() instanceof BlockLog)) continue;
|
||||
if(st.getBlock().getMetaFromState(st) != 3) continue;
|
||||
IBlockState state = Blocks.COCOA.getDefaultState().withProperty(BlockCocoa.FACING, facing);
|
||||
return world.setBlockState(pos, state, 1|2) ? EnumActionResult.SUCCESS : EnumActionResult.FAIL;
|
||||
}
|
||||
return EnumActionResult.FAIL;
|
||||
});
|
||||
ModEngineersDecor.logger.info("Config placer: " + special_placement_conversions.size() + " special placement handling entries.");
|
||||
}
|
||||
|
||||
public BTileEntity()
|
||||
|
@ -375,15 +393,16 @@ public class BlockDecorPlacer extends BlockDecorDirected
|
|||
while(stacks_.size() < NUM_OF_SLOTS) stacks_.add(ItemStack.EMPTY);
|
||||
block_power_signal_ = nbt.getBoolean("powered");
|
||||
current_slot_index_ = nbt.getInteger("act_slot_index");
|
||||
logic_ = nbt.getInteger("logic");
|
||||
logic_ = nbt.hasKey("logic") ? nbt.getInteger("logic") : DEFAULT_LOGIC;
|
||||
}
|
||||
|
||||
protected void writenbt(NBTTagCompound nbt, boolean update_packet)
|
||||
{
|
||||
ItemStackHelper.saveAllItems(nbt, stacks_);
|
||||
nbt.setBoolean("powered", block_power_signal_);
|
||||
nbt.setInteger("act_slot_index", current_slot_index_);
|
||||
nbt.setInteger("logic", logic_);
|
||||
boolean stacks_not_empty = stacks_.stream().anyMatch(s->!s.isEmpty());
|
||||
if(stacks_not_empty) ItemStackHelper.saveAllItems(nbt, stacks_);
|
||||
if(block_power_signal_) nbt.setBoolean("powered", block_power_signal_);
|
||||
if(stacks_not_empty) nbt.setInteger("act_slot_index", current_slot_index_);
|
||||
if(logic_ != DEFAULT_LOGIC) nbt.setInteger("logic", logic_);
|
||||
}
|
||||
|
||||
public void block_updated()
|
||||
|
@ -571,11 +590,8 @@ public class BlockDecorPlacer extends BlockDecorDirected
|
|||
|
||||
private boolean spit_out(EnumFacing facing)
|
||||
{
|
||||
ItemStack stack = stacks_.get(current_slot_index_);
|
||||
ItemStack drop = stack.copy();
|
||||
stack.shrink(1);
|
||||
stacks_.set(current_slot_index_, stack);
|
||||
drop.setCount(1);
|
||||
ItemStack drop = stacks_.get(current_slot_index_).copy();
|
||||
stacks_.set(current_slot_index_, ItemStack.EMPTY);
|
||||
for(int i=0; i<8; ++i) {
|
||||
BlockPos p = pos.offset(facing, i);
|
||||
if(!world.isAirBlock(p)) continue;
|
||||
|
@ -586,6 +602,81 @@ public class BlockDecorPlacer extends BlockDecorDirected
|
|||
return true;
|
||||
}
|
||||
|
||||
private static boolean place_item(ItemStack stack, EntityPlayer placer, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
|
||||
{
|
||||
final Item place_item = stack.getItem();
|
||||
Block place_block = (place_item instanceof IPlantable) ? (((IPlantable)place_item).getPlant(world, pos)).getBlock() : Block.getBlockFromItem(place_item);
|
||||
if(((place_block==Blocks.AIR) || (place_block==null)) && ((place_item instanceof ItemBlockSpecial) && (((ItemBlockSpecial)place_item).getBlock()!=null))) place_block = ((ItemBlockSpecial)place_item).getBlock(); // Covers e.g. REEDS
|
||||
if((place_block==null) || (place_block==Blocks.AIR)) return false;
|
||||
Block block = world.getBlockState(pos).getBlock();
|
||||
if(!block.isReplaceable(world, pos)) pos = pos.offset(facing);
|
||||
if(!world.mayPlace(place_block, pos, true, facing, (Entity)null)) return false;
|
||||
if(place_item instanceof ItemBlock) {
|
||||
ItemBlock item = (ItemBlock)place_item;
|
||||
int meta = item.getMetadata(stack.getMetadata());
|
||||
final IBlockState state = item.getBlock().getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand);
|
||||
if(!item.placeBlockAt(stack, placer, world, pos, facing, hitX, hitY, hitZ, state)) return false;
|
||||
} else if(place_item instanceof IPlantable) {
|
||||
IPlantable item = (IPlantable)place_item;
|
||||
final IBlockState state = item.getPlant(world, pos);
|
||||
if(!world.setBlockState(pos, state, 1|2)) return false;
|
||||
} else {
|
||||
final IBlockState state = place_block.getDefaultState();
|
||||
if(!world.setBlockState(pos, state, 1|2)) return false;
|
||||
}
|
||||
final IBlockState soundstate = world.getBlockState(pos);
|
||||
final SoundType stype = soundstate.getBlock().getSoundType(soundstate, world, pos, placer);
|
||||
world.playSound(placer, pos, stype.getPlaceSound(), SoundCategory.BLOCKS, (stype.getVolume()+1f)/8, stype.getPitch()*1.1f);
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean try_plant(BlockPos pos, final EnumFacing facing, final ItemStack stack, final Block plant_block)
|
||||
{
|
||||
final Item item = stack.getItem();
|
||||
if((!(item instanceof ItemBlock)) && (!(item instanceof IPlantable)) && (!(plant_block instanceof IPlantable))) return spit_out(facing);
|
||||
Block block = (plant_block instanceof IPlantable) ? plant_block : ((item instanceof IPlantable) ? (((IPlantable)item).getPlant(world, pos)).getBlock() : Block.getBlockFromItem(item));
|
||||
if(item instanceof IPlantable) {
|
||||
IBlockState st = ((IPlantable)item).getPlant(world, pos); // prefer block from getPlant
|
||||
if(st!=null) block = st.getBlock();
|
||||
}
|
||||
if(world.isAirBlock(pos)) {
|
||||
// plant here, block below has to be valid soil.
|
||||
final IBlockState soilstate = world.getBlockState(pos.down());
|
||||
if((block instanceof IPlantable) && (!soilstate.getBlock().canSustainPlant(soilstate, world, pos.down(), EnumFacing.UP, (IPlantable)block))) {
|
||||
// Not the right soil for this plant.
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// adjacent block is the soil, plant above if the soil is valid.
|
||||
final IBlockState soilstate = world.getBlockState(pos);
|
||||
if(soilstate.getBlock() == block) {
|
||||
// The plant is already planted from the case above, it's not the assumed soil but the planted plant.
|
||||
return false;
|
||||
} else if(!world.isAirBlock(pos.up())) {
|
||||
// If this is the soil an air block is needed above, if that is blocked we can't plant.
|
||||
return false;
|
||||
} else if((block instanceof IPlantable) && (!soilstate.getBlock().canSustainPlant(soilstate, world, pos, EnumFacing.UP, (IPlantable)block))) {
|
||||
// Would be space above, but it's not the right soil for the plant.
|
||||
return false;
|
||||
} else {
|
||||
// Ok, plant above.
|
||||
pos = pos.up();
|
||||
}
|
||||
}
|
||||
try {
|
||||
//println("PLANT " + stack + " --> " + block + " at " + pos.subtract(getPos()) + "( item=" + item + ")");
|
||||
final FakePlayer placer = net.minecraftforge.common.util.FakePlayerFactory.getMinecraft((net.minecraft.world.WorldServer)world);
|
||||
if((placer==null) || (!place_item(stack, placer, world, pos, EnumHand.MAIN_HAND, EnumFacing.DOWN, 0.5f, 0f, 0.5f))) return spit_out(facing);
|
||||
stack.shrink(1);
|
||||
stacks_.set(current_slot_index_, stack);
|
||||
return true;
|
||||
} catch(Throwable e) {
|
||||
ModEngineersDecor.logger.error("Exception while trying to plant " + e);
|
||||
world.setBlockToAir(pos);
|
||||
return spit_out(facing);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean try_place(EnumFacing facing)
|
||||
{
|
||||
if(world.isRemote) return false;
|
||||
|
@ -599,84 +690,55 @@ public class BlockDecorPlacer extends BlockDecorDirected
|
|||
current_slot_index_ = next_slot(current_slot_index_);
|
||||
}
|
||||
if(current_stack.isEmpty()) { current_slot_index_ = 0; return false; }
|
||||
boolean no_space = false;
|
||||
final Item item = current_stack.getItem();
|
||||
Block block = (item instanceof IPlantable) ? (((IPlantable)item).getPlant(world, pos).getBlock()) : Block.getBlockFromItem(item);
|
||||
Block block = Block.getBlockFromItem(item);
|
||||
if(((block==Blocks.AIR) || (block==null)) && ((item instanceof ItemBlockSpecial) && (((ItemBlockSpecial)item).getBlock()!=null))) block = ((ItemBlockSpecial)item).getBlock(); // e.g. reeds
|
||||
if(item == null) return false;
|
||||
if((item instanceof IPlantable) || (block instanceof IPlantable)) return try_plant(placement_pos, facing, current_stack, block);
|
||||
if(block == Blocks.AIR) {
|
||||
if(item != null) {
|
||||
return spit_out(facing); // Item not accepted
|
||||
} else {
|
||||
// try next slot
|
||||
}
|
||||
} else if(block instanceof IPlantable) {
|
||||
if(world.isAirBlock(placement_pos)) {
|
||||
// plant here, block below has to be valid soil.
|
||||
IBlockState soilstate = world.getBlockState(placement_pos.down());
|
||||
if(!soilstate.getBlock().canSustainPlant(soilstate, world, pos, EnumFacing.UP, (IPlantable)block)) {
|
||||
block = Blocks.AIR;
|
||||
}
|
||||
} else {
|
||||
// adjacent block is the soil, plant above if the soil is valid.
|
||||
IBlockState soilstate = world.getBlockState(placement_pos);
|
||||
if(soilstate.getBlock() == block) {
|
||||
// The plant is already planted from the case above.
|
||||
block = Blocks.AIR;
|
||||
no_space = true;
|
||||
} else if(!world.isAirBlock(placement_pos.up())) {
|
||||
// If this is the soil an air block is needed above, if that is blocked we can't plant.
|
||||
block = Blocks.AIR;
|
||||
no_space = true;
|
||||
} else if(!soilstate.getBlock().canSustainPlant(soilstate, world, pos, EnumFacing.UP, (IPlantable)block)) {
|
||||
// Would be space above, but it's not the right soil for the plant.
|
||||
block = Blocks.AIR;
|
||||
} else {
|
||||
// Ok, plant above.
|
||||
placement_pos = placement_pos.up();
|
||||
}
|
||||
}
|
||||
} else if(!world.getBlockState(placement_pos).getBlock().isReplaceable(world, placement_pos)) {
|
||||
block = Blocks.AIR;
|
||||
no_space = true;
|
||||
}
|
||||
// System.out.println("PLACE " + current_stack + " --> " + block + " at " + placement_pos.subtract(pos) + "( item=" + item + ")");
|
||||
if(block != Blocks.AIR) {
|
||||
// Check special stuff that is not detected otherwise (like coco, which is technically dye)
|
||||
try {
|
||||
final FakePlayer placer = net.minecraftforge.common.util.FakePlayerFactory.getMinecraft((net.minecraft.world.WorldServer)world);
|
||||
final IBlockState placement_state = (placer==null) ? (block.getDefaultState()) : (block.getStateForPlacement(world, placement_pos, EnumFacing.DOWN,0.5f,0.5f,0f, 0, placer, EnumHand.MAIN_HAND));
|
||||
if(placement_state == null) {
|
||||
return spit_out(facing);
|
||||
} else if(item instanceof ItemBlock) {
|
||||
ItemStack placement_stack = current_stack.copy();
|
||||
placement_stack.setCount(1);
|
||||
((ItemBlock)item).placeBlockAt(placement_stack, placer, world, placement_pos, EnumFacing.DOWN, 0.5f,0.5f,0f, placement_state);
|
||||
SoundType stype = block.getSoundType(placement_state, world, pos, null);
|
||||
if(stype != null) world.playSound(null, placement_pos, stype.getPlaceSound(), SoundCategory.BLOCKS, stype.getVolume()*0.6f, stype.getPitch());
|
||||
} else {
|
||||
if(world.setBlockState(placement_pos, placement_state, 1|2|8)) {
|
||||
SoundType stype = block.getSoundType(placement_state, world, pos, null);
|
||||
if(stype != null) world.playSound(null, placement_pos, stype.getPlaceSound(), SoundCategory.BLOCKS, stype.getVolume()*0.6f, stype.getPitch());
|
||||
for(Entry<ItemStack,SpecialPlacementFunction> e:special_placement_conversions.entrySet()) {
|
||||
if(e.getKey().isItemEqual(current_stack)) {
|
||||
ItemStack placement_stack = current_stack.copy();
|
||||
placement_stack.setCount(1);
|
||||
switch(e.getValue().apply(current_stack, world, placement_pos)) {
|
||||
case PASS:
|
||||
return false;
|
||||
case SUCCESS:
|
||||
current_stack.shrink(1);
|
||||
stacks_.set(current_slot_index_, current_stack);
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
current_stack.shrink(1);
|
||||
stacks_.set(current_slot_index_, current_stack);
|
||||
return true;
|
||||
} catch(Throwable e) {
|
||||
// The block really needs a player or other issues happened during placement.
|
||||
// A hard crash should not be fired here, instead spit out the item to indicated that this
|
||||
// block is not compatible.
|
||||
System.out.println("Exception while trying to place " + e);
|
||||
ModEngineersDecor.logger.error("Exception while trying to place " + e);
|
||||
world.setBlockToAir(placement_pos);
|
||||
return spit_out(facing);
|
||||
}
|
||||
return spit_out(facing);
|
||||
}
|
||||
if((!no_space) && (!current_stack.isEmpty())) {
|
||||
// There is space, but the current plant cannot be planted there, so try next.
|
||||
for(int i=0; i<NUM_OF_SLOTS; ++i) {
|
||||
current_slot_index_ = next_slot(current_slot_index_);
|
||||
if(!stacks_.get(current_slot_index_).isEmpty()) break;
|
||||
}
|
||||
if(world.getEntitiesWithinAABB(EntityLivingBase.class, new AxisAlignedBB(placement_pos)).size() > 0) return false;
|
||||
if(!world.getBlockState(placement_pos).getBlock().isReplaceable(world, placement_pos)) return false;
|
||||
try {
|
||||
final FakePlayer placer = net.minecraftforge.common.util.FakePlayerFactory.getMinecraft((net.minecraft.world.WorldServer)world);
|
||||
//println("PLACE ITEMBLOCK" + current_stack + " --> " + block + " at " + placement_pos.subtract(pos) + "( item=" + item + ")");
|
||||
ItemStack placement_stack = current_stack.copy();
|
||||
placement_stack.setCount(1);
|
||||
if((placer==null) || (!place_item(placement_stack, placer, world, placement_pos, EnumHand.MAIN_HAND, EnumFacing.DOWN, 0.6f, 0f, 0.5f))) return false;
|
||||
current_stack.shrink(1);
|
||||
stacks_.set(current_slot_index_, current_stack);
|
||||
} catch(Throwable e) {
|
||||
// The block really needs a player or other issues happened during placement.
|
||||
// A hard crash should not be fired here, instead spit out the item to indicated that this
|
||||
// block is not compatible.
|
||||
ModEngineersDecor.logger.error("Exception while trying to place " + e);
|
||||
world.setBlockToAir(placement_pos);
|
||||
return spit_out(facing);
|
||||
}
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -701,7 +763,13 @@ public class BlockDecorPlacer extends BlockDecorDirected
|
|||
if(block_power_updated_) dirty = true;
|
||||
}
|
||||
// Placing
|
||||
if(trigger && try_place(placer_facing)) dirty = true;
|
||||
if(trigger) {
|
||||
if(try_place(placer_facing)) {
|
||||
dirty = true;
|
||||
} else {
|
||||
current_slot_index_ = next_slot(current_slot_index_);
|
||||
}
|
||||
}
|
||||
if(dirty) markDirty();
|
||||
if(trigger && (tick_timer_ > TICK_INTERVAL)) tick_timer_ = TICK_INTERVAL;
|
||||
}
|
||||
|
|
|
@ -99,7 +99,7 @@ public class BlockDecorSolarPanel extends BlockDecor
|
|||
|
||||
public static class BTileEntity extends TileEntity implements ITickable
|
||||
{
|
||||
public static final int DEFAULT_PEAK_POWER = 45;
|
||||
public static final int DEFAULT_PEAK_POWER = 32;
|
||||
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 };
|
||||
|
|
|
@ -8,20 +8,25 @@
|
|||
*/
|
||||
package wile.engineersdecor.blocks;
|
||||
|
||||
|
||||
|
||||
import wile.engineersdecor.detail.ModAuxiliaries;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.entity.passive.EntityCow;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.ITickable;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.SoundType;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
|
||||
public class BlockDecorTest extends BlockDecorDirected implements ModAuxiliaries.IExperimentalFeature
|
||||
|
@ -54,9 +59,8 @@ public class BlockDecorTest extends BlockDecorDirected implements ModAuxiliaries
|
|||
|
||||
public static class BTileEntity extends TileEntity implements ITickable
|
||||
{
|
||||
public static double increment = 0.008;
|
||||
private double progress_ = 0;
|
||||
private double incr_ = increment;
|
||||
private static int tick_interval_ = 40;
|
||||
private int tick_timer_ = 0;
|
||||
|
||||
public BTileEntity()
|
||||
{}
|
||||
|
@ -65,29 +69,45 @@ public class BlockDecorTest extends BlockDecorDirected implements ModAuxiliaries
|
|||
public boolean shouldRefresh(World world, BlockPos pos, IBlockState os, IBlockState ns)
|
||||
{ return (os.getBlock() != ns.getBlock()) || (!(ns.getBlock() instanceof BlockDecorTest)); }
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static double increment = 0.008;
|
||||
private boolean TESR_TEST = false;
|
||||
private double progress_ = -1;
|
||||
private double incr_ = increment;
|
||||
public double progress() { return progress_; }
|
||||
private void tesr_basic_test(boolean reset)
|
||||
{
|
||||
if(!TESR_TEST || !world.isRemote) return;
|
||||
if(reset) {
|
||||
progress_ = 0; incr_ = increment;
|
||||
} else {
|
||||
progress_ += incr_;
|
||||
if(progress_ < 0) {
|
||||
incr_ = increment;
|
||||
progress_ = 0;
|
||||
} else if(progress_ > 1.0) {
|
||||
progress_ = 1.0;
|
||||
incr_ = -increment;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public double progress()
|
||||
{ return progress_; }
|
||||
//------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public boolean clicked(EntityPlayer player, boolean lclicked)
|
||||
{
|
||||
progress_ = 0;
|
||||
incr_ = increment;
|
||||
tesr_basic_test(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update()
|
||||
{
|
||||
progress_ += incr_;
|
||||
if(progress_ < 0) {
|
||||
incr_ = increment;
|
||||
progress_ = 0;
|
||||
} else if(progress_ > 1.0) {
|
||||
progress_ = 1.0;
|
||||
incr_ = -increment;
|
||||
}
|
||||
tesr_basic_test(false);
|
||||
if(++tick_timer_ < tick_interval_) return;
|
||||
tick_timer_ = tick_interval_;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -96,18 +96,22 @@ public class BlockDecorTreeCutter extends BlockDecorDirectedHorizontal
|
|||
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.
|
||||
public static final int DEFAULT_CUTTING_TIME_NEEDED = 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 static int cutting_time_needed = 20 * DEFAULT_CUTTING_TIME_NEEDED;
|
||||
private static boolean requires_power = false;
|
||||
|
||||
private int tick_timer_;
|
||||
private int active_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)
|
||||
public static void on_config(int boost_energy_per_tick, int cutting_time_seconds, boolean power_required)
|
||||
{
|
||||
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");
|
||||
cutting_time_needed = 20 * MathHelper.clamp(cutting_time_seconds, 10, 240);
|
||||
requires_power = power_required;
|
||||
ModEngineersDecor.logger.info("Config tree cutter: Boost energy consumption:" + boost_energy_consumption + "rf/t" + (requires_power?" (power required for operation) ":"") + ", cutting time " + cutting_time_needed + "t." );
|
||||
}
|
||||
|
||||
public BTileEntity()
|
||||
|
@ -188,15 +192,24 @@ public class BlockDecorTreeCutter extends BlockDecorDirectedHorizontal
|
|||
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;
|
||||
active_timer_ = 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(boost_energy_ >= boost_energy_consumption) {
|
||||
boost_energy_ = 0;
|
||||
proc_time_elapsed_ += TICK_INTERVAL*BOOST_FACTOR;
|
||||
active_timer_ = 2;
|
||||
} else if(!requires_power) {
|
||||
active_timer_ = 1024;
|
||||
} else if(active_timer_ > 0) {
|
||||
--active_timer_;
|
||||
}
|
||||
boolean active = (active_timer_ > 0);
|
||||
if(proc_time_elapsed_ >= cutting_time_needed) {
|
||||
proc_time_elapsed_ = 0;
|
||||
TreeCutting.chopTree(world, tree_state, tree_pos, 512, false);
|
||||
TreeCutting.chopTree(world, tree_state, tree_pos, 2048, false);
|
||||
world.playSound(null, pos.getX(), pos.getY(), pos.getZ(), SoundEvents.BLOCK_WOOD_BREAK, SoundCategory.BLOCKS, 1.0f, 1.0f);
|
||||
active = false;
|
||||
}
|
||||
|
|
|
@ -16,6 +16,9 @@ public class ExtItems
|
|||
@GameRegistry.ObjectHolder("immersiveengineering:metal_device1")
|
||||
public static final Item IE_EXTERNAL_HEATER = null;
|
||||
|
||||
@GameRegistry.ObjectHolder("bottledmilk:milk_bottle_drinkable")
|
||||
public static final Item BOTTLED_MILK_BOTTLE_DRINKLABLE = null;
|
||||
|
||||
public static final void onPostInit()
|
||||
{}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,70 @@
|
|||
package wile.engineersdecor.detail;
|
||||
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.inventory.ISidedInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
import net.minecraftforge.items.wrapper.InvWrapper;
|
||||
import net.minecraftforge.items.wrapper.SidedInvWrapper;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
|
||||
public class ItemHandling
|
||||
{
|
||||
|
||||
public static IItemHandler itemhandler(World world, BlockPos pos, @Nullable EnumFacing side)
|
||||
{
|
||||
TileEntity te = world.getTileEntity(pos);
|
||||
if(te==null) return null;
|
||||
if(te.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side)) return (IItemHandler)te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side);
|
||||
if((side!=null) && (te instanceof ISidedInventory)) return new SidedInvWrapper((ISidedInventory)te, side);
|
||||
if(te instanceof IInventory) return new InvWrapper((IInventory)te);
|
||||
return null;
|
||||
}
|
||||
|
||||
public static ItemStack insert(IItemHandler inventory, ItemStack stack , boolean simulate)
|
||||
{ return ItemHandlerHelper.insertItemStacked(inventory, stack, simulate); }
|
||||
|
||||
public static ItemStack insert(TileEntity te, @Nullable EnumFacing side, ItemStack stack, boolean simulate)
|
||||
{
|
||||
if(te==null) return stack;
|
||||
IItemHandler hnd = null;
|
||||
if(te.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side)) {
|
||||
hnd = (IItemHandler)te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side);
|
||||
} else if((side!=null) && (te instanceof ISidedInventory)) {
|
||||
hnd = new SidedInvWrapper((ISidedInventory)te, side);
|
||||
} else if(te instanceof IInventory) {
|
||||
hnd = new InvWrapper((IInventory)te);
|
||||
}
|
||||
return (hnd==null) ? stack : ItemHandlerHelper.insertItemStacked(hnd, stack, simulate);
|
||||
}
|
||||
|
||||
public static ItemStack extract(IItemHandler inventory, @Nullable ItemStack match, int amount, boolean simulate)
|
||||
{
|
||||
if((inventory==null) || (amount<=0)) return ItemStack.EMPTY;
|
||||
final int max = inventory.getSlots();
|
||||
ItemStack out_stack = ItemStack.EMPTY;
|
||||
for(int i=0; i<max; ++i) {
|
||||
final ItemStack stack = inventory.getStackInSlot(i);
|
||||
if(stack.isEmpty()) continue;
|
||||
if(out_stack.isEmpty()) {
|
||||
if((match!=null) && (!stack.isItemEqual(match))) continue;
|
||||
out_stack = inventory.extractItem(i, amount, simulate);
|
||||
} else if(stack.isItemEqual(out_stack)) {
|
||||
ItemStack es = inventory.extractItem(i, (amount-out_stack.getCount()), simulate);
|
||||
out_stack.grow(es.getCount());
|
||||
}
|
||||
if(out_stack.getCount() >= amount) break;
|
||||
}
|
||||
return out_stack;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -48,10 +48,27 @@ public class ModAuxiliaries
|
|||
final String ft = tr.getFormattedText();
|
||||
if(ft.contains("${")) {
|
||||
// Non-recursive, non-argument lang file entry cross referencing.
|
||||
Pattern pt = Pattern.compile("\\$\\{([\\w\\.]+)\\}");
|
||||
Pattern pt = Pattern.compile("\\$\\{([^}]+)\\}");
|
||||
Matcher mt = pt.matcher(ft);
|
||||
StringBuffer sb = new StringBuffer();
|
||||
while(mt.find()) mt.appendReplacement(sb, (new TextComponentTranslation(mt.group(1))).getFormattedText().trim());
|
||||
while(mt.find()) {
|
||||
String m = mt.group(1);
|
||||
if(m.contains("?")) {
|
||||
String[] kv = m.split("\\?", 2);
|
||||
String key = kv[0].trim();
|
||||
boolean not = key.startsWith("!");
|
||||
if(not) key = key.replaceFirst("!", "");
|
||||
m = kv[1].trim();
|
||||
if(!ModConfig.getServerConfig().hasKey(key)) {
|
||||
m = "";
|
||||
} else {
|
||||
boolean r = ModConfig.getServerConfig().getBoolean(key);
|
||||
if(not) r = !r;
|
||||
if(!r) m = "";
|
||||
}
|
||||
}
|
||||
mt.appendReplacement(sb, (new TextComponentTranslation(m)).getFormattedText().trim());
|
||||
}
|
||||
mt.appendTail(sb);
|
||||
return sb.toString();
|
||||
} else {
|
||||
|
|
|
@ -12,14 +12,17 @@ package wile.engineersdecor.detail;
|
|||
import wile.engineersdecor.ModContent;
|
||||
import wile.engineersdecor.ModEngineersDecor;
|
||||
import wile.engineersdecor.blocks.*;
|
||||
import net.minecraftforge.common.config.Config;
|
||||
import net.minecraftforge.common.config.ConfigManager;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraftforge.common.config.Config;
|
||||
import net.minecraftforge.common.config.ConfigManager;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.client.event.ConfigChangedEvent;
|
||||
import wile.engineersdecor.blocks.BlockDecorMilker.BTileEntity;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
@ -52,6 +55,14 @@ public class ModConfig
|
|||
@Config.RequiresMcRestart
|
||||
public String includes = "";
|
||||
|
||||
@Config.Comment({"Disable CTRL-SHIFT item tooltip display."})
|
||||
@Config.Name("Without tooltips")
|
||||
public boolean without_tooltips = false;
|
||||
|
||||
@Config.Comment({"Disable all tile entity special renderers."})
|
||||
@Config.Name("Without TESRs")
|
||||
public boolean without_tesrs = false;
|
||||
|
||||
@Config.Comment({"Disable clinker bricks and derived blocks."})
|
||||
@Config.Name("Without clinker bricks")
|
||||
@Config.RequiresMcRestart
|
||||
|
@ -87,20 +98,10 @@ public class ModConfig
|
|||
@Config.RequiresMcRestart
|
||||
public boolean without_panzer_glass = false;
|
||||
|
||||
@Config.Comment({"Disable treated wood crafting table."})
|
||||
@Config.Name("Without crafting table")
|
||||
@Config.Comment({"Disable ladders"})
|
||||
@Config.Name("Without ladders")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_crafting_table = false;
|
||||
|
||||
@Config.Comment({"Disable small lab furnace."})
|
||||
@Config.Name("Without lab furnace")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_lab_furnace = false;
|
||||
|
||||
@Config.Comment({"Disable small electrical pass-through furnace."})
|
||||
@Config.Name("Without electrical furnace")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_electrical_furnace = false;
|
||||
public boolean without_ladders = false;
|
||||
|
||||
@Config.Comment({"Disable treated wood table, stool, windowsill, etc."})
|
||||
@Config.Name("Without tr. wood furniture")
|
||||
|
@ -117,26 +118,50 @@ public class ModConfig
|
|||
@Config.RequiresMcRestart
|
||||
public boolean without_light_sources = false;
|
||||
|
||||
@Config.Comment({"Disable ladders"})
|
||||
@Config.Name("Without ladders")
|
||||
@Config.Comment({"Disable horizontal half-block slab."})
|
||||
@Config.Name("Without slabs")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_ladders = false;
|
||||
public boolean without_slabs = false;
|
||||
|
||||
@Config.Comment({"Disable possibility to sit on stools and chairs."})
|
||||
@Config.Name("Without chair sitting")
|
||||
public boolean without_chair_sitting = false;
|
||||
@Config.Comment({"Disable stackable 1/8 block slices."})
|
||||
@Config.Name("Without slab slices")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_halfslabs = false;
|
||||
|
||||
@Config.Comment({"Disable that mobs will sit on chairs and stools."})
|
||||
@Config.Name("Without chair mob sitting")
|
||||
public boolean without_mob_chair_sitting = false;
|
||||
@Config.Comment({"Disable poles of any material."})
|
||||
@Config.Name("Without poles")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_poles = false;
|
||||
|
||||
@Config.Comment({"Disable the speed boost of ladders in this mod."})
|
||||
@Config.Name("Without ladder speed boost")
|
||||
public boolean without_ladder_speed_boost = false;
|
||||
@Config.Comment({"Disable horizontal supports like the double-T support."})
|
||||
@Config.Name("Without h. supports")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_hsupports = false;
|
||||
|
||||
@Config.Comment({"Disable history refabrication feature of the treated wood crafting table."})
|
||||
@Config.Name("Without crafting table history")
|
||||
public boolean without_crafting_table_history = false;
|
||||
@Config.Comment({"Disable decorative sign plates (caution, hazards, etc)."})
|
||||
@Config.Name("Without signs")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_sign_plates = false;
|
||||
|
||||
@Config.Comment({"Disable the Floor Grating."})
|
||||
@Config.Name("Without floor gratings")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_floor_grating = false;
|
||||
|
||||
@Config.Comment({"Disable treated wood crafting table."})
|
||||
@Config.Name("Without crafting table")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_crafting_table = false;
|
||||
|
||||
@Config.Comment({"Disable small lab furnace."})
|
||||
@Config.Name("Without lab furnace")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_lab_furnace = false;
|
||||
|
||||
@Config.Comment({"Disable small electrical pass-through furnace."})
|
||||
@Config.Name("Without electrical furnace")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_electrical_furnace = false;
|
||||
|
||||
@Config.Comment({"Disable check valve, and redstone controlled valves."})
|
||||
@Config.Name("Without valves")
|
||||
|
@ -153,11 +178,6 @@ public class ModConfig
|
|||
@Config.RequiresMcRestart
|
||||
public boolean without_waste_incinerator = false;
|
||||
|
||||
@Config.Comment({"Disable decorative sign plates (caution, hazards, etc)."})
|
||||
@Config.Name("Without signs")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_sign_plates = false;
|
||||
|
||||
@Config.Comment({"Disable the factory dropper."})
|
||||
@Config.Name("Without factory dropper")
|
||||
@Config.RequiresMcRestart
|
||||
|
@ -169,42 +189,54 @@ public class ModConfig
|
|||
public boolean without_factory_hopper = false;
|
||||
|
||||
@Config.Comment({"Disable the Factory Block Placer."})
|
||||
@Config.Name("Without factory placer")
|
||||
@Config.Name("Without block placer")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_factory_placer = false;
|
||||
|
||||
@Config.Comment({"Disable horizontal half-block slab."})
|
||||
@Config.Name("Without slabs")
|
||||
@Config.Comment({"Disable the Small Block Breaker."})
|
||||
@Config.Name("Without block breaker")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_slabs = false;
|
||||
public boolean without_block_breaker = false;
|
||||
|
||||
@Config.Comment({"Disable stackable 1/8 block slices."})
|
||||
@Config.Name("Without slab slices")
|
||||
@Config.Comment({"Disable the Small Solar Panel."})
|
||||
@Config.Name("Without solar panel")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_halfslabs = false;
|
||||
public boolean without_solar_panel = false;
|
||||
|
||||
@Config.Comment({"Disable directly picking up layers from slabs and slab " +
|
||||
"slices by left clicking while looking up/down."})
|
||||
@Config.Comment({"Disable the Small Fluid Collection Funnel."})
|
||||
@Config.Name("Without fluid collector")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_fluid_funnel = false;
|
||||
|
||||
@Config.Comment({"Disable the Small Mineral Smelter."})
|
||||
@Config.Name("Without mineral smelter")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_mineral_smelter = false;
|
||||
|
||||
@Config.Comment({"Disable the Small Mikling Machine."})
|
||||
@Config.Name("Without milking machine")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_milker = false;
|
||||
|
||||
@Config.Comment({"Disable directly picking up layers from slabs and slab slices by left clicking while looking up/down."})
|
||||
@Config.Name("Without slab pickup")
|
||||
public boolean without_direct_slab_pickup = false;
|
||||
|
||||
@Config.Comment({"Disable poles of any material."})
|
||||
@Config.Name("Without poles")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_poles = false;
|
||||
@Config.Comment({"Disable possibility to sit on stools and chairs."})
|
||||
@Config.Name("Without chair sitting")
|
||||
public boolean without_chair_sitting = false;
|
||||
|
||||
@Config.Comment({"Disable horizontal supports like the double-T support."})
|
||||
@Config.Name("Without h. supports")
|
||||
@Config.RequiresMcRestart
|
||||
public boolean without_hsupports = false;
|
||||
@Config.Comment({"Disable that mobs will sit on chairs and stools."})
|
||||
@Config.Name("Without chair mob sitting")
|
||||
public boolean without_mob_chair_sitting = false;
|
||||
|
||||
@Config.Comment({"Disable CTRL-SHIFT item tooltip display."})
|
||||
@Config.Name("Without tooltips")
|
||||
public boolean without_tooltips = false;
|
||||
@Config.Comment({"Disable the speed boost of ladders in this mod."})
|
||||
@Config.Name("Without ladder speed boost")
|
||||
public boolean without_ladder_speed_boost = false;
|
||||
|
||||
@Config.Comment({"Disable all tile entity special renderers."})
|
||||
@Config.Name("Without TESRs")
|
||||
public boolean without_tesrs = false;
|
||||
@Config.Comment({"Disable history refabrication feature of the treated wood crafting table."})
|
||||
@Config.Name("Without crafting table history")
|
||||
public boolean without_crafting_table_history = false;
|
||||
}
|
||||
|
||||
@Config.Comment({
|
||||
|
@ -346,6 +378,73 @@ public class ModConfig
|
|||
@Config.Name("Solar panel: Peak power")
|
||||
@Config.RangeInt(min=5, max=128)
|
||||
public int solar_panel_peak_power = BlockDecorSolarPanel.BTileEntity.DEFAULT_PEAK_POWER;
|
||||
|
||||
@Config.Comment({
|
||||
"Defines how much RF power the Small Block Breaker requires to magnificently increase the processing speed. " +
|
||||
"The config value can be changed on-the-fly for tuning."
|
||||
})
|
||||
@Config.Name("Block Breaker: Power consumption")
|
||||
@Config.RangeInt(min=16, max=512)
|
||||
public int block_breaker_power_consumption = BlockDecorBreaker.BTileEntity.DEFAULT_BOOST_ENERGY;
|
||||
|
||||
@Config.Comment({
|
||||
"Defines how much time the Small Block Breaker needs per block hardness, " +
|
||||
"means: 'reluctance' * hardness + min_time, you change the 'reluctance' here." +
|
||||
"The unit is ticks/hardness. " +
|
||||
"The config value can be changed on-the-fly for tuning."
|
||||
})
|
||||
@Config.Name("Block Breaker: Breaking reluctance")
|
||||
@Config.RangeInt(min=5, max=50)
|
||||
public int block_breaker_reluctance = BlockDecorBreaker.BTileEntity.DEFAULT_BREAKING_RELUCTANCE;
|
||||
|
||||
@Config.Comment({
|
||||
"Defines how much time the Small Block Breaker needs at least, better said it's an offset: " +
|
||||
"'reluctance' * hardness + min_time, you change the 'min_time' here, value " +
|
||||
"in ticks." +
|
||||
"The config value can be changed on-the-fly for tuning."
|
||||
})
|
||||
@Config.Name("Block Breaker: Min breaking time")
|
||||
@Config.RangeInt(min=10, max=100)
|
||||
public int block_breaker_min_breaking_time = BlockDecorBreaker.BTileEntity.DEFAULT_MIN_BREAKING_TIME;
|
||||
|
||||
@Config.Comment({
|
||||
"Defines if the Small Block Breaker does not work without RF power."
|
||||
})
|
||||
@Config.Name("Block Breaker: Power required")
|
||||
public boolean block_breaker_requires_power = false;
|
||||
|
||||
@Config.Comment({
|
||||
"Defines how much RF power the Small Tree Cutter requires to magnificently increase the processing speed. " +
|
||||
"The config value can be changed on-the-fly for tuning."
|
||||
})
|
||||
@Config.Name("Tree Cutter: Power consumption")
|
||||
@Config.RangeInt(min=16, max=512)
|
||||
public int tree_cuttter_energy_consumption = BlockDecorTreeCutter.BTileEntity.DEFAULT_BOOST_ENERGY;
|
||||
|
||||
@Config.Comment({
|
||||
"Defines how much time the Small Tree Cutter needs to cut a tree without RF power. " +
|
||||
"The value is in seconds. With energy it is 6 times faster. " +
|
||||
"The config value can be changed on-the-fly for tuning."
|
||||
})
|
||||
@Config.Name("Tree Cutter: Cutting time")
|
||||
@Config.RangeInt(min=10, max=240)
|
||||
public int tree_cuttter_cutting_time_needed = BlockDecorTreeCutter.BTileEntity.DEFAULT_CUTTING_TIME_NEEDED;
|
||||
|
||||
@Config.Comment({
|
||||
"Defines if the Small Tree Cutter does not work without RF power."
|
||||
})
|
||||
@Config.Name("Tree Cutter: Power required")
|
||||
public boolean tree_cuttter_requires_power = false;
|
||||
|
||||
@Config.Comment({
|
||||
"Defines how much RF power the milking machine needs to work. Note this is a permanent " +
|
||||
"standby consumption (not only when the machine does something). If zero, the machine " +
|
||||
"does not need power at all to function." +
|
||||
"The config value can be changed on-the-fly for tuning."
|
||||
})
|
||||
@Config.Name("Milker: Power consumption")
|
||||
@Config.RangeInt(min=0, max=128)
|
||||
public int milker_energy_consumption = BTileEntity.DEFAULT_ENERGY_CONSUMPTION;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
|
@ -362,14 +461,21 @@ public class ModConfig
|
|||
|
||||
@SuppressWarnings("unused")
|
||||
public static final void onPreInit()
|
||||
{ apply(); }
|
||||
{ startup_apply(); }
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public static final void onPostInit(FMLPostInitializationEvent event)
|
||||
{ for(Block e: ModContent.getRegisteredBlocks()) ModConfig.isOptedOut(e, true); }
|
||||
{
|
||||
for(Block e: ModContent.getRegisteredBlocks()) ModConfig.isOptedOut(e, true);
|
||||
apply();
|
||||
}
|
||||
|
||||
private static final ArrayList<String> includes_ = new ArrayList<String>();
|
||||
private static final ArrayList<String> excludes_ = new ArrayList<String>();
|
||||
private static final NBTTagCompound server_config_ = new NBTTagCompound();
|
||||
|
||||
public static final NBTTagCompound getServerConfig() // config that may be synchronized from server to client via net pkg.
|
||||
{ return server_config_; }
|
||||
|
||||
public static final boolean isWithoutOptOutRegistration()
|
||||
{ return (zmisc!=null) && (zmisc.without_optout_registration); }
|
||||
|
@ -409,6 +515,11 @@ public class ModConfig
|
|||
excludes_.clear();
|
||||
}
|
||||
// Early non-opt out type based evaluation
|
||||
if(block instanceof BlockDecorHalfSlab) return optout.without_halfslabs;
|
||||
if(block instanceof BlockDecorLadder) return optout.without_ladders;
|
||||
if(block instanceof BlockDecorWindow) return optout.without_windows;
|
||||
if(block instanceof BlockDecorHorizontalSupport) return optout.without_hsupports;
|
||||
if(block instanceof BlockDecorFloorGrating) return optout.without_floor_grating;
|
||||
if(block instanceof BlockDecorCraftingTable) return optout.without_crafting_table;
|
||||
if(block instanceof BlockDecorFurnaceElectrical) return optout.without_electrical_furnace;
|
||||
if((block instanceof BlockDecorFurnace) && (!(block instanceof BlockDecorFurnaceElectrical))) return optout.without_lab_furnace;
|
||||
|
@ -417,11 +528,13 @@ public class ModConfig
|
|||
if(block instanceof BlockDecorDropper) return optout.without_factory_dropper;
|
||||
if(block instanceof BlockDecorHopper) return optout.without_factory_hopper;
|
||||
if(block instanceof BlockDecorPlacer) return optout.without_factory_placer;
|
||||
if(block instanceof BlockDecorHalfSlab) return optout.without_halfslabs;
|
||||
if(block instanceof BlockDecorLadder) return optout.without_ladders;
|
||||
if(block instanceof BlockDecorWindow) return optout.without_windows;
|
||||
if(block instanceof BlockDecorBreaker) return optout.without_block_breaker;
|
||||
if(block instanceof BlockDecorSolarPanel) return optout.without_solar_panel;
|
||||
if(block instanceof BlockDecorFluidFunnel) return optout.without_fluid_funnel;
|
||||
if(block instanceof BlockDecorMineralSmelter) return optout.without_mineral_smelter;
|
||||
if(block instanceof BlockDecorMilker) return optout.without_milker;
|
||||
if(block instanceof BlockDecorPipeValve) return optout.without_valves;
|
||||
if(block instanceof BlockDecorHorizontalSupport) return optout.without_hsupports;
|
||||
|
||||
// Type based evaluation where later filters may match, too
|
||||
if(optout.without_slabs && (block instanceof BlockDecorSlab)) return true;
|
||||
if(optout.without_stairs && (block instanceof BlockDecorStairs)) return true;
|
||||
|
@ -450,17 +563,10 @@ public class ModConfig
|
|||
return false;
|
||||
}
|
||||
|
||||
public static final void apply()
|
||||
public static final void startup_apply()
|
||||
{
|
||||
BlockDecorFurnace.BTileEntity.on_config(tweaks.furnace_smelting_speed_percent, tweaks.furnace_fuel_efficiency_percent, tweaks.furnace_boost_energy_consumption);
|
||||
ModRecipes.furnaceRecipeOverrideReset();
|
||||
if(tweaks.furnace_smelts_nuggets) ModRecipes.furnaceRecipeOverrideSmeltsOresToNuggets();
|
||||
BlockDecorChair.on_config(optout.without_chair_sitting, optout.without_mob_chair_sitting, tweaks.chair_mob_sitting_probability_percent, tweaks.chair_mob_standup_probability_percent);
|
||||
BlockDecorLadder.on_config(optout.without_ladder_speed_boost);
|
||||
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 + "'");
|
||||
|
@ -483,4 +589,24 @@ public class ModConfig
|
|||
}
|
||||
}
|
||||
|
||||
public static final void apply()
|
||||
{
|
||||
BlockDecorFurnace.BTileEntity.on_config(tweaks.furnace_smelting_speed_percent, tweaks.furnace_fuel_efficiency_percent, tweaks.furnace_boost_energy_consumption);
|
||||
BlockDecorChair.on_config(optout.without_chair_sitting, optout.without_mob_chair_sitting, tweaks.chair_mob_sitting_probability_percent, tweaks.chair_mob_standup_probability_percent);
|
||||
BlockDecorLadder.on_config(optout.without_ladder_speed_boost);
|
||||
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);
|
||||
BlockDecorBreaker.BTileEntity.on_config(tweaks.block_breaker_power_consumption, tweaks.block_breaker_reluctance, tweaks.block_breaker_min_breaking_time, tweaks.block_breaker_requires_power);
|
||||
BlockDecorTreeCutter.BTileEntity.on_config(tweaks.tree_cuttter_energy_consumption, tweaks.tree_cuttter_cutting_time_needed, tweaks.tree_cuttter_requires_power);
|
||||
BlockDecorMilker.BTileEntity.on_config(tweaks.milker_energy_consumption);
|
||||
BlockDecorPlacer.BTileEntity.on_config();
|
||||
{
|
||||
// Check if the config is already synchronized or has to be synchronised.
|
||||
server_config_.setBoolean("tree_cuttter_requires_power", tweaks.tree_cuttter_requires_power);
|
||||
server_config_.setBoolean("block_breaker_requires_power", tweaks.block_breaker_requires_power);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -97,6 +97,7 @@ public class ModTesrs
|
|||
@Override
|
||||
public void render(final BlockDecorTest.BTileEntity te, double x, double y, double z, final float partialTicks, final int destroyStage, final float alpha)
|
||||
{
|
||||
if(te.progress() < 0) return;
|
||||
renderBlockState(Blocks.SANDSTONE.getDefaultState(), te.getPos(), (new Vec3d(1,1,1)).scale(te.progress()), x,y,z);
|
||||
}
|
||||
|
||||
|
|
|
@ -138,7 +138,7 @@ public class TreeCutting
|
|||
final int dx = Math.abs(pos.getX()-start.getX());
|
||||
final int dz = Math.abs(pos.getZ()-start.getZ());
|
||||
if(dy > max_cutting_radius) dy = max_cutting_radius;
|
||||
if((dx >= dy+3) || (dz >= dy+3)) return true;
|
||||
if((dx >= dy+4) || (dz >= dy+4)) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -152,60 +152,61 @@ public class TreeCutting
|
|||
{
|
||||
if((Compat.canChop(broken_state))) return Compat.chop(world, broken_state, startPos, max_blocks_to_break, 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 = max_log_tracing_steps;
|
||||
IBlockState tracked_leaves_state = null;
|
||||
while(!queue.isEmpty() && (--steps_left >= 0)) {
|
||||
while(!queue.isEmpty() && (--steps_left >= 0) && (to_break.size()<max_blocks_to_break)) {
|
||||
final BlockPos pos = queue.removeFirst();
|
||||
if(checked.contains(pos)) continue;
|
||||
checked.add(pos);
|
||||
if(too_far(startPos, pos)) continue;
|
||||
// Vertical search
|
||||
final BlockPos uppos = pos.up();
|
||||
if(too_far(startPos, uppos)) { checked.add(uppos); continue; }
|
||||
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 = max_log_tracing_steps;
|
||||
} else {
|
||||
boolean isleaf = BlockCategories.isLeaves(upstate);
|
||||
if(isleaf || world.isAirBlock(uppos) || (upstate.getBlock() instanceof BlockVine)) {
|
||||
if(isleaf) {
|
||||
if(tracked_leaves_state==null) {
|
||||
tracked_leaves_state=upstate;
|
||||
to_decay.add(uppos);
|
||||
} else if(BlockCategories.isSameLeaves(upstate, tracked_leaves_state)) {
|
||||
to_decay.add(uppos);
|
||||
}
|
||||
if(BlockCategories.isSameLog(upstate, broken_state)) {
|
||||
queue.add(uppos);
|
||||
to_break.add(uppos);
|
||||
steps_left = max_log_tracing_steps;
|
||||
} else {
|
||||
boolean isleaf = BlockCategories.isLeaves(upstate);
|
||||
if(isleaf || world.isAirBlock(uppos) || (upstate.getBlock() instanceof BlockVine)) {
|
||||
if(isleaf) {
|
||||
if(tracked_leaves_state==null) {
|
||||
tracked_leaves_state=upstate;
|
||||
to_decay.add(uppos);
|
||||
queue.add(uppos);
|
||||
} else if(BlockCategories.isSameLeaves(upstate, tracked_leaves_state)) {
|
||||
to_decay.add(uppos);
|
||||
queue.add(uppos);
|
||||
} else {
|
||||
checked.add(uppos); // no block of interest
|
||||
}
|
||||
// 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)) {
|
||||
if((tracked_leaves_state==null) || (BlockCategories.isSameLeaves(st, tracked_leaves_state))) {
|
||||
to_decay.add(p);
|
||||
}
|
||||
} else {
|
||||
checked.add(uppos);
|
||||
}
|
||||
// Up is air, check adjacent for diagonal up (e.g. Accacia)
|
||||
for(Vec3i v:hoffsets) {
|
||||
final BlockPos p = uppos.add(v);
|
||||
final IBlockState st = world.getBlockState(p);
|
||||
if(BlockCategories.isSameLog(st, broken_state)) {
|
||||
queue.add(p);
|
||||
to_break.add(p);
|
||||
} else if(BlockCategories.isLeaves(st)) {
|
||||
if(tracked_leaves_state==null) {
|
||||
tracked_leaves_state=st;
|
||||
to_decay.add(p);
|
||||
} else if(BlockCategories.isSameLeaves(st, tracked_leaves_state)) {
|
||||
to_decay.add(p);
|
||||
} else {
|
||||
checked.add(uppos);
|
||||
}
|
||||
} else {
|
||||
checked.add(uppos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -214,63 +215,63 @@ public class TreeCutting
|
|||
for(Vec3i v:hoffsets) {
|
||||
final BlockPos p = pos.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)) {
|
||||
if((tracked_leaves_state==null) || (BlockCategories.isSameLeaves(st, tracked_leaves_state))) {
|
||||
to_decay.add(p);
|
||||
} else {
|
||||
checked.add(p);
|
||||
}
|
||||
} else {
|
||||
checked.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 distance = 2;
|
||||
to_break.addAll(findBlocksAround(world, pos, broken_state, checked, distance));
|
||||
}
|
||||
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 = 3;
|
||||
to_decay.add(pos);
|
||||
to_decay.addAll(findBlocksAround(world, pos, leaf_type_state, checked, dist));
|
||||
}
|
||||
}
|
||||
}
|
||||
// Break blocks
|
||||
{
|
||||
// Determine lose logs between the leafs
|
||||
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) {
|
||||
int dist = 1;
|
||||
to_break.addAll(findBlocksAround(world, pos, broken_state, checked, dist));
|
||||
if(++num_broken > max_blocks_to_break) break;
|
||||
IBlockState state = world.getBlockState(pos);
|
||||
world.setBlockToAir(pos);
|
||||
state.getBlock().dropBlockAsItem(world, pos, state, 0);
|
||||
}
|
||||
}
|
||||
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 the bill.
|
||||
{
|
||||
// And now the bill.
|
||||
return MathHelper.clamp(((to_break.size()*6/5)+(to_decay.size()/10)-1), 1, 65535);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"forge_marker": 1,
|
||||
"defaults": {
|
||||
"model": "engineersdecor:std/decor_full_block_model",
|
||||
"textures": { "all": "engineersdecor:blocks/concrete/gas_concrete_texture0" }
|
||||
},
|
||||
"variants": {
|
||||
"normal": [
|
||||
{ "textures": { "all": "engineersdecor:blocks/concrete/gas_concrete_texture0" } },
|
||||
{ "textures": { "all": "engineersdecor:blocks/concrete/gas_concrete_texture1" } },
|
||||
{ "textures": { "all": "engineersdecor:blocks/concrete/gas_concrete_texture2" } },
|
||||
{ "textures": { "all": "engineersdecor:blocks/concrete/gas_concrete_texture3" } },
|
||||
{ "textures": { "all": "engineersdecor:blocks/concrete/gas_concrete_texture4" } },
|
||||
{ "textures": { "all": "engineersdecor:blocks/concrete/gas_concrete_texture5" } },
|
||||
{ "textures": { "all": "engineersdecor:blocks/concrete/gas_concrete_texture6" } },
|
||||
{ "textures": { "all": "engineersdecor:blocks/concrete/gas_concrete_texture7" } }
|
||||
],
|
||||
"inventory": [{}]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
"forge_marker": 1,
|
||||
"defaults": {
|
||||
"model": "engineersdecor:slab/slab_s0_model",
|
||||
"textures": { "all": "engineersdecor:blocks/concrete/gas_concrete_texture0" }
|
||||
},
|
||||
"variants": {
|
||||
"normal": [{}],
|
||||
"inventory": [{}],
|
||||
"parts": {
|
||||
"0" : { "model": "engineersdecor:slab/slab_s0_model" },
|
||||
"1" : { "model": "engineersdecor:slab/slab_s1_model" },
|
||||
"2" : { "model": "engineersdecor:slab/slab_s2_model" }
|
||||
},
|
||||
"tvariant": {
|
||||
"0":{"textures":{"all": "engineersdecor:blocks/concrete/gas_concrete_texture0"}},
|
||||
"1":{"textures":{"all": "engineersdecor:blocks/concrete/gas_concrete_texture1"}},
|
||||
"2":{"textures":{"all": "engineersdecor:blocks/concrete/gas_concrete_texture2"}},
|
||||
"3":{"textures":{"all": "engineersdecor:blocks/concrete/gas_concrete_texture3"}},
|
||||
"4":{"textures":{"all": "engineersdecor:blocks/concrete/gas_concrete_texture4"}},
|
||||
"5":{"textures":{"all": "engineersdecor:blocks/concrete/gas_concrete_texture5"}},
|
||||
"6":{"textures":{"all": "engineersdecor:blocks/concrete/gas_concrete_texture6"}},
|
||||
"7":{"textures":{"all": "engineersdecor:blocks/concrete/gas_concrete_texture7"}}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
{
|
||||
"forge_marker": 1,
|
||||
"defaults": {
|
||||
"model": "engineersdecor:stairs/decor_straight_stairs_model",
|
||||
"textures": {
|
||||
"particle": "engineersdecor:blocks/concrete/gas_concrete_texture0",
|
||||
"bottom": "engineersdecor:blocks/concrete/gas_concrete_texture0",
|
||||
"top": "engineersdecor:blocks/concrete/gas_concrete_texture0",
|
||||
"side": "engineersdecor:blocks/concrete/gas_concrete_texture0"
|
||||
}
|
||||
},
|
||||
"variants": {
|
||||
"normal": [{}],
|
||||
"inventory": [{}],
|
||||
"facing=east,half=bottom,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model" },
|
||||
"facing=west,half=bottom,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "y": 180, "uvlock": true },
|
||||
"facing=south,half=bottom,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "y": 90, "uvlock": true },
|
||||
"facing=north,half=bottom,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "y": 270, "uvlock": true },
|
||||
"facing=east,half=bottom,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model" },
|
||||
"facing=west,half=bottom,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 180, "uvlock": true },
|
||||
"facing=south,half=bottom,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 90, "uvlock": true },
|
||||
"facing=north,half=bottom,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 270, "uvlock": true },
|
||||
"facing=east,half=bottom,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 270, "uvlock": true },
|
||||
"facing=west,half=bottom,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 90, "uvlock": true },
|
||||
"facing=south,half=bottom,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model" },
|
||||
"facing=north,half=bottom,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 180, "uvlock": true },
|
||||
"facing=east,half=bottom,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model" },
|
||||
"facing=west,half=bottom,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 180, "uvlock": true },
|
||||
"facing=south,half=bottom,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 90, "uvlock": true },
|
||||
"facing=north,half=bottom,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 270, "uvlock": true },
|
||||
"facing=east,half=bottom,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 270, "uvlock": true },
|
||||
"facing=west,half=bottom,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 90, "uvlock": true },
|
||||
"facing=south,half=bottom,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model" },
|
||||
"facing=north,half=bottom,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 180, "uvlock": true },
|
||||
"facing=east,half=top,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "x": 180, "uvlock": true },
|
||||
"facing=west,half=top,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "x": 180, "y": 180, "uvlock": true },
|
||||
"facing=south,half=top,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "x": 180, "y": 90, "uvlock": true },
|
||||
"facing=north,half=top,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "x": 180, "y": 270, "uvlock": true },
|
||||
"facing=east,half=top,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 90, "uvlock": true },
|
||||
"facing=west,half=top,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 270, "uvlock": true },
|
||||
"facing=south,half=top,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 180, "uvlock": true },
|
||||
"facing=north,half=top,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "uvlock": true },
|
||||
"facing=east,half=top,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "uvlock": true },
|
||||
"facing=west,half=top,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 180, "uvlock": true },
|
||||
"facing=south,half=top,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 90, "uvlock": true },
|
||||
"facing=north,half=top,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 270, "uvlock": true },
|
||||
"facing=east,half=top,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 90, "uvlock": true },
|
||||
"facing=west,half=top,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 270, "uvlock": true },
|
||||
"facing=south,half=top,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 180, "uvlock": true },
|
||||
"facing=north,half=top,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "uvlock": true },
|
||||
"facing=east,half=top,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "uvlock": true },
|
||||
"facing=west,half=top,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 180, "uvlock": true },
|
||||
"facing=south,half=top,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 90, "uvlock": true },
|
||||
"facing=north,half=top,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 270, "uvlock": true }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"forge_marker": 1,
|
||||
"defaults": {
|
||||
"model": "engineersdecor:wall/concrete_wall_default",
|
||||
"textures": {
|
||||
"wall": "engineersdecor:blocks/concrete/gas_concrete_texture0",
|
||||
"particle": "engineersdecor:blocks/concrete/gas_concrete_texture0"
|
||||
}
|
||||
},
|
||||
"variants": {
|
||||
"inventory": { "model": "engineersdecor:wall/concrete_wall_inventory" },
|
||||
"up" : { "false":{}, "true": {"submodel": {"concrete_wall_up" : {"model": "engineersdecor:wall/concrete_wall_post" }}} },
|
||||
"north": { "false":{}, "true": {"submodel": {"concrete_wall_north" : {"model": "engineersdecor:wall/concrete_wall_side", "uvlock": true, "y": 0 }}} },
|
||||
"east" : { "false":{}, "true": {"submodel": {"concrete_wall_east" : {"model": "engineersdecor:wall/concrete_wall_side", "uvlock": true, "y": 90 }}} },
|
||||
"south": { "false":{}, "true": {"submodel": {"concrete_wall_south" : {"model": "engineersdecor:wall/concrete_wall_side", "uvlock": true, "y": 180 }}} },
|
||||
"west" : { "false":{}, "true": {"submodel": {"concrete_wall_west" : {"model": "engineersdecor:wall/concrete_wall_side", "uvlock": true, "y": 270 }}} },
|
||||
"tvariant": {
|
||||
"0":{"textures":{ "wall": "engineersdecor:blocks/concrete/gas_concrete_texture0" }},
|
||||
"1":{"textures":{ "wall": "engineersdecor:blocks/concrete/gas_concrete_texture1" }},
|
||||
"2":{"textures":{ "wall": "engineersdecor:blocks/concrete/gas_concrete_texture2" }},
|
||||
"3":{"textures":{ "wall": "engineersdecor:blocks/concrete/gas_concrete_texture3" }},
|
||||
"4":{"textures":{ "wall": "engineersdecor:blocks/concrete/gas_concrete_texture4" }},
|
||||
"5":{"textures":{ "wall": "engineersdecor:blocks/concrete/gas_concrete_texture5" }},
|
||||
"6":{"textures":{ "wall": "engineersdecor:blocks/concrete/gas_concrete_texture6" }},
|
||||
"7":{"textures":{ "wall": "engineersdecor:blocks/concrete/gas_concrete_texture7" }}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"forge_marker": 1,
|
||||
"defaults": {
|
||||
"model": "engineersdecor:slab/halfslab_s0_model",
|
||||
"textures": { "all": "engineersdecor:blocks/concrete/gas_concrete_texture0" }
|
||||
},
|
||||
"variants": {
|
||||
"normal": [{}],
|
||||
"inventory": [{}],
|
||||
"parts": {
|
||||
"0" : { "model": "engineersdecor:slab/halfslab_s0_model" },
|
||||
"1" : { "model": "engineersdecor:slab/halfslab_s1_model" },
|
||||
"2" : { "model": "engineersdecor:slab/halfslab_s2_model" },
|
||||
"3" : { "model": "engineersdecor:slab/halfslab_s3_model" },
|
||||
"4" : { "model": "engineersdecor:slab/halfslab_s4_model" },
|
||||
"5" : { "model": "engineersdecor:slab/halfslab_s5_model" },
|
||||
"6" : { "model": "engineersdecor:slab/halfslab_s6_model" },
|
||||
"7" : { "model": "engineersdecor:slab/halfslab_s7_model" },
|
||||
"8" : { "model": "engineersdecor:slab/halfslab_s8_model" },
|
||||
"9" : { "model": "engineersdecor:slab/halfslab_s9_model" },
|
||||
"10": { "model": "engineersdecor:slab/halfslab_sa_model" },
|
||||
"11": { "model": "engineersdecor:slab/halfslab_sb_model" },
|
||||
"12": { "model": "engineersdecor:slab/halfslab_sc_model" },
|
||||
"13": { "model": "engineersdecor:slab/halfslab_sd_model" },
|
||||
"14": { "model": "engineersdecor:slab/halfslab_se_model" }
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"forge_marker": 1,
|
||||
"defaults": {
|
||||
"model": "engineersdecor:device/small_milking_machine_model"
|
||||
},
|
||||
"variants": {
|
||||
"normal": [{}],
|
||||
"inventory": [{}],
|
||||
"facing": { "north": {"y":0}, "south": {"y":180}, "west": {"y":-90}, "east": {"y":90} },
|
||||
"active": { "false":{}, "true":{ "model": "engineersdecor:device/small_milking_machine_model_active" } },
|
||||
"filled": { "false":{}, "true":{ "textures":{ "f": "engineersdecor:blocks/device/small_milking_machine_front_filled" }}}
|
||||
}
|
||||
}
|
|
@ -9,7 +9,8 @@ engineersdecor.tooltip.hint.extended=§6[§9SHIFT§r More Info§6]§r
|
|||
engineersdecor.tooltip.hint.help=§6[§9CTRL-SHIFT§r Help§6]§r
|
||||
engineersdecor.tooltip.slabpickup.help=§rFast pickup by left-clicking while looking up/down and holding this slab.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
# Stone/"ceramic material" based blocks
|
||||
engineersdecor.tooltip.requires_rf_power=Requires RF power.
|
||||
engineersdecor.tooltip.massive_speed_boost_with_rf_power=Apply RF power to magnificently increase the speed.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.clinker_brick_block.name=Clinker Brick Block
|
||||
tile.engineersdecor.clinker_brick_block.help=§6A brick block with position dependent texture variations.§r\nLooks slightly darker and more color intensive than the vanilla brick block.
|
||||
|
@ -19,6 +20,8 @@ tile.engineersdecor.slag_brick_block.name=Slag Brick Block
|
|||
tile.engineersdecor.slag_brick_block.help=§6A gray-brown brick block with position dependent texture variations.
|
||||
tile.engineersdecor.rebar_concrete.name=Rebar Concrete Block
|
||||
tile.engineersdecor.rebar_concrete.help=§6Steel reinforced concrete block.§r Expensive but Creeper-proof like obsidian.
|
||||
tile.engineersdecor.gas_concrete.name=Gas Concrete Block
|
||||
tile.engineersdecor.gas_concrete.help=§6Low hardness, high production yield concrete.§r Easy to break decorative concrete block.
|
||||
tile.engineersdecor.panzerglass_block.name=Panzer Glass Block
|
||||
tile.engineersdecor.panzerglass_block.help=§6Reinforced glass block.§r Expensive, explosion-proof. Dark gray tint, faint structural lines visible, multi texture for seemless look.
|
||||
tile.engineersdecor.rebar_concrete_tile.name=Rebar Concrete Tile
|
||||
|
@ -34,6 +37,8 @@ tile.engineersdecor.rebar_concrete_slab.name=Rebar Concrete Slab
|
|||
tile.engineersdecor.rebar_concrete_slab.help=§6Steel reinforced concrete slab.§r Expensive but Creeper-proof like obsidian.
|
||||
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.gas_concrete_slab.name=Gas Concrete Slab
|
||||
tile.engineersdecor.gas_concrete_slab.help=§6Low hardness concrete slab.§r Easy to break decorative concrete.
|
||||
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
|
||||
|
@ -43,6 +48,8 @@ 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.
|
||||
tile.engineersdecor.concrete_wall.name=Concrete Wall
|
||||
tile.engineersdecor.concrete_wall.help=§6Wall made of solid concrete.
|
||||
tile.engineersdecor.gas_concrete_wall.name=Gas Concrete Wall
|
||||
tile.engineersdecor.gas_concrete_wall.help=§6Low hardness concrete wall.§r Easy to break decorative concrete.
|
||||
tile.engineersdecor.clinker_brick_wall.name=Clinker Brick Wall
|
||||
tile.engineersdecor.clinker_brick_wall.help=§6Simplistic Clinker Brick Wall.
|
||||
tile.engineersdecor.slag_brick_wall.name=Slag Brick Wall
|
||||
|
@ -65,6 +72,8 @@ tile.engineersdecor.rebar_concrete_stairs.name=Rebar Concrete Stairs
|
|||
tile.engineersdecor.rebar_concrete_stairs.help=§6Steel reinforced concrete stairs.§r Expensive but Creeper-proof like obsidian.
|
||||
tile.engineersdecor.rebar_concrete_tile_stairs.name=Rebar Concrete Tile Stairs
|
||||
tile.engineersdecor.rebar_concrete_tile_stairs.help=§6Steel reinforced concrete tile stairs.§r Expensive but Creeper-proof like obsidian.
|
||||
tile.engineersdecor.gas_concrete_stairs.name=Gas Concrete Stairs
|
||||
tile.engineersdecor.gas_concrete_stairs.help=§6Low hardness concrete stairs.§r Easy to break decorative concrete.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.treated_wood_pole.name=Straight Treated Wood Pole
|
||||
tile.engineersdecor.treated_wood_pole.help=§6Straight pole fragment with a diameter of a wire relay.§r\n\
|
||||
|
@ -175,7 +184,8 @@ tile.engineersdecor.small_block_breaker.name=Small Block Breaker
|
|||
tile.engineersdecor.small_block_breaker.help=§6Breaks blocks in front of it.§r\n\
|
||||
Can be disabled by applying a redstone signal. \
|
||||
The time needed to destroy a block depends on the hardness of that block. \
|
||||
Provide RF/FE power to speed up the breaking process (massively).
|
||||
${!block_breaker_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power}\
|
||||
${block_breaker_requires_power?engineersdecor.tooltip.requires_rf_power}
|
||||
tile.engineersdecor.small_mineral_smelter.name=Small Mineral Melting Furnace
|
||||
tile.engineersdecor.small_mineral_smelter.help=§6High temperature, high insulation electrical stone melting furnace.§r\n\
|
||||
Heats up mineral blocks to magma blocks, and finally to lava. Click with a \
|
||||
|
@ -192,7 +202,15 @@ tile.engineersdecor.small_solar_panel.help=§6Produces a small amount of power w
|
|||
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 (takes a long time without power).
|
||||
${!tree_cuttter_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power}\
|
||||
${tree_cuttter_requires_power?engineersdecor.tooltip.requires_rf_power}
|
||||
tile.engineersdecor.small_milking_machine.name=Small Milking Machine
|
||||
tile.engineersdecor.small_milking_machine.help=§6Occasionally grooms and milks cows.§r\n\
|
||||
Has an internal fluid tank. Does not feed the animals. Use buckets to retrieve the milk. \
|
||||
Pulls/stores milk container items from/to inventories at the back or bottom (preferrs \
|
||||
extracting from the back and inserting below, but can also put filled vessels back into the \
|
||||
same inventory). Supports fluid output to tanks or pipes below (only if milk exists as fluid). \
|
||||
Care that it's not too crowdy in the cow pen, only happy animals stroll by voluntarily.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
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.
|
||||
|
@ -213,6 +231,8 @@ tile.engineersdecor.halfslab_rebar_concrete.name=Rebar Concrete Slice
|
|||
tile.engineersdecor.halfslab_rebar_concrete.help=§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.
|
||||
tile.engineersdecor.halfslab_concrete.name=Concrete Slice
|
||||
tile.engineersdecor.halfslab_concrete.help=§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.
|
||||
tile.engineersdecor.halfslab_gas_concrete.name=Gas Concrete Slice
|
||||
tile.engineersdecor.halfslab_gas_concrete.help=§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.
|
||||
tile.engineersdecor.halfslab_treated_wood.name=Treated Wood Slice
|
||||
tile.engineersdecor.halfslab_treated_wood.help=§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.
|
||||
tile.engineersdecor.halfslab_sheetmetal_iron.name=Iron Sheet Metal Slice
|
||||
|
|
|
@ -9,7 +9,8 @@ engineersdecor.tooltip.hint.extended=§6[§9SHIFT§r Больше информа
|
|||
engineersdecor.tooltip.hint.help=§6[§9CTRL-SHIFT§r Помощь§6]§r
|
||||
engineersdecor.tooltip.slabpickup.help=§rБыстрое поднятие щелчком ЛКМ, смотря вверх/вниз с этой плитой в руках.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
# Stone/"ceramic material" based blocks
|
||||
engineersdecor.tooltip.requires_rf_power=Requires RF power.
|
||||
engineersdecor.tooltip.massive_speed_boost_with_rf_power=Apply RF power to magnificently increase the speed.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.clinker_brick_block.name=Клинкерный кирпич
|
||||
tile.engineersdecor.clinker_brick_block.help=§6Кирпичный блок с вариациями текстуры, зависящими от положения.§r\nВыглядит темнее и интенсивнее, чем Кирпичный блок.
|
||||
|
@ -19,6 +20,8 @@ tile.engineersdecor.slag_brick_block.name=Шлакоблок
|
|||
tile.engineersdecor.slag_brick_block.help=§6Серо-коричневый кирпичный блок с зависимыми от положения вариациями текстуры.
|
||||
tile.engineersdecor.rebar_concrete.name=Железобетон
|
||||
tile.engineersdecor.rebar_concrete.help=§6Стальной железобетонный блок.§r Дорогой, но взрывоустойчивый, как обсидиан.
|
||||
tile.engineersdecor.gas_concrete.name=Gas Concrete Block
|
||||
#tile.engineersdecor.gas_concrete.help=§6Low hardness, high production yield concrete.§r Easy to break decorative concrete block.
|
||||
tile.engineersdecor.panzerglass_block.name=Бронированное стекло
|
||||
tile.engineersdecor.panzerglass_block.help=§6Усиленный стеклоблок.§r Дорогой, взрывоустойчивый. Имеет тёмно-серый оттенок, слегка видны структурные линии, мультитекстура для бесшовного отображения.
|
||||
tile.engineersdecor.rebar_concrete_tile.name=Железобетонная плита
|
||||
|
@ -34,6 +37,8 @@ tile.engineersdecor.rebar_concrete_slab.name=Железобетонная пли
|
|||
tile.engineersdecor.rebar_concrete_slab.help=§6Бетонная плита, усиленная сталью.§r Дорогая, но взрывоустойчивая, как обсидиан.
|
||||
tile.engineersdecor.rebar_concrete_tile_slab.name=Железобетонная плитка
|
||||
tile.engineersdecor.rebar_concrete_tile_slab.help=§6Бетонная плитка, усиленная сталью.§r Дорогая, но взрывоустойчивая, как обсидиан.
|
||||
tile.engineersdecor.gas_concrete_slab.name=Gas Concrete Slab
|
||||
#tile.engineersdecor.gas_concrete_slab.help=§6Low hardness concrete slab.§r Easy to break decorative concrete.
|
||||
tile.engineersdecor.panzerglass_slab.name=Плита из бронированного стекла
|
||||
tile.engineersdecor.panzerglass_slab.help=§6Усиленная стеклянная плита.§r Дорогая, взрывоустойчивая. Имеет тёмно-серый оттенок, слегка видны структурные линии.
|
||||
tile.engineersdecor.treated_wood_floor.name=Treated Wood Floor
|
||||
|
@ -43,6 +48,8 @@ tile.engineersdecor.rebar_concrete_wall.name=Железобетонная сте
|
|||
tile.engineersdecor.rebar_concrete_wall.help=§6Стальная железобетонная стена.§r Дорогая, но взрывоустойчивая, как обсидиан.
|
||||
tile.engineersdecor.concrete_wall.name=Бетонная стена
|
||||
tile.engineersdecor.concrete_wall.help=§6Стена из твёрдого бетона.
|
||||
tile.engineersdecor.gas_concrete_wall.name=Gas Concrete Wall
|
||||
#tile.engineersdecor.gas_concrete_wall.help=§6Low hardness concrete wall.§r Easy to break decorative concrete.
|
||||
tile.engineersdecor.clinker_brick_wall.name=Клинкерная кирпичная стена
|
||||
tile.engineersdecor.clinker_brick_wall.help=§6Обыкновенная клинкерная кирпичная стена.
|
||||
tile.engineersdecor.slag_brick_wall.name=Кирпичная стена из шлакоблока
|
||||
|
@ -65,6 +72,8 @@ tile.engineersdecor.rebar_concrete_stairs.name=Железобетонные ст
|
|||
tile.engineersdecor.rebar_concrete_stairs.help=§6Железобетонные ступеньки.§r Дорогие, но взрывоустойчивые, как обсидиан.
|
||||
tile.engineersdecor.rebar_concrete_tile_stairs.name=Ступеньки из железобетонной плитки
|
||||
tile.engineersdecor.rebar_concrete_tile_stairs.help=§6Ступеньки из железобетонной плитки.§r Дорогие, но взрывоустойчивые, как обсидиан.
|
||||
tile.engineersdecor.gas_concrete_stairs.name=Gas Concrete Stairs
|
||||
#tile.engineersdecor.gas_concrete_stairs.help=§6Low hardness concrete stairs.§r Easy to break decorative concrete.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.treated_wood_pole.name=Прямой обработанный деревянный столб
|
||||
tile.engineersdecor.treated_wood_pole.help=§6Надёжный столб с диаметром, схожим с реле.§r\n\
|
||||
|
@ -171,7 +180,8 @@ tile.engineersdecor.small_block_breaker.name=Factory Block Breaker
|
|||
#tile.engineersdecor.small_block_breaker.help=§6Breaks blocks in front of it.§r\n\
|
||||
Can be disabled by applying a redstone signal. \
|
||||
The time needed to destroy a block depends on the hardness of that block. \
|
||||
Provide RF/FE power to speed up the breaking process (massively).
|
||||
${!block_breaker_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power}\
|
||||
${block_breaker_requires_power?engineersdecor.tooltip.requires_rf_power}
|
||||
tile.engineersdecor.small_mineral_smelter.name=Small Mineral Melting Furnace
|
||||
#tile.engineersdecor.small_mineral_smelter.help=§6High temperature, high insulation electrical stone melting furnace.§r\n\
|
||||
Heats up mineral blocks to magma blocks, and finally to lava. Click with a \
|
||||
|
@ -188,7 +198,15 @@ tile.engineersdecor.small_solar_panel.name=Small Solar Panel
|
|||
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 (takes a long time without power).
|
||||
${!tree_cuttter_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power}\
|
||||
${tree_cuttter_requires_power?engineersdecor.tooltip.requires_rf_power}
|
||||
tile.engineersdecor.small_milking_machine.name=Small Milking Machine
|
||||
#tile.engineersdecor.small_milking_machine.help=§6Occasionally grooms and milks cows.§r\n\
|
||||
Has an internal fluid tank. Does not feed the animals. Use buckets to retrieve the milk. \
|
||||
Pulls/stores milk container items from/to inventories at the back or bottom (preferrs \
|
||||
extracting from the back and inserting below, but can also put filled vessels back into the \
|
||||
same inventory). Supports fluid output to tanks or pipes below (only if milk exists as fluid). \
|
||||
Care that it's not too crowdy in the cow pen, only happy animals stroll by voluntarily.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.sign_decor.name=Табличка с надписью (Логотип Engineer's decor)
|
||||
tile.engineersdecor.sign_decor.help=§Это не должно быть крафтовым или видимым в JEI. Используется для творческой вкладки и скриншотов.
|
||||
|
@ -209,6 +227,8 @@ tile.engineersdecor.halfslab_rebar_concrete.name=Арматура для бет
|
|||
tile.engineersdecor.halfslab_rebar_concrete.help=§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.
|
||||
tile.engineersdecor.halfslab_concrete.name=Бетонный срез
|
||||
tile.engineersdecor.halfslab_concrete.help=§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.
|
||||
tile.engineersdecor.halfslab_gas_concrete.name=Gas Concrete Slice
|
||||
#tile.engineersdecor.halfslab_gas_concrete.help=§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.
|
||||
tile.engineersdecor.halfslab_treated_wood.name=Часть обработанного дерева
|
||||
tile.engineersdecor.halfslab_treated_wood.help=§6Вертикально наращиваемая часть.§rПравый/левый щелчок со стеком частей на верхней или нижней поверхности для добавления/удаления частей.
|
||||
tile.engineersdecor.halfslab_sheetmetal_iron.name=Часть железного листового металла
|
||||
|
|
|
@ -9,7 +9,8 @@ engineersdecor.tooltip.hint.extended=§6[§9SHIFT§r 查看更多信息§6]§r
|
|||
engineersdecor.tooltip.hint.help=§6[§9CTRL-SHIFT§r 查看帮助§6]§r
|
||||
engineersdecor.tooltip.slabpickup.help=§r手持同类台阶往上/下看时单击该台阶可无需破坏快速拾起。
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
# Stone/"ceramic material" based blocks
|
||||
engineersdecor.tooltip.requires_rf_power=Requires RF power.
|
||||
engineersdecor.tooltip.massive_speed_boost_with_rf_power=Apply RF power to magnificently increase the speed.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.clinker_brick_block.name=过烧砖块
|
||||
tile.engineersdecor.clinker_brick_block.help=§6一种放在不同位置贴图有不同变化的砖块。§r\n比原版砖看起来颜色更深,色度也更高。
|
||||
|
@ -19,6 +20,8 @@ tile.engineersdecor.slag_brick_block.name=炉渣砖块
|
|||
tile.engineersdecor.slag_brick_block.help=§6一种放在不同位置贴图有不同变化的灰棕色砖块。
|
||||
tile.engineersdecor.rebar_concrete.name=钢筋混凝土
|
||||
tile.engineersdecor.rebar_concrete.help=§6钢强化的混凝土。§r昂贵但像黑曜石一样防爬行者爆炸。
|
||||
tile.engineersdecor.gas_concrete.name=Gas Concrete Block
|
||||
#tile.engineersdecor.gas_concrete.help=§6Low hardness, high production yield concrete.§r Easy to break decorative concrete block.
|
||||
tile.engineersdecor.panzerglass_block.name=装甲玻璃块
|
||||
tile.engineersdecor.panzerglass_block.help=§6强化的玻璃方块。§r昂贵,防爆。深灰色调,有隐约可见的结构线和多种纹理,外观无光泽。
|
||||
tile.engineersdecor.rebar_concrete_tile.name=钢筋混凝土砖
|
||||
|
@ -34,6 +37,8 @@ tile.engineersdecor.rebar_concrete_slab.name=钢筋混凝土台阶
|
|||
tile.engineersdecor.rebar_concrete_slab.help=§6钢强化的混凝土台阶。§r昂贵但像黑曜石一样防爬行者爆炸。
|
||||
tile.engineersdecor.rebar_concrete_tile_slab.name=钢筋混凝土砖台阶
|
||||
tile.engineersdecor.rebar_concrete_tile_slab.help=§6钢强化的混凝土砖台阶。§r昂贵但像黑曜石一样防爬行者爆炸。
|
||||
tile.engineersdecor.gas_concrete_slab.name=Gas Concrete Slab
|
||||
#tile.engineersdecor.gas_concrete_slab.help=§6Low hardness concrete slab.§r Easy to break decorative concrete.
|
||||
tile.engineersdecor.panzerglass_slab.name=装甲玻璃台阶
|
||||
tile.engineersdecor.panzerglass_slab.help=§6强化的玻璃台阶。§r昂贵,防爆。深灰色调,有隐约可见的结构线和多种纹理。
|
||||
tile.engineersdecor.treated_wood_floor.name=防腐木地板
|
||||
|
@ -43,6 +48,8 @@ tile.engineersdecor.rebar_concrete_wall.name=钢筋混凝土墙
|
|||
tile.engineersdecor.rebar_concrete_wall.help=§6钢强化的混凝土墙。§r 昂贵但像黑曜石一样防爬行者爆炸。
|
||||
tile.engineersdecor.concrete_wall.name=混凝土墙
|
||||
tile.engineersdecor.concrete_wall.help=§6用坚固混凝土制造的墙。
|
||||
tile.engineersdecor.gas_concrete_wall.name=Gas Concrete Wall
|
||||
#tile.engineersdecor.gas_concrete_wall.help=§6Low hardness concrete wall.§r Easy to break decorative concrete.
|
||||
tile.engineersdecor.clinker_brick_wall.name=过烧砖墙
|
||||
tile.engineersdecor.clinker_brick_wall.help=§6简单的过烧砖墙。
|
||||
tile.engineersdecor.slag_brick_wall.name=炉渣砖墙
|
||||
|
@ -65,6 +72,8 @@ tile.engineersdecor.rebar_concrete_stairs.name=钢筋混凝土楼梯
|
|||
tile.engineersdecor.rebar_concrete_stairs.help=§6钢强化的混凝土楼梯。§r昂贵但像黑曜石一样防爬行者爆炸。
|
||||
tile.engineersdecor.rebar_concrete_tile_stairs.name=钢筋混凝土砖楼梯
|
||||
tile.engineersdecor.rebar_concrete_tile_stairs.help=§6钢强化的混凝土砖楼梯。§r昂贵但像黑曜石一样防爬行者爆炸。
|
||||
tile.engineersdecor.gas_concrete_stairs.name=Gas Concrete Stairs
|
||||
#tile.engineersdecor.gas_concrete_stairs.help=§6Low hardness concrete stairs.§r Easy to break decorative concrete.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.treated_wood_pole.name=直防腐木杆
|
||||
tile.engineersdecor.treated_wood_pole.help=§6直杆的一段,有着继电器的直径。§r\n\
|
||||
|
@ -174,7 +183,8 @@ tile.engineersdecor.small_block_breaker.name=Factory Block Breaker
|
|||
#tile.engineersdecor.small_block_breaker.help=§6Breaks blocks in front of it.§r\n\
|
||||
Can be disabled by applying a redstone signal. \
|
||||
The time needed to destroy a block depends on the hardness of that block. \
|
||||
Provide RF/FE power to speed up the breaking process (massively).
|
||||
${!block_breaker_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power}\
|
||||
${block_breaker_requires_power?engineersdecor.tooltip.requires_rf_power}
|
||||
tile.engineersdecor.small_mineral_smelter.name=小型矿物熔炼炉
|
||||
tile.engineersdecor.small_mineral_smelter.help=§6高温、高绝缘电熔石炉。§r\n\
|
||||
把矿物块加热成岩浆块,最后变成熔岩。由于\
|
||||
|
@ -189,6 +199,13 @@ tile.engineersdecor.small_tree_cutter.name=小型砍树机
|
|||
tile.engineersdecor.small_tree_cutter.help=§6砍倒正前方的树。§r\n\
|
||||
不收集木材。通入红石信号停用。\
|
||||
提供RF来加快砍树速度。(没有的话会很慢。)
|
||||
tile.engineersdecor.small_milking_machine.name=Small Milking Machine
|
||||
#tile.engineersdecor.small_milking_machine.help=§6Occasionally grooms and milks cows.§r\n\
|
||||
Has an internal fluid tank. Does not feed the animals. Use buckets to retrieve the milk. \
|
||||
Pulls/stores milk container items from/to inventories at the back or bottom (preferrs \
|
||||
extracting from the back and inserting below, but can also put filled vessels back into the \
|
||||
same inventory). Supports fluid output to tanks or pipes below (only if milk exists as fluid). \
|
||||
Care that it's not too crowdy in the cow pen, only happy animals stroll by voluntarily.
|
||||
#-----------------------------------------------------------------------------------------------------------
|
||||
tile.engineersdecor.sign_decor.name=标志板(工程师的装饰)
|
||||
tile.engineersdecor.sign_decor.help=§6这不应该可合成或在JEI看到。用于创造模式的物品栏标签和截屏。
|
||||
|
@ -209,6 +226,8 @@ tile.engineersdecor.halfslab_rebar_concrete.name=强化混凝土切片
|
|||
tile.engineersdecor.halfslab_rebar_concrete.help=§6可垂直堆叠的切片。§r手持切片右/左击切片堆叠的顶端或底部来添加/移除切片。
|
||||
tile.engineersdecor.halfslab_concrete.name=混凝土切片
|
||||
tile.engineersdecor.halfslab_concrete.help=§6可垂直堆叠的切片。§r手持切片右/左击切片堆叠的顶端或底部来添加/移除切片。
|
||||
tile.engineersdecor.halfslab_gas_concrete.name=Gas Concrete Slice
|
||||
#tile.engineersdecor.halfslab_gas_concrete.help=§6Vertically stackable slice.§r Right/left click with the slice stack on the top or bottom surface to add/remove slices.
|
||||
tile.engineersdecor.halfslab_treated_wood.name=防腐木切片
|
||||
tile.engineersdecor.halfslab_treated_wood.help=§6可垂直堆叠的切片。§r手持切片右/左击切片堆叠的顶端或底部来添加/移除切片。
|
||||
tile.engineersdecor.halfslab_sheetmetal_iron.name=铁板金属块切片
|
||||
|
|
|
@ -108,7 +108,8 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
"rotation": [30, 225, 0],
|
||||
|
|
|
@ -100,7 +100,7 @@
|
|||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -0.75, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -95,7 +95,8 @@
|
|||
],
|
||||
"display": {
|
||||
"ground": {
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
"rotation": [30, 225, 0],
|
||||
|
|
|
@ -240,7 +240,7 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -0.75, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -245,7 +245,7 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -0.75, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -240,7 +240,7 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -0.75, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -156,7 +156,7 @@
|
|||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -0.75, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -369,7 +369,7 @@
|
|||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -0.75, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -128,22 +128,22 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"from": [4, 9.5, -2],
|
||||
"to": [5, 10.5, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [12, 2.5, 5.5]},
|
||||
"from": [4, 9.5, 0],
|
||||
"to": [5, 10.5, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [12, 2.5, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [11, 5.5, 12, 6.5], "texture": "#sh"},
|
||||
"east": {"uv": [16, 5.5, 16, 6.5], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 5.5, 16, 6.5], "texture": "#sh"},
|
||||
"south": {"uv": [4, 5.5, 5, 6.5], "texture": "#sh"},
|
||||
"west": {"uv": [0, 5.5, 0, 6.5], "texture": "#sh"},
|
||||
"up": {"uv": [4, 0, 5, 0], "texture": "#sh"},
|
||||
"down": {"uv": [4, 16, 5, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 5.5, 0.5, 6.5], "texture": "#sh"},
|
||||
"up": {"uv": [4, 0, 5, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [4, 15.5, 5, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [3, 7, 0.5],
|
||||
"from": [3, 7, 1.5],
|
||||
"to": [3.5, 9, 7],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [2.5, 1, 5]},
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [2.5, 1, 6]},
|
||||
"faces": {
|
||||
"north": {"uv": [12.5, 7, 13, 9], "texture": "#sh"},
|
||||
"east": {"uv": [9, 7, 15.5, 9], "texture": "#sh"},
|
||||
|
@ -154,9 +154,9 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"from": [2.5, 6, -0.5],
|
||||
"to": [6.5, 10, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [12.5, 1, 6.5]},
|
||||
"from": [2.5, 6, 0.5],
|
||||
"to": [6.5, 10, 1.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [12.5, 1, 7.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [11, 11, 15, 15], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 6, 16, 10], "texture": "#sh"},
|
||||
|
@ -167,113 +167,113 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"from": [2.5, 9, -2],
|
||||
"to": [3.5, 10, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [10.5, 2, 5.5]},
|
||||
"from": [2.5, 9, 0],
|
||||
"to": [3.5, 10, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [10.5, 2, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [12.5, 6, 13.5, 7], "texture": "#sh"},
|
||||
"east": {"uv": [16, 6, 16, 7], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 6, 16, 7], "texture": "#sh"},
|
||||
"south": {"uv": [2.5, 6, 3.5, 7], "texture": "#sh"},
|
||||
"west": {"uv": [0, 6, 0, 7], "texture": "#sh"},
|
||||
"up": {"uv": [3, 2, 4, 3], "texture": "#sh"},
|
||||
"down": {"uv": [2.5, 16, 3.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 6, 0.5, 7], "texture": "#sh"},
|
||||
"up": {"uv": [2.5, 0, 3.5, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [2.5, 15.5, 3.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [2, 7.5, -2],
|
||||
"to": [3, 8.5, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [10, 0.5, 5.5]},
|
||||
"from": [2, 7.5, 0],
|
||||
"to": [3, 8.5, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [10, 0.5, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [13, 7.5, 14, 8.5], "texture": "#sh"},
|
||||
"east": {"uv": [16, 7.5, 16, 8.5], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 7.5, 16, 8.5], "texture": "#sh"},
|
||||
"south": {"uv": [2, 7.5, 3, 8.5], "texture": "#sh"},
|
||||
"west": {"uv": [0, 7.5, 0, 8.5], "texture": "#sh"},
|
||||
"up": {"uv": [2, 0, 3, 0], "texture": "#sh"},
|
||||
"down": {"uv": [2, 16, 3, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 7.5, 0.5, 8.5], "texture": "#sh"},
|
||||
"up": {"uv": [2, 0, 3, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [2, 15.5, 3, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [2.5, 6, -2],
|
||||
"to": [3.5, 7, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [10.5, -1, 5.5]},
|
||||
"from": [2.5, 6, 0],
|
||||
"to": [3.5, 7, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [10.5, -1, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [12.5, 9, 13.5, 10], "texture": "#sh"},
|
||||
"east": {"uv": [16, 9, 16, 10], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 9, 16, 10], "texture": "#sh"},
|
||||
"south": {"uv": [2.5, 9, 3.5, 10], "texture": "#sh"},
|
||||
"west": {"uv": [0, 9, 0, 10], "texture": "#sh"},
|
||||
"up": {"uv": [2.5, 0, 3.5, 0], "texture": "#sh"},
|
||||
"down": {"uv": [2.5, 16, 3.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 9, 0.5, 10], "texture": "#sh"},
|
||||
"up": {"uv": [2.5, 0, 3.5, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [2.5, 15.5, 3.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [4, 5.5, -2],
|
||||
"to": [5, 6.5, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [12, -1.5, 5.5]},
|
||||
"from": [4, 5.5, 0],
|
||||
"to": [5, 6.5, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [12, -1.5, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [11, 9.5, 12, 10.5], "texture": "#sh"},
|
||||
"east": {"uv": [16, 9.5, 16, 10.5], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 9.5, 16, 10.5], "texture": "#sh"},
|
||||
"south": {"uv": [4, 9.5, 5, 10.5], "texture": "#sh"},
|
||||
"west": {"uv": [0, 9.5, 0, 10.5], "texture": "#sh"},
|
||||
"up": {"uv": [4, 0, 5, 0], "texture": "#sh"},
|
||||
"down": {"uv": [4, 16, 5, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 9.5, 0.5, 10.5], "texture": "#sh"},
|
||||
"up": {"uv": [4, 0, 5, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [4, 15.5, 5, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [5.5, 6, -2],
|
||||
"to": [6.5, 7, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [13.5, -1, 5.5]},
|
||||
"from": [5.5, 6, 0],
|
||||
"to": [6.5, 7, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [13.5, -1, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [9.5, 9, 10.5, 10], "texture": "#sh"},
|
||||
"east": {"uv": [16, 9, 16, 10], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 9, 16, 10], "texture": "#sh"},
|
||||
"south": {"uv": [5.5, 9, 6.5, 10], "texture": "#sh"},
|
||||
"west": {"uv": [0, 9, 0, 10], "texture": "#sh"},
|
||||
"up": {"uv": [5.5, 0, 6.5, 0], "texture": "#sh"},
|
||||
"down": {"uv": [5.5, 16, 6.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 9, 0.5, 10], "texture": "#sh"},
|
||||
"up": {"uv": [5.5, 0, 6.5, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [5.5, 15.5, 6.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [5.5, 9, -2],
|
||||
"to": [6.5, 10, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [13.5, 2, 5.5]},
|
||||
"from": [5.5, 9, 0],
|
||||
"to": [6.5, 10, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [13.5, 2, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [9.5, 6, 10.5, 7], "texture": "#sh"},
|
||||
"east": {"uv": [16, 6, 16, 7], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 6, 16, 7], "texture": "#sh"},
|
||||
"south": {"uv": [5.5, 6, 6.5, 7], "texture": "#sh"},
|
||||
"west": {"uv": [0, 6, 0, 7], "texture": "#sh"},
|
||||
"up": {"uv": [5.5, 0, 6.5, 0], "texture": "#sh"},
|
||||
"down": {"uv": [5.5, 16, 6.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 6, 0.5, 7], "texture": "#sh"},
|
||||
"up": {"uv": [5.5, 0, 6.5, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [5.5, 15.5, 6.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6, 7.5, -2],
|
||||
"to": [7, 8.5, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [14, 0.5, 5.5]},
|
||||
"from": [6, 7.5, 0],
|
||||
"to": [7, 8.5, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [14, 0.5, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [9, 7.5, 10, 8.5], "texture": "#sh"},
|
||||
"east": {"uv": [16, 7.5, 16, 8.5], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 7.5, 16, 8.5], "texture": "#sh"},
|
||||
"south": {"uv": [6, 7.5, 7, 8.5], "texture": "#sh"},
|
||||
"west": {"uv": [0, 7.5, 0, 8.5], "texture": "#sh"},
|
||||
"up": {"uv": [6, 0, 7, 0], "texture": "#sh"},
|
||||
"down": {"uv": [6, 16, 7, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 7.5, 0.5, 8.5], "texture": "#sh"},
|
||||
"up": {"uv": [6, 0, 7, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [6, 15.5, 7, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [5.5, 7, 0.5],
|
||||
"from": [5.5, 7, 1.5],
|
||||
"to": [6, 9, 7],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [5.5, 1, 5]},
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [5.5, 1, 6]},
|
||||
"faces": {
|
||||
"north": {"uv": [10, 7, 10.5, 9], "texture": "#sh"},
|
||||
"east": {"uv": [8, 7, 14.5, 9], "texture": "#sh"},
|
||||
"south": {"uv": [5.5, 7, 6, 9], "texture": "#sh"},
|
||||
"west": {"uv": [0.5, 7, 7, 9], "texture": "#sh"},
|
||||
"up": {"uv": [5, 2, 11.5, 2.5], "texture": "#sh"},
|
||||
"up": {"uv": [5, 2, 11.5, 2.5], "rotation": 90, "texture": "#sh"},
|
||||
"down": {"uv": [5.5, 9, 6, 15.5], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [3.5, 6.5, 0.5],
|
||||
"from": [3.5, 6.5, 1.5],
|
||||
"to": [5.5, 9.5, 7],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [4.5, 1, 5]},
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [4.5, 1, 6]},
|
||||
"faces": {
|
||||
"north": {"uv": [10.5, 6.5, 12.5, 9.5], "texture": "#sh"},
|
||||
"east": {"uv": [9, 6.5, 15.5, 9.5], "texture": "#sh"},
|
||||
|
@ -284,9 +284,9 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"from": [12.5, 7, 0.5],
|
||||
"from": [12.5, 7, 1.5],
|
||||
"to": [13, 9, 7],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [12.5, 1, 5]},
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [12.5, 1, 6]},
|
||||
"faces": {
|
||||
"north": {"uv": [3, 7, 3.5, 9], "texture": "#sh"},
|
||||
"east": {"uv": [9, 7, 15.5, 9], "texture": "#sh"},
|
||||
|
@ -297,9 +297,9 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"from": [10.5, 6.5, 0.5],
|
||||
"from": [10.5, 6.5, 1.5],
|
||||
"to": [12.5, 9.5, 7],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [11.5, 1, 5]},
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [11.5, 1, 6]},
|
||||
"faces": {
|
||||
"north": {"uv": [3.5, 6.5, 5.5, 9.5], "texture": "#sh"},
|
||||
"east": {"uv": [9, 6.5, 15.5, 9.5], "texture": "#sh"},
|
||||
|
@ -310,9 +310,9 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"from": [10, 7, 0.5],
|
||||
"from": [10, 7, 1.5],
|
||||
"to": [10.5, 9, 7],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [9.5, 1, 5]},
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [9.5, 1, 6]},
|
||||
"faces": {
|
||||
"north": {"uv": [5.5, 7, 6, 9], "texture": "#sh"},
|
||||
"east": {"uv": [9, 7, 15.5, 9], "texture": "#sh"},
|
||||
|
@ -323,9 +323,9 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"from": [9.5, 6, -0.5],
|
||||
"to": [13.5, 10, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [19.5, 1, 6.5]},
|
||||
"from": [9.5, 6, 0.5],
|
||||
"to": [13.5, 10, 1.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [19.5, 1, 7.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [10, 12, 14, 16], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 6, 16, 10], "texture": "#sh"},
|
||||
|
@ -336,107 +336,107 @@
|
|||
}
|
||||
},
|
||||
{
|
||||
"from": [12.5, 9, -2],
|
||||
"to": [13.5, 10, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [20.5, 2, 5.5]},
|
||||
"from": [12.5, 9, 0],
|
||||
"to": [13.5, 10, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [20.5, 2, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [2.5, 6, 3.5, 7], "texture": "#sh"},
|
||||
"east": {"uv": [16, 6, 16, 7], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 6, 16, 7], "texture": "#sh"},
|
||||
"south": {"uv": [12.5, 6, 13.5, 7], "texture": "#sh"},
|
||||
"west": {"uv": [0, 6, 0, 7], "texture": "#sh"},
|
||||
"up": {"uv": [12.5, 0, 13.5, 0], "texture": "#sh"},
|
||||
"down": {"uv": [12.5, 16, 13.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 6, 0.5, 7], "texture": "#sh"},
|
||||
"up": {"uv": [12.5, 0, 13.5, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [12.5, 15.5, 13.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [11, 9.5, -2],
|
||||
"to": [12, 10.5, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [19, 2.5, 5.5]},
|
||||
"from": [11, 9.5, 0],
|
||||
"to": [12, 10.5, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [19, 2.5, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [4, 5.5, 5, 6.5], "texture": "#sh"},
|
||||
"east": {"uv": [16, 5.5, 16, 6.5], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 5.5, 16, 6.5], "texture": "#sh"},
|
||||
"south": {"uv": [11, 5.5, 12, 6.5], "texture": "#sh"},
|
||||
"west": {"uv": [0, 5.5, 0, 6.5], "texture": "#sh"},
|
||||
"up": {"uv": [11, 0, 12, 0], "texture": "#sh"},
|
||||
"down": {"uv": [11, 16, 12, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 5.5, 0.5, 6.5], "texture": "#sh"},
|
||||
"up": {"uv": [11, 0, 12, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [11, 15.5, 12, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [9.5, 9, -2],
|
||||
"to": [10.5, 10, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [17.5, 2, 5.5]},
|
||||
"from": [9.5, 9, 0],
|
||||
"to": [10.5, 10, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [17.5, 2, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [5.5, 6, 6.5, 7], "texture": "#sh"},
|
||||
"east": {"uv": [16, 6, 16, 7], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 6, 16, 7], "texture": "#sh"},
|
||||
"south": {"uv": [9.5, 6, 10.5, 7], "texture": "#sh"},
|
||||
"west": {"uv": [0, 6, 0, 7], "texture": "#sh"},
|
||||
"up": {"uv": [9.5, 0, 10.5, 0], "texture": "#sh"},
|
||||
"down": {"uv": [9.5, 16, 10.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 6, 0.5, 7], "texture": "#sh"},
|
||||
"up": {"uv": [9.5, 0, 10.5, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [9.5, 15.5, 10.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [9, 7.5, -2],
|
||||
"to": [10, 8.5, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [17, 0.5, 5.5]},
|
||||
"from": [9, 7.5, 0],
|
||||
"to": [10, 8.5, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [17, 0.5, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 7.5, 7, 8.5], "texture": "#sh"},
|
||||
"east": {"uv": [16, 7.5, 16, 8.5], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 7.5, 16, 8.5], "texture": "#sh"},
|
||||
"south": {"uv": [9, 7.5, 10, 8.5], "texture": "#sh"},
|
||||
"west": {"uv": [0, 7.5, 0, 8.5], "texture": "#sh"},
|
||||
"up": {"uv": [9, 0, 10, 0], "texture": "#sh"},
|
||||
"down": {"uv": [9, 16, 10, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 7.5, 0.5, 8.5], "texture": "#sh"},
|
||||
"up": {"uv": [9, 0, 10, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [9, 15.5, 10, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [9.5, 6, -2],
|
||||
"to": [10.5, 7, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [17.5, -1, 5.5]},
|
||||
"from": [9.5, 6, 0],
|
||||
"to": [10.5, 7, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [17.5, -1, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [5.5, 9, 6.5, 10], "texture": "#sh"},
|
||||
"east": {"uv": [16, 9, 16, 10], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 9, 16, 10], "texture": "#sh"},
|
||||
"south": {"uv": [9.5, 9, 10.5, 10], "texture": "#sh"},
|
||||
"west": {"uv": [0, 9, 0, 10], "texture": "#sh"},
|
||||
"up": {"uv": [9.5, 0, 10.5, 0], "texture": "#sh"},
|
||||
"down": {"uv": [9.5, 16, 10.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 9, 0.5, 10], "texture": "#sh"},
|
||||
"up": {"uv": [9.5, 0, 10.5, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [9.5, 15.5, 10.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [11, 5.5, -2],
|
||||
"to": [12, 6.5, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [19, -1.5, 5.5]},
|
||||
"from": [11, 5.5, 0],
|
||||
"to": [12, 6.5, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [19, -1.5, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [4, 9.5, 5, 10.5], "texture": "#sh"},
|
||||
"east": {"uv": [16, 9.5, 16, 10.5], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 9.5, 16, 10.5], "texture": "#sh"},
|
||||
"south": {"uv": [11, 9.5, 12, 10.5], "texture": "#sh"},
|
||||
"west": {"uv": [0, 9.5, 0, 10.5], "texture": "#sh"},
|
||||
"up": {"uv": [11, 0, 12, 0], "texture": "#sh"},
|
||||
"down": {"uv": [11, 16, 12, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 9.5, 0.5, 10.5], "texture": "#sh"},
|
||||
"up": {"uv": [11, 0, 12, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [11, 15.5, 12, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [12.5, 6, -2],
|
||||
"to": [13.5, 7, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [20.5, -1, 5.5]},
|
||||
"from": [12.5, 6, 0],
|
||||
"to": [13.5, 7, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [20.5, -1, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [2.5, 9, 3.5, 10], "texture": "#sh"},
|
||||
"east": {"uv": [16, 9, 16, 10], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 9, 16, 10], "texture": "#sh"},
|
||||
"south": {"uv": [12.5, 9, 13.5, 10], "texture": "#sh"},
|
||||
"west": {"uv": [0, 9, 0, 10], "texture": "#sh"},
|
||||
"up": {"uv": [12.5, 0, 13.5, 0], "texture": "#sh"},
|
||||
"down": {"uv": [12.5, 16, 13.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 9, 0.5, 10], "texture": "#sh"},
|
||||
"up": {"uv": [12.5, 0, 13.5, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [12.5, 15.5, 13.5, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [13, 7.5, -2],
|
||||
"to": [14, 8.5, -0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [21, 0.5, 5.5]},
|
||||
"from": [13, 7.5, 0],
|
||||
"to": [14, 8.5, 0.5],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [21, 0.5, 6.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [2, 7.5, 3, 8.5], "texture": "#sh"},
|
||||
"east": {"uv": [16, 7.5, 16, 8.5], "texture": "#sh"},
|
||||
"east": {"uv": [15.5, 7.5, 16, 8.5], "texture": "#sh"},
|
||||
"south": {"uv": [13, 7.5, 14, 8.5], "texture": "#sh"},
|
||||
"west": {"uv": [0, 7.5, 0, 8.5], "texture": "#sh"},
|
||||
"up": {"uv": [13, 0, 14, 0], "texture": "#sh"},
|
||||
"down": {"uv": [13, 16, 14, 16], "rotation": 270, "texture": "#sh"}
|
||||
"west": {"uv": [0, 7.5, 0.5, 8.5], "texture": "#sh"},
|
||||
"up": {"uv": [13, 0, 14, 0.5], "texture": "#sh"},
|
||||
"down": {"uv": [13, 15.5, 14, 16], "rotation": 270, "texture": "#sh"}
|
||||
}
|
||||
}
|
||||
],
|
||||
|
@ -447,7 +447,7 @@
|
|||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -0.75, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -282,7 +282,8 @@
|
|||
],
|
||||
"display": {
|
||||
"ground": {
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
"rotation": [30, 225, 0],
|
||||
|
|
|
@ -0,0 +1,273 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"textures": {
|
||||
"b": "engineersdecor:blocks/device/small_milking_machine_back",
|
||||
"particle": "engineersdecor:blocks/device/small_milking_machine_back",
|
||||
"tb": "engineersdecor:blocks/device/small_milking_machine_topbottom",
|
||||
"s": "engineersdecor:blocks/device/small_milking_machine_side",
|
||||
"f": "engineersdecor:blocks/device/small_milking_machine_front",
|
||||
"p": "engineersdecor:blocks/device/small_milking_machine_parts"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [0, 0, 0],
|
||||
"to": [16, 1, 13],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -2]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 15, 16, 16], "texture": "#b"},
|
||||
"east": {"uv": [3, 15, 16, 16], "texture": "#b"},
|
||||
"south": {"uv": [0, 15, 16, 16], "texture": "#b"},
|
||||
"west": {"uv": [0, 15, 13, 16], "texture": "#b"},
|
||||
"up": {"uv": [0, 0, 16, 13], "rotation": 180, "texture": "#tb"},
|
||||
"down": {"uv": [0, 3, 16, 16], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [0, 14, 0],
|
||||
"to": [16, 16, 13],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 23, -2]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 16, 2], "texture": "#b"},
|
||||
"east": {"uv": [3, 0, 16, 2], "texture": "#s"},
|
||||
"south": {"uv": [0, 0, 16, 2], "texture": "#s"},
|
||||
"west": {"uv": [0, 0, 13, 2], "texture": "#s"},
|
||||
"up": {"uv": [0, 3, 16, 16], "texture": "#tb"},
|
||||
"down": {"uv": [0, 0, 16, 13], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [0, 1, 1],
|
||||
"to": [1, 14, 11],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [5, 7.5, 5.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [15, 2, 16, 15], "texture": "#b"},
|
||||
"east": {"uv": [1, 2, 11, 15], "texture": "#b"},
|
||||
"south": {"uv": [0, 2, 1, 15], "texture": "#b"},
|
||||
"west": {"uv": [5, 2, 15, 15], "rotation": 180, "texture": "#s"},
|
||||
"up": {"uv": [0, 1, 1, 11], "texture": "#missing"},
|
||||
"down": {"uv": [0, 5, 1, 15], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [1, 1, 0],
|
||||
"to": [15, 14, 10],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 5.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [1, 2, 15, 15], "texture": "#b"},
|
||||
"east": {"uv": [6, 2, 16, 15], "texture": "#b"},
|
||||
"south": {"uv": [1, 2, 15, 15], "texture": "#f"},
|
||||
"west": {"uv": [0, 2, 10, 15], "texture": "#b"},
|
||||
"up": {"uv": [1, 0, 15, 10], "texture": "#missing"},
|
||||
"down": {"uv": [1, 6, 15, 16], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6, 1, 10],
|
||||
"to": [10, 14, 11],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [7, 7.5, 15.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 2, 10, 15], "texture": "#b"},
|
||||
"east": {"uv": [5, 2, 6, 15], "texture": "#s"},
|
||||
"south": {"uv": [6, 2, 10, 15], "texture": "#f"},
|
||||
"west": {"uv": [5, 2, 6, 15], "texture": "#s"},
|
||||
"up": {"uv": [6, 10, 10, 11], "texture": "#missing"},
|
||||
"down": {"uv": [6, 5, 10, 6], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [15, 1, 1],
|
||||
"to": [16, 14, 11],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [13.5, 7.5, 9]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 2, 1, 15], "texture": "#b"},
|
||||
"east": {"uv": [5, 2, 15, 15], "texture": "#s"},
|
||||
"south": {"uv": [15, 2, 16, 15], "texture": "#b"},
|
||||
"west": {"uv": [6, 2, 16, 15], "texture": "#b"},
|
||||
"up": {"uv": [15, 1, 16, 11], "texture": "#missing"},
|
||||
"down": {"uv": [15, 5, 16, 15], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [8.5, 10, 11],
|
||||
"to": [9.5, 13, 15],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8.5, 19, 9]},
|
||||
"faces": {
|
||||
"north": {"uv": [6.5, 3, 7.5, 6], "texture": "#b"},
|
||||
"east": {"uv": [12, 4, 16, 7], "texture": "#b"},
|
||||
"south": {"uv": [8.5, 3, 9.5, 6], "texture": "#f"},
|
||||
"west": {"uv": [11, 3, 15, 6], "texture": "#b"},
|
||||
"up": {"uv": [15, 7, 16, 11], "texture": "#tb"},
|
||||
"down": {"uv": [8.5, 1, 9.5, 5], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [8.5, 13, 11],
|
||||
"to": [9.5, 14, 14],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8.5, 20, 9]},
|
||||
"faces": {
|
||||
"north": {"uv": [6.5, 2, 7.5, 3], "texture": "#b"},
|
||||
"east": {"uv": [13, 5, 16, 6], "texture": "#b"},
|
||||
"south": {"uv": [8.5, 2, 9.5, 3], "texture": "#b"},
|
||||
"west": {"uv": [11, 2, 14, 3], "texture": "#b"},
|
||||
"up": {"uv": [15, 10, 16, 13], "texture": "#tb"},
|
||||
"down": {"uv": [8.5, 2, 9.5, 5], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6.5, 13, 11],
|
||||
"to": [7.5, 14, 14],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [6.5, 20, 9]},
|
||||
"faces": {
|
||||
"north": {"uv": [8.5, 2, 9.5, 3], "texture": "#b"},
|
||||
"east": {"uv": [2, 2, 5, 3], "texture": "#b"},
|
||||
"south": {"uv": [6.5, 2, 7.5, 3], "texture": "#b"},
|
||||
"west": {"uv": [13, 5, 16, 6], "texture": "#s"},
|
||||
"up": {"uv": [6.5, 11, 7.5, 14], "texture": "#tb"},
|
||||
"down": {"uv": [6.5, 2, 7.5, 5], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6.5, 10, 11],
|
||||
"to": [7.5, 13, 15],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [6.5, 19, 9]},
|
||||
"faces": {
|
||||
"north": {"uv": [8.5, 3, 9.5, 6], "texture": "#b"},
|
||||
"east": {"uv": [1, 3, 5, 6], "texture": "#b"},
|
||||
"south": {"uv": [6.5, 3, 7.5, 6], "texture": "#f"},
|
||||
"west": {"uv": [12, 6, 16, 9], "texture": "#s"},
|
||||
"up": {"uv": [6.5, 11, 7.5, 15], "texture": "#tb"},
|
||||
"down": {"uv": [6.5, 1, 7.5, 5], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [7.5, 10, 11],
|
||||
"to": [8.5, 13, 12],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [7.5, 3, 8.5, 6], "texture": "#p"},
|
||||
"east": {"uv": [4, 3, 5, 6], "texture": "#p"},
|
||||
"south": {"uv": [6, 1, 7, 4], "texture": "#p"},
|
||||
"west": {"uv": [11, 3, 12, 6], "texture": "#p"},
|
||||
"up": {"uv": [6, 11, 7, 12], "texture": "#p"},
|
||||
"down": {"uv": [7.5, 4, 8.5, 5], "texture": "#p"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [7.5, 5, 12],
|
||||
"to": [8.5, 12, 14],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 4, 7, 11], "rotation": 180, "texture": "#p"},
|
||||
"east": {"uv": [4, 4, 6, 11], "texture": "#p"},
|
||||
"south": {"uv": [7.5, 4, 8.5, 11], "texture": "#p"},
|
||||
"west": {"uv": [6, 4, 8, 11], "texture": "#p"},
|
||||
"up": {"uv": [6, 0, 7, 2], "rotation": 180, "texture": "#p"},
|
||||
"down": {"uv": [7.5, 2, 8.5, 4], "texture": "#p"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6.5, 2, 13],
|
||||
"to": [9.5, 5, 14],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [9, 10, 12, 13], "rotation": 180, "texture": "#p"},
|
||||
"east": {"uv": [10, 11, 11, 14], "texture": "#p"},
|
||||
"south": {"uv": [11, 12, 14, 15], "texture": "#p"},
|
||||
"west": {"uv": [12, 11, 13, 14], "texture": "#p"},
|
||||
"up": {"uv": [10, 11, 13, 12], "rotation": 180, "texture": "#p"},
|
||||
"down": {"uv": [11, 11, 14, 12], "texture": "#p"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [7.5, 3, 12],
|
||||
"to": [8.5, 5, 13],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [5, 11, 6, 13], "rotation": 180, "texture": "#p"},
|
||||
"east": {"uv": [5, 11, 6, 13], "texture": "#p"},
|
||||
"south": {"uv": [6.5, 11, 8.5, 13], "texture": "#p"},
|
||||
"west": {"uv": [12, 11, 13, 13], "texture": "#p"},
|
||||
"up": {"uv": [6.5, 12, 8.5, 13], "rotation": 180, "texture": "#p"},
|
||||
"down": {"uv": [5, 3, 6, 4], "texture": "#p"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6.5, 4, 14],
|
||||
"to": [7.5, 5, 15],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [9, 0, 10, 0], "rotation": 180, "texture": "#p"},
|
||||
"east": {"uv": [12, 10, 13, 11], "rotation": 270, "texture": "#p"},
|
||||
"south": {"uv": [10, 12, 11, 13], "texture": "#p"},
|
||||
"west": {"uv": [10, 11, 11, 12], "rotation": 90, "texture": "#p"},
|
||||
"up": {"uv": [6, 4, 7, 6], "rotation": 180, "texture": "#p"},
|
||||
"down": {"uv": [10, 11, 11, 12], "texture": "#p"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [8.5, 4, 14],
|
||||
"to": [9.5, 5, 15],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [11, 0, 12, 0], "rotation": 180, "texture": "#p"},
|
||||
"east": {"uv": [10, 14, 11, 15], "rotation": 270, "texture": "#p"},
|
||||
"south": {"uv": [11, 13, 12, 14], "texture": "#p"},
|
||||
"west": {"uv": [10, 10, 11, 11], "rotation": 90, "texture": "#p"},
|
||||
"up": {"uv": [11, 12, 12, 13], "rotation": 180, "texture": "#p"},
|
||||
"down": {"uv": [11, 12, 12, 13], "texture": "#p"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [8.5, 2, 14],
|
||||
"to": [9.5, 3, 15],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [11, 0, 12, 0], "rotation": 180, "texture": "#p"},
|
||||
"east": {"uv": [9, 12, 10, 13], "rotation": 270, "texture": "#p"},
|
||||
"south": {"uv": [13, 11, 14, 12], "texture": "#p"},
|
||||
"west": {"uv": [12, 13, 13, 14], "rotation": 90, "texture": "#p"},
|
||||
"up": {"uv": [6, 14, 7, 15], "rotation": 180, "texture": "#p"},
|
||||
"down": {"uv": [13, 12, 14, 13], "texture": "#p"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6.5, 2, 14],
|
||||
"to": [7.5, 3, 15],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [9, 0, 10, 0], "rotation": 180, "texture": "#p"},
|
||||
"east": {"uv": [13, 12, 14, 13], "rotation": 270, "texture": "#p"},
|
||||
"south": {"uv": [13, 13, 14, 14], "texture": "#p"},
|
||||
"west": {"uv": [10, 13, 11, 14], "rotation": 90, "texture": "#p"},
|
||||
"up": {"uv": [6, 4, 7, 6], "rotation": 180, "texture": "#p"},
|
||||
"down": {"uv": [9, 12, 10, 13], "texture": "#p"}
|
||||
}
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"thirdperson_righthand": {
|
||||
"rotation": [73, 180, 0],
|
||||
"translation": [0, -1.75, -1.5],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"firstperson_righthand": {
|
||||
"rotation": [18, 22, 0],
|
||||
"translation": [1.25, 0, 0],
|
||||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
"rotation": [30, 40, 0],
|
||||
"translation": [0.5, -0.25, 0],
|
||||
"scale": [0.625, 0.625, 0.625]
|
||||
},
|
||||
"fixed": {
|
||||
"rotation": [0, 180, 0],
|
||||
"translation": [0, 0, -3.25],
|
||||
"scale": [0.5, 0.5, 0.5]
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,273 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"textures": {
|
||||
"b": "engineersdecor:blocks/device/small_milking_machine_back",
|
||||
"particle": "engineersdecor:blocks/device/small_milking_machine_back",
|
||||
"tb": "engineersdecor:blocks/device/small_milking_machine_topbottom",
|
||||
"s": "engineersdecor:blocks/device/small_milking_machine_side",
|
||||
"f": "engineersdecor:blocks/device/small_milking_machine_front",
|
||||
"p": "engineersdecor:blocks/device/small_milking_machine_parts"
|
||||
},
|
||||
"elements": [
|
||||
{
|
||||
"from": [0, 0, 0],
|
||||
"to": [16, 1, 13],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -2]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 15, 16, 16], "texture": "#b"},
|
||||
"east": {"uv": [3, 15, 16, 16], "texture": "#b"},
|
||||
"south": {"uv": [0, 15, 16, 16], "texture": "#b"},
|
||||
"west": {"uv": [0, 15, 13, 16], "texture": "#b"},
|
||||
"up": {"uv": [0, 0, 16, 13], "rotation": 180, "texture": "#tb"},
|
||||
"down": {"uv": [0, 3, 16, 16], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [0, 14, 0],
|
||||
"to": [16, 16, 13],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 23, -2]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 16, 2], "texture": "#b"},
|
||||
"east": {"uv": [3, 0, 16, 2], "texture": "#s"},
|
||||
"south": {"uv": [0, 0, 16, 2], "texture": "#s"},
|
||||
"west": {"uv": [0, 0, 13, 2], "texture": "#s"},
|
||||
"up": {"uv": [0, 3, 16, 16], "texture": "#tb"},
|
||||
"down": {"uv": [0, 0, 16, 13], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [0, 1, 1],
|
||||
"to": [1, 14, 11],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [5, 7.5, 5.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [15, 2, 16, 15], "texture": "#b"},
|
||||
"east": {"uv": [1, 2, 11, 15], "texture": "#b"},
|
||||
"south": {"uv": [0, 2, 1, 15], "texture": "#b"},
|
||||
"west": {"uv": [5, 2, 15, 15], "rotation": 180, "texture": "#s"},
|
||||
"up": {"uv": [0, 1, 1, 11], "texture": "#missing"},
|
||||
"down": {"uv": [0, 5, 1, 15], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [1, 1, 0],
|
||||
"to": [15, 14, 10],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 5.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [1, 2, 15, 15], "texture": "#b"},
|
||||
"east": {"uv": [6, 2, 16, 15], "texture": "#b"},
|
||||
"south": {"uv": [1, 2, 15, 15], "texture": "#f"},
|
||||
"west": {"uv": [0, 2, 10, 15], "texture": "#b"},
|
||||
"up": {"uv": [1, 0, 15, 10], "texture": "#missing"},
|
||||
"down": {"uv": [1, 6, 15, 16], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6, 1, 10],
|
||||
"to": [10, 14, 11],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [7, 7.5, 15.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 2, 10, 15], "texture": "#b"},
|
||||
"east": {"uv": [5, 2, 6, 15], "texture": "#s"},
|
||||
"south": {"uv": [6, 2, 10, 15], "texture": "#f"},
|
||||
"west": {"uv": [5, 2, 6, 15], "texture": "#s"},
|
||||
"up": {"uv": [6, 10, 10, 11], "texture": "#missing"},
|
||||
"down": {"uv": [6, 5, 10, 6], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [15, 1, 1],
|
||||
"to": [16, 14, 11],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [13.5, 7.5, 9]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 2, 1, 15], "texture": "#b"},
|
||||
"east": {"uv": [5, 2, 15, 15], "texture": "#s"},
|
||||
"south": {"uv": [15, 2, 16, 15], "texture": "#b"},
|
||||
"west": {"uv": [6, 2, 16, 15], "texture": "#b"},
|
||||
"up": {"uv": [15, 1, 16, 11], "texture": "#missing"},
|
||||
"down": {"uv": [15, 5, 16, 15], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [8.5, 10, 11],
|
||||
"to": [9.5, 13, 15],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8.5, 19, 9]},
|
||||
"faces": {
|
||||
"north": {"uv": [6.5, 3, 7.5, 6], "texture": "#b"},
|
||||
"east": {"uv": [12, 4, 16, 7], "texture": "#b"},
|
||||
"south": {"uv": [8.5, 3, 9.5, 6], "texture": "#f"},
|
||||
"west": {"uv": [11, 3, 15, 6], "texture": "#b"},
|
||||
"up": {"uv": [15, 7, 16, 11], "texture": "#tb"},
|
||||
"down": {"uv": [8.5, 1, 9.5, 5], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [8.5, 13, 11],
|
||||
"to": [9.5, 14, 14],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8.5, 20, 9]},
|
||||
"faces": {
|
||||
"north": {"uv": [6.5, 2, 7.5, 3], "texture": "#b"},
|
||||
"east": {"uv": [13, 5, 16, 6], "texture": "#b"},
|
||||
"south": {"uv": [8.5, 2, 9.5, 3], "texture": "#b"},
|
||||
"west": {"uv": [11, 2, 14, 3], "texture": "#b"},
|
||||
"up": {"uv": [15, 10, 16, 13], "texture": "#tb"},
|
||||
"down": {"uv": [8.5, 2, 9.5, 5], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6.5, 13, 11],
|
||||
"to": [7.5, 14, 14],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [6.5, 20, 9]},
|
||||
"faces": {
|
||||
"north": {"uv": [8.5, 2, 9.5, 3], "texture": "#b"},
|
||||
"east": {"uv": [2, 2, 5, 3], "texture": "#b"},
|
||||
"south": {"uv": [6.5, 2, 7.5, 3], "texture": "#b"},
|
||||
"west": {"uv": [13, 5, 16, 6], "texture": "#s"},
|
||||
"up": {"uv": [6.5, 11, 7.5, 14], "texture": "#tb"},
|
||||
"down": {"uv": [6.5, 2, 7.5, 5], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6.5, 10, 11],
|
||||
"to": [7.5, 13, 15],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [6.5, 19, 9]},
|
||||
"faces": {
|
||||
"north": {"uv": [8.5, 3, 9.5, 6], "texture": "#b"},
|
||||
"east": {"uv": [1, 3, 5, 6], "texture": "#b"},
|
||||
"south": {"uv": [6.5, 3, 7.5, 6], "texture": "#f"},
|
||||
"west": {"uv": [12, 6, 16, 9], "texture": "#s"},
|
||||
"up": {"uv": [6.5, 11, 7.5, 15], "texture": "#tb"},
|
||||
"down": {"uv": [6.5, 1, 7.5, 5], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [7.5, 10, 11],
|
||||
"to": [8.5, 13, 12],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [7.5, 3, 8.5, 6], "texture": "#p"},
|
||||
"east": {"uv": [4, 3, 5, 6], "texture": "#p"},
|
||||
"south": {"uv": [6, 1, 7, 4], "texture": "#p"},
|
||||
"west": {"uv": [11, 3, 12, 6], "texture": "#p"},
|
||||
"up": {"uv": [6, 11, 7, 12], "texture": "#p"},
|
||||
"down": {"uv": [7.5, 4, 8.5, 5], "texture": "#p"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [7.5, 11, 13],
|
||||
"to": [8.5, 13, 20],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 0, 7, 2], "texture": "#p"},
|
||||
"east": {"uv": [4, 4, 6, 11], "rotation": 90, "texture": "#p"},
|
||||
"south": {"uv": [7.5, 2, 8.5, 4], "texture": "#p"},
|
||||
"west": {"uv": [6, 4, 8, 11], "rotation": 270, "texture": "#p"},
|
||||
"up": {"uv": [7.5, 4, 8.5, 11], "texture": "#p"},
|
||||
"down": {"uv": [6, 4, 7, 11], "texture": "#p"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6.5, 12, 20],
|
||||
"to": [9.5, 13, 23],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [10, 11, 13, 12], "texture": "#p"},
|
||||
"east": {"uv": [10, 11, 11, 14], "rotation": 90, "texture": "#p"},
|
||||
"south": {"uv": [11, 11, 14, 12], "texture": "#p"},
|
||||
"west": {"uv": [12, 11, 13, 14], "rotation": 270, "texture": "#p"},
|
||||
"up": {"uv": [11, 12, 14, 15], "texture": "#p"},
|
||||
"down": {"uv": [9, 10, 12, 13], "texture": "#p"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [7.5, 11, 20],
|
||||
"to": [8.5, 12, 22],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [6.5, 12, 8.5, 13], "texture": "#p"},
|
||||
"east": {"uv": [5, 11, 6, 13], "rotation": 90, "texture": "#p"},
|
||||
"south": {"uv": [5, 3, 6, 4], "texture": "#p"},
|
||||
"west": {"uv": [12, 11, 13, 13], "rotation": 270, "texture": "#p"},
|
||||
"up": {"uv": [6.5, 11, 8.5, 13], "texture": "#p"},
|
||||
"down": {"uv": [5, 11, 6, 13], "texture": "#p"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6.5, 13, 20],
|
||||
"to": [7.5, 14, 21],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 4, 7, 6], "texture": "#p"},
|
||||
"east": {"uv": [12, 10, 13, 11], "texture": "#p"},
|
||||
"south": {"uv": [10, 11, 11, 12], "texture": "#p"},
|
||||
"west": {"uv": [10, 11, 11, 12], "texture": "#p"},
|
||||
"up": {"uv": [10, 12, 11, 13], "texture": "#p"},
|
||||
"down": {"uv": [9, 0, 10, 0], "texture": "#p"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [8.5, 13, 20],
|
||||
"to": [9.5, 14, 21],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [11, 12, 12, 13], "texture": "#p"},
|
||||
"east": {"uv": [10, 14, 11, 15], "texture": "#p"},
|
||||
"south": {"uv": [11, 12, 12, 13], "texture": "#p"},
|
||||
"west": {"uv": [10, 10, 11, 11], "texture": "#p"},
|
||||
"up": {"uv": [11, 13, 12, 14], "texture": "#p"},
|
||||
"down": {"uv": [11, 0, 12, 0], "texture": "#p"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [8.5, 13, 22],
|
||||
"to": [9.5, 14, 23],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 14, 7, 15], "texture": "#p"},
|
||||
"east": {"uv": [9, 12, 10, 13], "texture": "#p"},
|
||||
"south": {"uv": [13, 12, 14, 13], "texture": "#p"},
|
||||
"west": {"uv": [12, 13, 13, 14], "texture": "#p"},
|
||||
"up": {"uv": [13, 11, 14, 12], "texture": "#p"},
|
||||
"down": {"uv": [11, 0, 12, 0], "texture": "#p"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6.5, 13, 22],
|
||||
"to": [7.5, 14, 23],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 4, 7, 6], "texture": "#p"},
|
||||
"east": {"uv": [13, 12, 14, 13], "texture": "#p"},
|
||||
"south": {"uv": [9, 12, 10, 13], "texture": "#p"},
|
||||
"west": {"uv": [10, 13, 11, 14], "texture": "#p"},
|
||||
"up": {"uv": [13, 13, 14, 14], "texture": "#p"},
|
||||
"down": {"uv": [9, 0, 10, 0], "texture": "#p"}
|
||||
}
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"thirdperson_righthand": {
|
||||
"rotation": [73, 180, 0],
|
||||
"translation": [0, -1.75, -1.5],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"firstperson_righthand": {
|
||||
"rotation": [18, 22, 0],
|
||||
"translation": [1.25, 0, 0],
|
||||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
"rotation": [30, 40, 0],
|
||||
"translation": [0.5, -0.25, 0],
|
||||
"scale": [0.625, 0.625, 0.625]
|
||||
},
|
||||
"fixed": {
|
||||
"rotation": [0, 180, 0],
|
||||
"translation": [0, 0, -3.25],
|
||||
"scale": [0.5, 0.5, 0.5]
|
||||
}
|
||||
}
|
||||
}
|
|
@ -182,7 +182,7 @@
|
|||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -0.75, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -182,7 +182,7 @@
|
|||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -0.75, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -182,7 +182,7 @@
|
|||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -0.75, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -182,7 +182,7 @@
|
|||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -0.75, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -182,7 +182,7 @@
|
|||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -0.75, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -208,7 +208,7 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -1.25, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -207,7 +207,7 @@
|
|||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -0.75, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -94,6 +94,7 @@
|
|||
],
|
||||
"display": {
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -179,6 +179,7 @@
|
|||
],
|
||||
"display": {
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -93,6 +93,7 @@
|
|||
],
|
||||
"display": {
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
],
|
||||
"display": {
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -174,6 +174,7 @@
|
|||
],
|
||||
"display": {
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
],
|
||||
"display": {
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -370,6 +370,7 @@
|
|||
],
|
||||
"display": {
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -193,6 +193,7 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -138,6 +138,7 @@
|
|||
"rotation": [-3, 18, 0]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -176,6 +176,7 @@
|
|||
],
|
||||
"display": {
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
],
|
||||
"display": {
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -98,6 +98,7 @@
|
|||
"scale": [0.5, 0.5, 0.5]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -74,6 +74,7 @@
|
|||
"scale": [0.5, 0.5, 0.5]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
"scale": [0.5, 0.5, 0.5]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, -4.25, 0],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.3, 0.3, 0.3]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
],
|
||||
"display": {
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -49,6 +49,7 @@
|
|||
],
|
||||
"display": {
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -49,6 +49,7 @@
|
|||
],
|
||||
"display": {
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -157,6 +157,7 @@
|
|||
"scale": [0.36, 0.36, 0.36]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -157,6 +157,7 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -85,6 +85,7 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -76,7 +76,7 @@
|
|||
"translation": [-3, -0.75, 1.25]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 2.5, 6],
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.7, 0.7, 0.7]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -122,7 +122,7 @@
|
|||
"translation": [-3, -0.75, 1.25]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 0, 6],
|
||||
"translation": [0, 0.5, 6],
|
||||
"scale": [0.7, 0.7, 0.7]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -74,6 +74,7 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -107,6 +107,7 @@
|
|||
"scale": [0.5, 0.5, 0.5]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -48,6 +48,7 @@
|
|||
"scale": [0.5, 0.5, 0.5]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -130,6 +130,7 @@
|
|||
"scale": [0.5, 0.5, 0.5]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -105,6 +105,7 @@
|
|||
"scale": [0.45, 0.45, 0.45]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -62,6 +62,7 @@
|
|||
"scale": [0.5, 0.5, 0.5]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -114,6 +114,7 @@
|
|||
"scale": [0.5, 0.5, 0.5]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -58,6 +58,7 @@
|
|||
"scale": [0.5, 0.5, 0.5]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 0, 2.5],
|
||||
"translation": [0, 1.75, 2.5],
|
||||
"scale": [0.3, 0.3, 0.3]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 0, 7],
|
||||
"translation": [0, 0.3, 7],
|
||||
"scale": [0.7, 0.7, 0.7]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -31,8 +31,8 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 0, 7],
|
||||
"scale": [0.7, 0.7, 0.7]
|
||||
"translation": [0, 1.5, 2.75],
|
||||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"gui": {
|
||||
"translation": [0, 0.5, 0]
|
||||
|
|
|
@ -187,7 +187,7 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 0, 2.75],
|
||||
"translation": [0, 1.5, 2.75],
|
||||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
"scale": [0.4, 0.4, 0.4]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -188,6 +188,7 @@
|
|||
"scale": [0.35, 0.35, 0.35]
|
||||
},
|
||||
"ground": {
|
||||
"translation": [0, 1.75, 0],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"gui": {
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "engineersdecor:grc",
|
||||
"result": "engineersdecor:gas_concrete",
|
||||
"missing": ["immersiveengineering:stone_decoration"]
|
||||
}
|
||||
],
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
"SC",
|
||||
"CS"
|
||||
],
|
||||
"key": {
|
||||
"C": {
|
||||
"item": "#blockConcreteMc",
|
||||
"data": 0
|
||||
},
|
||||
"S": {
|
||||
"item": "#sand",
|
||||
"data": 0
|
||||
}
|
||||
},
|
||||
"result": {
|
||||
"item": "engineersdecor:gas_concrete",
|
||||
"count": 4
|
||||
}
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
"type": "engineersdecor:grc",
|
||||
"result": "engineersdecor:passive_fluid_accumulator",
|
||||
"required": ["engineersdecor:straight_pipe_valve"],
|
||||
"missing": ["immersiveengineering:fluid_pipe", "immersiveengineering:mechanical_component"]
|
||||
"missing": ["immersiveengineering:material"]
|
||||
}
|
||||
],
|
||||
"type": "minecraft:crafting_shaped",
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
},
|
||||
"result": {
|
||||
"item": "engineersdecor:slag_brick_block",
|
||||
"count": 4
|
||||
"count": 8
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "engineersdecor:grc",
|
||||
"result": "engineersdecor:small_milking_machine",
|
||||
"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:milk_bucket",
|
||||
"data": 0
|
||||
},
|
||||
"R": {
|
||||
"item": "minecraft:redstone_block",
|
||||
"data": 0
|
||||
}
|
||||
},
|
||||
"result": {
|
||||
"item": "engineersdecor:small_milking_machine",
|
||||
"count": 1
|
||||
}
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
"type": "engineersdecor:grc",
|
||||
"result": "engineersdecor:straight_pipe_valve",
|
||||
"required": ["engineersdecor:thick_steel_pole"],
|
||||
"missing": ["immersiveengineering:fluid_pipe", "immersiveengineering:mechanical_component"]
|
||||
"missing": ["immersiveengineering:material"]
|
||||
}
|
||||
],
|
||||
"type": "minecraft:crafting_shaped",
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "engineersdecor:grc",
|
||||
"result": "engineersdecor:gas_concrete",
|
||||
"required": ["immersiveengineering:stone_decoration"]
|
||||
}
|
||||
],
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
"SC",
|
||||
"CS"
|
||||
],
|
||||
"key": {
|
||||
"C": {
|
||||
"item": "#blockConcreteIe",
|
||||
"data": 0
|
||||
},
|
||||
"S": {
|
||||
"item": "#sand",
|
||||
"data": 0
|
||||
}
|
||||
},
|
||||
"result": {
|
||||
"item": "engineersdecor:gas_concrete",
|
||||
"count": 4
|
||||
}
|
||||
}
|
|
@ -24,6 +24,6 @@
|
|||
},
|
||||
"result": {
|
||||
"item": "engineersdecor:slag_brick_block",
|
||||
"count": 4
|
||||
"count": 8
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "engineersdecor:grc",
|
||||
"result": "engineersdecor:small_milking_machine",
|
||||
"required": ["immersiveengineering:material"]
|
||||
}
|
||||
],
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
"PPP",
|
||||
"PAO",
|
||||
"CBC"
|
||||
],
|
||||
"key": {
|
||||
"O": {
|
||||
"item": "minecraft:observer",
|
||||
"data": 0
|
||||
},
|
||||
"P": {
|
||||
"item": "#plateAnyFerroMetal",
|
||||
"data": 0
|
||||
},
|
||||
"A": {
|
||||
"item": "minecraft:milk_bucket",
|
||||
"data": 0
|
||||
},
|
||||
"B": {
|
||||
"item": "#itemSteelBarrel",
|
||||
"data": 0
|
||||
},
|
||||
"C": {
|
||||
"item": "#anyMechanicalComponent",
|
||||
"data": 0
|
||||
}
|
||||
},
|
||||
"result": {
|
||||
"item": "engineersdecor:small_milking_machine",
|
||||
"count": 1
|
||||
}
|
||||
}
|
|
@ -23,6 +23,6 @@
|
|||
},
|
||||
"result": {
|
||||
"item": "engineersdecor:clinker_brick_block",
|
||||
"count": 4
|
||||
"count": 8
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "engineersdecor:grc",
|
||||
"result": "engineersdecor:gas_concrete_slab",
|
||||
"required": ["engineersdecor:gas_concrete"]
|
||||
}
|
||||
],
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
" ",
|
||||
"BBB"
|
||||
],
|
||||
"key": {
|
||||
"B": { "item": "engineersdecor:gas_concrete" }
|
||||
},
|
||||
"result": {
|
||||
"item": "engineersdecor:gas_concrete_slab",
|
||||
"count": 6
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "engineersdecor:grc",
|
||||
"result": "engineersdecor:gas_concrete_stairs",
|
||||
"required": ["engineersdecor:gas_concrete"]
|
||||
}
|
||||
],
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
"C ",
|
||||
"CC ",
|
||||
"CCC"
|
||||
],
|
||||
"key": {
|
||||
"C": {
|
||||
"item": "engineersdecor:gas_concrete",
|
||||
"data": 0
|
||||
}
|
||||
},
|
||||
"result": {
|
||||
"item": "engineersdecor:gas_concrete_stairs",
|
||||
"count": 6
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "engineersdecor:grc",
|
||||
"result": "engineersdecor:gas_concrete",
|
||||
"required": ["engineersdecor:gas_concrete_stairs"]
|
||||
}
|
||||
],
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
"SS",
|
||||
"SS"
|
||||
],
|
||||
"key": {
|
||||
"S": {
|
||||
"item": "engineersdecor:gas_concrete_stairs",
|
||||
"data": 0
|
||||
}
|
||||
},
|
||||
"result": {
|
||||
"item": "engineersdecor:gas_concrete",
|
||||
"count": 4
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "engineersdecor:grc",
|
||||
"result": "engineersdecor:gas_concrete_wall",
|
||||
"required": ["engineersdecor:gas_concrete"]
|
||||
}
|
||||
],
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
"CCC",
|
||||
"CCC"
|
||||
],
|
||||
"key": {
|
||||
"C": {
|
||||
"item": "engineersdecor:gas_concrete",
|
||||
"data": 0
|
||||
}
|
||||
},
|
||||
"result": {
|
||||
"item": "engineersdecor:gas_concrete_wall",
|
||||
"count": 6
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "engineersdecor:grc",
|
||||
"result": "engineersdecor:gas_concrete",
|
||||
"required": ["engineersdecor:gas_concrete_wall"]
|
||||
}
|
||||
],
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
"WW",
|
||||
"WW"
|
||||
],
|
||||
"key": {
|
||||
"W": {
|
||||
"item": "engineersdecor:gas_concrete_wall",
|
||||
"data": 0
|
||||
}
|
||||
},
|
||||
"result": {
|
||||
"item": "engineersdecor:gas_concrete",
|
||||
"count": 4
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "engineersdecor:grc",
|
||||
"result": "engineersdecor:halfslab_gas_concrete",
|
||||
"required": ["engineersdecor:gas_concrete_slab"]
|
||||
}
|
||||
],
|
||||
"type": "minecraft:crafting_shaped",
|
||||
"pattern": [
|
||||
"SS",
|
||||
"SS"
|
||||
],
|
||||
"key": {
|
||||
"S": { "item": "engineersdecor:gas_concrete_slab" }
|
||||
},
|
||||
"result": {
|
||||
"item": "engineersdecor:halfslab_gas_concrete",
|
||||
"count": 16
|
||||
}
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 654 B |
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue