VmodExtras/src/main/java/space/eptaproject/vmodextras/mixins/BlockPaletteHashMapV1Mixin....

49 lines
1.9 KiB
Java

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<BlockState> 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<BlockState> 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();
}
}
}