pipe locking and fluid tanks

This commit is contained in:
DrMangoTea
2023-09-06 18:32:12 +02:00
parent c98ff140a2
commit 97352a15ff
267 changed files with 9061 additions and 123 deletions

View File

@@ -0,0 +1,27 @@
package com.drmangotea.tfmg.base;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.simibubi.create.content.fluids.pipes.FluidPipeBlock;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Pointing;
import com.tterrag.registrate.providers.DataGenContext;
import com.tterrag.registrate.providers.RegistrateBlockstateProvider;
import com.tterrag.registrate.util.nullness.NonNullBiConsumer;
import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraftforge.client.model.generators.ModelFile;
import net.minecraftforge.client.model.generators.MultiPartBlockStateBuilder;
import org.apache.commons.lang3.tuple.Pair;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
public class TFMGBlockStateGen {
}

View File

@@ -1,15 +1,14 @@
package com.drmangotea.tfmg.base.creative_mode_tabs;
import com.drmangotea.tfmg.registry.TFMGBlocks;
import com.drmangotea.tfmg.registry.TFMGItems;
import com.simibubi.create.content.decoration.palettes.AllPaletteBlocks;
import com.simibubi.create.infrastructure.item.CreateCreativeModeTab;
import net.minecraft.core.NonNullList;
import net.minecraft.world.item.ItemStack;
public class ConcreteCreativeModeTab extends TFMGCreativeModeTab {
public ConcreteCreativeModeTab() {
super("concrete");
public class BuldingCreativeModeTab extends TFMGCreativeModeTab {
public BuldingCreativeModeTab() {
super("building");
}
@Override
@@ -18,6 +17,6 @@ public class ConcreteCreativeModeTab extends TFMGCreativeModeTab {
@Override
public ItemStack makeIcon() {
return TFMGItems.COPPER_GRENADE.asStack();
return TFMGBlocks.CONCRETE.asStack();
}
}

View File

@@ -9,6 +9,10 @@ import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.material.FluidState;
import net.minecraftforge.fluids.ForgeFlowingFluid;
/**
* makes fluid burn when close to fire,
* not working for now
*/
public class BurnableFluid extends ForgeFlowingFluid {

View File

@@ -9,6 +9,10 @@ import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
/**
* making blockstate for fire in registrate is pain/idk how to do it
* so no registrate for those :skull:
*/
public class TFMGColoredFires {
public static final DeferredRegister<Block> BLOCKS =

View File

@@ -0,0 +1,25 @@
package com.drmangotea.tfmg.content.items;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.block.Block;
import org.jetbrains.annotations.Nullable;
public class CoalCokeBlockItem extends BlockItem {
public CoalCokeBlockItem(Block p_40565_, Properties p_40566_) {
super(p_40565_, p_40566_);
}
@Override
public int getBurnTime(ItemStack itemStack, @Nullable RecipeType<?> recipeType) {
return 28800;
}
}

View File

@@ -0,0 +1,27 @@
package com.drmangotea.tfmg.content.items;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.block.Block;
import net.minecraftforge.common.property.Properties;
import org.jetbrains.annotations.Nullable;
public class CoalCokeItem extends Item {
public CoalCokeItem(Properties p_40566_) {
super( p_40566_);
}
@Override
public int getBurnTime(ItemStack itemStack, @Nullable RecipeType<?> recipeType) {
return 3200;
}
}

View File

@@ -0,0 +1,25 @@
package com.drmangotea.tfmg.content.items;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.block.Block;
import org.jetbrains.annotations.Nullable;
public class FossilstoneItem extends BlockItem {
public FossilstoneItem(Block p_40565_, Properties p_40566_) {
super(p_40565_, p_40566_);
}
@Override
public int getBurnTime(ItemStack itemStack, @Nullable RecipeType<?> recipeType) {
return 4000;
}
}

View File

@@ -0,0 +1,53 @@
package com.drmangotea.tfmg.content.items;
import com.drmangotea.tfmg.content.machines.pipes.normal.LockablePipeBlockEntity;
import com.drmangotea.tfmg.content.machines.pipes.normal.steel.SteelPipeBlock;
import com.drmangotea.tfmg.registry.TFMGBlocks;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
public class ScrewdriverItem extends Item {
public ScrewdriverItem(Properties p_40566_) {
super( p_40566_);
}
@Override
public InteractionResult useOn(UseOnContext pContext) {
Player player = pContext.getPlayer();
BlockPos positionClicked = pContext.getClickedPos();
Level level = pContext.getLevel();
if(level.getBlockState(positionClicked).is(TFMGBlocks.STEEL_PIPE.get())) {
level.playSound(player, positionClicked, SoundEvents.ANVIL_PLACE, SoundSource.BLOCKS, 0.3f,0.5f);
((LockablePipeBlockEntity)level.getBlockEntity(positionClicked)).toggleLock(player);
}
pContext.getItemInHand().hurtAndBreak(1, pContext.getPlayer(),
(playerr) -> playerr.broadcastBreakEvent(playerr.getUsedItemHand()));
return InteractionResult.SUCCESS;
}
}

View File

@@ -1,32 +0,0 @@
package com.drmangotea.tfmg.content.items;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.block.Block;
import org.jetbrains.annotations.Nullable;
public class TFMGFuelItem extends BlockItem {
private final int burnTicks;
public static TFMGFuelItem fossilstone(Block block,Properties properties) {
return new TFMGFuelItem(block,properties, 4000);
}
public static TFMGFuelItem coal_coke(Block block,Properties properties){
return new TFMGFuelItem(block,properties,3200);
}
public TFMGFuelItem(Block p_40565_, Properties p_40566_,int burnTime) {
super(p_40565_, p_40566_);
this.burnTicks = burnTime;
}
@Override
public int getBurnTime(ItemStack itemStack, @Nullable RecipeType<?> recipeType) {
return burnTicks;
}
}

View File

@@ -0,0 +1,44 @@
package com.drmangotea.tfmg.content.machines.pipes.normal;
import com.simibubi.create.content.fluids.pipes.FluidPipeBlockEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
public class LockablePipeBlockEntity extends FluidPipeBlockEntity {
public boolean locked = false;
public LockablePipeBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state);
}
public void toggleLock(Player player){
level.playSound(player, getBlockPos(), SoundEvents.ANVIL_PLACE, SoundSource.BLOCKS, 0.3f,0.5f);
locked = !locked;
}
@Override
public void write(CompoundTag compound, boolean clientPacket) {
compound.putBoolean("Locked", locked);
super.write(compound, clientPacket);
}
@Override
protected void read(CompoundTag compound, boolean clientPacket) {
super.read(compound, clientPacket);
locked = compound.getBoolean("Locked");
}
}

View File

@@ -0,0 +1,19 @@
package com.drmangotea.tfmg.content.machines.pipes.normal;
import com.simibubi.create.content.fluids.pipes.FluidPipeBlockEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
public class TFMGPipeBlockEntity extends FluidPipeBlockEntity {
public TFMGPipeBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state);
}
}

View File

@@ -0,0 +1,70 @@
package com.drmangotea.tfmg.content.machines.pipes.normal.steel;
import com.drmangotea.tfmg.registry.TFMGBlockEntities;
import com.drmangotea.tfmg.registry.TFMGBlocks;
import com.simibubi.create.content.fluids.FluidTransportBehaviour;
import com.simibubi.create.content.fluids.pipes.EncasedPipeBlock;
import com.simibubi.create.content.fluids.pipes.FluidPipeBlockEntity;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.HitResult;
import java.util.function.Supplier;
public class EncasedSteelPipeBlock extends EncasedPipeBlock {
public EncasedSteelPipeBlock(Properties p_i48339_1_, Supplier<Block> casing) {
super(p_i48339_1_, casing);
}
@Override
public ItemStack getCloneItemStack(BlockState state, HitResult target, BlockGetter world, BlockPos pos, Player player) {
return TFMGBlocks.STEEL_PIPE.asStack();
}
@Override
public InteractionResult onWrenched(BlockState state, UseOnContext context) {
Level world = context.getLevel();
BlockPos pos = context.getClickedPos();
if (world.isClientSide)
return InteractionResult.SUCCESS;
context.getLevel()
.levelEvent(2001, context.getClickedPos(), Block.getId(state));
BlockState equivalentPipe = transferSixWayProperties(state, TFMGBlocks.STEEL_PIPE.getDefaultState());
Direction firstFound = Direction.UP;
for (Direction d : Iterate.directions)
if (state.getValue(FACING_TO_PROPERTY_MAP.get(d))) {
firstFound = d;
break;
}
FluidTransportBehaviour.cacheFlows(world, pos);
world.setBlockAndUpdate(pos, TFMGBlocks.STEEL_PIPE.get()
.updateBlockState(equivalentPipe, firstFound, null, world, pos));
FluidTransportBehaviour.loadFlows(world, pos);
return InteractionResult.SUCCESS;
}
@Override
public Class<FluidPipeBlockEntity> getBlockEntityClass() {
return FluidPipeBlockEntity.class;
}
@Override
public BlockEntityType<? extends FluidPipeBlockEntity> getBlockEntityType() {
return TFMGBlockEntities.ENCASED_STEEL_PIPE.get();
}
}

View File

@@ -0,0 +1,80 @@
package com.drmangotea.tfmg.content.machines.pipes.normal.steel;
import com.drmangotea.tfmg.registry.TFMGBlockEntities;
import com.drmangotea.tfmg.registry.TFMGBlocks;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.fluids.FluidTransportBehaviour;
import com.simibubi.create.content.fluids.pipes.EncasedPipeBlock;
import com.simibubi.create.content.fluids.pipes.FluidPipeBlock;
import com.simibubi.create.content.fluids.pipes.GlassFluidPipeBlock;
import com.simibubi.create.content.fluids.pipes.StraightPipeBlockEntity;
import com.simibubi.create.content.schematics.requirement.ItemRequirement;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import java.util.Map;
public class GlassSteelPipeBlock extends GlassFluidPipeBlock {
public GlassSteelPipeBlock(Properties p_i48339_1_) {
super(p_i48339_1_);
}
@Override
public ItemRequirement getRequiredItems(BlockState state, BlockEntity te) {
return ItemRequirement.of(TFMGBlocks.STEEL_PIPE.getDefaultState(), te);
}
@Override
public ItemStack getCloneItemStack(BlockState state, HitResult target, BlockGetter world, BlockPos pos,
Player player) {
return TFMGBlocks.STEEL_PIPE.asStack();
}
@Override
public BlockState toRegularPipe(LevelAccessor world, BlockPos pos, BlockState state) {
Direction side = Direction.get(Direction.AxisDirection.POSITIVE, state.getValue(AXIS));
Map<Direction, BooleanProperty> facingToPropertyMap = FluidPipeBlock.PROPERTY_BY_DIRECTION;
return TFMGBlocks.STEEL_PIPE.get()
.updateBlockState(TFMGBlocks.STEEL_PIPE.getDefaultState()
.setValue(facingToPropertyMap.get(side), true)
.setValue(facingToPropertyMap.get(side.getOpposite()), true), side, null, world, pos);
}
@Override
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand,
BlockHitResult hit) {
if (!AllBlocks.COPPER_CASING.isIn(player.getItemInHand(hand)))
return InteractionResult.PASS;
if (world.isClientSide)
return InteractionResult.SUCCESS;
BlockState newState = TFMGBlocks.COPPER_ENCASED_STEEL_PIPE.getDefaultState();
for (Direction d : Iterate.directionsInAxis(getAxis(state)))
newState = newState.setValue(EncasedPipeBlock.FACING_TO_PROPERTY_MAP.get(d), true);
FluidTransportBehaviour.cacheFlows(world, pos);
world.setBlockAndUpdate(pos, newState);
FluidTransportBehaviour.loadFlows(world, pos);
return InteractionResult.SUCCESS;
}
@Override
public Class<StraightPipeBlockEntity> getBlockEntityClass() {
return StraightPipeBlockEntity.class;
}
@Override
public BlockEntityType<? extends StraightPipeBlockEntity> getBlockEntityType() {
return TFMGBlockEntities.GLASS_STEEL_PIPE.get();
}
}

View File

@@ -0,0 +1,134 @@
package com.drmangotea.tfmg.content.machines.pipes.normal.steel;
import com.drmangotea.tfmg.registry.TFMGPartialModels;
import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour;
import com.simibubi.create.content.fluids.FluidTransportBehaviour;
import com.simibubi.create.content.fluids.pipes.FluidPipeBlock;
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
import com.simibubi.create.foundation.model.BakedModelWrapperWithData;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.ChunkRenderTypeSet;
import net.minecraftforge.client.model.data.ModelData;
import net.minecraftforge.client.model.data.ModelProperty;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class SteelPipeAttachmentModel extends BakedModelWrapperWithData {
private static final ModelProperty<PipeModelData> PIPE_PROPERTY = new ModelProperty<>();
public SteelPipeAttachmentModel(BakedModel template) {
super(template);
}
@Override
protected ModelData.Builder gatherModelData(ModelData.Builder builder, BlockAndTintGetter world, BlockPos pos, BlockState state,
ModelData blockEntityData) {
PipeModelData data = new PipeModelData();
FluidTransportBehaviour transport = BlockEntityBehaviour.get(world, pos, FluidTransportBehaviour.TYPE);
BracketedBlockEntityBehaviour bracket = BlockEntityBehaviour.get(world, pos, BracketedBlockEntityBehaviour.TYPE);
if (transport != null)
for (Direction d : Iterate.directions)
data.putAttachment(d, transport.getRenderedRimAttachment(world, pos, state, d));
if (bracket != null)
data.putBracket(bracket.getBracket());
data.setEncased(FluidPipeBlock.shouldDrawCasing(world, pos, state));
return builder.with(PIPE_PROPERTY, data);
}
@SuppressWarnings("removal")
@Override
public ChunkRenderTypeSet getRenderTypes(@NotNull BlockState state, @NotNull RandomSource rand, @NotNull ModelData data) {
ChunkRenderTypeSet set = super.getRenderTypes(state, rand, data);
if (set.isEmpty()) {
return ItemBlockRenderTypes.getRenderLayers(state);
}
return set;
}
@Override
public List<BakedQuad> getQuads(BlockState state, Direction side, RandomSource rand, ModelData data, RenderType renderType) {
List<BakedQuad> quads = super.getQuads(state, side, rand, data, renderType);
if (data.has(PIPE_PROPERTY)) {
PipeModelData pipeData = data.get(PIPE_PROPERTY);
quads = new ArrayList<>(quads);
addQuads(quads, state, side, rand, data, pipeData, renderType);
}
return quads;
}
private void addQuads(List<BakedQuad> quads, BlockState state, Direction side, RandomSource rand, ModelData data,
PipeModelData pipeData, RenderType renderType) {
BakedModel bracket = pipeData.getBracket();
if (bracket != null)
quads.addAll(bracket.getQuads(state, side, rand, data, renderType));
for (Direction d : Iterate.directions) {
FluidTransportBehaviour.AttachmentTypes type = pipeData.getAttachment(d);
for (FluidTransportBehaviour.AttachmentTypes.ComponentPartials partial : type.partials) {
quads.addAll(TFMGPartialModels.STEEL_PIPE_ATTACHMENTS.get(partial)
.get(d)
.get()
.getQuads(state, side, rand, data, renderType));
}
}
if (pipeData.isEncased())
quads.addAll(TFMGPartialModels.STEEL_FLUID_PIPE_CASING.get()
.getQuads(state, side, rand, data, renderType));
}
private static class PipeModelData {
private FluidTransportBehaviour.AttachmentTypes[] attachments;
private boolean encased;
private BakedModel bracket;
public PipeModelData() {
attachments = new FluidTransportBehaviour.AttachmentTypes[6];
Arrays.fill(attachments, FluidTransportBehaviour.AttachmentTypes.NONE);
}
public void putBracket(BlockState state) {
if (state != null) {
this.bracket = Minecraft.getInstance()
.getBlockRenderer()
.getBlockModel(state);
}
}
public BakedModel getBracket() {
return bracket;
}
public void putAttachment(Direction face, FluidTransportBehaviour.AttachmentTypes rim) {
attachments[face.get3DDataValue()] = rim;
}
public FluidTransportBehaviour.AttachmentTypes getAttachment(Direction face) {
return attachments[face.get3DDataValue()];
}
public void setEncased(boolean encased) {
this.encased = encased;
}
public boolean isEncased() {
return encased;
}
}
}

View File

@@ -0,0 +1,207 @@
package com.drmangotea.tfmg.content.machines.pipes.normal.steel;
import com.drmangotea.tfmg.CreateTFMG;
import com.drmangotea.tfmg.content.machines.pipes.normal.LockablePipeBlockEntity;
import com.drmangotea.tfmg.registry.TFMGBlockEntities;
import com.drmangotea.tfmg.registry.TFMGBlocks;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour;
import com.simibubi.create.content.fluids.FluidPropagator;
import com.simibubi.create.content.fluids.FluidTransportBehaviour;
import com.simibubi.create.content.fluids.pipes.EncasedPipeBlock;
import com.simibubi.create.content.fluids.pipes.FluidPipeBlock;
import com.simibubi.create.content.fluids.pipes.FluidPipeBlockEntity;
import com.simibubi.create.content.fluids.pipes.GlassFluidPipeBlock;
import com.simibubi.create.foundation.advancement.AllAdvancements;
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.Vec3;
import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.concurrent.locks.Lock;
public class SteelPipeBlock extends FluidPipeBlock {
// public static final BooleanProperty LOCKEDDDD = BlockStateProperties.LOCKED;
public SteelPipeBlock(Properties properties) {
super(properties);
// this.registerDefaultState(super.defaultBlockState().setValue(LOCKEDDDD, false));
}
public BlockState updateBlockState(BlockState state, Direction preferredDirection, @Nullable Direction ignore,
BlockAndTintGetter world, BlockPos pos) {
if(world.getBlockEntity(pos) instanceof LockablePipeBlockEntity)
if(((LockablePipeBlockEntity)world.getBlockEntity(pos)).locked){
return state;
}
BracketedBlockEntityBehaviour bracket = BlockEntityBehaviour.get(world, pos, BracketedBlockEntityBehaviour.TYPE);
if (bracket != null && bracket.isBracketPresent())
return state;
BlockState prevState = state;
int prevStateSides = (int) Arrays.stream(Iterate.directions)
.map(PROPERTY_BY_DIRECTION::get)
.filter(prevState::getValue)
.count();
// Update sides that are not ignored
for (Direction d : Iterate.directions)
if (d != ignore) {
boolean shouldConnect = canConnectTo(world, pos.relative(d), world.getBlockState(pos.relative(d)), d);
if(world.getBlockEntity(pos.relative(d)) instanceof LockablePipeBlockEntity) {
if (((LockablePipeBlockEntity) world.getBlockEntity(pos.relative(d))).locked) {
shouldConnect = false;
if(world.getBlockState(pos.relative(d)).getValue(PROPERTY_BY_DIRECTION.get(d.getOpposite()))){
shouldConnect =true;
}
}
}
state = state.setValue(PROPERTY_BY_DIRECTION.get(d), shouldConnect);
}
// See if it has enough connections
Direction connectedDirection = null;
for (Direction d : Iterate.directions) {
if (isOpenAt(state, d)) {
if (connectedDirection != null)
return state;
connectedDirection = d;
}
}
// Add opposite end if only one connection
if (connectedDirection != null)
return state.setValue(PROPERTY_BY_DIRECTION.get(connectedDirection.getOpposite()), true);
// If we can't connect to anything and weren't connected before, do nothing
if (prevStateSides == 2)
return prevState;
// Use preferred
return state.setValue(PROPERTY_BY_DIRECTION.get(preferredDirection), true)
.setValue(PROPERTY_BY_DIRECTION.get(preferredDirection.getOpposite()), true);
}
@Override
public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource r) {
super.tick(state,world,pos,r);
}
@Override
public InteractionResult onWrenched(BlockState state, UseOnContext context) {
if (tryRemoveBracket(context))
return InteractionResult.SUCCESS;
Level world = context.getLevel();
BlockPos pos = context.getClickedPos();
Direction clickedFace = context.getClickedFace();
Direction.Axis axis = getAxis(world, pos, state);
if (axis == null) {
Vec3 clickLocation = context.getClickLocation()
.subtract(pos.getX(), pos.getY(), pos.getZ());
double closest = Float.MAX_VALUE;
Direction argClosest = Direction.UP;
for (Direction direction : Iterate.directions) {
if (clickedFace.getAxis() == direction.getAxis())
continue;
Vec3 centerOf = Vec3.atCenterOf(direction.getNormal());
double distance = centerOf.distanceToSqr(clickLocation);
if (distance < closest) {
closest = distance;
argClosest = direction;
}
}
axis = argClosest.getAxis();
}
if (clickedFace.getAxis() == axis)
return InteractionResult.PASS;
if (!world.isClientSide) {
withBlockEntityDo(world, pos, fpte -> fpte.getBehaviour(FluidTransportBehaviour.TYPE).interfaces.values()
.stream()
.filter(pc -> pc != null && pc.hasFlow())
.findAny()
.ifPresent($ -> AllAdvancements.GLASS_PIPE.awardTo(context.getPlayer())));
FluidTransportBehaviour.cacheFlows(world, pos);
world.setBlockAndUpdate(pos, TFMGBlocks.GLASS_STEEL_PIPE.getDefaultState()
.setValue(GlassFluidPipeBlock.AXIS, axis)
.setValue(BlockStateProperties.WATERLOGGED, state.getValue(BlockStateProperties.WATERLOGGED)));
FluidTransportBehaviour.loadFlows(world, pos);
}
return InteractionResult.SUCCESS;
}
@Nullable
private Direction.Axis getAxis(BlockGetter world, BlockPos pos, BlockState state) {
return FluidPropagator.getStraightPipeAxis(state);
}
@Override
public ItemStack getCloneItemStack(BlockState state, HitResult target, BlockGetter world, BlockPos pos,
Player player) {
return TFMGBlocks.STEEL_PIPE.asStack();
}
@Override
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand,
BlockHitResult hit) {
if (!AllBlocks.COPPER_CASING.isIn(player.getItemInHand(hand)))
return InteractionResult.PASS;
if (world.isClientSide)
return InteractionResult.SUCCESS;
FluidTransportBehaviour.cacheFlows(world, pos);
world.setBlockAndUpdate(pos,
EncasedPipeBlock.transferSixWayProperties(state, TFMGBlocks.COPPER_ENCASED_STEEL_PIPE.getDefaultState()));
FluidTransportBehaviour.loadFlows(world, pos);
return InteractionResult.SUCCESS;
}
// @Override
// protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
// super.createBlockStateDefinition(builder);
// builder.add(LOCKEDDDD);
// }
@Override
public Class<FluidPipeBlockEntity> getBlockEntityClass() {
return FluidPipeBlockEntity.class;
}
@Override
public BlockEntityType<? extends FluidPipeBlockEntity> getBlockEntityType() {
return TFMGBlockEntities.STEEL_PIPE.get();
}
}

