Skip to content

Built-in Effect Executors ​

A block-anchored tornado effect started by an executor

BlockEffectExecutor supplies a world anchor; EntityEffectExecutor updates that anchor from an entity and optional auto-rotation mode.

Use the built-in executors when an effect follows a block or entity. Configure them before start(); start() creates and emits the runtime.

Block Anchor ​

java
FX fx = FXHelper.getFX(ResourceLocation.parse("mymod:block_aura"));
if (fx != null) {
    BlockEffectExecutor executor = new BlockEffectExecutor(fx, level, pos);
    executor.setOffset(0, 0.5, 0);
    executor.setScale(1.25, 1.25, 1.25);
    executor.setDelay(4);
    executor.setCheckState(true);
    executor.setForcedDeath(false);
    executor.setAllowMulti(false);
    executor.setOnFinished(runtime -> onAuraEnded());
    executor.start();
}

The root is centered at the block plus offset. The executor retires the runtime when the chunk unloads, block type changes, or—with checkState—the exact BlockState changes.

Entity Anchor ​

java
EntityEffectExecutor executor = new EntityEffectExecutor(
        fx, level, entity, EntityEffectExecutor.AutoRotate.LOOK);
executor.setOffset(0, -0.25, 0);
executor.setRotation(0, 90, 0); // degrees convenience overload
executor.setForcedDeath(true);
executor.start();

The entity root follows interpolated eye position every frame.

AutoRotateBehavior
NONEKeep only the configured quaternion
FORWARDRotate from the entity's forward vector
LOOKRotate from the view/look vector
XROTApply the entity visual yaw using Photon's X-oriented convention

Shared Options ​

  • offset/rotation/scale transform the runtime root.
  • delay is assigned to every object after emit/reset, in ticks.
  • forcedDeath controls anchor loss: true removes remnants immediately; false lets existing particles drain.
  • allowMulti=false deduplicates an equal effect on the same anchor by FX instance or FX location.
  • onFinished fires once when the runtime finishes, is destroyed, or becomes invalid because the particle engine discarded it.

getRuntime() is nullable before a successful start() and when start is skipped. Keep the executor if later code needs its runtime or callback; avoid reaching into the static executor caches.

Released under the MIT License.