Explorar o código

Fix #94

Signed-off-by: shedaniel <daniel@shedaniel.me>
shedaniel %!s(int64=4) %!d(string=hai) anos
pai
achega
d737e8e2b7

+ 57 - 0
forge/src/main/java/me/shedaniel/architectury/mixin/forge/MixinClientLevel.java

@@ -0,0 +1,57 @@
+/*
+ * This file is part of architectury.
+ * Copyright (C) 2020, 2021 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.forge;
+
+import me.shedaniel.architectury.event.events.client.ClientTickEvent;
+import net.minecraft.client.multiplayer.ClientLevel;
+import net.minecraft.resources.ResourceKey;
+import net.minecraft.util.profiling.ProfilerFiller;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.dimension.DimensionType;
+import net.minecraft.world.level.storage.WritableLevelData;
+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 java.util.function.Supplier;
+
+@Mixin(ClientLevel.class)
+public abstract class MixinClientLevel extends Level {
+    protected MixinClientLevel(WritableLevelData worldInfo, ResourceKey<Level> dimension, DimensionType dimensionType, Supplier<ProfilerFiller> profiler, boolean isRemote, boolean isDebug, long seed) {
+        super(worldInfo, dimension, dimensionType, profiler, isRemote, isDebug, seed);
+    }
+    
+    @Inject(method = "tickEntities", at = @At("HEAD"))
+    private void tickEntities(CallbackInfo ci) {
+        ProfilerFiller profiler = getProfiler();
+        profiler.push("architecturyClientLevelPreTick");
+        ClientTickEvent.CLIENT_WORLD_PRE.invoker().tick((ClientLevel) (Object) this);
+        profiler.pop();
+    }
+    
+    @Inject(method = "tickEntities", at = @At("RETURN"))
+    private void tickEntitiesPost(CallbackInfo ci) {
+        ProfilerFiller profiler = getProfiler();
+        profiler.push("architecturyClientLevelPostTick");
+        ClientTickEvent.CLIENT_WORLD_POST.invoker().tick((ClientLevel) (Object) this);
+        profiler.pop();
+    }
+}

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

@@ -15,6 +15,7 @@
     "GameRulesAccessor$IntegerValueSimple",
     "MixinBlockEntity",
     "MixinBlockEntityExtension",
+    "MixinClientLevel",
     "MixinItemExtension",
     "MixinRegistryEntry",
     "MobSpawnSettingsBuilderAccessor"

+ 8 - 0
testmod-common/src/main/java/me/shedaniel/architectury/test/events/DebugEvents.java

@@ -235,6 +235,14 @@ public class DebugEvents {
     
     @Environment(EnvType.CLIENT)
     public static void debugEventsClient() {
+        ClientTickEvent.CLIENT_WORLD_PRE.register(instance -> {
+            try {
+                // Uncomment the following line to see the profiler spike for root.tick.level.architecturyClientLevelPreTick
+                //Thread.sleep(10);
+            } catch (Throwable e) {
+                e.printStackTrace();
+            }
+        });
         ClientChatEvent.CLIENT.register(message -> {
             SINK.accept("Client chat sent: " + message);
             return InteractionResultHolder.pass(message);