mangosone-server/logd
H0zen 4896da05af Terrain, extractor, config and networking work from the alignment branch
The remainder of the `alignment` branch, after the vessel/visibility work and the
tick split were taken as their own commits. Grouped here because it is what is
left, not because it is one change: terrain and extractor hardening, the config
parser, taxi splines, and a networking fix.

Terrain: liquid interpolation moved into WmoModel::GroupLiquidAt; the tile-crossing
walk in FusedTerrain now traverses the grid instead of sampling the segment at fixed
steps, which used to miss any tile a segment only clipped the corner of -- sight
straight through a building, or a fall through a bridge.

Extractor: MLIQ, WMO and DBC parsing reject malformed input rather than baking it.

Config gains a test suite (ConfigTest.cpp).

Networking: Nagle is disabled on the IOCP path, so a small packet is no longer held
back waiting for a peer that is waiting for it.

Taxi: continuous multipoint spline flight, and the fall tracker is reset on flight
so landing does not read as a fall.

THREE CONFLICTS IN THIS AREA WERE RESOLVED BY COMBINING, NOT BY CHOOSING -- see the
merge notes below; each is a case where this branch and the ported mangos_two work
had fixed different halves of the same function.

  Terrain.hpp TileIndex: two defects at opposite ends of the same axis. The port
  floors so a coordinate in (-1, 0) stops answering as tile 0; this branch folds the
  exact far edge so 8192 stops answering as tile 64. Both are kept -- flooring leaves
  an exact 8192 exactly 8192, and the fold's guard is false for every negative index.

  WmoModel: this branch extracted the per-group liquid lookup into GroupLiquidAt and
  lost all three of the port's guards in the move -- the heights/tiles size check that
  H() indexes on, the positively-stated range test that lets a NaN fall out, and the
  ordering that ranges in float BEFORE converting to int. The extraction is kept and
  the guards are back inside it.

  GridMap: both trees implemented the collision disables. The cached read is kept and
  the direct DisableMgr::IsVMAPDisabledFor calls are not: that function reaches its
  container through operator[], which INSERTS when the type is absent, so asking it
  from a map-update thread is a write racing `.reload disables` on the world thread.
  Line of sight now routes through NearestHitFraction so the disable is applied in one
  place and the sight test cannot disagree with the hit position, and `ignore` travels
  with it.

Also: FusedTerrain's pin counter is uint32_t in this tree, not the int16_t the ported
comment claimed, so the saturation ceiling and that comment were both corrected.
Accelerators carried two identical Bvh::Adopt definitions after the merge -- a
duplicate symbol git reported no conflict for -- and TileSerializer carried the same
index check twice under two names; one of each was removed.

The Eluna submodule pointer is deliberately NOT moved by this commit.

NOT COMPILED -- no build was run, per the standing rule that none is invoked
without an explicit request.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 23:08:31 +01:00
..
message.txt Terrain, extractor, config and networking work from the alignment branch 2026-08-09 23:08:31 +01:00