diff --git a/common/src/main/java/me/shedaniel/architectury/event/events/TextureStitchEvent.java b/common/src/main/java/me/shedaniel/architectury/event/events/TextureStitchEvent.java new file mode 100644 index 00000000..c4df3315 --- /dev/null +++ b/common/src/main/java/me/shedaniel/architectury/event/events/TextureStitchEvent.java @@ -0,0 +1,42 @@ +/* + * Copyright 2020 shedaniel + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.shedaniel.architectury.event.events; + +import me.shedaniel.architectury.event.Event; +import me.shedaniel.architectury.event.EventFactory; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.resources.ResourceLocation; + +import java.util.function.Consumer; + +@Environment(EnvType.CLIENT) +public interface TextureStitchEvent { + Event
PRE = EventFactory.createLoop(Pre.class); + EventPOST = EventFactory.createLoop(Post.class); + + @Environment(EnvType.CLIENT) + interface Pre { + void stitch(TextureAtlas atlas, Consumer spriteAdder); + } + + @Environment(EnvType.CLIENT) + interface Post { + void stitch(TextureAtlas atlas); + } +} diff --git a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinTextureAtlas.java b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinTextureAtlas.java new file mode 100644 index 00000000..44536ec1 --- /dev/null +++ b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinTextureAtlas.java @@ -0,0 +1,47 @@ +/* + * Copyright 2020 shedaniel + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.shedaniel.architectury.mixin.fabric.client; + +import me.shedaniel.architectury.event.events.TextureStitchEvent; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.profiling.ProfilerFiller; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import java.util.Set; +import java.util.stream.Stream; + +@Mixin(TextureAtlas.class) +public class MixinTextureAtlas { + @Inject(method = "prepareToStitch", + at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", ordinal = 0, + shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILHARD) + private void preStitch(ResourceManager resourceManager, Stream stream, ProfilerFiller profilerFiller, int i, CallbackInfoReturnable cir, Set set) { + TextureStitchEvent.PRE.invoker().stitch((TextureAtlas) (Object) this, set::add); + } + + @Inject(method = "reload", at = @At("RETURN")) + private void postStitch(TextureAtlas.Preparations preparations, CallbackInfo ci) { + TextureStitchEvent.POST.invoker().stitch((TextureAtlas) (Object) this); + } +} diff --git a/fabric/src/main/resources/architectury.mixins.json b/fabric/src/main/resources/architectury.mixins.json index 91aac86b..d83880ad 100644 --- a/fabric/src/main/resources/architectury.mixins.json +++ b/fabric/src/main/resources/architectury.mixins.json @@ -10,7 +10,8 @@ "client.MixinGameRenderer", "client.MixinMinecraft", "client.MixinMultiPlayerGameMode", - "client.MixinScreen" + "client.MixinScreen", + "client.MixinTextureAtlas" ], "mixins": [ "ExplosionPreInvoker", "LivingDeathInvoker", "MixinCommands", "MixinExplosion", "MixinFurnaceResultSlot", "MixinItemEntity", "MixinLivingEntity", diff --git a/forge/src/main/java/me/shedaniel/architectury/event/forge/EventHandlerImpl.java b/forge/src/main/java/me/shedaniel/architectury/event/forge/EventHandlerImpl.java index 086b21e2..68922d01 100644 --- a/forge/src/main/java/me/shedaniel/architectury/event/forge/EventHandlerImpl.java +++ b/forge/src/main/java/me/shedaniel/architectury/event/forge/EventHandlerImpl.java @@ -18,6 +18,7 @@ package me.shedaniel.architectury.event.forge; import me.shedaniel.architectury.event.EventHandler; import me.shedaniel.architectury.event.events.PlayerEvent; +import me.shedaniel.architectury.event.events.TextureStitchEvent; import me.shedaniel.architectury.event.events.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.IGuiEventListener; @@ -173,6 +174,16 @@ public class EventHandlerImpl implements EventHandler.Impl { public static void event(PlayerInteractEvent.LeftClickEmpty event) { InteractionEvent.CLIENT_LEFT_CLICK_AIR.invoker().click(event.getPlayer(), event.getHand()); } + + @SubscribeEvent + public static void event(net.minecraftforge.client.event.TextureStitchEvent.Pre event) { + TextureStitchEvent.PRE.invoker().stitch(event.getMap(), event::addSprite); + } + + @SubscribeEvent + public static void event(net.minecraftforge.client.event.TextureStitchEvent.Post event) { + TextureStitchEvent.POST.invoker().stitch(event.getMap()); + } } public static class Common { diff --git a/forge/src/main/java/me/shedaniel/architectury/forge/ArchitecturyForge.java b/forge/src/main/java/me/shedaniel/architectury/forge/ArchitecturyForge.java index 5d149e91..b66356b7 100644 --- a/forge/src/main/java/me/shedaniel/architectury/forge/ArchitecturyForge.java +++ b/forge/src/main/java/me/shedaniel/architectury/forge/ArchitecturyForge.java @@ -16,8 +16,12 @@ package me.shedaniel.architectury.forge; +import me.shedaniel.architectury.event.EventHandler; import net.minecraftforge.fml.common.Mod; @Mod("architectury") public class ArchitecturyForge { + public ArchitecturyForge() { + EventHandler.init(); + } }