minetest_modding_book/_de/players/chat.md

167 lines
6.2 KiB
Markdown
Raw Normal View History

2022-08-28 01:40:57 +03:00
---
2022-08-28 00:18:30 +03:00
title: Chat und Befehle
2022-08-28 01:40:57 +03:00
layout: default
root: ../..
idx: 4.2
description: Registrierung eines Chatbefehls und Behandlung von Chatnachrichten mit register_on_chat_message
redirect_from: /de/chapters/chat.html
cmd_online:
level: warning
2022-08-28 00:15:25 +03:00
title: Offline-Spieler können Befehle ausführen
message: <p>Ein Spielername wird anstelle eines Spielerobjekts übergeben, da Mods
Befehle im Namen von Offline-Spielern ausführen können. Zum Beispiel erlaubt die IRC-
Brücke den Spielern, Befehle auszuführen, ohne dem Spiel beizutreten.</p>
2022-08-28 01:40:57 +03:00
2022-08-28 00:15:25 +03:00
<p>Stellen Sie also sicher, dass Sie nicht davon ausgehen, dass der Spieler online ist.
Sie können überprüfen, ob <pre>minetest.get_player_by_name</pre> einen Spieler liefert.</p>
2022-08-28 01:40:57 +03:00
cb_cmdsprivs:
level: warning
2022-08-28 00:15:25 +03:00
title: Privilegien und Chat-Befehle
message: Das "Shout"-Privileg ist für einen Spieler nicht erforderlich, um diesen Callback auszulösen.
Das liegt daran, dass Chat-Befehle in Lua implementiert sind, und nur
Chat-Nachrichten sind, die mit einem / beginnen.
2022-08-28 01:40:57 +03:00
---
## Einleitung <!-- omit in toc -->
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](#senden-von-nachrichten-an-alle-spieler)
2022-08-28 00:15:25 +03:00
- [Nachrichten an bestimmte Spieler senden](#nachrichten-an-bestimmte-spieler-senden)
- [Chat-Befehle](#chat-befehle)
2022-08-28 00:18:30 +03:00
- [Komplexe Unterbefehle](#komplexe-unterbefehle)
2022-08-28 00:15:25 +03:00
- [Abfangen von Nachrichten](#abfangen-von-nachrichten)
2022-08-28 01:40:57 +03:00
## Senden von Nachrichten an alle Spieler
Um eine Nachricht an alle Spieler im Spiel zu senden, rufen Sie die Funktion chat_send_all auf.
2022-08-28 01:40:57 +03:00
```lua
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.
2022-08-28 00:15:25 +03:00
## Nachrichten an bestimmte Spieler senden
2022-08-28 01:40:57 +03:00
2022-08-28 00:15:25 +03:00
Um eine Nachricht an einen bestimmten Spieler zu senden, rufen Sie die Funktion chat_send_player auf:
2022-08-28 01:40:57 +03:00
```lua
2022-08-28 00:15:25 +03:00
minetest.chat_send_player("Spieler1", "Dies ist eine Chat-Nachricht für Spieler1")
2022-08-28 01:40:57 +03:00
```
2022-08-28 00:15:25 +03:00
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.
2022-08-28 01:40:57 +03:00
2022-08-28 00:15:25 +03:00
## Chat-Befehle
2022-08-28 01:40:57 +03:00
2022-08-28 00:15:25 +03:00
Um einen Chat-Befehl zu registrieren, zum Beispiel `/foo`, verwenden Sie `register_chatcommand`:
2022-08-28 01:40:57 +03:00
```lua
minetest.register_chatcommand("foo", {
privs = {
interact = true,
},
func = function(name, param)
2022-08-28 00:15:25 +03:00
return true, "Sie sagten " .. param .. "!"
2022-08-28 01:40:57 +03:00
end,
})
```
2022-08-28 00:15:25 +03:00
Im obigen Ausschnitt ist "interact" als erforderliches
[Privileg](privileges.html) aufgeführt, was bedeutet, dass nur Spieler mit dem Privileg "interact" den Befehl ausführen können.
2022-08-28 01:40:57 +03:00
2022-08-28 00:15:25 +03:00
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.
2022-08-28 01:40:57 +03:00
{% include notice.html notice=page.cmd_online %}
2022-08-28 00:15:25 +03:00
## Komplexe Unterbefehle
2022-08-28 01:40:57 +03:00
2022-08-28 00:15:25 +03:00
Es wird oft benötigt, komplexe Chat-Befehle zu bereitzustellen, wie z.B.:
2022-08-28 01:40:57 +03:00
2022-08-28 00:15:25 +03:00
* `/msg <zu> <Nachricht>`
* `/team join <Teamname>`
* `/team leave <Teamname>`
2022-08-28 01:40:57 +03:00
* `/team list`
2022-08-28 00:15:25 +03:00
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.
2022-08-28 01:40:57 +03:00
```lua
2022-08-28 00:15:25 +03:00
local zu, msg = string.match(param, "^([%a%d_-]+) (*+)$")
2022-08-28 01:40:57 +03:00
```
2022-08-28 00:15:25 +03:00
Der obige Code implementiert `/msg <zu> <Nachricht>`. Lassen Sie uns von links nach rechts vorgehen:
2022-08-28 01:40:57 +03:00
2022-08-28 00:15:25 +03:00
* `^` 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.
2022-08-28 01:40:57 +03:00
2022-08-28 00:15:25 +03:00
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.
2022-08-28 01:40:57 +03:00
2022-08-28 00:15:25 +03:00
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
2022-08-28 01:40:57 +03:00
[lua-users.org tutorial](http://lua-users.org/wiki/PatternsTutorial)
2022-08-28 00:15:25 +03:00
oder die [PIL-Dokumentation](https://www.lua.org/pil/20.2.html).
2022-08-28 01:40:57 +03:00
<p class="book_hide">
Es gibt auch eine vom Autor dieses Buches geschriebene Bibliothek, die man dazu benutzen
2022-08-28 00:15:25 +03:00
kann um komplexe Chat-Befehle ohne Muster zu erstellen, den
<a href="https://gitlab.com/rubenwardy/ChatCmdBuilder">Chat Command Builder</a>.
2022-08-28 01:40:57 +03:00
</p>
2022-08-28 00:15:25 +03:00
## Abfangen von Nachrichten
2022-08-28 01:40:57 +03:00
2022-08-28 00:15:25 +03:00
Um eine Nachricht abzufangen, verwenden Sie register_on_chat_message:
2022-08-28 01:40:57 +03:00
```lua
minetest.register_on_chat_message(function(name, message)
2022-08-28 00:15:25 +03:00
print(name .. " sagte " .. message)
2022-08-28 01:40:57 +03:00
return false
end)
```
2022-08-28 00:15:25 +03:00
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.
2022-08-28 01:40:57 +03:00
{% include notice.html notice=page.cb_cmdsprivs %}
2022-08-28 00:15:25 +03:00
Sie sollten berücksichtigen, dass es sich um einen Chat-Befehl handeln könnte,
oder der Benutzer vielleicht kein `shout` hat.
2022-08-28 01:40:57 +03:00
```lua
minetest.register_on_chat_message(function(name, message)
if message:sub(1, 1) == "/" then
2022-08-28 00:15:25 +03:00
print(name .. " hat einen Chat-Befehl ausgeführt")
2022-08-28 01:40:57 +03:00
elseif minetest.check_player_privs(name, { shout = true }) then
2022-08-28 00:15:25 +03:00
print(name .. " sagte " .. message)
2022-08-28 01:40:57 +03:00
else
2022-08-28 00:15:25 +03:00
print(name .. " versucht zu sagen " .. message ..
" hat aber kein shout")
2022-08-28 01:40:57 +03:00
end
return false
end)
```