View File

@@ -0,0 +1,37 @@
/*
package com.drmangotea.tfmg.content.machines.pipes.pumps;
import com.drmangotea.createindustry.registry.CIBlockEntities;
import com.simibubi.create.content.fluids.pump.PumpBlock;
import com.simibubi.create.content.fluids.pump.PumpBlockEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
public class SteelPumpBlock extends PumpBlock {
public SteelPumpBlock(Properties p_i48415_1_) {
super(p_i48415_1_);
}
@Override
public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource r) {
super.tick(state,world,pos,r);
this.getBlockEntity(world,pos).updatePressureChange();
}
@Override
public Class<PumpBlockEntity> getBlockEntityClass() {
return PumpBlockEntity.class;
}
@Override
public BlockEntityType<? extends PumpBlockEntity> getBlockEntityType() {
return CIBlockEntities.STEEL_PUMP.get();
}
}
*/

View File

@@ -0,0 +1,13 @@
package com.drmangotea.tfmg.content.machines.pipes.pumps;
import com.simibubi.create.content.fluids.pump.PumpBlockEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
public class SteelPumpTileEntity extends PumpBlockEntity {
public SteelPumpTileEntity(BlockEntityType<?> typeIn, BlockPos pos, BlockState state) {
super(typeIn, pos, state);
}
}

View File

@@ -0,0 +1,89 @@
package com.drmangotea.tfmg.content.machines.tanks;
import com.drmangotea.tfmg.base.TFMGSpriteShifts;
import com.simibubi.create.api.connectivity.ConnectivityHandler;
import com.simibubi.create.content.fluids.tank.FluidTankCTBehaviour;
import com.simibubi.create.foundation.block.connected.CTModel;
import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.model.data.ModelData;
import net.minecraftforge.client.model.data.ModelProperty;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class SteelFluidTankModel extends CTModel {
protected static final ModelProperty<CullData> CULL_PROPERTY = new ModelProperty<>();
public static SteelFluidTankModel standard(BakedModel originalModel) {
return new SteelFluidTankModel(originalModel, TFMGSpriteShifts.STEEL_FLUID_TANK, TFMGSpriteShifts.STEEL_FLUID_TANK_TOP,
TFMGSpriteShifts.STEEL_FLUID_TANK_INNER);
}
private SteelFluidTankModel(BakedModel originalModel, CTSpriteShiftEntry side, CTSpriteShiftEntry top,
CTSpriteShiftEntry inner) {
super(originalModel, new FluidTankCTBehaviour(side, top, inner));
}
@Override
protected ModelData.Builder gatherModelData(ModelData.Builder builder, BlockAndTintGetter world, BlockPos pos, BlockState state,
ModelData blockEntityData) {
super.gatherModelData(builder, world, pos, state, blockEntityData);
CullData cullData = new CullData();
for (Direction d : Iterate.horizontalDirections)
cullData.setCulled(d, ConnectivityHandler.isConnected(world, pos, pos.relative(d)));
return builder.with(CULL_PROPERTY, cullData);
}
@Override
public List<BakedQuad> getQuads(BlockState state, Direction side, RandomSource rand, ModelData extraData, RenderType renderType) {
if (side != null)
return Collections.emptyList();
List<BakedQuad> quads = new ArrayList<>();
for (Direction d : Iterate.directions) {
if (extraData.has(CULL_PROPERTY) && extraData.get(CULL_PROPERTY)
.isCulled(d))
continue;
quads.addAll(super.getQuads(state, d, rand, extraData, renderType));
}
quads.addAll(super.getQuads(state, null, rand, extraData, renderType));
return quads;
}
private class CullData {
boolean[] culledFaces;
public CullData() {
culledFaces = new boolean[4];
Arrays.fill(culledFaces, false);
}
void setCulled(Direction face, boolean cull) {
if (face.getAxis()
.isVertical())
return;
culledFaces[face.get2DDataValue()] = cull;
}
boolean isCulled(Direction face) {
if (face.getAxis()
.isVertical())
return false;
return culledFaces[face.get2DDataValue()];
}
}
}

View File

@@ -0,0 +1,119 @@
package com.drmangotea.tfmg.content.machines.tanks;
import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.foundation.blockEntity.renderer.SafeBlockEntityRenderer;
import com.simibubi.create.foundation.fluid.FluidRenderer;
import com.simibubi.create.foundation.render.CachedBufferer;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.animation.LerpedFloat;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.templates.FluidTank;
public class SteelFluidTankRenderer extends SafeBlockEntityRenderer<SteelTankBlockEntity> {
public SteelFluidTankRenderer(BlockEntityRendererProvider.Context context) {}
@Override
protected void renderSafe(SteelTankBlockEntity te, float partialTicks, PoseStack ms, MultiBufferSource buffer,
int light, int overlay) {
if (!te.isController())
return;
if (!te.window) {
//// if (te.tower.isActive())
//// renderAsBoiler(te, partialTicks, ms, buffer, light, overlay);
return;
}
LerpedFloat fluidLevel = te.getFluidLevel();
if (fluidLevel == null)
return;
float capHeight = 1 / 4f;
float tankHullWidth = 1 / 16f + 1 / 128f;
float minPuddleHeight = 1 / 16f;
float totalHeight = te.height - 2 * capHeight - minPuddleHeight;
float level = fluidLevel.getValue(partialTicks);
if (level < 1 / (512f * totalHeight))
return;
float clampedLevel = Mth.clamp(level * totalHeight, 0, totalHeight);
FluidTank tank = te.tankInventory;
FluidStack fluidStack = tank.getFluid();
if (fluidStack.isEmpty())
return;
boolean top = fluidStack.getFluid()
.getFluidType()
.isLighterThanAir();
float xMin = tankHullWidth;
float xMax = xMin + te.width - 2 * tankHullWidth;
float yMin = totalHeight + capHeight + minPuddleHeight - clampedLevel;
float yMax = yMin + clampedLevel;
if (top) {
yMin += totalHeight - clampedLevel;
yMax += totalHeight - clampedLevel;
}
float zMin = tankHullWidth;
float zMax = zMin + te.width - 2 * tankHullWidth;
ms.pushPose();
ms.translate(0, clampedLevel - totalHeight, 0);
FluidRenderer.renderFluidBox(fluidStack, xMin, yMin, zMin, xMax, yMax, zMax, buffer, ms, light, false);
ms.popPose();
}
protected void renderAsBoiler(SteelTankBlockEntity te, float partialTicks, PoseStack ms, MultiBufferSource buffer,
int light, int overlay) {
BlockState blockState = te.getBlockState();
VertexConsumer vb = buffer.getBuffer(RenderType.solid());
ms.pushPose();
TransformStack msr = TransformStack.cast(ms);
msr.translate(te.width / 2f, 0.5, te.width / 2f);
float dialPivot = 5.75f / 16;
//// float progress = te.tower.gauge.getValue(partialTicks);
for (Direction d : Iterate.horizontalDirections) {
ms.pushPose();
//// CachedBufferer.partial(CIPartialModels.TOWER_GAUGE, blockState)
//// .rotateY(d.toYRot())
//// .unCentre()
//// .translate(te.width / 2f - 6 / 16f, 0, 0)
//// .light(light)
//// .renderInto(ms, vb);
CachedBufferer.partial(AllPartialModels.BOILER_GAUGE_DIAL, blockState)
.rotateY(d.toYRot())
.unCentre()
.translate(te.width / 2f - 6 / 16f, 0, 0)
.translate(0, dialPivot, dialPivot)
.rotateX(-te.visualGaugeRotation.getValue(partialTicks))
.translate(0, -dialPivot, -dialPivot)
.light(light)
.renderInto(ms, vb);
ms.popPose();
}
ms.popPose();
}
@Override
public boolean shouldRenderOffScreen(SteelTankBlockEntity te) {
return te.isController();
}
}

View File

@@ -0,0 +1,351 @@
package com.drmangotea.tfmg.content.machines.tanks;
import com.drmangotea.tfmg.registry.TFMGBlockEntities;
import com.simibubi.create.api.connectivity.ConnectivityHandler;
import com.simibubi.create.content.equipment.wrench.IWrenchable;
import com.simibubi.create.content.fluids.transfer.GenericItemEmptying;
import com.simibubi.create.content.fluids.transfer.GenericItemFilling;
import com.simibubi.create.foundation.block.IBE;
import com.simibubi.create.foundation.blockEntity.ComparatorUtil;
import com.simibubi.create.foundation.fluid.FluidHelper;
import com.simibubi.create.foundation.fluid.FluidHelper.FluidExchange;
import com.simibubi.create.foundation.utility.Lang;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.particles.BlockParticleOption;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth;
import net.minecraft.util.StringRepresentable;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Mirror;
import net.minecraft.world.level.block.Rotation;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition.Builder;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.EnumProperty;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraftforge.common.util.ForgeSoundType;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
public class SteelTankBlock extends Block implements IWrenchable, IBE<SteelTankBlockEntity> {
public static final BooleanProperty TOP = BooleanProperty.create("top");
public static final BooleanProperty BOTTOM = BooleanProperty.create("bottom");
public static final EnumProperty<Shape> SHAPE = EnumProperty.create("shape", Shape.class);
private boolean creative;
public static SteelTankBlock regular(Properties p_i48440_1_) {
return new SteelTankBlock(p_i48440_1_, false);
}
public static SteelTankBlock creative(Properties p_i48440_1_) {
return new SteelTankBlock(p_i48440_1_, true);
}
protected SteelTankBlock(Properties p_i48440_1_, boolean creative) {
super(p_i48440_1_);
this.creative = creative;
registerDefaultState(defaultBlockState().setValue(TOP, true)
.setValue(BOTTOM, true)
.setValue(SHAPE, Shape.WINDOW));
}
public static boolean isTank(BlockState state) {
return state.getBlock() instanceof SteelTankBlock;
}
@Override
public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean moved) {
if (oldState.getBlock() == state.getBlock())
return;
if (moved)
return;
withBlockEntityDo(world, pos, SteelTankBlockEntity::updateConnectivity);
}
@Override
protected void createBlockStateDefinition(Builder<Block, BlockState> p_206840_1_) {
p_206840_1_.add(TOP, BOTTOM, SHAPE);
}
@Override
public int getLightEmission(BlockState state, BlockGetter world, BlockPos pos) {
SteelTankBlockEntity tankAt = ConnectivityHandler.partAt(getBlockEntityType(), world, pos);
if (tankAt == null)
return 0;
SteelTankBlockEntity controllerTE = (SteelTankBlockEntity) tankAt.getControllerBE();
if (controllerTE == null || !controllerTE.window)
return 0;
return tankAt.luminosity;
}
@Override
public InteractionResult onWrenched(BlockState state, UseOnContext context) {
withBlockEntityDo(context.getLevel(), context.getClickedPos(), SteelTankBlockEntity::toggleWindows);
return InteractionResult.SUCCESS;
}
static final VoxelShape CAMPFIRE_SMOKE_CLIP = Block.box(0, 4, 0, 16, 16, 16);
@Override
public VoxelShape getCollisionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos,
CollisionContext pContext) {
if (pContext == CollisionContext.empty())
return CAMPFIRE_SMOKE_CLIP;
return pState.getShape(pLevel, pPos);
}
@Override
public VoxelShape getBlockSupportShape(BlockState pState, BlockGetter pReader, BlockPos pPos) {
return Shapes.block();
}
@Override
public BlockState updateShape(BlockState pState, Direction pDirection, BlockState pNeighborState,
LevelAccessor pLevel, BlockPos pCurrentPos, BlockPos pNeighborPos) {
if (pDirection == Direction.DOWN && pNeighborState.getBlock() != this)
withBlockEntityDo(pLevel, pCurrentPos, SteelTankBlockEntity::updateBoilerTemperature);
return pState;
}
@Override
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand,
BlockHitResult ray) {
ItemStack heldItem = player.getItemInHand(hand);
boolean onClient = world.isClientSide;
if (heldItem.isEmpty())
return InteractionResult.PASS;
if (!player.isCreative() && !creative)
return InteractionResult.PASS;
FluidExchange exchange = null;
SteelTankBlockEntity te = ConnectivityHandler.partAt(getBlockEntityType(), world, pos);
if (te == null)
return InteractionResult.FAIL;
LazyOptional<IFluidHandler> tankCapability = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY);
if (!tankCapability.isPresent())
return InteractionResult.PASS;
IFluidHandler fluidTank = tankCapability.orElse(null);
FluidStack prevFluidInTank = fluidTank.getFluidInTank(0)
.copy();
if (FluidHelper.tryEmptyItemIntoBE(world, player, hand, heldItem, te))
exchange = FluidExchange.ITEM_TO_TANK;
else if (FluidHelper.tryFillItemFromBE(world, player, hand, heldItem, te))
exchange = FluidExchange.TANK_TO_ITEM;
if (exchange == null) {
if (GenericItemEmptying.canItemBeEmptied(world, heldItem)
|| GenericItemFilling.canItemBeFilled(world, heldItem))
return InteractionResult.SUCCESS;
return InteractionResult.PASS;
}
SoundEvent soundevent = null;
BlockState fluidState = null;
FluidStack fluidInTank = tankCapability.map(fh -> fh.getFluidInTank(0))
.orElse(FluidStack.EMPTY);
if (exchange == FluidExchange.ITEM_TO_TANK) {
Fluid fluid = fluidInTank.getFluid();
fluidState = fluid.defaultFluidState()
.createLegacyBlock();
soundevent = FluidHelper.getEmptySound(fluidInTank);
}
if (exchange == FluidExchange.TANK_TO_ITEM) {
Fluid fluid = prevFluidInTank.getFluid();
fluidState = fluid.defaultFluidState()
.createLegacyBlock();
soundevent = FluidHelper.getFillSound(prevFluidInTank);
}
if (soundevent != null && !onClient) {
float pitch = Mth
.clamp(1 - (1f * fluidInTank.getAmount() / (SteelTankBlockEntity.getCapacityMultiplier() * 16)), 0, 1);
pitch /= 1.5f;
pitch += .5f;
pitch += (world.random.nextFloat() - .5f) / 4f;
world.playSound(null, pos, soundevent, SoundSource.BLOCKS, .5f, pitch);
}
if (!fluidInTank.isFluidStackIdentical(prevFluidInTank)) {
if (te instanceof SteelTankBlockEntity) {
SteelTankBlockEntity controllerTE = (SteelTankBlockEntity) ((SteelTankBlockEntity) te).getControllerBE();
if (controllerTE != null) {
if (fluidState != null && onClient) {
BlockParticleOption blockParticleData =
new BlockParticleOption(ParticleTypes.BLOCK, fluidState);
float level = (float) fluidInTank.getAmount() / fluidTank.getTankCapacity(0);
boolean reversed = fluidInTank.getFluid()
.getFluidType()
.isLighterThanAir();
if (reversed)
level = 1 - level;
Vec3 vec = ray.getLocation();
vec = new Vec3(vec.x, controllerTE.getBlockPos()
.getY() + level * (controllerTE.height - .5f) + .25f, vec.z);
Vec3 motion = player.position()
.subtract(vec)
.scale(1 / 20f);
vec = vec.add(motion);
world.addParticle(blockParticleData, vec.x, vec.y, vec.z, motion.x, motion.y, motion.z);
return InteractionResult.SUCCESS;
}
controllerTE.sendDataImmediately();
controllerTE.setChanged();
}
}
}
return InteractionResult.SUCCESS;
}
@Override
public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean isMoving) {
if (state.hasBlockEntity() && (state.getBlock() != newState.getBlock() || !newState.hasBlockEntity())) {
BlockEntity te = world.getBlockEntity(pos);
if (!(te instanceof SteelTankBlockEntity))
return;
SteelTankBlockEntity tankTE = (SteelTankBlockEntity) te;
world.removeBlockEntity(pos);
ConnectivityHandler.splitMulti(tankTE);
}
}
@Override
public Class<SteelTankBlockEntity> getBlockEntityClass() {
return SteelTankBlockEntity.class;
}
@Override
public BlockEntityType<? extends SteelTankBlockEntity> getBlockEntityType() {
return creative ? TFMGBlockEntities.STEEL_FLUID_TANK.get() : TFMGBlockEntities.STEEL_FLUID_TANK.get();
}
@Override
public BlockState mirror(BlockState state, Mirror mirror) {
if (mirror == Mirror.NONE)
return state;
boolean x = mirror == Mirror.FRONT_BACK;
switch (state.getValue(SHAPE)) {
case WINDOW_NE:
return state.setValue(SHAPE, x ? Shape.WINDOW_NW : Shape.WINDOW_SE);
case WINDOW_NW:
return state.setValue(SHAPE, x ? Shape.WINDOW_NE : Shape.WINDOW_SW);
case WINDOW_SE:
return state.setValue(SHAPE, x ? Shape.WINDOW_SW : Shape.WINDOW_NE);
case WINDOW_SW:
return state.setValue(SHAPE, x ? Shape.WINDOW_SE : Shape.WINDOW_NW);
default:
return state;
}
}
@Override
public BlockState rotate(BlockState state, Rotation rotation) {
for (int i = 0; i < rotation.ordinal(); i++)
state = rotateOnce(state);
return state;
}
private BlockState rotateOnce(BlockState state) {
switch (state.getValue(SHAPE)) {
case WINDOW_NE:
return state.setValue(SHAPE, Shape.WINDOW_SE);
case WINDOW_NW:
return state.setValue(SHAPE, Shape.WINDOW_NE);
case WINDOW_SE:
return state.setValue(SHAPE, Shape.WINDOW_SW);
case WINDOW_SW:
return state.setValue(SHAPE, Shape.WINDOW_NW);
default:
return state;
}
}
public enum Shape implements StringRepresentable {
PLAIN, WINDOW, WINDOW_NW, WINDOW_SW, WINDOW_NE, WINDOW_SE;
@Override
public String getSerializedName() {
return Lang.asId(name());
}
}
// Tanks are less noisy when placed in batch
public static final SoundType SILENCED_METAL =
new ForgeSoundType(0.1F, 1.5F, () -> SoundEvents.METAL_BREAK, () -> SoundEvents.METAL_STEP,
() -> SoundEvents.METAL_PLACE, () -> SoundEvents.METAL_HIT, () -> SoundEvents.METAL_FALL);
@Override
public SoundType getSoundType(BlockState state, LevelReader world, BlockPos pos, Entity entity) {
SoundType soundType = super.getSoundType(state, world, pos, entity);
if (entity != null && entity.getPersistentData()
.contains("SilenceTankSound"))
return SILENCED_METAL;
return soundType;
}
@Override
public boolean hasAnalogOutputSignal(BlockState state) {
return true;
}
@Override
public int getAnalogOutputSignal(BlockState blockState, Level worldIn, BlockPos pos) {
return getBlockEntityOptional(worldIn, pos).map(SteelTankBlockEntity::getControllerBE)
.map(te -> ComparatorUtil.fractionToRedstoneLevel(te.getFillState()))
.orElse(0);
}
public static void updateTowerState(BlockState pState, Level pLevel, BlockPos tankPos) {
BlockState tankState = pLevel.getBlockState(tankPos);
if (!(tankState.getBlock()instanceof SteelTankBlock tank))
return;
SteelTankBlockEntity tankTE = tank.getBlockEntity(pLevel, tankPos);
if (tankTE == null)
return;
SteelTankBlockEntity controllerTE = (SteelTankBlockEntity) tankTE.getControllerBE();
if (controllerTE == null)
return;
controllerTE.updateBoilerState();
}
}

View File

