!counter
FortgeschrittenEin frei benennbarer Universal-Zähler für Revives, Clutches, Fails und mehr. Anzeige für alle, Mutation nur für Mods.
- Steps
- 23
- Cooldown
- 3s/User
- Cooldown
- 0sglobal
- Zugriff
- Public
Ein frei benennbarer Universal-Zähler für Revives, Clutches, Fails und mehr. Anzeige für alle, Mutation nur für Mods.
Statt für jeden Zähl-Bedarf einen eigenen Command zu bauen, gibt es hier genau einen. !counter liest das erste Wort als Sub-Command, routet per Switch und arbeitet immer auf einem aktiven Zähler. So zählst du im FPS-Grind Revives, Clutches, Fails oder Team-Wipes mit demselben Command, einfach durch Umschalten des aktiven Labels.
Zwei Arten von Persisted Globals halten den Zustand zusammen:
activeCounter hält den Namen des gerade aktiven Zählers, zum Beispiel revives. Genau ein Global, das per !counter new <name> umgeschaltet wird.cnt_<label> hält den Wert je Zähler. Schaltest du mit !counter new clutches um, schreibt jedes Plus ab dann in cnt_clutches. Der alte cnt_revives bleibt unangetastet erhalten.Beide sind Persisted, überleben also einen Streamer.bot-Restart. Der Trick ist der dynamische Schlüssel: Der Variablen-Name des Wert-Globals wird zur Laufzeit aus cnt_ plus dem aktiven Label zusammengesetzt. Dadurch verwaltet eine einzige Action beliebig viele Zähler, ohne dass du je wieder etwas am Command anfasst.
Wichtig fürs Verständnis: Global (Set) im Increment- oder Decrement-Modus erhöht oder senkt den gespeicherten Wert, gibt ihn aber nicht zurück. Wer den neuen Stand posten will, holt ihn danach mit einem eigenen Global (Get) in ein lokales Argument. Genau diese Reihenfolge Set, dann Get steckt unten in den Plus- und Minus-Cases.
[Cmd] !counterEine Action liest das Sub-Command, fängt den Leerfall ab und routet per Switch in den passenden Zweig.
Erstes Wort der Nachricht als Sub-Command isolieren.
| Variable Name | sub |
|---|---|
| Value | %input0% |
Ist nichts angegeben, soll der Switch in den Default-Zweig fallen. Im Then-Branch sub auf Leerstring setzen, damit kein null-Vergleich scheitert.
| Input | %sub% |
|---|---|
| Operation | Is Null or Empty |
Vergleicht %sub% gegen die Cases new, use, +, -, set. Jeder Case führt eine eigene Sequenz aus und endet mit Break. Trifft kein Case zu, läuft der Default-Zweig (Anzeige).
| Value to compare | %sub% |
|---|---|
| Comparison | Equals (Ignore Case) |
Nimmt input1 als neues Label und schreibt es nach activeCounter. Mod-only. Setzt nur den Namen, nicht den Wert: ein vorhandener cnt_<label> bleibt erhalten.
| Destination | Global |
|---|---|
| Persisted | true |
| Variable Name | activeCounter |
| Value | %input1% |
| Message | Aktiver Zähler: %input1% |
|---|
Mod-only. Welcher Zähler aktuell aktiv ist. Fehlt activeCounter noch, greift der Default counter.
| Source | Global |
|---|---|
| Variable Name | activeCounter |
| Persisted | true |
| Default Value | counter |
| Variable Name (Destination) | label |
Mode Increment erhöht cnt_%label% um 1. Der neue Wert wird hier noch nicht zurückgegeben, dafür folgt direkt ein Global (Get).
| Destination | Global |
|---|---|
| Persisted | true |
| Variable Name | cnt_%label% |
| Mode | Increment |
| Increment Amount | 1 |
Holt den frisch erhöhten Stand aus cnt_%label% in ein lokales Argument, weil Global (Set) den Wert nicht selbst liefert. Fehlt der Zähler noch, greift Default 0.
| Source | Global |
|---|---|
| Variable Name | cnt_%label% |
| Persisted | true |
| Default Value | 0 |
| Variable Name (Destination) | val |
| Message | %label%: %val% |
|---|
Mod-only. Gleicher Get wie bei Plus, damit cnt_%label% den richtigen Zähler trifft.
| Source | Global |
|---|---|
| Variable Name | activeCounter |
| Persisted | true |
| Default Value | counter |
| Variable Name (Destination) | label |
Wie Plus, nur Mode Decrement. Mod-only.
| Destination | Global |
|---|---|
| Persisted | true |
| Variable Name | cnt_%label% |
| Mode | Decrement |
| Decrement Amount | 1 |
Holt den gesenkten Stand nach val. Optionaler If/Else davor klemmt negative Werte auf 0, siehe Häufige Fallen.
| Source | Global |
|---|---|
| Variable Name | cnt_%label% |
| Persisted | true |
| Default Value | 0 |
| Variable Name (Destination) | val |
| Message | %label%: %val% |
|---|
Mod-only. Auf welchen Zähler set wirken soll.
| Source | Global |
|---|---|
| Variable Name | activeCounter |
| Persisted | true |
| Default Value | counter |
| Variable Name (Destination) | label |
Nimmt input1 als Zahl und schreibt sie direkt nach cnt_%label%. Mod-only. Damit setzt du etwa auf 0 zum Neustart einer Session.
| Destination | Global |
|---|---|
| Persisted | true |
| Variable Name | cnt_%label% |
| Value | %input1% |
| Message | %label% gesetzt auf %input1% |
|---|
Greift wenn kein Sub-Command passt oder die Nachricht leer war. Holt activeCounter mit Default counter.
| Source | Global |
|---|---|
| Variable Name | activeCounter |
| Persisted | true |
| Default Value | counter |
| Variable Name (Destination) | label |
Dynamischer Schlüssel cnt_%label%. Fehlt der Zähler noch, greift Default 0.
| Source | Global |
|---|---|
| Variable Name | cnt_%label% |
| Persisted | true |
| Default Value | 0 |
| Variable Name (Destination) | val |
| Message | 📊 %label%: %val% |
|---|
Der Switch ist der zentrale Verteiler. Jeder Case ist eine eigene Sequenz, die mit Break endet, damit nicht versehentlich weitere Cases durchlaufen. Trifft kein Case, greift der Default-Zweig mit der reinen Anzeige. Bei Plus und Minus folgt nach dem Set immer ein Get, weil Global (Set) den neuen Wert nicht selbst zurückgibt.
| Feld | Wert |
|---|---|
| Name | !counter |
| Group | AzaCraft Standard |
| Commands | !counter |
| Sources | Twitch Message |
| Global Cooldown | 0 |
| User Cooldown | 3 |
| Permission | Everyone (Anzeige) |
Der Command selbst steht auf Everyone, damit jeder den Stand abfragen kann. Die mutierenden Sub-Commands brauchen Mod-Rechte. Setze dafür in den Branches new, use, +, - und set die Sub-Action-Permission auf Moderator. Eine einfachere Variante: ein vorgeschaltetes If/Else, das bei nicht-Mod und gesetztem Mutations-Sub-Command per Break abbricht.
| Chat | Resultat |
|---|---|
!counter new revives | „Aktiver Zähler: revives“ (nur Mod) |
!counter + | „revives: 1“, „revives: 2“ … (nur Mod) |
!counter | „📊 revives: 2“ (jeder) |
!counter set 0 | „revives gesetzt auf 0“ (nur Mod) |
!counter use clutches | Wechselt aktiv auf den Zähler clutches |
Da jeder Zähler unter cnt_<label> liegt, gehen die Werte beim Umschalten nicht verloren. Du kannst also während einer Session zwischen revives, clutches und wipes hin und her wechseln und jeder behält seinen Stand. Für eine Übersicht aller Zähler legst du dir einen Begleiter-Command !counters an, der die bekannten Labels einzeln per Global (Get) holt und in einer Zeile postet.
Equals (Ignore Case), sonst trifft New den Case new nicht. Ohne Ignore Case landen Tippvarianten still im Default-Zweig.!counter new team wipes setzt activeCounter nur auf team, weil wipes in input2 landet. Entweder ein Wort verwenden oder das Label vorab mit $replace(%input1%, " ", _)$ zusammenziehen.!counter new ... greift der Default counter, der Stand landet also in cnt_counter. Das ist gewollt, kann aber verwirren wenn man revives erwartet. Einmal !counter new revives setzen.Persisted nicht, sind nach jedem Streamer.bot-Restart alle Zähler und der aktive Name weg. Sowohl activeCounter als auch jeder cnt_<label> müssen Persisted sein.%val% Less Than 0 (in Backticks: weniger als 0) vorschalten und per Global (Set) auf 0 klemmen.