6.2 KiB
title | layout | root | idx | description | redirect_from | cmd_online | cb_cmdsprivs | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Chat und Befehle | default | ../.. | 4.2 | Registrierung eines Chatbefehls und Behandlung von Chatnachrichten mit register_on_chat_message | /de/chapters/chat.html |
|
|
Einleitung
Mods können mit dem Spielerchat interagieren, einschließlich Senden von Nachrichten, Abfangen von Nachrichten und Registrieren von Chat-Befehlen.
- Senden von Nachrichten an alle Spieler
- Nachrichten an bestimmte Spieler senden
- Chat-Befehle
- Komplexe Unterbefehle
- Abfangen von Nachrichten
Senden von Nachrichten an alle Spieler
Um eine Nachricht an alle Spieler im Spiel zu senden, rufen Sie die Funktion chat_send_all auf.
minetest.chat_send_all("Dies ist eine Chat-Nachricht an alle Spieler")
Hier ist ein Beispiel dafür, wie dies im Spiel aussieht:
<player1> Sehen Sie sich diesen Eingang an
Dies ist eine Chat-Nachricht an alle Spieler
<player2> Was ist damit?
Die Nachricht erscheint in einer separaten Zeile, um sie vom Spieler-Chat im Spiel zu unterscheiden.
Nachrichten an bestimmte Spieler senden
Um eine Nachricht an einen bestimmten Spieler zu senden, rufen Sie die Funktion chat_send_player auf:
minetest.chat_send_player("Spieler1", "Dies ist eine Chat-Nachricht für Spieler1")
Diese Nachricht wird auf dieselbe Weise angezeigt wie die Nachrichten an alle Spieler, ist aber nur für den benannten Spieler sichtbar, in diesem Fall für Spieler1.
Chat-Befehle
Um einen Chat-Befehl zu registrieren, zum Beispiel /foo
, verwenden Sie register_chatcommand
:
minetest.register_chatcommand("foo", {
privs = {
interact = true,
},
func = function(name, param)
return true, "Sie sagten " .. param .. "!"
end,
})
Im obigen Ausschnitt ist "interact" als erforderliches Privileg aufgeführt, was bedeutet, dass nur Spieler mit dem Privileg "interact" den Befehl ausführen können.
Chat-Befehle können bis zu zwei Werte zurückgeben, Der erste ist ein boolescher Wert, der den Erfolg anzeigt, und der zweite ist eine Nachricht, die an den Benutzer gesendet wird.
{% include notice.html notice=page.cmd_online %}
Komplexe Unterbefehle
Es wird oft benötigt, komplexe Chat-Befehle zu bereitzustellen, wie z.B.:
/msg <zu> <Nachricht>
/team join <Teamname>
/team leave <Teamname>
/team list
Dies geschieht normalerweise mit [Lua-Mustern] (https://www.lua.org/pil/20.2.html). Patterns sind eine Methode, um anhand von Regeln Dinge aus Text zu extrahieren.
local zu, msg = string.match(param, "^([%a%d_-]+) (*+)$")
Der obige Code implementiert /msg <zu> <Nachricht>
. Lassen Sie uns von links nach rechts vorgehen:
^
bedeutet, dass der Anfang der Zeichenkette übereinstimmt.()
ist eine übereinstimmende Gruppe - alles, was hier drin steht, wird von string.match zurückgegeben.[]
bedeutet, dass die Zeichen in dieser Liste akzeptiert werden.%a
bedeutet, jeden Buchstaben zu akzeptieren und%d
bedeutet, eine beliebige Ziffer zu akzeptieren.[%a%d_-]
bedeutet, einen beliebigen Buchstaben, eine beliebige Ziffer,_
oder-
zu akzeptieren.+
bedeutet, dass die Sache ein oder mehrere Male übereinstimmt.*
bedeutet, dass ein beliebiges Zeichen in diesem Zusammenhang übereinstimmt.$
bedeutet, das Ende der Zeichenkette zu finden.
Einfach ausgedrückt: Das Muster entspricht dem Namen (ein Wort mit nur Buchstaben/Zahlen/-/_), dann ein Leerzeichen, dann die Nachricht (ein oder mehrere beliebige Zeichen). Der Name und die werden zurückgegeben, da sie von Klammern umgeben sind.
Das ist die Art und Weise, wie die meisten Mods komplexe Chat-Befehle implementieren. Eine bessere Anleitung für Lua Patterns wäre wahrscheinlich das lua-users.org tutorial oder die PIL-Dokumentation.
Es gibt auch eine vom Autor dieses Buches geschriebene Bibliothek, die man dazu benutzen kann um komplexe Chat-Befehle ohne Muster zu erstellen, den Chat Command Builder.
Abfangen von Nachrichten
Um eine Nachricht abzufangen, verwenden Sie register_on_chat_message:
minetest.register_on_chat_message(function(name, message)
print(name .. " sagte " .. message)
return false
end)
Wenn Sie false zurückgeben, erlauben Sie, dass die Chat-Nachricht vom Standard
Handler gesendet wird. Sie können die Zeile return false
sogar entfernen und es würde immer noch
funktionieren, da nil
implizit zurückgegeben wird und wie false behandelt wird.
{% include notice.html notice=page.cb_cmdsprivs %}
Sie sollten berücksichtigen, dass es sich um einen Chat-Befehl handeln könnte,
oder der Benutzer vielleicht kein shout
hat.
minetest.register_on_chat_message(function(name, message)
if message:sub(1, 1) == "/" then
print(name .. " hat einen Chat-Befehl ausgeführt")
elseif minetest.check_player_privs(name, { shout = true }) then
print(name .. " sagte " .. message)
else
print(name .. " versucht zu sagen " .. message ..
" hat aber kein shout")
end
return false
end)