@@ -0,0 +1,656 @@
package com.drmangotea.tfmg.content.machines.tanks;
import com.simibubi.create.api.connectivity.ConnectivityHandler;
import com.simibubi.create.content.equipment.goggles.IHaveGoggleInformation;
import com.simibubi.create.content.fluids.tank.FluidTankBlockEntity;
import com.simibubi.create.foundation.blockEntity.IMultiBlockEntityContainer;
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
import com.simibubi.create.foundation.fluid.SmartFluidTank;
import com.simibubi.create.foundation.utility.animation.LerpedFloat;
import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser;
import com.simibubi.create.infrastructure.config.AllConfigs;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlock.Shape;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.network.chat.Component;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidType;
import net.minecraftforge.fluids.IFluidTank;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;
import net.minecraftforge.fluids.capability.templates.FluidTank;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.List;
import static java.lang.Math.abs;
public class SteelTankBlockEntity extends FluidTankBlockEntity implements IHaveGoggleInformation, IMultiBlockEntityContainer.Fluid {
private static final int MAX_SIZE = 3;
protected LazyOptional<IFluidHandler> fluidCapability;
protected boolean forceFluidLevelUpdate;
public FluidTank tankInventory;
protected BlockPos controller;
protected BlockPos lastKnownPos;
protected boolean updateConnectivity;
public boolean window;
public int luminosity;
public int width;
public int height;
public int gaugeRotation=0;
////public DistillationTowerData tower;
private static final int SYNC_RATE = 8;
protected int syncCooldown;
protected boolean queuedSync;
// For rendering purposes only
private LerpedFloat fluidLevel;
public LerpedFloat visualGaugeRotation =LerpedFloat.angular();;
public SteelTankBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state);
tankInventory = createInventory();
fluidCapability = LazyOptional.of(() -> tankInventory);
forceFluidLevelUpdate = true;
updateConnectivity = false;
window = true;
height = 1;
width = 1;
////// tower = new DistillationTowerData();
refreshCapability();
}
protected SmartFluidTank createInventory() {
return new SmartFluidTank(getCapacityMultiplier(), this::onFluidStackChanged);
}
public void updateConnectivity() {
updateConnectivity = false;
if (level.isClientSide)
return;
if (!isController())
return;
ConnectivityHandler.formMulti(this);
}
@Override
public void tick() {
super.tick();
getGaugeRotation();
visualGaugeRotation.chase(gaugeRotation, 0.2f, Chaser.EXP);
visualGaugeRotation.tickChaser();
if (syncCooldown > 0) {
syncCooldown--;
if (syncCooldown == 0 && queuedSync)
sendData();
}
if (lastKnownPos == null)
lastKnownPos = getBlockPos();
else if (!lastKnownPos.equals(worldPosition) && worldPosition != null) {
onPositionChanged();
return;
}
if (updateConnectivity)
updateConnectivity();
if (fluidLevel != null)
fluidLevel.tickChaser();
//// if (isController())
//// tower.tick(this);
}
@Override
public BlockPos getLastKnownPos() {
return lastKnownPos;
}
@Override
public boolean isController() {
return controller == null || worldPosition.getX() == controller.getX()
&& worldPosition.getY() == controller.getY() && worldPosition.getZ() == controller.getZ();
}
@Override
public void initialize() {
super.initialize();
sendData();
if (level.isClientSide)
invalidateRenderBoundingBox();
}
private void onPositionChanged() {
removeController(true);
lastKnownPos = worldPosition;
}
protected void onFluidStackChanged(FluidStack newFluidStack) {
if (!hasLevel())
return;
FluidType attributes = newFluidStack.getFluid()
.getFluidType();
int luminosity = (int) (attributes.getLightLevel(newFluidStack) / 1.2f);
boolean reversed = attributes.isLighterThanAir();
int maxY = (int) ((getFillState() * height) + 1);
for (int yOffset = 0; yOffset < height; yOffset++) {
boolean isBright = reversed ? (height - yOffset <= maxY) : (yOffset < maxY);
int actualLuminosity = isBright ? luminosity : luminosity > 0 ? 1 : 0;
for (int xOffset = 0; xOffset < width; xOffset++) {
for (int zOffset = 0; zOffset < width; zOffset++) {
BlockPos pos = this.worldPosition.offset(xOffset, yOffset, zOffset);
SteelTankBlockEntity tankAt = ConnectivityHandler.partAt(getType(), level, pos);
if (tankAt == null)
continue;
level.updateNeighbourForOutputSignal(pos, tankAt.getBlockState()
.getBlock());
if (tankAt.luminosity == actualLuminosity)
continue;
tankAt.setLuminosity(actualLuminosity);
}
}
}
if (!level.isClientSide) {
setChanged();
sendData();
}
if (isVirtual()) {
if (fluidLevel == null)
fluidLevel = LerpedFloat.linear()
.startWithValue(getFillState());
fluidLevel.chase(getFillState(), .5f, Chaser.EXP);
}
}
protected void setLuminosity(int luminosity) {
if (level.isClientSide)
return;
if (this.luminosity == luminosity)
return;
this.luminosity = luminosity;
sendData();
}
@SuppressWarnings("unchecked")
@Override
public SteelTankBlockEntity getControllerBE() {
if (isController())
return this;
BlockEntity tileEntity = level.getBlockEntity(controller);
if (tileEntity instanceof SteelTankBlockEntity)
return (SteelTankBlockEntity) tileEntity;
return null;
}
public void applyFluidTankSize(int blocks) {
tankInventory.setCapacity(blocks * getCapacityMultiplier());
int overflow = tankInventory.getFluidAmount() - tankInventory.getCapacity();
if (overflow > 0)
tankInventory.drain(overflow, FluidAction.EXECUTE);
forceFluidLevelUpdate = true;
}
public void removeController(boolean keepFluids) {
if (level.isClientSide)
return;
updateConnectivity = true;
if (!keepFluids)
applyFluidTankSize(1);
controller = null;
width = 1;
height = 1;
//// tower.clear();
onFluidStackChanged(tankInventory.getFluid());
BlockState state = getBlockState();
if (SteelTankBlock.isTank(state)) {
state = state.setValue(SteelTankBlock.BOTTOM, true);
state = state.setValue(SteelTankBlock.TOP, true);
state = state.setValue(SteelTankBlock.SHAPE, window ? SteelTankBlock.Shape.WINDOW : SteelTankBlock.Shape.PLAIN);
getLevel().setBlock(worldPosition, state, 22);
}
refreshCapability();
setChanged();
sendData();
}
public void toggleWindows() {
SteelTankBlockEntity te = getControllerBE();
if (te == null)
return;
//// if (te.tower.isActive())
//// return;
te.setWindows(!te.window);
}
public void updateBoilerTemperature() {
SteelTankBlockEntity te = getControllerBE();
if (te == null)
return;
//// if (!te.tower.isActive())
//// return;
//// te.tower.needsHeatLevelUpdate = true;
}
public void sendDataImmediately() {
syncCooldown = 0;
queuedSync = false;
sendData();
}
@Override
public void sendData() {
if (syncCooldown > 0) {
queuedSync = true;
return;
}
super.sendData();
queuedSync = false;
syncCooldown = SYNC_RATE;
}
public void setWindows(boolean window) {
this.window = window;
for (int yOffset = 0; yOffset < height; yOffset++) {
for (int xOffset = 0; xOffset < width; xOffset++) {
for (int zOffset = 0; zOffset < width; zOffset++) {
BlockPos pos = this.worldPosition.offset(xOffset, yOffset, zOffset);
BlockState blockState = level.getBlockState(pos);
if (!SteelTankBlock.isTank(blockState))
continue;
Shape shape = Shape.PLAIN;
if (window) {
// SIZE 1: Every tank has a window
if (width == 1)
shape = Shape.WINDOW;
// SIZE 2: Every tank has a corner window
if (width == 2)
shape = xOffset == 0 ? zOffset == 0 ? Shape.WINDOW_NW : Shape.WINDOW_SW
: zOffset == 0 ? Shape.WINDOW_NE : Shape.WINDOW_SE;
// SIZE 3: Tanks in the center have a window
if (width == 3 && abs(abs(xOffset) - abs(zOffset)) == 1)
shape = Shape.WINDOW;
}
level.setBlock(pos, blockState.setValue(SteelTankBlock.SHAPE, shape), 22);
level.getChunkSource()
.getLightEngine()
.checkBlock(pos);
}
}
}
}
public void updateBoilerState() {
if (!isController())
return;
//// boolean wasBoiler = tower.isActive();
//// boolean changed = tower.evaluate(this);
//// if (wasBoiler != tower.isActive()) {
//// //// if (tower.isActive())
//// //// setWindows(false);
//// for (int yOffset = 0; yOffset < height; yOffset++)
//// for (int xOffset = 0; xOffset < width; xOffset++)
//// for (int zOffset = 0; zOffset < width; zOffset++)
//// if (level.getBlockEntity(
//// worldPosition.offset(xOffset, yOffset, zOffset))instanceof SteelTankBlockEntity fte)
//// fte.refreshCapability();
//// }
/// if (changed) {
/// notifyUpdate();
/// }
}
@Override
public void setController(BlockPos controller) {
if (level.isClientSide && !isVirtual())
return;
if (controller.equals(this.controller))
return;
this.controller = controller;
refreshCapability();
setChanged();
sendData();
}
private void refreshCapability() {
LazyOptional<IFluidHandler> oldCap = fluidCapability;
fluidCapability = LazyOptional.of(() -> handlerForCapability());
oldCap.invalidate();
}
private IFluidHandler handlerForCapability() {
return tankInventory;////isController()
////? tower.isActive()
////? tower.createHandler()
////: tankInventory
////: getControllerBE() != null ? getControllerBE().handlerForCapability()
////: new FluidTank(0);
}
@Override
public BlockPos getController() {
return isController() ? worldPosition : controller;
}
@Override
protected AABB createRenderBoundingBox() {
if (isController())
return super.createRenderBoundingBox().expandTowards(width - 1, height - 1, width - 1);
else
return super.createRenderBoundingBox();
}
@Nullable
public SteelTankBlockEntity getOtherFluidTankTileEntity(Direction direction) {
BlockEntity otherTE = level.getBlockEntity(worldPosition.relative(direction));
if (otherTE instanceof SteelTankBlockEntity)
return (SteelTankBlockEntity) otherTE;
return null;
}
@Override
public boolean addToGoggleTooltip(List<Component> tooltip, boolean isPlayerSneaking) {
SteelTankBlockEntity controllerTE = getControllerBE();
if (controllerTE == null)
return false;
/////// if (controllerTE.tower.addToGoggleTooltip(tooltip, isPlayerSneaking, controllerTE.getTotalTankSize()))
/////// return true;
return containedFluidTooltip(tooltip, isPlayerSneaking,
controllerTE.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY));
}
@Override
protected void read(CompoundTag compound, boolean clientPacket) {
super.read(compound, clientPacket);
BlockPos controllerBefore = controller;
int prevSize = width;
int prevHeight = height;
int prevLum = luminosity;
updateConnectivity = compound.contains("Uninitialized");
luminosity = compound.getInt("Luminosity");
controller = null;
lastKnownPos = null;
if (compound.contains("LastKnownPos"))
lastKnownPos = NbtUtils.readBlockPos(compound.getCompound("LastKnownPos"));
if (compound.contains("Controller"))
controller = NbtUtils.readBlockPos(compound.getCompound("Controller"));
if (isController()) {
window = compound.getBoolean("Window");
width = compound.getInt("Size");
height = compound.getInt("Height");
tankInventory.setCapacity(getTotalTankSize() * getCapacityMultiplier());
tankInventory.readFromNBT(compound.getCompound("TankContent"));
if (tankInventory.getSpace() < 0)
tankInventory.drain(-tankInventory.getSpace(), FluidAction.EXECUTE);
}
///// tower.read(compound.getCompound("Boiler"), width * width * height);
if (compound.contains("ForceFluidLevel") || fluidLevel == null)
fluidLevel = LerpedFloat.linear()
.startWithValue(getFillState());
if (!clientPacket)
return;
boolean changeOfController =
controllerBefore == null ? controller != null : !controllerBefore.equals(controller);
if (changeOfController || prevSize != width || prevHeight != height) {
if (hasLevel())
level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 16);
if (isController())
tankInventory.setCapacity(getCapacityMultiplier() * getTotalTankSize());
invalidateRenderBoundingBox();
}
if (isController()) {
float fillState = getFillState();
if (compound.contains("ForceFluidLevel") || fluidLevel == null)
fluidLevel = LerpedFloat.linear()
.startWithValue(fillState);
fluidLevel.chase(fillState, 0.5f, Chaser.EXP);
}
if (luminosity != prevLum && hasLevel())
level.getChunkSource()
.getLightEngine()
.checkBlock(worldPosition);
if (compound.contains("LazySync"))
fluidLevel.chase(fluidLevel.getChaseTarget(), 0.125f, Chaser.EXP);
}
public void getGaugeRotation(){
////// int level=tower.towerLevel;
////// if(level>=13){
////// gaugeRotation=90;
////// } else
////// if(level>=4){
////// gaugeRotation=45;
////// } else{
////// gaugeRotation=0;
////// }
}
public float getFillState() {
return (float) tankInventory.getFluidAmount() / tankInventory.getCapacity();
}
@Override
public void write(CompoundTag compound, boolean clientPacket) {
if (updateConnectivity)
compound.putBoolean("Uninitialized", true);
/////// compound.put("Boiler", tower.write());
if (lastKnownPos != null)
compound.put("LastKnownPos", NbtUtils.writeBlockPos(lastKnownPos));
if (!isController())
compound.put("Controller", NbtUtils.writeBlockPos(controller));
if (isController()) {
compound.putBoolean("Window", window);
compound.put("TankContent", tankInventory.writeToNBT(new CompoundTag()));
compound.putInt("Size", width);
compound.putInt("Height", height);
}
compound.putInt("Luminosity", luminosity);
// super.write(compound, clientPacket);
//super.saveAdditional(compound);
forEachBehaviour(tb -> tb.write(compound, clientPacket));
if (!clientPacket)
return;
if (forceFluidLevelUpdate)
compound.putBoolean("ForceFluidLevel", true);
if (queuedSync)
compound.putBoolean("LazySync", true);
forceFluidLevelUpdate = false;
}
@Nonnull
@Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
if (!fluidCapability.isPresent())
refreshCapability();
if (cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)
return fluidCapability.cast();
return super.getCapability(cap, side);
}
@Override
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
//registerAwardables(behaviours, AllAdvancements.STEAM_ENGINE_MAXED, AllAdvancements.PIPE_ORGAN);
}
public IFluidTank getTankInventory() {
return tankInventory;
}
public int getTotalTankSize() {
return width * width * height;
}
public static int getMaxSize() {
return MAX_SIZE;
}
public static int getCapacityMultiplier() {
return AllConfigs.server().fluids.fluidTankCapacity.get() * 1000;
}
public static int getMaxHeight() {
return AllConfigs.server().fluids.fluidTankMaxHeight.get();
}
public LerpedFloat getFluidLevel() {
return fluidLevel;
}
public void setFluidLevel(LerpedFloat fluidLevel) {
this.fluidLevel = fluidLevel;
}
@Override
public void preventConnectivityUpdate() {
updateConnectivity = false;
}
@Override
public void notifyMultiUpdated() {
BlockState state = this.getBlockState();
if (SteelTankBlock.isTank(state)) { // safety
state = state.setValue(SteelTankBlock.BOTTOM, getController().getY() == getBlockPos().getY());
state = state.setValue(SteelTankBlock.TOP, getController().getY() + height - 1 == getBlockPos().getY());
level.setBlock(getBlockPos(), state, 6);
}
if (isController())
setWindows(window);
onFluidStackChanged(tankInventory.getFluid());
updateBoilerState();
setChanged();
}
@Override
public void setExtraData(@Nullable Object data) {
if (data instanceof Boolean)
window = (boolean) data;
}
@Override
@Nullable
public Object getExtraData() {
return window;
}
@Override
public Object modifyExtraData(Object data) {
if (data instanceof Boolean windows) {
windows |= window;
return windows;
}
return data;
}
@Override
public Direction.Axis getMainConnectionAxis() {
return Direction.Axis.Y;
}
@Override
public int getMaxLength(Direction.Axis longAxis, int width) {
if (longAxis == Direction.Axis.Y)
return getMaxHeight();
return getMaxWidth();
}
@Override
public int getMaxWidth() {
return MAX_SIZE;
}
@Override
public int getHeight() {
return height;
}
@Override
public void setHeight(int height) {
this.height = height;
}
@Override
public int getWidth() {
return width;
}
@Override
public void setWidth(int width) {
this.width = width;
}
@Override
public boolean hasTank() {
return true;
}
@Override
public int getTankSize(int tank) {
return getCapacityMultiplier();
}
@Override
public void setTankSize(int tank, int blocks) {
applyFluidTankSize(blocks);
}
@Override
public IFluidTank getTank(int tank) {
return tankInventory;
}
@Override
public FluidStack getFluid(int tank) {
return tankInventory.getFluid()
.copy();
}
}

View File

@@ -0,0 +1,63 @@
package com.drmangotea.tfmg.content.machines.tanks;
import com.simibubi.create.foundation.data.AssetLookup;
import com.simibubi.create.foundation.data.SpecialBlockStateGen;
import com.tterrag.registrate.providers.DataGenContext;
import com.tterrag.registrate.providers.RegistrateBlockstateProvider;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.model.generators.ModelFile;
public class SteelTankGenerator extends SpecialBlockStateGen {
private String prefix;
public SteelTankGenerator() {
this("");
}
public SteelTankGenerator(String prefix) {
this.prefix = prefix;
}
@Override
protected int getXRotation(BlockState state) {
return 0;
}
@Override
protected int getYRotation(BlockState state) {
return 0;
}
@Override
public <T extends Block> ModelFile getModel(DataGenContext<Block, T> ctx, RegistrateBlockstateProvider prov,
BlockState state) {
Boolean top = state.getValue(SteelTankBlock.TOP);
Boolean bottom = state.getValue(SteelTankBlock.BOTTOM);
SteelTankBlock.Shape shape = state.getValue(SteelTankBlock.SHAPE);
String shapeName = "middle";
if (top && bottom)
shapeName = "single";
else if (top)
shapeName = "top";
else if (bottom)
shapeName = "bottom";
String modelName = shapeName + (shape == SteelTankBlock.Shape.PLAIN ? "" : "_" + shape.getSerializedName());
if (!prefix.isEmpty())
return prov.models()
.withExistingParent(prefix + modelName, prov.modLoc("block/fluid_tank/block_" + modelName))
.texture("0", prov.modLoc("block/" + prefix + "casing"))
.texture("1", prov.modLoc("block/" + prefix + "fluid_tank"))
.texture("3", prov.modLoc("block/" + prefix + "fluid_tank_window"))
.texture("4", prov.modLoc("block/" + prefix + "casing"))
.texture("5", prov.modLoc("block/" + prefix + "fluid_tank_window_single"))
.texture("particle", prov.modLoc("block/" + prefix + "steel_fluid_tank"));
return AssetLookup.partialBaseModel(ctx, prov, modelName);
}
}

View File

@@ -0,0 +1,133 @@
package com.drmangotea.tfmg.content.machines.tanks;
import com.drmangotea.tfmg.registry.TFMGBlockEntities;
import com.simibubi.create.api.connectivity.ConnectivityHandler;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.fluids.FluidStack;
public class SteelTankItem extends BlockItem {
public SteelTankItem(Block p_i48527_1_, Properties p_i48527_2_) {
super(p_i48527_1_, p_i48527_2_);
}
@Override
public InteractionResult place(BlockPlaceContext ctx) {
InteractionResult initialResult = super.place(ctx);
if (!initialResult.consumesAction())
return initialResult;
tryMultiPlace(ctx);
return initialResult;
}
@Override
protected boolean updateCustomBlockEntityTag(BlockPos p_195943_1_, Level p_195943_2_, Player p_195943_3_,
ItemStack p_195943_4_, BlockState p_195943_5_) {
MinecraftServer minecraftserver = p_195943_2_.getServer();
if (minecraftserver == null)
return false;
CompoundTag nbt = p_195943_4_.getTagElement("BlockEntityTag");
if (nbt != null) {
nbt.remove("Luminosity");
nbt.remove("Size");
nbt.remove("Height");
nbt.remove("Controller");
nbt.remove("LastKnownPos");
if (nbt.contains("TankContent")) {
FluidStack fluid = FluidStack.loadFluidStackFromNBT(nbt.getCompound("TankContent"));
if (!fluid.isEmpty()) {
fluid.setAmount(Math.min(SteelTankBlockEntity.getCapacityMultiplier(), fluid.getAmount()));
nbt.put("TankContent", fluid.writeToNBT(new CompoundTag()));
}
}
}
return super.updateCustomBlockEntityTag(p_195943_1_, p_195943_2_, p_195943_3_, p_195943_4_, p_195943_5_);
}
private void tryMultiPlace(BlockPlaceContext ctx) {
Player player = ctx.getPlayer();
if (player == null)
return;
if (player.isShiftKeyDown())
return;
Direction face = ctx.getClickedFace();
if (!face.getAxis()
.isVertical())
return;
ItemStack stack = ctx.getItemInHand();
Level world = ctx.getLevel();
BlockPos pos = ctx.getClickedPos();
BlockPos placedOnPos = pos.relative(face.getOpposite());
BlockState placedOnState = world.getBlockState(placedOnPos);
if (!SteelTankBlock.isTank(placedOnState))
return;
SteelTankBlockEntity tankAt = ConnectivityHandler.partAt(
TFMGBlockEntities.STEEL_FLUID_TANK.get(), world, placedOnPos
);
if (tankAt == null)
return;
SteelTankBlockEntity controllerTE = (SteelTankBlockEntity) tankAt.getControllerBE();
if (controllerTE == null)
return;
int width = controllerTE.width;
if (width == 1)
return;
int tanksToPlace = 0;
BlockPos startPos = face == Direction.DOWN ? controllerTE.getBlockPos()
.below()
: controllerTE.getBlockPos()
.above(controllerTE.height);
if (startPos.getY() != pos.getY())
return;
for (int xOffset = 0; xOffset < width; xOffset++) {
for (int zOffset = 0; zOffset < width; zOffset++) {
BlockPos offsetPos = startPos.offset(xOffset, 0, zOffset);
BlockState blockState = world.getBlockState(offsetPos);
if (SteelTankBlock.isTank(blockState))
continue;
if (!blockState.getMaterial()
.isReplaceable())
return;
tanksToPlace++;
}
}
if (!player.isCreative() && stack.getCount() < tanksToPlace)
return;
for (int xOffset = 0; xOffset < width; xOffset++) {
for (int zOffset = 0; zOffset < width; zOffset++) {
BlockPos offsetPos = startPos.offset(xOffset, 0, zOffset);
BlockState blockState = world.getBlockState(offsetPos);
if (SteelTankBlock.isTank(blockState))
continue;
BlockPlaceContext context = BlockPlaceContext.at(ctx, offsetPos, face);
player.getPersistentData()
.putBoolean("SilenceTankSound", true);
super.place(context);
player.getPersistentData()
.remove("SilenceTankSound");
}
}
}
}

View File

