diff --git a/forge/src/main/java/me/shedaniel/architectury/mixin/forge/MixinClientLevel.java b/forge/src/main/java/me/shedaniel/architectury/mixin/forge/MixinClientLevel.java new file mode 100644 index 00000000..84ed32ea --- /dev/null +++ b/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 dimension, DimensionType dimensionType, Supplier 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(); + } +} diff --git a/forge/src/main/resources/architectury.mixins.json b/forge/src/main/resources/architectury.mixins.json index c8711807..e72ebe62 100644 --- a/forge/src/main/resources/architectury.mixins.json +++ b/forge/src/main/resources/architectury.mixins.json @@ -15,6 +15,7 @@ "GameRulesAccessor$IntegerValueSimple", "MixinBlockEntity", "MixinBlockEntityExtension", + "MixinClientLevel", "MixinItemExtension", "MixinRegistryEntry", "MobSpawnSettingsBuilderAccessor" diff --git a/testmod-common/src/main/java/me/shedaniel/architectury/test/events/DebugEvents.java b/testmod-common/src/main/java/me/shedaniel/architectury/test/events/DebugEvents.java index ccf7d52a..3673b811 100644 --- a/testmod-common/src/main/java/me/shedaniel/architectury/test/events/DebugEvents.java +++ b/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);