#modloaded astralsorcery #loader mixin #sideonly client import native.hellfirepvp.astralsorcery.common.tile.TileAttunementRelay; import native.net.minecraft.client.Minecraft; import native.net.minecraft.client.renderer.GlStateManager; import native.net.minecraft.client.renderer.RenderHelper; import native.net.minecraft.client.renderer.block.model.ItemCameraTransforms; import native.net.minecraft.item.ItemStack; import native.net.minecraft.util.math.MathHelper; import mixin.CallbackInfo; // Replace TESRAttunementRelay's item rendering so TEISR items (e.g., DivineRPG statues) render correctly #mixin {targets: "hellfirepvp.astralsorcery.client.render.tile.TESRAttunementRelay"} zenClass MixinTESRAttunementRelay_RenderFix { #mixin Inject #{ # method: "render", # at: { value: "HEAD" }, # cancellable: true #} function replaceRender(te as TileAttunementRelay, x as double, y as double, z as double, partialTicks as float, destroyStage as int, alpha as float, ci as CallbackInfo) as void { // Replicate original slot checks; if empty, suppress original render too val inv = te.getInventoryHandler(); if (inv == null) { ci.cancel(); return; } val stack as ItemStack = inv.getStackInSlot(0); if (stack.isEmpty()) { ci.cancel(); return; } GlStateManager.pushMatrix(); // Slow spin based on ticks + partialTicks val PI as double = 3.1415927; // Math.PI val t as double = (te.getTicksExisted() as double + partialTicks) % 360.0; val angle as float = ((t * 2.0) % 360.0) as float; val bob as float = MathHelper.sin((t / 10.0) % (2 * PI)) * 0.03; GlStateManager.translate(x + 0.5, y + 0.6, z + 0.5); GlStateManager.rotate(angle, 0.0, 1.0, 0.0); GlStateManager.scale(0.625, 0.625, 0.625); RenderHelper.enableStandardItemLighting(); Minecraft.getMinecraft().getRenderItem().renderItem(stack, ItemCameraTransforms.TransformType.FIXED); RenderHelper.disableStandardItemLighting(); GlStateManager.popMatrix(); // Fully replace original method body ci.cancel(); } }