@@ -24,6 +24,9 @@ import org.spongepowered.asm.mixin.Shadow;
import java.util.HashMap;
import java.util.Map;
/**
* really goofy way to do worldgen but it works
*/
@Mixin(AllOreFeatureConfigEntries.class)
public class AllOreFeatureConfigEntriesMixin {

View File

@@ -0,0 +1,371 @@
package com.drmangotea.tfmg.mixins;
import com.drmangotea.tfmg.CreateTFMG;
import com.drmangotea.tfmg.content.machines.pipes.normal.LockablePipeBlockEntity;
import com.drmangotea.tfmg.registry.TFMGBlocks;
import com.simibubi.create.AllBlockEntityTypes;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.content.contraptions.ITransformableBlock;
import com.simibubi.create.content.contraptions.StructureTransform;
import com.simibubi.create.content.decoration.bracket.BracketedBlockEntityBehaviour;
import com.simibubi.create.content.decoration.encasing.EncasableBlock;
import com.simibubi.create.content.equipment.wrench.IWrenchableWithBracket;
import com.simibubi.create.content.fluids.FluidPropagator;
import com.simibubi.create.content.fluids.FluidTransportBehaviour;
import com.simibubi.create.content.fluids.pipes.*;
import com.simibubi.create.foundation.advancement.AdvancementBehaviour;
import com.simibubi.create.foundation.advancement.AllAdvancements;
import com.simibubi.create.foundation.block.IBE;
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
import com.simibubi.create.foundation.utility.Iterate;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.network.protocol.game.DebugPackets;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition.Builder;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.level.pathfinder.PathComputationType;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraft.world.ticks.TickPriority;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.Optional;
@Mixin(FluidPipeBlock.class)
public class FluidPipeBlockMixin extends PipeBlock implements SimpleWaterloggedBlock, IWrenchableWithBracket,
IBE<FluidPipeBlockEntity>, EncasableBlock, ITransformableBlock {
private static final VoxelShape OCCLUSION_BOX = Block.box(4, 4, 4, 12, 12, 12);
public FluidPipeBlockMixin(Properties properties) {
super(4 / 16f, properties);
this.registerDefaultState(super.defaultBlockState().setValue(BlockStateProperties.WATERLOGGED, false));
}
@Override
public InteractionResult onWrenched(BlockState state, UseOnContext context) {
if (tryRemoveBracket(context))
return InteractionResult.SUCCESS;
Level world = context.getLevel();
BlockPos pos = context.getClickedPos();
Direction clickedFace = context.getClickedFace();
Axis axis = getAxis(world, pos, state);
if (axis == null) {
Vec3 clickLocation = context.getClickLocation()
.subtract(pos.getX(), pos.getY(), pos.getZ());
double closest = Float.MAX_VALUE;
Direction argClosest = Direction.UP;
for (Direction direction : Iterate.directions) {
if (clickedFace.getAxis() == direction.getAxis())
continue;
Vec3 centerOf = Vec3.atCenterOf(direction.getNormal());
double distance = centerOf.distanceToSqr(clickLocation);
if (distance < closest) {
closest = distance;
argClosest = direction;
}
}
axis = argClosest.getAxis();
}
if (clickedFace.getAxis() == axis)
return InteractionResult.PASS;
if (!world.isClientSide) {
withBlockEntityDo(world, pos, fpte -> fpte.getBehaviour(FluidTransportBehaviour.TYPE).interfaces.values()
.stream()
.filter(pc -> pc != null && pc.hasFlow())
.findAny()
.ifPresent($ -> AllAdvancements.GLASS_PIPE.awardTo(context.getPlayer())));
FluidTransportBehaviour.cacheFlows(world, pos);
world.setBlockAndUpdate(pos, AllBlocks.GLASS_FLUID_PIPE.getDefaultState()
.setValue(GlassFluidPipeBlock.AXIS, axis)
.setValue(BlockStateProperties.WATERLOGGED, state.getValue(BlockStateProperties.WATERLOGGED)));
FluidTransportBehaviour.loadFlows(world, pos);
}
return InteractionResult.SUCCESS;
}
@Override
public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) {
super.setPlacedBy(pLevel, pPos, pState, pPlacer, pStack);
AdvancementBehaviour.setPlacedBy(pLevel, pPos, pPlacer);
}
@Override
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand,
BlockHitResult ray) {
ItemStack heldItem = player.getItemInHand(hand);
InteractionResult result = tryEncase(state, world, pos, heldItem, player, hand, ray);
if (result.consumesAction())
return result;
return InteractionResult.PASS;
}
public BlockState getAxisState(Axis axis) {
BlockState defaultState = defaultBlockState();
for (Direction d : Iterate.directions)
defaultState = defaultState.setValue(PROPERTY_BY_DIRECTION.get(d), d.getAxis() == axis);
return defaultState;
}
@Nullable
private Axis getAxis(BlockGetter world, BlockPos pos, BlockState state) {
return FluidPropagator.getStraightPipeAxis(state);
}
@Override
public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean isMoving) {
boolean blockTypeChanged = state.getBlock() != newState.getBlock();
if (blockTypeChanged && !world.isClientSide)
FluidPropagator.propagateChangedPipe(world, pos, state);
if (state != newState && !isMoving)
removeBracket(world, pos, true).ifPresent(stack -> Block.popResource(world, pos, stack));
if (state.hasBlockEntity() && (blockTypeChanged || !newState.hasBlockEntity()))
world.removeBlockEntity(pos);
}
@Override
public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean isMoving) {
if (world.isClientSide)
return;
if (state != oldState)
world.scheduleTick(pos, this, 1, TickPriority.HIGH);
}
@Override
public void neighborChanged(BlockState state, Level world, BlockPos pos, Block otherBlock, BlockPos neighborPos,
boolean isMoving) {
DebugPackets.sendNeighborsUpdatePacket(world, pos);
Direction d = FluidPropagator.validateNeighbourChange(state, world, pos, otherBlock, neighborPos, isMoving);
if (d == null)
return;
if (!isOpenAt(state, d))
return;
world.scheduleTick(pos, this, 1, TickPriority.HIGH);
}
@Override
public void tick(BlockState state, ServerLevel world, BlockPos pos, RandomSource r) {
FluidPropagator.propagateChangedPipe(world, pos, state);
}
@Shadow
public static boolean isPipe(BlockState state) {
return state.getBlock() instanceof FluidPipeBlockMixin;
}
@Shadow
public static boolean canConnectTo(BlockAndTintGetter world, BlockPos neighbourPos, BlockState neighbour,
Direction direction) {
if (FluidPropagator.hasFluidCapability(world, neighbourPos, direction.getOpposite()))
return true;
if (VanillaFluidTargets.shouldPipesConnectTo(neighbour))
return true;
FluidTransportBehaviour transport = BlockEntityBehaviour.get(world, neighbourPos, FluidTransportBehaviour.TYPE);
BracketedBlockEntityBehaviour bracket =
BlockEntityBehaviour.get(world, neighbourPos, BracketedBlockEntityBehaviour.TYPE);
if (isPipe(neighbour))
return bracket == null || !bracket.isBracketPresent()
|| FluidPropagator.getStraightPipeAxis(neighbour) == direction.getAxis();
if (transport == null)
return false;
return transport.canHaveFlowToward(neighbour, direction.getOpposite());
}
@Shadow
public static boolean shouldDrawRim(BlockAndTintGetter world, BlockPos pos, BlockState state, Direction direction) {
BlockPos offsetPos = pos.relative(direction);
BlockState facingState = world.getBlockState(offsetPos);
if (facingState.getBlock() instanceof EncasedPipeBlock)
return true;
if (!isPipe(facingState))
return true;
if (!canConnectTo(world, offsetPos, facingState, direction))
return true;
return false;
}
@Shadow
public static boolean isOpenAt(BlockState state, Direction direction) {
return state.getValue(PROPERTY_BY_DIRECTION.get(direction));
}
@Shadow
public static boolean isCornerOrEndPipe(BlockAndTintGetter world, BlockPos pos, BlockState state) {
return isPipe(state) && FluidPropagator.getStraightPipeAxis(state) == null
&& !shouldDrawCasing(world, pos, state);
}
@Shadow
public static boolean shouldDrawCasing(BlockAndTintGetter world, BlockPos pos, BlockState state) {
if (!isPipe(state))
return false;
for (Axis axis : Iterate.axes) {
int connections = 0;
for (Direction direction : Iterate.directions)
if (direction.getAxis() != axis && isOpenAt(state, direction))
connections++;
if (connections > 2)
return true;
}
return false;
}
@Override
protected void createBlockStateDefinition(Builder<Block, BlockState> builder) {
builder.add(NORTH, EAST, SOUTH, WEST, UP, DOWN, BlockStateProperties.WATERLOGGED);
super.createBlockStateDefinition(builder);
}
@Override
public BlockState getStateForPlacement(BlockPlaceContext context) {
FluidState FluidState = context.getLevel()
.getFluidState(context.getClickedPos());
return updateBlockState(defaultBlockState(), context.getNearestLookingDirection(), null, context.getLevel(),
context.getClickedPos()).setValue(BlockStateProperties.WATERLOGGED,
Boolean.valueOf(FluidState.getType() == Fluids.WATER));
}
@Override
public BlockState updateShape(BlockState state, Direction direction, BlockState neighbourState, LevelAccessor world,
BlockPos pos, BlockPos neighbourPos) {
if (state.getValue(BlockStateProperties.WATERLOGGED))
world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world));
if (isOpenAt(state, direction) && neighbourState.hasProperty(BlockStateProperties.WATERLOGGED))
world.scheduleTick(pos, this, 1, TickPriority.HIGH);
return updateBlockState(state, direction, direction.getOpposite(), world, pos);
}
/**
* @author DrMangoTea
* @reason locked pipes
*/
@Overwrite( remap = false)
public BlockState updateBlockState(BlockState state, Direction preferredDirection, @Nullable Direction ignore,
BlockAndTintGetter world, BlockPos pos) {
CreateTFMG.LOGGER.debug("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
BracketedBlockEntityBehaviour bracket = BlockEntityBehaviour.get(world, pos, BracketedBlockEntityBehaviour.TYPE);
if (bracket != null && bracket.isBracketPresent())
return state;
BlockState prevState = state;
int prevStateSides = (int) Arrays.stream(Iterate.directions)
.map(PROPERTY_BY_DIRECTION::get)
.filter(prevState::getValue)
.count();
// Update sides that are not ignored
for (Direction d : Iterate.directions)
if (d != ignore) {
boolean shouldConnect = canConnectTo(world, pos.relative(d), world.getBlockState(pos.relative(d)), d);
if(world.getBlockEntity(pos.relative(d)) instanceof LockablePipeBlockEntity)
if(((LockablePipeBlockEntity)world.getBlockEntity(pos.relative(d))).locked) {
shouldConnect = false;
CreateTFMG.LOGGER.debug("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
state = state.setValue(PROPERTY_BY_DIRECTION.get(d), shouldConnect);
}
// See if it has enough connections
Direction connectedDirection = null;
for (Direction d : Iterate.directions) {
if (isOpenAt(state, d)) {
if (connectedDirection != null)
return state;
connectedDirection = d;
}
}
// Add opposite end if only one connection
if (connectedDirection != null)
return state.setValue(PROPERTY_BY_DIRECTION.get(connectedDirection.getOpposite()), true);
// If we can't connect to anything and weren't connected before, do nothing
if (prevStateSides == 2)
return prevState;
// Use preferred
return state.setValue(PROPERTY_BY_DIRECTION.get(preferredDirection), true)
.setValue(PROPERTY_BY_DIRECTION.get(preferredDirection.getOpposite()), true);
}
@Override
public FluidState getFluidState(BlockState state) {
return state.getValue(BlockStateProperties.WATERLOGGED) ? Fluids.WATER.getSource(false)
: Fluids.EMPTY.defaultFluidState();
}
@Override
public Optional<ItemStack> removeBracket(BlockGetter world, BlockPos pos, boolean inOnReplacedContext) {
BracketedBlockEntityBehaviour behaviour =
BracketedBlockEntityBehaviour.get(world, pos, BracketedBlockEntityBehaviour.TYPE);
if (behaviour == null)
return Optional.empty();
BlockState bracket = behaviour.removeBracket(inOnReplacedContext);
if (bracket == null)
return Optional.empty();
return Optional.of(new ItemStack(bracket.getBlock()));
}
@Override
public boolean isPathfindable(BlockState state, BlockGetter reader, BlockPos pos, PathComputationType type) {
return false;
}
@Override
public Class<FluidPipeBlockEntity> getBlockEntityClass() {
return FluidPipeBlockEntity.class;
}
@Override
public BlockEntityType<? extends FluidPipeBlockEntity> getBlockEntityType() {
return AllBlockEntityTypes.FLUID_PIPE.get();
}
@Override
public boolean supportsExternalFaceHiding(BlockState state) {
return false;
}
@Override
public VoxelShape getOcclusionShape(BlockState pState, BlockGetter pLevel, BlockPos pPos) {
return OCCLUSION_BOX;
}
@Override
public BlockState rotate(BlockState pState, Rotation pRotation) {
return FluidPipeBlockRotation.rotate(pState, pRotation);
}
@Override
public BlockState mirror(BlockState pState, Mirror pMirror) {
return FluidPipeBlockRotation.mirror(pState, pMirror);
}
@Override
public BlockState transform(BlockState state, StructureTransform transform) {
return FluidPipeBlockRotation.transform(state, transform);
}
}

View File

@@ -0,0 +1,191 @@
package com.drmangotea.tfmg.mixins;
import com.drmangotea.tfmg.content.machines.pipes.normal.steel.SteelPipeBlock;
import com.drmangotea.tfmg.registry.TFMGBlocks;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllTags;
import com.simibubi.create.content.fluids.FluidPropagator;
import com.simibubi.create.content.fluids.FluidTransportBehaviour;
import com.simibubi.create.content.fluids.pipes.AxisPipeBlock;
import com.simibubi.create.content.fluids.pipes.FluidPipeBlock;
import com.simibubi.create.content.fluids.pipes.VanillaFluidTargets;
import com.simibubi.create.content.fluids.pump.PumpBlock;
import com.simibubi.create.content.fluids.pump.PumpBlockEntity;
import com.simibubi.create.foundation.advancement.AllAdvancements;
import com.simibubi.create.foundation.advancement.CreateAdvancement;
import com.simibubi.create.foundation.blockEntity.behaviour.BlockEntityBehaviour;
import com.simibubi.create.foundation.utility.BlockHelper;
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.Pair;
import com.simibubi.create.infrastructure.config.AllConfigs;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.LiquidBlock;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Mixin(FluidPropagator.class)
public class FluidPropagatorMixin {
@Shadow
public static CreateAdvancement[] getSharedTriggers() {
return new CreateAdvancement[] { AllAdvancements.WATER_SUPPLY, AllAdvancements.CROSS_STREAMS,
AllAdvancements.HONEY_DRAIN };
}
/**
* @author DrMangoTea
* @reason Custom Pipes
*/
@Overwrite( remap = false)
public static void propagateChangedPipe(LevelAccessor world, BlockPos pipePos, BlockState pipeState) {
List<Pair<Integer, BlockPos>> frontier = new ArrayList<>();
Set<BlockPos> visited = new HashSet<>();
Set<Pair<PumpBlockEntity, Direction>> discoveredPumps = new HashSet<>();
frontier.add(Pair.of(0, pipePos));
// Visit all connected pumps to update their network
while (!frontier.isEmpty()) {
Pair<Integer, BlockPos> pair = frontier.remove(0);
BlockPos currentPos = pair.getSecond();
if (visited.contains(currentPos))
continue;
visited.add(currentPos);
BlockState currentState = currentPos.equals(pipePos) ? pipeState : world.getBlockState(currentPos);
FluidTransportBehaviour pipe = getPipe(world, currentPos);
if (pipe == null)
continue;
pipe.wipePressure();
for (Direction direction : getPipeConnections(currentState, pipe)) {
BlockPos target = currentPos.relative(direction);
if (world instanceof Level l && !l.isLoaded(target))
continue;
BlockEntity tileEntity = world.getBlockEntity(target);
BlockState targetState = world.getBlockState(target);
if (tileEntity instanceof PumpBlockEntity) {
if (
//!TFMGBlocks.STEEL_PUMP.has(targetState)&&
!AllBlocks.MECHANICAL_PUMP.has(targetState) || targetState.getValue(PumpBlock.FACING)
.getAxis() != direction.getAxis())
continue;
discoveredPumps.add(Pair.of((PumpBlockEntity) tileEntity, direction.getOpposite()));
continue;
}
if (visited.contains(target))
continue;
FluidTransportBehaviour targetPipe = getPipe(world, target);
if (targetPipe == null)
continue;
Integer distance = pair.getFirst();
if (distance >= getPumpRange() && !targetPipe.hasAnyPressure())
continue;
if (targetPipe.canHaveFlowToward(targetState, direction.getOpposite()))
frontier.add(Pair.of(distance + 1, target));
}
}
discoveredPumps.forEach(pair -> pair.getFirst()
.updatePipesOnSide(pair.getSecond()));
}
@Shadow
public static FluidTransportBehaviour getPipe(BlockGetter reader, BlockPos pos) {
return BlockEntityBehaviour.get(reader, pos, FluidTransportBehaviour.TYPE);
}
@Shadow
public static boolean isOpenEnd(BlockGetter reader, BlockPos pos, Direction side) {
BlockPos connectedPos = pos.relative(side);
BlockState connectedState = reader.getBlockState(connectedPos);
FluidTransportBehaviour pipe = FluidPropagator.getPipe(reader, connectedPos);
if (pipe != null && pipe.canHaveFlowToward(connectedState, side.getOpposite()))
return false;
if (PumpBlock.isPump(connectedState) && connectedState.getValue(PumpBlock.FACING)
.getAxis() == side.getAxis())
return false;
if (VanillaFluidTargets.shouldPipesConnectTo(connectedState))
return true;
if (BlockHelper.hasBlockSolidSide(connectedState, reader, connectedPos, side.getOpposite())
&& !AllTags.AllBlockTags.FAN_TRANSPARENT.matches(connectedState))
return false;
if (hasFluidCapability(reader, connectedPos, side.getOpposite()))
return false;
if (!(connectedState.getMaterial()
.isReplaceable() && connectedState.getDestroySpeed(reader, connectedPos) != -1)
&& !connectedState.hasProperty(BlockStateProperties.WATERLOGGED))
return false;
return true;
}
@Shadow
public static List<Direction> getPipeConnections(BlockState state, FluidTransportBehaviour pipe) {
List<Direction> list = new ArrayList<>();
for (Direction d : Iterate.directions)
if (pipe.canHaveFlowToward(state, d))
list.add(d);
return list;
}
@Shadow
public static int getPumpRange() {
return AllConfigs.server().fluids.mechanicalPumpRange.get();
}
@Shadow
public static boolean hasFluidCapability(BlockGetter world, BlockPos pos, Direction side) {
BlockEntity tileEntity = world.getBlockEntity(pos);
if (tileEntity == null)
return false;
LazyOptional<IFluidHandler> capability =
tileEntity.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side);
return capability.isPresent();
}
@Shadow
@Nullable
public static Direction.Axis getStraightPipeAxis(BlockState state) {
if (state.getBlock() instanceof PumpBlock)
return state.getValue(PumpBlock.FACING)
.getAxis();
if (state.getBlock() instanceof AxisPipeBlock)
return state.getValue(AxisPipeBlock.AXIS);
if (!FluidPipeBlock.isPipe(state))
return null;
Direction.Axis axisFound = null;
int connections = 0;
for (Direction.Axis axis : Iterate.axes) {
Direction d1 = Direction.get(Direction.AxisDirection.NEGATIVE, axis);
Direction d2 = Direction.get(Direction.AxisDirection.POSITIVE, axis);
boolean openAt1 = FluidPipeBlock.isOpenAt(state, d1);
boolean openAt2 = FluidPipeBlock.isOpenAt(state, d2);
if (openAt1)
connections++;
if (openAt2)
connections++;
if (openAt1 && openAt2)
if (axisFound != null)
return null;
else
axisFound = axis;
}
return connections == 2 ? axisFound : null;
}
}

View File

@@ -1,20 +1,14 @@
package com.drmangotea.tfmg.registry;
import com.drmangotea.tfmg.CreateTFMG;
import com.drmangotea.tfmg.content.concrete.formwork.FormWorkBlockEntity;
import com.drmangotea.tfmg.content.concrete.formwork.FormWorkRenderer;
import com.drmangotea.tfmg.content.deposits.FluidDepositTileEntity;
import com.simibubi.create.content.fluids.pipes.FluidPipeBlockEntity;
import com.drmangotea.tfmg.content.machines.pipes.normal.LockablePipeBlockEntity;
import com.drmangotea.tfmg.content.machines.tanks.SteelFluidTankRenderer;
import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlockEntity;
import com.simibubi.create.Create;
import com.simibubi.create.content.fluids.pipes.StraightPipeBlockEntity;
import com.simibubi.create.content.fluids.pipes.TransparentStraightPipeRenderer;
import com.simibubi.create.content.fluids.pump.PumpBlockEntity;
import com.simibubi.create.content.fluids.pump.PumpCogInstance;
import com.simibubi.create.content.fluids.pump.PumpRenderer;
import com.simibubi.create.content.kinetics.base.HalfShaftInstance;
import com.simibubi.create.content.kinetics.base.HorizontalHalfShaftInstance;
import com.simibubi.create.content.kinetics.simpleRelays.BracketedKineticBlockEntity;
import com.simibubi.create.content.kinetics.simpleRelays.SimpleKineticBlockEntity;
import com.simibubi.create.foundation.data.CreateRegistrate;
import com.tterrag.registrate.util.entry.BlockEntityEntry;
import static com.drmangotea.tfmg.CreateTFMG.REGISTRATE;
@@ -35,6 +29,32 @@ public class TFMGBlockEntities {
.register();
public static final BlockEntityEntry<LockablePipeBlockEntity> STEEL_PIPE = REGISTRATE
.blockEntity("steel_pipe", LockablePipeBlockEntity::new)
.validBlocks(TFMGBlocks.STEEL_PIPE)
.register();
public static final BlockEntityEntry<LockablePipeBlockEntity> ENCASED_STEEL_PIPE = REGISTRATE
.blockEntity("encased_steel_pipe", LockablePipeBlockEntity::new)
.validBlocks(TFMGBlocks.COPPER_ENCASED_STEEL_PIPE)
.register();
public static final BlockEntityEntry<StraightPipeBlockEntity> GLASS_STEEL_PIPE = REGISTRATE
.blockEntity("glass_steel_pipe", StraightPipeBlockEntity::new)
.validBlocks(TFMGBlocks.GLASS_STEEL_PIPE)
.renderer(() -> TransparentStraightPipeRenderer::new)
.register();
public static final BlockEntityEntry<SteelTankBlockEntity> STEEL_FLUID_TANK = REGISTRATE
.blockEntity("steel_fluid_tank", SteelTankBlockEntity::new)
.validBlocks(TFMGBlocks.STEEL_FLUID_TANK)
.renderer(() -> SteelFluidTankRenderer::new)
.register();
public static void register() {}
}

View File

@@ -1,25 +1,40 @@
package com.drmangotea.tfmg.registry;
import com.drmangotea.tfmg.base.TFMGBuilderTransformers;
import com.drmangotea.tfmg.base.TFMGBlockStateGen;
import com.drmangotea.tfmg.base.TFMGSpriteShifts;
import com.drmangotea.tfmg.content.concrete.formwork.FormWorkBlock;
import com.drmangotea.tfmg.content.concrete.formwork.FormWorkGenerator;
import com.drmangotea.tfmg.content.deposits.FluidDepositBlock;
import com.drmangotea.tfmg.content.gadgets.explosives.napalm.NapalmBombBlock;
import com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.ThermiteGrenadeItem;
import com.drmangotea.tfmg.content.items.TFMGFuelItem;
import com.drmangotea.tfmg.content.items.CoalCokeBlockItem;
import com.drmangotea.tfmg.content.items.FossilstoneItem;
import com.drmangotea.tfmg.content.machines.pipes.normal.steel.EncasedSteelPipeBlock;
import com.drmangotea.tfmg.content.machines.pipes.normal.steel.GlassSteelPipeBlock;
import com.drmangotea.tfmg.content.machines.pipes.normal.steel.SteelPipeAttachmentModel;
import com.drmangotea.tfmg.content.machines.pipes.normal.steel.SteelPipeBlock;
import com.drmangotea.tfmg.content.machines.tanks.SteelFluidTankModel;
import com.drmangotea.tfmg.content.machines.tanks.SteelTankBlock;
import com.drmangotea.tfmg.content.machines.tanks.SteelTankGenerator;
import com.drmangotea.tfmg.content.machines.tanks.SteelTankItem;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllSpriteShifts;
import com.simibubi.create.content.decoration.encasing.CasingBlock;
import com.simibubi.create.content.decoration.encasing.EncasedCTBehaviour;
import com.simibubi.create.content.logistics.chute.ChuteGenerator;
import com.simibubi.create.foundation.data.BuilderTransformers;
import com.simibubi.create.content.decoration.encasing.EncasingRegistry;
import com.simibubi.create.foundation.data.*;
import com.tterrag.registrate.util.entry.BlockEntry;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.core.Direction;
import net.minecraft.tags.BlockTags;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.level.material.MaterialColor;
import net.minecraftforge.client.model.generators.ConfiguredModel;
import net.minecraftforge.common.Tags;
@@ -55,7 +70,7 @@ public class TFMGBlocks {
.properties(p -> p.requiresCorrectToolForDrops())
.transform(pickaxeOnly())
.blockstate(simpleCubeAll("fossilstone"))
.item(TFMGFuelItem::fossilstone)
.item(FossilstoneItem::new)
.build()
.lang("Fossilstone")
.register();
@@ -101,6 +116,72 @@ public class TFMGBlocks {
.register();
//pipes
public static final BlockEntry<SteelPipeBlock> STEEL_PIPE = REGISTRATE.block("steel_pipe", SteelPipeBlock::new)
.initialProperties(Material.HEAVY_METAL)
.transform(pickaxeOnly())
.blockstate(BlockStateGen.pipe())
.onRegister(CreateRegistrate.blockModel(() -> SteelPipeAttachmentModel::new))
.item()
.transform(customItemModel())
.register();
public static final BlockEntry<EncasedSteelPipeBlock> COPPER_ENCASED_STEEL_PIPE =
REGISTRATE.block("copper_encased_steel_pipe", p -> new EncasedSteelPipeBlock(p, AllBlocks.COPPER_CASING::get))
.initialProperties(SharedProperties::copperMetal)
.properties(p -> p.color(MaterialColor.TERRACOTTA_LIGHT_GRAY))
.properties(BlockBehaviour.Properties::noOcclusion)
.transform(axeOrPickaxe())
.blockstate(BlockStateGen.encasedPipe())
.onRegister(CreateRegistrate.connectedTextures(() -> new EncasedCTBehaviour(AllSpriteShifts.COPPER_CASING)))
.onRegister(CreateRegistrate.casingConnectivity((block, cc) -> cc.make(block, AllSpriteShifts.COPPER_CASING,
(s, f) -> !s.getValue(EncasedSteelPipeBlock.FACING_TO_PROPERTY_MAP.get(f)))))
.onRegister(CreateRegistrate.blockModel(() -> SteelPipeAttachmentModel::new))
.loot((p, b) -> p.dropOther(b, STEEL_PIPE.get()))
.transform(EncasingRegistry.addVariantTo(TFMGBlocks.STEEL_PIPE))
.register();
@SuppressWarnings("removal")
public static final BlockEntry<GlassSteelPipeBlock> GLASS_STEEL_PIPE =
REGISTRATE.block("glass_steel_pipe", GlassSteelPipeBlock::new)
.initialProperties(SharedProperties::copperMetal)
.addLayer(() -> RenderType::cutoutMipped)
.transform(pickaxeOnly())
.blockstate((c, p) -> {
p.getVariantBuilder(c.getEntry())
.forAllStatesExcept(state -> {
Direction.Axis axis = state.getValue(BlockStateProperties.AXIS);
return ConfiguredModel.builder()
.modelFile(p.models()
.getExistingFile(p.modLoc("block/steel_pipe/window")))
.uvLock(false)
.rotationX(axis == Direction.Axis.Y ? 0 : 90)
.rotationY(axis == Direction.Axis.X ? 90 : 0)
.build();
}, BlockStateProperties.WATERLOGGED);
})
.onRegister(CreateRegistrate.blockModel(() -> SteelPipeAttachmentModel::new))
.loot((p, b) -> p.dropOther(b, STEEL_PIPE.get()))
.register();
//
public static final BlockEntry<SteelTankBlock> STEEL_FLUID_TANK = REGISTRATE.block("steel_fluid_tank", SteelTankBlock::regular)
.initialProperties(SharedProperties::copperMetal)
.properties(BlockBehaviour.Properties::noOcclusion)
.properties(p -> p.isRedstoneConductor((p1, p2, p3) -> true))
.transform(pickaxeOnly())
.blockstate(new SteelTankGenerator()::generate)
.onRegister(CreateRegistrate.blockModel(() -> SteelFluidTankModel::standard))
.addLayer(() -> RenderType::cutoutMipped)
.item(SteelTankItem::new)
.model(AssetLookup.customBlockItemModel("_", "block_single_window"))
.build()
.register();
/////
//-----------------------BUILDING BLOCKS---------------------------//
@@ -137,13 +218,62 @@ public class TFMGBlocks {
.lang("Block of Cast Iron")
.register();
public static final BlockEntry<Block> ALUMINUM_BLOCK = REGISTRATE.block("aluminum_block", Block::new)
.initialProperties(() -> Blocks.IRON_BLOCK)
.properties(p -> p.color(MaterialColor.COLOR_LIGHT_GRAY))
.properties(p -> p.requiresCorrectToolForDrops())
.onRegister(connectedTextures(() -> new EncasedCTBehaviour(TFMGSpriteShifts.CAST_IRON_BLOCK)))
.onRegister(casingConnectivity((block, cc) -> cc.makeCasing(block, TFMGSpriteShifts.CAST_IRON_BLOCK)))
.transform(pickaxeOnly())
.blockstate(simpleCubeAll("aluminum_block"))
.tag(BlockTags.NEEDS_IRON_TOOL)
.tag(Tags.Blocks.STORAGE_BLOCKS)
.tag(BlockTags.BEACON_BASE_BLOCKS)
.transform(tagBlockAndItem("storage_blocks/aluminum"))
.tag(Tags.Items.STORAGE_BLOCKS)
.build()
.lang("Block of Aluminum")
.register();
public static final BlockEntry<Block> LEAD_BLOCK = REGISTRATE.block("lead_block", Block::new)
.initialProperties(() -> Blocks.IRON_BLOCK)
.properties(p -> p.color(MaterialColor.COLOR_LIGHT_GRAY))
.properties(p -> p.requiresCorrectToolForDrops())
.onRegister(connectedTextures(() -> new EncasedCTBehaviour(TFMGSpriteShifts.CAST_IRON_BLOCK)))
.onRegister(casingConnectivity((block, cc) -> cc.makeCasing(block, TFMGSpriteShifts.CAST_IRON_BLOCK)))
.transform(pickaxeOnly())
.blockstate(simpleCubeAll("lead_block"))
.tag(BlockTags.NEEDS_IRON_TOOL)
.tag(Tags.Blocks.STORAGE_BLOCKS)
.tag(BlockTags.BEACON_BASE_BLOCKS)
.transform(tagBlockAndItem("storage_blocks/lead"))
.tag(Tags.Items.STORAGE_BLOCKS)
.build()
.lang("Block of Lead")
.register();
public static final BlockEntry<Block> COAL_COKE_BLOCK = REGISTRATE.block("coal_coke_block", Block::new)
.initialProperties(() -> Blocks.IRON_BLOCK)
.properties(p -> p.color(MaterialColor.COLOR_LIGHT_GRAY))
.properties(p -> p.requiresCorrectToolForDrops())
.transform(pickaxeOnly())
.blockstate(simpleCubeAll("coal_coke_block"))
.tag(BlockTags.NEEDS_STONE_TOOL)
.tag(Tags.Blocks.STORAGE_BLOCKS)
.item(CoalCokeBlockItem::new)
.tag(Tags.Items.STORAGE_BLOCKS)
.build()
.lang("Block of Coal Coke")
.register();
//-----------------------CONCRETE---------------------------//
static {
REGISTRATE.creativeModeTab(() -> TFMGCreativeModeTabs.TFMG_CONCRETE);
REGISTRATE.creativeModeTab(() -> TFMGCreativeModeTabs.TFMG_BUILDING_BLOCKS);
}
public static final BlockEntry<Block> CONCRETE = REGISTRATE.block("concrete", Block::new)
.initialProperties(() -> Blocks.STONE)

View File

@@ -1,15 +1,13 @@
package com.drmangotea.tfmg.registry;
import com.drmangotea.tfmg.base.creative_mode_tabs.BaseTFMGCreativeModeTab;
import com.drmangotea.tfmg.base.creative_mode_tabs.ConcreteCreativeModeTab;
import com.simibubi.create.content.decoration.palettes.PalettesCreativeModeTab;
import com.simibubi.create.infrastructure.item.BaseCreativeModeTab;
import com.drmangotea.tfmg.base.creative_mode_tabs.BuldingCreativeModeTab;
import net.minecraft.world.item.CreativeModeTab;
public class TFMGCreativeModeTabs {
public static final CreativeModeTab TFMG_BASE = new BaseTFMGCreativeModeTab();
public static final CreativeModeTab TFMG_CONCRETE = new ConcreteCreativeModeTab();
public static final CreativeModeTab TFMG_BUILDING_BLOCKS = new BuldingCreativeModeTab();
public static void init() {
}

View File

@@ -2,10 +2,16 @@ package com.drmangotea.tfmg.registry;
import com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.ChemicalColor;
import com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.ThermiteGrenadeItem;
import com.drmangotea.tfmg.content.items.CoalCokeItem;
import com.drmangotea.tfmg.content.items.ScrewdriverItem;
import com.tterrag.registrate.util.entry.ItemEntry;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item;
import static com.drmangotea.tfmg.CreateTFMG.REGISTRATE;
import static com.drmangotea.tfmg.content.gadgets.explosives.thermite_grenades.ChemicalColor.*;
import static com.simibubi.create.AllTags.AllItemTags.CREATE_INGOTS;
import static com.simibubi.create.AllTags.forgeItemTag;
public class TFMGItems {
@@ -20,7 +26,30 @@ public class TFMGItems {
public static final ItemEntry<ThermiteGrenadeItem>
COPPER_GRENADE = thermiteGrenade("copper_grenade",BLUE);
public static final ItemEntry<Item>
STEEL_INGOT = taggedIngredient("steel_ingot", forgeItemTag("ingots/steel"), CREATE_INGOTS.tag),
CAST_IRON_INGOT = taggedIngredient("cast_iron_ingot", forgeItemTag("ingots/cast_iron"), CREATE_INGOTS.tag),
ALUMINUM_INGOT = taggedIngredient("aluminum_ingot", forgeItemTag("ingots/aluminum"), CREATE_INGOTS.tag),
LEAD_INGOT = taggedIngredient("lead_ingot", forgeItemTag("ingots/lead"), CREATE_INGOTS.tag);
public static final ItemEntry<CoalCokeItem> COAL_COKE = REGISTRATE.item("coal_coke", CoalCokeItem::new)
.register();
public static final ItemEntry<ScrewdriverItem> SCREWDRIVER = REGISTRATE.item("screwdriver", ScrewdriverItem::new)
.properties(p -> p.stacksTo(1)
.durability(256))
.register();
//////////////////////////
@SafeVarargs
private static ItemEntry<Item> taggedIngredient(String name, TagKey<Item>... tags) {
return REGISTRATE.item(name, Item::new)
.tag(tags)
.register();
}
private static ItemEntry<ThermiteGrenadeItem> thermiteGrenade(String name, ChemicalColor color) {
return REGISTRATE.item(name, p -> new ThermiteGrenadeItem(p, color))
.register();

View File

@@ -26,7 +26,7 @@ import static com.simibubi.create.foundation.data.WindowGen.*;
public class TFMGPaletteBlocks {
static {
REGISTRATE.creativeModeTab(() -> TFMGCreativeModeTabs.TFMG_BASE);
REGISTRATE.creativeModeTab(() -> TFMGCreativeModeTabs.TFMG_BUILDING_BLOCKS);
}

View File

@@ -18,6 +18,7 @@ import java.util.Map;
public class TFMGPartialModels {
public static final PartialModel
STEEL_FLUID_PIPE_CASING = block("steel_pipe/casing"),
FORMWORK_BOTTOM = block("formwork_block/block_bottom"),
FORMWORK_SIDE = block("formwork_block/block_side");
@@ -28,11 +29,19 @@ public class TFMGPartialModels {
static {
// for (FluidTransportBehaviour.AttachmentTypes.ComponentPartials type : FluidTransportBehaviour.AttachmentTypes.ComponentPartials.values()) {
// Map<Direction, PartialModel> map = new HashMap<>();
// for (Direction d : Iterate.directions) {
// String asId = Lang.asId(type.name());
// map.put(d, block("steel_pipe/" + asId + "/" + Lang.asId(d.getSerializedName())));
// }
// STEEL_PIPE_ATTACHMENTS.put(type, map);
// }
for (FluidTransportBehaviour.AttachmentTypes.ComponentPartials type : FluidTransportBehaviour.AttachmentTypes.ComponentPartials.values()) {
Map<Direction, PartialModel> map = new HashMap<>();
for (Direction d : Iterate.directions) {
String asId = Lang.asId(type.name());
map.put(d, block("steel_fluid_pipe/" + asId + "/" + Lang.asId(d.getSerializedName())));
map.put(d, block("steel_pipe/" + asId + "/" + Lang.asId(d.getSerializedName())));
}
STEEL_PIPE_ATTACHMENTS.put(type, map);
}

View File

@@ -1,4 +0,0 @@
package com.drmangotea.tfmg.registry;
public class TFMGParticles {
}

View File

@@ -2,6 +2,8 @@ package com.drmangotea.tfmg.worldgen;
import com.drmangotea.tfmg.registry.TFMGBlocks;
import com.drmangotea.tfmg.registry.TFMGPaletteBlocks;
import com.drmangotea.tfmg.registry.TFMGPaletteStoneTypes;
import com.simibubi.create.content.decoration.palettes.AllPaletteStoneTypes;
import com.simibubi.create.infrastructure.worldgen.LayerPattern;
import com.tterrag.registrate.util.nullness.NonNullSupplier;
@@ -15,7 +17,7 @@ public class TFMGLayeredPatterns {
.layer(l -> l.weight(1)
.passiveBlock())
.layer(l -> l.weight(2)
.block(TFMGBlocks.CONCRETE.get())
.block(TFMGPaletteStoneTypes.BAUXITE.getBaseBlock())
.size(1, 3))
.layer(l -> l.weight(1)
.block(Blocks.SMOOTH_BASALT)

View File

@@ -1,4 +1,4 @@
{
"itemGroup.tfmg.base": "Create: The Factory Must Grow",
"itemGroup.tfmg.concrete": "Create: TFMG's Concrete"
"itemGroup.tfmg.building": "Create: TFMG's Building Blocks"
}

View File

@@ -0,0 +1,16 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "create:block/copper_casing",
"particle": "create:block/copper_casing"
},
"elements": [
{
"from": [0, 0, 15],
"to": [16, 16, 16],
"faces": {
"south": {"uv": [0, 0, 16, 16], "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,16 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "tfmg:block/copper_encased_steel_pipe",
"particle": "tfmg:block/copper_encased_steel_pipe"
},
"elements": [
{
"from": [0, 0, 15],
"to": [16, 16, 16],
"faces": {
"south": {"uv": [0, 0, 16, 16], "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [3, 3, 3],
"to": [13, 13, 13],
"faces": {
"north": {"uv": [1, 11, 6, 16], "texture": "#0"},
"east": {"uv": [1, 11, 6, 16], "texture": "#0"},
"south": {"uv": [1, 11, 6, 16], "texture": "#0"},
"west": {"uv": [1, 11, 6, 16], "texture": "#0"},
"up": {"uv": [1, 11, 6, 16], "texture": "#0"},
"down": {"uv": [1, 11, 6, 16], "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4, 0, 4],
"to": [12, 4, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]},
"faces": {
"north": {"uv": [0, 6, 4, 8], "texture": "#0"},
"east": {"uv": [0, 6, 4, 8], "texture": "#0"},
"south": {"uv": [4, 6, 0, 8], "texture": "#0"},
"west": {"uv": [4, 6, 0, 8], "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [12, 4, 4],
"to": [16, 12, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]},
"faces": {
"north": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#0"},
"south": {"uv": [0, 0, 4, 2], "rotation": 90, "texture": "#0"},
"up": {"uv": [4, 0, 0, 2], "rotation": 90, "texture": "#0"},
"down": {"uv": [4, 6, 0, 8], "rotation": 270, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4, 4, 0],
"to": [12, 12, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
"faces": {
"east": {"uv": [0, 0, 4, 2], "rotation": 90, "texture": "#0"},
"west": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#0"},
"up": {"uv": [0, 6, 4, 8], "rotation": 180, "texture": "#0"},
"down": {"uv": [0, 0, 4, 2], "rotation": 180, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4, 4, 12],
"to": [12, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
"faces": {
"east": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#0"},
"west": {"uv": [0, 0, 4, 2], "rotation": 90, "texture": "#0"},
"up": {"uv": [0, 0, 4, 2], "rotation": 180, "texture": "#0"},
"down": {"uv": [0, 6, 4, 8], "rotation": 180, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4, 12, 4],
"to": [12, 16, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]},
"faces": {
"north": {"uv": [0, 0, 4, 2], "texture": "#0"},
"east": {"uv": [0, 0, 4, 2], "texture": "#0"},
"south": {"uv": [4, 0, 0, 2], "texture": "#0"},
"west": {"uv": [4, 0, 0, 2], "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [0, 4, 4],
"to": [4, 12, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]},
"faces": {
"north": {"uv": [0, 0, 4, 2], "rotation": 90, "texture": "#0"},
"south": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#0"},
"up": {"uv": [4, 6, 0, 8], "rotation": 90, "texture": "#0"},
"down": {"uv": [4, 0, 0, 2], "rotation": 270, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,17 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "tfmg:block/steel_pipes_connected",
"particle": "tfmg:block/steel_pipes_connected"
},
"elements": [
{
"from": [4, 4, 4],
"to": [12, 12, 12],
"faces": {
"east": {"uv": [16, 8, 12, 12], "rotation": 180, "texture": "#0"},
"west": {"uv": [16, 8, 12, 12], "rotation": 180, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,17 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "tfmg:block/steel_pipes_connected",
"particle": "tfmg:block/steel_pipes_connected"
},
"elements": [
{
"from": [4, 4, 4],
"to": [12, 12, 12],
"faces": {
"up": {"uv": [16, 8, 12, 12], "rotation": 180, "texture": "#0"},
"down": {"uv": [16, 8, 12, 12], "rotation": 180, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,17 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "tfmg:block/steel_pipes_connected",
"particle": "tfmg:block/steel_pipes_connected"
},
"elements": [
{
"from": [4, 4, 4],
"to": [12, 12, 12],
"faces": {
"north": {"uv": [12, 8, 16, 12], "rotation": 180, "texture": "#0"},
"south": {"uv": [12, 8, 16, 12], "rotation": 180, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,35 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4.95, -3.95, 4.95],
"to": [11.05, -0.95, 11.05],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [12, 8, 13.5, 11], "rotation": 90, "texture": "#0"},
"east": {"uv": [12, 8, 13.5, 11], "rotation": 90, "texture": "#0"},
"south": {"uv": [12, 8, 13.5, 11], "rotation": 90, "texture": "#0"},
"west": {"uv": [12, 8, 13.5, 11], "rotation": 90, "texture": "#0"},
"down": {"uv": [13, 8, 16, 11], "rotation": 90, "texture": "#0", "cullface": "down"}
}
},
{
"from": [2.95, -0.95, 2.95],
"to": [13.05, 2, 13.05],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [9, 9.5, 4, 8], "texture": "#0"},
"east": {"uv": [4, 8, 9, 9.5], "rotation": 180, "texture": "#0"},
"south": {"uv": [4, 8, 9, 9.5], "rotation": 180, "texture": "#0"},
"west": {"uv": [9, 9.5, 4, 8], "texture": "#0"},
"up": {"uv": [6, 11, 11, 16], "rotation": 90, "texture": "#0"},
"down": {"uv": [11, 11, 16, 16], "rotation": 90, "texture": "#0", "cullface": "down"}
}
}
]
}

View File

@@ -0,0 +1,35 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [16.95, 4.95, 4.95],
"to": [19.95, 11.05, 11.05],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [12, 8, 13.5, 11], "rotation": 180, "texture": "#0"},
"east": {"uv": [13, 8, 16, 11], "texture": "#0", "cullface": "east"},
"south": {"uv": [12, 8, 13.5, 11], "texture": "#0"},
"up": {"uv": [12, 8, 13.5, 11], "texture": "#0"},
"down": {"uv": [12, 8, 13.5, 11], "texture": "#0"}
}
},
{
"from": [14, 2.95, 2.95],
"to": [16.95, 13.05, 13.05],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [9, 9.5, 4, 8], "rotation": 90, "texture": "#0"},
"east": {"uv": [11, 11, 16, 16], "texture": "#0", "cullface": "east"},
"south": {"uv": [4, 8, 9, 9.5], "rotation": 90, "texture": "#0"},
"west": {"uv": [6, 11, 11, 16], "texture": "#0"},
"up": {"uv": [4, 8, 9, 9.5], "rotation": 90, "texture": "#0"},
"down": {"uv": [9, 9.5, 4, 8], "rotation": 270, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,35 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [2.95, 2.95, -0.95],
"to": [13.05, 13.05, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 34, 8]},
"faces": {
"north": {"uv": [11, 11, 16, 16], "texture": "#0", "cullface": "north"},
"east": {"uv": [4, 8, 9, 9.5], "rotation": 90, "texture": "#0"},
"south": {"uv": [6, 11, 11, 16], "texture": "#0"},
"west": {"uv": [9, 9.5, 4, 8], "rotation": 90, "texture": "#0"},
"up": {"uv": [4, 8, 9, 9.5], "texture": "#0"},
"down": {"uv": [9, 9.5, 4, 8], "texture": "#0"}
}
},
{
"from": [4.95, 4.95, -3.95],
"to": [11.05, 11.05, -0.95],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 34, 8]},
"faces": {
"north": {"uv": [13, 8, 16, 11], "texture": "#0", "cullface": "north"},
"east": {"uv": [12, 8, 13.5, 11], "texture": "#0"},
"west": {"uv": [12, 8, 13.5, 11], "rotation": 180, "texture": "#0"},
"up": {"uv": [12, 8, 13.5, 11], "rotation": 270, "texture": "#0"},
"down": {"uv": [12, 8, 13.5, 11], "rotation": 90, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,35 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4.95, 4.95, 16.95],
"to": [11.05, 11.05, 19.95],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 34, 8]},
"faces": {
"east": {"uv": [13.5, 8, 12, 11], "texture": "#0"},
"south": {"uv": [16, 8, 13, 11], "texture": "#0", "cullface": "south"},
"west": {"uv": [13.5, 8, 12, 11], "rotation": 180, "texture": "#0"},
"up": {"uv": [13.5, 8, 12, 11], "rotation": 270, "texture": "#0"},
"down": {"uv": [13.5, 8, 12, 11], "rotation": 90, "texture": "#0"}
}
},
{
"from": [2.95, 2.95, 14],
"to": [13.05, 13.05, 16.95],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 34, 8]},
"faces": {
"north": {"uv": [11, 11, 6, 16], "texture": "#0"},
"east": {"uv": [4, 9.5, 9, 8], "rotation": 90, "texture": "#0"},
"south": {"uv": [16, 11, 11, 16], "texture": "#0", "cullface": "south"},
"west": {"uv": [9, 8, 4, 9.5], "rotation": 90, "texture": "#0"},
"up": {"uv": [4, 9.5, 9, 8], "texture": "#0"},
"down": {"uv": [9, 8, 4, 9.5], "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,35 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [2.95, 14, 2.95],
"to": [13.05, 16.95, 13.05],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [9, 8, 4, 9.5], "texture": "#0"},
"east": {"uv": [4, 9.5, 9, 8], "rotation": 180, "texture": "#0"},
"south": {"uv": [4, 9.5, 9, 8], "rotation": 180, "texture": "#0"},
"west": {"uv": [9, 8, 4, 9.5], "texture": "#0"},
"up": {"uv": [16, 11, 11, 16], "rotation": 90, "texture": "#0", "cullface": "up"},
"down": {"uv": [11, 11, 6, 16], "rotation": 90, "texture": "#0"}
}
},
{
"from": [4.95, 16.95, 4.95],
"to": [11.05, 19.95, 11.05],
"rotation": {"angle": 0, "axis": "z", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [13.5, 8, 12, 11], "rotation": 90, "texture": "#0"},
"east": {"uv": [13.5, 8, 12, 11], "rotation": 90, "texture": "#0"},
"south": {"uv": [13.5, 8, 12, 11], "rotation": 90, "texture": "#0"},
"west": {"uv": [13.5, 8, 12, 11], "rotation": 90, "texture": "#0"},
"up": {"uv": [16, 8, 13, 11], "rotation": 90, "texture": "#0", "cullface": "up"}
}
}
]
}

View File

@@ -0,0 +1,35 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [-0.95, 2.95, 2.95],
"to": [2, 13.05, 13.05],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [9, 8, 4, 9.5], "rotation": 90, "texture": "#0"},
"east": {"uv": [11, 11, 6, 16], "texture": "#0"},
"south": {"uv": [4, 9.5, 9, 8], "rotation": 90, "texture": "#0"},
"west": {"uv": [16, 11, 11, 16], "texture": "#0", "cullface": "west"},
"up": {"uv": [4, 9.5, 9, 8], "rotation": 90, "texture": "#0"},
"down": {"uv": [9, 8, 4, 9.5], "rotation": 270, "texture": "#0"}
}
},
{
"from": [-3.95, 4.95, 4.95],
"to": [-0.95, 11.05, 11.05],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [13.5, 8, 12, 11], "rotation": 180, "texture": "#0"},
"south": {"uv": [13.5, 8, 12, 11], "texture": "#0"},
"west": {"uv": [16, 8, 13, 11], "texture": "#0", "cullface": "west"},
"up": {"uv": [13.5, 8, 12, 11], "texture": "#0"},
"down": {"uv": [13.5, 8, 12, 11], "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,78 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"1": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4, 4, 4],
"to": [12, 12, 12],
"faces": {
"east": {"uv": [0, 0, 4, 4], "rotation": 90, "texture": "#1"},
"west": {"uv": [0, 0, 4, 4], "rotation": 90, "texture": "#1"},
"up": {"uv": [0, 0, 4, 4], "rotation": 180, "texture": "#1"},
"down": {"uv": [0, 0, 4, 4], "rotation": 180, "texture": "#1"}
}
},
{
"from": [4, 4, 12],
"to": [12, 12, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 0, 0], "texture": "#1"},
"east": {"uv": [0, 9, 4, 10], "rotation": 90, "texture": "#1"},
"south": {"uv": [0, 0, 0, 0], "texture": "#1"},
"west": {"uv": [0, 8, 4, 9], "rotation": 90, "texture": "#1"},
"up": {"uv": [0, 8, 4, 9], "rotation": 180, "texture": "#1"},
"down": {"uv": [0, 9, 4, 10], "rotation": 180, "texture": "#1"}
}
},
{
"from": [4, 4, 2],
"to": [12, 12, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 0, 0], "texture": "#1"},
"east": {"uv": [0, 8, 4, 9], "rotation": 90, "texture": "#1"},
"south": {"uv": [0, 0, 0, 0], "texture": "#1"},
"west": {"uv": [0, 9, 4, 10], "rotation": 90, "texture": "#1"},
"up": {"uv": [0, 9, 4, 10], "rotation": 180, "texture": "#1"},
"down": {"uv": [0, 8, 4, 9], "rotation": 180, "texture": "#1"}
}
},
{
"from": [3, 3, 0],
"to": [13, 13, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 28, 8]},
"faces": {
"north": {"uv": [11, 11, 16, 16], "texture": "#1"},
"east": {"uv": [10.5, 11, 11.5, 16], "texture": "#1"},
"south": {"uv": [6, 11, 11, 16], "texture": "#1"},
"west": {"uv": [11.5, 16, 10.5, 11], "texture": "#1"},
"up": {"uv": [10.5, 11, 11.5, 16], "rotation": 270, "texture": "#1"},
"down": {"uv": [11.5, 16, 10.5, 11], "rotation": 270, "texture": "#1"}
}
},
{
"from": [3, 3, 14],
"to": [13, 13, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 28, 8]},
"faces": {
"north": {"uv": [6, 11, 11, 16], "texture": "#1"},
"east": {"uv": [11.5, 16, 10.5, 11], "texture": "#1"},
"south": {"uv": [11, 11, 16, 16], "texture": "#1"},
"west": {"uv": [10.5, 11, 11.5, 16], "texture": "#1"},
"up": {"uv": [11.5, 16, 10.5, 11], "rotation": 270, "texture": "#1"},
"down": {"uv": [10.5, 11, 11.5, 16], "rotation": 270, "texture": "#1"}
}
}
],
"display": {
"fixed": {
"rotation": [0, 90, 0],
"scale": [0.5, 0.5, 0.5]
}
}
}

View File

@@ -0,0 +1,22 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [3, 0, 3],
"to": [13, 2, 13],
"faces": {
"north": {"uv": [10.5, 11, 11.5, 16], "rotation": 90, "texture": "#0"},
"east": {"uv": [10.5, 11, 11.5, 16], "rotation": 90, "texture": "#0"},
"south": {"uv": [10.5, 11, 11.5, 16], "rotation": 90, "texture": "#0"},
"west": {"uv": [10.5, 11, 11.5, 16], "rotation": 90, "texture": "#0"},
"up": {"uv": [6, 11, 11, 16], "rotation": 90, "texture": "#0"},
"down": {"uv": [11, 11, 16, 16], "rotation": 270, "texture": "#0", "cullface": "down"}
}
}
]
}

View File

@@ -0,0 +1,22 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [14, 3, 3],
"to": [16, 13, 13],
"faces": {
"north": {"uv": [11.5, 16, 10.5, 11], "texture": "#0"},
"east": {"uv": [11, 11, 16, 16], "texture": "#0", "cullface": "east"},
"south": {"uv": [10.5, 11, 11.5, 16], "texture": "#0"},
"west": {"uv": [6, 11, 11, 16], "texture": "#0"},
"up": {"uv": [11.5, 16, 10.5, 11], "rotation": 180, "texture": "#0"},
"down": {"uv": [10.5, 11, 11.5, 16], "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,23 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [3, 3, 0],
"to": [13, 13, 2],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 28, 8]},
"faces": {
"north": {"uv": [11, 11, 16, 16], "texture": "#0", "cullface": "north"},
"east": {"uv": [10.5, 11, 11.5, 16], "texture": "#0"},
"south": {"uv": [6, 11, 11, 16], "texture": "#0"},
"west": {"uv": [11.5, 16, 10.5, 11], "texture": "#0"},
"up": {"uv": [10.5, 11, 11.5, 16], "rotation": 270, "texture": "#0"},
"down": {"uv": [11.5, 16, 10.5, 11], "rotation": 270, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,23 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [3, 3, 14],
"to": [13, 13, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 28, 8]},
"faces": {
"north": {"uv": [6, 11, 11, 16], "texture": "#0"},
"east": {"uv": [11.5, 16, 10.5, 11], "texture": "#0"},
"south": {"uv": [11, 11, 16, 16], "texture": "#0", "cullface": "south"},
"west": {"uv": [10.5, 11, 11.5, 16], "texture": "#0"},
"up": {"uv": [11.5, 16, 10.5, 11], "rotation": 270, "texture": "#0"},
"down": {"uv": [10.5, 11, 11.5, 16], "rotation": 270, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,22 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [3, 14, 3],
"to": [13, 16, 13],
"faces": {
"north": {"uv": [11.5, 16, 10.5, 11], "rotation": 90, "texture": "#0"},
"east": {"uv": [11.5, 16, 10.5, 11], "rotation": 90, "texture": "#0"},
"south": {"uv": [11.5, 16, 10.5, 11], "rotation": 90, "texture": "#0"},
"west": {"uv": [11.5, 16, 10.5, 11], "rotation": 90, "texture": "#0"},
"up": {"uv": [11, 11, 16, 16], "rotation": 90, "texture": "#0", "cullface": "up"},
"down": {"uv": [6, 11, 11, 16], "rotation": 270, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,22 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [0, 3, 3],
"to": [2, 13, 13],
"faces": {
"north": {"uv": [10.5, 11, 11.5, 16], "texture": "#0"},
"east": {"uv": [6, 11, 11, 16], "texture": "#0"},
"south": {"uv": [11.5, 16, 10.5, 11], "texture": "#0"},
"west": {"uv": [11, 11, 16, 16], "texture": "#0", "cullface": "west"},
"up": {"uv": [10.5, 11, 11.5, 16], "rotation": 180, "texture": "#0"},
"down": {"uv": [11.5, 16, 10.5, 11], "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,20 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4, 2, 4],
"to": [12, 4, 12],
"faces": {
"north": {"uv": [0, 9, 4, 10], "texture": "#0"},
"east": {"uv": [0, 9, 4, 10], "texture": "#0"},
"south": {"uv": [4, 9, 0, 10], "texture": "#0"},
"west": {"uv": [4, 9, 0, 10], "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,20 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [12, 4, 4],
"to": [14, 12, 12],
"faces": {
"north": {"uv": [0, 9, 4, 10], "rotation": 90, "texture": "#0"},
"south": {"uv": [0, 8, 4, 9], "rotation": 90, "texture": "#0"},
"up": {"uv": [4, 8, 0, 9], "rotation": 90, "texture": "#0"},
"down": {"uv": [4, 9, 0, 10], "rotation": 270, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4, 4, 2],
"to": [12, 12, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"east": {"uv": [0, 8, 4, 9], "rotation": 90, "texture": "#0"},
"west": {"uv": [0, 9, 4, 10], "rotation": 90, "texture": "#0"},
"up": {"uv": [0, 9, 4, 10], "rotation": 180, "texture": "#0"},
"down": {"uv": [0, 8, 4, 9], "rotation": 180, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4, 4, 12],
"to": [12, 12, 14],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 8]},
"faces": {
"east": {"uv": [0, 9, 4, 10], "rotation": 90, "texture": "#0"},
"west": {"uv": [0, 8, 4, 9], "rotation": 90, "texture": "#0"},
"up": {"uv": [0, 8, 4, 9], "rotation": 180, "texture": "#0"},
"down": {"uv": [0, 9, 4, 10], "rotation": 180, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,20 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4, 12, 4],
"to": [12, 14, 12],
"faces": {
"north": {"uv": [0, 8, 4, 9], "texture": "#0"},
"east": {"uv": [0, 8, 4, 9], "texture": "#0"},
"south": {"uv": [4, 8, 0, 9], "texture": "#0"},
"west": {"uv": [4, 8, 0, 9], "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,20 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [2, 4, 4],
"to": [4, 12, 12],
"faces": {
"north": {"uv": [0, 8, 4, 9], "rotation": 90, "texture": "#0"},
"south": {"uv": [0, 9, 4, 10], "rotation": 90, "texture": "#0"},
"up": {"uv": [4, 9, 0, 10], "rotation": 90, "texture": "#0"},
"down": {"uv": [4, 8, 0, 9], "rotation": 270, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,85 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/glass_steel_pipe",
"particle": "tfmg:block/steel_block"
},
"elements": [
{
"name": "Outer",
"from": [4, 0, 4],
"to": [12, 16, 12],
"faces": {
"north": {"uv": [0, 16, 16, 8], "rotation": 90, "texture": "#0"},
"east": {"uv": [0, 16, 16, 8], "rotation": 90, "texture": "#0"},
"south": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"},
"west": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"}
}
},
{
"name": "Inner",
"from": [4, 0, 11.9],
"to": [12, 16, 11.9],
"faces": {
"north": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"}
}
},
{
"name": "Inner",
"from": [4.1, 0, 4],
"to": [4.1, 16, 12],
"faces": {
"east": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"}
}
},
{
"name": "Inner",
"from": [4, 0, 4.1],
"to": [12, 16, 4.1],
"faces": {
"south": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"}
}
},
{
"name": "Inner",
"from": [11.9, 0, 4],
"to": [11.9, 16, 12],
"faces": {
"west": {"uv": [0, 8, 16, 16], "rotation": 90, "texture": "#0"}
}
},
{
"from": [4, 0, 4],
"to": [6, 16, 6],
"faces": {
"east": {"uv": [0, 14, 16, 16], "rotation": 90, "texture": "#0"},
"south": {"uv": [0, 8, 16, 10], "rotation": 90, "texture": "#0"}
}
},
{
"from": [4, 0, 10],
"to": [6, 16, 12],
"faces": {
"north": {"uv": [0, 10, 16, 8], "rotation": 90, "texture": "#0"},
"east": {"uv": [0, 16, 16, 14], "rotation": 90, "texture": "#0"}
}
},
{
"from": [10, 0, 4],
"to": [12, 16, 6],
"faces": {
"south": {"uv": [0, 14, 16, 16], "rotation": 90, "texture": "#0"},
"west": {"uv": [0, 8, 16, 10], "rotation": 90, "texture": "#0"}
}
},
{
"from": [10, 0, 10],
"to": [12, 16, 12],
"faces": {
"north": {"uv": [0, 16, 16, 14], "rotation": 90, "texture": "#0"},
"west": {"uv": [0, 10, 16, 8], "rotation": 90, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,58 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/glass_steel_pipe",
"particle": "#0"
},
"elements": [
{
"name": "Outer",
"from": [4, 0, 4],
"to": [12, 16, 12],
"shade": false,
"faces": {
"north": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"},
"east": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"},
"south": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"},
"west": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"}
}
},
{
"name": "Inner",
"from": [4, 0, 11.5],
"to": [12, 16, 11.5],
"shade": false,
"faces": {
"north": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"}
}
},
{
"name": "Inner",
"from": [4, 0, 4.5],
"to": [12, 16, 4.5],
"shade": false,
"faces": {
"south": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"}
}
},
{
"name": "Inner",
"from": [4.5, 0, 4],
"to": [4.5, 16, 12],
"shade": false,
"faces": {
"east": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"}
}
},
{
"name": "Inner",
"from": [11.5, 0, 4],
"to": [11.5, 16, 12],
"shade": false,
"faces": {
"west": {"uv": [0, 0, 16, 8], "rotation": 90, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,74 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"4": "tfmg:block/steel_fluid_tank_inner",
"particle": "tfmg:block/fluid_tank"
},
"elements": [
{
"name": "Lid",
"from": [0, 0, 0],
"to": [16, 4, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "north"},
"east": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "east"},
"south": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "south"},
"west": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "west"},
"up": {"uv": [0, 0, 16, 16], "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
}
},
{
"name": "SideRight",
"from": [0, 4, 0],
"to": [16, 16, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 12, -23]},
"faces": {
"north": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "north"},
"south": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "north"}
}
},
{
"name": "SideRight",
"from": [15, 4, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]},
"faces": {
"east": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "east"},
"west": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "east"}
}
},
{
"name": "SideRight",
"from": [0, 4, 15],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]},
"faces": {
"north": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "south"},
"south": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "south"}
}
},
{
"name": "SideRight",
"from": [0, 4, 0],
"to": [1, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]},
"faces": {
"east": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "west"},
"west": {"uv": [0, 0, 16, 12], "texture": "#1", "cullface": "west"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4]
}
]
}

View File

@@ -0,0 +1,154 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/steel_fluid_tank_window",
"4": "tfmg:block/steel_fluid_tank_inner",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [0, 4, 0],
"to": [4, 16, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [12, 0, 16, 12], "texture": "#1", "cullface": "north"},
"east": {"uv": [0, 0, 1, 12], "texture": "#1", "cullface": "north"},
"south": {"uv": [0, 0, 4, 12], "texture": "#1", "cullface": "north"}
}
},
{
"name": "SideRight",
"from": [15, 4, 0],
"to": [16, 16, 4],
"faces": {
"east": {"uv": [12, 0, 16, 12], "texture": "#1", "cullface": "east"},
"south": {"uv": [0, 0, 1, 12], "texture": "#1", "cullface": "east"},
"west": {"uv": [0, 0, 4, 12], "texture": "#1", "cullface": "east"}
}
},
{
"name": "SideRight",
"from": [12, 4, 15],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [0, 0, 4, 12], "texture": "#1", "cullface": "south"},
"south": {"uv": [12, 0, 16, 12], "texture": "#1", "cullface": "south"},
"west": {"uv": [0, 0, 1, 12], "texture": "#1", "cullface": "south"}
}
},
{
"name": "SideRight",
"from": [0, 4, 12],
"to": [1, 16, 16],
"faces": {
"north": {"uv": [0, 0, 1, 12], "texture": "#1", "cullface": "west"},
"east": {"uv": [0, 0, 4, 12], "texture": "#1", "cullface": "west"},
"west": {"uv": [12, 0, 16, 12], "texture": "#1", "cullface": "west"}
}
},
{
"name": "Window",
"from": [4, 4, 0.95],
"to": [12, 16, 0.95],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 4, 8, 16], "texture": "#3", "cullface": "north"},
"south": {"uv": [0, 4, 8, 16], "texture": "#3", "cullface": "north"}
}
},
{
"name": "Window",
"from": [15.05, 4, 4],
"to": [15.05, 16, 12],
"faces": {
"east": {"uv": [0, 4, 8, 16], "texture": "#3", "cullface": "east"},
"west": {"uv": [0, 4, 8, 16], "texture": "#3", "cullface": "east"}
}
},
{
"name": "Window",
"from": [4, 4, 15.05],
"to": [12, 16, 15.05],
"faces": {
"north": {"uv": [0, 4, 8, 16], "texture": "#3", "cullface": "south"},
"south": {"uv": [0, 4, 8, 16], "texture": "#3", "cullface": "south"}
}
},
{
"name": "Window",
"from": [0.95, 4, 4],
"to": [0.95, 16, 12],
"faces": {
"east": {"uv": [0, 4, 8, 16], "texture": "#3", "cullface": "west"},
"west": {"uv": [0, 4, 8, 16], "texture": "#3", "cullface": "west"}
}
},
{
"name": "SideLeft",
"from": [12, 4, 0],
"to": [16, 16, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 0, 4, 12], "texture": "#1", "cullface": "north"},
"south": {"uv": [12, 0, 16, 12], "texture": "#1", "cullface": "north"},
"west": {"uv": [15, 0, 16, 12], "texture": "#1", "cullface": "north"}
}
},
{
"name": "SideLeft",
"from": [15, 4, 12],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [15, 0, 16, 12], "texture": "#1", "cullface": "east"},
"east": {"uv": [0, 0, 4, 12], "texture": "#1", "cullface": "east"},
"west": {"uv": [12, 0, 16, 12], "texture": "#1", "cullface": "east"}
}
},
{
"name": "SideLeft",
"from": [0, 4, 15],
"to": [4, 16, 16],
"faces": {
"north": {"uv": [12, 0, 16, 12], "texture": "#1", "cullface": "south"},
"east": {"uv": [15, 0, 16, 12], "texture": "#1", "cullface": "south"},
"south": {"uv": [0, 0, 4, 12], "texture": "#1", "cullface": "south"}
}
},
{
"name": "SideLeft",
"from": [0, 4, 0],
"to": [1, 16, 4],
"faces": {
"east": {"uv": [12, 0, 16, 12], "texture": "#1", "cullface": "west"},
"south": {"uv": [15, 0, 16, 12], "texture": "#1", "cullface": "west"},
"west": {"uv": [0, 0, 4, 12], "texture": "#1", "cullface": "west"}
}
},
{
"name": "Bottom",
"from": [0, 0, 0],
"to": [16, 4, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "north"},
"east": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "east"},
"south": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "south"},
"west": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "west"},
"up": {"uv": [0, 0, 16, 16], "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
}
]
}

