Skip to content

Stream cam #6

@remdui

Description

@remdui

Is your feature request related to a problem? Please describe.
Tijdens events of streams hebben we een hands-free spectator camera nodig die soepel spelers kan volgen zonder dat staff handmatig hoeft te teleporteren of targets te wisselen. We willen daarnaast een eerlijk, permissie-gebaseerd wachtrijsysteem zodat spelers zich kunnen aanmelden om gevolgd te worden. Als niemand in de wachtrij staat, moet de camera alsnog nuttig zijn door vooraf ingestelde vaste posities te filmen (bijv. spawn/arena). Handmatig regelen is foutgevoelig, kost tijd en geeft schokkerige streams.

Describe the solution you'd like
Een Stream Cam functie in onze Paper “server-features” plugin:

  • Stream Cam-rol (permissie):
    Speler met streamcam.use kan cam-modus starten/stoppen. Bij start: forceer Spectator en sla vorige gamemode op voor herstel.

  • Volg-wachtrij (permissie-gebaseerd):
    Spelers met streamcam.queue.join kunnen via /streamcam join de wachtrij in. De cam volgt automatisch de kop van de rij met setSpectatorTarget.

    • Cyclen: na X seconden (configureerbaar) springt de cam naar de volgende in de rij.
    • Checks: sla offline/vanished/verboden werelden over.
    • Grace: bij /streamcam leave of disconnect uit de wachtrij verwijderd.
  • Idle-gedrag (lege wachtrij):
    Film vaste posities. Staff kan benoemde cam-spots opslaan (world + xyz + yaw/pitch).

    • Modi: static <naam> of cycle door een lijst met configureerbare verblijftijd.
    • Optioneel: zachte pan door langzaam yaw/pitch te bewegen op een scheduler.
  • Commands:

    • /streamcam join – in de wachtrij (vereist streamcam.queue.join)
    • /streamcam leave – verlaat de wachtrij
    • /streamcam queue – bekijk de wachtrij en huidige target
    • /streamcam start / /streamcam stop – cam aan/uit (vereist streamcam.use)
    • /streamcam pos add <naam> – sla huidige locatie op als cam-spot (vereist streamcam.manage)
    • /streamcam pos del <naam> / /streamcam pos list – beheer spots
    • /streamcam idle <static|cycle> [naam] – stel idle-modus in (vereist streamcam.manage)
  • UX & veiligheid:
    Rustige actionbar/titles: “Nu volgend: {player} ({index}/{size})”, “Volgende in {seconds}s”. Rate-limit join/leave.
    Cam-operator onkwetsbaar, botsingsloos, optioneel verborgen in tablist. Herstel vorige gamemode/state bij stop of disconnect.

  • Multi-cam (optioneel): meerdere cam-operators tegelijk; elk met eigen wachtrij en idle-state.

Describe alternatives you've considered

  • Handmatig spectaten/teleporteren: hoge operator-last en foutgevoelig.
  • ReplayMod/externe capture-account: goed voor edits, minder voor live met permissies/wachtrij-fairness.
  • Eenvoudige /spectate <speler> macro’s: geen timing-cycle, geen wachtrij, geen idle-fallback.

Additional context
Doelplatform: Paper. Voorstel permissies & config:

streamcam:
  enabled: true
  cycle_seconds: 20           # tijd per speler in de wachtrij
  queue_max_size: 100
  require_same_world: false
  skip_vanished: true
  idle:
    mode: "static"            # static | cycle
    spot: "spawn"
    dwell_seconds: 15
    gentle_pan: true
  messages:
    now_following: "🎥 Nu volgend: {player} ({index}/{size})"
    next_in: "Volgende in {seconds}s"
    joined_queue: "Je staat in de Stream Cam-wachtrij. Positie: {pos}."
    left_queue: "Je hebt de wachtrij verlaten."
  permissions:
    use: "streamcam.use"
    manage: "streamcam.manage"
    join: "streamcam.queue.join"
    view: "streamcam.queue.view"

Acceptatiecriteria

  1. Speler met streamcam.use kan /streamcam start uitvoeren; wordt Spectator en volgt automatisch de wachtrij-kop.
  2. /streamcam join|leave|queue werken met correcte permissie-checks en duidelijke feedback.
  3. Bij meerdere spelers in de wachtrij cycled de cam elk cycle_seconds, waarbij ongeldige targets netjes worden overgeslagen.
  4. Bij lege wachtrij filmt de cam een vaste positie (of cycled spots) tot iemand joint.
  5. Stoppen/herstarten herstelt gamemode/inventory veilig; geen console-errors bij wereldwissels, target-death of operator-disconnect.

(Implementatiehint, facultatief)

  • Houd per cam state bij: {mode: FOLLOW|IDLE, queue: Deque<UUID>, currentTarget, lastSwitchAt, idleMode, idleSpots[]}.
  • Gebruik Player#setGameMode(SPECTATOR) en Player#setSpectatorTarget(target).
  • Persist spots in YAML of lichte DB (world UUID, x/y/z, yaw, pitch).
  • Luister naar PlayerQuitEvent, PlayerChangedWorldEvent, vanish-hooks en een herhalende taak voor cycle/pan.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions