86 lines
3.5 KiB
JavaScript
86 lines
3.5 KiB
JavaScript
import { MolangVariableMap } from "@minecraft/server";
|
|
import { BlockVerificationLevel } from "../Enums/BlockVerificationLevel";
|
|
import { Vector } from "../../lib/Vector";
|
|
|
|
export class BlockVerificationLevelRender {
|
|
opacity = 0.2;
|
|
lifetimeSeconds = 0;
|
|
|
|
constructor(dimensionLocation, verificationLevel, lifetimeSeconds = 5) {
|
|
this.dimension = dimensionLocation.dimension;
|
|
this.location = Vector.from(dimensionLocation.location);
|
|
this.verificationLevel = verificationLevel;
|
|
this.lifetimeSeconds = lifetimeSeconds;
|
|
this.renderBlock();
|
|
}
|
|
|
|
renderBlock() {
|
|
const sizeScalar = this.verificationLevelToSizeScalar();
|
|
for (const particle of this.getBlockParticles(sizeScalar)) {
|
|
const color = this.getRGBAMolang();
|
|
if (!color)
|
|
return;
|
|
color.setFloat("lifetime", this.lifetimeSeconds);
|
|
color.setFloat("width", 0.5*sizeScalar);
|
|
color.setFloat("height", 0.5*sizeScalar);
|
|
try {
|
|
this.dimension.spawnParticle(particle.particleType, particle.location, color);
|
|
} catch {
|
|
/* pass */
|
|
}
|
|
}
|
|
}
|
|
|
|
getBlockParticles(sizeScalar = 1) {
|
|
const bottomFace = new Vector(0.5, 0, 0.5);
|
|
const topFace = new Vector(0.5, 1, 0.5);
|
|
const leftFace = new Vector(1, 0.5, 0.5);
|
|
const rightFace = new Vector(0, 0.5, 0.5);
|
|
const frontFace = new Vector(0.5, 0.5, 1);
|
|
const backFace = new Vector(0.5, 0.5, 0);
|
|
const center = new Vector(0.5, 0.5, 0.5);
|
|
return [
|
|
{ particleType: "construct:blockoverlay_xz", location: this.location.add(center).add(topFace.subtract(center).multiply(sizeScalar)) },
|
|
{ particleType: "construct:blockoverlay_xz", location: this.location.add(center).add(bottomFace.subtract(center).multiply(sizeScalar)) },
|
|
{ particleType: "construct:blockoverlay_yz", location: this.location.add(center).add(leftFace.subtract(center).multiply(sizeScalar)) },
|
|
{ particleType: "construct:blockoverlay_yz", location: this.location.add(center).add(rightFace.subtract(center).multiply(sizeScalar)) },
|
|
{ particleType: "construct:blockoverlay_xy", location: this.location.add(center).add(frontFace.subtract(center).multiply(sizeScalar)) },
|
|
{ particleType: "construct:blockoverlay_xy", location: this.location.add(center).add(backFace.subtract(center).multiply(sizeScalar)) }
|
|
];
|
|
}
|
|
|
|
getRGBAMolang() {
|
|
const rgb = this.verificationLevelToRGB();
|
|
if (!rgb) return;
|
|
rgb.alpha = this.opacity;
|
|
const molang = new MolangVariableMap();
|
|
molang.setColorRGBA("face_color", rgb);
|
|
return molang;
|
|
}
|
|
|
|
verificationLevelToRGB() {
|
|
switch (this.verificationLevel) {
|
|
case BlockVerificationLevel.NoMatch:
|
|
return { red: 1, green: 0, blue: 0};
|
|
case BlockVerificationLevel.TypeMatch:
|
|
return { red: 1, green: 1, blue: 0};
|
|
case BlockVerificationLevel.Missing:
|
|
return { red: 0, green: 0, blue: 1};
|
|
default:
|
|
return void 0;
|
|
}
|
|
}
|
|
|
|
verificationLevelToSizeScalar() {
|
|
switch (this.verificationLevel) {
|
|
case BlockVerificationLevel.NoMatch:
|
|
return 1.01;
|
|
case BlockVerificationLevel.TypeMatch:
|
|
return 1.01;
|
|
case BlockVerificationLevel.Missing:
|
|
return 0.90;
|
|
default:
|
|
return 1.00;
|
|
}
|
|
}
|
|
} |