Make BakeReason more resilient

This commit is contained in:
embeddedt 2023-01-12 21:32:19 -05:00
parent 8e514a68ee
commit 9e3ae9d8c0
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
3 changed files with 28 additions and 11 deletions

View File

@ -26,9 +26,10 @@ public class BlockStateCacheHandler {
.add("extrastorage") .add("extrastorage")
.build(); .build();
public static void handleStateCache(BlockState state) { public static void handleStateCache(BlockState state) {
if(BakeReason.currentBakeReason == BakeReason.FREEZE BakeReason reason = BakeReason.getCurrentBakeReason();
|| BakeReason.currentBakeReason == BakeReason.REMOTE_SNAPSHOT_INJECT if(reason == BakeReason.FREEZE
|| (BakeReason.currentBakeReason == BakeReason.LOCAL_SNAPSHOT_INJECT && ModernFix.runningFirstInjection)) { || reason == BakeReason.REMOTE_SNAPSHOT_INJECT
|| (reason == BakeReason.LOCAL_SNAPSHOT_INJECT && ModernFix.runningFirstInjection)) {
((IBlockState)state).clearCache(); ((IBlockState)state).clearCache();
} else { } else {
state.initCache(); state.initCache();

View File

@ -17,31 +17,31 @@ import java.util.Map;
public class GameDataMixin { public class GameDataMixin {
@Inject(method = "freezeData", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/BiMap;forEach(Ljava/util/function/BiConsumer;)V", ordinal = 1), remap = false) @Inject(method = "freezeData", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/BiMap;forEach(Ljava/util/function/BiConsumer;)V", ordinal = 1), remap = false)
private static void markFreezeBakeReason(CallbackInfo ci) { private static void markFreezeBakeReason(CallbackInfo ci) {
BakeReason.currentBakeReason = BakeReason.FREEZE; BakeReason.setCurrentBakeReason(BakeReason.FREEZE);
} }
@Inject(method = "freezeData", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/registries/GameData;fireRemapEvent(Ljava/util/Map;Z)V"), remap = false) @Inject(method = "freezeData", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/registries/GameData;fireRemapEvent(Ljava/util/Map;Z)V"), remap = false)
private static void markEmptyBakeReason1(CallbackInfo ci) { private static void markEmptyBakeReason1(CallbackInfo ci) {
BakeReason.currentBakeReason = null; BakeReason.setCurrentBakeReason(null);
} }
@Inject(method = "revertTo", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/BiMap;forEach(Ljava/util/function/BiConsumer;)V", ordinal = 1), remap = false) @Inject(method = "revertTo", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/BiMap;forEach(Ljava/util/function/BiConsumer;)V", ordinal = 1), remap = false)
private static void markRevertBakeReason(CallbackInfo ci) { private static void markRevertBakeReason(CallbackInfo ci) {
BakeReason.currentBakeReason = BakeReason.REVERT; BakeReason.setCurrentBakeReason(BakeReason.REVERT);
} }
@Inject(method = "revertTo", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/BiMap;forEach(Ljava/util/function/BiConsumer;)V", ordinal = 1, shift = At.Shift.AFTER), remap = false) @Inject(method = "revertTo", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/BiMap;forEach(Ljava/util/function/BiConsumer;)V", ordinal = 1, shift = At.Shift.AFTER), remap = false)
private static void markEmptyBakeReason2(CallbackInfo ci) { private static void markEmptyBakeReason2(CallbackInfo ci) {
BakeReason.currentBakeReason = null; BakeReason.setCurrentBakeReason(null);
} }
@Inject(method = "injectSnapshot", at = @At("HEAD"), remap = false) @Inject(method = "injectSnapshot", at = @At("HEAD"), remap = false)
private static void markSnapshotInjectBakeReason(Map<ResourceLocation, ForgeRegistry.Snapshot> snapshot, boolean injectFrozenData, boolean isLocalWorld, CallbackInfoReturnable<Multimap<ResourceLocation, ResourceLocation>> cir) { private static void markSnapshotInjectBakeReason(Map<ResourceLocation, ForgeRegistry.Snapshot> snapshot, boolean injectFrozenData, boolean isLocalWorld, CallbackInfoReturnable<Multimap<ResourceLocation, ResourceLocation>> cir) {
BakeReason.currentBakeReason = isLocalWorld ? BakeReason.LOCAL_SNAPSHOT_INJECT : BakeReason.REMOTE_SNAPSHOT_INJECT; BakeReason.setCurrentBakeReason(isLocalWorld ? BakeReason.LOCAL_SNAPSHOT_INJECT : BakeReason.REMOTE_SNAPSHOT_INJECT);
} }
@Inject(method = "injectSnapshot", at = @At("RETURN"), remap = false) @Inject(method = "injectSnapshot", at = @At("RETURN"), remap = false)
private static void markEmptyBakeReason2(Map<ResourceLocation, ForgeRegistry.Snapshot> snapshot, boolean injectFrozenData, boolean isLocalWorld, CallbackInfoReturnable<Multimap<ResourceLocation, ResourceLocation>> cir) { private static void markEmptyBakeReason2(Map<ResourceLocation, ForgeRegistry.Snapshot> snapshot, boolean injectFrozenData, boolean isLocalWorld, CallbackInfoReturnable<Multimap<ResourceLocation, ResourceLocation>> cir) {
BakeReason.currentBakeReason = null; BakeReason.setCurrentBakeReason(null);
} }
} }

View File

@ -1,9 +1,25 @@
package org.embeddedt.modernfix.util; package org.embeddedt.modernfix.util;
import org.embeddedt.modernfix.ModernFix;
public enum BakeReason { public enum BakeReason {
FREEZE, FREEZE,
REMOTE_SNAPSHOT_INJECT, REMOTE_SNAPSHOT_INJECT,
LOCAL_SNAPSHOT_INJECT, LOCAL_SNAPSHOT_INJECT,
REVERT; REVERT,
public static BakeReason currentBakeReason = null; UNKNOWN;
private static BakeReason currentBakeReason = null;
private static boolean bakeReasonWarned = false;
public static BakeReason getCurrentBakeReason() {
if(currentBakeReason == null && !bakeReasonWarned) {
ModernFix.LOGGER.warn("No bake reason found, mixin probably not applied correctly", new IllegalStateException());
bakeReasonWarned = false;
}
return currentBakeReason;
}
public static void setCurrentBakeReason(BakeReason reason) {
currentBakeReason = reason;
}
} }