• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

[Spigot] 5 Möglichkeiten /youtube, /ts, /whatever zu erstellen ohne einen Dev anzuheuern

SilberRegen

Workaholic
Mitglied seit
23 März 2012
Beiträge
890
Alter
29
Minecraft
SilberRegen
Ziel: Hinter einem Befehl einen Freitext mit mehr oder weniger nützlichen Informationen/Links verstecken.

Schwierigkeit: ➊②➂➃➄ | Zeitfaktor: abhängig von Methode und wie stark man am Format feilen mag

Voraussetzungen:
  • Spigot/Craftbukkit
  • Zugriff auf den Server (Konsole, Dateien)
  • ggf. bereits vorhandene Plugins (je nach Methode)
Um die eigenen Spieler mit wichtigen Informationen zu versorgen kann es praktisch sein, diese per Befehl im Spiel abrufbar zu machen.

In diesem Tutorial möchte ich eine handvoll Mittel und Wege vorstellen, die jeder selber auf seinem Server implementieren kann.
Die Vorteile liegen klar auf der Hand: Inhalte sind jederzeit anpassbar, man ist unabhängig von der Motivation und Laune anderer und in den meisten Fällen hat man alles was man braucht schon installiert.

Rahmenbedingungen:
  • es soll ein mehrseitiger Informationstext erstellt werden
  • eine Seite hat jeweils 10 Zeilen um vollständig im nicht geöffneten Chatfenster angezeigt zu werden
  • der Text wird über den Befehl /youtube abgerufen (laut eigenen, unseriösen Studien eine populäre Wahl)
  • sofern möglich sollen weitere Seiten über Clickevents im Chatfenster erreicht werden, wenn nicht über /youtube <Seitenzahl> o.ä.
____________________________________________________________________________________________________

1. Möglichkeit: help.yml + commands.yml

(Dokumentation: commands.yml, help.yml)
  • ⇑ Kein Plugin nötig
  • ⇑ relativ übersichtlich
  • ⇑ mehrere Seiten werden automatisch angelegt
  • ⇑ farbige Texte möglich
  • ⇑ Permissions möglich
  • ⇓⇓ Format nicht frei wählbar
  • ⇓⇓ Keine interaktiven Elemente möglich (außer Links)
  • ⇓ Server muss für Änderungen neu gestartet werden
Spieler benötigen keinen Zugriff auf den Hilfebefehl an sich, um auf einzelne Seiten zuzugreifen, wenn eine Permission spezifiziert wird. Die Permission, die für eine Seite bestimmt wird reicht aus, um ihnen Zugriff auf nur diese Seite zu gewähren.

Die Permission kann eine sein, die die Spieler sowieso haben oder eine, die komplett selber ausgedacht ist. In diesem Fall habe ich mir selber eine ausgedacht und diese topics.youtube genannt.

Dies kommt in die help.yml:

Code:
  general-topics:

    ## Informationen
    Youtube:
      permission: topics.youtube
      shortText: Wie erstelle ich einen Customtext?
      fullText: |
        &a&lDies ist ein Customtext.
        &bFür einen solchen Text benötigt man kein Plugin.
        &eEinige Varianten möchte ich in diesem Tutorial zeigen.
        &e
        &5&m--------&5> &dMehr Infos &ehttps://goo.gl/WCH1yy &5<&m---------
        &5
        &3Wir der Text in der hilfe.yml länger als 8 Zeilen, so wird
        &2eine zweite Seite angelegt. Diese wird hier mit /help youtube 2
        &2aufgerufen.
        &cMit einem Alias wird dies natürlich schöner.

Das kommt in die commands.yml:
Code:
aliases:
  icanhasbukkit:
  - version $1-
  youtube:
  - help youtube $1-
Und so sehen die Seiten im Spiel aus:


Spieler mit der Permission topics.youtube können nun mit /youtube bzw. /youtube 2 diese Informationen abrufen.

