Skip to content

Commit

Permalink
Advancements, final tweaks
Browse files Browse the repository at this point in the history
  • Loading branch information
Patbox committed Dec 21, 2024
1 parent 4cfd3e4 commit 31debc9
Show file tree
Hide file tree
Showing 17 changed files with 343 additions and 24 deletions.
3 changes: 3 additions & 0 deletions changelog-next.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,10 @@
- Added Grinder recipe for Wind Charges and Eyeblossom dyes.
- Added Press recipe for Bundle and Mace.
- Added Mixer recipe for dyed Bundle and Shulker Box.
- Added advancements related to new content.
- Changed order of colored items in creative item groups (Variants tab) to match other vanilla items.
- Recipes now use Fabric's Convention tag for Stripped Logs.
- Fixed Funnels pulling items form blocks using Fabric Storage API loosing last stack if the storage becomes empty.
- Fixed Conveyors sometimes deleting items.
- Fixed Splashes shoot through Fluid Nozzle not interacting with owner straight away.
- Fixed Boolean Data returning inverted numbers.
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,7 @@ public interface FactoryTriggers {
Identifier TATER_1024 = id("tater_1024");
Identifier ARITHMETIC_OPERATOR = id("arithmetic_operator");
Identifier DATA_COMPARATOR = id("data_comparator");
Identifier DATA_MEMORY= id("data_memory");
Identifier DATA_MEMORY = id("data_memory");
Identifier ITEM_PACKER_ACCESSES = id("item_packer_accesses");
Identifier STICKY_WALL_SLIDING = id("sticky_wall_sliding");
}
2 changes: 1 addition & 1 deletion src/main/java/eu/pb4/polyfactory/block/FactoryBlocks.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public class FactoryBlocks {
public static final ContainerBlock CONTAINER = register("wooden_container", Block.Settings.copy(Blocks.CHEST), settings -> new ContainerBlock(9 * 5, settings.nonOpaque()));
public static final ItemPackerBlock ITEM_PACKER = register("item_packer", Block.Settings.copy(SPLITTER), ItemPackerBlock::new);
public static final CableBlock CABLE = register("cable", Block.Settings.copy(Blocks.GLASS), settings -> new CableBlock(settings.breakInstantly().nonOpaque()));
public static final GatedCableBlock GATED_CABLE = register("gated_cable", Block.Settings.copy(CLUTCH), GatedCableBlock::new);
public static final GatedCableBlock GATED_CABLE = register("gated_cable", Block.Settings.copy(SPLITTER), GatedCableBlock::new);
public static final Map<Block, WallWithCableBlock> WALL_WITH_CABLE = WallWithCableBlock.MAP;
public static final CabledDataProviderBlock ITEM_COUNTER = register("item_counter", Block.Settings.copy(SPLITTER), CabledDataProviderBlock::new);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package eu.pb4.polyfactory.block.other;

import eu.pb4.factorytools.api.advancement.TriggerCriterion;
import eu.pb4.factorytools.api.block.BlockEntityExtraListener;
import eu.pb4.factorytools.api.block.entity.LockableBlockEntity;
import eu.pb4.polyfactory.advancement.FactoryTriggers;
import eu.pb4.polyfactory.block.FactoryBlockEntities;
import eu.pb4.polyfactory.ui.GuiTextures;
import eu.pb4.polyfactory.ui.PredicateLimitedSlot;
import eu.pb4.polyfactory.util.FactoryUtil;
import eu.pb4.polyfactory.util.inventory.SingleStackInventory;
import eu.pb4.polyfactory.util.storage.WrappingStorage;
import eu.pb4.polymer.virtualentity.api.attachment.BlockBoundAttachment;
import eu.pb4.sgui.api.gui.SimpleGui;
import net.fabricmc.fabric.api.transfer.v1.context.ContainerItemContext;
Expand Down Expand Up @@ -172,7 +176,15 @@ private Storage<ItemVariant> getItemStorage() {
return this.cachedItemStorage;
}

return ItemStorage.ITEM.find(this.itemStack, ContainerItemContext.ofSingleSlot(this.inventoryStorage.getSlot(0)));
var storage = ItemStorage.ITEM.find(this.itemStack, ContainerItemContext.ofSingleSlot(this.inventoryStorage.getSlot(0)));

return WrappingStorage.withModifyCallback(storage, this::runAdvancement);
}

