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).

This commit is contained in:
stfwi 2019-11-17 21:41:27 +01:00
parent 1938f34faf
commit d159dbca8c
105 changed files with 1952 additions and 470 deletions

View file

@ -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

View file

@ -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.

View file

@ -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());
}
}

View file

@ -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();
}
}
}

View file

@ -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();
}

View file

@ -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()
{}
}

View file

@ -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;
}
}

View file

@ -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();

View file

@ -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 }
}
}

View file

@ -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\"",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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]
}
}
}

View file

@ -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]
}
}
}

View file

@ -0,0 +1,4 @@
{
"parent": "engineersdecor:block/device/small_milking_machine_model",
"textures": { "f":"engineersdecor:block/device/small_milking_machine_front_filled" }
}

View file

@ -0,0 +1,4 @@
{
"parent": "engineersdecor:block/device/small_milking_machine_model_active",
"textures": { "f":"engineersdecor:block/device/small_milking_machine_front_filled" }
}

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

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

View file

@ -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",

View file

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

View file

@ -1,5 +1,5 @@
{
"parent": "block/cube",
"parent": "block/block",
"ambientocclusion": false,
"textures": {
"frame": "engineersdecor:block/iestyle/steel_texture",

View file

@ -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",

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

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

View file

@ -1,5 +1,5 @@
{
"parent": "block/cube",
"parent": "block/block",
"ambientocclusion": false,
"textures": {
"frame": "engineersdecor:block/iestyle/treated_wood_rough_texture",

View file

@ -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"

View file

@ -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"

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -1,5 +1,5 @@
{
"parent": "block/cube",
"parent": "block/block",
"textures": {
"particle": "engineersdecor:block/iestyle/steel_texture",
"o": "engineersdecor:block/iestyle/steel_texture"

View file

@ -1,5 +1,5 @@
{
"parent": "block/cube",
"parent": "block/block",
"textures": {
"o": "engineersdecor:block/iestyle/steel_texture",
"particle": "engineersdecor:block/iestyle/steel_texture"

View file

@ -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"

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -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",

View file

@ -1,5 +1,5 @@
{
"parent": "block/cube",
"parent": "block/block",
"textures": {
"particle": "#all",
"side": "#all",

View file

@ -0,0 +1 @@
{ "parent": "engineersdecor:block/device/small_milking_machine_model" }

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 560 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 B

View file

@ -0,0 +1,26 @@
{
"type": "minecraft:block",
"pools": [
{
"name": "small_milking_machine_dlt",
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"functions": [
{
"function": "minecraft:copy_name",
"source": "block_entity"
},
{
"function": "minecraft:copy_nbt",
"source": "block_entity",
"ops": []
}
],
"name": "engineersdecor:small_milking_machine"
}
]
}
]
}

View file

@ -19,6 +19,6 @@
},
"result": {
"item": "engineersdecor:slag_brick_block",
"count": 4
"count": 8
}
}

View file

@ -0,0 +1,33 @@
{
"conditions": [
{
"type": "engineersdecor:optional",
"result": "engineersdecor:small_milking_machine",
"missing": ["immersiveengineering:metal_barrel"]
}
],
"type": "minecraft:crafting_shaped",
"pattern": [
"PPP",
"PAO",
"PRP"
],
"key": {
"O": {
"item": "minecraft:observer"
},
"P": {
"item": "minecraft:iron_ingot"
},
"A": {
"item": "minecraft:milk_bucket"
},
"R": {
"item": "minecraft:redstone_block"
}
},
"result": {
"item": "engineersdecor:small_milking_machine",
"count": 1
}
}