Skip to main content
Hytale entities can have active effects managed by an EffectControllerComponent. HRTK’s EffectAssert class lets you verify which effects are present, count active effects, and check invulnerability state.

EffectAssert Methods

MethodDescription
assertHasEffect(store, ref, effectIndex)Assert entity has the effect at the given index
assertNoEffect(store, ref, effectIndex)Assert entity does NOT have the effect
assertEffectCount(store, ref, expected)Assert the number of active effects
assertInvulnerable(store, ref)Assert entity is invulnerable

Basic Usage

import com.frotty27.hrtk.api.assert_.EffectAssert;

@WorldTest
void newEntityHasNoEffects(WorldTestContext ctx) {
    Object entity = ctx.spawnEntity("hytale:kweebec", 0, 64, 0);
    ctx.waitTicks(1);

    Object store = ctx.getStore();
    EffectAssert.assertEffectCount(store, entity, 0);
}

Applying and Verifying Effects

@WorldTest
void poisonEffectIsApplied(WorldTestContext ctx) {
    Object entity = ctx.spawnEntity("hytale:kweebec", 0, 64, 0);
    ctx.waitTicks(1);

    // Apply poison effect through your mod's logic
    applyEffect(ctx, entity, POISON_INDEX);
    ctx.waitTicks(1);

    Object store = ctx.getStore();
    EffectAssert.assertHasEffect(store, entity, POISON_INDEX);
    EffectAssert.assertEffectCount(store, entity, 1);
}
@WorldTest
void effectCanBeRemoved(WorldTestContext ctx) {
    Object entity = ctx.spawnEntity("hytale:kweebec", 0, 64, 0);
    ctx.waitTicks(1);

    applyEffect(ctx, entity, SPEED_BOOST_INDEX);
    ctx.waitTicks(1);
    EffectAssert.assertHasEffect(ctx.getStore(), entity, SPEED_BOOST_INDEX);

    removeEffect(ctx, entity, SPEED_BOOST_INDEX);
    ctx.waitTicks(1);
    EffectAssert.assertNoEffect(ctx.getStore(), entity, SPEED_BOOST_INDEX);
}
@WorldTest
void multipleEffectsCanStack(WorldTestContext ctx) {
    Object entity = ctx.spawnEntity("hytale:kweebec", 0, 64, 0);
    ctx.waitTicks(1);

    applyEffect(ctx, entity, POISON_INDEX);
    applyEffect(ctx, entity, SPEED_BOOST_INDEX);
    applyEffect(ctx, entity, SHIELD_INDEX);
    ctx.waitTicks(1);

    Object store = ctx.getStore();
    EffectAssert.assertEffectCount(store, entity, 3);
    EffectAssert.assertHasEffect(store, entity, POISON_INDEX);
    EffectAssert.assertHasEffect(store, entity, SPEED_BOOST_INDEX);
    EffectAssert.assertHasEffect(store, entity, SHIELD_INDEX);
}
@WorldTest
void invulnerabilityEffectWorks(WorldTestContext ctx) {
    Object entity = ctx.spawnEntity("hytale:kweebec", 0, 64, 0);
    ctx.waitTicks(1);

    applyInvulnerability(ctx, entity);
    ctx.waitTicks(1);

    EffectAssert.assertInvulnerable(ctx.getStore(), entity);
}

How It Works

EffectAssert locates the EffectControllerComponent on the entity via reflection, then calls:
  • hasEffect(int index) to check for specific effects
  • getActiveEffects() to count active effects
  • isInvulnerable() for invulnerability checks
Effect indices are integer identifiers used by Hytale’s effect system. The specific index values depend on your game content and mod configuration. Define constants in your test suite for readability.
Effect tests modify entity state. Use IsolationStrategy.DEDICATED_WORLD:
@HytaleSuite(value = "Effect Tests", isolation = IsolationStrategy.DEDICATED_WORLD)
@Tag("effects")
public class EffectTests { }

Next Steps