Skip to content

Commit

Permalink
Fix pump saving/loading, remove unnecessary drain/spout recipe field,…
Browse files Browse the repository at this point in the history
… walls with pipe, frozen/negative temperature support for mixer (no source yet)
  • Loading branch information
Patbox committed Aug 12, 2024
1 parent 16936c0 commit 9bc4bb9
Show file tree
Hide file tree
Showing 56 changed files with 771 additions and 302 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ dependencies {
modImplementation include('eu.pb4:sidebar-api:0.5.0+1.21')
modImplementation include('eu.pb4:sgui:1.6.0+1.21')
modImplementation include('eu.pb4:factorytools:0.3.2+1.21')
modImplementation include('com.kneelawk.graphlib:graphlib-core-fabric:2.0.2+1.21')
modImplementation include('com.kneelawk.graphlib:graphlib-core-fabric:2.0.3+1.21')

// Temp hack to allow development
//modImplementation include('com.kneelawk:graphlib:1.99.99+1.20.local')
Expand Down
1 change: 1 addition & 0 deletions changelog-next.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@
- Mechanical Mixers can now store fluids and use them as part of recipes.
- You can now put Cables within wall blocks.
- Tweaked Mechanical Press textures.
- Mobs killed by the Mechanical Miner can now drop XP.
- New Grinder recipe:
- Nether Wart Block -> 1-5 Nether Wards
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ org.gradle.parallel=true
loader_version=0.15.11

# Mod Properties
mod_version = 0.4.0-pre.5
mod_version = 0.4.0-pre.6
maven_group = eu.pb4
archives_base_name = polyfactory

Expand Down
6 changes: 4 additions & 2 deletions src/main/java/eu/pb4/polyfactory/block/BlockHeat.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,22 @@
public final class BlockHeat {
public static final float LAVA = 0.85f;
public static final float CAMPFIRE = 0.45f;
public static final float MAGMA = 0.45f;
public static final float FIRE = 0.45f;
public static final float TORCH = 0.15f;
public static final float NEUTRAL = 0f;
public static float get(World world, BlockPos pos) {
return get(world.getBlockState(pos));
}

public static float getReceived(World world, BlockPos pos) {
return get(world, pos.down());
}
public static float get(BlockState state) {
if (state.isIn(BlockTags.CAMPFIRES) && state.get(CampfireBlock.LIT)) {
return CAMPFIRE;
} else if (state.isIn(BlockTags.FIRE)) {
} else if (state.isOf(Blocks.MAGMA_BLOCK)) {
return MAGMA;
} else if (state.isIn(BlockTags.FIRE)) {
return FIRE;
} else if (state.isOf(Blocks.LAVA)) {
return LAVA;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,10 @@ public class FactoryBlockEntities {
public static final BlockEntityType<ColorableBlockEntity> COLOR_CONTAINER = register("color_container", BlockEntityType.Builder
.create(ColorableBlockEntity::new, FactoryBlocks.LAMP, FactoryBlocks.INVERTED_LAMP, FactoryBlocks.CAGED_LAMP, FactoryBlocks.INVERTED_CAGED_LAMP));

public static final BlockEntityType<PipeBlockEntity> PIPE = register("pipe", BlockEntityType.Builder.create(PipeBlockEntity::new, FactoryBlocks.PIPE));
public static final BlockEntityType<PipeBlockEntity> PIPE = register("pipe", BlockEntityType.Builder.create(PipeBlockEntity::new, Util.make(new ArrayList<Block>(), (a) -> {
a.add(FactoryBlocks.PIPE);
a.addAll(FactoryBlocks.WALL_WITH_PIPE.values());
}).toArray(Block[]::new)));
public static final BlockEntityType<PumpBlockEntity> PUMP = register("pump", BlockEntityType.Builder.create(PumpBlockEntity::new, FactoryBlocks.PUMP));
public static final BlockEntityType<DrainBlockEntity> DRAIN = register("drain", BlockEntityType.Builder.create(DrainBlockEntity::new, FactoryBlocks.DRAIN));
public static final BlockEntityType<MDrainBlockEntity> MECHANICAL_DRAIN = register("mechanical_drain", BlockEntityType.Builder.create(MDrainBlockEntity::new, FactoryBlocks.MECHANICAL_DRAIN));
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/eu/pb4/polyfactory/block/FactoryBlocks.java
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,8 @@ public class FactoryBlocks {
public static final TinyPotatoSpringBlock TINY_POTATO_SPRING = register("tiny_potato_spring", new TinyPotatoSpringBlock(AbstractBlock.Settings.create().strength(1).nonOpaque()));
public static final RotationalDebugBlock ROTATION_DEBUG = register("rot_debug", new RotationalDebugBlock(AbstractBlock.Settings.create().strength(-1, -1)));
public static final PipeBlock PIPE = register("pipe", new PipeBlock(AbstractBlock.Settings.copy(Blocks.COPPER_BLOCK).nonOpaque()));
public static final Map<Block, PipeInWallBlock> WALL_WITH_PIPE = PipeInWallBlock.MAP;

public static final PumpBlock PUMP = register("pump", new PumpBlock(AbstractBlock.Settings.copy(Blocks.COPPER_BLOCK).nonOpaque()));
public static final DrainBlock DRAIN = register("drain", new DrainBlock(AbstractBlock.Settings.copy(Blocks.COPPER_BLOCK).nonOpaque()));
public static final MDrainBlock MECHANICAL_DRAIN = register("mechanical_drain", new MDrainBlock(AbstractBlock.Settings.copy(Blocks.COPPER_BLOCK).nonOpaque()));
Expand All @@ -123,6 +125,7 @@ public static void register() {
if (block instanceof WallBlock wallBlock) {
var id = Registries.BLOCK.getId(wallBlock);
register("wall_with_cable/" + id.getNamespace() + "/" + id.getPath(), new WallWithCableBlock(wallBlock));
register("wall_with_pipe/" + id.getNamespace() + "/" + id.getPath(), new PipeInWallBlock(wallBlock));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ public BlockEntity createBlockEntity(BlockPos pos, BlockState state) {

@Override
public MutableText getName() {
return Text.translatable(this.getTranslationKey(), this.backing.getName());
return Text.translatable("block.polyfactory.wall_with_cable", this.backing.getName());
}

@Override
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/eu/pb4/polyfactory/block/fluids/DrainBlock.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import eu.pb4.polyfactory.models.fluid.TopFluidViewModel;
import eu.pb4.polyfactory.recipe.FactoryRecipeTypes;
import eu.pb4.polyfactory.recipe.input.DrainInput;
import eu.pb4.polyfactory.util.FactoryUtil;
import eu.pb4.polymer.virtualentity.api.ElementHolder;
import eu.pb4.polymer.virtualentity.api.elements.ItemDisplayElement;
import net.fabricmc.fabric.api.entity.FakePlayer;
Expand All @@ -24,7 +25,6 @@
import net.minecraft.entity.ExperienceOrbEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUsage;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.sound.SoundCategory;
Expand Down Expand Up @@ -79,7 +79,7 @@ protected ActionResult onUse(BlockState state, World world, BlockPos pos, Player
for (var fluid : recipe.fluidInput(input)) {
container.extract(fluid, false);
}
player.setStackInHand(Hand.MAIN_HAND, ItemUsage.exchangeStack(stack, player, itemOut));
player.setStackInHand(Hand.MAIN_HAND, FactoryUtil.exchangeStack(stack, recipe.decreasedInputItemAmount(input), player, itemOut));
for (var fluid : recipe.fluidOutput(input)) {
container.insert(fluid, false);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import eu.pb4.polyfactory.fluid.FluidContainer;
import net.minecraft.util.math.Direction;
import org.jetbrains.annotations.Nullable;

public interface FluidContainerOwner {
@Nullable
FluidContainer getFluidContainer(Direction direction);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ public interface FluidInput {
interface ContainerBased extends FluidInput, FluidContainerOwner {
@Override
default long insertFluid(FluidInstance<?> type, long amount, Direction direction) {
return getFluidContainer(direction).insert(type, amount, false);
var x = getFluidContainer(direction);

return x != null ? x.insert(type, amount, false) : amount;
}
}

Expand Down
13 changes: 10 additions & 3 deletions src/main/java/eu/pb4/polyfactory/block/fluids/FluidOutput.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,28 @@
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import org.jetbrains.annotations.Nullable;

public interface FluidOutput {
long extractFluid(FluidInstance<?> type, long amount, Direction direction);
@Nullable
FluidInstance<?> getTopFluid(Direction direction);

interface ContainerBased extends FluidOutput, FluidContainerOwner {
@Override
default long extractFluid(FluidInstance<?> type, long amount, Direction direction) {
return getFluidContainer(direction).extract(type, amount, false);
var x = getFluidContainer(direction);

return x != null ? x.extract(type, amount, false) : 0;
}

@Override
@Nullable
default FluidInstance<?> getTopFluid(Direction direction) {
return getFluidContainer(direction).topFluid();
};
var x = getFluidContainer(direction);

return x != null ? x.topFluid() : null;
}
}

interface Getter {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package eu.pb4.polyfactory.block.fluids;

import eu.pb4.factorytools.api.advancement.TriggerCriterion;
import eu.pb4.factorytools.api.virtualentity.BlockModel;
import eu.pb4.polyfactory.advancement.FactoryTriggers;
import eu.pb4.polyfactory.block.BlockHeat;
import eu.pb4.polyfactory.block.FactoryBlockEntities;
import eu.pb4.polyfactory.block.mechanical.RotationUser;
Expand All @@ -16,28 +14,21 @@
import eu.pb4.polyfactory.recipe.FactoryRecipeTypes;
import eu.pb4.polyfactory.recipe.fluid.DrainRecipe;
import eu.pb4.polyfactory.recipe.input.DrainInput;
import eu.pb4.polyfactory.recipe.input.MixingInput;
import eu.pb4.polyfactory.ui.FluidTextures;
import eu.pb4.polyfactory.ui.GuiTextures;
import eu.pb4.polyfactory.ui.TagLimitedSlot;
import eu.pb4.polyfactory.ui.UiResourceCreator;
import eu.pb4.polyfactory.util.FactoryUtil;
import eu.pb4.polyfactory.util.movingitem.SimpleContainer;
import eu.pb4.polymer.virtualentity.api.attachment.BlockBoundAttachment;
import eu.pb4.sgui.api.elements.GuiElementBuilder;
import eu.pb4.sgui.api.gui.SimpleGui;
import net.fabricmc.fabric.api.entity.FakePlayer;
import net.minecraft.advancement.criterion.Criteria;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.component.ComponentMap;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.SimpleInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUsage;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.particle.ItemStackParticleEffect;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.recipe.RecipeEntry;
import net.minecraft.registry.RegistryWrapper;
import net.minecraft.screen.ScreenHandlerType;
Expand All @@ -60,8 +51,6 @@
import org.jetbrains.annotations.Nullable;
import org.joml.Quaternionf;

import java.util.ArrayList;

public class MDrainBlockEntity extends TallItemMachineBlockEntity implements FluidInputOutput.ContainerBased {

public static final int CATALYST_FIRST = 2;
Expand All @@ -83,6 +72,8 @@ public class MDrainBlockEntity extends TallItemMachineBlockEntity implements Flu
private MDrainBlock.Model model;
private boolean inventoryChanged = false;
private final FluidContainer fluidContainer = new FluidContainer(FLUID_CAPACITY, this::markDirty);
private float visualProgress;

public MDrainBlockEntity(BlockPos pos, BlockState state) {
super(FactoryBlockEntities.MECHANICAL_DRAIN, pos, state);
}
Expand All @@ -105,6 +96,7 @@ public static <T extends BlockEntity> void ticker(World world, BlockPos pos, Blo

if (self.isInputEmpty()) {
self.process = 0;
self.visualProgress = 0;
self.updateInputPosition();
self.speedScale = 0;
self.active = false;
Expand All @@ -115,6 +107,7 @@ public static <T extends BlockEntity> void ticker(World world, BlockPos pos, Blo

if (self.currentRecipe == null && !self.inventoryChanged) {
self.process = 0;
self.visualProgress = 0;
self.updateInputPosition();
self.speedScale = 0;
self.active = false;
Expand All @@ -129,6 +122,7 @@ public static <T extends BlockEntity> void ticker(World world, BlockPos pos, Blo

if (self.currentRecipe == null || !self.currentRecipe.value().matches(input, world)) {
self.process = 0;
self.visualProgress = 0;
self.updateInputPosition();
self.speedScale = 0;
self.currentRecipe = world.getRecipeManager().getFirstMatch(FactoryRecipeTypes.DRAIN, input, world).orElse(null);
Expand Down Expand Up @@ -162,7 +156,7 @@ public static <T extends BlockEntity> void ticker(World world, BlockPos pos, Blo
} else {
return;
}
inputStack.decrement(1);
inputStack.decrement(self.currentRecipe.value().decreasedInputItemAmount(input));
if (inputStack.isEmpty()) {
self.setStack(INPUT_FIRST, ItemStack.EMPTY);
}
Expand All @@ -174,15 +168,16 @@ public static <T extends BlockEntity> void ticker(World world, BlockPos pos, Blo
}
world.playSound(null, pos, self.currentRecipe.value().soundEvent().value(), SoundCategory.BLOCKS);
self.process = 0;
self.visualProgress = 0;
self.updateInputPosition();
self.markDirty();
} else {
var strength = fullSpeed / 50 / 20;
var max = self.currentRecipe.value().maxSpeed(input);
var speed = Math.min(Math.abs(strength) * max, max);
var speed = Math.min(Math.abs(strength) * 1, 1);
self.speedScale = speed;
if (speed > 0) {
self.process += speed;
self.visualProgress = (float) (self.process / self.currentRecipe.value().time(input));
markDirty(world, pos, self.getCachedState());
var ppos = self.containers[0].getPos();
var fluid = Util.getRandomOrEmpty(self.currentRecipe.value().fluidOutput(input), world.random);
Expand Down Expand Up @@ -219,7 +214,7 @@ protected void updatePosition(int id) {
Quaternionf rot;
var dir = this.getCachedState().get(MDrainBlock.INPUT_FACING);
if (id == INPUT_FIRST) {
base = base.add(0, 0.50, 0).offset(dir, -(this.process - 0.5) * (8 / 16f)).offset(dir.rotateYClockwise(), -4 / 16f);
base = base.add(0, 0.50, 0).offset(dir, -(this.visualProgress - 0.5) * (8 / 16f)).offset(dir.rotateYClockwise(), -4 / 16f);
rot = Direction.UP.getRotationQuaternion()
.rotateY(-dir.rotateYClockwise().asRotation() * MathHelper.RADIANS_PER_DEGREE)
.rotateX(MathHelper.PI * 3 / 4);
Expand Down Expand Up @@ -330,7 +325,7 @@ public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEnt
for (var fluid : recipe.fluidInput(input)) {
container.extract(fluid, false);
}
player.setStackInHand(Hand.MAIN_HAND, ItemUsage.exchangeStack(stack, player, itemOut));
player.setStackInHand(Hand.MAIN_HAND, FactoryUtil.exchangeStack(stack, recipe.decreasedInputItemAmount(input), player, itemOut));
for (var fluid : recipe.fluidOutput(input)) {
container.insert(fluid, false);
}
Expand Down Expand Up @@ -453,9 +448,7 @@ private void updateTitleAndFluid() {
}

private float progress() {
return MDrainBlockEntity.this.currentRecipe != null
? (float) MathHelper.clamp(MDrainBlockEntity.this.process / MDrainBlockEntity.this.currentRecipe.value().time(asInput()), 0, 1)
: 0;
return MDrainBlockEntity.this.visualProgress;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ public BlockState getPolymerBreakEventBlockState(BlockState state, ServerPlayerE

@Override
public Collection<BlockNode> createPipeNodes(BlockState state, ServerWorld world, BlockPos pos) {
return state.get(PART) == Part.TOP ? List.of(new PumpNode(Direction.UP, true, PumpNode.SPOUT_RANGE)) : List.of();
return state.get(PART) == Part.TOP ? List.of(new PumpNode(Direction.DOWN, true, PumpNode.SPOUT_RANGE)) : List.of();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,38 +1,26 @@
package eu.pb4.polyfactory.block.fluids;

import eu.pb4.factorytools.api.virtualentity.BlockModel;
import eu.pb4.polyfactory.block.BlockHeat;
import eu.pb4.polyfactory.block.FactoryBlockEntities;
import eu.pb4.polyfactory.block.mechanical.RotationUser;
import eu.pb4.polyfactory.block.mechanical.machines.TallItemMachineBlockEntity;
import eu.pb4.polyfactory.block.network.NetworkComponent;
import eu.pb4.polyfactory.fluid.FluidContainer;
import eu.pb4.polyfactory.fluid.FluidType;
import eu.pb4.polyfactory.item.FactoryDataComponents;
import eu.pb4.polyfactory.item.FactoryItemTags;
import eu.pb4.polyfactory.item.component.FluidComponent;
import eu.pb4.polyfactory.polydex.PolydexCompat;
import eu.pb4.polyfactory.recipe.FactoryRecipeTypes;
import eu.pb4.polyfactory.recipe.fluid.DrainRecipe;
import eu.pb4.polyfactory.recipe.fluid.SpoutRecipe;
import eu.pb4.polyfactory.recipe.input.DrainInput;
import eu.pb4.polyfactory.recipe.input.SpoutInput;
import eu.pb4.polyfactory.ui.FluidTextures;
import eu.pb4.polyfactory.ui.GuiTextures;
import eu.pb4.polyfactory.ui.TagLimitedSlot;
import eu.pb4.polyfactory.ui.UiResourceCreator;
import eu.pb4.polyfactory.util.FactoryUtil;
import eu.pb4.polyfactory.util.movingitem.SimpleContainer;
import eu.pb4.polymer.virtualentity.api.attachment.BlockBoundAttachment;
import eu.pb4.sgui.api.elements.GuiElement;
import eu.pb4.sgui.api.gui.SimpleGui;
import net.fabricmc.fabric.api.entity.FakePlayer;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.component.ComponentMap;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUsage;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.recipe.RecipeEntry;
import net.minecraft.registry.RegistryWrapper;
Expand All @@ -43,11 +31,7 @@
import net.minecraft.server.world.ServerWorld;
import net.minecraft.sound.SoundCategory;
import net.minecraft.text.Text;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.ItemScatterer;
import net.minecraft.util.Util;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.MathHelper;
Expand Down Expand Up @@ -163,7 +147,7 @@ public static <T extends BlockEntity> void ticker(World world, BlockPos pos, Blo
} else {
return;
}
inputStack.decrement(1);
inputStack.decrement(self.currentRecipe.value().decreasedInputItemAmount(input));
if (inputStack.isEmpty()) {
self.setStack(INPUT_FIRST, ItemStack.EMPTY);
}
Expand All @@ -174,8 +158,7 @@ public static <T extends BlockEntity> void ticker(World world, BlockPos pos, Blo
self.process = 0;
self.markDirty();
} else {
var max = self.currentRecipe.value().maxSpeed(input);
var speed = Math.min(Math.abs(strength) * max, max);
var speed = Math.min(Math.abs(strength) * 1, 1);
self.speedScale = speed;
if (speed > 0) {
self.process += speed;
Expand Down
Loading

0 comments on commit 9bc4bb9

Please sign in to comment.