Source: Decompiled from
HytaleServer.jar(pre-release2026.02.05-9ce2783f7)
Scanners determine the vertical (Y-axis) positions at which props attempt placement. After a position provider generates candidate XZ coordinates, the scanner examines each column to find valid Y positions. There are 5 registered scanner types.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
Skip |
boolean |
No | false |
If true, scanner is disabled |
ExportAs |
string |
No | "" |
Name for Export/Import reuse |
At runtime, scanners receive a context with:
| Field | Type | Description |
|---|---|---|
position |
Vector3i |
Base position for scan |
pattern |
Pattern |
Pattern matcher for validity testing |
materialSpace |
VoxelSpace<Material> |
Material data for block queries |
workerId |
WorkerIndexer.Id |
Worker thread identifier |
Scans only the exact origin position. Returns the position if the pattern matches, empty otherwise.
No additional fields.
Space size: (0,0,0) to (1,0,1)
{ "Type": "Origin" }Scans vertically in a single column, iterating linearly through a Y range.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
MinY |
int |
Yes | — | Minimum Y offset for scan range |
MaxY |
int |
Yes | — | Maximum Y offset for scan range |
ResultCap |
int |
No | 1 |
Maximum results to return (>= 0) |
TopDownOrder |
boolean |
No | true |
Scan top-to-bottom (true) or bottom-to-top (false) |
RelativeToPosition |
boolean |
No | false |
Y values relative to scan position |
BaseHeightName |
string |
No | "" |
Framework DecimalConstants entry for base height |
Behavior:
- If
RelativeToPositionis true: scans fromposition.y + MinYtoposition.y + MaxY - If
RelativeToPositionis false: scans frombaseHeight + MinYtobaseHeight + MaxY TopDownOrdercontrols iteration direction- Stops when
ResultCappositions are found
{
"Type": "ColumnLinear",
"MinY": 60,
"MaxY": 120,
"ResultCap": 1,
"TopDownOrder": true
}Scans vertically using random Y sampling within a range.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
MinY |
int |
Yes | — | Minimum Y offset for scan range |
MaxY |
int |
Yes | — | Maximum Y offset for scan range |
ResultCap |
int |
No | 1 |
Maximum results to return (>= 0) |
Seed |
string |
No | "A" |
Random seed |
Strategy |
string |
No | "DART_THROW" |
Selection strategy |
RelativeToPosition |
boolean |
No | false |
Y values relative to scan position |
BaseHeightName |
string |
No | "" |
Framework DecimalConstants entry for base height |
Strategies:
| Strategy | Description |
|---|---|
DART_THROW |
Randomly probes Y positions; attempts range * 1 tries, returns unique matches up to ResultCap |
PICK_VALID |
Finds all valid positions first, then randomly selects ResultCap from them |
{
"Type": "ColumnRandom",
"MinY": 10,
"MaxY": 200,
"ResultCap": 3,
"Seed": "cave_props",
"Strategy": "PICK_VALID"
}Scans a 2D area (XZ plane) using a child scanner at each column position.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
ResultCap |
int |
No | 1 |
Maximum total results across entire area (>= 0) |
ScanShape |
string |
No | "CIRCLE" |
Scan pattern shape |
ScanRange |
int |
No | 0 |
Radius/half-width of scan area (>= 0) |
ChildScanner |
ScannerAsset |
No | Origin |
Scanner to apply at each column |
Scan Shapes:
| Shape | Description |
|---|---|
CIRCLE |
Circular area — positions where distance(x, z) <= range |
SQUARE |
Square area — all positions in [-range, range] for both X and Z |
Behavior:
- Pre-computes all valid scan positions and sorts by distance from origin
- Applies child scanner at each column position in distance order
- Combines results up to
ResultCap
Space size: (-range, 0, -range) to (1+range, 0, 1+range)
{
"Type": "Area",
"ScanShape": "CIRCLE",
"ScanRange": 3,
"ResultCap": 5,
"ChildScanner": {
"Type": "ColumnLinear",
"MinY": 60,
"MaxY": 120,
"ResultCap": 1
}
}References an exported scanner by name.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
Name |
string |
Yes | — | Name of the exported scanner |
{ "Type": "Imported", "Name": "terrain_scanner" }| Scanner | Y-Axis Mode | Area Support | Randomness |
|---|---|---|---|
| Origin | Single point | No | None |
| ColumnLinear | Linear scan | No | None |
| ColumnRandom | Random sample | No | Yes (2 strategies) |
| Area | Delegated | Yes (2D area) | Optional (via child) |
| Imported | Delegated | Varies | Varies |
Source files: ScannerAsset.java, Scanner.java, OriginScannerAsset.java, ColumnLinearScannerAsset.java, ColumnRandomScannerAsset.java, AreaScannerAsset.java, ImportedScannerAsset.java