private void runAdvancement() {
if (this.world != null && FactoryUtil.getClosestPlayer(this.world, this.pos, 16) instanceof ServerPlayerEntity player) {
TriggerCriterion.trigger(player, FactoryTriggers.ITEM_PACKER_ACCESSES);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,21 @@ private void base(RegistryWrapper.WrapperLookup registryLookup, AdvancementEntry
.criterion("use", TriggerCriterion.of(FactoryTriggers.ARITHMETIC_OPERATOR))
.build(exporter, "polyfactory:main/base/arithmetic_operator");

var dataComparator = Advancement.Builder.create()
.parent(aritheticOperator)
.display(
FactoryItems.DATA_COMPARATOR,
Text.translatable("advancements.polyfactory.data_comparator.title"),
Text.translatable("advancements.polyfactory.data_comparator.description"),
null,
AdvancementFrame.TASK,
true,
true,
false
)
.criterion("use", TriggerCriterion.of(FactoryTriggers.DATA_COMPARATOR))
.build(exporter, "polyfactory:main/base/data_comparator");

var dataMemory = Advancement.Builder.create()
.parent(aritheticOperator)
.display(
Expand Down Expand Up @@ -620,6 +635,21 @@ private void base(RegistryWrapper.WrapperLookup registryLookup, AdvancementEntry
.criterion("use", TriggerCriterion.of(FactoryTriggers.CONTAINER_ADD_ITEM))
.build(exporter, "polyfactory:main/base/container");

var itemPacker = Advancement.Builder.create()
.parent(container)
.display(
FactoryItems.ITEM_PACKER,
Text.translatable("advancements.polyfactory.item_packer.title"),
Text.translatable("advancements.polyfactory.item_packer.description"),
null,
AdvancementFrame.TASK,
true,
true,
false
)
.criterion("use", TriggerCriterion.of(FactoryTriggers.ITEM_PACKER_ACCESSES))
.build(exporter, "polyfactory:main/base/item_packer");

var fan = Advancement.Builder.create()
.parent(press)
.display(
Expand Down Expand Up @@ -836,7 +866,20 @@ private void base(RegistryWrapper.WrapperLookup registryLookup, AdvancementEntry
.criterion("use", FluidShootsCriterion.ofNozzle())
.build(exporter, "polyfactory:main/base/nozzle");


var stickyEffect = Advancement.Builder.create()
.parent(nozzle)
.display(
FactoryItems.HONEY_BUCKET,
Text.translatable("advancements.polyfactory.sticky_effect.title"),
Text.translatable("advancements.polyfactory.sticky_effect.description"),
null,
AdvancementFrame.TASK,
true,
true,
false
)
.criterion("use", TriggerCriterion.of(FactoryTriggers.STICKY_WALL_SLIDING))
.build(exporter, "polyfactory:main/base/sticky_effect");

var pressureFluidGun = Advancement.Builder.create()
.parent(nozzle)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package eu.pb4.polyfactory.effects;

import eu.pb4.factorytools.api.advancement.TriggerCriterion;
import eu.pb4.polyfactory.advancement.FactoryTriggers;
import eu.pb4.polyfactory.util.FactoryUtil;
import eu.pb4.polymer.core.api.other.PolymerStatusEffect;
import net.minecraft.entity.Entity;
Expand Down Expand Up @@ -70,6 +72,7 @@ private void updateSlidingVelocity(Entity entity) {
} else {
FactoryUtil.sendVelocityDelta(player, new Vec3d(0, y - vec3d.y + entity.getFinalGravity(), 0));
}
TriggerCriterion.trigger(player, FactoryTriggers.STICKY_WALL_SLIDING);
}

if (entity.getWorld().random.nextInt(5) == 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ public SplashEntity(EntityType<? extends ProjectileEntity> entityType, World wor
this.data = fluidInstance.defaultData();
}



@Override
public void setFluidData(T data) {
this.data = data;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,9 @@ public Vec3d rotation() {
public SoundCategory soundCategory() {
return entity.getSoundCategory();
}

@Override
public boolean isEntity() {
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ private void shoot(ShooterContext context, float divergence, FluidInstance<T> fl
var entity = entityCreator.createEntity(world, fluidInstance, amount);
if (entity instanceof ProjectileEntity projectile) {
((ProjectileEntityAccessor) projectile).setOwnerUuid(context.uuid());

if (!context.isEntity()) {
((ProjectileEntityAccessor) projectile).setLeftOwner(true);
}
}
entity.setPosition(pos);
vec.set(rotation.x, rotation.y, rotation.z);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,8 @@ default float force() {
default float extraSpread() {
return 0;
}

default boolean isEntity() {
return false;
}
}
19 changes: 10 additions & 9 deletions src/main/java/eu/pb4/polyfactory/item/FactoryItems.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.mojang.datafixers.util.Pair;
import eu.pb4.factorytools.api.item.FactoryBlockItem;
import eu.pb4.polyfactory.block.data.GatedCableBlock;
import eu.pb4.polyfactory.util.FactoryUtil;
import eu.pb4.polymer.core.api.item.SimplePolymerItem;
import eu.pb4.factorytools.api.item.MultiBlockItem;
import eu.pb4.factorytools.api.block.MultiBlock;
Expand Down Expand Up @@ -331,32 +332,32 @@ public static void register() {
.displayName(Text.translatable("itemgroup." + ModInit.ID + ".variants"))
.entries(((context, entries) -> {

for (var dye : DyeColor.values()) {
for (var dye : FactoryUtil.COLORS_CREATIVE) {
var stack = WINDMILL_SAIL.getDefaultStack();
stack.set(DataComponentTypes.DYED_COLOR, new DyedColorComponent(DyeColorExtra.getColor(dye), true));
entries.add(stack);
}

for (var dye : DyeColor.values()) {
for (var dye : FactoryUtil.COLORS_CREATIVE) {
entries.add(ColoredItem.stack(CABLE, 1, DyeColorExtra.getColor(dye)));
}

for (var dye : DyeColor.values()) {
for (var dye : FactoryUtil.COLORS_CREATIVE) {
entries.add(ColoredItem.stack(LAMP, 1, DyeColorExtra.getColor(dye)));
}
for (var dye : DyeColor.values()) {
for (var dye : FactoryUtil.COLORS_CREATIVE) {
entries.add(ColoredItem.stack(INVERTED_LAMP, 1, DyeColorExtra.getColor(dye)));
}
for (var dye : DyeColor.values()) {
for (var dye : FactoryUtil.COLORS_CREATIVE) {
entries.add(ColoredItem.stack(CAGED_LAMP, 1, DyeColorExtra.getColor(dye)));
}
for (var dye : DyeColor.values()) {
for (var dye : FactoryUtil.COLORS_CREATIVE) {
entries.add(ColoredItem.stack(INVERTED_CAGED_LAMP, 1, DyeColorExtra.getColor(dye)));
}
for (var dye : DyeColor.values()) {
for (var dye : FactoryUtil.COLORS_CREATIVE) {
entries.add(ColoredItem.stack(FIXTURE_LAMP, 1, DyeColorExtra.getColor(dye)));
}
for (var dye : DyeColor.values()) {
for (var dye : FactoryUtil.COLORS_CREATIVE) {
entries.add(ColoredItem.stack(INVERTED_FIXTURE_LAMP, 1, DyeColorExtra.getColor(dye)));
}

Expand All @@ -382,7 +383,7 @@ public static void register() {
entries.add(stack);
}

for (var dye : DyeColor.values()) {
for (var dye : FactoryUtil.COLORS_CREATIVE) {
var x = ColoredItem.stack(SPRAY_CAN, 1, DyeColorExtra.getColor(dye));
x.set(FactoryDataComponents.USES_LEFT, 128);
entries.add(x);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,10 @@ public interface ProjectileEntityAccessor {

@Accessor
void setOwnerUuid(UUID ownerUuid);

@Accessor
boolean isLeftOwner();

@Accessor
void setLeftOwner(boolean leftOwner);
}
29 changes: 21 additions & 8 deletions src/main/java/eu/pb4/polyfactory/util/FactoryUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import eu.pb4.factorytools.api.util.WorldPointer;
import eu.pb4.polyfactory.ModInit;
import eu.pb4.polyfactory.util.inventory.CustomInsertInventory;
import eu.pb4.polyfactory.util.movingitem.MovingItemConsumer;
import eu.pb4.polyfactory.util.movingitem.ContainerHolder;
import eu.pb4.polyfactory.util.movingitem.MovingItemConsumer;
import eu.pb4.sgui.api.GuiHelpers;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
Expand All @@ -16,7 +16,6 @@
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.HopperBlockEntity;
import net.minecraft.block.enums.WallShape;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EquipmentSlot;
import net.minecraft.entity.player.PlayerEntity;
Expand Down Expand Up @@ -44,7 +43,6 @@
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraft.world.explosion.Explosion;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
Expand All @@ -61,7 +59,22 @@ public class FactoryUtil {
public static final Vec3d HALF_BELOW = new Vec3d(0, -0.5, 0);
public static final List<Direction> HORIZONTAL_DIRECTIONS = List.of(Direction.NORTH, Direction.EAST, Direction.SOUTH, Direction.WEST);
public static final List<EquipmentSlot> ARMOR_EQUIPMENT = Arrays.stream(EquipmentSlot.values()).filter(x -> x.getType() == EquipmentSlot.Type.HUMANOID_ARMOR).toList();

public static final List<DyeColor> COLORS_CREATIVE = List.of(DyeColor.WHITE,
DyeColor.LIGHT_GRAY,
DyeColor.GRAY,
DyeColor.BLACK,
DyeColor.BROWN,
DyeColor.RED,
DyeColor.ORANGE,
DyeColor.YELLOW,
DyeColor.LIME,
DyeColor.GREEN,
DyeColor.CYAN,
DyeColor.LIGHT_BLUE,
DyeColor.BLUE,
DyeColor.PURPLE,
DyeColor.MAGENTA,
DyeColor.PINK);
private static final List<Runnable> RUN_NEXT_TICK = new ArrayList<>();

public static Item requestModelBase(ModelRenderType type) {
Expand Down Expand Up @@ -109,7 +122,7 @@ public static Text fluidText(long amount) {
}

public static void sendVelocityDelta(ServerPlayerEntity player, Vec3d delta) {
player.networkHandler.sendPacket(new ExplosionS2CPacket(new Vec3d(player.getX(), player.getY() - 9999, player.getZ()), Optional.of(delta), ParticleTypes.BUBBLE, Registries.SOUND_EVENT.getEntry(SoundEvents.INTENTIONALLY_EMPTY)));
player.networkHandler.sendPacket(new ExplosionS2CPacket(new Vec3d(player.getX(), player.getY() - 9999, player.getZ()), Optional.of(delta), ParticleTypes.BUBBLE, Registries.SOUND_EVENT.getEntry(SoundEvents.INTENTIONALLY_EMPTY)));
}

public static float wrap(float value, float min, float max) {
Expand Down Expand Up @@ -360,10 +373,10 @@ public static Consumer<ItemStack> getItemConsumer(Entity entity) {
}

public static void sendSlotUpdate(Entity entity, Hand hand) {
if (entity instanceof ServerPlayerEntity player ) {
if (entity instanceof ServerPlayerEntity player) {
GuiHelpers.sendSlotUpdate(player, player.playerScreenHandler.syncId, hand == Hand.MAIN_HAND
? PlayerScreenHandler.HOTBAR_START + player.getInventory().selectedSlot
: PlayerScreenHandler.OFFHAND_ID,
? PlayerScreenHandler.HOTBAR_START + player.getInventory().selectedSlot
: PlayerScreenHandler.OFFHAND_ID,
player.getStackInHand(hand), player.playerScreenHandler.nextRevision());
}
}
Expand Down
46 changes: 46 additions & 0 deletions src/main/java/eu/pb4/polyfactory/util/storage/EmptyStorage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package eu.pb4.polyfactory.util.storage;

import net.fabricmc.fabric.api.transfer.v1.storage.Storage;
import net.fabricmc.fabric.api.transfer.v1.storage.StorageView;
import net.fabricmc.fabric.api.transfer.v1.transaction.TransactionContext;

import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public record EmptyStorage<T>() implements Storage<T> {
@Override
public boolean supportsInsertion() {
return false;
}

@Override
public long insert(T resource, long maxAmount, TransactionContext transaction) {
return 0;
}

@Override
public boolean supportsExtraction() {
return false;
}

@Override
public long extract(T resource, long maxAmount, TransactionContext transaction) {
return 0;
}

@Override
public Iterator<StorageView<T>> iterator() {
return Collections.emptyIterator();
}

@Override
public Iterator<StorageView<T>> nonEmptyIterator() {
return Collections.emptyIterator();
}

@Override
public Iterable<StorageView<T>> nonEmptyViews() {
return Collections::emptyIterator;
}
}
Loading

0 comments on commit 31debc9

Please sign in to comment.