mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-11-14 06:24:29 +01:00
(Sp)out of order
- Added behavioural registry for Spout/Block interaction - Fixed and Refactored TiCon Casting via Spout - Fixed fluid pipes getting stuck trying to waterlog non-solid blocks with fluid handling capabilities - Fixed modlist lookup for non-english locales
This commit is contained in:
parent
f0736bdc41
commit
925c98792f
@ -155,8 +155,8 @@ dependencies {
|
|||||||
// i'll leave this here commented for easier testing
|
// i'll leave this here commented for easier testing
|
||||||
//runtimeOnly fg.deobf("vazkii.arl:AutoRegLib:1.4-35.69")
|
//runtimeOnly fg.deobf("vazkii.arl:AutoRegLib:1.4-35.69")
|
||||||
//runtimeOnly fg.deobf("vazkii.quark:Quark:r2.0-212.984")
|
//runtimeOnly fg.deobf("vazkii.quark:Quark:r2.0-212.984")
|
||||||
//runtimeOnly fg.deobf("slimeknights.mantle:Mantle:1.16.5-1.6.103")
|
//runtimeOnly fg.deobf("slimeknights.mantle:Mantle:1.16.5-1.6.115")
|
||||||
//runtimeOnly fg.deobf("slimeknights.tconstruct:TConstruct:1.16.5-3.0.3.168")
|
//runtimeOnly fg.deobf("slimeknights.tconstruct:TConstruct:1.16.5-3.1.1.252")
|
||||||
|
|
||||||
annotationProcessor 'org.spongepowered:mixin:0.8.2:processor'
|
annotationProcessor 'org.spongepowered:mixin:0.8.2:processor'
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ org.gradle.jvmargs = -Xmx3G
|
|||||||
org.gradle.daemon = false
|
org.gradle.daemon = false
|
||||||
|
|
||||||
# mod version info
|
# mod version info
|
||||||
mod_version = 0.3.2d
|
mod_version = 0.3.2e
|
||||||
minecraft_version = 1.16.5
|
minecraft_version = 1.16.5
|
||||||
forge_version = 36.2.0
|
forge_version = 36.2.0
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ import com.google.gson.GsonBuilder;
|
|||||||
import com.simibubi.create.content.CreateItemGroup;
|
import com.simibubi.create.content.CreateItemGroup;
|
||||||
import com.simibubi.create.content.contraptions.TorquePropagator;
|
import com.simibubi.create.content.contraptions.TorquePropagator;
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController;
|
import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController;
|
||||||
|
import com.simibubi.create.content.contraptions.fluids.actors.BlockSpoutingBehaviour;
|
||||||
import com.simibubi.create.content.curiosities.weapons.PotatoCannonProjectileTypes;
|
import com.simibubi.create.content.curiosities.weapons.PotatoCannonProjectileTypes;
|
||||||
import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler;
|
import com.simibubi.create.content.logistics.RedstoneLinkNetworkHandler;
|
||||||
import com.simibubi.create.content.palettes.AllPaletteBlocks;
|
import com.simibubi.create.content.palettes.AllPaletteBlocks;
|
||||||
@ -58,7 +59,7 @@ public class Create {
|
|||||||
|
|
||||||
public static final String ID = "create";
|
public static final String ID = "create";
|
||||||
public static final String NAME = "Create";
|
public static final String NAME = "Create";
|
||||||
public static final String VERSION = "0.3.2d";
|
public static final String VERSION = "0.3.2e";
|
||||||
|
|
||||||
public static final Logger LOGGER = LogManager.getLogger();
|
public static final Logger LOGGER = LogManager.getLogger();
|
||||||
|
|
||||||
@ -92,6 +93,7 @@ public class Create {
|
|||||||
AllWorldFeatures.register();
|
AllWorldFeatures.register();
|
||||||
AllEnchantments.register();
|
AllEnchantments.register();
|
||||||
AllConfigs.register(ModLoadingContext.get());
|
AllConfigs.register(ModLoadingContext.get());
|
||||||
|
BlockSpoutingBehaviour.register();
|
||||||
|
|
||||||
ForgeMod.enableMilkFluid();
|
ForgeMod.enableMilkFluid();
|
||||||
|
|
||||||
|
@ -3,13 +3,16 @@ package com.simibubi.create.compat;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import com.simibubi.create.foundation.utility.Lang;
|
||||||
|
|
||||||
import net.minecraftforge.fml.ModList;
|
import net.minecraftforge.fml.ModList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For compatibility with and without another mod present, we have to define load conditions of the specific code
|
* For compatibility with and without another mod present, we have to define load conditions of the specific code
|
||||||
*/
|
*/
|
||||||
public enum Mods {
|
public enum Mods {
|
||||||
DYNAMICTREES;
|
DYNAMICTREES,
|
||||||
|
TCONSTRUCT;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return a boolean of whether the mod is loaded or not based on mod id
|
* @return a boolean of whether the mod is loaded or not based on mod id
|
||||||
@ -22,7 +25,7 @@ public enum Mods {
|
|||||||
* @return the mod id
|
* @return the mod id
|
||||||
*/
|
*/
|
||||||
public String asId() {
|
public String asId() {
|
||||||
return name().toLowerCase();
|
return Lang.asId(name());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -0,0 +1,72 @@
|
|||||||
|
package com.simibubi.create.compat.tconstruct;
|
||||||
|
|
||||||
|
import com.simibubi.create.compat.Mods;
|
||||||
|
import com.simibubi.create.content.contraptions.fluids.actors.BlockSpoutingBehaviour;
|
||||||
|
import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity;
|
||||||
|
import com.simibubi.create.foundation.config.AllConfigs;
|
||||||
|
import com.simibubi.create.foundation.fluid.FluidHelper;
|
||||||
|
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.util.Direction;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
|
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandler;
|
||||||
|
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;
|
||||||
|
|
||||||
|
public class SpoutCasting extends BlockSpoutingBehaviour {
|
||||||
|
|
||||||
|
static Boolean TICON_PRESENT = null;
|
||||||
|
|
||||||
|
ResourceLocation TABLE = new ResourceLocation("tconstruct", "table");
|
||||||
|
ResourceLocation BASIN = new ResourceLocation("tconstruct", "basin");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int fillBlock(World level, BlockPos pos, SpoutTileEntity spout, FluidStack availableFluid,
|
||||||
|
boolean simulate) {
|
||||||
|
if (!enabled())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
TileEntity te = level.getBlockEntity(pos);
|
||||||
|
if (te == null)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
IFluidHandler handler = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, Direction.UP)
|
||||||
|
.orElse(null);
|
||||||
|
if (handler == null)
|
||||||
|
return 0;
|
||||||
|
if (handler.getTanks() != 1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ResourceLocation registryName = te.getType()
|
||||||
|
.getRegistryName();
|
||||||
|
if (!registryName.equals(TABLE) && !registryName.equals(BASIN))
|
||||||
|
return 0;
|
||||||
|
if (!handler.isFluidValid(0, availableFluid))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
FluidStack containedFluid = handler.getFluidInTank(0);
|
||||||
|
if (!(containedFluid.isEmpty() || containedFluid.isFluidEqual(availableFluid)))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Do not fill if it would only partially fill the table (unless > 1000mb)
|
||||||
|
int amount = availableFluid.getAmount();
|
||||||
|
if (amount < 1000
|
||||||
|
&& handler.fill(FluidHelper.copyStackWithAmount(availableFluid, amount + 1), FluidAction.SIMULATE) > amount)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Return amount filled into the table/basin
|
||||||
|
return handler.fill(availableFluid, simulate ? FluidAction.SIMULATE : FluidAction.EXECUTE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean enabled() {
|
||||||
|
if (TICON_PRESENT == null)
|
||||||
|
TICON_PRESENT = Mods.TCONSTRUCT.isLoaded();
|
||||||
|
if (!TICON_PRESENT)
|
||||||
|
return false;
|
||||||
|
return AllConfigs.SERVER.recipes.allowCastingBySpout.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -161,6 +161,8 @@ public class FluidPropagator {
|
|||||||
return true;
|
return true;
|
||||||
if (BlockHelper.hasBlockSolidSide(connectedState, reader, connectedPos, side.getOpposite()))
|
if (BlockHelper.hasBlockSolidSide(connectedState, reader, connectedPos, side.getOpposite()))
|
||||||
return false;
|
return false;
|
||||||
|
if (hasFluidCapability(reader, connectedPos, side.getOpposite()))
|
||||||
|
return false;
|
||||||
if (!(connectedState.getMaterial()
|
if (!(connectedState.getMaterial()
|
||||||
.isReplaceable() && connectedState.getDestroySpeed(reader, connectedPos) != -1)
|
.isReplaceable() && connectedState.getDestroySpeed(reader, connectedPos) != -1)
|
||||||
&& !connectedState.hasProperty(BlockStateProperties.WATERLOGGED))
|
&& !connectedState.hasProperty(BlockStateProperties.WATERLOGGED))
|
||||||
|
@ -0,0 +1,51 @@
|
|||||||
|
package com.simibubi.create.content.contraptions.fluids.actors;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
import com.simibubi.create.Create;
|
||||||
|
import com.simibubi.create.compat.tconstruct.SpoutCasting;
|
||||||
|
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
|
|
||||||
|
public abstract class BlockSpoutingBehaviour {
|
||||||
|
|
||||||
|
private static final HashMap<ResourceLocation, BlockSpoutingBehaviour> BLOCK_SPOUTING_BEHAVIOURS = new HashMap<>();
|
||||||
|
|
||||||
|
public static void addCustomSpoutInteraction(ResourceLocation resourceLocation,
|
||||||
|
BlockSpoutingBehaviour movementBehaviour) {
|
||||||
|
BLOCK_SPOUTING_BEHAVIOURS.put(resourceLocation, movementBehaviour);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void forEach(Consumer<? super BlockSpoutingBehaviour> accept) {
|
||||||
|
BLOCK_SPOUTING_BEHAVIOURS.values()
|
||||||
|
.forEach(accept);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* While idle, Spouts will call this every tick with simulate == true <br>
|
||||||
|
* When fillBlock returns > 0, the Spout will start its animation cycle <br>
|
||||||
|
* <br>
|
||||||
|
* During this animation cycle, fillBlock is called once again with simulate == false but only on the relevant SpoutingBehaviour <br>
|
||||||
|
* When fillBlock returns > 0 once again, the Spout will drain its content by the returned amount of units <br>
|
||||||
|
* Perform any other side-effects in this method <br>
|
||||||
|
* This method is called server-side only (except in ponder) <br>
|
||||||
|
*
|
||||||
|
* @param world
|
||||||
|
* @param pos of the affected block
|
||||||
|
* @param spout
|
||||||
|
* @param availableFluid do not modify, return the amount to be subtracted instead
|
||||||
|
* @param simulate whether the spout is testing or actually performing this behaviour
|
||||||
|
* @return amount filled into the block, 0 to idle/cancel
|
||||||
|
*/
|
||||||
|
public abstract int fillBlock(World world, BlockPos pos, SpoutTileEntity spout, FluidStack availableFluid,
|
||||||
|
boolean simulate);
|
||||||
|
|
||||||
|
public static void register() {
|
||||||
|
addCustomSpoutInteraction(Create.asResource("ticon_casting"), new SpoutCasting());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -13,7 +13,6 @@ import net.minecraft.item.MilkBucketItem;
|
|||||||
import net.minecraft.potion.PotionUtils;
|
import net.minecraft.potion.PotionUtils;
|
||||||
import net.minecraft.potion.Potions;
|
import net.minecraft.potion.Potions;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.common.ForgeMod;
|
|
||||||
import net.minecraftforge.common.util.LazyOptional;
|
import net.minecraftforge.common.util.LazyOptional;
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||||
|
@ -39,6 +39,7 @@ public class SpoutRenderer extends SafeTileEntityRenderer<SpoutTileEntity> {
|
|||||||
.getValue(partialTicks);
|
.getValue(partialTicks);
|
||||||
|
|
||||||
if (!fluidStack.isEmpty() && level != 0) {
|
if (!fluidStack.isEmpty() && level != 0) {
|
||||||
|
level = Math.max(level, 0.175f);
|
||||||
float min = 2.5f / 16f;
|
float min = 2.5f / 16f;
|
||||||
float max = min + (11 / 16f);
|
float max = min + (11 / 16f);
|
||||||
float yOffset = (11 / 16f) * level;
|
float yOffset = (11 / 16f) * level;
|
||||||
@ -49,8 +50,8 @@ public class SpoutRenderer extends SafeTileEntityRenderer<SpoutTileEntity> {
|
|||||||
ms.popPose();
|
ms.popPose();
|
||||||
}
|
}
|
||||||
|
|
||||||
int processingTicks = te.getCorrectedProcessingTicks();
|
int processingTicks = te.processingTicks;
|
||||||
float processingPT = te.getCorrectedProcessingTicks() - partialTicks;
|
float processingPT = processingTicks - partialTicks;
|
||||||
float processingProgress = 1 - (processingPT - 5) / 10;
|
float processingProgress = 1 - (processingPT - 5) / 10;
|
||||||
processingProgress = MathHelper.clamp(processingProgress, 0, 1);
|
processingProgress = MathHelper.clamp(processingProgress, 0, 1);
|
||||||
float radius = 0;
|
float radius = 0;
|
||||||
|
@ -6,12 +6,11 @@ import static com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProce
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import com.simibubi.create.content.contraptions.fluids.FluidFX;
|
import com.simibubi.create.content.contraptions.fluids.FluidFX;
|
||||||
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
|
import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation;
|
||||||
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
|
import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack;
|
||||||
import com.simibubi.create.foundation.advancement.AllTriggers;
|
import com.simibubi.create.foundation.advancement.AllTriggers;
|
||||||
|
import com.simibubi.create.foundation.fluid.FluidHelper;
|
||||||
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
|
import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
|
||||||
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
|
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
|
||||||
import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour;
|
import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBehaviour;
|
||||||
@ -27,11 +26,9 @@ import net.minecraft.item.PotionItem;
|
|||||||
import net.minecraft.nbt.CompoundNBT;
|
import net.minecraft.nbt.CompoundNBT;
|
||||||
import net.minecraft.particles.IParticleData;
|
import net.minecraft.particles.IParticleData;
|
||||||
import net.minecraft.potion.PotionUtils;
|
import net.minecraft.potion.PotionUtils;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
|
||||||
import net.minecraft.tileentity.TileEntityType;
|
import net.minecraft.tileentity.TileEntityType;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.util.math.vector.Vector3d;
|
import net.minecraft.util.math.vector.Vector3d;
|
||||||
import net.minecraft.util.text.ITextComponent;
|
import net.minecraft.util.text.ITextComponent;
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
import net.minecraftforge.api.distmarker.Dist;
|
||||||
@ -40,28 +37,15 @@ import net.minecraftforge.common.capabilities.Capability;
|
|||||||
import net.minecraftforge.common.util.LazyOptional;
|
import net.minecraftforge.common.util.LazyOptional;
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||||
import net.minecraftforge.fluids.capability.IFluidHandler;
|
|
||||||
import net.minecraftforge.fml.ModList;
|
|
||||||
|
|
||||||
public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInformation {
|
public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInformation {
|
||||||
private static final boolean IS_TIC_LOADED = ModList.get().isLoaded("tconstruct");
|
|
||||||
private static final Class<?> CASTING_FLUID_HANDLER_CLASS;
|
|
||||||
static {
|
|
||||||
Class<?> testClass;
|
|
||||||
try {
|
|
||||||
testClass = Class.forName("slimeknights.tconstruct.library.smeltery.CastingFluidHandler");
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
testClass = null;
|
|
||||||
}
|
|
||||||
CASTING_FLUID_HANDLER_CLASS = testClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static final int FILLING_TIME = 20;
|
public static final int FILLING_TIME = 20;
|
||||||
|
|
||||||
protected BeltProcessingBehaviour beltProcessing;
|
protected BeltProcessingBehaviour beltProcessing;
|
||||||
protected int processingTicks;
|
|
||||||
protected boolean sendSplash;
|
public int processingTicks;
|
||||||
private boolean shouldAnimate = true;
|
public boolean sendSplash;
|
||||||
|
public BlockSpoutingBehaviour customProcess;
|
||||||
|
|
||||||
SmartFluidTankBehaviour tank;
|
SmartFluidTankBehaviour tank;
|
||||||
|
|
||||||
@ -104,7 +88,6 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor
|
|||||||
|
|
||||||
protected ProcessingResult whenItemHeld(TransportedItemStack transported,
|
protected ProcessingResult whenItemHeld(TransportedItemStack transported,
|
||||||
TransportedItemStackHandlerBehaviour handler) {
|
TransportedItemStackHandlerBehaviour handler) {
|
||||||
shouldAnimate = true;
|
|
||||||
if (processingTicks != -1 && processingTicks != 5)
|
if (processingTicks != -1 && processingTicks != 5)
|
||||||
return HOLD;
|
return HOLD;
|
||||||
if (!FillingBySpout.canItemBeFilled(level, transported.stack))
|
if (!FillingBySpout.canItemBeFilled(level, transported.stack))
|
||||||
@ -149,59 +132,6 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor
|
|||||||
return HOLD;
|
return HOLD;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processTicCastBlock() {
|
|
||||||
if (!IS_TIC_LOADED || CASTING_FLUID_HANDLER_CLASS == null)
|
|
||||||
return;
|
|
||||||
if (level == null)
|
|
||||||
return;
|
|
||||||
IFluidHandler localTank = this.tank.getCapability()
|
|
||||||
.orElse(null);
|
|
||||||
if (localTank == null)
|
|
||||||
return;
|
|
||||||
FluidStack fluid = getCurrentFluidInTank();
|
|
||||||
if (fluid.getAmount() == 0)
|
|
||||||
return;
|
|
||||||
TileEntity te = level.getBlockEntity(worldPosition.below(2));
|
|
||||||
if (te == null)
|
|
||||||
return;
|
|
||||||
IFluidHandler handler = getFluidHandler(worldPosition.below(2), Direction.UP);
|
|
||||||
if (!CASTING_FLUID_HANDLER_CLASS.isInstance(handler))
|
|
||||||
return;
|
|
||||||
if (handler.getTanks() != 1)
|
|
||||||
return;
|
|
||||||
if (!handler.isFluidValid(0, this.getCurrentFluidInTank()))
|
|
||||||
return;
|
|
||||||
FluidStack containedFluid = handler.getFluidInTank(0);
|
|
||||||
if (!(containedFluid.isEmpty() || containedFluid.isFluidEqual(fluid)))
|
|
||||||
return;
|
|
||||||
if (processingTicks == -1) {
|
|
||||||
processingTicks = FILLING_TIME;
|
|
||||||
notifyUpdate();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
FluidStack drained = localTank.drain(144, IFluidHandler.FluidAction.SIMULATE);
|
|
||||||
if (!drained.isEmpty()) {
|
|
||||||
int filled = handler.fill(drained, IFluidHandler.FluidAction.SIMULATE);
|
|
||||||
shouldAnimate = filled > 0;
|
|
||||||
sendSplash = shouldAnimate;
|
|
||||||
if (processingTicks == 5) {
|
|
||||||
if (filled > 0) {
|
|
||||||
drained = localTank.drain(filled, IFluidHandler.FluidAction.EXECUTE);
|
|
||||||
if (!drained.isEmpty()) {
|
|
||||||
FluidStack fillStack = drained.copy();
|
|
||||||
fillStack.setAmount(Math.min(drained.getAmount(), 6));
|
|
||||||
drained.shrink(filled);
|
|
||||||
fillStack.setAmount(filled);
|
|
||||||
handler.fill(fillStack, IFluidHandler.FluidAction.EXECUTE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tank.getPrimaryHandler()
|
|
||||||
.setFluid(fluid);
|
|
||||||
this.notifyUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private FluidStack getCurrentFluidInTank() {
|
private FluidStack getCurrentFluidInTank() {
|
||||||
return tank.getPrimaryHandler()
|
return tank.getPrimaryHandler()
|
||||||
.getFluid();
|
.getFluid();
|
||||||
@ -239,10 +169,36 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor
|
|||||||
|
|
||||||
public void tick() {
|
public void tick() {
|
||||||
super.tick();
|
super.tick();
|
||||||
processTicCastBlock();
|
|
||||||
if (processingTicks >= 0)
|
FluidStack currentFluidInTank = getCurrentFluidInTank();
|
||||||
|
if (processingTicks == -1 && (isVirtual() || !level.isClientSide()) && !currentFluidInTank.isEmpty()) {
|
||||||
|
BlockSpoutingBehaviour.forEach(behaviour -> {
|
||||||
|
if (customProcess != null)
|
||||||
|
return;
|
||||||
|
if (behaviour.fillBlock(level, worldPosition.below(2), this, currentFluidInTank, true) > 0) {
|
||||||
|
processingTicks = FILLING_TIME;
|
||||||
|
customProcess = behaviour;
|
||||||
|
notifyUpdate();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (processingTicks >= 0) {
|
||||||
processingTicks--;
|
processingTicks--;
|
||||||
if (processingTicks >= 8 && level.isClientSide && shouldAnimate)
|
if (processingTicks == 5 && customProcess != null) {
|
||||||
|
int fillBlock = customProcess.fillBlock(level, worldPosition.below(2), this, currentFluidInTank, false);
|
||||||
|
customProcess = null;
|
||||||
|
if (fillBlock > 0) {
|
||||||
|
tank.getPrimaryHandler()
|
||||||
|
.setFluid(FluidHelper.copyStackWithAmount(currentFluidInTank,
|
||||||
|
currentFluidInTank.getAmount() - fillBlock));
|
||||||
|
sendSplash = true;
|
||||||
|
notifyUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (processingTicks >= 8 && level.isClientSide)
|
||||||
spawnProcessingParticles(tank.getPrimaryTank()
|
spawnProcessingParticles(tank.getPrimaryTank()
|
||||||
.getRenderedFluid());
|
.getRenderedFluid());
|
||||||
}
|
}
|
||||||
@ -271,25 +227,9 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private IFluidHandler getFluidHandler(BlockPos pos, Direction direction) {
|
|
||||||
if (this.level == null) {
|
|
||||||
return null;
|
|
||||||
} else {
|
|
||||||
TileEntity te = this.level.getBlockEntity(pos);
|
|
||||||
return te != null ? te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, direction)
|
|
||||||
.orElse(null) : null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getCorrectedProcessingTicks() {
|
|
||||||
if (shouldAnimate)
|
|
||||||
return processingTicks;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean addToGoggleTooltip(List<ITextComponent> tooltip, boolean isPlayerSneaking) {
|
public boolean addToGoggleTooltip(List<ITextComponent> tooltip, boolean isPlayerSneaking) {
|
||||||
return containedFluidTooltip(tooltip, isPlayerSneaking, getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY));
|
return containedFluidTooltip(tooltip, isPlayerSneaking,
|
||||||
|
getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ public class CRecipes extends ConfigBase {
|
|||||||
b(false, "allowBiggerFireworksInCrafter", Comments.allowBiggerFireworksInCrafter);
|
b(false, "allowBiggerFireworksInCrafter", Comments.allowBiggerFireworksInCrafter);
|
||||||
public ConfigBool allowStonecuttingOnSaw = b(true, "allowStonecuttingOnSaw", Comments.allowStonecuttingOnSaw);
|
public ConfigBool allowStonecuttingOnSaw = b(true, "allowStonecuttingOnSaw", Comments.allowStonecuttingOnSaw);
|
||||||
public ConfigBool allowWoodcuttingOnSaw = b(true, "allowWoodcuttingOnSaw", Comments.allowWoodcuttingOnSaw);
|
public ConfigBool allowWoodcuttingOnSaw = b(true, "allowWoodcuttingOnSaw", Comments.allowWoodcuttingOnSaw);
|
||||||
|
public ConfigBool allowCastingBySpout = b(true, "allowCastingBySpout", Comments.allowCastingBySpout);
|
||||||
public ConfigInt lightSourceCountForRefinedRadiance =
|
public ConfigInt lightSourceCountForRefinedRadiance =
|
||||||
i(10, 1, "lightSourceCountForRefinedRadiance", Comments.refinedRadiance);
|
i(10, 1, "lightSourceCountForRefinedRadiance", Comments.refinedRadiance);
|
||||||
public ConfigBool enableRefinedRadianceRecipe =
|
public ConfigBool enableRefinedRadianceRecipe =
|
||||||
@ -24,20 +25,22 @@ public class CRecipes extends ConfigBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static class Comments {
|
private static class Comments {
|
||||||
static String bulkPressing = "When true, allows the Mechanical Press to process entire stacks at a time.";
|
static String bulkPressing = "Allow the Mechanical Press to process entire stacks at a time.";
|
||||||
static String bulkCutting = "When true, allows the Mechanical Saw to process entire stacks at a time.";
|
static String bulkCutting = "Allow the Mechanical Saw to process entire stacks at a time.";
|
||||||
static String allowShapelessInMixer =
|
static String allowShapelessInMixer =
|
||||||
"When true, allows any shapeless crafting recipes to be processed by a Mechanical Mixer + Basin.";
|
"Allow allows any shapeless crafting recipes to be processed by a Mechanical Mixer + Basin.";
|
||||||
static String allowShapedSquareInPress =
|
static String allowShapedSquareInPress =
|
||||||
"When true, allows any single-ingredient 2x2 or 3x3 crafting recipes to be processed by a Mechanical Press + Basin.";
|
"Allow any single-ingredient 2x2 or 3x3 crafting recipes to be processed by a Mechanical Press + Basin.";
|
||||||
static String allowRegularCraftingInCrafter =
|
static String allowRegularCraftingInCrafter =
|
||||||
"When true, allows any standard crafting recipes to be processed by Mechanical Crafters.";
|
"Allow any standard crafting recipes to be processed by Mechanical Crafters.";
|
||||||
static String allowBiggerFireworksInCrafter =
|
static String allowBiggerFireworksInCrafter =
|
||||||
"When true, allows Firework Rockets with more than 9 ingredients to be crafted using Mechanical Crafters.";
|
"Allow Firework Rockets with more than 9 ingredients to be crafted using Mechanical Crafters.";
|
||||||
static String allowStonecuttingOnSaw =
|
static String allowStonecuttingOnSaw =
|
||||||
"When true, allows any stonecutting recipes to be processed by a Mechanical Saw.";
|
"Allow any stonecutting recipes to be processed by a Mechanical Saw.";
|
||||||
static String allowWoodcuttingOnSaw =
|
static String allowWoodcuttingOnSaw =
|
||||||
"When true, allows any Druidcraft woodcutter recipes to be processed by a Mechanical Saw.";
|
"Allow any Druidcraft woodcutter recipes to be processed by a Mechanical Saw.";
|
||||||
|
static String allowCastingBySpout =
|
||||||
|
"Allow Spouts to interact with Casting Tables and Basins from Tinkers' Construct.";
|
||||||
static String refinedRadiance =
|
static String refinedRadiance =
|
||||||
"The amount of Light sources destroyed before Chromatic Compound turns into Refined Radiance.";
|
"The amount of Light sources destroyed before Chromatic Compound turns into Refined Radiance.";
|
||||||
static String refinedRadianceRecipe = "Allow the standard in-world Refined Radiance recipes.";
|
static String refinedRadianceRecipe = "Allow the standard in-world Refined Radiance recipes.";
|
||||||
|
@ -54,6 +54,8 @@ public class FluidHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static FluidStack copyStackWithAmount(FluidStack fs, int amount) {
|
public static FluidStack copyStackWithAmount(FluidStack fs, int amount) {
|
||||||
|
if (amount <= 0)
|
||||||
|
return FluidStack.EMPTY;
|
||||||
if (fs.isEmpty())
|
if (fs.isEmpty())
|
||||||
return FluidStack.EMPTY;
|
return FluidStack.EMPTY;
|
||||||
FluidStack copy = fs.copy();
|
FluidStack copy = fs.copy();
|
||||||
|
@ -45,9 +45,8 @@ public class TreeCutter {
|
|||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
public static Optional<AbstractBlockBreakQueue> findDynamicTree(Block startBlock, BlockPos pos) {
|
public static Optional<AbstractBlockBreakQueue> findDynamicTree(Block startBlock, BlockPos pos) {
|
||||||
if (canDynamicTreeCutFrom(startBlock)) {
|
if (canDynamicTreeCutFrom(startBlock))
|
||||||
return Mods.DYNAMICTREES.runIfInstalled(() -> () -> new DynamicTree(pos));
|
return Mods.DYNAMICTREES.runIfInstalled(() -> () -> new DynamicTree(pos));
|
||||||
}
|
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ license="MIT"
|
|||||||
|
|
||||||
[[mods]]
|
[[mods]]
|
||||||
modId="create"
|
modId="create"
|
||||||
version="v0.3.2d"
|
version="v0.3.2e"
|
||||||
displayName="Create"
|
displayName="Create"
|
||||||
#updateJSONURL=""
|
#updateJSONURL=""
|
||||||
displayURL="https://www.curseforge.com/minecraft/mc-mods/create"
|
displayURL="https://www.curseforge.com/minecraft/mc-mods/create"
|
||||||
|
Loading…
Reference in New Issue
Block a user