Tags
Creators
Details
Licensed ARR
Published 3 years ago
Updated 19 hours ago
All versions
1.0.8
Release
thematic-heroes-1.20.1-1.0.8.jar5 days ago 669
Uploaded by
Compatibility
Minecraft: Java Edition
1.20–1.20.1
Platform
Fabric
Supported environments
Client and server
Required content
Any compatible version
Any compatible version
Any compatible version
Any compatible version
Any compatible version
Any compatible version
Changes
Thematic Heroes v1.0.8
- Drop the Draco dependency from the shipped jar com.openize:drako was jar-in-jar'd into the mod (375 KB, 247 classes) to decode a single 8.6 KB asset -- assets/thematic/gltf/atom.glb, the only glTF model that ships. Uncompressed, that asset is 22 KB, so Draco was buying ~13 KB of asset at a cost of 375 KB of library. It was also already a dead end for the models that matter: drako 26.3.0 loses every component after the first on multi-component integer GENERIC attributes, so GltfDracoDecoder refused JOINTS_0 outright -- meaning skinned meshes, which is all of the armor models, could never be Draco-compressed anyway. atom.glb is replaced by a decode-and-repack of the exact bytes the game was already producing at runtime, verified value-for-value against the Draco decode (geometry and animation both), so nothing about the render changes. GltfModelLoader now rejects any model declaring extensionsRequired, naming the extension. Nothing read that field before -- the only extension ever supported was Draco -- so without it a Draco-compressed model would fail on a bufferView-less accessor several frames later. Also restores src/test/resources/gltf/atom.gltf, which GlbContainerTest.glbAndEmbeddedBase64DecodeToIdenticalAccessorData has always read but which was never committed, so that test failed on every run. CI never caught it: stage and finalize both build with -x test. Claude-Session: https://claude.ai/code/session_01RF5QvS67ib5giQQ8v7q1rL
- Set mod_version to 1.6.6 for release main inherited the alpha-suffixed version (1.6.6-a37) from the merge of v1.20.1, which fails the stale-version check in stage-core-release.yml -- between releases mod_version must be exactly one patch ahead of the last v*.. tag (v1.6.5), with no alpha suffix.
- Cleaned up
- Add construct gun debuff back
- Lowered construct damage by 33%
- Fix serverside crash
- Undo wolverine
- Update changelog
- Fixed constructs & dampeners
- feat: grab now prevents other ability usage
- fix: crimson feast heal amount
- V1.20.1 batman gam (#461)
- fix: force optic prone to set on cooldown on active ability
- feat; new abilities to replace batswarm, frenzied swipes on G&M & Owlman
- feat; new abilities on a few suits
- feat; crimson feast change
- V1.20.1 irradiated fists (#460)
- irradiated fists
- Cleanup
- feat/irradiated-fists (#459)
- feat: Added major detonation render and ability
- feat: added slashing sounds to wolverine
- feat: add vital points (pressure points) to cap atom and starfire (#457)
- feat: add vital points (pressure points) to cap atom and starfire
- fix: based off review
- V1.20.1 crippling kick (#456)
- feat: begin on starfire's crippling kick
- fix: changes based off review
-
- Added Crippling Kick Victim Anim
- feat: better tracking for claw extensions
- fix: Alts with wrong tiers
- fix: Green Canary missing flight
- fix: Wolverine (2000) missing cubes
- chore: better grounding
- chore: entity cleanup
- V1.20.1 review fixes (#455)
- fix: skull crusher lands its first blow instead of throwing ServerTimer.schedule rejects a non-positive delay, and the arm-on-press rewrite moved off scheduleMilliSeconds, which had clamped it. The i=0 blow asked for 0 ticks, so the exception escaped onArmedHit and the AttackEntityCallback into packet handling: no damage landed at all and the hitting flag was left stuck true.
- fix: the ability lock extends cooldowns rather than refunding them setCooldown writes an absolute value, so locking a victim for 60 ticks handed back anything longer they were already sitting on. Optic Prone could be spammed to cap a target's whole kit at three seconds.
- fix: the grounded slam spares the applying hit, climbers and swimmers GroundedEffect rides the same effect list as PUSH_EFFECT and every effect in that list damages in turn, so the slam fired on the applying hit and wiped the knockback Perfect Angle had just set. Stamping the tick keeps it to every hit after, as the effect's own doc says. The slam also only measured the drop, never whether the target was airborne: a ladder is footing of its own and water has no floor a straight-down ray can find, so a point of chip damage dragged the target the length of the climb or down to the seabed.
- fix: armed abilities honour the cooldown throttle onTick ignored its tickCooldown argument, so an armed ability recharged straight through a speed stun that froze everything else. The arm window shares the same counter but is a deadline rather than a recharge, so it keeps running.
- fix: flat dashes keep their heading at the pitch stop Flattening the look vector and normalising it returns ZERO below a length of 1.0E-4, and at the pitch stop the horizontal part is about 4.4e-8. Clawed Pounce and Feral Leap parked the player motionless in mid-air for the whole duration; X Slash silently produced no lunge. Deriving the heading from the yaw keeps it unit length at any pitch.
- fix: the blood trail spares its caster and their allies The bleed tick applied to every living entity standing on a blood decal, so the Wolverine who cast the tunnel bled themselves walking back down their own trail, as did teammates and pets, for the decal's full lifetime. Every other damage path in the ability already filters. Decals now carry an owner, so the trail answers to the same friendly-fire rules. Also takes the two heading reads off the flatten-and-normalise pattern, which had the same pitch-stop zero vector as the other dashes.
- fix: scent tracker stops stripping a glow it never applied The glow moved client-side to GlowMixin, but onDeactivate still removed the vanilla effect, cancelling a spectral arrow or a teammate's ability when the window ended.
- V1.20.1 next update list (#454)
- feat: grounded entities are slammed into the ground when hit GROUNDED only ever slowed creative flight and blocked fast flight. Now every hit that lands on a grounded entity drives it back down to the floor it was trying to leave: raycast for the surface below, teleport onto it when there is room, and point what is left of the momentum straight down. Works off the effect rather than off a flight suit, so it bites on any living entity. Respects the existing grounded override window, and skips hits that were swallowed by the invulnerability window - HitEntityCallback fires from the tail of damage() without reading its result.
- refactor: homelander melee abilities arm on press Skull Crusher, Deafening Clap and Heartbreaker fired at whichever entity the target lock happened to be holding - set by any melee hit, ever, and never cleared - then flew the player across the map at it. Now the press only arms them and the next punch you land is the payoff, so the victim is the one you chose. Same pattern Claw Stab uses. The whole approach phase goes with it: at armed-hit time the target is already in melee range, so there is nothing to fly at and nothing to abort. Also fixes two things that fell out of the conversion:
- amplifier() falls back to 16 when the CSV says -1, so all three had been applying IMMOBILE/NAUSEA/CONFUSION at amplifier 16. Debuff strength and length are now constants, and duration() becomes the arm window.
- Heartbreaker's 15-tick lock decremented in both onTick and its living-tick listener, making it really seven. onTick is now the interface's, leaving the listener as sole owner.
- feat: optic prone locks abilities, perfect angle grounds Optic Prone now knocks whatever the target has running out of their hands alongside the prone stun, and Perfect Angle takes their flight away. Both arrive as their own AbilityEffect rather than by widening ProneEffect, which any suit can already attach through the laser_effects option - bolting a kit lockout onto plain prone would be a balance change to suits nobody asked about. Suits that do want it can opt in by id. The "cancel everything this entity has running" loop moves out of the Homelander ultimate into AbilityControl, where the new effect can reach it.
- feat: persistent fake block registry, and blood that bites Berserker Tunnel's blood was a fire-and-forget block update: it reached whoever happened to be watching the spot at that instant and nothing else. Players who arrived later never saw it, any chunk round trip put the real block back, and the revert reached a different set of people than the placement did - which is why the blood sometimes outlived its timer and sometimes vanished early. FakeBlockRegistry keeps them instead. Expiry runs on the server clock so everyone loses them together, decals are replayed to anyone who starts watching the chunk, and holding the positions means gameplay can finally ask what is on the ground - so standing in the blood now opens the cuts back up, a second in it for two seconds of bleeding. Lifetime drops to two minutes and the per-cast cap to 96: now that the decals really do follow players around, 160 of them was a packet burst every time somebody walked back into the area.
- balance: shorten the berserker tunnel dash Thirty-two ticks at 1.8 carried the charge nearly sixty blocks, which is most of a render distance and impossible to use indoors. Twenty blocks still reads as a charge and lands where you aimed it.
- fix: scent tracker requires aim, glows locally, frees the arms Three things wrong with picking up a scent: The target was whichever entity came first out of the area query that could see you, so aiming had nothing to do with it. It is a cone now, and one that prefers the nearest candidate. The mark was a GLOWING status effect, which the server hands to every client in the world - everyone could see who Wolverine was tracking. The outline is drawn on the tracker's own client instead, off the target UUID that was already being synced for the HUD. The limb override was keyed to the ability being active, so the arms stayed locked for the full ten seconds of tracking rather than the second the sniff takes.
- balance: x slash lunges flat and shorter The slash jumped and then launched, which threw Wolverine well over anything he was slashing at. It is a lunge along the ground now. The old dash vector also normalised a vertical component it immediately discarded, shrinking the horizontal reach it was supposed to be setting.
- fix: drop the claw trail from retract claws Popping the claws is not a swing; it should not draw one.
- fix: clawed pounce sustains a flat dash One impulse at activation and nothing afterwards, so friction had eaten it two blocks in and the pounce halted. The push is held every tick now, read fresh from where the player is looking so it steers, with the vertical zeroed each tick to cancel gravity and keep it dead flat.
- balance: cap wall climb speed Gravity is off while gripping and the climb increment is added to the vertical speed already there, so a long climb accelerated until drag caught it around two blocks a tick. Lowering the increment alone only slowed the ramp; the fix is the ceiling.
- feat: feral leap flies a plateau, and survives the landing Three impulses fired four ticks apart read as a stutter-hop, not a leap. The velocity is driven every tick now, through a rise, a level cruise and a descent: up over the wall, flat across the gap, down onto whoever is at the far end. Zeroing the vertical during the cruise cancels the gravity accumulated since the last tick, which is what makes the middle stretch flat, and the heading is still read fresh so it steers. Coming down off a plateau that high is well past acrobatics' four-point cutoff, so the leap now eats fall damage of its own for the flight and three seconds after it. Also drops the claw trail - the leap is a pounce, not a swing.
- fix: cyclops changes to rage, tunnel, stab, lunge
- fix: slashing frenzy anim
- remove workflows!
- feat: Wolverine rework, full new kit (#452)
- feat: X-Slash ability
- Wolverine rework: new kit, renders, sounds Replace Wolverine's kit with ten purpose-built abilities on Wolverine-only ids, leaving the shared ids (frenzied_swipes, feral_lunge, healing_factor, berserker, toggle_claw, latch, fillet, hunter_vision) untouched so X-23, Beast, Cheetah, Blade, Deadpool, Red Hood, Omni-Man and Hawkman keep their current behaviour.
-
- Added Feral Leap Anim
- Added Feral Leap Victim Anim
-
- Added Berserker Tunnel Anim
- Added Retract Claws Anim
-
- Added Berserker Rage Slash Up Anim
- Added Berserker Rage Slam Anim
- feat: radiation beam and radiation blast and base hand blast (#448)
- radiation beam and radiation blast and base hand blast
- book stuff and explosion
- ne sounds and fixed useability
- Made the beams a little more generic & reusable
- feat: claw render trail
- chore: cleaned up comments
- feat; clawed pounce, claw stab, feral leap, x-slash all complete
- feat: berserker tunnel first draft
- feat: new damage calculation, cleaner climbing
- fix: undo climb changes
- chore: clean up
-
- Added Hypnosis Anim - Added Clawed Pounce Anim - Added Mist Form Anim
- Added solar glare back to ultraman
- Cleanup gift of the gods description
- feat: New deco blocks
- feat: Prone book entry
- fix: Background of Centrifuge/Alloy Smelter not rendering
- fix: bug fixes for banner transform, ooze canister, and visor-off ability (#450)
- Update sentinel and criminal spawn rates (#445)
- New release structure (#446)
-
- Added X Slash Anim
- Added Claw Stab Anim _ Added Clawed Pounce Anim
-
- Added Starbolt Swerve Recovery Anim _ Updated Starbolt Swerve Anim Seperation
- fix: Sheetmetal Fencing Model
- fix: Prone status effect icon
- book entry: Alts and Shinies
- Bug fixes for banner transform, ooze canister, and visor-off ability
- fix: aerial charge, grapple gun (#451)
- Run ability cleanup on external deactivation; fix grapple cut and item dupes Three themes, plus review fixes on top of the working-tree changes. Ability deactivation
- Add AbilityUtils.deactivate(...) and ThematicAbility#deactivate(...), which clear the active flag and then run ITemporarilyActiveAbility#onDeactivate. A raw setActive(..., false) only flipped the stored flag, so state set up in onActivate leaked: Latch never dismounted, Malleability never removed its temporary scales. Replace the ~15 external setActive(..., false) call sites.
- The id-based overload falls back to the AbilityRegistry prototype when the ability is not on the currently worn armor, so component- and status-effect- driven deactivations (enemy_mimic, quantum_tunneling) still get cleanup.
- LatchAbility now ends when the ride ends. Its getTickInterval override was dead code - AbilityEventDispatcher never consulted it - and is removed. Grapple cut
- Move the cut to a UseItemCallback in ServerHandler. Vanilla skips Item#use entirely while an item is on cooldown, so after the gun set its 5s cooldown on fire, the right-click meant to release the grapple never reached the item. Fabric injects at the head of interactItem, ahead of the cooldown gate.
- destroyHook now clears the NBT key even when the entity is already gone (unloaded chunk, dimension change), which previously left hasHook() stuck true forever. It also guards on GrappleHookEntity before discarding: entity network ids are per-session, so a stale id resolved to an unrelated entity and deleted it. Cutting now zeroes the player's momentum, matching GrappleHookEntity#discardHook. Item pickup and dupes
- NthMaceEntity persists its stack and dealtDamage to NBT; without it the mace reloaded empty, tryPickup always failed, and it orbited the owner forever. tryPickup now rejects an empty stack, since insertStack returns true for ItemStack.EMPTY and the caller would discard the mace and give nothing back.
- AquamanTridentEntity refuses a second pickup while the whirlpool is spinning, and activateWhirlpool drops the trident at the player's feet when the inventory is full instead of silently destroying it.
- AerialChargeAbility only grabs what the player is looking at, validates the stored target before use, and moves it with a swept collision-resolved step instead of setPosition. The old fallback slammed an arbitrary bystander on every deactivation.
- SonicStrikes clears its target key with remove(); storeUUID ignores empty strings, so the old reset was a silent no-op and stale UUIDs survived. Gift of the Gods
- Apply the documented attack boost and defense penalty via getEffectedStats, and stop routing the effect choice back through getEffectedPart() where an isActive() hiccup could drop it. Rebalance to 8s duration / 30s cooldown / amplifier 2.
- Note: the book entry is shared between Wonder Woman, where this is ability_2, and Wonder Girl, where it is the ultimate. The "[ULT]" prefix is dropped, so the label is now accurate for Wonder Woman and not for Wonder Girl.
- Code cleanup
-
- Added Slashing Frenzy Anim
-
- Added Berserker Rage Slash Up Anim - Added Berserker Rage Slam Anim
-
- Added Berserker Tunnel Anim - Added Retract Claws Anim
-
- Added Feral Leap Anim - Added Feral Leap Victim Anim
-
- Added Starbolt Swerve Recovery Anim _ Updated Starbolt Swerve Anim Seperation
-
- Added X Slash Anim - Added Claw Stab Anim _ Added Clawed Pounce Anim
- Make modpack update manual and check both components at once Drops the automatic workflow_run trigger (which also sidesteps the workflow_run/default-branch gotcha) in favor of a single manual dispatch that checks core and heroes' latest published state together. The patch script is now idempotent: it only touches whichever component actually changed and bumps the modpack's own version at most once per run.
- Add dispatch for modpack
- Attempt #6
- Fix versioning on releases
- Fix push
- Fix versioning
- Fix pipelines
- Updated the release structure (#447)
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:X8IXdS40:rKulEY9K"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:X8IXdS40:rKulEY9K"
}

