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")
.build();
public static void handleStateCache(BlockState state) {
if(BakeReason.currentBakeReason == BakeReason.FREEZE
|| BakeReason.currentBakeReason == BakeReason.REMOTE_SNAPSHOT_INJECT
|| (BakeReason.currentBakeReason == BakeReason.LOCAL_SNAPSHOT_INJECT && ModernFix.runningFirstInjection)) {
BakeReason reason = BakeReason.getCurrentBakeReason();
if(reason == BakeReason.FREEZE
|| reason == BakeReason.REMOTE_SNAPSHOT_INJECT
|| (reason == BakeReason.LOCAL_SNAPSHOT_INJECT && ModernFix.runningFirstInjection)) {
((IBlockState)state).clearCache();
} else {
state.initCache();

View File

@ -17,31 +17,31 @@ import java.util.Map;
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)
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)
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)
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)
private static void markEmptyBakeReason2(CallbackInfo ci) {
BakeReason.currentBakeReason = null;
BakeReason.setCurrentBakeReason(null);
}
@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) {
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)
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;
import org.embeddedt.modernfix.ModernFix;
public enum BakeReason {
FREEZE,
REMOTE_SNAPSHOT_INJECT,
LOCAL_SNAPSHOT_INJECT,
REVERT;
public static BakeReason currentBakeReason = null;
REVERT,
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;
}
}