Skip to content

Height-based multi-layer replacement per Y for Tile Culling (parity with Raytraced AntiXray) #48

@dabchi4

Description

@dabchi4

Is your feature request related to a problem?

Yes. In the Overworld I need height-based masking to match natural geology and to block sky bases:

  • Y < 0 should look like deepslate,
  • Y ≥ 0 should look like stone,
  • Y ≥ 100 should be masked as air.
    raytraced-antixray already supports a height map via replacementBlocks (e.g. 0: STONE, -64: DEEPSLATE). But raytraced-tile-culling only accepts a single replacementBlock. If I try to use a map there, the config gets regenerated. As a result, cheaters can material-filter for STONE at Y<0 and easily spot hidden blocks, and sky bases stay hideable.

Describe the solution you'd like.

Add first-class support for multi-layer (Y-range) replacement in raytraced-tile-culling, similar to replacementBlocks in raytraced-antixray.

Proposed, backward-compatible syntax (first match wins, ranges inclusive):
replacementRules:

  • minHeight: 101
    maxHeight: 320
    replacementBlock: AIR
  • minHeight: 0
    maxHeight: 100
    replacementBlock: STONE
  • minHeight: -64
    maxHeight: -1
    replacementBlock: DEEPSLATE

If replacementRules is absent, keep using the current single replacementBlock. Please also document the equivalent height-map behavior for raytraced-antixray so both modules are consistent.

Describe alternatives you've considered.

Tried alternatives:

  • Two configs for the same world (worldFilters: [world]) split by minBlockHeight/maxBlockHeight with different replacementBlock → only one profile applies globally; the other is ignored.
  • Using a height map (replacementBlocks) inside raytraced-tile-culling (similar to AntiXray) → the config auto-regenerates and removes the map.
  • Switching filters from environment:* to exact world names (world, world_nether, world_the_end) → same result (single active profile).
  • Workarounds considered: forbid building above Y≥100 via server rules/Skript; use a single replacementBlock (e.g., DEEPSLATE) for the whole world. These mitigate but don’t solve the core need: multi-layer masking and AIR above Y≥100.

Agreements

  • I have searched for and ensured there isn't already an open issue regarding this.
  • I have ensured the feature I'm requesting isn't already in the latest RaytraceAntiXray.

Other

Repro:

  1. Overworld world, Imanity Raytraced AntiXray | Ores, Entities, Tiles v0.19.3beta.
  2. Create two tile-culling configs for world with different height ranges and different replacementBlock.
  3. Reload the plugin → only one replacement applies for all heights.
  4. Add a replacementBlocks map to tile-culling → the file is regenerated and the map is removed.
    Expected: DEEPSLATE below 0, STONE from 0–100, AIR at ≥101 within one world.

Note: this issue text was translated from Russian via ChatGPT. If anything sounds unclear, I can clarify or provide the original.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions