Rework TestTrick2, and add QuerySubLevelTrick
Some checks failed
build / build (push) Has been cancelled

This commit is contained in:
shylie 2026-04-27 17:23:12 -04:00
parent 3f1422d5a0
commit a821a68765
8 changed files with 99 additions and 39 deletions

View File

@ -1,6 +1,6 @@
package info.shylie.testmod; package info.shylie.testmod;
import info.shylie.testmod.spell.fragment.FragmentTypes; import info.shylie.testmod.spell.fragment.FragmentType;
import info.shylie.testmod.spell.trick.Tricks; import info.shylie.testmod.spell.trick.Tricks;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
@ -24,7 +24,7 @@ public class ShylieTestMod implements ModInitializer {
LOGGER.info("Hello Fabric world!"); LOGGER.info("Hello Fabric world!");
FragmentTypes.register(); FragmentType.register();
Tricks.register(); Tricks.register();
} }

View File

@ -0,0 +1,23 @@
package info.shylie.testmod.spell.fragment;
import dev.enjarai.trickster.spell.Fragment;
import info.shylie.testmod.ShylieTestMod;
import io.wispforest.endec.StructEndec;
import net.minecraft.core.Registry;
import java.util.OptionalInt;
public final class FragmentType {
public static final dev.enjarai.trickster.spell.fragment.FragmentType<SubLevelFragment> SUBLEVEL = register("sublevel", SubLevelFragment.ENDEC);
public static void register() {
}
private static <T extends Fragment> dev.enjarai.trickster.spell.fragment.FragmentType<T> register(String name, StructEndec<T> codec) {
return Registry.register(
dev.enjarai.trickster.spell.fragment.FragmentType.REGISTRY,
ShylieTestMod.id(name),
new dev.enjarai.trickster.spell.fragment.FragmentType<>(codec, OptionalInt.of(0xaaaaaa))
);
}
}

View File

@ -1,24 +0,0 @@
package info.shylie.testmod.spell.fragment;
import dev.enjarai.trickster.spell.Fragment;
import dev.enjarai.trickster.spell.fragment.FragmentType;
import info.shylie.testmod.ShylieTestMod;
import io.wispforest.endec.StructEndec;
import net.minecraft.core.Registry;
import java.util.OptionalInt;
public final class FragmentTypes {
public static final FragmentType<SubLevelFragment> SUBLEVEL = register("sublevel", SubLevelFragment.ENDEC);
public static void register() {
}
private static <T extends Fragment> FragmentType<T> register(String name, StructEndec<T> codec) {
return Registry.register(
FragmentType.REGISTRY,
ShylieTestMod.id(name),
new FragmentType<>(codec, OptionalInt.of(0xaaaaaa))
);
}
}

View File

