Tags
Creators
Details
v2.0.31+1.21.1
Compatibility
Changes
v2.0.31: full power type API audit — 33 bug fixes across 24 files
Full audit of all 93 power types against both game versions (1.21.1 + 26.1). 33 bugs identified and fixed, covering vanilla race conditions, event timing, memory leaks, codec issues, and master-branch regressions.
Bug Fixes (HIGH):
- breath_in_fluid completely broken — vanilla baseTick overwrites air drain; rebuilt with Post-tick handler + LivingBreatheEvent suppression
- modify_food_nutrition does nothing — Finish event fires after vanilla already ate the food; switched to post-eat FoodData correction with proper saturation scaling
- SlimeDeathSavePower stores tickCount as float — precision degrades after ~9.6 days; also broke across relogs. Switched to remaining-ticks countdown
- CraftAmountBonusPower triggers on any inventory increase (pickup, hopper, trade) — replaced tick polling with PlayerEvent.ItemCraftedEvent
- ActivePhasePower charges hunger twice (execute + base class both deduct)
- ExtraInventoryPower hardcodes 3-row chest menu regardless of config size
- ShadowOrbPower orbs tick in wrong dimension after dimension change
- WaterBreathingPower bubble bar flickers (onTick air set overwritten by baseTick)
Bug Fixes (MEDIUM):
- SizeScalingPower hardcoded modifier IDs — collision when player has multiple size_scaling powers
- ResourcePower min/max actions fire every tick at boundary instead of edge-triggered
- SlimeMoisturePower resets moisture to 1.0 on every login/respawn
- SlimeLevelHPPower uses permanent modifier — stale bonus HP after death
- ModelColorPower CONDITION_STATE map never cleaned on logout/revoke (memory leak)
- TamedAnimalBoostPower permanent modifiers never removed on power revoke
- ModifyFoodNutritionPower saturation math passes raw value where Builder expects ratio
Bug Fixes (LOW):
- ActiveTidalWavePower consumes cooldown on whiff (zero hits)
- ElytraBoostPower scales entire velocity vector, not just boost delta — exponential acceleration
- BurnPower doc says "seconds" but field is ticks
- EffectImmunityPower effects field required instead of optional — confusing codec error
- PreventActionPower SWIM sets hurtMarked every tick — 20 velocity sync packets/sec
- StealthPower SNEAK_TICKS map uses non-concurrent HashMap
- WraithPhasePower allocates new HashSet and re-parses blocked_blocks every tick
- LowHPThresholdPower NaN if getMaxHealth() returns 0
- IgnoreWaterPower fragile string-based attribute lookup instead of Attributes constant
- HordeRegenPower combat detection conflates damage source types
Master-only regressions also fixed (6 commits on master branch):
- AbstractActivePower cooldown key uses identityHashCode — resets on every rejoin
- AbstractTogglePower isToggledOff signature changed — compile failure + WraithPhase dead override
- AttributeModifierPower modIdFor dropped powerKey — identical modifier IDs de-duplicate
- ModifyDamagePower removed targetGroup — 3 shipped powers lose entity-group filter
- BreathOutOfFluidPower backtank drains 20x too fast (lost tick guard)
- ExtraInventoryPower onPlayerSave overwrites entire mod NBT compound
- ScareEntitiesPower only clears target for specific player — breaks Phantoms
- SummonMinionPower lost offensive targeting — minions only defend
- PhantomFormPower ability sync gated behind wasFlying
Documentation:
- POWER_TYPES.md: updated breath_in_fluid, craft_amount_bonus, extra_inventory, tamed_animal_boost
- 2_0_CHANGES.md: marked craft_amount_bonus as resolved (no longer tick-polled)
Optional dependencies
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:RUtQ9kfe:zylREK8c"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:RUtQ9kfe:zylREK8c"
}


