package space.eptaproject.vmodextras.mixins; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.CrudeIncrementalIntIdentityHashBiMap; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.registries.ForgeRegistries; import net.spaceeye.valkyrien_ship_schematics.containers.v1.BlockPaletteHashMapV1; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import space.eptaproject.vmodextras.IValidator; import space.eptaproject.vmodextras.Validator; @Mixin(BlockPaletteHashMapV1.class) public class BlockPaletteHashMapV1Mixin { @Unique public final IValidator validator = new Validator(); @Shadow private @Mutable CrudeIncrementalIntIdentityHashBiMap statePaletteMap; @Inject(method = "fromId", at = @At("RETURN"), remap = false, cancellable = true) private void vmodaddon$fromId(int id, CallbackInfoReturnable cir) { BlockState blockState = (BlockState)this.statePaletteMap.byId(id); if (blockState == null || blockState.isAir()) { return; } Block block = blockState.getBlock(); ResourceLocation location = ForgeRegistries.BLOCKS.getKey(block); CallbackInfoReturnable info = new CallbackInfoReturnable<>("blockstate-validator", true); try { validator.valid(block, location, info); } catch (Exception e) { Validator.LOGGER.error("Error validating: {}", location, e); } if (info.isCancelled()) { cir.setReturnValue(info.getReturnValue()); cir.cancel(); } } }