Twitch-Kanalpunkte für Star Citizen. Zuschauer lösen per Einlösung Aktionen im Spiel aus — Türen öffnen, Licht ausschalten, Fahrwerk ausfahren, in den NAV-Modus wechseln, Emotes, Schleudersitz.
Windows-Desktop-App in Go (Wails + Svelte). Kein Overlay, kein Browser, keine Änderung am Spiel.
Neueste Version herunterladen —
eine einzelne signierte .exe, keine Installation nötig.
Die Programmdatei ist mit einem Certum-Zertifikat signiert und zeitgestempelt, Windows meldet also keinen unbekannten Herausgeber. Prüfen lässt sich das jederzeit selbst:
Get-AuthenticodeSignature .\SCTroll-*-windows-amd64.exe | Format-List Status, SignerCertificate
Get-FileHash .\SCTroll-*-windows-amd64.exe -Algorithm SHA256Zu jeder Version liegt die SHA256-Prüfsumme als eigene Datei bei. Neue Versionen meldet SCTroll ab 1.0.7 selbst, siehe Updates.
Voraussetzungen: Windows 10/11 · Star Citizen einmal gestartet · Twitch Affiliate oder Partner (nur dann gibt es Kanalpunkte)
- Wie es funktioniert
- Der schwierige Teil: die Tastenbelegungen
- Einrichtung
- Aktionen
- Updates
- Sicherheitsnetze
- Wenn nichts passiert
- Twitch-Anbindung
- Star-Citizen-Installation finden
- Bauen und signieren
- Projektaufbau
- Dank
Zuschauer löst Kanalpunkt-Reward ein
│
▼
Twitch EventSub (WebSocket) ──► SCTroll
│
├─ Ist Star Citizen im Vordergrund? nein ─► Punkte zurück
├─ Läuft ein Cooldown? ja ─► Punkte zurück
├─ Ist die Aktion aktiv? nein ─► Punkte zurück
│
▼
Warteschlange (eine Aktion nach der anderen)
│
▼
SendInput ──► Star Citizen
│
▼
Einlösung als erledigt markiert
SCTroll meldet sich per EventSub over WebSocket bei Twitch an und bekommt jede Einlösung
gemeldet. Passt sie zu einer konfigurierten Aktion, wird die zugehörige Taste per
SendInput gedrückt — mit der Haltezeit, die Star Citizen für diese Aktion braucht.
Alle Tastendrücke laufen durch eine Warteschlange. Ohne das würden sich zwei gleichzeitige Einlösungen überlappen und bei langen Haltezeiten eine Taste hängen lassen.
Das ist der Punkt, an dem solche Tools üblicherweise scheitern. Star Citizen verwaltet Tastenbelegungen in zwei Dateien, und beide muss man verstehen:
<Installation>\user\client\0\Profiles\default\actionmaps.xml
Diese Datei enthält ausschließlich, was du gegenüber dem Standard geändert hast. Alles andere steht dort gar nicht drin.
Daraus folgt etwas Wichtiges: ein Eintrag in dieser Datei ist kein Zusatz, sondern eine Überschreibung. Wer eine Aktion dort einträgt, nimmt sich die Standardtaste weg. SCTroll schreibt deshalb grundsätzlich nichts in diese Datei. Es liest nur.
Steckt im Spiel in der Data.p4k und ist dort nicht ohne weiteres lesbar. SCTroll bringt
eine entpackte Kopie mit: 1097 Aktionen in 50 Actionmaps, inklusive der Aktivierungsart
jeder Aktion.
Eine Joystick-Belegung ersetzt die Tastaturbelegung nicht. Wer eine Aktion auf
js1_button4 legt, kann sie weiterhin über die Standardtaste auslösen — und genau die
drückt SCTroll. Ein HOTAS-Setup bedeutet also nicht, dass man alles neu binden müsste.
| Quelle | Bedeutung |
|---|---|
| Eigene | Die Aktion steht in deiner actionmaps.xml — diese Taste gilt. |
| Standard | Sie steht nicht drin und läuft auf Star Citizens Standardtaste. |
| Unbelegt | Die Aktion hat ab Werk gar keine Taste. Türen und Emotes zum Beispiel. |
Bei unbelegt drückt SCTroll bewusst nichts, statt auf gut Glück eine Taste zu senden. Wer diese Aktionen im Spiel gebunden hat, bekommt sie über Aus dem Spiel übernehmen — und fehlende Tasten werden auch beim Programmstart automatisch nachgezogen.
defaultProfile.xml sagt pro Aktion, wie sie ausgelöst wird. Daraus leitet SCTroll ab, wie
lange die Taste gedrückt bleiben muss:
activationMode |
Haltezeit | Beispiel |
|---|---|---|
press, tap |
80 ms | Licht, Fahrwerk |
delayed_press |
500 ms | Master Mode (langer Druck auf B) |
hold, onHold="1" |
800 ms | Decoy, aus dem Sitz aufstehen |
delayed_press_medium |
900 ms | Selbstzerstörung |
delayed_hold_long |
1600 ms |
Das ist kein Detail: mit 80 ms passiert bei einer Halteaktion auch mit korrekter Taste nichts. Star Citizen schluckt zu kurze Drücke.
Star Citizen kann diese Tasten nicht binden — CryEngine kennt die Keycodes nicht (Spectrum-Thread). Der sonst übliche Trick, Zuschauer-Aktionen auf Tasten zu legen, die keine echte Tastatur sendet, fällt hier also weg.
- Star Citizen einmal starten und beenden. Erst dann existiert die
actionmaps.xml. - SCTroll starten. Die Installation wird automatisch gefunden — sonst unter Einstellungen den Ordner wählen.
- Unter Aktionen auswählen, was die Zuschauer dürfen.
- Bei Aktionen, die als unbelegt geführt werden: im Spiel binden, dann Einstellungen → Aus dem Spiel übernehmen.
- Twitch verbinden. Der Browser öffnet sich mit einem Code, den du auf der Twitch-Seite bestätigst. Die Rewards werden danach automatisch auf deinem Kanal angelegt — von Hand ist nichts einzurichten.
- Bei einer Aktion auf Test drücken, ins Spiel wechseln — kommt die Taste an?
Die Anmeldung hält über Neustarts: der Zugangstoken wird im Hintergrund erneuert, bevor er abläuft. Nur wenn du den Zugriff auf Twitch-Seite widerrufst, ist eine neue Anmeldung fällig.
28 mitgelieferte Aktionen. Die Tasten sind Star Citizens echte Standardbelegungen.
| Kategorie | Aktion | Taste | Halten |
|---|---|---|---|
| Schiff | Türen auf/zu | unbelegt | 80 ms |
| Schiff | Türschlösser | unbelegt | 80 ms |
| Schiff | Schiffslichter | L |
80 ms |
| Schiff | Fahrwerk | N |
80 ms |
| Schiff | VTOL umschalten | K |
80 ms |
| Schiff | Flight Ready | RAlt+R |
80 ms |
| Flug | Master Mode (NAV/Quantum) | B |
500 ms |
| Flug | Decoupled Mode | C |
80 ms |
| Flug | Boost | LShift |
1500 ms |
| Flug | Decoy werfen | H |
800 ms, 3× |
| Flug | G-Kompensation | unbelegt | 80 ms |
| Energie | Energie togglen | U |
80 ms |
| Energie | Thruster togglen | I |
80 ms |
| Energie | Schilde togglen | O |
80 ms |
| Energie | Waffen togglen | P |
80 ms |
| Sicht | Scan-Modus | V |
80 ms |
| Sicht | Nach hinten schauen | Comma |
2000 ms |
| Spieler | Helm ab | LAlt+H |
80 ms |
| Spieler | Taschenlampe | T |
80 ms |
| Spieler | Aus dem Sitz | Y |
900 ms |
| Spaß | 360 Spin | Mausbewegung | — |
| Emotes | Tanzen, Winken, Salutieren, Huhn, Verhöhnen | unbelegt | 80 ms |
| Gefährlich | Schleudersitz | RAlt+Y |
200 ms |
| Gefährlich | Selbstzerstörung | Backspace |
900 ms |
Eigene Aktionen lassen sich über das + anlegen: beliebige Taste, Tastenkombination, Maustaste, Wiederholungen oder eine mehrstufige Abfolge.
SCTroll prüft beim Start still im Hintergrund auf neue Versionen und zeigt sie als Leiste über der Oberfläche. Eingespielt wird nur auf Knopfdruck — ein Neustart mitten im Stream wäre ein schlechter Zeitpunkt, den das Programm nicht selbst wählen sollte. In den Einstellungen lässt sich auch von Hand suchen.
Vor dem Austausch wird zweifach geprüft: die SHA256-Prüfsumme gegen die veröffentlichte
Datei und die Authenticode-Signatur über WinVerifyTrust — dieselbe Prüfung, die Windows
beim Ausführen macht. Die Prüfsumme allein würde nur einen heilen Download belegen; erst die
Signatur belegt die Herkunft.
Liegt SCTroll in einem geschützten Ordner wie C:\Program Files, schlägt der Austausch mangels
Schreibrechten fehl. Dann wird zurückgerollt, die alte Version läuft weiter, und die neue lässt
sich von Hand von der Releases-Seite holen.
- Not-Aus im Header pausiert alles und deaktiviert die Rewards auf Twitch.
- Erstattung: Ist das Spiel nicht im Vordergrund, läuft ein Cooldown oder ist die Aktion aus, bekommt der Zuschauer seine Kanalpunkte automatisch zurück.
- Gefährliche Aktionen sind standardmäßig aus, kosten 10.000 bzw. 25.000 Punkte und haben 15 bzw. 30 Minuten Cooldown.
- Zwei Cooldowns: einer lokal, einer auf Twitch-Seite (Minimum 60 s).
- Tastensperre: Blockiert per Low-Level-Hook optional Tasten, während eine Aktion läuft, damit eine physisch gehaltene Taste sie nicht überschreibt.
- Warteschlange: Aktionen laufen seriell, nichts überlappt.
Star Citizen liest Tastatur über Raw Input, nicht über die Windows-Message-Queue. Der
SendInput-Aufruf muss deshalb genau passen. Unter Einstellungen → Sendeverfahren
lassen sich drei Varianten durchprobieren:
| Verfahren | Was gesendet wird |
|---|---|
| Scancode (Standard) | Reiner Scancode, Vk = 0, Extended-Bit über MAPVK_VK_TO_VSC_EX |
| Virtual-Key | Virtueller Keycode — das macht InputSimulator, womit das Star-Citizen-Stream-Deck-Plugin nachweislich funktioniert |
| Beides | Erst Scancode, dann Virtual-Key |
Der Test-Knopf bei jeder Aktion löst sie nach 5 Sekunden Vorlauf aus — genug Zeit, um ins
Spiel zu wechseln. Danach steht im Debug-Log (build/bin/debug.log) pro Tastendruck:
sendKey[scancode]: vk=0x4C scan=0x26 ext=false down ok
sendKey[scancode]: BLOCKIERT vk=0x4C scan=0x26 ext=false down ret=0 err=...
BLOCKIERT→ Windows blockt (UIPI). Läuft Star Citizen als Administrator, muss SCTroll das auch.ok, aber im Spiel passiert nichts → anderes Sendeverfahren probieren.- Hilft beides nicht, greift vermutlich das Anti-Cheat. Dann führt nur ein Hardware-Weg zum Ziel — ein USB-HID-Gerät, wie es ControlPlay benutzt.
Device Code Flow — die Anmeldung läuft über einen Code im Browser, ohne Client Secret in der App.
Benötigte Scopes: channel:read:redemptions, channel:manage:redemptions.
Twitch unterscheidet zwei App-Typen, und das entscheidet über den Token-Refresh:
| Client Type | Anmeldung | Erneuern |
|---|---|---|
| Public | ohne Secret | ✅ ohne Secret |
| Confidential | ohne Secret | ❌ verlangt das Secret |
Eine Confidential-App lässt sich anmelden, aber nach ein paar Stunden nicht mehr erneuern —
im Debug-Log steht dann missing client secret, und die Anmeldung ist bei jedem Start fällig.
Die mitgelieferte App ist deshalb als Public registriert. Für solche Apps existiert gar
kein Secret, es kann also auch keins mitgeliefert werden oder abhanden kommen.
Wer eine eigene App benutzen will: auf
dev.twitch.tv/console/apps anlegen, Client Type auf
Public, OAuth Redirect URL http://localhost (Pflichtfeld, wird beim Device Code Flow
nicht benutzt). Client-ID im Twitch-Tab unter Twitch-App eintragen.
Für eine bestehende Confidential-App lässt sich dort auch das Client Secret hinterlegen. Es wird nur mitgeschickt, wenn gesetzt, und liegt ausschließlich lokal.
Tokens und Rewards gehören immer zu genau einer Client-ID. Ein Wechsel bedeutet: einmal neu anmelden, und die alten Rewards vorher löschen — für die neue App sind sie nicht mehr verwaltbar und blieben sonst doppelt auf dem Kanal stehen.
Die Anmeldung überlebt Neustarts:
- Der Access Token wird 15 Minuten vor Ablauf im Hintergrund erneuert. Ohne das fällt ein Ablauf erst auf, wenn mitten im Stream nichts mehr auslöst — die EventSub-Verbindung meldet keinen Fehler, sie wird still widerrufen.
- Ein fehlgeschlagener Refresh löscht die Anmeldung nicht. Nur HTTP 400/401 gilt als endgültige Ablehnung; 500er, Rate Limits und Netzausfälle sind vorübergehend.
- Beim Start wird mit steigenden Abständen erneut versucht (0/3/10/30/60 s), weil beim Hochfahren oft noch kein Netz da ist.
session_reconnectvon Twitch wird sauber übernommen, ohne Subscriptions zu doppeln.
Rewards, die SCTroll anlegt, haben should_redemptions_skip_request_queue: false — sonst
gilt eine Einlösung sofort als erledigt und ließe sich nicht mehr erstatten.
Eine eigene Client-ID lässt sich in %APPDATA%\SCTroll\config.json unter twitch.client_id
setzen.
Die Tokens liegen im Klartext in
%APPDATA%\SCTroll\config.json. Nicht weitergeben und nicht auf Screenshots zeigen — der Token darf Kanalpunkt-Rewards verwalten.
Das Spiel liegt nicht zwingend auf C:. Gesucht wird in dieser Reihenfolge:
- RSI-Launcher-Log (
%APPDATA%\rsilauncher\logs\log.log) — enthält den Installationspfad im Klartext und kennt auch eine Library, die irgendwo aufE:\Spiele\liegt. Die Registry hilft nicht, dort steht nurEACServiceInstalled, undlauncher store.jsonist verschlüsselt. - Bekannte Ordner auf allen lokalen Festplatten. Netzlaufwerke und Wechselmedien werden übersprungen, sonst blockiert der Scan.
- Flacher Scan der obersten zwei Ebenen jedes Laufwerks.
- Manuelle Auswahl über den Ordnerdialog.
Alle Channels werden erkannt (LIVE, PTU, EPTU, HOTFIX, TECH-PREVIEW), LIVE wird bevorzugt.
Voraussetzungen: Go 1.23+, Node 18+, Wails CLI v2.
wails build # -> build/bin/SCTroll.exe
go test ./internal/...Signierter Build (Certum SimplySign Desktop muss laufen und per App angemeldet sein):
.\build-signed.ps1Die Tests laufen teilweise gegen eine Kopie einer echt installierten actionmaps.xml und
überspringen sich, wenn kein Star Citizen gefunden wird. Dein Spielprofil wird dabei nie
verändert. Abgedeckt sind unter anderem:
- XML-Round-Trip ohne Verlust von Joystick- und Geräteeinstellungen
- jede mitgelieferte Aktion existiert in der
defaultProfile.xml - Haltezeiten passen zum
activationMode - Token-Refresh fasst bei Serverfehlern die Zugangsdaten nicht an
- gefährliche Aktionen sind standardmäßig aus
| Pfad | |
|---|---|
internal/starcitizen/install.go |
Installationssuche über alle Laufwerke |
internal/starcitizen/actionmaps.go |
actionmaps.xml lesen (eigene Belegungen) |
internal/starcitizen/defaultprofile.go |
eingebettete defaultProfile.xml, Haltezeiten |
internal/starcitizen/process.go |
läuft das Spiel gerade? |
internal/twitch/twitch.go |
Device Code Flow, Token-Verwaltung, EventSub, Rewards, Erstattungen |
internal/actions/executor.go |
Cooldowns, Warteschlange, Fenster-Prüfung, Ausführung |
internal/input/input.go |
SendInput, Sendeverfahren, Tastennamen |
internal/updater/ |
Update-Prüfung, Download, Signaturprüfung, Austausch |
internal/version/ |
Programmversion und Versionsvergleich |
internal/keylock/keylock.go |
Low-Level-Keyboard-Hook |
app.go |
Wails-Bindings fürs Frontend |
frontend/ |
Svelte-Oberfläche, Deutsch und Englisch |
Die Konfiguration liegt unter %APPDATA%\SCTroll\config.json. Eine neuere selbst entpackte
defaultProfile.xml kann daneben abgelegt werden und hat dann Vorrang — praktisch nach einem
größeren Patch.
- ltmajor42/StarCitizen_Streamdeck_Plugin
und mhwlng/streamdeck-starcitizen —
von dort stammt die entpackte
defaultProfile.xml, und von dort kam der entscheidende Hinweis, wie Standard- und eigene Belegungen zusammenspielen. - citizenhq.space — Farbpalette und Formensprache der Oberfläche.
- Wails — Go-Desktop-Framework.
Schriften: Chakra Petch, Sora und Space Mono (SIL Open Font License), lokal eingebettet.
Die mitgelieferte defaultProfile.xml ist Spieldatei von Cloud Imperium Games und liegt hier
nur, damit SCTroll die Standardbelegungen kennt.
Kein offizielles Produkt von Cloud Imperium Games. Star Citizen® ist eine Marke von CIG.
MIT — siehe LICENSE.


