Skip to content
U_Love edited this page Jul 25, 2026 · 1 revision

All events are registered under the event group adaptive_nemesis. Place script files anywhere under kubejs/server_scripts/ and use /kubejs reload or restart to apply.

💡 KubeJS automatically exposes public getters as properties, so both event.getPlayer() and event.player usually work in scripts.


Event Overview

Event ID Trigger Cancellable Modifiable
adaptive_nemesis.entity_scale When an entity is scaled Multiplier, entity attributes
adaptive_nemesis.damage_calculation When true damage is calculated Final damage
adaptive_nemesis.player_strength_evaluation When player strength is evaluated Final strength
adaptive_nemesis.world_stage_change When the world stage advances Stage multiplier
adaptive_nemesis.nemesis_memory_update When nemesis memory updates Read-only
adaptive_nemesis.invasion_start When an invasion starts Wave count, difficulty multiplier
adaptive_nemesis.invasion_wave_start When an invasion wave starts Read-only
adaptive_nemesis.invasion_end When an invasion ends Reward configuration

1. Entity Scale Event

adaptive_nemesis.entity_scale(event => {
    // event.entity        // The Mob being scaled
    // event.entityId      // Entity ID string, e.g. "minecraft:zombie"
    // event.entityName    // Entity display name

    event.getMultiplier();           // Current scale multiplier
    event.setMultiplier(2.0);        // Set multiplier (clamped to ≥1.0)
    event.addMultiplier(0.5);        // Add to multiplier
    event.multiplyMultiplier(1.5);   // Multiply multiplier

    event.cancelEvent();             // Cancel this scaling
    event.isEventCancelled();        // Whether it was cancelled

    event.getHealth();               // Current health
    event.getMaxHealth();            // Max health
    event.getAttackDamage();         // Base attack damage
    event.getArmor();                // Base armor value

    event.setAttackDamage(20.0);     // Set base attack damage
    event.setMaxHealth(100.0);       // Set max health and sync current health
});

Return Behavior

If cancelled, the mod skips scaling for this entity and spawns it with original attributes.


2. Damage Calculation Event

Triggered when the "true damage" mechanism calculates final damage.

adaptive_nemesis.damage_calculation(event => {
    // event.attacker          // Attacker LivingEntity
    // event.target            // Target LivingEntity
    // event.originalDamage    // Original damage
    // event.calculatedDamage  // Calculated damage
    // event.armorMultiplier   // Armor multiplier

    event.getAttacker();             // Attacker
    event.getTarget();               // Target
    event.getOriginalDamage();
    event.getCalculatedDamage();
    event.setCalculatedDamage(10.0); // Set final damage (≥0)
    event.addDamage(5.0);            // Add damage

    event.getArmorMultiplier();
    event.isAttackerPlayer();        // Whether attacker is a player
    event.isTargetPlayer();          // Whether target is a player
    event.getAttackerName();
    event.getTargetName();

    event.cancelEvent();             // Cancel true-damage conversion
});

Return Behavior

If cancelled, the original damage is returned and the true-damage conversion is disabled.


3. Player Strength Evaluation Event

adaptive_nemesis.player_strength_evaluation(event => {
    // event.player              // ServerPlayer
    // event.playerName          // Player name
    // event.playerUUID          // UUID string
    // event.baseStrength        // Base strength
    // event.finalStrength       // Final strength (modifiable)
    // event.defenseStrength     // Defense strength
    // event.attackStrength      // Attack strength
    // event.magicStrength       // Magic strength
    // event.combatStrength      // Combat strength

    event.getFinalStrength();
    event.setFinalStrength(100.0);   // Set final strength (≥0)
    event.addStrength(50.0);
    event.multiplyStrength(1.5);

    event.hasItem("minecraft:diamond_sword"); // Whether the player has an item
    event.getPlayerLevel();          // Player experience level
    event.getPlayerHealth();
    event.getPlayerMaxHealth();
});

Return Behavior

This event cannot be cancelled, but finalStrength directly affects subsequent enemy scaling multipliers.


4. World Stage Change Event

adaptive_nemesis.world_stage_change(event => {
    // event.player              // Player triggering the stage advance
    // event.oldStage            // Previous stage
    // event.newStage            // New stage
    // event.stageMultiplier     // Stage multiplier (modifiable)
    // event.defeatedBossCount   // Number of defeated boss types

    event.getPlayer();
    event.getPlayerName();
    event.getOldStage();
    event.getNewStage();
    event.getStageDelta();            // newStage - oldStage
    event.getStageMultiplier();
    event.setStageMultiplier(2.0);    // Set stage multiplier (≥1.0)
    event.getDefeatedBossCount();

    event.cancelEvent();              // Cancel subsequent default behavior
});

Return Behavior

If cancelled, the stage multiplier modification is discarded and the mod uses the original multiplier; the world stage number itself has already advanced when the boss was killed.


5. Nemesis Memory Update Event

adaptive_nemesis.nemesis_memory_update(event => {
    // event.playerUUID      // UUID string
    // event.playerName      // Player name
    // event.killCount       // Total kills
    // event.deathCount      // Total deaths
    // event.nemesisLevel    // Nemesis level
    // event.attackBonus     // Attack bonus
    // event.speedBonus      // Speed bonus
    // event.healthBonus     // Health bonus

    event.getPlayerUUID();
    event.getPlayerName();
    event.getKillCount();
    event.getDeathCount();
    event.getKDRatio();               // Kill/death ratio
    event.getNemesisLevel();
    event.getAttackBonus();
    event.getSpeedBonus();
    event.getHealthBonus();
    event.getTotalBonus();            // Sum of the three bonuses
    event.isAtLeastLevel(10);         // Whether level reached
    event.isMilestone();              // Whether it is a 10-kill milestone
});

