Warcraft III elevators
Blizzard.j stores an elevator's logical level in destructable occluder height.
GetElevatorHeight computes 1 + R2I(occH / 128) and clamps invalid levels
to 1; ChangeElevatorHeight writes 128 * (level - 1). This is mutable
runtime state, not just an occlusion hint. ElevatorPuzzle.mdx translates its
walkable deck to approximately 0, 128.03, and 255.892 units in stand, stand
second, and stand third. The engine should use the requested 0/128/256 level
height during a transition, matching Blizzard.j's synchronous state update.
HumanX06 bridge placements DTrx_1439/1440/1783 at (1792,5120/4864/4608) are the left A/B/C group; DTrx_0717/0718/1379 at (2176,5120/4864/4608) are the right group. All six get ChangeElevatorHeight(..., 2) during Init_04a_Environment. Initial walls are WEST on left, EAST on right, NORTH on both A pieces, and SOUTH on both C pieces, closed. DTfx_1784 at (1216,4864) is the left plate; DTfx_0721 at (2752,4864) is the right. Each trigger disables itself, kills its plate, switches off its rune rect, waits 0.50 seconds, moves its three pieces to level 3, plays the elevator sound, waits 1.30 seconds, opens the outer wall, and opens the shared divider only if the other plate has already activated. DTep wall blockers use 192-unit offsets and suppress shared edges when an elevator is found 256 units away. Keep that wall policy distinct from deck height.
ChangeElevatorHeight transition pairs from Blizzard.j are 2->1 birth,
3->1 birth third, 1->2 death, 3->2 birth second, 1->3 death third, and 2->3
death second. It queues stand, stand second, or stand third at the target.
MDX transition clips have the non-looping sequence flag. JASS selects and queues
the destructable animations; the entity scheduler advances their frames instead
of the unit movement callback. Non-looping transitions hold at their final pose
until the queued Stand variant takes over. Gameplay unit support uses the
mutable occluder offset immediately; renderer mesh conformance may raise a unit
further but must not lower the authoritative game altitude. Ordinary bridge
support remains unchanged.
Asset findings from local retail archives: DTrx and DTrf both resolve to
Doodads/Cinematic/ElevatorPuzzle/ElevatorPuzzle.mdx; its TEXS entries are
replaceable ID 11 with empty path and Textures/gutz.blp. DTfx, DTfp, and
XTmp resolve to Doodads/Cinematic/FootSwitch/FootSwitch.mdx; its TEXS entries
are replaceable ID 11 plus Textures/LightningBall.blp and
Textures/BlueSqGlow.blp. Object data assigns Cliff1.tga (DTrx/DTfx) and
Cliff0.tga (DTrf/DTfp) as the ID-11 replacement. Both MDX models are in War3x.mpq only. gutz.blp and
LightningBall.blp exist in War3.mpq and War3x.mpq; BlueSqGlow.blp is in
War3x.mpq only. Cliff0/Cliff1 replacement BLPs are in War3.mpq. The model and
one switch layer therefore require expansion data. OpenWarcraft already has
expansion archive visibility controls; verify HumanX06 launches with expansion
enabled and both War3x.mpq/War3xLocal.mpq mounted. The existing renderer
retains TEXS replaceable IDs, binds the entity image for replaceable slots, and
converts object-data .tga names to .blp. The HumanX06 runtime trace showed
that the blight path appended Blight to the authored Cliff1.tga replacement
and requested the nonexistent Cliff1Blight.tga; the renderer then bound its
placeholder for MDX replaceable texture ID 11. Keep the destructable's authored
image for this replacement and use the server-authored green vertex tint for
blight presentation. Do not infer a suffixed asset path from textureFile
unless the corresponding asset is present in the loaded archives.