-
Notifications
You must be signed in to change notification settings - Fork 1
KubeJS
All events are registered under the event group
adaptive_nemesis. Place script files anywhere underkubejs/server_scripts/and use/kubejs reloador restart to apply.💡 KubeJS automatically exposes public getters as properties, so both
event.getPlayer()andevent.playerusually work in scripts.
| 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 |
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
});If cancelled, the mod skips scaling for this entity and spawns it with original attributes.
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
});If cancelled, the original damage is returned and the true-damage conversion is disabled.
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();
});This event cannot be cancelled, but finalStrength directly affects subsequent enemy scaling multipliers.
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
});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.
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
});Read-only event; useful for logging statistics, triggering rewards, or sending notifications.
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
});If cancelled, the invasion will not trigger.
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"
});Read-only event; useful for logging progress or sending custom notifications.
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();
});Script modifications to rewards take effect. setRewardsEnabled(false) disables default reward distribution.
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 usingJava.loadClassto call Java classes, make sure the mod and KubeJS versions are compatible.
adaptive_nemesis.entity_scale(event => {
if (event.entityId.includes("zombie")) {
event.multiplyMultiplier(1.5);
}
});adaptive_nemesis.entity_scale(event => {
if (event.entityId.includes("wither") || event.entityId.includes("ender_dragon")) {
event.multiplyMultiplier(2.0);
}
});adaptive_nemesis.player_strength_evaluation(event => {
const level = event.getPlayerLevel();
if (level > 30) {
event.addStrength(level * 0.5);
}
});adaptive_nemesis.nemesis_memory_update(event => {
if (event.isMilestone()) {
console.log(`Player ${event.playerName} reached ${event.killCount} kills!`);
// Add reward logic here
}
});adaptive_nemesis.invasion_end(event => {
if (event.isVictory() && event.getWavesCompleted() >= 5) {
event.addExperience(500);
event.addLoot("minecraft:chests/ancient_city");
}
});adaptive_nemesis.world_stage_change(event => {
const player = event.getPlayer();
player.tell(
Component.literal(`World stage advanced to ${event.getNewStage()}!`)
);
});-
Performance:
entity_scaleanddamage_calculationmay fire frequently; avoid complex calculations or excessiveconsole.log. -
Cancellation semantics: Use
cancelEvent()according to the behavior described for each event. - Type safety: Pay attention to method name casing when interacting with Java objects; use logs or an IDE to debug.
-
Reload: After modifying KubeJS scripts, use
/kubejs reload; no server restart is required. - 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! 🐉✨