Files
meatballcraft/scripts/mixin/AedialClientVSServer/AstralRelayHaloClient.txt
T
Alexander 5788c5a938 0.18.6.4 (reconstructed from the official server pack)
Upstream released 0.18.6.4 on CurseForge (Aug 16 2026) but never committed
it; GitHub main is still at e80fcdfd (0.18.6.3, Aug 9). Reconstructed here
the same way 0.18.5-hotfix2 was.

Source: Meatballcraft-Server-prerelease-0.18.6.4.zip (the official server
pack), NOT a played instance. An earlier attempt sourced from the local
Prism instance showed 842 changed files; almost all of that was runtime
drift from a played world. The pristine zip gives 27.

  config/, scripts/, pillar/, structures/, AlternativeConfigs/
      <- server pack (pristine)
  resources/            <- Prism instance (client-only, absent from the
                           server pack; unchanged apart from one new model)
  manifest.json, modlist.html
      <- Prism instance flame/ metadata (client pack files, version
         prerelease-0.18.6.4, 374 mods)

The server pack ships CRLF; this repo is LF. Line endings were normalised
to LF so the diff carries content only - the raw copy was 4613 files and
1.08M lines of pure CRLF churn.

Notable: upstream now ships the three AedialClientVSServer client mixin
scripts renamed .zs -> .txt (disabled), which is the same change the
hotfix2 reconstruction made independently. Git records them as R100.

Not reconstructed:
- modlist_files.txt, left at 0.18.6.3. The server pack lists 398 server
  jars; this file holds 364 client entries and its provenance is unclear,
  so writing the server list would be wrong.
- Deletions outside scripts/. The server pack omits client-only mods, so
  absence there does not imply removal from the pack. scripts/ is fully
  present server-side and was checked: the three renames above were the
  only stale files.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 13:11:39 +02:00

144 lines
5.7 KiB
Plaintext

#modloaded astralsorcery
#loader mixin
#sideonly client
import native.hellfirepvp.astralsorcery.client.ClientScheduler;
import native.net.minecraft.client.renderer.BufferBuilder;
import native.net.minecraft.client.renderer.GlStateManager;
import native.net.minecraft.client.renderer.Tessellator;
import native.net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import native.net.minecraft.item.ItemStack;
import native.net.minecraft.util.math.MathHelper;
import native.org.lwjgl.opengl.GL11;
import mixin.CallbackInfo;
import native.java.lang.Math;
// Render a translucent golden halo around the relay for the next item to place in an Iridescent Altar's craft
#mixin {targets: "hellfirepvp.astralsorcery.common.crafting.altar.recipes.TraitRecipe"}
zenClass AstralRelayHalo_RenderTranslucentItem {
// Simple smoothstep
function smoothstep(e0 as double, e1 as double, x as double) as double {
val t as double = MathHelper.clamp((x - e0) / (e1 - e0), 0.0, 1.0);
return t * t * (3.0 - 2.0 * t);
}
// Piecewise gold gradient: center (c0) -> mid (c1) -> rim (c2) by normalized radius u∈[0,1]
function goldAt(
u as double,
c0r as float, c0g as float, c0b as float, c0a as float,
c1r as float, c1g as float, c1b as float, c1a as float,
c2r as float, c2g as float, c2b as float, c2a as float
) as float[] {
val k as float = 0.45F; // where inner band transitions to outer
val m as float = smoothstep(0.0F, 1.0F, u) as float;
if (m < k) {
val t as float = m / k;
return [
c0r * (1.0F - t) + c1r * t,
c0g * (1.0F - t) + c1g * t,
c0b * (1.0F - t) + c1b * t,
c0a * (1.0F - t) + c1a * t
];
} else {
val t as float = (m - k) / (1.0F - k);
return [
c1r * (1.0F - t) + c2r * t,
c1g * (1.0F - t) + c2g * t,
c1b * (1.0F - t) + c2b * t,
c1a * (1.0F - t) + c2a * t
];
}
}
function waveBandEdge(j as double, bands as double) as double {
// < 1 for middle expansion
// = 1 for no expansion
// > 1 for edge contraction
// the farther from 1, the stronger the effect
val strength as double = 4.0;
return Math.pow(Math.sin((j / bands) * Math.PI / 2.0), strength);
}
#mixin Inject
#{
# method: "renderTranslucentItem",
# at: { value: "HEAD" },
# cancellable: true
#}
function renderTranslucentItem(stack as ItemStack, x as double, y as double, z as double, partialTicks as float, ci as CallbackInfo) as void {
// Tunables
val segments as int = 64; // arc tessellation
val bands as int = 12; // radial tessellation
val baseRadius as double = 0.6;
val radiusVar as double = 0.08;
// Gold palette
val c0r as float = 1.00F; val c0g as float = 0.92F; val c0b as float = 0.50F; val c0a as float = 0.95F; // center
val c1r as float = 1.00F; val c1g as float = 0.84F; val c1b as float = 0.25F; val c1a as float = 0.45F; // mid
val c2r as float = 1.00F; val c2g as float = 0.78F; val c2b as float = 0.12F; val c2a as float = 0.12F; // rim
val t as double = (ClientScheduler.getClientTick() as double + partialTicks as double);
val PI2 as double = 2.0 * Math.PI;
GlStateManager.pushMatrix();
GlStateManager.translate(x + 0.5, y, z + 0.5);
GlStateManager.disableTexture2D();
GlStateManager.disableLighting();
GlStateManager.enableBlend();
// Additive for luminous halo; switch to ONE_MINUS_SRC_ALPHA for a softer look
GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE, 1, 0);
GlStateManager.disableCull();
GlStateManager.depthMask(false);
GlStateManager.disableDepth();
val tess as Tessellator = Tessellator.getInstance();
val buffer as BufferBuilder = tess.getBuffer();
val radius as double = baseRadius + Math.sin(t / 10.0) * radiusVar; // smooth pulse
val outerRadius as double = radius;
for j in 0 .. (bands - 1) {
val eased0 as double = waveBandEdge(j as double, bands as double);
val eased1 as double = waveBandEdge((j + 1) as double, bands as double);
val r0 as double = outerRadius * eased0;
val r1 as double = outerRadius * eased1;
val u as double = ((r0 + r1) / (2.0 * outerRadius)) as double;
val col as float[] = goldAt(u, c0r, c0g, c0b, c0a, c1r, c1g, c1b, c1a, c2r, c2g, c2b, c2a);
var cr as float = col[0];
var cg as float = col[1];
var cb as float = col[2];
var ca as float = col[3];
buffer.begin(GL11.GL_TRIANGLE_STRIP, DefaultVertexFormats.POSITION_COLOR);
for i in 0 .. segments {
val angle as double = PI2 * (i as double) / (segments as double);
val cos as double = Math.cos(angle);
val sin as double = Math.sin(angle);
buffer.pos(cos * r1, 0.0, sin * r1).color(cr, cg, cb, ca).endVertex();
buffer.pos(cos * r0, 0.0, sin * r0).color(cr, cg, cb, ca).endVertex();
}
buffer.pos(1.0 * r1, 0.0, 0.0 * r1).color(cr, cg, cb, ca).endVertex();
buffer.pos(1.0 * r0, 0.0, 0.0 * r0).color(cr, cg, cb, ca).endVertex();
tess.draw();
}
GlStateManager.depthMask(true);
GlStateManager.enableDepth();
GlStateManager.enableCull();
GlStateManager.disableBlend();
GlStateManager.enableLighting();
GlStateManager.enableTexture2D();
GlStateManager.popMatrix();
}
}