Public Access
1 parent
5a9a13f35c
commit
b6f321e6cb
5 files changed
+86
-2
No files matched your search
@@ -0,0 +1,78 @@
|
||||
package net.dnorberg.rivencraft.gametest;
|
||||
|
||||
import net.dnorberg.rivencraft.Rivencraft;
|
||||
import net.dnorberg.rivencraft.book.LinkTarget;
|
||||
import net.dnorberg.rivencraft.book.LinkingService;
|
||||
import net.dnorberg.rivencraft.registry.ModDataComponents;
|
||||
import net.dnorberg.rivencraft.registry.ModItems;
|
||||
import net.minecraft.core.BlockPos;
|
||||
import net.minecraft.core.GlobalPos;
|
||||
import net.minecraft.gametest.framework.GameTest;
|
||||
import net.minecraft.gametest.framework.GameTestHelper;
|
||||
import net.minecraft.nbt.CompoundTag;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraft.world.level.block.Blocks;
|
||||
import net.neoforged.neoforge.gametest.GameTestHolder;
|
||||
import net.neoforged.neoforge.gametest.PrefixGameTestTemplate;
|
||||
|
||||
/** Server-side regression coverage for persistent linking-book data and travel safety. */
|
||||
@GameTestHolder(Rivencraft.MOD_ID)
|
||||
@PrefixGameTestTemplate(false)
|
||||
public final class LinkingGameTests {
|
||||
private static final BlockPos ORIGIN = new BlockPos(0, 1, 0);
|
||||
|
||||
private LinkingGameTests() {
|
||||
}
|
||||
|
||||
@GameTest(template = "empty")
|
||||
public static void linkTargetSurvivesItemSerialization(GameTestHelper helper) {
|
||||
LinkTarget expected = new LinkTarget(
|
||||
GlobalPos.of(helper.getLevel().dimension(), helper.absolutePos(ORIGIN)),
|
||||
127.5F,
|
||||
-31.25F
|
||||
);
|
||||
ItemStack book = new ItemStack(ModItems.LINKING_BOOK.get());
|
||||
book.set(ModDataComponents.LINK_TARGET.get(), expected);
|
||||
|
||||
CompoundTag serialized = (CompoundTag) book.saveOptional(helper.getLevel().registryAccess());
|
||||
ItemStack restored = ItemStack.parseOptional(helper.getLevel().registryAccess(), serialized);
|
||||
|
||||
helper.assertValueEqual(restored.get(ModDataComponents.LINK_TARGET.get()), expected,
|
||||
"A Linking Book must retain its dimension, position, and orientation after serialization");
|
||||
helper.succeed();
|
||||
}
|
||||
|
||||
@GameTest(template = "empty")
|
||||
public static void travelUsesRecordedSafePosition(GameTestHelper helper) {
|
||||
helper.setBlock(ORIGIN.below(), Blocks.STONE);
|
||||
BlockPos destination = helper.absolutePos(ORIGIN);
|
||||
ServerPlayer player = helper.makeMockServerPlayerInLevel();
|
||||
LinkTarget target = new LinkTarget(GlobalPos.of(helper.getLevel().dimension(), destination), 90.0F, 15.0F);
|
||||
|
||||
LinkingService.LinkResult result = LinkingService.travel(player, target);
|
||||
|
||||
helper.assertValueEqual(result, LinkingService.LinkResult.SUCCESS,
|
||||
"A Linking Book must travel to a clear location with a sturdy floor");
|
||||
helper.assertTrue(player.level() == helper.getLevel(), "Travel must remain in the recorded dimension");
|
||||
helper.assertTrue(Math.abs(player.getYRot() - 90.0F) < 0.01F && Math.abs(player.getXRot() - 15.0F) < 0.01F,
|
||||
"Travel must restore the recorded orientation");
|
||||
helper.succeed();
|
||||
}
|
||||
|
||||
@GameTest(template = "empty")
|
||||
public static void travelRejectsBlockedDestination(GameTestHelper helper) {
|
||||
BlockPos absoluteOrigin = helper.absolutePos(ORIGIN);
|
||||
for (BlockPos position : BlockPos.betweenClosed(
|
||||
absoluteOrigin.offset(-4, -2, -4), absoluteOrigin.offset(4, 2, 4))) {
|
||||
helper.getLevel().setBlockAndUpdate(position, Blocks.STONE.defaultBlockState());
|
||||
}
|
||||
|
||||
ServerPlayer player = helper.makeMockServerPlayerInLevel();
|
||||
LinkTarget target = new LinkTarget(GlobalPos.of(helper.getLevel().dimension(), absoluteOrigin), 0.0F, 0.0F);
|
||||
|
||||
helper.assertValueEqual(LinkingService.travel(player, target), LinkingService.LinkResult.NO_SAFE_DESTINATION,
|
||||
"Linking must fail rather than placing a player inside a blocked destination");
|
||||
helper.succeed();
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Reference in new issue
Block a user