View File

@@ -0,0 +1,73 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/steel_fluid_tank_window",
"4": "tfmg:block/steel_fluid_tank_inner",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [15, 4, 0],
"to": [16, 16, 12],
"faces": {
"east": {"uv": [4, 0, 16, 12], "texture": "#1"},
"south": {"uv": [4, 0, 5, 12], "texture": "#1"},
"west": {"uv": [0, 0, 12, 12], "texture": "#1"}
}
},
{
"name": "Window",
"from": [0, 4, 0.95],
"to": [4, 16, 0.95],
"faces": {
"north": {"uv": [0, 4, 4, 16], "texture": "#3"},
"south": {"uv": [4, 4, 8, 16], "texture": "#3"}
}
},
{
"name": "Window",
"from": [15.05, 4, 12],
"to": [15.05, 16, 16],
"faces": {
"east": {"uv": [4, 4, 8, 16], "texture": "#3"},
"west": {"uv": [0, 4, 4, 16], "texture": "#3"}
}
},
{
"name": "SideLeft",
"from": [4, 4, 0],
"to": [16, 16, 1],
"faces": {
"north": {"uv": [0, 0, 12, 12], "texture": "#1"},
"south": {"uv": [4, 0, 16, 12], "texture": "#1"},
"west": {"uv": [11, 0, 12, 12], "texture": "#1"}
}
},
{
"name": "Bottom",
"from": [0, 0, 0],
"to": [16, 4, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [-23, 8, 8]},
"faces": {
"north": {"uv": [0, 12, 16, 16], "texture": "#1"},
"east": {"uv": [0, 12, 16, 16], "texture": "#1"},
"south": {"uv": [0, 12, 16, 16], "texture": "#1"},
"west": {"uv": [0, 12, 16, 16], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4]
}
]
}

