236 lines
8.7 KiB
TypeScript
236 lines
8.7 KiB
TypeScript
import { MolangVariableMap, Vector3, world } from "@minecraft/server";
|
|
import { Vector3Add, vector3 } from "./vectorUtils";
|
|
|
|
const bedrockParticles = [
|
|
"minecraft:mobspell_emitter",
|
|
"minecraft:villager_angry",
|
|
"minecraft:bleach",
|
|
"minecraft:breaking_item_icon",
|
|
"minecraft:blockdust",
|
|
"minecraft:bubble_column_up_particle",
|
|
"minecraft:compfire_smoke_particle",
|
|
"minecraft:campfire_tall_smoke_particle",
|
|
"minecraft:cherry_leaves_particle",
|
|
"minecraft:crop_growth_emitter",
|
|
"minecraft:conduit_particle",
|
|
"minecraft:critical_hit_emitter",
|
|
"minecraft:bubble_column_down_particle",
|
|
"minecraft:dolphin_move_particle",
|
|
"minecraft:dragon_breath_trail",
|
|
"minecraft:dragon_breath_lingering",
|
|
"minecraft:lava_drip_particle",
|
|
"minecraft:water_drip_particle",
|
|
"minecraft:redstone_wire_dust_particle",
|
|
"minecraft:sculk_sensor_redstone_particle",
|
|
"minecraft:splash_spell_emitter",
|
|
"minecraft:electric_spark__particle",
|
|
"minecraft:enchanting_table_particle",
|
|
"minecraft:endrod",
|
|
"minecraft:balloon_gas_particle",
|
|
"minecraft:evoker_spell",
|
|
"minecraft:huge_explosion_emitter",
|
|
"minecraft:falling_dust_red_sand_particle",
|
|
"minecraft:falling_dust_sand_particle",
|
|
"minecraft:falling_dust_gravel_particle",
|
|
"minecraft:falling_dust_top_snow_particle",
|
|
"minecraft:falling_dust_dragon_egg_particle",
|
|
"minecraft:falling_dust_concrete_particle",
|
|
"minecraft:falling_dust_scaffolding_particle",
|
|
"minecraft:honey_drip_particle",
|
|
"minecraft:nectar_drip_particle",
|
|
"minecraft:obsidian_tear_particle",
|
|
"minecraft:spore_blossom_shower_particle",
|
|
"minecraft:water_splash_particle",
|
|
"minecraft:sparkler_emitter",
|
|
"minecraft:water_wake_particle",
|
|
"minecraft:basic_flame_particle",
|
|
"minecraft:flash",
|
|
"minecraft:glow_particle",
|
|
"minecraft:villager_happy",
|
|
"minecraft:heart_particle",
|
|
"minecraft:water_evaporation_actor_emitter",
|
|
"minecraft:lava_particle",
|
|
"minecraft:mobflame_emitter",
|
|
"minecraft:mobflame_single",
|
|
"minecraft:mycelium_dust_particle",
|
|
"minecraft:note_particle",
|
|
"minecraft:explode",
|
|
"minecraft:mob_portal",
|
|
"minecraft:rainsplash",
|
|
"minecraft:basic_smoke_particle",
|
|
"minecraft:snowflake_particle",
|
|
"minecraft:soul_particle",
|
|
"minecraft:blue_flame_particle",
|
|
"minecraft:spore_blossom_ambient_particle",
|
|
"minecraft:watersplash",
|
|
"minecraft:terrain",
|
|
"minecraft:totem_particle",
|
|
"minecraft:tracking_emitter",
|
|
"minecraft:vibration_signal",
|
|
"minecraft:wax_particle",
|
|
"minecraft:witchspell",
|
|
];
|
|
|
|
const PARTICLES = {
|
|
mobspell_emitter: "minecraft:mobspell_emitter",
|
|
villager_angry: "minecraft:villager_angry",
|
|
bleach: "minecraft:bleach",
|
|
breaking_item_icon: "minecraft:breaking_item_icon",
|
|
blockdust: "minecraft:blockdust",
|
|
bubble_column_up_particle: "minecraft:bubble_column_up_particle",
|
|
compfire_smoke_particle: "minecraft:compfire_smoke_particle",
|
|
campfire_tall_smoke_particle: "minecraft:campfire_tall_smoke_particle",
|
|
cherry_leaves_particle: "minecraft:cherry_leaves_particle",
|
|
crop_growth_emitter: "minecraft:crop_growth_emitter",
|
|
conduit_particle: "minecraft:conduit_particle",
|
|
critical_hit_emitter: "minecraft:critical_hit_emitter",
|
|
bubble_column_down_particle: "minecraft:bubble_column_down_particle",
|
|
dolphin_move_particle: "minecraft:dolphin_move_particle",
|
|
dragon_breath_trail: "minecraft:dragon_breath_trail",
|
|
dragon_breath_lingering: "minecraft:dragon_breath_lingering",
|
|
lava_drip_particle: "minecraft:lava_drip_particle",
|
|
water_drip_particle: "minecraft:water_drip_particle",
|
|
redstone_wire_dust_particle: "minecraft:redstone_wire_dust_particle",
|
|
sculk_sensor_redstone_particle: "minecraft:sculk_sensor_redstone_particle",
|
|
splash_spell_emitter: "minecraft:splash_spell_emitter",
|
|
electric_spark__particle: "minecraft:electric_spark__particle",
|
|
enchanting_table_particle: "minecraft:enchanting_table_particle",
|
|
endrod: "minecraft:endrod",
|
|
balloon_gas_particle: "minecraft:balloon_gas_particle",
|
|
evoker_spell: "minecraft:evoker_spell",
|
|
huge_explosion_emitter: "minecraft:huge_explosion_emitter",
|
|
falling_dust_red_sand_particle: "minecraft:falling_dust_red_sand_particle",
|
|
falling_dust_sand_particle: "minecraft:falling_dust_sand_particle",
|
|
falling_dust_gravel_particle: "minecraft:falling_dust_gravel_particle",
|
|
falling_dust_top_snow_particle: "minecraft:falling_dust_top_snow_particle",
|
|
falling_dust_dragon_egg_particle: "minecraft:falling_dust_dragon_egg_particle",
|
|
falling_dust_concrete_particle: "minecraft:falling_dust_concrete_particle",
|
|
falling_dust_scaffolding_particle: "minecraft:falling_dust_scaffolding_particle",
|
|
honey_drip_particle: "minecraft:honey_drip_particle",
|
|
nectar_drip_particle: "minecraft:nectar_drip_particle",
|
|
obsidian_tear_particle: "minecraft:obsidian_tear_particle",
|
|
spore_blossom_shower_particle: "minecraft:spore_blossom_shower_particle",
|
|
water_splash_particle: "minecraft:water_splash_particle",
|
|
sparkler_emitter: "minecraft:sparkler_emitter",
|
|
water_wake_particle: "minecraft:water_wake_particle",
|
|
basic_flame_particle: "minecraft:basic_flame_particle",
|
|
flash: "minecraft:flash",
|
|
glow_particle: "minecraft:glow_particle",
|
|
villager_happy: "minecraft:villager_happy",
|
|
heart_particle: "minecraft:heart_particle",
|
|
water_evaporation_actor_emitter: "minecraft:water_evaporation_actor_emitter",
|
|
lava_particle: "minecraft:lava_particle",
|
|
mobflame_emitter: "minecraft:mobflame_emitter",
|
|
mobflame_single: "minecraft:mobflame_single",
|
|
mycelium_dust_particle: "minecraft:mycelium_dust_particle",
|
|
note_particle: "minecraft:note_particle",
|
|
explode: "minecraft:explode",
|
|
mob_portal: "minecraft:mob_portal",
|
|
rainsplash: "minecraft:rainsplash",
|
|
basic_smoke_particle: "minecraft:basic_smoke_particle",
|
|
snowflake_particle: "minecraft:snowflake_particle",
|
|
soul_particle: "minecraft:soul_particle",
|
|
blue_flame_particle: "minecraft:blue_flame_particle",
|
|
spore_blossom_ambient_particle: "minecraft:spore_blossom_ambient_particle",
|
|
watersplash: "minecraft:watersplash",
|
|
terrain: "minecraft:terrain",
|
|
totem_particle: "minecraft:totem_particle",
|
|
tracking_emitter: "minecraft:tracking_emitter",
|
|
vibration_signal: "minecraft:vibration_signal",
|
|
wax_particle: "minecraft:wax_particle",
|
|
witchspell: "minecraft:witchspell",
|
|
point: "codecosmos:point",
|
|
};
|
|
|
|
class ParticleColumn {
|
|
pos: Vector3;
|
|
radius: number;
|
|
pointsPerLayer: number;
|
|
layerCount: number;
|
|
particle: string;
|
|
points: Vector3[] = [];
|
|
speed: number;
|
|
anglePerLayer: number[] = [];
|
|
tickCounter: number = 0;
|
|
|
|
constructor(
|
|
pos: Vector3,
|
|
radius: number,
|
|
pointsPerLayer: number,
|
|
layerCount: number,
|
|
speed: number,
|
|
particle: string
|
|
) {
|
|
this.pos = pos;
|
|
this.radius = radius;
|
|
this.particle = particle;
|
|
this.pointsPerLayer = pointsPerLayer;
|
|
this.layerCount = layerCount;
|
|
this.speed = speed;
|
|
this.generatePoints();
|
|
}
|
|
|
|
generatePoints() {
|
|
for (let layer = 0; layer < this.layerCount; layer++) {
|
|
const layerRadius = this.radius - layer;
|
|
for (let point = 0; point < this.pointsPerLayer; point++) {
|
|
const angle = (point / this.pointsPerLayer) * (Math.PI * 2);
|
|
this.anglePerLayer.push(angle);
|
|
const x = Math.cos(angle) * layerRadius;
|
|
const z = Math.sin(angle) * layerRadius;
|
|
const y = layer;
|
|
this.points.push(Vector3Add(this.pos, vector3(x, y, z)));
|
|
}
|
|
}
|
|
}
|
|
|
|
update() {
|
|
//update each point by increasing the angle by the speed
|
|
this.tickCounter++;
|
|
if (this.tickCounter % 2 == 0) {
|
|
this.points.forEach((point, index) => {
|
|
const layer = Math.floor(index / this.pointsPerLayer);
|
|
let angle = this.anglePerLayer[index];
|
|
angle += this.speed * (layer / 5);
|
|
this.anglePerLayer[index] = angle;
|
|
const calcAngle = angle;
|
|
const x = Math.cos(calcAngle) * this.radius;
|
|
const z = Math.sin(calcAngle) * this.radius;
|
|
const y = Math.floor(index / this.pointsPerLayer) + (this.tickCounter % 2);
|
|
this.points[index] = Vector3Add(this.pos, vector3(x, y, z));
|
|
});
|
|
}
|
|
}
|
|
draw() {
|
|
this.points.forEach((point) => {
|
|
spawnParticle(point);
|
|
});
|
|
}
|
|
}
|
|
|
|
function spawnParticle(
|
|
position: Vector3,
|
|
particle: string = PARTICLES.balloon_gas_particle,
|
|
map: MolangVariableMap = new MolangVariableMap()
|
|
) {
|
|
//check if the chunk is loaded
|
|
const chunk = world.getDimension("overworld").getBlock(position);
|
|
if (!chunk?.isValid()) {
|
|
return;
|
|
}
|
|
map.setVector3("variable.direction", vector3(0, 0, 0));
|
|
// map.setFloat("Variable.r", 2);
|
|
map.setColorRGB("variable.color", {
|
|
red: 1,
|
|
green: 1,
|
|
blue: 1,
|
|
});
|
|
|
|
const dimension = world.getDimension("overworld");
|
|
if (dimension) {
|
|
dimension.spawnParticle(particle, position, map);
|
|
}
|
|
}
|
|
|
|
export { PARTICLES, bedrockParticles, ParticleColumn, spawnParticle };
|