Return Behavior

Read-only event; useful for logging statistics, triggering rewards, or sending notifications.


6. Invasion Start Event

adaptive_nemesis.invasion_start(event => {
    // event.player                // Triggering player
    // event.type                  // Invasion type InvasionType
    // event.totalWaves            // Total wave count (modifiable)
    // event.difficultyMultiplier  // Difficulty multiplier (modifiable)

    event.getPlayer();
    event.getPlayerName();
    event.getType();
    event.getTotalWaves();
    event.setTotalWaves(8);                // ≥1
    event.getDifficultyMultiplier();
    event.setDifficultyMultiplier(2.5);    // ≥1.0

    event.cancelEvent();                   // Cancel the invasion
});

Return Behavior

If cancelled, the invasion will not trigger.


7. Invasion Wave Start Event

adaptive_nemesis.invasion_wave_start(event => {
    // event.player                // Triggering player
    // event.type                  // Invasion type
    // event.currentWave           // Current wave
    // event.totalWaves            // Total wave count
    // event.difficultyMultiplier  // Difficulty multiplier

    event.getPlayer();
    event.getPlayerName();
    event.getType();
    event.getCurrentWave();
    event.getTotalWaves();
    event.getDifficultyMultiplier();
    event.getProgress();           // e.g. "2/6"
});

Return Behavior

Read-only event; useful for logging progress or sending custom notifications.


8. Invasion End Event

adaptive_nemesis.invasion_end(event => {
    // event.player                // Triggering player
    // event.type                  // Invasion type
    // event.victory               // Whether victorious
    // event.totalWaves            // Total wave count
    // event.difficultyMultiplier  // Difficulty multiplier
    // event.wavesCompleted        // Waves completed
    // event.rewards               // Reward configuration object

    event.getPlayer();
    event.getPlayerName();
    event.getType();
    event.isVictory();
    event.isDefeat();
    event.getTotalWaves();
    event.getDifficultyMultiplier();
    event.getWavesCompleted();

    const rewards = event.getRewards();
    event.addLoot("minecraft:chests/end_city_treasure");
    event.addExperience(1000);
    event.setExperience(2000);
    // addEffect takes a MobEffect object, for example:
    // const MobEffects = Java.loadClass('net.minecraft.world.effect.MobEffects');
    // event.addEffect(MobEffects.REGENERATION, 60, 1);
    // event.addExtraReward(itemStack);
    event.setRewardsEnabled(false);    // Disable default data pack rewards
    event.isRewardsEnabled();
});

Return Behavior

Script modifications to rewards take effect. setRewardsEnabled(false) disables default reward distribution.


Utility Helper Methods

KubeJSInitializer exposes several static methods suitable for calling via Java.loadClass in scripts:

const KubeJSInitializer = Java.loadClass(
    'com.adaptive_nemesis.adaptive_nemesismod.kubejs.KubeJSInitializer'
);

// Manually trigger the undead invasion
KubeJSInitializer.triggerUndeadInvasion(player);
KubeJSInitializer.triggerUndeadInvasion(player, 5, 2.0);

// Check whether the player is currently in an invasion
const inInvasion = KubeJSInitializer.isInInvasion(player);

// Get invasion progress, returns "currentWave/totalWaves" or null
const progress = KubeJSInitializer.getInvasionProgress(player);

⚠️ When using Java.loadClass to call Java classes, make sure the mod and KubeJS versions are compatible.


Common Examples

Example 1: Extra scaling for zombies

adaptive_nemesis.entity_scale(event => {
    if (event.entityId.includes("zombie")) {
        event.multiplyMultiplier(1.5);
    }
});

Example 2: Double scaling for bosses

adaptive_nemesis.entity_scale(event => {
    if (event.entityId.includes("wither") || event.entityId.includes("ender_dragon")) {
        event.multiplyMultiplier(2.0);
    }
});

Example 3: Adjust strength by player level

adaptive_nemesis.player_strength_evaluation(event => {
    const level = event.getPlayerLevel();
    if (level > 30) {
        event.addStrength(level * 0.5);
    }
});

Example 4: Milestone reward

adaptive_nemesis.nemesis_memory_update(event => {
    if (event.isMilestone()) {
        console.log(`Player ${event.playerName} reached ${event.killCount} kills!`);
        // Add reward logic here
    }
});

Example 5: Adjust invasion rewards by performance

adaptive_nemesis.invasion_end(event => {
    if (event.isVictory() && event.getWavesCompleted() >= 5) {
        event.addExperience(500);
        event.addLoot("minecraft:chests/ancient_city");
    }
});

Example 6: Broadcast on world stage change

adaptive_nemesis.world_stage_change(event => {
    const player = event.getPlayer();
    player.tell(
        Component.literal(`World stage advanced to ${event.getNewStage()}!`)
    );
});

Notes

  1. Performance: entity_scale and damage_calculation may fire frequently; avoid complex calculations or excessive console.log.
  2. Cancellation semantics: Use cancelEvent() according to the behavior described for each event.
  3. Type safety: Pay attention to method name casing when interacting with Java objects; use logs or an IDE to debug.
  4. Reload: After modifying KubeJS scripts, use /kubejs reload; no server restart is required.
  5. Version compatibility: This wiki is based on NeoForge 1.21.1 + KubeJS 2101.x.

If you write a script that makes the Ender Dragon beg for mercy, be sure to share it! 🐉✨

Clone this wiki locally