View File

@@ -0,0 +1,73 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/steel_fluid_tank_window",
"4": "tfmg:block/steel_fluid_tank_inner",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [0, 4, 0],
"to": [12, 16, 1],
"faces": {
"north": {"uv": [4, 0, 16, 12], "texture": "#1"},
"east": {"uv": [4, 0, 5, 12], "texture": "#1"},
"south": {"uv": [0, 0, 12, 12], "texture": "#1"}
}
},
{
"name": "Window",
"from": [0.95, 4, 12],
"to": [0.95, 16, 16],
"faces": {
"east": {"uv": [4, 4, 8, 16], "texture": "#3"},
"west": {"uv": [0, 4, 4, 16], "texture": "#3"}
}
},
{
"name": "Window",
"from": [12, 4, 0.95],
"to": [16, 16, 0.95],
"faces": {
"north": {"uv": [4, 4, 8, 16], "texture": "#3"},
"south": {"uv": [0, 4, 4, 16], "texture": "#3"}
}
},
{
"name": "SideLeft",
"from": [0, 4, 0],
"to": [1, 16, 12],
"faces": {
"east": {"uv": [4, 0, 16, 12], "texture": "#1"},
"south": {"uv": [11, 0, 12, 12], "texture": "#1"},
"west": {"uv": [0, 0, 12, 12], "texture": "#1"}
}
},
{
"name": "Bottom",
"from": [0, 0, 0],
"to": [16, 4, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 39]},
"faces": {
"north": {"uv": [0, 12, 16, 16], "texture": "#1"},
"east": {"uv": [0, 12, 16, 16], "texture": "#1"},
"south": {"uv": [0, 12, 16, 16], "texture": "#1"},
"west": {"uv": [0, 12, 16, 16], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4]
}
]
}

