Increased slag brick recipe yield. Block Placer can plant Cocoa. Placer seed detection fixed (issue #64). Alternative fluid accumulator recipe enabling fixed. Small Solar Panel peak power decreased (too much compared to Thermo-electric Generator).
|
@ -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.16-b2
|
||||
version_engineersdecor=1.0.16-b3
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
{
|
||||
"homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
|
||||
"1.12.2": {
|
||||
"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).",
|
||||
|
@ -68,6 +69,6 @@
|
|||
},
|
||||
"promos": {
|
||||
"1.12.2-recommended": "1.0.15",
|
||||
"1.12.2-latest": "1.0.16-b2"
|
||||
"1.12.2-latest": "1.0.16-b3"
|
||||
}
|
||||
}
|
|
@ -10,6 +10,14 @@ Mod sources for Minecraft version 1.12.2.
|
|||
----
|
||||
## Version history
|
||||
|
||||
- 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.
|
||||
|
|
|
@ -8,9 +8,6 @@
|
|||
*/
|
||||
package wile.engineersdecor.blocks;
|
||||
|
||||
import net.minecraft.block.BlockChest;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.tileentity.TileEntityChest;
|
||||
import wile.engineersdecor.ModEngineersDecor;
|
||||
import net.minecraft.entity.passive.EntityCow;
|
||||
import net.minecraft.init.SoundEvents;
|
||||
|
@ -31,10 +28,10 @@ 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.minecraft.util.*;
|
||||
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.energy.CapabilityEnergy;
|
||||
|
@ -42,6 +39,7 @@ 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;
|
||||
|
@ -49,11 +47,15 @@ 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.List;
|
||||
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
|
||||
|
@ -61,7 +63,6 @@ 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);
|
||||
|
@ -144,15 +145,15 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
BTileEntity te = getTe(world, pos);
|
||||
if(te==null) return true;
|
||||
final ItemStack in_stack = player.getHeldItem(hand);
|
||||
final ItemStack out_stack = te.milk_filled_container_item(in_stack);
|
||||
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() >= 1000) {
|
||||
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(1000);
|
||||
te.drain(BTileEntity.BUCKET_SIZE);
|
||||
in_stack.shrink(1);
|
||||
drained = true;
|
||||
if(remainder.getCount() > 0) {
|
||||
|
@ -180,18 +181,20 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
|
||||
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 = 10;
|
||||
public static final int TANK_CAPACITY = 12000;
|
||||
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 = 16;
|
||||
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 static final ItemStack BUCKET_STACK = new ItemStack(Items.BUCKET);
|
||||
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_;
|
||||
|
@ -202,10 +205,22 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
private int state_timer_ = 0;
|
||||
private BlockPos tracked_cow_original_position_ = null;
|
||||
|
||||
public static void on_config(int energy_consumption_per_tick, int heatup_per_second)
|
||||
public static void on_config(int energy_consumption_per_tick)
|
||||
{
|
||||
energy_consumption = MathHelper.clamp(energy_consumption_per_tick, 0, 4096);
|
||||
ModEngineersDecor.logger.info("Config milker energy consumption:" + energy_consumption + "rf/t");
|
||||
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()
|
||||
|
@ -250,7 +265,7 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
{ return MathHelper.clamp(tank_level_, 0, TANK_CAPACITY); }
|
||||
|
||||
private void drain(int amount)
|
||||
{ tank_level_ = MathHelper.clamp(tank_level_-1000, 0, TANK_CAPACITY); markDirty(); }
|
||||
{ tank_level_ = MathHelper.clamp(tank_level_-BUCKET_SIZE, 0, TANK_CAPACITY); markDirty(); }
|
||||
|
||||
// TileEntity ------------------------------------------------------------------------------
|
||||
|
||||
|
@ -356,41 +371,39 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
// ITickable ------------------------------------------------------------------------------------
|
||||
|
||||
private void log(String s)
|
||||
{} // may be enabled with config
|
||||
{} // may be enabled with config, for dev was println
|
||||
|
||||
private ItemStack milk_filled_container_item(ItemStack stack)
|
||||
{
|
||||
// Returns out stack for input stack size == 1 (convert one item of the stack).
|
||||
if(stack.isItemEqualIgnoreDurability(BTileEntity.BUCKET_STACK)) return new ItemStack(Items.MILK_BUCKET);
|
||||
if((ExtItems.BOTTLED_MILK_BOTTLE_DRINKLABLE!=null) && stack.getItem().equals(Items.GLASS_BOTTLE)) return new ItemStack(ExtItems.BOTTLED_MILK_BOTTLE_DRINKLABLE);
|
||||
return ItemStack.EMPTY;
|
||||
}
|
||||
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 if possible, otherwise sort back into same inventory.
|
||||
IInventory src, dst;
|
||||
{
|
||||
TileEntity te_src = world.getTileEntity(pos.offset(block_facing));
|
||||
TileEntity te_dst = world.getTileEntity(pos.down());
|
||||
if(!(te_src instanceof IInventory)) te_src = null;
|
||||
if(!(te_dst instanceof IInventory)) te_dst = null;
|
||||
if((te_src==null)) te_src = te_dst;
|
||||
if((te_dst==null)) te_dst = te_src;
|
||||
if((te_src==null) || (te_dst==null)) return;
|
||||
src = (IInventory)te_src;
|
||||
dst = (IInventory)te_dst;
|
||||
// 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;
|
||||
}
|
||||
|
||||
/// @todo --> hier weitermachen
|
||||
}
|
||||
|
||||
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;
|
||||
{
|
||||
final List<EntityCow> cows = world.getEntitiesWithinAABB(EntityCow.class, new AxisAlignedBB(pos).grow(16, 3, 16),
|
||||
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) {
|
||||
|
@ -403,42 +416,43 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
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
|
||||
final EnumFacing facing = world.getBlockState(getPos()).getValue(FACING).getOpposite();
|
||||
tick_timer_ = PROCESSING_TICK_INTERVAL;
|
||||
state_timer_ -= PROCESSING_TICK_INTERVAL;
|
||||
if(state_timer_ > 0) return false;
|
||||
switch(state_) {
|
||||
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).grow(1, 2, 1));
|
||||
if(blocking_entities.size() > 0) return false; // an entity is blocking the way
|
||||
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 true;
|
||||
return false;
|
||||
}
|
||||
case PICKED: {
|
||||
if(cow.hasPath()) return true;
|
||||
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 true;
|
||||
return false;
|
||||
}
|
||||
case COMING: {
|
||||
BlockPos p = getPos().offset(facing).offset(facing.rotateY());
|
||||
if(cow.getPosition().distanceSq(p) > 1) {
|
||||
if(cow.hasPath()) return true;
|
||||
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;
|
||||
|
@ -448,22 +462,24 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
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 true;
|
||||
return false;
|
||||
}
|
||||
case POSITIONING: {
|
||||
BlockPos p = getPos().offset(facing);
|
||||
if(cow.getPosition().distanceSq(p) > 0) {
|
||||
if(cow.hasPath()) return true;
|
||||
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_ -= 200;
|
||||
state_timeout_ -= 25;
|
||||
}
|
||||
tracked_cow_ = null;
|
||||
return false;
|
||||
|
@ -475,10 +491,10 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
state_ = MilkingState.MILKING;
|
||||
state_timer_ = 30;
|
||||
log("Positioning: start milking");
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
case MILKING: {
|
||||
tank_level_ = MathHelper.clamp(tank_level_+1000, 0, TANK_CAPACITY);
|
||||
tank_level_ = MathHelper.clamp(tank_level_+BUCKET_SIZE, 0, TANK_CAPACITY);
|
||||
state_timeout_ = 600;
|
||||
state_ = MilkingState.LEAVING;
|
||||
state_timer_ = 20;
|
||||
|
@ -493,15 +509,18 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
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:
|
||||
default: {
|
||||
tracked_cow_ = null;
|
||||
}
|
||||
}
|
||||
return (tracked_cow_ != null);
|
||||
}
|
||||
|
@ -513,16 +532,20 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
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() >= 1000)) {
|
||||
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 = 1000;
|
||||
int nfilled = MathHelper.clamp(fh.fill(fs, true), 0, 1000);
|
||||
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;
|
||||
|
@ -531,11 +554,11 @@ public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
|||
}
|
||||
}
|
||||
// Adjacent inventory update, only done just after milking to prevent waste of server cpu.
|
||||
if(dirty && (fluid_level() >= 1000)) {
|
||||
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()>0).withProperty(ACTIVE, state_==MilkingState.MILKING);
|
||||
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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
@ -46,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
|
||||
|
@ -339,13 +341,14 @@ 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;
|
||||
|
@ -354,9 +357,21 @@ public class BlockDecorPlacer extends BlockDecorDirected
|
|||
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()
|
||||
|
@ -589,29 +604,47 @@ public class BlockDecorPlacer extends BlockDecorDirected
|
|||
|
||||
private static boolean place_item(ItemStack stack, EntityPlayer placer, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
|
||||
{
|
||||
if((stack.isEmpty()) || (!(stack.getItem() instanceof ItemBlock))) return false;
|
||||
ItemBlock item = (ItemBlock)(stack.getItem());
|
||||
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(item.getBlock(), pos, true, facing, (Entity)null)) return false;
|
||||
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;
|
||||
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 block)
|
||||
private boolean try_plant(BlockPos pos, final EnumFacing facing, final ItemStack stack, final Block plant_block)
|
||||
{
|
||||
Item item = stack.getItem();
|
||||
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(!soilstate.getBlock().canSustainPlant(soilstate, world, pos.down(), EnumFacing.UP, (IPlantable)block)) {
|
||||
if((block instanceof IPlantable) && (!soilstate.getBlock().canSustainPlant(soilstate, world, pos.down(), EnumFacing.UP, (IPlantable)block))) {
|
||||
// Not the right soil for this plant.
|
||||
return spit_out(facing);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// adjacent block is the soil, plant above if the soil is valid.
|
||||
|
@ -622,9 +655,9 @@ public class BlockDecorPlacer extends BlockDecorDirected
|
|||
} 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(!soilstate.getBlock().canSustainPlant(soilstate, world, pos, EnumFacing.UP, (IPlantable)block)) {
|
||||
} 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 spit_out(facing);
|
||||
return false;
|
||||
} else {
|
||||
// Ok, plant above.
|
||||
pos = pos.up();
|
||||
|
@ -658,39 +691,54 @@ public class BlockDecorPlacer extends BlockDecorDirected
|
|||
}
|
||||
if(current_stack.isEmpty()) { current_slot_index_ = 0; return false; }
|
||||
final Item item = current_stack.getItem();
|
||||
final Block block = Block.getBlockFromItem(item);
|
||||
if(block == Blocks.AIR) return (item!=null) && spit_out(facing); // Item not accepted
|
||||
if(world.getEntitiesWithinAABB(EntityLivingBase.class, new AxisAlignedBB(placement_pos)).size() > 0) {
|
||||
return false;
|
||||
}
|
||||
if((block instanceof IPlantable) || (item instanceof IPlantable)) try_plant(placement_pos, facing, current_stack, block);
|
||||
|
||||
if(world.getBlockState(placement_pos).getBlock().isReplaceable(world, placement_pos)) {
|
||||
if(item instanceof ItemBlock) {
|
||||
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 spit_out(facing);
|
||||
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.
|
||||
ModEngineersDecor.logger.error("Exception while trying to place " + e);
|
||||
world.setBlockToAir(placement_pos);
|
||||
return spit_out(facing);
|
||||
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) {
|
||||
// Check special stuff that is not detected otherwise (like coco, which is technically dye)
|
||||
try {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// No idea if this is a particulary good idea, as getBlockFromITem
|
||||
//println("SPIT NON ITEMBLOCK" + current_stack + " --> " + block + " at " + placement_pos.subtract(pos) + "( item=" + item + ")");
|
||||
return spit_out(facing);
|
||||
} catch(Throwable e) {
|
||||
ModEngineersDecor.logger.error("Exception while trying to place " + e);
|
||||
world.setBlockToAir(placement_pos);
|
||||
}
|
||||
return spit_out(facing);
|
||||
}
|
||||
return false;
|
||||
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 true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -715,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 };
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -21,6 +21,7 @@ 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;
|
||||
|
@ -434,6 +435,16 @@ public class ModConfig
|
|||
})
|
||||
@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")
|
||||
|
@ -450,11 +461,14 @@ 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>();
|
||||
|
@ -549,19 +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);
|
||||
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);
|
||||
{
|
||||
optout.includes = optout.includes.toLowerCase().replaceAll(ModEngineersDecor.MODID+":", "").replaceAll("[^*_,a-z0-9]", "");
|
||||
if(!optout.includes.isEmpty()) ModEngineersDecor.logger.info("Pattern includes: '" + optout.includes + "'");
|
||||
|
@ -582,6 +587,21 @@ public class ModConfig
|
|||
if(!excl[i].isEmpty()) excludes_.add(excl[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
"normal": [{}],
|
||||
"inventory": [{}],
|
||||
"facing": { "north": {"y":0}, "south": {"y":180}, "west": {"y":-90}, "east": {"y":90} },
|
||||
"filled": { "false":{}, "true":{} },
|
||||
"active": { "false":{}, "true":{ "model": "engineersdecor:device/small_milking_machine_model_active" } }
|
||||
"active": { "false":{}, "true":{ "model": "engineersdecor:device/small_milking_machine_model_active" } },
|
||||
"filled": { "false":{}, "true":{ "textures":{ "f": "engineersdecor:blocks/device/small_milking_machine_front_filled" }}}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -205,8 +205,12 @@ tile.engineersdecor.small_tree_cutter.help=§6Chops grown trees in front of it.
|
|||
${!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=§6Frequently attracts and milks cows.§r\n\
|
||||
Has an internal fluid tank. Does not feed the animals. Use buckets to retrieve the milk.
|
||||
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.
|
||||
|
|
|
@ -201,8 +201,12 @@ tile.engineersdecor.small_tree_cutter.name=Small Tree Cutter
|
|||
${!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=§6Frequently attracts and milks cows.§r\n\
|
||||
Has an internal fluid tank. Does not feed the animals. Use buckets to retrieve the milk.
|
||||
#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. Используется для творческой вкладки и скриншотов.
|
||||
|
|
|
@ -200,8 +200,12 @@ 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=§6Frequently attracts and milks cows.§r\n\
|
||||
Has an internal fluid tank. Does not feed the animals. Use buckets to retrieve the milk.
|
||||
#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看到。用于创造模式的物品栏标签和截屏。
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"textures": {
|
||||
"s": "engineersdecor:blocks/device/tree_cutter_side",
|
||||
"particle": "engineersdecor:blocks/device/tree_cutter_side",
|
||||
"t": "engineersdecor:blocks/device/tree_cutter_top",
|
||||
"b": "engineersdecor:blocks/device/tree_cutter_bottom"
|
||||
"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": [
|
||||
{
|
||||
|
@ -12,12 +14,12 @@
|
|||
"to": [16, 1, 13],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -2]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 15, 16, 16], "texture": "#s"},
|
||||
"east": {"uv": [3, 15, 16, 16], "texture": "#s"},
|
||||
"south": {"uv": [0, 15, 16, 16], "texture": "#s"},
|
||||
"west": {"uv": [0, 15, 13, 16], "texture": "#s"},
|
||||
"up": {"uv": [0, 0, 16, 13], "texture": "#t"},
|
||||
"down": {"uv": [0, 3, 16, 16], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -25,12 +27,12 @@
|
|||
"to": [16, 16, 13],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 23, -2]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 16, 2], "texture": "#s"},
|
||||
"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, 0, 16, 13], "texture": "#t"},
|
||||
"down": {"uv": [0, 3, 16, 16], "texture": "#b"}
|
||||
"up": {"uv": [0, 3, 16, 16], "texture": "#tb"},
|
||||
"down": {"uv": [0, 0, 16, 13], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -38,12 +40,12 @@
|
|||
"to": [1, 14, 11],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [5, 7.5, 5.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [15, 2, 16, 15], "texture": "#s"},
|
||||
"east": {"uv": [5, 2, 15, 15], "texture": "#s"},
|
||||
"south": {"uv": [0, 2, 1, 15], "texture": "#s"},
|
||||
"west": {"uv": [1, 2, 11, 15], "texture": "#s"},
|
||||
"up": {"uv": [0, 1, 1, 11], "texture": "#t"},
|
||||
"down": {"uv": [0, 5, 1, 15], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -51,12 +53,12 @@
|
|||
"to": [15, 14, 10],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 5.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [1, 2, 15, 15], "texture": "#s"},
|
||||
"east": {"uv": [6, 2, 16, 15], "texture": "#s"},
|
||||
"south": {"uv": [1, 2, 15, 15], "texture": "#s"},
|
||||
"west": {"uv": [0, 2, 10, 15], "texture": "#s"},
|
||||
"up": {"uv": [1, 0, 15, 10], "texture": "#t"},
|
||||
"down": {"uv": [1, 6, 15, 16], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -64,12 +66,12 @@
|
|||
"to": [10, 14, 11],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [7, 7.5, 15.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 2, 10, 15], "texture": "#s"},
|
||||
"north": {"uv": [6, 2, 10, 15], "texture": "#b"},
|
||||
"east": {"uv": [5, 2, 6, 15], "texture": "#s"},
|
||||
"south": {"uv": [6, 2, 10, 15], "texture": "#s"},
|
||||
"west": {"uv": [10, 2, 11, 15], "texture": "#s"},
|
||||
"up": {"uv": [6, 10, 10, 11], "texture": "#t"},
|
||||
"down": {"uv": [6, 5, 10, 6], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -77,25 +79,12 @@
|
|||
"to": [16, 14, 11],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [13.5, 7.5, 9]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 2, 1, 15], "texture": "#s"},
|
||||
"north": {"uv": [0, 2, 1, 15], "texture": "#b"},
|
||||
"east": {"uv": [5, 2, 15, 15], "texture": "#s"},
|
||||
"south": {"uv": [15, 2, 16, 15], "texture": "#s"},
|
||||
"west": {"uv": [1, 2, 11, 15], "texture": "#s"},
|
||||
"up": {"uv": [15, 1, 16, 11], "texture": "#t"},
|
||||
"down": {"uv": [15, 5, 16, 15], "texture": "#b"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [7.5, 2, 12],
|
||||
"to": [8.5, 12, 14],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 11, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [13, 3, 14, 10], "rotation": 180, "texture": "#b"},
|
||||
"east": {"uv": [0, 6, 8, 8], "rotation": 270, "texture": "#s"},
|
||||
"south": {"uv": [2, 4, 3, 13], "texture": "#t"},
|
||||
"west": {"uv": [6, 6, 16, 8], "rotation": 90, "texture": "#s"},
|
||||
"up": {"uv": [5, 6, 6, 8], "rotation": 180, "texture": "#s"},
|
||||
"down": {"uv": [10, 6, 11, 8], "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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -103,12 +92,12 @@
|
|||
"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": "#s"},
|
||||
"east": {"uv": [1, 3, 5, 6], "texture": "#s"},
|
||||
"south": {"uv": [8.5, 3, 9.5, 6], "texture": "#s"},
|
||||
"west": {"uv": [11, 3, 15, 6], "texture": "#s"},
|
||||
"up": {"uv": [8.5, 11, 9.5, 15], "texture": "#t"},
|
||||
"down": {"uv": [8.5, 1, 9.5, 5], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -116,12 +105,12 @@
|
|||
"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": "#s"},
|
||||
"east": {"uv": [2, 2, 5, 3], "texture": "#s"},
|
||||
"south": {"uv": [8.5, 2, 9.5, 3], "texture": "#s"},
|
||||
"west": {"uv": [11, 2, 14, 3], "texture": "#s"},
|
||||
"up": {"uv": [8.5, 11, 9.5, 14], "texture": "#t"},
|
||||
"down": {"uv": [8.5, 2, 9.5, 5], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -129,12 +118,12 @@
|
|||
"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": "#s"},
|
||||
"east": {"uv": [2, 2, 5, 3], "texture": "#s"},
|
||||
"south": {"uv": [6.5, 2, 7.5, 3], "texture": "#s"},
|
||||
"west": {"uv": [11, 2, 14, 3], "texture": "#s"},
|
||||
"up": {"uv": [6.5, 11, 7.5, 14], "texture": "#t"},
|
||||
"down": {"uv": [6.5, 2, 7.5, 5], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -142,103 +131,116 @@
|
|||
"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": "#s"},
|
||||
"east": {"uv": [1, 3, 5, 6], "texture": "#s"},
|
||||
"south": {"uv": [6.5, 3, 7.5, 6], "texture": "#s"},
|
||||
"west": {"uv": [11, 3, 15, 6], "texture": "#s"},
|
||||
"up": {"uv": [6.5, 11, 7.5, 15], "texture": "#t"},
|
||||
"down": {"uv": [6.5, 1, 7.5, 5], "texture": "#b"}
|
||||
"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": [7.5, 19, 9]},
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [7.5, 3, 8.5, 6], "texture": "#s"},
|
||||
"east": {"uv": [4, 3, 5, 6], "texture": "#s"},
|
||||
"south": {"uv": [7.5, 3, 8.5, 6], "texture": "#s"},
|
||||
"west": {"uv": [11, 3, 12, 6], "texture": "#s"},
|
||||
"up": {"uv": [7.5, 11, 8.5, 12], "texture": "#t"},
|
||||
"down": {"uv": [7.5, 4, 8.5, 5], "texture": "#b"}
|
||||
"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": [7.5, 5, 14],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 11, 13]},
|
||||
"to": [9.5, 5, 14],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [8.5, 11, 9.5, 14], "rotation": 180, "texture": "#b"},
|
||||
"east": {"uv": [2, 11, 3, 14], "rotation": 270, "texture": "#s"},
|
||||
"south": {"uv": [6.5, 11, 7.5, 14], "texture": "#t"},
|
||||
"west": {"uv": [13, 11, 14, 14], "texture": "#s"},
|
||||
"up": {"uv": [6.5, 13, 7.5, 14], "rotation": 180, "texture": "#s"},
|
||||
"down": {"uv": [6.5, 2, 7.5, 3], "texture": "#s"}
|
||||
"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": [8.5, 2, 13],
|
||||
"to": [9.5, 5, 14],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 11, 13]},
|
||||
"from": [7.5, 3, 12],
|
||||
"to": [8.5, 5, 13],
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [6.5, 11, 7.5, 14], "rotation": 180, "texture": "#b"},
|
||||
"east": {"uv": [2, 11, 3, 14], "texture": "#s"},
|
||||
"south": {"uv": [8.5, 11, 9.5, 14], "texture": "#t"},
|
||||
"west": {"uv": [13, 11, 14, 14], "rotation": 90, "texture": "#s"},
|
||||
"up": {"uv": [8.5, 13, 9.5, 14], "rotation": 180, "texture": "#s"},
|
||||
"down": {"uv": [8.5, 2, 9.5, 3], "texture": "#s"}
|
||||
"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, 11, 13]},
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [9, 0, 10, 0], "rotation": 180, "texture": "#b"},
|
||||
"east": {"uv": [0, 4, 0, 6], "rotation": 270, "texture": "#s"},
|
||||
"south": {"uv": [8, 14, 9, 15], "texture": "#t"},
|
||||
"west": {"uv": [15, 4, 16, 6], "rotation": 90, "texture": "#s"},
|
||||
"up": {"uv": [6, 4, 7, 6], "rotation": 180, "texture": "#s"},
|
||||
"down": {"uv": [9, 4, 10, 6], "texture": "#s"}
|
||||
"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, 11, 13]},
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [11, 0, 12, 0], "rotation": 180, "texture": "#b"},
|
||||
"east": {"uv": [0, 4, 1, 6], "rotation": 270, "texture": "#s"},
|
||||
"south": {"uv": [10, 14, 11, 15], "texture": "#t"},
|
||||
"west": {"uv": [16, 4, 16, 6], "rotation": 90, "texture": "#s"},
|
||||
"up": {"uv": [4, 4, 5, 6], "rotation": 180, "texture": "#s"},
|
||||
"down": {"uv": [11, 4, 12, 6], "texture": "#s"}
|
||||
"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, 11, 13]},
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [11, 0, 12, 0], "rotation": 180, "texture": "#b"},
|
||||
"east": {"uv": [0, 4, 1, 6], "rotation": 270, "texture": "#s"},
|
||||
"south": {"uv": [10, 14, 11, 15], "texture": "#t"},
|
||||
"west": {"uv": [16, 4, 16, 6], "rotation": 90, "texture": "#s"},
|
||||
"up": {"uv": [4, 4, 5, 6], "rotation": 180, "texture": "#s"},
|
||||
"down": {"uv": [11, 4, 12, 6], "texture": "#s"}
|
||||
"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, 11, 13]},
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [9, 0, 10, 0], "rotation": 180, "texture": "#b"},
|
||||
"east": {"uv": [0, 4, 0, 6], "rotation": 270, "texture": "#s"},
|
||||
"south": {"uv": [8, 13, 9, 14], "texture": "#t"},
|
||||
"west": {"uv": [15, 4, 16, 6], "rotation": 90, "texture": "#s"},
|
||||
"up": {"uv": [6, 4, 7, 6], "rotation": 180, "texture": "#s"},
|
||||
"down": {"uv": [9, 4, 10, 6], "texture": "#s"}
|
||||
"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"}
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"textures": {
|
||||
"s": "engineersdecor:blocks/device/tree_cutter_side",
|
||||
"particle": "engineersdecor:blocks/device/tree_cutter_side",
|
||||
"t": "engineersdecor:blocks/device/tree_cutter_top",
|
||||
"b": "engineersdecor:blocks/device/tree_cutter_bottom"
|
||||
"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": [
|
||||
{
|
||||
|
@ -12,12 +14,12 @@
|
|||
"to": [16, 1, 13],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -2]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 15, 16, 16], "texture": "#s"},
|
||||
"east": {"uv": [3, 15, 16, 16], "texture": "#s"},
|
||||
"south": {"uv": [0, 15, 16, 16], "texture": "#s"},
|
||||
"west": {"uv": [0, 15, 13, 16], "texture": "#s"},
|
||||
"up": {"uv": [0, 0, 16, 13], "texture": "#t"},
|
||||
"down": {"uv": [0, 3, 16, 16], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -25,12 +27,12 @@
|
|||
"to": [16, 16, 13],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [8, 23, -2]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 0, 16, 2], "texture": "#s"},
|
||||
"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, 0, 16, 13], "texture": "#t"},
|
||||
"down": {"uv": [0, 3, 16, 16], "texture": "#b"}
|
||||
"up": {"uv": [0, 3, 16, 16], "texture": "#tb"},
|
||||
"down": {"uv": [0, 0, 16, 13], "texture": "#tb"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -38,12 +40,12 @@
|
|||
"to": [1, 14, 11],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [5, 7.5, 5.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [15, 2, 16, 15], "texture": "#s"},
|
||||
"east": {"uv": [5, 2, 15, 15], "texture": "#s"},
|
||||
"south": {"uv": [0, 2, 1, 15], "texture": "#s"},
|
||||
"west": {"uv": [1, 2, 11, 15], "texture": "#s"},
|
||||
"up": {"uv": [0, 1, 1, 11], "texture": "#t"},
|
||||
"down": {"uv": [0, 5, 1, 15], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -51,12 +53,12 @@
|
|||
"to": [15, 14, 10],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [6, 7.5, 5.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [1, 2, 15, 15], "texture": "#s"},
|
||||
"east": {"uv": [6, 2, 16, 15], "texture": "#s"},
|
||||
"south": {"uv": [1, 2, 15, 15], "texture": "#s"},
|
||||
"west": {"uv": [0, 2, 10, 15], "texture": "#s"},
|
||||
"up": {"uv": [1, 0, 15, 10], "texture": "#t"},
|
||||
"down": {"uv": [1, 6, 15, 16], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -64,12 +66,12 @@
|
|||
"to": [10, 14, 11],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [7, 7.5, 15.5]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 2, 10, 15], "texture": "#s"},
|
||||
"north": {"uv": [6, 2, 10, 15], "texture": "#b"},
|
||||
"east": {"uv": [5, 2, 6, 15], "texture": "#s"},
|
||||
"south": {"uv": [6, 2, 10, 15], "texture": "#s"},
|
||||
"west": {"uv": [10, 2, 11, 15], "texture": "#s"},
|
||||
"up": {"uv": [6, 10, 10, 11], "texture": "#t"},
|
||||
"down": {"uv": [6, 5, 10, 6], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -77,12 +79,12 @@
|
|||
"to": [16, 14, 11],
|
||||
"rotation": {"angle": 0, "axis": "y", "origin": [13.5, 7.5, 9]},
|
||||
"faces": {
|
||||
"north": {"uv": [0, 2, 1, 15], "texture": "#s"},
|
||||
"north": {"uv": [0, 2, 1, 15], "texture": "#b"},
|
||||
"east": {"uv": [5, 2, 15, 15], "texture": "#s"},
|
||||
"south": {"uv": [15, 2, 16, 15], "texture": "#s"},
|
||||
"west": {"uv": [1, 2, 11, 15], "texture": "#s"},
|
||||
"up": {"uv": [15, 1, 16, 11], "texture": "#t"},
|
||||
"down": {"uv": [15, 5, 16, 15], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -90,12 +92,12 @@
|
|||
"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": "#s"},
|
||||
"east": {"uv": [1, 3, 5, 6], "texture": "#s"},
|
||||
"south": {"uv": [8.5, 3, 9.5, 6], "texture": "#s"},
|
||||
"west": {"uv": [11, 3, 15, 6], "texture": "#s"},
|
||||
"up": {"uv": [8.5, 11, 9.5, 15], "texture": "#t"},
|
||||
"down": {"uv": [8.5, 1, 9.5, 5], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -103,12 +105,12 @@
|
|||
"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": "#s"},
|
||||
"east": {"uv": [2, 2, 5, 3], "texture": "#s"},
|
||||
"south": {"uv": [8.5, 2, 9.5, 3], "texture": "#s"},
|
||||
"west": {"uv": [11, 2, 14, 3], "texture": "#s"},
|
||||
"up": {"uv": [8.5, 11, 9.5, 14], "texture": "#t"},
|
||||
"down": {"uv": [8.5, 2, 9.5, 5], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -116,12 +118,12 @@
|
|||
"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": "#s"},
|
||||
"east": {"uv": [2, 2, 5, 3], "texture": "#s"},
|
||||
"south": {"uv": [6.5, 2, 7.5, 3], "texture": "#s"},
|
||||
"west": {"uv": [11, 2, 14, 3], "texture": "#s"},
|
||||
"up": {"uv": [6.5, 11, 7.5, 14], "texture": "#t"},
|
||||
"down": {"uv": [6.5, 2, 7.5, 5], "texture": "#b"}
|
||||
"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"}
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -129,124 +131,124 @@
|
|||
"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": "#s"},
|
||||
"east": {"uv": [1, 3, 5, 6], "texture": "#s"},
|
||||
"south": {"uv": [6.5, 3, 7.5, 6], "texture": "#s"},
|
||||
"west": {"uv": [11, 3, 15, 6], "texture": "#s"},
|
||||
"up": {"uv": [6.5, 11, 7.5, 15], "texture": "#t"},
|
||||
"down": {"uv": [6.5, 1, 7.5, 5], "texture": "#b"}
|
||||
"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": [7.5, 19, 9]},
|
||||
"rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [7.5, 3, 8.5, 6], "texture": "#s"},
|
||||
"east": {"uv": [4, 3, 5, 6], "texture": "#s"},
|
||||
"south": {"uv": [7.5, 3, 8.5, 6], "texture": "#s"},
|
||||
"west": {"uv": [11, 3, 12, 6], "texture": "#s"},
|
||||
"up": {"uv": [7.5, 11, 8.5, 12], "texture": "#t"},
|
||||
"down": {"uv": [7.5, 4, 8.5, 5], "texture": "#b"}
|
||||
"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, 10, 12],
|
||||
"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, 11, 13]},
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [5, 6, 6, 8], "texture": "#s"},
|
||||
"east": {"uv": [0, 6, 8, 8], "texture": "#s"},
|
||||
"south": {"uv": [10, 6, 11, 8], "texture": "#s"},
|
||||
"west": {"uv": [6, 6, 16, 8], "texture": "#s"},
|
||||
"up": {"uv": [2, 4, 3, 13], "texture": "#t"},
|
||||
"down": {"uv": [13, 3, 14, 10], "texture": "#b"}
|
||||
"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": [8.5, 11, 19],
|
||||
"to": [9.5, 12, 22],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 11, 13]},
|
||||
"from": [6.5, 13, 20],
|
||||
"to": [7.5, 14, 21],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [8.5, 13, 9.5, 14], "texture": "#s"},
|
||||
"east": {"uv": [2, 11, 3, 14], "rotation": 90, "texture": "#s"},
|
||||
"south": {"uv": [8.5, 2, 9.5, 3], "texture": "#s"},
|
||||
"west": {"uv": [13, 11, 14, 14], "texture": "#s"},
|
||||
"up": {"uv": [8.5, 11, 9.5, 14], "texture": "#t"},
|
||||
"down": {"uv": [6.5, 11, 7.5, 14], "texture": "#b"}
|
||||
"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, 12, 19],
|
||||
"to": [9.5, 13, 20],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 11, 13]},
|
||||
"from": [8.5, 13, 20],
|
||||
"to": [9.5, 14, 21],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [4, 4, 5, 6], "texture": "#s"},
|
||||
"east": {"uv": [0, 4, 1, 6], "texture": "#s"},
|
||||
"south": {"uv": [11, 4, 12, 6], "texture": "#s"},
|
||||
"west": {"uv": [16, 4, 16, 6], "texture": "#s"},
|
||||
"up": {"uv": [10, 14, 11, 15], "texture": "#t"},
|
||||
"down": {"uv": [11, 0, 12, 0], "texture": "#b"}
|
||||
"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, 12, 21],
|
||||
"to": [9.5, 13, 22],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 11, 13]},
|
||||
"from": [8.5, 13, 22],
|
||||
"to": [9.5, 14, 23],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [4, 4, 5, 6], "texture": "#s"},
|
||||
"east": {"uv": [0, 4, 1, 6], "texture": "#s"},
|
||||
"south": {"uv": [11, 4, 12, 6], "texture": "#s"},
|
||||
"west": {"uv": [16, 4, 16, 6], "texture": "#s"},
|
||||
"up": {"uv": [10, 14, 11, 15], "texture": "#t"},
|
||||
"down": {"uv": [11, 0, 12, 0], "texture": "#b"}
|
||||
"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, 11, 19],
|
||||
"to": [7.5, 12, 22],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 11, 13]},
|
||||
"from": [6.5, 13, 22],
|
||||
"to": [7.5, 14, 23],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 12, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [6.5, 13, 7.5, 14], "texture": "#s"},
|
||||
"east": {"uv": [2, 11, 3, 14], "texture": "#s"},
|
||||
"south": {"uv": [6.5, 2, 7.5, 3], "texture": "#s"},
|
||||
"west": {"uv": [13, 11, 14, 14], "rotation": 270, "texture": "#s"},
|
||||
"up": {"uv": [6.5, 11, 7.5, 14], "texture": "#t"},
|
||||
"down": {"uv": [8.5, 11, 9.5, 14], "texture": "#b"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6.5, 12, 21],
|
||||
"to": [7.5, 13, 22],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 11, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 4, 7, 6], "texture": "#s"},
|
||||
"east": {"uv": [0, 4, 0, 6], "texture": "#s"},
|
||||
"south": {"uv": [9, 4, 10, 6], "texture": "#s"},
|
||||
"west": {"uv": [15, 4, 16, 6], "texture": "#s"},
|
||||
"up": {"uv": [8, 13, 9, 14], "texture": "#t"},
|
||||
"down": {"uv": [9, 0, 10, 0], "texture": "#b"}
|
||||
}
|
||||
},
|
||||
{
|
||||
"from": [6.5, 12, 19],
|
||||
"to": [7.5, 13, 20],
|
||||
"rotation": {"angle": 22.5, "axis": "x", "origin": [8, 11, 13]},
|
||||
"faces": {
|
||||
"north": {"uv": [6, 4, 7, 6], "texture": "#s"},
|
||||
"east": {"uv": [0, 4, 0, 6], "texture": "#s"},
|
||||
"south": {"uv": [9, 4, 10, 6], "texture": "#s"},
|
||||
"west": {"uv": [15, 4, 16, 6], "texture": "#s"},
|
||||
"up": {"uv": [8, 14, 9, 15], "texture": "#t"},
|
||||
"down": {"uv": [9, 0, 10, 0], "texture": "#b"}
|
||||
"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": [57, 82, -38],
|
||||
"translation": [2.25, -0.5, -2],
|
||||
"scale": [0.35, 0.35, 0.35]
|
||||
"rotation": [73, 180, 0],
|
||||
"translation": [0, -1.75, -1.5],
|
||||
"scale": [0.2, 0.2, 0.2]
|
||||
},
|
||||
"firstperson_righthand": {
|
||||
"rotation": [18, 22, 0],
|
||||
|
@ -259,7 +261,7 @@
|
|||
},
|
||||
"gui": {
|
||||
"rotation": [30, 40, 0],
|
||||
"translation": [1.25, -1, 0],
|
||||
"translation": [0.5, -0.25, 0],
|
||||
"scale": [0.625, 0.625, 0.625]
|
||||
},
|
||||
"fixed": {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -24,6 +24,6 @@
|
|||
},
|
||||
"result": {
|
||||
"item": "engineersdecor:slag_brick_block",
|
||||
"count": 4
|
||||
"count": 8
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
"pattern": [
|
||||
"PPP",
|
||||
"PAO",
|
||||
"CRC"
|
||||
"CBC"
|
||||
],
|
||||
"key": {
|
||||
"O": {
|
||||
|
@ -25,8 +25,8 @@
|
|||
"item": "minecraft:milk_bucket",
|
||||
"data": 0
|
||||
},
|
||||
"R": {
|
||||
"item": "minecraft:redstone_block",
|
||||
"B": {
|
||||
"item": "#itemSteelBarrel",
|
||||
"data": 0
|
||||
},
|
||||
"C": {
|
||||
|
|
After Width: | Height: | Size: 563 B |
After Width: | Height: | Size: 473 B |
After Width: | Height: | Size: 483 B |
After Width: | Height: | Size: 516 B |
After Width: | Height: | Size: 560 B |
After Width: | Height: | Size: 581 B |
|
@ -2,7 +2,7 @@
|
|||
org.gradle.daemon=false
|
||||
org.gradle.jvmargs=-Xmx8G
|
||||
version_minecraft=1.14.4
|
||||
version_forge_minecraft=1.14.4-28.1.79
|
||||
version_forge_minecraft=1.14.4-28.1.90
|
||||
version_fml_mappings=20190719-1.14.3
|
||||
version_jei=1.14.4:6.0.0.10
|
||||
version_engineersdecor=1.0.16-b3
|
||||
version_engineersdecor=1.0.16-b4
|
||||
|
|
|
@ -11,6 +11,10 @@ Mod sources for Minecraft version 1.14.4.
|
|||
|
||||
## Version history
|
||||
|
||||
~ v1.0.16-b4 [U] Updated to Forge 1.14.4-28.1.90/20190719-1.14.3.
|
||||
[M] Increased slag brick recipe yield to 8.
|
||||
[M] Parent specs in model files adapted.
|
||||
|
||||
- v1.0.16-b3 [A] Config options (opt-outs and tweaks) added.
|
||||
[M] Increased clinker brick recipe yield to 8 for the builders needs.
|
||||
|
||||
|
|
|
@ -12,8 +12,7 @@
|
|||
*/
|
||||
package wile.engineersdecor;
|
||||
|
||||
import net.minecraftforge.fml.client.registry.ClientRegistry;
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
|
||||
import wile.engineersdecor.blocks.*;
|
||||
import wile.engineersdecor.detail.ModAuxiliaries;
|
||||
import net.minecraft.client.gui.ScreenManager;
|
||||
|
@ -29,12 +28,13 @@ import net.minecraft.block.material.Material;
|
|||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.BlockItem;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraftforge.fml.client.registry.ClientRegistry;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
|
||||
import net.minecraftforge.event.RegistryEvent;
|
||||
import wile.engineersdecor.detail.ModTesrs;
|
||||
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Collections;
|
||||
|
@ -432,6 +432,12 @@ public class ModContent
|
|||
ModAuxiliaries.getPixeledAABB(0,0,0, 16,11.5,16)
|
||||
)).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "small_solar_panel"));
|
||||
|
||||
public static final BlockDecorMilker SMALL_MILKING_MACHINE = (BlockDecorMilker)(new BlockDecorMilker(
|
||||
BlockDecor.CFG_LOOK_PLACEMENT|BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_CUTOUT|BlockDecor.CFG_ELECTRICAL,
|
||||
Block.Properties.create(Material.IRON, MaterialColor.IRON).hardnessAndResistance(2f, 15f).sound(SoundType.METAL),
|
||||
ModAuxiliaries.getPixeledAABB(0,0,0, 16,16,13)
|
||||
)).setRegistryName(new ResourceLocation(ModEngineersDecor.MODID, "small_milking_machine"));
|
||||
|
||||
public static final BlockDecorTreeCutter SMALL_TREE_CUTTER = (BlockDecorTreeCutter)(new BlockDecorTreeCutter(
|
||||
BlockDecor.CFG_CUTOUT|BlockDecor.CFG_HORIZIONTAL|BlockDecor.CFG_LOOK_PLACEMENT|BlockDecor.CFG_FLIP_PLACEMENT_SHIFTCLICK,
|
||||
Block.Properties.create(Material.IRON, MaterialColor.IRON).hardnessAndResistance(2f, 15f).sound(SoundType.METAL),
|
||||
|
@ -602,6 +608,7 @@ public class ModContent
|
|||
};
|
||||
|
||||
private static final Block devBlocks[] = {
|
||||
SMALL_MILKING_MACHINE
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
@ -673,6 +680,11 @@ public class ModContent
|
|||
.build(null)
|
||||
.setRegistryName(ModEngineersDecor.MODID, "te_small_solar_panel");
|
||||
|
||||
public static final TileEntityType<?> TET_SMALL_MILKING_MACHINE = TileEntityType.Builder
|
||||
.create(BlockDecorMilker.BTileEntity::new, SMALL_MILKING_MACHINE)
|
||||
.build(null)
|
||||
.setRegistryName(ModEngineersDecor.MODID, "te_small_milking_machine");
|
||||
|
||||
public static final TileEntityType<?> TET_SMALL_TREE_CUTTER = TileEntityType.Builder
|
||||
.create(BlockDecorTreeCutter.BTileEntity::new, SMALL_TREE_CUTTER)
|
||||
.build(null)
|
||||
|
@ -691,6 +703,7 @@ public class ModContent
|
|||
TET_WASTE_INCINERATOR,
|
||||
TET_MINERAL_SMELTER,
|
||||
TET_SMALL_SOLAR_PANEL,
|
||||
TET_SMALL_MILKING_MACHINE,
|
||||
TET_STRAIGHT_PIPE_VALVE,
|
||||
TET_PASSIVE_FLUID_ACCUMULATOR,
|
||||
TET_SMALL_FLUID_FUNNEL,
|
||||
|
@ -839,6 +852,6 @@ public class ModContent
|
|||
@OnlyIn(Dist.CLIENT)
|
||||
public static final void registerTileEntityRenderers(final FMLClientSetupEvent event)
|
||||
{
|
||||
ClientRegistry.bindTileEntitySpecialRenderer(BlockDecorCraftingTable.BTileEntity.class, new ModTesrs.TesrDecorCraftingTable());
|
||||
ClientRegistry.bindTileEntitySpecialRenderer(BlockDecorCraftingTable.BTileEntity.class, new wile.engineersdecor.detail.ModTesrs.TesrDecorCraftingTable());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,537 @@
|
|||
/*
|
||||
* @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.ModContent;
|
||||
import wile.engineersdecor.ModEngineersDecor;
|
||||
import wile.engineersdecor.detail.ExtItems;
|
||||
import wile.engineersdecor.detail.ItemHandling;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.IBlockReader;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.state.BooleanProperty;
|
||||
import net.minecraft.state.StateContainer;
|
||||
import net.minecraft.tileentity.ITickableTileEntity;
|
||||
import net.minecraft.tileentity.TileEntityType;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.entity.item.ItemEntity;
|
||||
import net.minecraft.entity.passive.CowEntity;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.entity.ai.goal.PrioritizedGoal;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
import net.minecraft.entity.MoverType;
|
||||
import net.minecraft.item.*;
|
||||
import net.minecraft.fluid.Fluid;
|
||||
import net.minecraft.fluid.Fluids;
|
||||
import net.minecraft.nbt.CompoundNBT;
|
||||
import net.minecraft.util.*;
|
||||
import net.minecraft.util.math.*;
|
||||
import net.minecraftforge.common.capabilities.ICapabilityProvider;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
import net.minecraftforge.energy.CapabilityEnergy;
|
||||
import net.minecraftforge.energy.IEnergyStorage;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
import net.minecraftforge.items.wrapper.PlayerMainInvWrapper;
|
||||
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.IFluidHandler.FluidAction;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.*;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
|
||||
public class BlockDecorMilker extends BlockDecorDirectedHorizontal
|
||||
{
|
||||
public static final BooleanProperty FILLED = BooleanProperty.create("filled");
|
||||
public static final BooleanProperty ACTIVE = BooleanProperty.create("active");
|
||||
|
||||
public BlockDecorMilker(long config, Block.Properties builder, final AxisAlignedBB unrotatedAABB)
|
||||
{ super(config, builder, unrotatedAABB); }
|
||||
|
||||
@Override
|
||||
protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder)
|
||||
{ super.fillStateContainer(builder); builder.add(ACTIVE); builder.add(FILLED); }
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public BlockState getStateForPlacement(BlockItemUseContext context)
|
||||
{ return super.getStateForPlacement(context).with(FILLED, false).with(ACTIVE, false); }
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public boolean hasComparatorInputOverride(BlockState state)
|
||||
{ return true; }
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public int getComparatorInputOverride(BlockState 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(BlockState state)
|
||||
{ return true; }
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public TileEntity createTileEntity(BlockState state, IBlockReader world)
|
||||
{ return new BTileEntity(); }
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public boolean onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockRayTraceResult hit)
|
||||
{
|
||||
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() && (te.fluid_handler()!=null)) 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 ItemEntity ei = new ItemEntity(world, player.posX, player.posY + 0.5, player.posZ, remainder);
|
||||
ei.setPickupDelay(40);
|
||||
ei.setMotion(0,0,0);
|
||||
world.addEntity(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 ITickableTileEntity, IEnergyStorage, ICapabilityProvider
|
||||
{
|
||||
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 Direction FLUID_TRANSFER_DIRECTRIONS[] = {Direction.DOWN,Direction.EAST,Direction.SOUTH,Direction.WEST,Direction.NORTH};
|
||||
private enum MilkingState { IDLE, PICKED, COMING, POSITIONING, MILKING, LEAVING, WAITING }
|
||||
|
||||
private static FluidStack milk_fluid_ = new FluidStack(Fluids.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 = null; // FluidRe.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()
|
||||
{ this(ModContent.TET_SMALL_MILKING_MACHINE); }
|
||||
|
||||
public BTileEntity(TileEntityType<?> te_type)
|
||||
{ super(te_type); reset(); }
|
||||
|
||||
public void reset()
|
||||
{
|
||||
tank_level_ = 0;
|
||||
energy_stored_ = 0;
|
||||
tick_timer_ = 0;
|
||||
tracked_cow_ = null;
|
||||
state_ = MilkingState.IDLE;
|
||||
state_timeout_ = 0;
|
||||
}
|
||||
|
||||
public CompoundNBT destroy_getnbt()
|
||||
{
|
||||
final UUID cowuid = tracked_cow_;
|
||||
CompoundNBT nbt = new CompoundNBT();
|
||||
writenbt(nbt, false); reset();
|
||||
if(cowuid == null) return nbt;
|
||||
world.getEntitiesWithinAABB(CowEntity.class, new AxisAlignedBB(pos).grow(16, 16, 16), e->e.getUniqueID().equals(cowuid)).forEach(e->e.setNoAI(false));
|
||||
return nbt;
|
||||
}
|
||||
|
||||
public void readnbt(CompoundNBT nbt, boolean update_packet)
|
||||
{
|
||||
tank_level_ = nbt.getInt("tank");
|
||||
energy_stored_ = nbt.getInt("energy");
|
||||
}
|
||||
|
||||
protected void writenbt(CompoundNBT nbt, boolean update_packet)
|
||||
{
|
||||
if(tank_level_ > 0) nbt.putInt("tank", tank_level_);
|
||||
if(energy_stored_ > 0) nbt.putInt("energy", energy_stored_ );
|
||||
}
|
||||
|
||||
private IFluidHandler fluid_handler()
|
||||
{ return fluid_handler_.orElse(null); }
|
||||
|
||||
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 void read(CompoundNBT nbt)
|
||||
{ super.read(nbt); readnbt(nbt, false); }
|
||||
|
||||
@Override
|
||||
public CompoundNBT write(CompoundNBT nbt)
|
||||
{ super.write(nbt); writenbt(nbt, false); return nbt; }
|
||||
|
||||
// IEnergyStorage ----------------------------------------------------------------------------
|
||||
|
||||
protected LazyOptional<IEnergyStorage> energy_handler_ = LazyOptional.of(() -> (IEnergyStorage)this);
|
||||
|
||||
@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 LazyOptional<IFluidHandler> fluid_handler_ = LazyOptional.of(() -> (IFluidHandler)new BFluidHandler(this));
|
||||
|
||||
private static class BFluidHandler implements IFluidHandler
|
||||
{
|
||||
private final BTileEntity te;
|
||||
BFluidHandler(BTileEntity te) { this.te = te; }
|
||||
@Override public int getTanks() { return 1; }
|
||||
@Override public FluidStack getFluidInTank(int tank) { return new FluidStack(milk_fluid_, te.fluid_level()); }
|
||||
@Override public int getTankCapacity(int tank) { return TANK_CAPACITY; }
|
||||
@Override public boolean isFluidValid(int tank, @Nonnull FluidStack stack) { return false; }
|
||||
@Override public int fill(FluidStack resource, FluidAction action) { return 0; }
|
||||
|
||||
@Override
|
||||
public FluidStack drain(FluidStack resource, FluidAction action)
|
||||
{ return (!resource.isFluidEqual(milk_fluid_)) ? (FluidStack.EMPTY.copy()) : drain(resource.getAmount(), action); }
|
||||
|
||||
@Override
|
||||
public FluidStack drain(int maxDrain, FluidAction action)
|
||||
{
|
||||
if(te.fluid_level() <= 0) return FluidStack.EMPTY.copy();
|
||||
FluidStack fs = milk_fluid_.copy();
|
||||
fs.setAmount(Math.min(fs.getAmount(), te.fluid_level()));
|
||||
if(action==FluidAction.EXECUTE) te.tank_level_ -= fs.getAmount();
|
||||
return fs;
|
||||
}
|
||||
}
|
||||
|
||||
// ICapabilityProvider ---------------------------------------------------------------------------
|
||||
|
||||
@Override
|
||||
public <T> LazyOptional<T> getCapability(net.minecraftforge.common.capabilities.Capability<T> capability, @Nullable Direction facing)
|
||||
{
|
||||
if(!this.removed && (facing != null)) {
|
||||
if((capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) && (!milk_fluid_.isEmpty())) {
|
||||
return fluid_handler_.cast();
|
||||
} else if((capability == CapabilityEnergy.ENERGY) && (energy_consumption>0)) {
|
||||
return energy_handler_.cast();
|
||||
}
|
||||
}
|
||||
return super.getCapability(capability, facing);
|
||||
}
|
||||
|
||||
// ITickable ------------------------------------------------------------------------------------
|
||||
|
||||
private void log(String s)
|
||||
{
|
||||
// System.out.println("Milker|" + 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(Direction 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(), Direction.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 void release_cow(CowEntity cow)
|
||||
{
|
||||
if(cow!=null) {
|
||||
cow.setNoAI(false);
|
||||
cow.goalSelector.getRunningGoals().forEach(PrioritizedGoal::resetTask);
|
||||
}
|
||||
tracked_cow_ = null;
|
||||
state_ = MilkingState.IDLE;
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
}
|
||||
|
||||
private boolean milking_process()
|
||||
{
|
||||
if((tracked_cow_ == null) && (fluid_level() >= MAX_MILKING_TANK_LEVEL)) return false; // nothing to do
|
||||
final Direction facing = world.getBlockState(getPos()).get(HORIZONTAL_FACING).getOpposite();
|
||||
CowEntity cow = null;
|
||||
{
|
||||
AxisAlignedBB aabb = new AxisAlignedBB(pos.offset(facing, 3)).grow(4, 2, 4);
|
||||
final List<CowEntity> cows = world.getEntitiesWithinAABB(CowEntity.class, aabb,
|
||||
e->( ((tracked_cow_==null) && ((!e.isChild()) && (!e.isInLove()) && (!e.isBeingRidden()))) || (e.getUniqueID().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.isAlive())) { release_cow(cow); cow = null; }
|
||||
if(tracked_cow_ == null) state_ = MilkingState.IDLE;
|
||||
if(cow == null) { log("Init: No cow"); return false; } // retry next cycle
|
||||
tick_timer_ = PROCESSING_TICK_INTERVAL;
|
||||
state_timer_ -= PROCESSING_TICK_INTERVAL;
|
||||
|
||||
if(cow.getNavigator().noPath()) {
|
||||
BlockPos p = getPos().offset(facing,2);
|
||||
cow.getNavigator().tryMoveToXYZ(p.getX()+0.5, p.getY()+0.5, p.getZ()+0.5, 1);
|
||||
}
|
||||
if(state_timer_ > 0) return false;
|
||||
switch(state_) { // Let's do this the old school FSA sequencing way ...
|
||||
case IDLE: {
|
||||
final List<LivingEntity> blocking_entities = world.getEntitiesWithinAABB(LivingEntity.class, new AxisAlignedBB(pos.offset(facing)).grow(0.5, 0.5, 0.5));
|
||||
if(blocking_entities.size() > 0) {
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
log("Idle: Position blocked");
|
||||
if(blocking_entities.get(0) instanceof CowEntity) {
|
||||
CowEntity blocker = (CowEntity)blocking_entities.get(0);
|
||||
BlockPos p = getPos().offset(facing,2);
|
||||
log("Idle: Shove off");
|
||||
blocker.setNoAI(false);
|
||||
blocker.goalSelector.getRunningGoals().forEach(PrioritizedGoal::resetTask);
|
||||
blocker.getNavigator().tryMoveToXYZ(p.getX()+0.5, p.getY()+0.5, p.getZ()+0.5, 1);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if(cow.getLeashed() || cow.isChild() || cow.isInLove() || (!cow.onGround) || cow.isBeingRidden() || cow.isSprinting()) return false;
|
||||
tracked_cow_ = cow.getUniqueID();
|
||||
state_ = MilkingState.PICKED;
|
||||
state_timeout_ = 200;
|
||||
tracked_cow_original_position_ = cow.getPosition();
|
||||
log("Idle: Picked cow " + tracked_cow_);
|
||||
return false;
|
||||
}
|
||||
case PICKED: {
|
||||
BlockPos p = getPos().offset(facing).offset(facing.rotateY());
|
||||
cow.getNavigator().clearPath();
|
||||
if(!cow.getNavigator().tryMoveToXYZ(p.getX(), p.getY(), p.getZ(),1.0)) {
|
||||
log("Picked: No path");
|
||||
cow.goalSelector.getRunningGoals().forEach(PrioritizedGoal::resetTask);
|
||||
tracked_cow_ = null;
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
return false;
|
||||
}
|
||||
state_ = MilkingState.COMING;
|
||||
state_timeout_ = 300; // 15s should be enough
|
||||
log("Picked: coming to " +p);
|
||||
return false;
|
||||
}
|
||||
case COMING: {
|
||||
BlockPos p = getPos().offset(facing).offset(facing.rotateY());
|
||||
if(cow.getPosition().distanceSq(p) > 1) {
|
||||
if(cow.getNavigator().getTargetPos().equals(p) && (!cow.getNavigator().noPath())) return false;
|
||||
if(!cow.getNavigator().tryMoveToXYZ(p.getX(), p.getY(), p.getZ(),1.0)) {
|
||||
log("Coming: lost path");
|
||||
cow.goalSelector.getRunningGoals().forEach(PrioritizedGoal::resetTask);
|
||||
tracked_cow_ = null;
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
return false;
|
||||
} else {
|
||||
log("Coming: Re-init path");
|
||||
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;
|
||||
cow.goalSelector.getRunningGoals().forEach(PrioritizedGoal::resetTask);
|
||||
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.distanceSq(cow.posX, cow.posY, cow.posZ, true) > 0.45) {
|
||||
if(cow.getNavigator().getTargetPos().equals(p) && (!cow.getNavigator().noPath())) return false;
|
||||
if(!cow.getNavigator().tryMoveToXYZ(p.getX(), p.getY(), p.getZ(), 1.0)) {
|
||||
log("Positioning: lost path");
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
cow.goalSelector.getRunningGoals().forEach(PrioritizedGoal::resetTask);
|
||||
} else {
|
||||
log("Positioning: Re-init path");
|
||||
state_timeout_ -= 25;
|
||||
}
|
||||
tracked_cow_ = null;
|
||||
return false;
|
||||
}
|
||||
cow.setNoAI(true);
|
||||
cow.move(MoverType.SELF, new Vec3d(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;
|
||||
cow.setNoAI(false);
|
||||
cow.getNavigator().clearPath();
|
||||
log("Milking: done, leave");
|
||||
return true;
|
||||
}
|
||||
case LEAVING: {
|
||||
BlockPos p = (tracked_cow_original_position_ != null) ? (tracked_cow_original_position_) : getPos().offset(facing,2).offset(facing.rotateYCCW());
|
||||
if(!cow.getNavigator().tryMoveToXYZ(p.getX(), p.getY(), p.getZ(), 1.0)) cow.getNavigator().clearPath();
|
||||
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;
|
||||
log("Waiting: ...");
|
||||
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 tick()
|
||||
{
|
||||
if((world.isRemote) || ((--tick_timer_ > 0))) return;
|
||||
tick_timer_ = TICK_INTERVAL;
|
||||
boolean dirty = false;
|
||||
final BlockState block_state = world.getBlockState(pos);
|
||||
if(!world.isBlockPowered(pos) && (state_==MilkingState.IDLE)) {
|
||||
log("Cycle");
|
||||
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_.getAmount() > 0) && (fluid_level() >= BUCKET_SIZE)) {
|
||||
log("Fluid transfer");
|
||||
for(Direction facing: FLUID_TRANSFER_DIRECTRIONS) {
|
||||
IFluidHandler fh = FluidUtil.getFluidHandler(world, pos.offset(facing), facing.getOpposite()).orElse(null);
|
||||
if(fh == null) continue;
|
||||
FluidStack fs = milk_fluid_.copy();
|
||||
fs.setAmount(BUCKET_SIZE);
|
||||
int nfilled = MathHelper.clamp(fh.fill(fs, FluidAction.EXECUTE), 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)) {
|
||||
log("Try item transfer");
|
||||
fill_adjacent_inventory_item_containers(block_state.get(HORIZONTAL_FACING));
|
||||
}
|
||||
}
|
||||
// State update
|
||||
BlockState new_state = block_state.with(FILLED, fluid_level()>=FILLED_INDICATION_THRESHOLD).with(ACTIVE, state_==MilkingState.MILKING);
|
||||
if(block_state != new_state) world.setBlockState(pos, new_state,1|2|16);
|
||||
if(dirty) markDirty();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -9,6 +9,7 @@
|
|||
*/
|
||||
package wile.engineersdecor.blocks;
|
||||
|
||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||
import wile.engineersdecor.ModContent;
|
||||
import wile.engineersdecor.ModEngineersDecor;
|
||||
import net.minecraft.entity.LivingEntity;
|
||||
|
@ -196,7 +197,7 @@ public class BlockDecorMineralSmelter extends BlockDecorDirectedHorizontal
|
|||
// Tile entity
|
||||
//--------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
public static class BTileEntity extends TileEntity implements INameable, ITickableTileEntity, ISidedInventory, IEnergyStorage, ICapabilityProvider // IFluidTankProperties,
|
||||
public static class BTileEntity extends TileEntity implements INameable, ITickableTileEntity, ISidedInventory, IEnergyStorage, ICapabilityProvider
|
||||
{
|
||||
public static final int TICK_INTERVAL = 20;
|
||||
public static final int MAX_FLUID_LEVEL = 1000;
|
||||
|
@ -535,15 +536,14 @@ public class BlockDecorMineralSmelter extends BlockDecorDirectedHorizontal
|
|||
|
||||
// Capability export ----------------------------------------------------------------------------
|
||||
|
||||
// @todo: INCLUDE FLUID HANDLER WHEN FORGE FluidStack/Fluid ISSUE fixed
|
||||
@Override
|
||||
public <T> LazyOptional<T> getCapability(net.minecraftforge.common.capabilities.Capability<T> capability, @Nullable Direction facing)
|
||||
{
|
||||
if(!this.removed && (facing != null)) {
|
||||
if(capability== CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
|
||||
return item_handler_.cast();
|
||||
//} else if(capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) {
|
||||
// return fluid_handler_.cast();
|
||||
} else if(capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) {
|
||||
return fluid_handler_.cast();
|
||||
} else if(capability== CapabilityEnergy.ENERGY) {
|
||||
return energy_handler_.cast();
|
||||
}
|
||||
|
|
|
@ -13,9 +13,12 @@ import net.minecraftforge.registries.ObjectHolder;
|
|||
|
||||
public class ExtItems
|
||||
{
|
||||
@ObjectHolder("immersiveengineering:metal_device1")
|
||||
@ObjectHolder("immersiveengineering:external_heater")
|
||||
public static final Item IE_EXTERNAL_HEATER = null;
|
||||
|
||||
@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.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.inventory.ISidedInventory;
|
||||
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 Direction side)
|
||||
{
|
||||
TileEntity te = world.getTileEntity(pos);
|
||||
if(te==null) return null;
|
||||
IItemHandler ih = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side).orElse(null);
|
||||
if(ih!=null) return ih;
|
||||
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 Direction side, ItemStack stack, boolean simulate)
|
||||
{
|
||||
if(te==null) return stack;
|
||||
IItemHandler hnd = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side).orElse(null);
|
||||
if(hnd != null) {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
|
@ -17,6 +17,7 @@ import net.minecraft.block.Block;
|
|||
import net.minecraft.item.Item;
|
||||
import net.minecraftforge.common.ForgeConfigSpec;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
import wile.engineersdecor.blocks.BlockDecorMilker.BTileEntity;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.ArrayList;
|
||||
|
@ -121,6 +122,7 @@ public class ModConfig
|
|||
public final ForgeConfigSpec.BooleanValue without_solar_panel;
|
||||
public final ForgeConfigSpec.BooleanValue without_fluid_funnel;
|
||||
public final ForgeConfigSpec.BooleanValue without_mineral_smelter;
|
||||
public final ForgeConfigSpec.BooleanValue without_milking_machine;
|
||||
public final ForgeConfigSpec.BooleanValue without_chair_sitting;
|
||||
public final ForgeConfigSpec.BooleanValue without_mob_chair_sitting;
|
||||
public final ForgeConfigSpec.BooleanValue without_ladder_speed_boost;
|
||||
|
@ -150,6 +152,7 @@ public class ModConfig
|
|||
public final ForgeConfigSpec.IntValue tree_cuttter_energy_consumption;
|
||||
public final ForgeConfigSpec.IntValue tree_cuttter_cutting_time_needed;
|
||||
public final ForgeConfigSpec.BooleanValue tree_cuttter_requires_power;
|
||||
public final ForgeConfigSpec.IntValue milking_machine_energy_consumption;
|
||||
|
||||
CommonConfig(ForgeConfigSpec.Builder builder)
|
||||
{
|
||||
|
@ -295,6 +298,10 @@ public class ModConfig
|
|||
.translation(ModEngineersDecor.MODID + ".config.without_mineral_smelter")
|
||||
.comment("Disable the small mineral smelter.")
|
||||
.define("without_mineral_smelter", false);
|
||||
without_milking_machine = builder
|
||||
.translation(ModEngineersDecor.MODID + ".config.without_milking_machine")
|
||||
.comment("Disable the small milking machine.")
|
||||
.define("without_milking_machine", false);
|
||||
without_slabs = builder
|
||||
.translation(ModEngineersDecor.MODID + ".config.without_slabs")
|
||||
.comment("Disable horizontal half-block slab.")
|
||||
|
@ -448,6 +455,13 @@ public class ModConfig
|
|||
.translation(ModEngineersDecor.MODID + ".config.tree_cuttter_requires_power")
|
||||
.comment("Defines if the Small Tree Cutter does not work without RF power.")
|
||||
.define("tree_cuttter_requires_power", false);
|
||||
milking_machine_energy_consumption = builder
|
||||
.translation(ModEngineersDecor.MODID + ".config.milking_machine_energy_consumption")
|
||||
.comment("Defines how much time the Small Milking Machine needs work. " +
|
||||
"Note this is a permanent standby power, not only when the device does something. " +
|
||||
"Use zero to disable energy dependency and energy handling of the machine. " +
|
||||
"The config value can be changed on-the-fly for tuning.")
|
||||
.defineInRange("milking_machine_energy_consumption", BTileEntity.DEFAULT_ENERGY_CONSUMPTION, 0, 128);
|
||||
builder.pop();
|
||||
}
|
||||
}
|
||||
|
@ -514,6 +528,7 @@ public class ModConfig
|
|||
if(block instanceof BlockDecorFluidFunnel) return COMMON.without_fluid_funnel.get();
|
||||
if(block instanceof BlockDecorSolarPanel) return COMMON.without_solar_panel.get();
|
||||
if(block instanceof BlockDecorMineralSmelter) return COMMON.without_mineral_smelter.get();
|
||||
if(block instanceof BlockDecorMilker) return COMMON.without_milking_machine.get();
|
||||
// Type based evaluation where later filters may match, too
|
||||
if(COMMON.without_slabs.get() && (block instanceof BlockDecorSlab)) return true;
|
||||
if(COMMON.without_stairs.get() && (block instanceof BlockDecorStairs)) return true;
|
||||
|
@ -573,6 +588,7 @@ public class ModConfig
|
|||
BlockDecorSolarPanel.BTileEntity.on_config(COMMON.small_solar_panel_peak_production.get());
|
||||
BlockDecorBreaker.BTileEntity.on_config(COMMON.block_breaker_power_consumption.get(), COMMON.block_breaker_reluctance.get(), COMMON.block_breaker_min_breaking_time.get(), COMMON.block_breaker_requires_power.get());
|
||||
BlockDecorTreeCutter.BTileEntity.on_config(COMMON.tree_cuttter_energy_consumption.get(), COMMON.tree_cuttter_cutting_time_needed.get(), COMMON.tree_cuttter_requires_power.get());
|
||||
BlockDecorMilker.BTileEntity.on_config(COMMON.milking_machine_energy_consumption.get());
|
||||
without_crafting_table = isOptedOut(ModContent.TREATED_WOOD_CRAFTING_TABLE);
|
||||
immersiveengineering_installed = ModAuxiliaries.isModLoaded("immersiveengineering");
|
||||
with_experimental_features_ = COMMON.with_experimental.get();
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"variants": {
|
||||
"active=false,facing=north,filled=false": { "model": "engineersdecor:block/device/small_milking_machine_model", "y": 0 },
|
||||
"active=false,facing=south,filled=false": { "model": "engineersdecor:block/device/small_milking_machine_model", "y": 180 },
|
||||
"active=false,facing=west,filled=false": { "model": "engineersdecor:block/device/small_milking_machine_model", "y": 270 },
|
||||
"active=false,facing=east,filled=false": { "model": "engineersdecor:block/device/small_milking_machine_model", "y": 90 },
|
||||
|
||||
"active=true,facing=north,filled=false": { "model": "engineersdecor:block/device/small_milking_machine_model_active", "y": 0 },
|
||||
"active=true,facing=south,filled=false": { "model": "engineersdecor:block/device/small_milking_machine_model_active", "y": 180 },
|
||||
"active=true,facing=west,filled=false": { "model": "engineersdecor:block/device/small_milking_machine_model_active", "y": 270 },
|
||||
"active=true,facing=east,filled=false": { "model": "engineersdecor:block/device/small_milking_machine_model_active", "y": 90 },
|
||||
|
||||
"active=false,facing=north,filled=true": { "model": "engineersdecor:block/device/small_milking_machine_model_filled", "y": 0 },
|
||||
"active=false,facing=south,filled=true": { "model": "engineersdecor:block/device/small_milking_machine_model_filled", "y": 180 },
|
||||
"active=false,facing=west,filled=true": { "model": "engineersdecor:block/device/small_milking_machine_model_filled", "y": 270 },
|
||||
"active=false,facing=east,filled=true": { "model": "engineersdecor:block/device/small_milking_machine_model_filled", "y": 90 },
|
||||
|
||||
"active=true,facing=north,filled=true": { "model": "engineersdecor:block/device/small_milking_machine_model_filled_active", "y": 0 },
|
||||
"active=true,facing=south,filled=true": { "model": "engineersdecor:block/device/small_milking_machine_model_filled_active", "y": 180 },
|
||||
"active=true,facing=west,filled=true": { "model": "engineersdecor:block/device/small_milking_machine_model_filled_active", "y": 270 },
|
||||
"active=true,facing=east,filled=true": { "model": "engineersdecor:block/device/small_milking_machine_model_filled_active", "y": 90 }
|
||||
}
|
||||
}
|
|
@ -182,7 +182,7 @@
|
|||
"block.engineersdecor.small_tree_cutter": "Small Tree Cutter",
|
||||
"block.engineersdecor.small_tree_cutter.help": "§6Chops grown trees in front of it.§r\n Does not collect the lumbers. Deactivate with a redstone signal. ${!tree_cuttter_requires_power?engineersdecor.tooltip.massive_speed_boost_with_rf_power} ${tree_cuttter_requires_power?engineersdecor.tooltip.requires_rf_power}",
|
||||
"block.engineersdecor.small_milking_machine": "Small Milking Machine",
|
||||
"block.engineersdecor.small_milking_machine.help": "§6Frequently attracts and milks cows.§r\n Has an internal fluid tank. Does not feed the animals. Use buckets to retrieve the milk.",
|
||||
"block.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.",
|
||||
"block.engineersdecor.sign_decor": "Sign Plate (Engineer's decor)",
|
||||
"block.engineersdecor.sign_decor.help": "§6This should not be craftable or visible in JEI. Used for creative tab and screenshots.",
|
||||
"block.engineersdecor.sign_hotwire": "Sign \"Caution Hot Wire\"",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"side": "engineersdecor:block/crafting_table/treated_wood_crafting_table_side",
|
||||
"top": "engineersdecor:block/crafting_table/treated_wood_crafting_table_top",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"shutter": "engineersdecor:block/device/factory_dropper_shutter",
|
||||
"top": "engineersdecor:block/device/factory_dropper_top",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"shutter": "engineersdecor:block/device/factory_dropper_shutter",
|
||||
"top": "engineersdecor:block/device/factory_dropper_top",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"t": "engineersdecor:block/device/factory_hopper_top",
|
||||
"b": "engineersdecor:block/device/factory_hopper_bottom",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"t": "engineersdecor:block/device/factory_hopper_top",
|
||||
"b": "engineersdecor:block/device/factory_hopper_bottom",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"t": "engineersdecor:block/device/factory_hopper_top",
|
||||
"b": "engineersdecor:block/device/factory_hopper_bottom",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"top": "engineersdecor:block/device/factory_placer_top",
|
||||
"bottom": "engineersdecor:block/device/factory_placer_bottom",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"t": "engineersdecor:block/device/small_block_breaker_top",
|
||||
"b": "engineersdecor:block/device/small_block_breaker_bottom",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"t": "engineersdecor:block/device/small_block_breaker_top",
|
||||
"b": "engineersdecor:block/device/small_block_breaker_bottom",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"top": "engineersdecor:block/device/small_fluid_funnel_top",
|
||||
"bottom": "engineersdecor:block/device/small_fluid_funnel_bottom",
|
||||
|
|
|
@ -0,0 +1,273 @@
|
|||
{
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"b": "engineersdecor:block/device/small_milking_machine_back",
|
||||
"particle": "engineersdecor:block/device/small_milking_machine_back",
|
||||
"tb": "engineersdecor:block/device/small_milking_machine_topbottom",
|
||||
"s": "engineersdecor:block/device/small_milking_machine_side",
|
||||
"f": "engineersdecor:block/device/small_milking_machine_front",
|
||||
"p": "engineersdecor:block/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": "#tb"},
|
||||
"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": "#tb"},
|
||||
"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": "#tb"},
|
||||
"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": "#tb"},
|
||||
"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/block",
|
||||
"textures": {
|
||||
"b": "engineersdecor:block/device/small_milking_machine_back",
|
||||
"particle": "engineersdecor:block/device/small_milking_machine_back",
|
||||
"tb": "engineersdecor:block/device/small_milking_machine_topbottom",
|
||||
"s": "engineersdecor:block/device/small_milking_machine_side",
|
||||
"f": "engineersdecor:block/device/small_milking_machine_front",
|
||||
"p": "engineersdecor:block/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": "#tb"},
|
||||
"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": "#tb"},
|
||||
"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": "#tb"},
|
||||
"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": "#tb"},
|
||||
"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]
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"parent": "engineersdecor:block/device/small_milking_machine_model",
|
||||
"textures": { "f":"engineersdecor:block/device/small_milking_machine_front_filled" }
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"parent": "engineersdecor:block/device/small_milking_machine_model_active",
|
||||
"textures": { "f":"engineersdecor:block/device/small_milking_machine_front_filled" }
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"2": "engineersdecor:block/device/small_solar_panel_side",
|
||||
"m": "engineersdecor:block/device/small_solar_panel_parts",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"2": "engineersdecor:block/device/small_solar_panel_side",
|
||||
"m": "engineersdecor:block/device/small_solar_panel_parts",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"2": "engineersdecor:block/device/small_solar_panel_side",
|
||||
"m": "engineersdecor:block/device/small_solar_panel_parts",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"2": "engineersdecor:block/device/small_solar_panel_side",
|
||||
"m": "engineersdecor:block/device/small_solar_panel_parts",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"2": "engineersdecor:block/device/small_solar_panel_side",
|
||||
"m": "engineersdecor:block/device/small_solar_panel_parts",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"2": "engineersdecor:block/device/tree_cutter_side",
|
||||
"3": "engineersdecor:block/device/tree_cutter_top",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"2": "engineersdecor:block/device/tree_cutter_side",
|
||||
"3": "engineersdecor:block/device/tree_cutter_top",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"top": "engineersdecor:block/furnace/small_electrical_furnace_top",
|
||||
"particle": "engineersdecor:block/furnace/small_electrical_furnace_top",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"handles": "engineersdecor:block/furnace/small_lab_furnace_handles",
|
||||
"particle": "engineersdecor:block/furnace/small_lab_furnace_handles",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"front": "engineersdecor:block/furnace/small_mineral_smelter_front_s0",
|
||||
"top": "engineersdecor:block/furnace/small_mineral_smelter_top",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"particle": "engineersdecor:block/furnace/small_waste_incinerator_side",
|
||||
"top": "engineersdecor:block/furnace/small_waste_incinerator_top",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"ambientocclusion": false,
|
||||
"textures": {
|
||||
"glass": "engineersdecor:block/glass/window_glass_texture"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"s": "engineersdecor:block/furniture/steel_table_side_texture",
|
||||
"particle": "engineersdecor:block/furniture/steel_table_side_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"ambientocclusion": false,
|
||||
"textures": {
|
||||
"glass": "engineersdecor:block/glass/window_glass_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"ambientocclusion": false,
|
||||
"textures": {
|
||||
"frame": "engineersdecor:block/iestyle/steel_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"s": "engineersdecor:block/furniture/steel_table_side_texture",
|
||||
"particle": "engineersdecor:block/furniture/steel_table_side_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"o": "engineersdecor:block/iestyle/treated_wood_framed_texture",
|
||||
"particle": "engineersdecor:block/iestyle/treated_wood_framed_texture"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"o": "engineersdecor:block/iestyle/treated_wood_framed_texture",
|
||||
"particle": "engineersdecor:block/iestyle/treated_wood_framed_texture"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"o": "engineersdecor:block/iestyle/treated_wood_framed_texture",
|
||||
"particle": "engineersdecor:block/iestyle/treated_wood_framed_texture"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"ambientocclusion": false,
|
||||
"textures": {
|
||||
"glass": "engineersdecor:block/glass/window_glass_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"ambientocclusion": false,
|
||||
"textures": {
|
||||
"frame": "engineersdecor:block/iestyle/treated_wood_rough_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"o": "engineersdecor:block/iestyle/treated_wood_rough_texture",
|
||||
"particle": "engineersdecor:block/iestyle/treated_wood_rough_texture"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"o": "engineersdecor:block/iestyle/treated_wood_rough_texture",
|
||||
"particle": "engineersdecor:block/iestyle/treated_wood_rough_texture"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"end": "engineersdecor:block/hsupport/steel_double_t_support_end_texture",
|
||||
"particle": "engineersdecor:block/hsupport/steel_double_t_support_end_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"end": "engineersdecor:block/hsupport/steel_double_t_support_end_texture",
|
||||
"particle": "engineersdecor:block/hsupport/steel_double_t_support_end_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"pside": "engineersdecor:block/pole/thick_steel_pole_side_texture",
|
||||
"particle": "engineersdecor:block/pole/thick_steel_pole_side_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"pside": "engineersdecor:block/pole/thin_steel_pole_side_texture",
|
||||
"particle": "engineersdecor:block/pole/thin_steel_pole_side_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"particle": "engineersdecor:block/iestyle/steel_texture",
|
||||
"o": "engineersdecor:block/iestyle/steel_texture"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"o": "engineersdecor:block/iestyle/steel_texture",
|
||||
"particle": "engineersdecor:block/iestyle/steel_texture"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"o": "engineersdecor:block/iestyle/treated_wood_rough_texture",
|
||||
"particle": "engineersdecor:block/iestyle/treated_wood_rough_texture"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"light": "engineersdecor:block/light/lamp_glass_warm_square_texture",
|
||||
"side": "engineersdecor:block/iestyle/steel_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"light": "engineersdecor:block/light/lamp_glass_warm_square_texture",
|
||||
"side": "engineersdecor:block/iestyle/steel_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"side": "engineersdecor:block/pole/treated_wood_pole_side_texture",
|
||||
"particle": "engineersdecor:block/pole/treated_wood_pole_side_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"side": "engineersdecor:block/pole/treated_wood_pole_side_texture",
|
||||
"particle": "engineersdecor:block/pole/treated_wood_pole_side_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"side": "engineersdecor:block/pole/treated_wood_pole_side_texture",
|
||||
"particle": "engineersdecor:block/pole/treated_wood_pole_side_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"side": "engineersdecor:block/pole/thick_steel_pole_side_texture",
|
||||
"particle": "engineersdecor:block/pole/thick_steel_pole_side_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"side": "engineersdecor:block/pole/thick_steel_pole_side_texture",
|
||||
"particle": "engineersdecor:block/pole/thick_steel_pole_side_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"side": "engineersdecor:block/pole/thin_steel_pole_side_texture",
|
||||
"particle": "engineersdecor:block/pole/thin_steel_pole_side_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"side": "engineersdecor:block/pole/thin_steel_pole_side_texture",
|
||||
"particle": "engineersdecor:block/pole/thin_steel_pole_side_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"s": "engineersdecor:block/iestyle/treated_wood_rough_texture",
|
||||
"f": "engineersdecor:block/sign/engineersdecor-logo",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"s": "engineersdecor:block/iestyle/treated_wood_rough_texture",
|
||||
"particle": "engineersdecor:block/iestyle/treated_wood_rough_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"s": "engineersdecor:block/iestyle/treated_wood_rough_texture",
|
||||
"particle": "engineersdecor:block/iestyle/treated_wood_rough_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"s": "engineersdecor:block/iestyle/treated_wood_rough_texture",
|
||||
"particle": "engineersdecor:block/iestyle/treated_wood_rough_texture",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"parent": "block/cube",
|
||||
"parent": "block/block",
|
||||
"textures": {
|
||||
"particle": "#all",
|
||||
"side": "#all",
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
{ "parent": "engineersdecor:block/device/small_milking_machine_model" }
|
After Width: | Height: | Size: 563 B |
After Width: | Height: | Size: 473 B |
After Width: | Height: | Size: 483 B |
After Width: | Height: | Size: 516 B |
After Width: | Height: | Size: 560 B |
After Width: | Height: | Size: 581 B |