diff --git a/_de/players/chat.md b/_de/players/chat.md new file mode 100644 index 0000000..d6a18d4 --- /dev/null +++ b/_de/players/chat.md @@ -0,0 +1,166 @@ +--- +title: Chat und Commands +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 + title: Offline players can run commands + message:

A player name is passed instead of a player object because mods + can run commands on behalf of offline players. For example, the IRC + bridge allows players to run commands without joining the game.

+ +

So make sure that you don't assume that the player is online. + You can check by seeing if

minetest.get_player_by_name
returns a player.

+ +cb_cmdsprivs: + level: warning + title: Privileges and Chat Commands + message: The shout privilege isn't needed for a player to trigger this callback. + This is because chat commands are implemented in Lua, and are just + chat messages that begin with a /. + +--- + +## 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](#senden-von-nachrichten-an-alle-spieler) +- [Sending Messages to Specific Players](#sending-messages-to-specific-players) +- [Chat Commands](#chat-commands) +- [Complex Subcommands](#complex-subcommands) +- [Intercepting Messages](#intercepting-messages) + +## Senden von Nachrichten an alle Spieler + +Um eine Nachricht an alle Spieler im Spiel zu senden, rufe die Funktion chat_send_all auf. + +```lua +minetest.chat_send_all("Dies ist eine Chat-Nachricht an alle Spieler") +``` + +Hier ist ein Beispiel dafür, wie dies im Spiel aussieht: + + Sehen Sie sich diesen Eingang an + Dies ist eine Chat-Nachricht an alle Spieler + Was ist damit? + +Die Nachricht erscheint in einer separaten Zeile, um sie vom Spieler-Chat im Spiel zu unterscheiden. + +## Sending Messages to Specific Players + +To send a message to a specific player, call the chat_send_player function: + +```lua +minetest.chat_send_player("player1", "This is a chat message for player1") +``` + +This message displays in the same manner as messages to all players, but is +only visible to the named player, in this case, player1. + +## Chat Commands + +To register a chat command, for example `/foo`, use `register_chatcommand`: + +```lua +minetest.register_chatcommand("foo", { + privs = { + interact = true, + }, + func = function(name, param) + return true, "You said " .. param .. "!" + end, +}) +``` + +In the above snippet, `interact` is listed as a required +[privilege](privileges.html) meaning that only players with the `interact` privilege can run the command. + +Chat commands can return up to two values, +the first being a Boolean indicating success, and the second being a +message to send to the user. + +{% include notice.html notice=page.cmd_online %} + +## Complex Subcommands + +It is often required to make complex chat commands, such as: + +* `/msg ` +* `/team join ` +* `/team leave ` +* `/team list` + +This is usually done using [Lua patterns](https://www.lua.org/pil/20.2.html). +Patterns are a way of extracting stuff from text using rules. + +```lua +local to, msg = string.match(param, "^([%a%d_-]+) (*+)$") +``` + +The above code implements `/msg `. Let's go through left to right: + +* `^` means match the start of the string. +* `()` is a matching group - anything that matches stuff in here will be + returned from string.match. +* `[]` means accept characters in this list. +* `%a` means accept any letter and `%d` means accept any digit. +* `[%a%d_-]` means accept any letter or digit or `_` or `-`. +* `+` means match the thing before one or more times. +* `*` means match any character in this context. +* `$` means match the end of the string. + +Put simply, the pattern matches the name (a word with only letters/numbers/-/_), +then a space, then the message (one or more of any character). The name and +message are returned, because they're surrounded by parentheses. + +That's how most mods implement complex chat commands. A better guide to Lua +Patterns would probably be the +[lua-users.org tutorial](http://lua-users.org/wiki/PatternsTutorial) +or the [PIL documentation](https://www.lua.org/pil/20.2.html). + +

+ There is also a library written by the author of this book which can be used + to make complex chat commands without patterns called + Chat Command Builder. +

+ + +## Intercepting Messages + +To intercept a message, use register_on_chat_message: + +```lua +minetest.register_on_chat_message(function(name, message) + print(name .. " said " .. message) + return false +end) +``` + +By returning false, you allow the chat message to be sent by the default +handler. You can actually remove the line `return false` and it would still +work the same, because `nil` is returned implicitly and is treated like false. + +{% include notice.html notice=page.cb_cmdsprivs %} + +You should make sure you take into account that it may be a chat command, +or the user may not have `shout`. + +```lua +minetest.register_on_chat_message(function(name, message) + if message:sub(1, 1) == "/" then + print(name .. " ran chat command") + elseif minetest.check_player_privs(name, { shout = true }) then + print(name .. " said " .. message) + else + print(name .. " tried to say " .. message .. + " but doesn't have shout") + end + + return false +end) +``` diff --git a/_de/wörterbuch.txt b/_de/wörterbuch.txt index 1aa4ae7..59b4385 100644 --- a/_de/wörterbuch.txt +++ b/_de/wörterbuch.txt @@ -6,7 +6,9 @@ Attachment = Anhang block = Mapblock bulk = bulk Chapter = Kapitel +chat message = Chat-Nachricht child = Kind +Command = Command Cubic Nodes = Würfelförmiger Block craft slots = Handwerksplätze Damage = Schaden