diff --git a/src/main/java/info/shylie/testmod/ShylieTestMod.java b/src/main/java/info/shylie/testmod/ShylieTestMod.java index d1ad9ba..7b4586a 100644 --- a/src/main/java/info/shylie/testmod/ShylieTestMod.java +++ b/src/main/java/info/shylie/testmod/ShylieTestMod.java @@ -1,6 +1,6 @@ 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 net.fabricmc.api.ModInitializer; @@ -24,7 +24,7 @@ public class ShylieTestMod implements ModInitializer { LOGGER.info("Hello Fabric world!"); - FragmentTypes.register(); + FragmentType.register(); Tricks.register(); } diff --git a/src/main/java/info/shylie/testmod/spell/fragment/FragmentType.java b/src/main/java/info/shylie/testmod/spell/fragment/FragmentType.java new file mode 100644 index 0000000..b01d592 --- /dev/null +++ b/src/main/java/info/shylie/testmod/spell/fragment/FragmentType.java @@ -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 SUBLEVEL = register("sublevel", SubLevelFragment.ENDEC); + + public static void register() { + } + + private static dev.enjarai.trickster.spell.fragment.FragmentType register(String name, StructEndec 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)) + ); + } +} diff --git a/src/main/java/info/shylie/testmod/spell/fragment/FragmentTypes.java b/src/main/java/info/shylie/testmod/spell/fragment/FragmentTypes.java deleted file mode 100644 index 45867fd..0000000 --- a/src/main/java/info/shylie/testmod/spell/fragment/FragmentTypes.java +++ /dev/null @@ -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 SUBLEVEL = register("sublevel", SubLevelFragment.ENDEC); - - public static void register() { - } - - private static FragmentType register(String name, StructEndec codec) { - return Registry.register( - FragmentType.REGISTRY, - ShylieTestMod.id(name), - new FragmentType<>(codec, OptionalInt.of(0xaaaaaa)) - ); - } -} diff --git a/src/main/java/info/shylie/testmod/spell/fragment/SubLevelFragment.java b/src/main/java/info/shylie/testmod/spell/fragment/SubLevelFragment.java index 0e9ec0f..b8ec7c6 100644 --- a/src/main/java/info/shylie/testmod/spell/fragment/SubLevelFragment.java +++ b/src/main/java/info/shylie/testmod/spell/fragment/SubLevelFragment.java @@ -2,7 +2,6 @@ package info.shylie.testmod.spell.fragment; import dev.enjarai.trickster.EndecTomfoolery; import dev.enjarai.trickster.spell.Fragment; -import dev.enjarai.trickster.spell.fragment.FragmentType; import dev.ryanhcode.sable.api.sublevel.SubLevelContainer; import dev.ryanhcode.sable.sublevel.SubLevel; import io.wispforest.endec.StructEndec; @@ -21,8 +20,8 @@ public record SubLevelFragment(UUID uuid) implements Fragment { public static final int WEIGHT = 8; @Override - public FragmentType type() { - return FragmentTypes.SUBLEVEL; + public dev.enjarai.trickster.spell.fragment.FragmentType type() { + return FragmentType.SUBLEVEL; } @Override diff --git a/src/main/java/info/shylie/testmod/spell/trick/QuerySubLevelTrick.java b/src/main/java/info/shylie/testmod/spell/trick/QuerySubLevelTrick.java new file mode 100644 index 0000000..02028cf --- /dev/null +++ b/src/main/java/info/shylie/testmod/spell/trick/QuerySubLevelTrick.java @@ -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 { + 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()); + } +} diff --git a/src/main/java/info/shylie/testmod/spell/trick/TestTrick.java b/src/main/java/info/shylie/testmod/spell/trick/TestTrick.java index 4a32532..fe30434 100644 --- a/src/main/java/info/shylie/testmod/spell/trick/TestTrick.java +++ b/src/main/java/info/shylie/testmod/spell/trick/TestTrick.java @@ -6,19 +6,18 @@ import dev.enjarai.trickster.spell.Pattern; import dev.enjarai.trickster.spell.SpellContext; import dev.enjarai.trickster.spell.blunder.BlockTooHardBlunder; 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.trick.Trick; import dev.enjarai.trickster.spell.type.Signature; import dev.ryanhcode.sable.api.SubLevelAssemblyHelper; 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 io.vavr.collection.Array; public class TestTrick extends Trick { 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) { diff --git a/src/main/java/info/shylie/testmod/spell/trick/TestTrick2.java b/src/main/java/info/shylie/testmod/spell/trick/TestTrick2.java index c600967..915a9cf 100644 --- a/src/main/java/info/shylie/testmod/spell/trick/TestTrick2.java +++ b/src/main/java/info/shylie/testmod/spell/trick/TestTrick2.java @@ -3,18 +3,22 @@ package info.shylie.testmod.spell.trick; import dev.enjarai.trickster.spell.Pattern; import dev.enjarai.trickster.spell.SpellContext; 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.VoidFragment; import dev.enjarai.trickster.spell.trick.Trick; import dev.enjarai.trickster.spell.type.Signature; +import dev.ryanhcode.sable.api.sublevel.SubLevelContainer; import dev.ryanhcode.sable.sublevel.ServerSubLevel; import info.shylie.testmod.ShylieTestMod; 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 net.minecraft.world.phys.Vec3; +import org.joml.Vector3d; import java.util.HashMap; +import java.util.List; + +import static dev.enjarai.trickster.spell.fragment.FragmentType.VECTOR; public class TestTrick2 extends Trick { private static final TickData.Key> COMPOUND_LEN = new TickData.Key<>( @@ -24,13 +28,41 @@ public class TestTrick2 extends Trick { public TestTrick2() { super( 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)); - subLevel.markRemoved(); - return VoidFragment.INSTANCE; + if ((subLevel instanceof ServerSubLevel serverSubLevel)) { + // 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); } } diff --git a/src/main/java/info/shylie/testmod/spell/trick/Tricks.java b/src/main/java/info/shylie/testmod/spell/trick/Tricks.java index efebfca..392e55f 100644 --- a/src/main/java/info/shylie/testmod/spell/trick/Tricks.java +++ b/src/main/java/info/shylie/testmod/spell/trick/Tricks.java @@ -7,6 +7,7 @@ import net.minecraft.core.Registry; public class Tricks { public static final TestTrick TEST = register("test", new TestTrick()); 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() { }