Conversation
# Conflicts: # src/main/java/mc/duzo/timeless/suit/set/SetRegistry.java
…et keybinds, perf fixes)
extends superman's powerlist beyond the placeholder flight + super_strength + swift_sneak. now reflects superman's iconic feel: - new invulnerability power: resistance iii tick (22-tick duration refreshed every second), same pattern as super_strength - super_jump added (already existed in powerregistry, was unused on suits) heat vision / cold breath / x-ray are intentionally out of scope - those need bespoke logic (raycast / projectile / damage tuning) and deserve their own pr each.
|
Picked this up to add some iconic Superman powers beyond the placeholder kit:
Also merged current master in (commit Heat vision / cold breath / x-ray are intentionally not in this push -- each needs bespoke logic (raycast / projectile / damage tuning) and deserves its own PR. Happy to scope those if wanted. |
double-tap activation:
- new client/keybind/doubletapjumpflight detects two jump-key presses inside a 250ms window while on the ground.
- on activation it resolves the player's current suit, finds the index of powerregistry.flight in the powerlist, and sends a usepowerc2spacket. flightpower toggles flightenabled, same backend as iron man's z key, just a different trigger.
- ground-only gate avoids accidentally deactivating mid-flight (vertical ascent already uses repeated spacebar).
datagen build pipeline:
- configuredatageneration { modid = "timeless" } - without the modid filter, the animator mod's datageneratorentrypoint also fires during runDatagen and removes our generated files as "stale" since they aren't in its expected output set. only superman items hit this because they were the latest additions to the registry not yet in the cache.
- sourceSets.main.resources.srcdirs += "src/main/generated" - loom 1.7's auto-include isn't firing here. explicit add lets processresources see datagen output.
- processresources excludes .cache/** and uses duplicatesstrategy.include to handle the datagen pipeline's intermediate files cleanly.
|
Two more changes pushed ( Superman flight on double-tap spacebar (
Datagen pipeline fix (
The four Superman item icons will still render as the missing-texture purple/black checker until Run-client smoke test:
|
two issues from in-game test: 1. doubletapjumpflight required isOnGround for both presses, but pressing space on the ground jumps the player off the ground, so the second press always lands airborne -> code reset and never fired. dropped the gate. now also only activates (skip if hasFlight is already true) so mid-flight accidental double-tap will not drop the player out of the sky; z-key toggle still handles deactivation. flight search loosened to any flightpower subclass so boosted_flight is also matched. 2. superman was using plain flight (mk2/mk3 style) but the user wanted iron-man flight which is boosted_flight (mk5/mk7) - sprint while flying for the boost path. switched superman to boosted_flight. window also bumped from 250ms to 300ms which is closer to standard double-click timing.
three issues, three targeted fixes: 1. real arms not matching suit translations: suitfeature called copyfrom (biped -> suit) before setangles but never copied the post-animation state back. now also calls copyto (suit -> biped) after setangles, so the player biped follows the suit's animated/rotated bones (flying tilt etc.). 2. suit not always rendering: supermansuit overrode isalwaysvisible to false, so the suit disappeared whenever the player was invisible. removed the override - default in suit.java is true, which is what we want. 3. first-person showed only the suit, no hand / no held item: the renderArm mixin was @at("HEAD") cancellable with ci.cancel(), so vanilla's player arm + sleeve + the path that lets held items reach the wrist were both stomped. switched to @at("TAIL") - vanilla draws the arm and the held-item rendering happens normally, then the suit arm is layered on top.
base cuboids on stevesuitmodel and alexsuitmodel had dilation 0.0 - same dimensions as the player skin underneath - so the suit z-fought with the body wherever they overlap (whole torso, arms, legs). bumped base layer to dilation 0.25 (suit always slightly outside the player skin) and overlay layer to 0.5 (always slightly outside the new base) so the layering is body < suit-base < suit-overlay with clear depth separation. matches the convention vanilla uses for armor models. bonus: revert from previous commit was that supermansuit's isalwaysvisible removal still applies; that was a separate visibility-during-invisibility issue, not the z-fight one.
rotateParts (the procedural flight tilt + roll on body/limbs) was being called inside each suit model's render() method. but suitfeature already does: copyfrom(biped) -> suit takes biped pose setangles(...) -> suit runs animations copyto(biped) -> player biped takes suit pose model.render() -> rotateparts ran here, too late so the tilt landed on the suit only. the player's actual biped (which the suit visually overlays) kept its un-tilted pose, leaving a visible mismatch in flight. centralized the timing: suitmodel.setangles now calls a protected rotateparts hook (default no-op) right after runanimations, gated on the same anim/transform condition the subclasses used. moved the actual implementations from private to @OverRide protected in stevesuitmodel, alexsuitmodel, genericironmanmodel, markfivemodel and removed the rotateparts call from each render(). the per-model translates/scales that lived alongside rotateparts in render() stay where they were (those are render-only matrix ops, not part-state mutations).
About the PR
Why / Balance
Technical details
Media
Requirements
Breaking changes
Changelog