tactical-neoforge-1.21.1-0.31.0.jar
Curse Maven Snippet
What's new
0.31.0 — Slime and magma cube: the real body, one hop per edge, the native contact
Build: Minecraft 1.21.1 / NeoForge 21.1.216; mod_version 0.31.0, artifact tactical-neoforge-1.21.1-0.31.0.jar. Protocols unchanged (Tactical 12, Skill 4, BattleLog 2). Phases A, B and C verified; publication status is tracked separately.
Two exact types again.
minecraft:slimeandminecraft:magma_cubeare registered by exactEntityTypeonly. No other EntityType inherits these tactics merely by subclassing Slime. Scaled bodies are checked at their real size and refused when they do not fit; neither type uses Flying or spider surface policy.The body is the unit, not a cell. A size 4 body is 2.08 blocks wide and tall while a size 1 body is 0.52, so the ground rule is asked of the real box with the whole footprint, a real support face under every column, no liquid, no hazard, no other body and every touched column loaded - deliberately not through the plain two-cell head clearance. A two-block room refuses the size 4 body and accepts the size 1 one in the same cell while the grid rule accepts both.
Movement is still ordinary movement. Four directions, one horizontal cell per edge and at most one cell up or down, prepaid per edge at the existing
moveCost, no paid action for moving, with the unwalked edges given back when the world stops the route. One bounded route per own turn: at most 512 real nodes, breadth-first, deterministic, never stepping on another unit's cell, and a legal approach prefix is preferred over standing still when no contact is reachable.The hop is presentation and execution of that edge, not a second action. 8 server ticks for a slime and 12 for a magma cube; two half parabolas meeting at one declared apex, 0.6 above the higher end for a slime and 0.6 + 0.2 x size for a magma cube, with one lower tier of 0.15 for a ceiling those arcs cannot clear and no edge when neither clears. Proof and animation call the same function, every frame is re-proved as a full body sweep, the price is frozen at the commit, and the landing is the node's own feet.
The contact is vanilla's own
dealDamage, not a melee swing. A narrow invoker drives it and a narrow wrapper reports the boolean of the onehurtcall inside it, so the action is paid only when that exact call landed - never guessed from a health delta. Vanilla's attack box, eye line, type and size decide legality: a size 1 slime may not damage anything, a magma cube keeps its native+2at every size, and a size 4 body really reaches about two cells of centre distance.NoAIstays true. Native base damage, difficulty/armour/enchantment handling and sound are preserved; existing tactical positional modifiers still apply. One contact per own turn, ending the turn either way.A controlled body owns its own displacement.
LivingEntity#travelis skipped only for an exact controlled slime or magma cube, andonGroundis set false at a take-off or fall start and true at every legal landing, so the native squish, particles and sounds keep reading the truth. Ticks,aiStep, fire, effects, freezing, damage and death are untouched, and a slime outside the encounter keeps vanilla behaviour.An interrupted body falls by sweep, never by snap. An edge that can no longer be flown stops the body where it really is, refunds only the edges it never started and hands it to the existing fall rule - establishing that fall before the turn is handed on. A body interrupted less than a whole block above its floor descends in bounded slices that sweep the whole body, keeps its real X/Z and settles only on a real legal foot surface; one that cannot settle follows the existing bounded deadline. The fixture proves 0.45 as one bounded sweep and 0.60 at the arc apex with a real intermediate sample.
A dying parent is still owed its children. Vanilla removes a dead size>1 body about twenty death ticks after it dies, outside this encounter's tick, and only then builds two to four children of half the size.
SlimeSplitLifecycletherefore records the owed split at the moment of death - the exact body, UUID, dimension, faction and the two control flags it borrowed - so the roster entry can go while the wait stays: no victory, no new order, no handed-over turn, andisBusy()true from that tick.The children stay vanilla's. Vanilla creates every child; the mod does not synthesize children or change deathTime. The borrowed
NoAI/persistence are given back on the parent before vanilla copies them onto its children, theMobSplitEventresult is believed exactly as it stands - cancelled means no child, a modified list means exactly the listed ones - and vanilla keeps deciding the count, size, name, invulnerability and initial health.A newborn is separated, then confirmed, then handed over. A child the world is really registering is held for that one hand-over with its own flags sampled and temporarily forced, so it can neither touch a member in the birth tick nor run an AI tick before the encounter confirmed it: the world must really hold that same object, the temporary values are given back, and only then does the ordinary admission run - so the new roster entry captures the real originals. One birth is one admission, and no child inherits the parent's pool, actions, equipment or controller.
Faction comes from the parent. A friendly parent's children are taken as friendly (or kept out), never turned into enemies, and a newborn unit is a new unit: its own
initialAp(maxAp)(100 by default) and no recovery on its first own turn.A refusal is an exit, not a deletion. A full roster uses the existing
MobIsolation; room with no legal foot surface for that body is its own named hand-off, which the old cap-only gate could not express. Either way the child stays in the world, is placed outside every battlefield only by the existing bounded legal search, is held off the members by the same gate, retried a bounded number of times, and released untouched when the encounter ends.The barrier releases exactly once. A member that kills a parent keeps its own epoch, remaining pool and paid count; a turn the barrier deferred (the acting parent died) is handed over once. A split that is never confirmed is released at a frozen 60-tick cutoff, and if nothing else is left the encounter ends with its own reason instead of claiming a victory it could not prove.
Verification: 912 Java tests (common 94 + NeoForge 818) passed with zero failures, errors or skips; 51 release-helper tests and package checks passed. The accepted local C1 build has SHA256 e8d345222f063b42a6670c22f41d9f080ef43844943be4151219aef769021d6e; the published bundle carries its own checksum. The slime fixture passed 1903 checks on a fresh world before the admission-ground flag fix and 1526 on the final build. Unchanged earlier-C evidence is retained for spider 593, block_terrain 91, multi_battle, teams, effects and G1/G2. Real GLFW input with Dungeons Perspective verified large-body hops/contact, tiny-slime no-damage versus tiny-magma native +2, and a real iron-sword kill followed by native children while preserving the member's post-attack epoch, remaining AP and paid count. Real attacks cleared the last size1 child before normal victory and visible HUD exit. A low-cap run admitted one of four native children; the three refused children remained alive outside, with their original flags and no claim after the encounter ended. Selected original screenshots were personally reviewed.
Limits: runtime evidence uses development source sets, not standalone packaged-JAR or test-machine runtime acceptance. No full historical matrix or all-geometry claim is made. The existing reinforcement fixture's transport-capture failure remains disclosed. Upload acknowledgement, moderation and public availability are separate release receipts.
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include

