repo for my hex addons :3
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

pattern level smuggling

+84 -3
+1
project/iotaworks/build.gradle.kts
··· 41 41 breaks("hexic", "<2.0.0") 42 42 43 43 entrypoint("org.eu.net.pool.iotaworks.main\$package::init") 44 + mixins("iotaworks.mixins.json") 44 45 } 45 46 } 46 47 }
+10
project/iotaworks/src/main/resources/iotaworks.mixins.json
··· 1 + { 2 + "required": true, 3 + "minVersion": "0.8", 4 + "package": "org.eu.net.pool.iotaworks.mixin", 5 + "compatibilityLevel": "JAVA_17", 6 + "mixins": [ 7 + "HexPatternMixin", 8 + "HexPattern$CompanionMixin" 9 + ] 10 + }
+17 -1
project/iotaworks/src/main/scala/org/eu/net/pool/iotaworks/main.scala
··· 3 3 4 4 import at.petrak.hexcasting.api.casting.eval.vm.{CastingImage, CastingVM, SpellContinuation} 5 5 import at.petrak.hexcasting.api.casting.eval.{CastResult, CastingEnvironment, ResolvedPatternType} 6 - import at.petrak.hexcasting.api.casting.iota.{GarbageIota, Iota, IotaType, PatternIota, Vec3Iota} 6 + import at.petrak.hexcasting.api.casting.iota.{GarbageIota, Iota, IotaType, PatternIota, DoubleIota, Vec3Iota} 7 7 import at.petrak.hexcasting.api.casting.math.HexPattern 8 8 import at.petrak.hexcasting.api.casting.mishaps.Mishap 9 9 import at.petrak.hexcasting.api.casting.mishaps.Mishap.Context ··· 23 23 private[iotaworks] given Logger = LoggerFactory.getLogger("iotaworks") 24 24 private[iotaworks] given Conversion[String, Identifier] = Identifier.of("iotaworks", _) 25 25 given IotaType[PropertyIota] = PropertyIota.TYPE 26 + given IotaType[PatternIota] = PatternIota.TYPE 26 27 27 28 abstract case class AbstractMetatableIota(iotaType: MetatableIotaType & Singleton, userdata: Iota, override val display: Text, metatable: String, readonlyMetatable: Boolean) extends Iota(iotaType, (userdata, display, metatable, readonlyMetatable)): 28 29 override def subIotas(): lang.Iterable[Iota] = util.List.of(userdata) ··· 77 78 val colors: Map[(Int, Int, Int), MetatableIotaType] = (for r <- validValues; g <- validValues; b <- validValues yield (r, g, b) -> MetatableIotaType((r << 20) | (r << 16) | (g << 12) | (g << 8) | (b << 4) | b)).toMap 78 79 println(s"Metatables: $colors") 79 80 81 + trait HexPatternAccessor: 82 + var depth: Int 83 + 80 84 def init() = 81 85 for ((_, c), i) <- MetatableIotaType.colors.zipWithIndex do iotaTypeRegistry(s"meta/$i") = c 82 86 Patterns.register("metatable", se"deaqqwqqqeaeqqqeadedaqaaee"): ··· 91 95 Seq: 92 96 val ty = MetatableIotaType.colors((r * 3, g * 3, b * 3)) 93 97 ty.Instance(userdata, display.display, metatable.getName, metatable.getReadonly) 98 + Patterns.register("set_subscript", w"eeedewa"): 99 + Patterns.mkConstAction(2): 100 + case Seq(isIota[PatternIota, 1](pat), isIota[DoubleIota, 0](num)) => 101 + // TODO: this should use iotaInt 102 + val realPat = pat.getPattern 103 + val pat2 = HexPattern(realPat.getStartDir, realPat.getAngles) 104 + pat2.asInstanceOf[HexPatternAccessor].depth = realPat.asInstanceOf[HexPatternAccessor].depth + num.getDouble.toInt 105 + Seq(PatternIota(pat2)) 106 + Patterns.register("get_subscript", nw"dwqaqqq"): 107 + Patterns.mkConstAction(1): 108 + case Seq(isIota[PatternIota, 0](pat)) => 109 + Seq(DoubleIota(pat.getPattern.asInstanceOf[HexPatternAccessor].depth)) 94 110 PhEvents.registryLookup.register: 95 111 case (r, i) if r == hexXplat.getIotaTypeRegistry && i.getNamespace == "hexic" && i.getPath.startsWith("meta/") => r(i.getPath) 96 112 PhEvents.beforePatternExecute.register:
+35
project/iotaworks/src/main/scala/org/eu/net/pool/iotaworks/mixin/HexPattern$CompanionMixin.java
··· 1 + package org.eu.net.pool.iotaworks.mixin; 2 + 3 + import org.eu.net.pool.iotaworks.HexPatternAccessor; 4 + 5 + import org.spongepowered.asm.mixin.Mixin; 6 + import org.spongepowered.asm.mixin.Mutable; 7 + import org.spongepowered.asm.mixin.Shadow; 8 + import org.spongepowered.asm.mixin.injection.Inject; 9 + import org.spongepowered.asm.mixin.injection.At; 10 + 11 + import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; 12 + import com.llamalad7.mixinextras.injector.wrapoperation.Operation; 13 + import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; 14 + import com.llamalad7.mixinextras.sugar.Local; 15 + import com.mojang.datafixers.util.Either; 16 + import com.mojang.serialization.Codec; 17 + import com.mojang.serialization.codecs.RecordCodecBuilder; 18 + 19 + import at.petrak.hexcasting.api.casting.math.HexPattern; 20 + import net.minecraft.nbt.NbtCompound; 21 + 22 + @Mixin(HexPattern.Companion.class) 23 + class HexPattern$CompanionMixin { 24 + @WrapMethod(method = "fromNBT") 25 + public HexPattern fromNBT(NbtCompound c, Operation<HexPattern> original) { 26 + // see stupid reasoning in HexPatternMixin 27 + if (c.get("parent") instanceof NbtCompound c1) { 28 + HexPattern p = original.call(c1); 29 + ((HexPatternAccessor) (Object) p).depth_$eq(c.getInt("level")); 30 + return p; 31 + } else { 32 + return original.call(c); 33 + } 34 + } 35 + }
+21 -2
project/iotaworks/src/main/scala/org/eu/net/pool/iotaworks/mixin/HexPatternMixin.java
··· 1 1 package org.eu.net.pool.iotaworks.mixin; 2 2 3 + import org.eu.net.pool.iotaworks.HexPatternAccessor; 4 + 3 5 import org.spongepowered.asm.mixin.Mixin; 6 + import org.spongepowered.asm.mixin.Mutable; 7 + import org.spongepowered.asm.mixin.Shadow; 4 8 import org.spongepowered.asm.mixin.injection.Inject; 5 9 import org.spongepowered.asm.mixin.injection.At; 6 10 11 + import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; 7 12 import com.llamalad7.mixinextras.injector.wrapoperation.Operation; 8 13 import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; 9 14 import com.llamalad7.mixinextras.sugar.Local; ··· 15 20 import net.minecraft.nbt.NbtCompound; 16 21 17 22 @Mixin(HexPattern.class) 18 - public class HexPatternMixin { 23 + public class HexPatternMixin implements HexPatternAccessor { 19 24 private int depth = 0; 20 - @WrapOperation(method = "<clinit>", at = @At(value = "FIELD", opcode = 179)) 25 + public int depth() { return depth; } 26 + public void depth_$eq(int depth) { this.depth = depth; } 27 + 28 + @Shadow @Mutable public static Codec CODEC = null; // we don't actually use this field, but we need to @Mutable it so the wrapop can use it 29 + 30 + @WrapOperation(method = "<clinit>", at = @At(value = "FIELD", opcode = 179, ordinal = 1)) 21 31 private static void wrapCodec(Codec<HexPattern> codec, Operation<Void> original) { 22 32 original.call(Codec.<HexPattern, HexPattern>either(RecordCodecBuilder.create(b -> 23 33 b.<HexPattern, Integer>group( ··· 33 43 e.ifRight(v -> { value[0] = v; }); 34 44 return value[0]; 35 45 }, Either::left)); 46 + } 47 + 48 + @WrapMethod(method = "serializeToNBT") 49 + private NbtCompound wrapSerialize(Operation<NbtCompound> original) { 50 + // ideally we'd just shove it into the compound, but codecs can't do that 51 + NbtCompound c = new NbtCompound(); 52 + c.put("parent", original.call()); 53 + c.putInt("level", depth); 54 + return c; 36 55 } 37 56 }