____________________________________________________________________________________________________
//Edit 05.04.2018
Die zweite Variante funktioniert nach eingehender Prüfung leider nicht so, wie hier beschrieben. Der Spieler benötigt für Befehle in der Datei auch Rechte und /tellraw selber möchtet ihr sicher nicht freigeben. Bei mir hat ein Plugin die Ergebnisse verfälscht, sorry.
2. Möglichkeit: commands.yml + Vanillabefehl /tellraw
(Dokumentation: Commands.yml, Befehl: Tellraw)

  • ⇑ Kein Plugin nötig
  • ⇑ Layout/Design komplett frei
  • ⇑ Interaktive Texte möglich
  • ⇒ umsetzung in Vanillaminecraft mit Commandblöcken statt command.yml vermutlich möglich (https://gaming.stackexchange.com/a/321455)
  • ⇓ schnell unübersichtlich (tellraw)
  • ⇓ Keine Permissions einstellbar
  • ⇓ Server muss für Änderungen neu gestartet werden
Die commands.yml, welche ihr im Hauptverzeichnis eines Spigot/Craftbukkit-Servers findet ist ein wiederkehrendes Element in diesem Tutorial.
Mit ihr kann man unter anderem Befehle überschreiben oder neue Befehle anlegen. (Dokumentation: https://bukkit.gamepedia.com/Commands.yml)

Wichtig: Colorcodes werden in tellraw mit § notiert.
Hilfreich: Es finden sich Online jede Menge Editoren für tellraw-Texte. (z.B. http://minecraft.tools/en/tellraw.php)

So könnte es dann in der commands.yml aussehen:
Code:
aliases:
  icanhasbukkit:
  - version $1-
  youtube:
  - tellraw @p [{"text":"§f§m-----------§l-§f§m-------§l-"},{"text":"§6§l Youtube"},{"text":"§l §f§m--§l-§f§m----------------"}]
  - tellraw @p {"text":"§a§lDies ist ein Customtext."}
  - tellraw @p {"text":"§bFür einen solchen Text benötigt man kein Plugin."}
  - tellraw @p {"text":"§eEinige Varianten möchte ich in diesem Tutorial zeigen."}
  - tellraw @p {"text":"§e"}
  - tellraw @p {"text":"§5§m--------§5> §dMehr Infos §ehttps://goo.gl/WCH1yy §5<§m---------"}
  - tellraw @p {"text":"§f"}
  - tellraw @p {"text":"§3Wir der Text in der commands.yml länger als 10 Zeilen, so muss"}
  - tellraw @p {"text":"§3neue Seite angelegt werden."}
  #- tellraw @p {"text":"§f§m-------------------------------------------------"}
  - tellraw @p [{"text":"§f§m---------------- "},{"text":"§7 §l<<<"},{"text":" §6Seite §e1§6/2"},{"text":"§a §l>>>","hoverEvent":{"action":"show_text","value":"Nächste Seite"},"clickEvent":{"action":"run_command","value":"/youtube2"}},{"text":"§f §m----------------"}]
  youtube2:
  - tellraw @p [{"text":"§f§m-----------§l-§f§m-------§l-"},{"text":"§6§l Youtube"},{"text":"§l §f§m--§l-§f§m----------------"}]
  - tellraw @p {"text":"§2In diesem Fall legen wir einen zweiten Befehl an, den wir"}
  - tellraw @p {"text":"§2§e/youtube2§2 nennen und der die zweite Seite ausgibt."}
  - tellraw @p {"text":"§e"}
  - tellraw @p {"text":"§cDa wir tellraw benutzen, ist es natürlich schöner"}
  - tellraw @p {"text":"§cund möglich, diese mit klickbaren Pfeilen zu verknüpfen."}
  - tellraw @p [{"text":"§f§m---------------- "},{"text":"§a §l<<<","hoverEvent":{"action":"show_text","value":"Seite zurück"},"clickEvent":{"action":"run_command","value":"/youtube"}},{"text":" §6Seite §e2§6/2"},{"text":"§7 §l>>>"},{"text":"§f §m----------------"}]

Und so sehen die Seiten im Spiel aus:


Jeder Spieler kann diese nun mit /youtube abrufen und über die Pfeile navigieren (oder /youtube2 ohne Leerzeichen eingeben, für die zweite Seite).

Die auskommentierte Zeile (mit # davor) könnte z.B. für einseitige Infos gebraucht werden, die ohne Navigation auskommen.
Lasst Euch nicht von den vielen Formatierungscodes (§l etc.) in den ersten Zeilen irritieren. Diese dienen lediglich dazu, dass die Trennstriche am Ende exakt gleich lang sind. Wer es einfacher mag und sich nicht an unterschiedlich langen Balken stört, kann hier jede Menge Zeit sparen.


____________________________________________________________________________________________________

3. Möglichkeit: Essentials/EssentialsX/Spigot-Essentials Customtext + commands.yml
(Dokumentation: Commands.yml, Essentials Customtext)
  • ⇑ Essentials ist ein häufig benutztes Plugin
  • ⇑ Änderungen werden sofort übernommen
  • ⇑ übersichtlich
  • ⇑ Format/Design anpassbar
  • ⇒ Permissions für /customtext über essentials, soweit ich weiß aber nicht für einzelne Seiten
  • ⇓⇓ Keine interaktiven Elemente möglich (außer Links)
  • ⇓ Keine Permissions einstellbar
Hat man noch keine Customtexte erstellt, so muss man einmalig im Spiel /customtext eingeben um die Defaultdatei zu generieren.
Diese wird dann direkt bearbeitet, Änderungen werden sofort im Spiel übernommen ohne dass Essentials neu geladen werden muss.

Dies kommt in die custom.txt:
Code:
#youtube
&f&m-----------&l-&f&m------&l-&6&l Youtube &e1&6/2&l &f&m--&l-&f&m---------------&l-
&a&lDies ist ein Customtext.
&bFür einen solchen Text benötigt man kein Plugin.
&eEinige Varianten möchte ich in diesem Tutorial zeigen.
&e
&5&m--------&5> &dMehr Infos &ehttps://goo.gl/WCH1yy &5<&m---------
&5
&3Wir der Text in custom.txt länger als 10 Zeilen, so muss eine
&3neue Seite angelegt werden.
&f&m----------------------------------------------------


#youtube2
&f&m-----------&l-&f&m------&l-&6&l Youtube &e2&6/2&l &f&m--&l-&f&m---------------&l-
&2In diesem Fall legen wir einen zweiten Text an, der mit
&2&e/customtext youtube2&2 aufgerufen wird.
&cMit einem Alias wird dies natürlich schöner.
&f&m----------------------------------------------------

Dies in die Commands.yml:
Code:
aliases:
  icanhasbukkit:
  - version $1-
  youtube:
  - customtext youtube$1-
So sieht es im Spiel aus:


Spieler mit der passenden Essentialsperm können nun mit /youtube bzw. /youtube 2 diese Informationen abrufen.

____________________________________________________________________________________________________

3 1/2. Möglichkeit: CMI /ctext + CMI Alias

Dieses essentialsähnliche Plugin bietet diverse Möglichkeiten für die Erstellung von eigenen Texten und Alias.
Da es nicht kostenfrei ist und der Ingameeditor recht einfach zu bedienen, gehe ich hier aber nicht weiter darauf ein.

____________________________________________________________________________________________________

Die letzten beiden Möglichkeiten mit Scriptplugins sind etwas "aufwändiger", aber im Prinzip auch nur Copy&Paste.
Auch hierfür braucht man keinen Developer, wenn man umsichtig die Teile kopiert die man benötigt und auf die Zeichensetzungen acht gibt.

Warum ich sie hier mit anführe ist dem Umstand geschuldet, dass man genau wie bei den anderen Varianten lediglich einen Texteditor benötigt, um die Sachen an eigene Bedürfnisse anzupassen.

4. Möglichkeit: Skript (optional: + json.sk)
(Dokumentation: Furchtbar, wer einen guten Link hat soll sich melden)

  • ⇑ beliebtes Scriptplugin, simpel zu benutzen
  • ⇑ Änderungen werden nach einem kurzen reload der Scripte übernommen
  • ⇑ Permissions einstellbar
  • ⇑ Format/Design/weitere Funktionen fast unbegrenzt einstellbar
  • ⇒ je nach Art, wie das Skript erstellt wurde mehr oder weniger übersichtlich
  • ⇒ interaktive Elemente einfach mit dem oben genannten optionalen Skript
  • ⇓ Installation lohnt sich eigentlich nur, wenn man es noch für andere Sachen gebrauchen kann und Spaß daran hat
  • ⇓ Updatestatus von Skript etwas undurchsichtig
  • ⇓ Skriptsprachen sind pingelig was die Einrückung angeht. Beim kopieren und einfügen etwas aufpassen, was Leerzeichen/Tabulatoren angeht
Ich mag Skript nicht besonders und habe es nur hierfür installiert. Beispielskripte für Customcommands findet man auf Spigot aber zuhauf. Damit wird quasi alles zugekleistert. Ohne Spaß, wer ein solches Skript (meist auch noch mit den Inhalten für den eigenen Server, die niemanden sonst interessieren) dort postet gehört geschlagen.

Skript, welches irgendwo seinen Zweck erfüllt (wird als .sk gespeichert):
Code:
command /youtube [<text>]:
  description: Wie erstelle ich einen Customtext
  usage: /youtube <Seite>
  #Die Permission ist optional
  #permission: topics.youtube
  #permission message: "Dir fehlt die Permission diesen Befehl zu nutzen."
  executable by: players
  aliases: /yt
  trigger:
    if arg-1 is "1":
      message "&f&m---------------------&6&l Youtube &f&m------------------&l---"
      message "&a&lDies ist ein Customtext."
      message "&bFür einen solchen Text benötigt man kein Plugin"
      message "&eEinige Varianten möchte ich in diesem Tutorial zeigen."
      message "&e"
      message "&5&m--------&5> &dMehr Infos &ehttps://goo.gl/WCH1yy &5<&m---------"
      message "&5"
      message "&3Wir der Text in Skript länger als 10 Zeilen, so werden alle"
      message "&2Zeilen im Chat ausgegeben. Anders, als bei der hilfe.yml zählt"
      #Wenn du die Erweiterung json.sk https://www.spigotmc.org/resources/json-sk.8851/  nicht installieren möchtest, kannst du alternativ die Zeilen mit "json" auskommentieren und stattdessen nur den Rahmen nutzen, der hier auskommentiert ist.
      #message "&f&m----------------------------------------------------"
      json("%player%", "&f&m---------------&l--|| &7&l<<< ||&6Seite &e1&6/2||&a&l >>>&r ||ttp:Nächste Seite||cmd:/youtube 2||&f&m------------------&l")
    if arg-1 is "2":
      message "&f&m---------------------&6&l Youtube &f&m------------------&l---"
      message "&2der Rahmen mit zu den Zeilen, die ihr zur Verfügung habt."
      message "&cSchöner ist es, wenn man eine zweite Seite anlegt und noch"
      message "&cschöner, wenn man diese auch über Klicken auf Pfeile erreicht."
      #message "&f&m----------------------------------------------------"
      json("%player%", "&f&m---------------&l--|| &a&l<<< ||ttp:Seite zurück||cmd:/youtube 1||&6Seite &e2&6/2||&7&l >>>&r ||&f&m------------------&l")
    else:
      make player execute command "/youtube 1"

Ingame:


Auch hier kann die Info über /youtube oder /youtube <Seite> angesehen werden.
Die "json" Befehle funktionieren nur, wenn man sich das Skript json.sk (https://www.spigotmc.org/resources/json-sk.8851/ ) in den Skriptordner zieht.

____________________________________________________________________________________________________

5. Möglichkeit: Citizens2 + Denizen

(Dokumentation: Naja, zumindest findet man alle "Bausteine" auf einer Seite https://one.denizenscript.com/denizen/tags/)
  • ⇑ interessante Alternative, wenn man bereits Citizens2 NPC benutzt
  • ⇑ Änderungen werden nach einem kurzen reload der Scripte übernommen
  • ⇑ Permissions einstellbar
  • ⇑ Format/Design/weitere Funktionen fast unbegrenzt einstellbar
  • ⇑ Interaktive Elemente über tellraw möglich
  • ⇒ je nach Art, wie das Skript erstellt wurde mehr oder weniger übersichtlich (Scripteteile können auf mehrere Dateien/Unterordner verteilt werden)
  • ⇓ Installation lohnt sich eigentlich nur, wenn man Citizens2 hat und Spaß daran findet
  • ⇓ Die Scripte können sehr "technisch" werden, sehen technischer aus, als Skript
  • ⇓ Weniger "Beispielscripte" die im Internet herumfliegen
Ähnlich wie mir Skript kann man mit dscripts quasi alles machen, was man auch mit einem Plugin machen könnte. Wo man hier genau die Grenze zieht sei einem selbst überlassen. Persönlich favorisiere ich dscripts gegenüber skript, da ich mich hiermit länger beschäftigt habe und es etwas logischer/einheitlicher aufgebaut finde. Einige Funktionen für meinen Server habe ich ausschließlich mit Denizen umgesetzt (Hilfemenü, Votingbelohungen, einige Customitems mit besonderen Funktionen, Befehle mit anderen Funktionen). Für aufwändigere Sachen ziehe ich aber meistens fertige Plugins vor, sofern es diese gibt.

Wichtig: Colorcodes werden in z.B. als <&e> oder <yellow> etc notiert. Spitze Klammer. (<&gt> <&lt>) und Doppelpunkte (<&co>) müssen ebenfalls kodiert werden. Sonderzeichen/Umlaute sind kein Problem, solange die .yml als UTF-8 kodiert wird (nicht ANSI).

Denizenscript (wird als .yml gespeichert):
Code:
#==============================================================================================================
# Script für den Befehl selbst.
#==============================================================================================================

youtube_command_handler:
  type: command
  debug: false
  name: youtube
  description: Youtube Infoseite
  usage: /youtube <Seite>
  aliases:
    - yt
  #allowed help:
  #  - determine <player.has_permission[topics.youtube]>
  #permissions: topics.youtube
  script:
    - choose <context.args.get[1]||null>:
      - case 2:
        # Die Flag wird im Skript für die Seitenzahl in der Fußzeile abgefragt
        - flag player youtube_page:2
        # Das aufgerufene Script enthält den Inhalt
        - inject youtube_page_2 instantly player:<player>
      - default:
        - flag player youtube_page:1
        - inject youtube_page_1 instantly player:<player>

#==============================================================================================================
# Inhalte - Jedes dieser Scripte kann auch in eine eigene Datei gepackt werden, falls es unübersichtlich wird.
#==============================================================================================================
youtube_page_1:
  type: task
  debug: false
  script:
  - ^narrate "<&f><&m>--------------------<&6> <&l>Youtube <&f><&m>----------------------"
  - ^narrate "<&a><&l>Dies ist ein Customtext."
  - ^narrate "<&b>Für einen solchen Text benötigt man kein Plugin"
  - ^narrate "<&e>Einige Varianten möchte ich in diesem Tutorial zeigen."
  - ^narrate "<&e>"
  - ^narrate "<&5><&m>--------<&5><&gt> <&d>Mehr Infos <&e>https://goo.gl/WCH1yy <&5><&lt><&m>---------"
  - ^narrate "<&5>"
  - ^narrate "<&3>Wir der Text in Denizen länger als 10 Zeilen, so werden alle"
  - ^narrate "<&2>Zeilen im Chat ausgegeben. Anders als bei Script, kann man JSON"
  - ^run youtube_footer_first def:2 instantly player:<player>

youtube_page_2:
  type: task
  debug: false
  script:
  - ^narrate "<&f><&m>--------------------<&6> <&l>Youtube <&f><&m>----------------------"
  - ^narrate "<&2>direkt als Konsolenbefehl ausführen lassen."
  - ^narrate "<&3>Damit es lesbarer ist, habe ich die JSON-Zeilen"
  - ^narrate "<&3>in eigene Taskscripts gepackt und gebe nur die Variablen"
  - ^narrate "<&3>Elemente an dieses weiter (Spieler und Seitenanzahl gesamt)"
  - ^narrate "<&3>"
  - ^narrate "<&c>Alias werden von dScripts genauso wie bei Skript"
  - ^narrate "<&c>über das Skript selbst gehändelt."
  - ^run youtube_footer_last def:2 instantly player:<player>
#==============================================================================================================
# JSON Formate für die Fußzeile (auch diese Scripte könnten zusammen oder allein in eigene Dateien)
#==============================================================================================================
youtube_footer:
## Fußzeile für alle Seiten, die nicht die erste oder letzte sind. Wird im Beispiel nicht benutzt.
# Dieses Taskscript wird oben so aufgerufen:
# - ^run youtube_footer def:2 instantly player:<player>
  type: task
  debug: false
  definitions: page_total
  script:
  - define page <player.flag[youtube_page]>
  - define page_next <player.flag[youtube_page].add_int[1]>
  - define page_last <player.flag[youtube_page].add_int[-1]>
  # Man kann alle Befehle, die der Server hat (auch die von Plugins) als Server (as_server), Op (as_op) oder Spieler (as_player) ausführen lassen.
  - ^execute as_server 'tellraw <player.name> [{"text":"<&f><&m>--------------- "},{"text":"<&a><&l> <&lt><&lt><&lt>","hoverEvent":{"action":"show_text","value":"Seite zurück"},"clickEvent":{"action":"run_command","value":"/youtube %page_last%"}},{"text":" <&6>Seite <&e>%page%<&6>/%page_total% "},{"text":"<&a><&l><&gt><&gt><&gt> ","hoverEvent":{"action":"show_text","value":"Nächste Seite"},"clickEvent":{"action":"run_command","value":"/youtube %page_next%"}},{"text":"<&f><&m>-------------------"}]'

youtube_footer_first:
## Fußzeile für die erste Seite
# - ^run youtube_footer_first def:2 instantly player:<player>
  type: task
  debug: false
  definitions: page_total
  script:
  - ^execute as_server 'tellraw <player.name> [{"text":"<&f><&m>--------------- "},{"text":"<&7><&l> <&lt><&lt><&lt>"},{"text":" <&6>Seite <&e>1<&6>/%page_total% "},{"text":"<&a><&l><&gt><&gt><&gt> ","hoverEvent":{"action":"show_text","value":"Nächste Seite"},"clickEvent":{"action":"run_command","value":"/youtube 2"}},{"text":"<&f><&m>-------------------"}]'

youtube_footer_last:
## Fußzeile für die letzte Seite
# - ^run youtube_footer_last def:2 instantly player:<player>
  type: task
  debug: false
  definitions: page_total
  script:
  - define page_last <player.flag[youtube_page].add_int[-1]>
  - ^execute as_server 'tellraw <player.name> [{"text":"<&f><&m>--------------- "},{"text":"<&a><&l> <&lt><&lt><&lt>","hoverEvent":{"action":"show_text","value":"Seite zurück"},"clickEvent":{"action":"run_command","value":"/youtube %page_last%"}},{"text":" <&6>Seite <&e>%page_total%<&6>/%page_total% "},{"text":"<&7><&l><&gt><&gt><&gt> "},{"text":"<&f><&m>-------------------"}]'

youtube_footer_single:
## Fußzeile für eine einzelne Seite
#- ^narrate format:youtube_footer_single ""
  type: format
  debug: false
  format: "<&f><&m>---------------- <&7><&l> <&lt><&lt><&lt><&8>Seite <&7>1/1<&8><&7><&l><&gt><&gt><&gt> <&f><&m>-------------------"

Ingame:


Der Befehl hier lautet wieder /youtube bzw. /youtube 2, wenn man nicht über die Pfeile navigiert.

Das Denizenscript ist aus Teilen meines Hilfemenüs zusammenkopiert und daher relativ groß. Hauptidee war, den Informationsteil übersichtlich zu halten und bei vielen Seiten, diese auch in andere Dateien auslagern zu können.
Gibt hier wie bei Skript sicher jede Menge andere Möglichkeiten einen solchen Befehl umzusetzen und wenn mans noch einfacher haben will kann man auch im Commandscript selber den Inhalt einfügen.

____________________________________________________________________________________________________

Dieses Tutorial dient hauptsächlich der Demonstration, dass man auch ohne Javakenntnisse viel aus dem eigenen Server herausholen kann und dass man sich mit seinen vorhandenen Möglichkeiten auseinandersetzen sollte, bevor man auf fremde Leute oder fragwürdige "Einzeilerplugins" zurückgreift.

Vielleicht kennt der ein oder andere noch ein paar Möglichkeiten solche Texte zu erstellen, die auf weit verbreiteten und oft benutzten Plugins basieren oder vielleicht komplett Vanilla sind.

Das Skript im Anhang muss noch als .sk gespeichert werden um es brauchbar zu machen.
 

Anhänge

Zuletzt bearbeitet:
Allgemein
Hilfe Benutzer
    SirYwell SirYwell: hey
    Oben