@ -2,7 +2,6 @@ package info.shylie.testmod.spell.fragment;
import dev.enjarai.trickster.EndecTomfoolery; import dev.enjarai.trickster.EndecTomfoolery;
import dev.enjarai.trickster.spell.Fragment; import dev.enjarai.trickster.spell.Fragment;
import dev.enjarai.trickster.spell.fragment.FragmentType;
import dev.ryanhcode.sable.api.sublevel.SubLevelContainer; import dev.ryanhcode.sable.api.sublevel.SubLevelContainer;
import dev.ryanhcode.sable.sublevel.SubLevel; import dev.ryanhcode.sable.sublevel.SubLevel;
import io.wispforest.endec.StructEndec; import io.wispforest.endec.StructEndec;
@ -21,8 +20,8 @@ public record SubLevelFragment(UUID uuid) implements Fragment {
public static final int WEIGHT = 8; public static final int WEIGHT = 8;
@Override @Override
public FragmentType<?> type() { public dev.enjarai.trickster.spell.fragment.FragmentType<?> type() {
return FragmentTypes.SUBLEVEL; return FragmentType.SUBLEVEL;
} }
@Override @Override

View File

@ -0,0 +1,30 @@
package info.shylie.testmod.spell.trick;
import dev.enjarai.trickster.spell.Pattern;
import dev.enjarai.trickster.spell.SpellContext;
import dev.enjarai.trickster.spell.fragment.VectorFragment;
import dev.enjarai.trickster.spell.trick.Trick;
import dev.enjarai.trickster.spell.type.Signature;
import dev.ryanhcode.sable.Sable;
import info.shylie.testmod.spell.blunder.UnknownSubLevelBlunder;
import info.shylie.testmod.spell.fragment.FragmentType;
import info.shylie.testmod.spell.fragment.SubLevelFragment;
import static dev.enjarai.trickster.spell.fragment.FragmentType.VECTOR;
public class QuerySubLevelTrick extends Trick<QuerySubLevelTrick> {
public QuerySubLevelTrick() {
super(
Pattern.of(0, 6, 4, 8, 2),
Signature.of(VECTOR, QuerySubLevelTrick::run, FragmentType.SUBLEVEL)
);
}
public SubLevelFragment run(SpellContext ctx, VectorFragment pos) {
var subLevel = Sable.HELPER.getContaining(ctx.source().getWorld(), pos.toBlockPos());
if (subLevel == null) {
throw new UnknownSubLevelBlunder(this);
}
return new SubLevelFragment(subLevel.getUniqueId());
}
}

View File

@ -6,19 +6,18 @@ import dev.enjarai.trickster.spell.Pattern;
import dev.enjarai.trickster.spell.SpellContext; import dev.enjarai.trickster.spell.SpellContext;
import dev.enjarai.trickster.spell.blunder.BlockTooHardBlunder; import dev.enjarai.trickster.spell.blunder.BlockTooHardBlunder;
import dev.enjarai.trickster.spell.blunder.BlockUnoccupiedBlunder; import dev.enjarai.trickster.spell.blunder.BlockUnoccupiedBlunder;
import dev.enjarai.trickster.spell.fragment.FragmentType;
import dev.enjarai.trickster.spell.fragment.VectorFragment; import dev.enjarai.trickster.spell.fragment.VectorFragment;
import dev.enjarai.trickster.spell.trick.Trick; import dev.enjarai.trickster.spell.trick.Trick;
import dev.enjarai.trickster.spell.type.Signature; import dev.enjarai.trickster.spell.type.Signature;
import dev.ryanhcode.sable.api.SubLevelAssemblyHelper; import dev.ryanhcode.sable.api.SubLevelAssemblyHelper;
import dev.ryanhcode.sable.companion.math.BoundingBox3i; import dev.ryanhcode.sable.companion.math.BoundingBox3i;
import info.shylie.testmod.spell.fragment.FragmentTypes; import info.shylie.testmod.spell.fragment.FragmentType;
import info.shylie.testmod.spell.fragment.SubLevelFragment; import info.shylie.testmod.spell.fragment.SubLevelFragment;
import io.vavr.collection.Array; import io.vavr.collection.Array;
public class TestTrick extends Trick<TestTrick> { public class TestTrick extends Trick<TestTrick> {
public TestTrick() { public TestTrick() {
super(Pattern.of(3, 4, 5), Signature.of(FragmentType.VECTOR, TestTrick::run, FragmentTypes.SUBLEVEL)); super(Pattern.of(3, 4, 5), Signature.of(dev.enjarai.trickster.spell.fragment.FragmentType.VECTOR, TestTrick::run, FragmentType.SUBLEVEL));
} }
public SubLevelFragment run(SpellContext ctx, VectorFragment pos) { public SubLevelFragment run(SpellContext ctx, VectorFragment pos) {

View File

@ -3,18 +3,22 @@ package info.shylie.testmod.spell.trick;
import dev.enjarai.trickster.spell.Pattern; import dev.enjarai.trickster.spell.Pattern;
import dev.enjarai.trickster.spell.SpellContext; import dev.enjarai.trickster.spell.SpellContext;
import dev.enjarai.trickster.spell.execution.TickData; import dev.enjarai.trickster.spell.execution.TickData;
import dev.enjarai.trickster.spell.fragment.FragmentType;
import dev.enjarai.trickster.spell.fragment.VectorFragment; import dev.enjarai.trickster.spell.fragment.VectorFragment;
import dev.enjarai.trickster.spell.fragment.VoidFragment;
import dev.enjarai.trickster.spell.trick.Trick; import dev.enjarai.trickster.spell.trick.Trick;
import dev.enjarai.trickster.spell.type.Signature; import dev.enjarai.trickster.spell.type.Signature;
import dev.ryanhcode.sable.api.sublevel.SubLevelContainer;
import dev.ryanhcode.sable.sublevel.ServerSubLevel; import dev.ryanhcode.sable.sublevel.ServerSubLevel;
import info.shylie.testmod.ShylieTestMod; import info.shylie.testmod.ShylieTestMod;
import info.shylie.testmod.spell.blunder.UnknownSubLevelBlunder; import info.shylie.testmod.spell.blunder.UnknownSubLevelBlunder;
import info.shylie.testmod.spell.fragment.FragmentTypes; import info.shylie.testmod.spell.fragment.FragmentType;
import info.shylie.testmod.spell.fragment.SubLevelFragment; import info.shylie.testmod.spell.fragment.SubLevelFragment;
import net.minecraft.world.phys.Vec3;
import org.joml.Vector3d;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import static dev.enjarai.trickster.spell.fragment.FragmentType.VECTOR;
public class TestTrick2 extends Trick<TestTrick2> { public class TestTrick2 extends Trick<TestTrick2> {
private static final TickData.Key<HashMap<SubLevelFragment, Float>> COMPOUND_LEN = new TickData.Key<>( private static final TickData.Key<HashMap<SubLevelFragment, Float>> COMPOUND_LEN = new TickData.Key<>(
@ -24,13 +28,41 @@ public class TestTrick2 extends Trick<TestTrick2> {
public TestTrick2() { public TestTrick2() {
super( super(
Pattern.of(3, 6, 4, 5), Pattern.of(3, 6, 4, 5),
Signature.of(FragmentTypes.SUBLEVEL, FragmentType.VECTOR, TestTrick2::run, FragmentType.VOID) List.of(
Signature.of(FragmentType.SUBLEVEL, VECTOR, TestTrick2::run, FragmentType.SUBLEVEL),
Signature.of(FragmentType.SUBLEVEL, VECTOR, VECTOR, TestTrick2::run, FragmentType.SUBLEVEL)
)
); );
} }
public VoidFragment run(SpellContext ctx, SubLevelFragment target, VectorFragment v) throws UnknownSubLevelBlunder { public SubLevelFragment run(SpellContext ctx, SubLevelFragment target, VectorFragment v, VectorFragment pos) throws UnknownSubLevelBlunder {
var subLevel = target.getSublevel(ctx.source().getWorld()).orElseThrow(() -> new UnknownSubLevelBlunder(this)); var subLevel = target.getSublevel(ctx.source().getWorld()).orElseThrow(() -> new UnknownSubLevelBlunder(this));
subLevel.markRemoved(); if ((subLevel instanceof ServerSubLevel serverSubLevel)) {
return VoidFragment.INSTANCE; // not null, since subLevel isn't an empty optional
var container = SubLevelContainer.getContainer(ctx.source().getWorld());
var originOfSubLevel = serverSubLevel.logicalPose().position();
var localPos = serverSubLevel
.logicalPose()
.transformPositionInverse(originOfSubLevel.add(pos.vector()), new Vector3d());
var localDirection = serverSubLevel
.logicalPose()
.transformNormalInverse(v.vector(), new Vector3d())
.normalize().mul(v.vector().length());
//noinspection DataFlowIssue -- see above
container.physicsSystem().getPhysicsHandle(serverSubLevel).applyImpulseAtPoint(localPos, localDirection);
return target;
}
else {
throw new IllegalStateException("Not a server sublevel");
}
}
public SubLevelFragment run(SpellContext ctx, SubLevelFragment target, VectorFragment v) throws UnknownSubLevelBlunder {
return run(ctx, target, v, VectorFragment.ZERO);
} }
} }

View File

@ -7,6 +7,7 @@ import net.minecraft.core.Registry;
public class Tricks { public class Tricks {
public static final TestTrick TEST = register("test", new TestTrick()); public static final TestTrick TEST = register("test", new TestTrick());
public static final TestTrick2 TEST_2 = register("test_2", new TestTrick2()); public static final TestTrick2 TEST_2 = register("test_2", new TestTrick2());
public static final QuerySubLevelTrick QUERY_SUBLEVEL_TRICK = register("query_sublevel", new QuerySubLevelTrick());
public static void register() { public static void register() {
} }