diff --git a/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestContraptions.java b/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestContraptions.java index fe12592f7a..260582d5c7 100644 --- a/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestContraptions.java +++ b/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestContraptions.java @@ -19,11 +19,13 @@ import net.minecraft.gametest.framework.GameTest; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.projectile.Arrow; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.CropBlock; import net.minecraft.world.level.block.LeverBlock; import net.minecraft.world.level.block.RedstoneLampBlock; + import net.minecraftforge.fluids.FluidStack; @GameTestGroup(path = "contraptions") @@ -228,4 +230,48 @@ public class TestContraptions { // public static void trainObserver(CreateGameTestHelper helper) { // helper.fail("NYI"); // } + + @GameTest(template = "dispensers_dont_fight") + public static void dispensersDontFight(CreateGameTestHelper helper) { + helper.pullLever(2, 3, 1); + BlockPos bottom = new BlockPos(6, 4, 1); + BlockPos top = new BlockPos(6, 6, 1); + BlockPos dispenser = new BlockPos(3, 4, 1); + + helper.succeedWhen(() -> { + helper.assertEntitiesPresent(EntityType.ARROW, bottom, 3, 0); + helper.assertEntityNotPresent(EntityType.ARROW, top); + helper.assertBlockPresent(Blocks.DISPENSER, dispenser); + helper.assertContainerContains(dispenser, new ItemStack(Items.ARROW, 2)); + }); + } + + @GameTest(template = "dispensers_refill") + public static void dispensersRefill(CreateGameTestHelper helper) { + BlockPos lever = new BlockPos(2, 3, 1); + helper.pullLever(lever); + BlockPos barrel = lever.above(); + BlockPos dispenser = barrel.east(); + + helper.succeedWhen(() -> { + helper.assertBlockPresent(Blocks.DISPENSER, dispenser); + helper.assertContainerContains(dispenser, new ItemStack(Items.SPECTRAL_ARROW, 2)); + helper.assertContainerEmpty(barrel); + }); + } + + @GameTest(template = "vaults_protect_fuel") + public static void vaultsProtectFuel(CreateGameTestHelper helper) { + BlockPos lever = new BlockPos(2, 2, 1); + helper.pullLever(lever); + BlockPos barrelLamp = new BlockPos(1, 3, 3); + BlockPos vaultLamp = barrelLamp.east(2); + + helper.runAtTickTime(10, () -> helper.pullLever(lever)); + + helper.succeedWhen(() -> { + helper.assertBlockProperty(barrelLamp, RedstoneLampBlock.LIT, false); + helper.assertBlockProperty(vaultLamp, RedstoneLampBlock.LIT, true); + }); + } } diff --git a/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestFluids.java b/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestFluids.java index ff4fc84136..4e561a9519 100644 --- a/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestFluids.java +++ b/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestFluids.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import org.apache.commons.lang3.mutable.MutableBoolean; + import com.simibubi.create.AllBlockEntityTypes; import com.simibubi.create.content.fluids.hosePulley.HosePulleyFluidHandler; import com.simibubi.create.content.fluids.pipes.valve.FluidValveBlock; @@ -18,15 +20,22 @@ import net.minecraft.gametest.framework.GameTest; import net.minecraft.gametest.framework.GameTestAssertException; import net.minecraft.tags.BlockTags; import net.minecraft.util.Mth; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.Potions; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FarmBlock; import net.minecraft.world.level.block.LeverBlock; import net.minecraft.world.level.block.RedstoneLampBlock; import net.minecraft.world.level.material.Fluids; + import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -299,4 +308,59 @@ public class TestFluids { } }); } + + @GameTest(template = "open_pipes") + public static void openPipes(CreateGameTestHelper helper) { + BlockPos effects = new BlockPos(2, 4, 2); + BlockPos removers = new BlockPos(3, 5, 2); + + BlockPos firstSeat = new BlockPos(4, 2, 1); + BlockPos secondSeat = firstSeat.south(2); + + Zombie firstZombie = helper.spawn(EntityType.ZOMBIE, firstSeat); + Zombie secondZombie = helper.spawn(EntityType.ZOMBIE, secondSeat); + + helper.pullLever(effects); + + MutableBoolean stage1 = new MutableBoolean(true); + + helper.succeedWhen(() -> { + if (stage1.booleanValue()) { + helper.assertTrue(firstZombie.isOnFire(), "not ignited"); + helper.assertFalse(secondZombie.getActiveEffects().isEmpty(), "no effects"); + // success, stage 2 time + stage1.setFalse(); + helper.pullLever(effects); + helper.pullLever(removers); + helper.fail("switching stages"); + } else { + helper.assertFalse(firstZombie.isOnFire(), "not extinguished"); + helper.assertTrue(secondZombie.getActiveEffects().isEmpty(), "has effects"); + // all done + } + }); + } + + @GameTest(template = "spouting", timeoutTicks = CreateGameTestHelper.TEN_SECONDS) + public static void spouting(CreateGameTestHelper helper) { + BlockPos farmland = new BlockPos(3, 2, 3); + BlockPos depot = new BlockPos(5, 2, 1); + helper.pullLever(2, 3, 2); + ItemStack waterBottle = PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER); + + helper.succeedWhen(() -> { + // lava + helper.assertBlockPresent(Blocks.LAVA_CAULDRON, 3, 2, 1); + // water + helper.assertBlockProperty(farmland, FarmBlock.MOISTURE, 7); + helper.assertBlockPresent(Blocks.MUD, farmland.east(1)); + helper.assertBlockPresent(Blocks.MUD, farmland.east(2)); + helper.assertBlockPresent(Blocks.MUD, farmland.east(3)); + helper.assertBlockPresent(Blocks.WATER_CAULDRON, farmland.east(4)); + + helper.assertContainerContains(depot, Items.WATER_BUCKET); + helper.assertContainerContains(depot.east(1), waterBottle); + helper.assertContainerContains(depot.east(2), Items.GRASS_BLOCK); + }); + } } diff --git a/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestItems.java b/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestItems.java index 7aa6d8c902..29c50927bb 100644 --- a/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestItems.java +++ b/src/main/java/com/simibubi/create/infrastructure/gametest/tests/TestItems.java @@ -31,6 +31,7 @@ import net.minecraft.world.item.enchantment.EnchantmentInstance; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.RedstoneLampBlock; + import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.registries.ForgeRegistries; @@ -390,4 +391,22 @@ public class TestItems { helper.assertNixiePower(halfPearlNixie, 8); }); } + + @GameTest(template = "fan_processing", timeoutTicks = CreateGameTestHelper.TEN_SECONDS) + public static void fanProcessing(CreateGameTestHelper helper) { + // why does the redstone explode + BlockPos.betweenClosed(new BlockPos(2, 7, 3), new BlockPos(11, 7, 3)).forEach( + pos -> helper.setBlock(pos, Blocks.REDSTONE_WIRE) + ); + helper.pullLever(1, 7, 3); + List lamps = List.of( + new BlockPos(1, 2, 1), new BlockPos(5, 2, 1), new BlockPos(7, 2, 1), + new BlockPos(9, 2, 1), new BlockPos(11, 2, 1) + ); + helper.succeedWhen(() -> { + for (BlockPos lamp : lamps) { + helper.assertBlockProperty(lamp, RedstoneLampBlock.LIT, true); + } + }); + } } diff --git a/src/main/resources/data/create/structures/gametest/contraptions/dispensers_dont_fight.nbt b/src/main/resources/data/create/structures/gametest/contraptions/dispensers_dont_fight.nbt new file mode 100644 index 0000000000..4bcbb8508a Binary files /dev/null and b/src/main/resources/data/create/structures/gametest/contraptions/dispensers_dont_fight.nbt differ diff --git a/src/main/resources/data/create/structures/gametest/contraptions/dispensers_refill.nbt b/src/main/resources/data/create/structures/gametest/contraptions/dispensers_refill.nbt new file mode 100644 index 0000000000..355b2e69e5 Binary files /dev/null and b/src/main/resources/data/create/structures/gametest/contraptions/dispensers_refill.nbt differ diff --git a/src/main/resources/data/create/structures/gametest/contraptions/vaults_protect_fuel.nbt b/src/main/resources/data/create/structures/gametest/contraptions/vaults_protect_fuel.nbt new file mode 100644 index 0000000000..38c8de50ed Binary files /dev/null and b/src/main/resources/data/create/structures/gametest/contraptions/vaults_protect_fuel.nbt differ diff --git a/src/main/resources/data/create/structures/gametest/fluids/open_pipes.nbt b/src/main/resources/data/create/structures/gametest/fluids/open_pipes.nbt new file mode 100644 index 0000000000..c2e8ba3d25 Binary files /dev/null and b/src/main/resources/data/create/structures/gametest/fluids/open_pipes.nbt differ diff --git a/src/main/resources/data/create/structures/gametest/fluids/spouting.nbt b/src/main/resources/data/create/structures/gametest/fluids/spouting.nbt new file mode 100644 index 0000000000..2226cffd50 Binary files /dev/null and b/src/main/resources/data/create/structures/gametest/fluids/spouting.nbt differ diff --git a/src/main/resources/data/create/structures/gametest/items/fan_processing.nbt b/src/main/resources/data/create/structures/gametest/items/fan_processing.nbt new file mode 100644 index 0000000000..2a61de54e4 Binary files /dev/null and b/src/main/resources/data/create/structures/gametest/items/fan_processing.nbt differ