Przeglądaj źródła

Support loader 0.13.0

shedaniel 3 lat temu
rodzic
commit
c7d7ce5129

+ 1 - 1
fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinExplosion.java

@@ -55,7 +55,7 @@ public class MixinExplosion implements ExplosionHooksImpl.ExplosionExtensions {
     
     @Inject(method = "explode", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/Vec3;<init>(DDD)V", ordinal = 0),
             locals = LocalCapture.CAPTURE_FAILHARD)
-    private void explodePost(CallbackInfo ci, Set<BlockPos> set, float q, int r, int s, int t, int u, int v, int w, List<Entity> list) {
+    private void explodePost(CallbackInfo ci, Set<BlockPos> set, int r, float q, int s, int t, int u, int v, int w, int x, List<Entity> list) {
         ExplosionEvent.DETONATE.invoker().explode(level, (Explosion) (Object) this, list);
     }
     

+ 57 - 0
fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinGameRenderer013.java

@@ -0,0 +1,57 @@
+/*
+ * This file is part of architectury.
+ * Copyright (C) 2020, 2021, 2022 architectury
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+package me.shedaniel.architectury.mixin.fabric.client;
+
+import com.mojang.blaze3d.platform.Window;
+import com.mojang.blaze3d.vertex.PoseStack;
+import me.shedaniel.architectury.event.events.GuiEvent;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.GameRenderer;
+import net.minecraft.world.InteractionResult;
+import org.spongepowered.asm.mixin.Final;
+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.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
+
+@Mixin(value = GameRenderer.class, priority = 1100)
+public abstract class MixinGameRenderer013 {
+    @Shadow
+    @Final
+    private Minecraft minecraft;
+    
+    @Inject(method = "render(FJZ)V",
+            at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/Screen;render(Lcom/mojang/blaze3d/vertex/PoseStack;IIF)V",
+                    ordinal = 0), locals = LocalCapture.CAPTURE_FAILEXCEPTION, cancellable = true)
+    public void renderScreenPre(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, Window window, PoseStack matrices) {
+        if (GuiEvent.RENDER_PRE.invoker().render(minecraft.screen, matrices, mouseX, mouseY, minecraft.getDeltaFrameTime()) == InteractionResult.FAIL) {
+            ci.cancel();
+        }
+    }
+    
+    @Inject(method = "render(FJZ)V",
+            at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/Screen;render(Lcom/mojang/blaze3d/vertex/PoseStack;IIF)V",
+                    shift = At.Shift.AFTER, ordinal = 0), locals = LocalCapture.CAPTURE_FAILEXCEPTION)
+    public void renderScreenPost(float tickDelta, long startTime, boolean tick, CallbackInfo ci, int mouseX, int mouseY, Window window, PoseStack matrices) {
+        GuiEvent.RENDER_POST.invoker().render(minecraft.screen, matrices, mouseX, mouseY, minecraft.getDeltaFrameTime());
+    }
+}

+ 20 - 1
fabric/src/main/java/me/shedaniel/architectury/plugin/fabric/ArchitecturyMixinPlugin.java

@@ -19,7 +19,7 @@
 
 package me.shedaniel.architectury.plugin.fabric;
 
-import net.fabricmc.loader.api.FabricLoader;
+import net.fabricmc.loader.api.*;
 import org.objectweb.asm.tree.ClassNode;
 import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
 import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
@@ -39,11 +39,30 @@ public class ArchitecturyMixinPlugin implements IMixinConfigPlugin {
         return null;
     }
     
+    private boolean isLoader013() {
+        ModContainer fabricLoader = FabricLoader.getInstance().getModContainer("fabricloader")
+                .orElseThrow(() -> new IllegalStateException("Where is fabricloader?"));
+        Version version = fabricLoader.getMetadata().getVersion();
+        if (version instanceof SemanticVersion) {
+            try {
+                return version.compareTo(SemanticVersion.parse("0.13-")) >= 0;
+            } catch (VersionParsingException e) {
+                throw new IllegalStateException("Failed to parse version", e);
+            }
+        }
+        System.err.println("FabricLoader is not a SemanticVersion, cannot determine if it is >= 0.13");
+        return true;
+    }
+    
     @Override
     public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
         switch (mixinClassName) {
             case "me.shedaniel.architectury.mixin.fabric.client.MixinEffectInstance":
                 return !FabricLoader.getInstance().isModLoaded("satin");
+            case "me.shedaniel.architectury.mixin.fabric.client.MixinGameRenderer":
+                return !isLoader013();
+            case "me.shedaniel.architectury.mixin.fabric.client.MixinGameRenderer013":
+                return isLoader013();
             default:
                 return true;
         }

+ 1 - 0
fabric/src/main/resources/architectury.mixins.json

@@ -10,6 +10,7 @@
     "client.MixinDebugScreenOverlay",
     "client.MixinEffectInstance",
     "client.MixinGameRenderer",
+    "client.MixinGameRenderer013",
     "client.MixinIntegratedServer",
     "client.MixinKeyboardHandler",
     "client.MixinMinecraft",