View File

@@ -0,0 +1,73 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/steel_fluid_tank_window",
"4": "tfmg:block/steel_fluid_tank_inner",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [4, 4, 15],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [0, 0, 12, 12], "texture": "#1"},
"south": {"uv": [4, 0, 16, 12], "texture": "#1"},
"west": {"uv": [4, 0, 5, 12], "texture": "#1"}
}
},
{
"name": "Window",
"from": [15.05, 4, 0],
"to": [15.05, 16, 4],
"faces": {
"east": {"uv": [0, 4, 4, 16], "texture": "#3"},
"west": {"uv": [4, 4, 8, 16], "texture": "#3"}
}
},
{
"name": "Window",
"from": [0, 4, 15.05],
"to": [4, 16, 15.05],
"faces": {
"north": {"uv": [0, 4, 4, 16], "texture": "#3"},
"south": {"uv": [4, 4, 8, 16], "texture": "#3"}
}
},
{
"name": "SideLeft",
"from": [15, 4, 4],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [11, 0, 12, 12], "texture": "#1"},
"east": {"uv": [0, 0, 12, 12], "texture": "#1"},
"west": {"uv": [4, 0, 16, 12], "texture": "#1"}
}
},
{
"name": "Bottom",
"from": [0, 0, 0],
"to": [16, 4, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 12, 16, 16], "texture": "#1"},
"east": {"uv": [0, 12, 16, 16], "texture": "#1"},
"south": {"uv": [0, 12, 16, 16], "texture": "#1"},
"west": {"uv": [0, 12, 16, 16], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4]
}
]
}

View File

@@ -0,0 +1,73 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/steel_fluid_tank_window",
"4": "tfmg:block/steel_fluid_tank_inner",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [0, 4, 4],
"to": [1, 16, 16],
"faces": {
"north": {"uv": [4, 0, 5, 12], "texture": "#1"},
"east": {"uv": [0, 0, 12, 12], "texture": "#1"},
"west": {"uv": [4, 0, 16, 12], "texture": "#1"}
}
},
{
"name": "Window",
"from": [12, 4, 15.05],
"to": [16, 16, 15.05],
"faces": {
"north": {"uv": [4, 4, 8, 16], "texture": "#3"},
"south": {"uv": [0, 4, 4, 16], "texture": "#3"}
}
},
{
"name": "Window",
"from": [0.95, 4, 0],
"to": [0.95, 16, 4],
"faces": {
"east": {"uv": [0, 4, 4, 16], "texture": "#3"},
"west": {"uv": [4, 4, 8, 16], "texture": "#3"}
}
},
{
"name": "SideLeft",
"from": [0, 4, 15],
"to": [12, 16, 16],
"faces": {
"north": {"uv": [4, 0, 16, 12], "texture": "#1"},
"east": {"uv": [11, 0, 12, 12], "texture": "#1"},
"south": {"uv": [0, 0, 12, 12], "texture": "#1"}
}
},
{
"name": "Bottom",
"from": [0, 0, 0],
"to": [16, 4, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [39, 8, 8]},
"faces": {
"north": {"uv": [0, 12, 16, 16], "texture": "#1"},
"east": {"uv": [0, 12, 16, 16], "texture": "#1"},
"south": {"uv": [0, 12, 16, 16], "texture": "#1"},
"west": {"uv": [0, 12, 16, 16], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4]
}
]
}

View File

@@ -0,0 +1,57 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"1": "tfmg:block/steel_fluid_tank",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [0, 0, 0],
"to": [16, 16, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 12, -23]},
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"},
"south": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "north"}
}
},
{
"name": "SideRight",
"from": [15, 0, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]},
"faces": {
"east": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "east"},
"west": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "east"}
}
},
{
"name": "SideRight",
"from": [0, 0, 15],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]},
"faces": {
"north": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "south"},
"south": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "south"}
}
},
{
"name": "SideRight",
"from": [0, 0, 0],
"to": [1, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]},
"faces": {
"east": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "west"},
"west": {"uv": [0, 0, 16, 16], "texture": "#1", "cullface": "west"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"children": [0, 1, 2, 3]
}
]
}

View File

@@ -0,0 +1,138 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/fluid_tank_window",
"particle": "tfmg:block/fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [0, 0, 0],
"to": [4, 16, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [12, 0, 16, 16], "texture": "#1", "cullface": "north"},
"east": {"uv": [0, 0, 1, 16], "texture": "#1", "cullface": "north"},
"south": {"uv": [0, 0, 4, 16], "texture": "#1", "cullface": "north"}
}
},
{
"name": "SideRight",
"from": [15, 0, 0],
"to": [16, 16, 4],
"faces": {
"east": {"uv": [12, 0, 16, 16], "texture": "#1", "cullface": "east"},
"south": {"uv": [0, 0, 1, 16], "texture": "#1", "cullface": "east"},
"west": {"uv": [0, 0, 4, 16], "texture": "#1", "cullface": "east"}
}
},
{
"name": "SideRight",
"from": [12, 0, 15],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [0, 0, 4, 16], "texture": "#1", "cullface": "south"},
"south": {"uv": [12, 0, 16, 16], "texture": "#1", "cullface": "south"},
"west": {"uv": [0, 0, 1, 16], "texture": "#1", "cullface": "south"}
}
},
{
"name": "SideRight",
"from": [0, 0, 12],
"to": [1, 16, 16],
"faces": {
"north": {"uv": [0, 0, 1, 16], "texture": "#1", "cullface": "west"},
"east": {"uv": [0, 0, 4, 16], "texture": "#1", "cullface": "west"},
"west": {"uv": [12, 0, 16, 16], "texture": "#1", "cullface": "west"}
}
},
{
"name": "Window",
"from": [4, 0, 0.95],
"to": [12, 16, 0.95],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [8, 0, 16, 16], "texture": "#3", "cullface": "north"},
"south": {"uv": [8, 0, 16, 16], "texture": "#3", "cullface": "north"}
}
},
{
"name": "Window",
"from": [15.05, 0, 4],
"to": [15.05, 16, 12],
"faces": {
"east": {"uv": [8, 0, 16, 16], "texture": "#3", "cullface": "east"},
"west": {"uv": [8, 0, 16, 16], "texture": "#3", "cullface": "east"}
}
},
{
"name": "Window",
"from": [4, 0, 15.05],
"to": [12, 16, 15.05],
"faces": {
"north": {"uv": [8, 0, 16, 16], "texture": "#3", "cullface": "south"},
"south": {"uv": [8, 0, 16, 16], "texture": "#3", "cullface": "south"}
}
},
{
"name": "Window",
"from": [0.95, 0, 4],
"to": [0.95, 16, 12],
"faces": {
"east": {"uv": [8, 0, 16, 16], "texture": "#3", "cullface": "west"},
"west": {"uv": [8, 0, 16, 16], "texture": "#3", "cullface": "west"}
}
},
{
"name": "SideLeft",
"from": [12, 0, 0],
"to": [16, 16, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 0, 4, 16], "texture": "#1", "cullface": "north"},
"south": {"uv": [12, 0, 16, 16], "texture": "#1", "cullface": "north"},
"west": {"uv": [15, 0, 16, 16], "texture": "#1", "cullface": "north"}
}
},
{
"name": "SideLeft",
"from": [15, 0, 12],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [15, 0, 16, 16], "texture": "#1", "cullface": "east"},
"east": {"uv": [0, 0, 4, 16], "texture": "#1", "cullface": "east"},
"west": {"uv": [12, 0, 16, 16], "texture": "#1", "cullface": "east"}
}
},
{
"name": "SideLeft",
"from": [0, 0, 15],
"to": [4, 16, 16],
"faces": {
"north": {"uv": [12, 0, 16, 16], "texture": "#1", "cullface": "south"},
"east": {"uv": [15, 0, 16, 16], "texture": "#1", "cullface": "south"},
"south": {"uv": [0, 0, 4, 16], "texture": "#1", "cullface": "south"}
}
},
{
"name": "SideLeft",
"from": [0, 0, 0],
"to": [1, 16, 4],
"faces": {
"east": {"uv": [12, 0, 16, 16], "texture": "#1", "cullface": "west"},
"south": {"uv": [15, 0, 16, 16], "texture": "#1", "cullface": "west"},
"west": {"uv": [0, 0, 4, 16], "texture": "#1", "cullface": "west"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
}
]
}

View File

@@ -0,0 +1,57 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/steel_fluid_tank_window",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [15, 0, 0],
"to": [16, 16, 12],
"faces": {
"east": {"uv": [4, 0, 16, 16], "texture": "#1"},
"south": {"uv": [4, 0, 5, 16], "texture": "#1"},
"west": {"uv": [0, 0, 12, 16], "texture": "#1"}
}
},
{
"name": "Window",
"from": [0, 0, 0.95],
"to": [4, 16, 0.95],
"faces": {
"north": {"uv": [8, 0, 12, 16], "texture": "#3"},
"south": {"uv": [12, 0, 16, 16], "texture": "#3"}
}
},
{
"name": "Window",
"from": [15.05, 0, 12],
"to": [15.05, 16, 16],
"faces": {
"east": {"uv": [12, 0, 16, 16], "texture": "#3"},
"west": {"uv": [8, 0, 12, 16], "texture": "#3"}
}
},
{
"name": "SideLeft",
"from": [4, 0, 0],
"to": [16, 16, 1],
"faces": {
"north": {"uv": [0, 0, 12, 16], "texture": "#1"},
"south": {"uv": [4, 0, 16, 16], "texture": "#1"},
"west": {"uv": [11, 0, 12, 16], "texture": "#1"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3]
}
]
}

View File

@@ -0,0 +1,57 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/steel_fluid_tank_window",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [0, 0, 0],
"to": [12, 16, 1],
"faces": {
"north": {"uv": [4, 0, 16, 16], "texture": "#1"},
"east": {"uv": [4, 0, 5, 16], "texture": "#1"},
"south": {"uv": [0, 0, 12, 16], "texture": "#1"}
}
},
{
"name": "Window",
"from": [0.95, 0, 12],
"to": [0.95, 16, 16],
"faces": {
"east": {"uv": [12, 0, 16, 16], "texture": "#3"},
"west": {"uv": [8, 0, 12, 16], "texture": "#3"}
}
},
{
"name": "Window",
"from": [12, 0, 0.95],
"to": [16, 16, 0.95],
"faces": {
"north": {"uv": [12, 0, 16, 16], "texture": "#3"},
"south": {"uv": [8, 0, 12, 16], "texture": "#3"}
}
},
{
"name": "SideLeft",
"from": [0, 0, 0],
"to": [1, 16, 12],
"faces": {
"east": {"uv": [4, 0, 16, 16], "texture": "#1"},
"south": {"uv": [11, 0, 12, 16], "texture": "#1"},
"west": {"uv": [0, 0, 12, 16], "texture": "#1"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3]
}
]
}

View File

@@ -0,0 +1,57 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/steel_fluid_tank_window",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [4, 0, 15],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [0, 0, 12, 16], "texture": "#1"},
"south": {"uv": [4, 0, 16, 16], "texture": "#1"},
"west": {"uv": [4, 0, 5, 16], "texture": "#1"}
}
},
{
"name": "Window",
"from": [15.05, 0, 0],
"to": [15.05, 16, 4],
"faces": {
"east": {"uv": [8, 0, 12, 16], "texture": "#3"},
"west": {"uv": [12, 0, 16, 16], "texture": "#3"}
}
},
{
"name": "Window",
"from": [0, 0, 15.05],
"to": [4, 16, 15.05],
"faces": {
"north": {"uv": [8, 0, 12, 16], "texture": "#3"},
"south": {"uv": [12, 0, 16, 16], "texture": "#3"}
}
},
{
"name": "SideLeft",
"from": [15, 0, 4],
"to": [16, 16, 16],
"faces": {
"north": {"uv": [11, 0, 12, 16], "texture": "#1"},
"east": {"uv": [0, 0, 12, 16], "texture": "#1"},
"west": {"uv": [4, 0, 16, 16], "texture": "#1"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3]
}
]
}

View File

@@ -0,0 +1,57 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/steel_fluid_tank_window",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [0, 0, 4],
"to": [1, 16, 16],
"faces": {
"north": {"uv": [4, 0, 5, 16], "texture": "#1"},
"east": {"uv": [0, 0, 12, 16], "texture": "#1"},
"west": {"uv": [4, 0, 16, 16], "texture": "#1"}
}
},
{
"name": "Window",
"from": [12, 0, 15.05],
"to": [16, 16, 15.05],
"faces": {
"north": {"uv": [12, 0, 16, 16], "texture": "#3"},
"south": {"uv": [8, 0, 12, 16], "texture": "#3"}
}
},
{
"name": "Window",
"from": [0.95, 0, 0],
"to": [0.95, 16, 4],
"faces": {
"east": {"uv": [8, 0, 12, 16], "texture": "#3"},
"west": {"uv": [12, 0, 16, 16], "texture": "#3"}
}
},
{
"name": "SideLeft",
"from": [0, 0, 15],
"to": [12, 16, 16],
"faces": {
"north": {"uv": [4, 0, 16, 16], "texture": "#1"},
"east": {"uv": [11, 0, 12, 16], "texture": "#1"},
"south": {"uv": [0, 0, 12, 16], "texture": "#1"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3]
}
]
}

View File

@@ -0,0 +1,127 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"4": "tfmg:block/steel_fluid_tank_inner",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "Lid",
"from": [0, 0, 0],
"to": [16, 4, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "north"},
"east": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "east"},
"south": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "south"},
"west": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "west"},
"up": {"uv": [0, 0, 16, 16], "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
}
},
{
"name": "SideRight",
"from": [15, 4, 0],
"to": [16, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]},
"faces": {
"east": {"uv": [0, 4, 16, 12], "texture": "#1", "cullface": "east"},
"west": {"uv": [0, 4, 16, 12], "texture": "#1", "cullface": "east"}
}
},
{
"name": "SideRight",
"from": [0, 4, 15],
"to": [16, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]},
"faces": {
"north": {"uv": [0, 4, 16, 12], "texture": "#1", "cullface": "south"},
"south": {"uv": [0, 4, 16, 12], "texture": "#1", "cullface": "south"}
}
},
{
"name": "SideRight",
"from": [0, 4, 0],
"to": [1, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 12, 8]},
"faces": {
"east": {"uv": [0, 4, 16, 12], "texture": "#1", "cullface": "west"},
"west": {"uv": [0, 4, 16, 12], "texture": "#1", "cullface": "west"}
}
},
{
"name": "Lid",
"from": [0, 12, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "north"},
"east": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "east"},
"south": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "south"},
"west": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "west"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#4"}
}
},
{
"name": "SideRight",
"from": [0, 4, 0],
"to": [16, 12, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 4, 16, 12], "texture": "#1", "cullface": "north"},
"south": {"uv": [0, 4, 16, 12], "texture": "#1", "cullface": "north"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": []
},
{
"name": "block_middle",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": []
}
]
},
{
"name": "block_bottom",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3]
}
]
},
{
"name": "block_top",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [4, 5]
}
]
}
]
}

View File

@@ -0,0 +1,168 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"4": "tfmg:block/steel_fluid_tank_inner",
"5": "tfmg:block/steel_fluid_tank_window_single",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "Lid",
"from": [0, 12, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "north"},
"east": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "east"},
"south": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "south"},
"west": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "west"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#4"}
}
},
{
"name": "SideRight",
"from": [0, 4, 0],
"to": [4, 12, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "north"},
"east": {"uv": [8, 4, 9, 12], "texture": "#1", "cullface": "north"},
"south": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "north"}
}
},
{
"name": "SideRight",
"from": [15, 4, 0],
"to": [16, 12, 4],
"faces": {
"east": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "east"},
"south": {"uv": [8, 4, 9, 12], "texture": "#1", "cullface": "east"},
"west": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "east"}
}
},
{
"name": "SideRight",
"from": [12, 4, 15],
"to": [16, 12, 16],
"faces": {
"north": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "south"},
"south": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "south"},
"west": {"uv": [8, 4, 9, 12], "texture": "#1", "cullface": "south"}
}
},
{
"name": "SideRight",
"from": [0, 4, 12],
"to": [1, 12, 16],
"faces": {
"north": {"uv": [8, 4, 9, 12], "texture": "#1", "cullface": "west"},
"east": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "west"},
"west": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "west"}
}
},
{
"name": "Window",
"from": [4, 4, 0.95],
"to": [12, 12, 0.95],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "north"},
"south": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "north"}
}
},
{
"name": "Window",
"from": [15.05, 4, 4],
"to": [15.05, 12, 12],
"faces": {
"east": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "east"},
"west": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "east"}
}
},
{
"name": "Window",
"from": [4, 4, 15.05],
"to": [12, 12, 15.05],
"faces": {
"north": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "south"},
"south": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "south"}
}
},
{
"name": "Window",
"from": [0.95, 4, 4],
"to": [0.95, 12, 12],
"faces": {
"east": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "west"},
"west": {"uv": [0, 0, 8, 8], "texture": "#5", "cullface": "west"}
}
},
{
"name": "SideLeft",
"from": [12, 4, 0],
"to": [16, 12, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "north"},
"south": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "north"},
"west": {"uv": [7, 4, 8, 12], "texture": "#1", "cullface": "north"}
}
},
{
"name": "SideLeft",
"from": [15, 4, 12],
"to": [16, 12, 16],
"faces": {
"north": {"uv": [7, 4, 8, 12], "texture": "#1", "cullface": "east"},
"east": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "east"},
"west": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "east"}
}
},
{
"name": "SideLeft",
"from": [0, 4, 15],
"to": [4, 12, 16],
"faces": {
"north": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "south"},
"east": {"uv": [7, 4, 8, 12], "texture": "#1", "cullface": "south"},
"south": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "south"}
}
},
{
"name": "SideLeft",
"from": [0, 4, 0],
"to": [1, 12, 4],
"faces": {
"east": {"uv": [12, 4, 16, 12], "texture": "#1", "cullface": "west"},
"south": {"uv": [7, 4, 8, 12], "texture": "#1", "cullface": "west"},
"west": {"uv": [0, 4, 4, 12], "texture": "#1", "cullface": "west"}
}
},
{
"name": "Bottom",
"from": [0, 0, 0],
"to": [16, 4, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "north"},
"east": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "east"},
"south": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "south"},
"west": {"uv": [0, 12, 16, 16], "texture": "#1", "cullface": "west"},
"up": {"uv": [0, 0, 16, 16], "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
}
]
}

View File

@@ -0,0 +1,104 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"4": "tfmg:block/steel_fluid_tank_inner",
"5": "tfmg:block/steel_fluid_tank_window_single",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [15, 4, 0],
"to": [16, 12, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"east": {"uv": [4, 4, 16, 12], "texture": "#1"},
"south": {"uv": [4, 4, 5, 12], "texture": "#1"},
"west": {"uv": [0, 4, 12, 12], "texture": "#1"}
}
},
{
"name": "Window",
"from": [0, 4, 0.95],
"to": [4, 12, 0.95],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [0, 0, 4, 8], "texture": "#5"},
"south": {"uv": [4, 0, 8, 8], "texture": "#5"}
}
},
{
"name": "Window",
"from": [15.05, 4, 12],
"to": [15.05, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"east": {"uv": [4, 0, 8, 8], "texture": "#5"},
"west": {"uv": [0, 0, 4, 8], "texture": "#5"}
}
},
{
"name": "SideLeft",
"from": [4, 4, 0],
"to": [16, 12, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [0, 4, 12, 12], "texture": "#1"},
"south": {"uv": [4, 4, 16, 12], "texture": "#1"},
"west": {"uv": [11, 4, 12, 12], "texture": "#1"}
}
},
{
"name": "Bottom",
"from": [0, 12, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [-23, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 16, 4], "texture": "#1"},
"east": {"uv": [0, 0, 16, 4], "texture": "#1"},
"south": {"uv": [0, 0, 16, 4], "texture": "#1"},
"west": {"uv": [0, 0, 16, 4], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#4"}
}
},
{
"name": "Bottom",
"from": [0, 0, 0],
"to": [16, 4, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [-23, 8, 8]},
"faces": {
"north": {"uv": [0, 12, 16, 16], "texture": "#1"},
"east": {"uv": [0, 12, 16, 16], "texture": "#1"},
"south": {"uv": [0, 12, 16, 16], "texture": "#1"},
"west": {"uv": [0, 12, 16, 16], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4]
},
{
"name": "block_bottom_centered_window",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [5]
}
]
}
]
}

View File

