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
Method Description 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
Apply effect and verify presence
@ 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 );
}
Remove effect and verify absence
@ 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);
}
Multiple simultaneous effects
@ 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.
Recommended Isolation
Effect tests modify entity state. Use IsolationStrategy.DEDICATED_WORLD:
@ HytaleSuite ( value = "Effect Tests" , isolation = IsolationStrategy . DEDICATED_WORLD )
@ Tag ( "effects" )
public class EffectTests { }
Next Steps