diff --git a/build.gradle.kts b/build.gradle.kts index 8349d56..f58de61 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -223,6 +223,8 @@ allprojects { "com.github.LlamaLad7", "com.github.Virtuoel", "com.github.mattidragon") + exactRepo("https://maven.bawnorton.com/releases", + "com.github.bawnorton.mixinsquared") exactRepo("https://maven.blamejared.com/", "at.petra-k", "com.samsthenerd.inline", diff --git a/project/hexic/build.gradle.kts b/project/hexic/build.gradle.kts index 58c7c7a..ddc9fc7 100644 --- a/project/hexic/build.gradle.kts +++ b/project/hexic/build.gradle.kts @@ -139,6 +139,7 @@ dependencies { val minecraft_version = "1.20.1" implementation(annotationProcessor("io.github.llamalad7:mixinextras-fabric:0.5.0")!!) + include(implementation(annotationProcessor("com.github.bawnorton.mixinsquared:mixinsquared-fabric:0.3.7-beta.2")!!)!!) implementation(project(":util", "namedElements")) modImplementation("io.github.tropheusj:serialization-hooks:0.4.99999") modImplementation("at.petra-k.hexcasting:hexcasting-fabric-$minecraft_version:0.11.3") @@ -176,6 +177,8 @@ dependencies { modRuntimeOnly("com.unascribed:lib39-avant:[2.0.0,3.0.0)!!2.0.27+1.20.1") modRuntimeOnly("com.unascribed:lib39-phantom:[2.0.0,3.0.0)!!2.0.27+1.20.1") modRuntimeOnly("com.unascribed:lib39-lockpick:[2.0.0,3.0.0)!!2.0.27+1.20.1") + modImplementation("maven.modrinth:fractal-lib:1.2.0") + include("maven.modrinth:fractal-lib:1.2.0") modLocalRuntime("gay.object.hexdebug:hexdebug-fabric:0.5.0+1.20.1-SNAPSHOT") modCompileOnly("maven.modrinth:hexcessible:0.2.0") modLocalRuntime("maven.modrinth:hexcessible:0.2.0") @@ -223,6 +226,7 @@ tasks.processResources { depends("mixinextras", "*") depends("mm", "^2.3") depends("moreiotas", ">=0.1.1") + depends("fractal", "^1.2.0") depends("hexal", ">=0.3.0") depends("hexcellular", "^1.1.0") depends("jsonpatcher", "^1.0.0-beta.4+mc.1.20.1") diff --git a/project/hexic/src/client/resources/hexic.client.mixins.json b/project/hexic/src/client/resources/hexic.client.mixins.json index e890ea5..a051b83 100644 --- a/project/hexic/src/client/resources/hexic.client.mixins.json +++ b/project/hexic/src/client/resources/hexic.client.mixins.json @@ -7,6 +7,7 @@ "ChatHudMixin", "ChatScreenAccess", "ChatScreenMixin", + "CreativeInventoryScreenAddTabsMixinMixin", "EntityRendererDispatcher", "PlayerEntityRendererMixin" ], diff --git a/project/hexic/src/client/scala/org/eu/net/pool/hexic/client.scala b/project/hexic/src/client/scala/org/eu/net/pool/hexic/client.scala index f195d0d..7f6a76f 100644 --- a/project/hexic/src/client/scala/org/eu/net/pool/hexic/client.scala +++ b/project/hexic/src/client/scala/org/eu/net/pool/hexic/client.scala @@ -95,6 +95,7 @@ object ClientHooks: else false def init(): Unit = + clientPlayerGetter = () => Option(client.player) BlockEntityRendererFactories.register( Registries.BLOCK_ENTITY_TYPE("chisel_table").asInstanceOf[BlockEntityType[? <: BlockEntity { val bits: BitSet }]], ctx => (tbl: BlockEntity { val bits: BitSet }, dt, mats, bufs, light, overlay) => @@ -497,6 +498,12 @@ def datagen(gen: FabricDataGenerator): Unit = gen.add("hexcasting.mishap.bad_item.hexic:erase", "a casting item or iota holder") gen.add("hexic.bad_metatable", "Expected a map in the §a%s§r property but got %s") gen.add("itemGroup.hexic.group", "Hexic") + gen.add("itemGroup.hexic.sub.utils", "Utility") + gen.add("itemGroup.hexic.sub.cosmetic", "Cosmetic") + gen.add("itemGroup.hexic.sub.wip", "WIP") + gen.add("itemGroup.hexic.sub.utils.tab", "Hexic Utilities") + gen.add("itemGroup.hexic.sub.cosmetic.tab", "Hexic Cosmetics") + gen.add("itemGroup.hexic.sub.wip.tab", "Hexic WIP Items") gen.add("text.hexic.or_map", "%s or map") for (color, item) <- Mediaweave.colors do @@ -513,9 +520,8 @@ def datagen(gen: FabricDataGenerator): Unit = gen.add(wizard, "Wizard") gen.add(CastingEngine, "Casting Engine") val hexLang = Seq("hexcasting", "oneironaut").flatMap(mod => Gson().fromJson(InputStreamReader(getClass.getResourceAsStream(s"/assets/$mod/lang/en_us.json")), new TypeToken[java.util.Map[String, String]]() {}).asScala).toMap - Registries.ITEM.forEach: - case p: PigmentItem => gen.add("item.hexic.stringworm." + p.getTranslationKey, "Shimmering " + hexLang(p.getTranslationKey).replace("Pigment", "Stringworm")) - case e => println(e) + for case p: PigmentItem <- Registries.ITEM do + gen.add("item.hexic.stringworm." + p.getTranslationKey, "Shimmering " + hexLang(p.getTranslationKey).replace("Pigment", "Stringworm")) for page -> text <- Vector( "dye_offpaw" -> "Imbues the item held in my offhand (e.g. a $(l:items/hexcasting)$(item)casting item/$) with the given pigment.", "erase" -> "Erases the _Hex or iota contained within a dropped item or block. Costs one dust per item.", diff --git a/project/hexic/src/client/scala/org/eu/net/pool/hexic/mixin/CreativeInventoryScreenAddTabsMixinMixin.java b/project/hexic/src/client/scala/org/eu/net/pool/hexic/mixin/CreativeInventoryScreenAddTabsMixinMixin.java new file mode 100644 index 0000000..e6a4790 --- /dev/null +++ b/project/hexic/src/client/scala/org/eu/net/pool/hexic/mixin/CreativeInventoryScreenAddTabsMixinMixin.java @@ -0,0 +1,32 @@ +package org.eu.net.pool.hexic.mixin; + +import com.bawnorton.mixinsquared.TargetHandler; +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; +import net.minecraft.item.ItemGroup; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.text.TranslatableTextContent; +import org.eu.net.pool.hexic.Interop; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(value=CreativeInventoryScreen.class, priority=1050) +public class CreativeInventoryScreenAddTabsMixinMixin { + @Shadow private static ItemGroup selectedTab; + + @ModifyArg(method = "@MixinSquared:Handler", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawText(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/text/Text;IIIZ)I", ordinal = 0)) + @TargetHandler(mixin = "de.dafuqs.fractal.mixin.client.CreativeInventoryScreenAddTabsMixin", name = "fractal$render") + Text modifyDisplayName(Text text, @Local LocalRef child) { + if (child.get() != null && child.get().getDisplayName().getContent() instanceof TranslatableTextContent ttc && ttc.getKey().startsWith("itemGroup.hexic.sub.")) { + child.set(null); + return Text.translatable(ttc.getKey() + ".tab"); + } else { + return text; + } + } +} diff --git a/project/hexic/src/main/scala/org/eu/net/pool/hexic/Interop.java b/project/hexic/src/main/scala/org/eu/net/pool/hexic/Interop.java index defd9b5..8562178 100644 --- a/project/hexic/src/main/scala/org/eu/net/pool/hexic/Interop.java +++ b/project/hexic/src/main/scala/org/eu/net/pool/hexic/Interop.java @@ -45,6 +45,10 @@ public class Interop extends BlockPos { public static ArgumentType> reat(CommandRegistryAccess registryAccess, RegistryKey> registry) { return new RegistryEntryArgumentType<>(registryAccess, registry); } + + public static void perhapsBreakpoint () { + int x = 1; + } public static void callScala(CallbackInfo ci, Consumer> body) { boundary.Label label = new boundary.Label<>(); diff --git a/project/hexic/src/main/scala/org/eu/net/pool/hexic/main.scala b/project/hexic/src/main/scala/org/eu/net/pool/hexic/main.scala index c59479e..2ba1537 100644 --- a/project/hexic/src/main/scala/org/eu/net/pool/hexic/main.scala +++ b/project/hexic/src/main/scala/org/eu/net/pool/hexic/main.scala @@ -114,7 +114,7 @@ import scala.math.Ordered.orderingToOrdered import scala.util.CommandLineParser.FromString import scala.util.boundary.Label import at.petrak.hexcasting.api.casting.eval.vm.ContinuationFrame.Type -import at.petrak.hexcasting.api.item.{IotaHolderItem, MediaHolderItem} +import at.petrak.hexcasting.api.item.{IotaHolderItem, MediaHolderItem, PigmentItem} import at.petrak.hexcasting.api.misc.MediaConstants import at.petrak.hexcasting.common.casting.actions.eval.OpEval import at.petrak.hexcasting.common.items.magic.{ItemMediaHolder, ItemPackagedHex} @@ -170,6 +170,7 @@ import at.petrak.hexcasting.api.casting.mishaps.circle.MishapNoSpellCircle import at.petrak.hexcasting.client.RegisterClientStuff import at.petrak.hexcasting.common.blocks.BlockQuenchedAllay import at.petrak.hexcasting.interop.inline.InlinePatternData +import de.dafuqs.fractal.api.ItemSubGroup import dev.emi.trinkets.api import dev.emi.trinkets.api.{Trinket, TrinketComponent, TrinketEnums, TrinketsApi} import net.beholderface.oneironaut.casting.iotatypes.DimIota @@ -938,6 +939,7 @@ class Event[T, R](default: T => R) extends (T => R): current = fn.applyOrElse(_, old) val useItemEvent = Event[(Item, ItemUsageContext, ItemUsageContext => ActionResult), ActionResult](p => p._3(p._2)) +private[hexic] var clientPlayerGetter = () => (None: Option[PlayerEntity]) trait HasCodec: def getCodec: Codec[? <: this.type] @@ -948,18 +950,50 @@ class DeferMut[T](initial: => T): def apply() = value() def update(x: => T): Unit = value = () => x -lazy val itemGroup = FabricItemGroup.builder() - .icon(() => new ItemStack(stringworms("media"))) - .displayName(Text.translatable("itemGroup.hexic.group")) - .entries: (ctx, entries) => - for c <- DyeColor.values do - entries.add(Mediaweave.colors(c)) - entries.add(MediaBundle(c, 6)) - // entries.add(MediaBundle(c, 12)) - entries.add(Pen.instances(c)) - for f <- Stringworm.flavors do - entries.add(stringworms(f)) - .build() +object ItemGroups: + val root = FabricItemGroup.builder() + .icon(() => new ItemStack(stringworms("media"))) + .displayName(Text.translatable("itemGroup.hexic.group")) + .noRenderedName() + .entries: (ctx, entries) => + // these shouldn't be actually visible in-game + entries.add(wizard) + for c <- DyeColor.values do entries.add(Mediaweave.colors(c)) + for c <- DyeColor.values do entries.add(MediaBundle(c, 6)) + for c <- DyeColor.values do entries.add(MediaBundle(c, 12)) + for c <- DyeColor.values do entries.add(Pen.instances(c)) + for f <- Stringworm.flavors do entries.add(stringworms(f)) + for player <- clientPlayerGetter(); uuid = player.getUuid; case p: PigmentItem <- Registries.ITEM do + val stack = ItemStack(dyedStringworm) + val pigment = FrozenPigment(ItemStack(p), uuid) + stack.getOrCreateNbt().put("pigment", pigment.serializeToNBT) + entries.add(stack) + entries.add(Registries.ITEM.get("chisel")) + entries.add(Registries.ITEM.get("chisel_table")) + .build() + val utils = ItemSubGroup.Builder(root, "utils", Text.translatable("itemGroup.hexic.sub.utils")) + .entries: (ctx, entries) => + for c <- DyeColor.values do entries.add(Mediaweave.colors(c)) + for c <- DyeColor.values do entries.add(MediaBundle(c, 6)) + for c <- DyeColor.values do entries.add(MediaBundle(c, 12)) + .build() + val cosmetic = ItemSubGroup.Builder(root, "cosmetic", Text.translatable("itemGroup.hexic.sub.cosmetic")) + .entries: (ctx, entries) => + for c <- DyeColor.values do entries.add(Mediaweave.colors(c)) + for f <- Stringworm.flavors do entries.add(stringworms(f)) + for player <- clientPlayerGetter(); uuid = player.getUuid; case p: PigmentItem <- Registries.ITEM do + val stack = ItemStack(dyedStringworm) + val pigment = FrozenPigment(ItemStack(p), uuid) + stack.getOrCreateNbt().put("pigment", pigment.serializeToNBT) + entries.add(stack) + .build() + val wip = Option.when(isDev): + ItemSubGroup.Builder(root, "wip", Text.translatable("itemGroup.hexic.sub.wip")) + .entries: (ctx, entries) => + entries.add(Registries.ITEM.get("chisel")) + entries.add(Registries.ITEM.get("chisel_table")) + for c <- DyeColor.values do entries.add(Pen.instances(c)) + .build() val goodModulo = ne"daawdda" val getEntity: PartialFunction[Iota, Entity] = { case e: EntityIota => e.getEntity } @@ -1140,7 +1174,7 @@ def init(): Unit = case _ => ActionResult.PASS Registries.BLOCK("chisel_table") = table Registries.ITEM("chisel_table") = BlockItem(table, Item.Settings()) - Registries.ITEM_GROUP("group") = itemGroup + Registries.ITEM_GROUP("group") = ItemGroups.root //Registries.ITEM("echo") = EchoItem initChat() initMacros()