▶️ ЗАБЕРИ СВОИ 8 ПОДАРКОВ 🎁 ПРИ СОЗДАНИИ СВОЕГО МАЙНКРАФТ СЕРВЕРА
Плагины/GPExpansion
GPExpansion

GPExpansion

The ultimate add-on for GriefPrevention 3D Subdivisions

Оцените первым
435
4
Все версииGPExpansion v1.1.15

GPExpansion v1.1.15

Release28.07.2026

Список изменений

GPExpansion v1.1.15

Follow-up to v1.1.14. That release stopped /claim tp from putting players on top of the nether roof, but replaced it with two new failures: creative players ended up embedded inside the bedrock slab, and survival players were told the claim was unsafe and not teleported at all. Both come from the same faulty assumption in the new column scan.

Anyone running 1.1.14 should take this update — nether claims without a custom spawn are effectively unreachable on it.

Bug Fixes

The destination was the block above the terrain, which under a roof is the roof

getHighestTeleportY() walked down from the ceiling limit, skipped roof bedrock, stopped at the first solid block, and returned y + 1 — the position a player would stand in over open terrain.

That last step assumed the space above the ground is free. Under a bedrock roof it usually is not: nether terrain generates packed against the underside of the slab, so the first solid block found on the way down is netherrack at, say, y=124, and y + 1 is the bedrock at y=125. The function reported a destination inside the roof.

What happened next depended on game mode, which is why it presented as two unrelated bugs.

Creative and spectator bypass the safe-location search entirely while teleport.safe-location.staff-ignore-unsafe-location is true (the default) — the requested location is used as-is, unvalidated. Staff testing the fix were teleported straight into the bedrock, a couple of blocks below the roof, with a view of the inside of the slab.

Survival ran the validator, which correctly rejected the position — and then failed to recover, because 1.1.14's clamp left the search starting inside the slab:

  • getSafeDestination() clamped a roof-level request down to logicalHeight - 1 (y=127), so its ground scan began immediately under the bedrock.
  • The scan skipped roof bedrock and stopped at the first terrain below it, putting the candidate stand position back inside the slab.
  • The horizontal fallback searches that one Y level, where within the claim bounds there is nothing but more bedrock.
  • The final fallback searches upward, which under a roof only goes further into it.

Every branch failed, getSafeDestination() returned null, and the player got claim.teleport-unsafe.

What changed

  • getHighestTeleportY() requires head room. A candidate is accepted only when the two blocks above the ground are open, so the scan keeps falling through packed terrain until it reaches a real gap. Where a column has no opening anywhere — solid from the roof to the floor — it now falls back to the terrain surface below the slab instead of failing, leaving the nearby search something to work outward from.
  • getSafeDestination() snaps to that surface rather than clamping to logicalHeight - 1. Clamping was the survival-side bug: it dropped the search to just below the ceiling, which is the one place under a roof where the horizontal and upward fallbacks are both guaranteed to be useless.
  • isValidGround() and isOpenSpace() are now shared predicates. The ground rules — no lava, water, damaging blocks, beds, or roof bedrock — existed as an inline expression in the descent scan and were re-derived, slightly differently, in the new column scan. One definition now backs both, which is what let the two scans disagree in the first place. isOpenSpace() additionally excludes water and lava from counting as a place to stand, which the raw hollow check did not.

Behaviour Changes

  • Where a nether claim without a custom spawn resolves to. The destination is the first gap with head room scanning down from the roof — in practice the ceiling cavern of the nether, not necessarily the level the owner built at. Claims whose column is packed for hundreds of blocks will land further down than their build. Setting an explicit /claim setspawn remains the way to control this exactly.
  • Custom claim spawns are unaffected by any of this. A stored spawn Y is used directly and only goes through the ceiling logic if it sits above the roof.
  • Nothing changes in the overworld or the end. hasCeiling() is false there and none of these paths run.

Configuration

Nothing to migrate. config-version stays at 1.1.2; no keys were added, renamed, or given new defaults.

Notes

  • No API, permission, placeholder, or command changes. getHighestTeleportY() keeps its signature; only what it returns for a roofed column changed.
  • Both 1.1.14 regressions were reproduced in-game before the fix — the creative embedding visually, the survival refusal as claim.teleport-unsafe. The fix itself is verified by compilation and by tracing both paths, not by a fresh in-game teleport.
  • Still outstanding from 1.1.14, unchanged:
    • BanEnforcementListener and /claim ban's ejection path fall back to getHighestBlockYAt(), so ejecting from a nether claim can still deposit a player on the roof.
    • getSafeDestination() uses -1 as its "no ground found" sentinel, which collides with a genuine ground block at y=-1 in 1.18+ worlds.

Файлы

GPExpansion.jar(1.44 MiB)
Основной
Скачать

Метаданные

Канал релиза

Release

Номер версии

1.1.15

Загрузчики

Bukkit
Folia
Paper
Purpur
Spigot

Версии игры

1.20–26.2

Загрузок

3

Дата публикации

28.07.2026

Загрузил

ID версии

Главная