Decouple the control sign from the gate frame: place then punch to link

Sign creation no longer scans the block it's mounted on. Instead,
placing a "[Stargate]" sign starts a pending link (shown as "Punch the
gate" on the sign) and the next block the owner left-clicks within
gate.link-timeout-seconds and gate.max-link-distance becomes the scan
seed. This lets the sign act like a DHD console standing apart from
the gate instead of being physically attached to the frame.

- Gate now stores the punched link block's coordinates (link_x/y/z)
  so restarts re-scan from there instead of deriving a seed from the
  sign's attachment, which no longer applies.
- New GateLinkListener handles the punch and reports scan failures
  via the existing diagnostic messages; also clears pending state on
  disconnect.
- Exit-location facing is now derived from the punched frame block's
  position relative to the iris, since a WallSign facing is no longer
  guaranteed to exist or be relevant.
This commit is contained in:
Michael Burgess
2026-08-09 10:32:46 -04:00
parent 89d4fa0b63
commit 317602c00e
11 changed files with 254 additions and 86 deletions
+8 -4
View File
@@ -25,16 +25,20 @@ Build everything with `./gradlew build`. Jars land in each module's `build/libs/
`gate.chevron-lit-material` (default gilded blackstone); closing the gate restores
them to their original block, so a chevron can rest as plain obsidian and blend
invisibly into the frame until it lights up.
3. Place a sign on the outside of the frame with:
3. Place a sign anywhere - it doesn't need to touch the frame, so it can act like a DHD
console standing apart from the gate - with:
- Line 1: `[Stargate]`
- Line 2: network name (blank = default network)
- Line 3: gate name (blank = auto-generated)
- Line 4: `hidden` to keep it out of the cycle list, `fixed:GateName` to lock this
gate to always dial `GateName` (no right-click cycling), or blank
4. The sign will show "Punch the gate (30s)". Within `gate.link-timeout-seconds`,
left-click (punch) any block of the frame ring, within `gate.max-link-distance` of
the sign. The plugin flood-fills out from that block, confirms it's a fully enclosed
ring, and links the sign to it.
The plugin flood-fills the frame from the block behind the sign, confirms it's a
fully enclosed ring, and registers the gate. If nothing happens, the ring isn't
sealed or none of its blocks match `frame-materials`.
If punching a block doesn't work, the plugin tells you exactly why in chat - an
unrecognized frame material, a gap in the ring, too far from the sign, etc.
## Using a gate