tactical-neoforge-1.21.1-0.32.0.jar
Curse Maven Snippet
What's new
0.32.0 — Guardian and elder guardian: real underwater routes, the native beam, thorns and the elder's own slowdown
Build: Minecraft 1.21.1 / NeoForge 21.1.216; mod_version 0.32.0, artifact tactical-neoforge-1.21.1-0.32.0.jar. Protocols unchanged (Tactical 12, Skill 4, BattleLog 2). Phases A, B and C verified within the limited scope stated below. C covers the frozen build and package gates, six targeted dedicated-server fixtures and the four real-client groups; the maintainer personally reviewed the eight selected main screenshots and no claim is made for every original image, for an executor-side visual review, for a standalone packaged-JAR run or for the test machine.
- Two exact types with their own identity.
minecraft:guardianandminecraft:elder_guardianare matched by exactEntityTypeonly. They are not turned into Flying, slime or spider bodies, no other mob inherits their displacement, and the existing amphibious adapter was not widened to cover them. - It swims the water it really has. A route node keeps the real fractional feet instead of snapping back to a cell centre. A node is legal only when the real foot point and the real eye point are both in water, the whole body box is inside the world and the battlefield, and nothing else is in it. Every edge is a 26-neighbour 3D step whose whole-body sweep must be clear; along that sweep the feet path and the eye path have to stay continuously in water and the body may contain no non-water liquid and no collision - this is a rule about those two paths and the body's contents, not a demand that every voxel of the body box be water - so a leg that ends in water on both ends but crosses an air corner is refused. Chunk loading is proved before any block or liquid is read; nothing is force-loaded, and a body standing dry on the shore is refused instead of being teleported into water that happens to be nearby.
- Bounded, prepaid, and only when it improves. At most 512 discovered nodes per own turn, deterministic breadth-first, never stepping onto another unit's cell. The caller supplies the firing-distance score and a prefix is handed out only when it strictly improves that score, so a guardian with a short budget never swims closer to a place it still cannot fire from. Each edge is prepaid at the existing
moveCost; moving itself is not a paid action, and unwalked edges are given back. - Deployment is refused rather than faked. A candidate is placed only at a real legal underwater position that keeps its fractional offset; a dry body is refused with no borrowed flag, no movement and no roster entry. The battle's own area is grown by the real whole-body box, so a candidate that fits by its foot cell but overlaps a neighbouring battle by its real 1.9975-wide body is refused by the existing
tryAbsorbwith both encounters left untouched. - Firing is vanilla's own goal, driven once per tick.
GuardianAttackGoal, captured in its own constructor, is ticked exactly once per server tick through the nativestart/tick/stopentries; the goal selector is not ticked as a whole, the goal is not removed, andNoAI/customServerAiStepare never opened. The beam is bound to the exact(actor, goal, target)triple it started with: the goal must still be the one installed in that body's selector and still target this opponent, re-proved every tick. Removing or replacing the goal stops the action safely - no damage, no charge, no driving an object that is no longer installed. - One beam, one settlement. The charge window is the body's own native
getAttackDuration()- 80 ticks for a guardian, 60 for the elder - preceded by vanilla's own 10-tick warm-up before the synced target appears, with no additional artificial delay. The price is frozen from the session's shared surcharge at commit (20 AP by default,ap.guardian.beamCost), so a configuration change during a charge does not move it. One settlement per beam: whichever of the two native calls inside the goal's own tick really lands charges it exactly once, both landing still charge once, and both refused means zero charge with the paid count and AP untouched. A real hit from any other source - including a bypassdoHurtTargetby the same actor on the same target, and a nested report from another guardian - cannot fill this beam's receipt. - Thorns belong to the guardian, not to every hurt. A narrow wrapper reports the single thorns call inside
Guardian.hurt. It fires for a real melee hit from this encounter's opponent, and reports zero for movement, for a real arrow, for a bystander, for the same side and for another battle's source; the main hit is cancelled without losing the reflection, and the behaviour returns to vanilla once the body leaves the encounter. - The elder's slowdown is a native effect on its own turn. On its own turns 1, 7 and 13 it is given the native digging-fatigue pulse at amplifier 2 for 6000 ticks, through the native
addEffectand itsApplicableanswer - a refusal really refuses, a stronger instance is not overwritten, a second elder pulses only on its own turn 1, and remaining time is kept on a real exit while the frozen clock is released. - An interrupted body falls by sweep and keeps its real feet. When the water under a held swimmer is removed, the descent is bounded slices of the whole body at the real X/Z, and it settles only on a real legal water node. A body that comes down where no legal water is left is released by a named safe exit that returns the roster entry, the queue, the claim, the motion ownership and the original
NoAI/persistence flags, without deleting or moving the mob, and is a different journal row from the shared fall timeout. - Nothing is left busy afterwards. A target leaving, drained water, an ended session and a failed admission each leave no frozen busy flag, no stale synced attack target, no claim and no charge, and a new encounter never inherits counters from an earlier one.
Verification: The final JAR is 703e5ec97717b7c46f4b4215db85253b56e581c83e80ad90169c7fd5b5db1c41 (2 353 242 bytes). The final build passed 926 Java tests (common 94 + NeoForge 832), zero failures/errors/skips, 51 release-helper tests and packaging checks with the pinned YiRan library. Its guardian fixture emitted 933 checks, including a dry-shore negative with a usable pool nearby and unchanged flags, position, claim and roster. Drowned, effects, teams, multi-battle and isolation regressions retain their recorded preceding-freeze results: they were not re-run for the three-line guardian-only admission guard. Real GLFW client G1-G4 and Chinese journal captures came from the preceding dfcb8ea4... development-source freeze: eight prepaid swim edges without a paid-action increase, one 20 AP native beam, a zero-charge occlusion interruption, the elder's 60-tick beam and real fatigue, and real member melee with native thorns followed by a product exit. Those actors' admission points were already wet, so this positive-path evidence was retained, not re-run or labelled as testing the final JAR. The maintainer personally inspected the eight selected main screenshots, not every original or auxiliary image; the executor made no visual claim. No standalone packaged-JAR or test-machine runtime acceptance is claimed.
Limits: the 120-tick abnormal cutoff is constrained by the state machine's own arithmetic and the observed normal 80/60-tick windows rather than forced in a dedicated-server run; the 200-tick effect cycle is carried by the shared effect engine and its own regression. A native physical call that succeeds and then throws inside its own follow-up was not reproduced on a dedicated server and is covered at source level only. Runtime evidence uses development source sets, not standalone packaged-JAR or test-machine runtime acceptance, and no full historical matrix or all-geometry claim is made.
This mod has no additional files