@@ -0,0 +1,104 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"4": "tfmg:block/steel_fluid_tank_inner",
"5": "tfmg:block/steel_fluid_tank_window_single",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [0, 4, 0],
"to": [12, 12, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [4, 4, 16, 12], "texture": "#1"},
"east": {"uv": [4, 4, 5, 12], "texture": "#1"},
"south": {"uv": [0, 4, 12, 12], "texture": "#1"}
}
},
{
"name": "Window",
"from": [0.95, 4, 12],
"to": [0.95, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"east": {"uv": [4, 0, 8, 8], "texture": "#5"},
"west": {"uv": [0, 0, 4, 8], "texture": "#5"}
}
},
{
"name": "Window",
"from": [12, 4, 0.95],
"to": [16, 12, 0.95],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [4, 0, 8, 8], "texture": "#5"},
"south": {"uv": [0, 0, 4, 8], "texture": "#5"}
}
},
{
"name": "SideLeft",
"from": [0, 4, 0],
"to": [1, 12, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"east": {"uv": [4, 4, 16, 12], "texture": "#1"},
"south": {"uv": [11, 4, 12, 12], "texture": "#1"},
"west": {"uv": [0, 4, 12, 12], "texture": "#1"}
}
},
{
"name": "Bottom",
"from": [0, 12, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 39]},
"faces": {
"north": {"uv": [0, 0, 16, 4], "texture": "#1"},
"east": {"uv": [0, 0, 16, 4], "texture": "#1"},
"south": {"uv": [0, 0, 16, 4], "texture": "#1"},
"west": {"uv": [0, 0, 16, 4], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#4"}
}
},
{
"name": "Bottom",
"from": [0, 0, 0],
"to": [16, 4, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 39]},
"faces": {
"north": {"uv": [0, 12, 16, 16], "texture": "#1"},
"east": {"uv": [0, 12, 16, 16], "texture": "#1"},
"south": {"uv": [0, 12, 16, 16], "texture": "#1"},
"west": {"uv": [0, 12, 16, 16], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4]
},
{
"name": "block_bottom_centered_window",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [5]
}
]
}
]
}

View File

@@ -0,0 +1,104 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"4": "tfmg:block/steel_fluid_tank_inner",
"5": "tfmg:block/steel_fluid_tank_window_single",
"particle": "tfmg:block/fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [4, 4, 15],
"to": [16, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [0, 4, 12, 12], "texture": "#1"},
"south": {"uv": [4, 4, 16, 12], "texture": "#1"},
"west": {"uv": [4, 4, 5, 12], "texture": "#1"}
}
},
{
"name": "Window",
"from": [15.05, 4, 0],
"to": [15.05, 12, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"east": {"uv": [0, 0, 4, 8], "texture": "#5"},
"west": {"uv": [4, 0, 8, 8], "texture": "#5"}
}
},
{
"name": "Window",
"from": [0, 4, 15.05],
"to": [4, 12, 15.05],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [0, 0, 4, 8], "texture": "#5"},
"south": {"uv": [4, 0, 8, 8], "texture": "#5"}
}
},
{
"name": "SideLeft",
"from": [15, 4, 4],
"to": [16, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [11, 4, 12, 12], "texture": "#1"},
"east": {"uv": [0, 4, 12, 12], "texture": "#1"},
"west": {"uv": [4, 4, 16, 12], "texture": "#1"}
}
},
{
"name": "Bottom",
"from": [0, 12, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 0, 16, 4], "texture": "#1"},
"east": {"uv": [0, 0, 16, 4], "texture": "#1"},
"south": {"uv": [0, 0, 16, 4], "texture": "#1"},
"west": {"uv": [0, 0, 16, 4], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#4"}
}
},
{
"name": "Bottom",
"from": [0, 0, 0],
"to": [16, 4, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 12, 16, 16], "texture": "#1"},
"east": {"uv": [0, 12, 16, 16], "texture": "#1"},
"south": {"uv": [0, 12, 16, 16], "texture": "#1"},
"west": {"uv": [0, 12, 16, 16], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4]
},
{
"name": "block_bottom_centered_window",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [5]
}
]
}
]
}

View File

@@ -0,0 +1,104 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"4": "tfmg:block/steel_fluid_tank_inner",
"5": "tfmg:block/steel_fluid_tank_window_single",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [0, 4, 4],
"to": [1, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [4, 4, 5, 12], "texture": "#1"},
"east": {"uv": [0, 4, 12, 12], "texture": "#1"},
"west": {"uv": [4, 4, 16, 12], "texture": "#1"}
}
},
{
"name": "Window",
"from": [12, 4, 15.05],
"to": [16, 12, 15.05],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [4, 0, 8, 8], "texture": "#5"},
"south": {"uv": [0, 0, 4, 8], "texture": "#5"}
}
},
{
"name": "Window",
"from": [0.95, 4, 0],
"to": [0.95, 12, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"east": {"uv": [0, 0, 4, 8], "texture": "#5"},
"west": {"uv": [4, 0, 8, 8], "texture": "#5"}
}
},
{
"name": "SideLeft",
"from": [0, 4, 15],
"to": [12, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [4, 4, 16, 12], "texture": "#1"},
"east": {"uv": [11, 4, 12, 12], "texture": "#1"},
"south": {"uv": [0, 4, 12, 12], "texture": "#1"}
}
},
{
"name": "Bottom",
"from": [0, 12, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [39, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 16, 4], "texture": "#1"},
"east": {"uv": [0, 0, 16, 4], "texture": "#1"},
"south": {"uv": [0, 0, 16, 4], "texture": "#1"},
"west": {"uv": [0, 0, 16, 4], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#4"}
}
},
{
"name": "Bottom",
"from": [0, 0, 0],
"to": [16, 4, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [39, 8, 8]},
"faces": {
"north": {"uv": [0, 12, 16, 16], "texture": "#1"},
"east": {"uv": [0, 12, 16, 16], "texture": "#1"},
"south": {"uv": [0, 12, 16, 16], "texture": "#1"},
"west": {"uv": [0, 12, 16, 16], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#4"},
"down": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "down"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4]
},
{
"name": "block_bottom_centered_window",
"origin": [8, 8, 8],
"color": 0,
"children": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [5]
}
]
}
]
}

View File

@@ -0,0 +1,71 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"4": "tfmg:block/steel_fluid_tank_inner",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "Lid",
"from": [0, 12, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "north"},
"east": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "east"},
"south": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "south"},
"west": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "west"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#4"}
}
},
{
"name": "SideRight",
"from": [0, 0, 0],
"to": [16, 12, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 4, 16, 16], "texture": "#1", "cullface": "north"},
"south": {"uv": [0, 4, 16, 16], "texture": "#1", "cullface": "north"}
}
},
{
"name": "SideRight",
"from": [15, 0, 0],
"to": [16, 12, 16],
"faces": {
"east": {"uv": [0, 4, 16, 16], "texture": "#1", "cullface": "east"},
"west": {"uv": [0, 4, 16, 16], "texture": "#1", "cullface": "east"}
}
},
{
"name": "SideRight",
"from": [0, 0, 15],
"to": [16, 12, 16],
"faces": {
"north": {"uv": [0, 4, 16, 16], "texture": "#1", "cullface": "south"},
"south": {"uv": [0, 4, 16, 16], "texture": "#1", "cullface": "south"}
}
},
{
"name": "SideRight",
"from": [0, 0, 0],
"to": [1, 12, 16],
"faces": {
"east": {"uv": [0, 4, 16, 16], "texture": "#1", "cullface": "west"},
"west": {"uv": [0, 4, 16, 16], "texture": "#1", "cullface": "west"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4]
}
]
}

View File

@@ -0,0 +1,154 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/steel_fluid_tank_window",
"4": "tfmg:block/steel_fluid_tank_inner",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "Lid",
"from": [0, 12, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "north"},
"east": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "east"},
"south": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "south"},
"west": {"uv": [0, 0, 16, 4], "texture": "#1", "cullface": "west"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#4"}
}
},
{
"name": "SideRight",
"from": [0, 0, 0],
"to": [4, 12, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [12, 4, 16, 16], "texture": "#1", "cullface": "north"},
"east": {"uv": [0, 4, 1, 16], "texture": "#1", "cullface": "north"},
"south": {"uv": [0, 4, 4, 16], "texture": "#1", "cullface": "north"}
}
},
{
"name": "SideRight",
"from": [15, 0, 0],
"to": [16, 12, 4],
"faces": {
"east": {"uv": [12, 4, 16, 16], "texture": "#1", "cullface": "east"},
"south": {"uv": [0, 4, 1, 16], "texture": "#1", "cullface": "east"},
"west": {"uv": [0, 4, 4, 16], "texture": "#1", "cullface": "east"}
}
},
{
"name": "SideRight",
"from": [12, 0, 15],
"to": [16, 12, 16],
"faces": {
"north": {"uv": [0, 4, 4, 16], "texture": "#1", "cullface": "south"},
"south": {"uv": [12, 4, 16, 16], "texture": "#1", "cullface": "south"},
"west": {"uv": [0, 4, 1, 16], "texture": "#1", "cullface": "south"}
}
},
{
"name": "SideRight",
"from": [0, 0, 12],
"to": [1, 12, 16],
"faces": {
"north": {"uv": [0, 4, 1, 16], "texture": "#1", "cullface": "west"},
"east": {"uv": [0, 4, 4, 16], "texture": "#1", "cullface": "west"},
"west": {"uv": [12, 4, 16, 16], "texture": "#1", "cullface": "west"}
}
},
{
"name": "Window",
"from": [4, 0, 0.95],
"to": [12, 12, 0.95],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 0, 8, 12], "texture": "#3", "cullface": "north"},
"south": {"uv": [0, 0, 8, 12], "texture": "#3", "cullface": "north"}
}
},
{
"name": "Window",
"from": [15.05, 0, 4],
"to": [15.05, 12, 12],
"faces": {
"east": {"uv": [0, 0, 8, 12], "texture": "#3", "cullface": "east"},
"west": {"uv": [0, 0, 8, 12], "texture": "#3", "cullface": "east"}
}
},
{
"name": "Window",
"from": [4, 0, 15.05],
"to": [12, 12, 15.05],
"faces": {
"north": {"uv": [0, 0, 8, 12], "texture": "#3", "cullface": "south"},
"south": {"uv": [0, 0, 8, 12], "texture": "#3", "cullface": "south"}
}
},
{
"name": "Window",
"from": [0.95, 0, 4],
"to": [0.95, 12, 12],
"faces": {
"east": {"uv": [0, 0, 8, 12], "texture": "#3", "cullface": "west"},
"west": {"uv": [0, 0, 8, 12], "texture": "#3", "cullface": "west"}
}
},
{
"name": "SideLeft",
"from": [12, 0, 0],
"to": [16, 12, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 4, 4, 16], "texture": "#1", "cullface": "north"},
"south": {"uv": [12, 4, 16, 16], "texture": "#1", "cullface": "north"},
"west": {"uv": [15, 4, 16, 16], "texture": "#1", "cullface": "north"}
}
},
{
"name": "SideLeft",
"from": [15, 0, 12],
"to": [16, 12, 16],
"faces": {
"north": {"uv": [15, 4, 16, 16], "texture": "#1", "cullface": "east"},
"east": {"uv": [0, 4, 4, 16], "texture": "#1", "cullface": "east"},
"west": {"uv": [12, 4, 16, 16], "texture": "#1", "cullface": "east"}
}
},
{
"name": "SideLeft",
"from": [0, 0, 15],
"to": [4, 12, 16],
"faces": {
"north": {"uv": [12, 4, 16, 16], "texture": "#1", "cullface": "south"},
"east": {"uv": [15, 4, 16, 16], "texture": "#1", "cullface": "south"},
"south": {"uv": [0, 4, 4, 16], "texture": "#1", "cullface": "south"}
}
},
{
"name": "SideLeft",
"from": [0, 0, 0],
"to": [1, 12, 4],
"faces": {
"east": {"uv": [12, 4, 16, 16], "texture": "#1", "cullface": "west"},
"south": {"uv": [15, 4, 16, 16], "texture": "#1", "cullface": "west"},
"west": {"uv": [0, 4, 4, 16], "texture": "#1", "cullface": "west"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
}
]
}

View File

@@ -0,0 +1,77 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/steel_fluid_tank_window",
"4": "tfmg:block/steel_fluid_tank_inner",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [15, 0, 0],
"to": [16, 12, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"east": {"uv": [4, 4, 16, 16], "texture": "#1"},
"south": {"uv": [4, 4, 5, 16], "texture": "#1"},
"west": {"uv": [0, 4, 12, 16], "texture": "#1"}
}
},
{
"name": "Window",
"from": [0, 0, 0.95],
"to": [4, 12, 0.95],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [0, 0, 4, 12], "texture": "#3"},
"south": {"uv": [4, 0, 8, 12], "texture": "#3"}
}
},
{
"name": "Window",
"from": [15.05, 0, 12],
"to": [15.05, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"east": {"uv": [4, 0, 8, 12], "texture": "#3"},
"west": {"uv": [0, 0, 4, 12], "texture": "#3"}
}
},
{
"name": "SideLeft",
"from": [4, 0, 0],
"to": [16, 12, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [0, 4, 12, 16], "texture": "#1"},
"south": {"uv": [4, 4, 16, 16], "texture": "#1"},
"west": {"uv": [11, 4, 12, 16], "texture": "#1"}
}
},
{
"name": "Bottom",
"from": [0, 12, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [-23, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 16, 4], "texture": "#1"},
"east": {"uv": [0, 0, 16, 4], "texture": "#1"},
"south": {"uv": [0, 0, 16, 4], "texture": "#1"},
"west": {"uv": [0, 0, 16, 4], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#4"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4]
}
]
}

View File

@@ -0,0 +1,77 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/steel_fluid_tank_window",
"4": "tfmg:block/steel_fluid_tank_inner",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [0, 0, 0],
"to": [12, 12, 1],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [4, 4, 16, 16], "texture": "#1"},
"east": {"uv": [4, 4, 5, 16], "texture": "#1"},
"south": {"uv": [0, 4, 12, 16], "texture": "#1"}
}
},
{
"name": "Window",
"from": [0.95, 0, 12],
"to": [0.95, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"east": {"uv": [4, 0, 8, 12], "texture": "#3"},
"west": {"uv": [0, 0, 4, 12], "texture": "#3"}
}
},
{
"name": "Window",
"from": [12, 0, 0.95],
"to": [16, 12, 0.95],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [4, 0, 8, 12], "texture": "#3"},
"south": {"uv": [0, 0, 4, 12], "texture": "#3"}
}
},
{
"name": "SideLeft",
"from": [0, 0, 0],
"to": [1, 12, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"east": {"uv": [4, 4, 16, 16], "texture": "#1"},
"south": {"uv": [11, 4, 12, 16], "texture": "#1"},
"west": {"uv": [0, 4, 12, 16], "texture": "#1"}
}
},
{
"name": "Bottom",
"from": [0, 12, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 39]},
"faces": {
"north": {"uv": [0, 0, 16, 4], "texture": "#1"},
"east": {"uv": [0, 0, 16, 4], "texture": "#1"},
"south": {"uv": [0, 0, 16, 4], "texture": "#1"},
"west": {"uv": [0, 0, 16, 4], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#4"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4]
}
]
}

View File

@@ -0,0 +1,77 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/steel_fluid_tank_window",
"4": "tfmg:block/steel_fluid_tank_inner",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [4, 0, 15],
"to": [16, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [0, 4, 12, 16], "texture": "#1"},
"south": {"uv": [4, 4, 16, 16], "texture": "#1"},
"west": {"uv": [4, 4, 5, 16], "texture": "#1"}
}
},
{
"name": "Window",
"from": [15.05, 0, 0],
"to": [15.05, 12, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"east": {"uv": [0, 0, 4, 12], "texture": "#3"},
"west": {"uv": [4, 0, 8, 12], "texture": "#3"}
}
},
{
"name": "Window",
"from": [0, 0, 15.05],
"to": [4, 12, 15.05],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [0, 0, 4, 12], "texture": "#3"},
"south": {"uv": [4, 0, 8, 12], "texture": "#3"}
}
},
{
"name": "SideLeft",
"from": [15, 0, 4],
"to": [16, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [11, 4, 12, 16], "texture": "#1"},
"east": {"uv": [0, 4, 12, 16], "texture": "#1"},
"west": {"uv": [4, 4, 16, 16], "texture": "#1"}
}
},
{
"name": "Bottom",
"from": [0, 12, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 8, -23]},
"faces": {
"north": {"uv": [0, 0, 16, 4], "texture": "#1"},
"east": {"uv": [0, 0, 16, 4], "texture": "#1"},
"south": {"uv": [0, 0, 16, 4], "texture": "#1"},
"west": {"uv": [0, 0, 16, 4], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#4"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4]
}
]
}

View File

@@ -0,0 +1,77 @@
{
"credit": "Made with Blockbench",
"parent": "block/block",
"textures": {
"0": "tfmg:block/steel_fluid_tank_top",
"1": "tfmg:block/steel_fluid_tank",
"3": "tfmg:block/steel_fluid_tank_window",
"4": "tfmg:block/steel_fluid_tank_inner",
"particle": "tfmg:block/steel_fluid_tank"
},
"elements": [
{
"name": "SideRight",
"from": [0, 0, 4],
"to": [1, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [4, 4, 5, 16], "texture": "#1"},
"east": {"uv": [0, 4, 12, 16], "texture": "#1"},
"west": {"uv": [4, 4, 16, 16], "texture": "#1"}
}
},
{
"name": "Window",
"from": [12, 0, 15.05],
"to": [16, 12, 15.05],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [4, 0, 8, 12], "texture": "#3"},
"south": {"uv": [0, 0, 4, 12], "texture": "#3"}
}
},
{
"name": "Window",
"from": [0.95, 0, 0],
"to": [0.95, 12, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"east": {"uv": [0, 0, 4, 12], "texture": "#3"},
"west": {"uv": [4, 0, 8, 12], "texture": "#3"}
}
},
{
"name": "SideLeft",
"from": [0, 0, 15],
"to": [12, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 8]},
"faces": {
"north": {"uv": [4, 4, 16, 16], "texture": "#1"},
"east": {"uv": [11, 4, 12, 16], "texture": "#1"},
"south": {"uv": [0, 4, 12, 16], "texture": "#1"}
}
},
{
"name": "Bottom",
"from": [0, 12, 0],
"to": [16, 16, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [39, 8, 8]},
"faces": {
"north": {"uv": [0, 0, 16, 4], "texture": "#1"},
"east": {"uv": [0, 0, 16, 4], "texture": "#1"},
"south": {"uv": [0, 0, 16, 4], "texture": "#1"},
"west": {"uv": [0, 0, 16, 4], "texture": "#1"},
"up": {"uv": [0, 0, 16, 16], "texture": "#0", "cullface": "up"},
"down": {"uv": [0, 0, 16, 16], "texture": "#4"}
}
}
],
"groups": [
{
"name": "tank",
"origin": [8, 8, -23],
"color": 0,
"children": [0, 1, 2, 3, 4]
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [3, 3, 3],
"to": [13, 13, 13],
"faces": {
"north": {"uv": [1, 11, 6, 16], "texture": "#0"},
"east": {"uv": [1, 11, 6, 16], "texture": "#0"},
"south": {"uv": [1, 11, 6, 16], "texture": "#0"},
"west": {"uv": [1, 11, 6, 16], "texture": "#0"},
"up": {"uv": [1, 11, 6, 16], "texture": "#0"},
"down": {"uv": [1, 11, 6, 16], "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4, 0, 4],
"to": [12, 4, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]},
"faces": {
"north": {"uv": [0, 6, 4, 8], "texture": "#0"},
"east": {"uv": [0, 6, 4, 8], "texture": "#0"},
"south": {"uv": [4, 6, 0, 8], "texture": "#0"},
"west": {"uv": [4, 6, 0, 8], "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [12, 4, 4],
"to": [16, 12, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]},
"faces": {
"north": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#0"},
"south": {"uv": [0, 0, 4, 2], "rotation": 90, "texture": "#0"},
"up": {"uv": [4, 0, 0, 2], "rotation": 90, "texture": "#0"},
"down": {"uv": [4, 6, 0, 8], "rotation": 270, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4, 4, 0],
"to": [12, 12, 4],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
"faces": {
"east": {"uv": [0, 0, 4, 2], "rotation": 90, "texture": "#0"},
"west": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#0"},
"up": {"uv": [0, 6, 4, 8], "rotation": 180, "texture": "#0"},
"down": {"uv": [0, 0, 4, 2], "rotation": 180, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4, 4, 12],
"to": [12, 12, 16],
"rotation": {"angle": 0, "axis": "y", "origin": [0, 8, 0]},
"faces": {
"east": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#0"},
"west": {"uv": [0, 0, 4, 2], "rotation": 90, "texture": "#0"},
"up": {"uv": [0, 0, 4, 2], "rotation": 180, "texture": "#0"},
"down": {"uv": [0, 6, 4, 8], "rotation": 180, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [4, 12, 4],
"to": [12, 16, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]},
"faces": {
"north": {"uv": [0, 0, 4, 2], "texture": "#0"},
"east": {"uv": [0, 0, 4, 2], "texture": "#0"},
"south": {"uv": [4, 0, 0, 2], "texture": "#0"},
"west": {"uv": [4, 0, 0, 2], "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,21 @@
{
"credit": "Made with Blockbench",
"texture_size": [32, 32],
"textures": {
"0": "tfmg:block/steel_pipes",
"particle": "tfmg:block/steel_pipes"
},
"elements": [
{
"from": [0, 4, 4],
"to": [4, 12, 12],
"rotation": {"angle": 0, "axis": "y", "origin": [16, 0, -16]},
"faces": {
"north": {"uv": [0, 0, 4, 2], "rotation": 90, "texture": "#0"},
"south": {"uv": [0, 6, 4, 8], "rotation": 90, "texture": "#0"},
"up": {"uv": [4, 6, 0, 8], "rotation": 90, "texture": "#0"},
"down": {"uv": [4, 0, 0, 2], "rotation": 270, "texture": "#0"}
}
}
]
}

View File

@@ -0,0 +1,17 @@
{
"credit": "Made with Blockbench",
"textures": {
"0": "tfmg:block/steel_pipes_connected",
"particle": "tfmg:block/steel_pipes_connected"
},
"elements": [
{
"from": [4, 4, 4],
"to": [12, 12, 12],
"faces": {
"east": {"uv": [16, 8, 12, 12], "rotation": 180, "texture": "#0"},
"west": {"uv": [16, 8, 12, 12], "rotation": 180, "texture": "#0"}
}
}
]
}

Some files were not shown because too many files have changed in this diff Show More