Merge commit '13b50' into backport (untested)
This commit is contained in:
commit
45da7df5a1
@ -210,8 +210,8 @@ find_package(Lua REQUIRED)
|
||||
add_subdirectory(lib/luautf8)
|
||||
add_subdirectory(lib/luachacha)
|
||||
|
||||
# JsonCPP doesn't compile well on GCC 4.8
|
||||
if(NOT ENABLE_SYSTEM_JSONCPP)
|
||||
# JsonCpp doesn't compile well on GCC 4.8
|
||||
if(NOT USE_SYSTEM_JSONCPP)
|
||||
set(GCC_MINIMUM_VERSION "4.9")
|
||||
endif()
|
||||
|
||||
|
@ -51,7 +51,7 @@ RUN mkdir build && \
|
||||
|
||||
FROM alpine:3.14
|
||||
|
||||
RUN apk add --no-cache sqlite-libs curl gmp libstdc++ libgcc libpq luajit && \
|
||||
RUN apk add --no-cache sqlite-libs curl gmp libstdc++ libgcc libpq luajit jsoncpp && \
|
||||
adduser -D multicraft --uid 30000 -h /var/lib/multicraft && \
|
||||
chown -R multicraft:multicraft /var/lib/multicraft
|
||||
|
||||
|
@ -225,7 +225,7 @@ General options and their default values:
|
||||
ENABLE_LUAJIT=ON - Build with LuaJIT (much faster than non-JIT Lua)
|
||||
ENABLE_PROMETHEUS=OFF - Build with Prometheus metrics exporter (listens on tcp/30000 by default)
|
||||
ENABLE_SYSTEM_GMP=ON - Use GMP from system (much faster than bundled mini-gmp)
|
||||
ENABLE_SYSTEM_JSONCPP=OFF - Use JsonCPP from system
|
||||
ENABLE_SYSTEM_JSONCPP=ON - Use JsonCPP from system
|
||||
OPENGL_GL_PREFERENCE=LEGACY - Linux client build only; See CMake Policy CMP0072 for reference
|
||||
RUN_IN_PLACE=FALSE - Create a portable install (worlds, settings etc. in current directory)
|
||||
ENABLE_UPDATE_CHECKER=TRUE - Whether to enable update checks by default
|
||||
@ -343,7 +343,7 @@ This is outdated and not recommended. Follow the instructions on https://dev.min
|
||||
Run the following script in PowerShell:
|
||||
|
||||
```powershell
|
||||
cmake . -G"Visual Studio 15 2017 Win64" -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_GETTEXT=OFF -DENABLE_CURSES=OFF -DENABLE_SYSTEM_JSONCPP=ON
|
||||
cmake . -G"Visual Studio 15 2017 Win64" -DCMAKE_TOOLCHAIN_FILE=D:/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_GETTEXT=OFF -DENABLE_CURSES=OFF
|
||||
cmake --build . --config Release
|
||||
```
|
||||
Make sure that the right compiler is selected and the path to the vcpkg toolchain is correct.
|
||||
|
@ -1099,10 +1099,12 @@ core.register_chatcommand("clearobjects", {
|
||||
return false, S("Invalid usage, see /help clearobjects.")
|
||||
end
|
||||
|
||||
core.log("action", name .. " clears all objects ("
|
||||
core.log("action", name .. " clears objects ("
|
||||
.. options.mode .. " mode).")
|
||||
core.chat_send_all(S("Clearing all objects. This may take a long time."
|
||||
.. " You may experience a timeout."))
|
||||
if options.mode == "full" then
|
||||
core.chat_send_all(S("Clearing all objects. This may take a long time. "
|
||||
.. "You may experience a timeout."))
|
||||
end
|
||||
core.clear_objects(options)
|
||||
core.log("action", "Object clearing done.")
|
||||
core.chat_send_all("*** "..S("Cleared all objects."))
|
||||
|
@ -373,6 +373,7 @@ core.register_node(":ignore", {
|
||||
drop = "",
|
||||
drowning = 0,
|
||||
groups = {not_in_creative_inventory=1},
|
||||
node_placement_prediction = "",
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
core.chat_send_player(
|
||||
placer:get_player_name(),
|
||||
|
225
builtin/locale/__builtin.de.tr
Normal file
225
builtin/locale/__builtin.de.tr
Normal file
@ -0,0 +1,225 @@
|
||||
# textdomain: __builtin
|
||||
Empty command.=Leerer Befehl.
|
||||
Invalid command: @1=Ungültiger Befehl: @1
|
||||
Invalid command usage.=Ungültige Befehlsverwendung.
|
||||
You don't have permission to run this command (missing privileges: @1).=Sie haben keine Erlaubnis, diesen Befehl auszuführen (fehlende Privilegien: @1).
|
||||
Unable to get position of player @1.=Konnte Position vom Spieler @1 nicht ermitteln.
|
||||
Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)=Ungültiges Gebietsformat. Erwartet: (x1,y1,z1) (x2,y2,z2)
|
||||
<action>=<Aktion>
|
||||
Show chat action (e.g., '/me orders a pizza' displays '<player name> orders a pizza')=Chataktion zeigen (z.B. wird „/me isst Pizza“ zu „<Spielername> isst Pizza“)
|
||||
Show the name of the server owner=Den Namen des Servereigentümers zeigen
|
||||
The administrator of this server is @1.=Der Administrator dieses Servers ist @1.
|
||||
There's no administrator named in the config file.=In der Konfigurationsdatei wurde kein Administrator angegeben.
|
||||
[<name>]=[<Name>]
|
||||
Show privileges of yourself or another player=Ihre eigenen Privilegien oder die eines anderen Spielers anzeigen
|
||||
Player @1 does not exist.=Spieler @1 existiert nicht.
|
||||
Privileges of @1: @2=Privilegien von @1: @2
|
||||
<privilege>=<Privileg>
|
||||
Return list of all online players with privilege=Liste aller Spieler mit einem Privileg ausgeben
|
||||
Invalid parameters (see /help haspriv).=Ungültige Parameter (siehe „/help haspriv“).
|
||||
Unknown privilege!=Unbekanntes Privileg!
|
||||
Players online with the "@1" privilege: @2=Derzeit online spielende Spieler mit dem „@1“-Privileg: @2
|
||||
Your privileges are insufficient.=Ihre Privilegien sind unzureichend.
|
||||
Unknown privilege: @1=Unbekanntes Privileg: @1
|
||||
@1 granted you privileges: @2=@1 gewährte Ihnen Privilegien: @2
|
||||
<name> (<privilege> | all)=<Name> (<Privileg> | all)
|
||||
Give privileges to player=Privileg an Spieler vergeben
|
||||
Invalid parameters (see /help grant).=Ungültige Parameter (siehe „/help grant“).
|
||||
<privilege> | all=<Privileg> | all
|
||||
Grant privileges to yourself=Privilegien an Ihnen selbst vergeben
|
||||
Invalid parameters (see /help grantme).=Ungültige Parameter (siehe „/help grantme“).
|
||||
@1 revoked privileges from you: @2=@1 entfernte Privilegien von Ihnen: @2
|
||||
Remove privileges from player=Privilegien von Spieler entfernen
|
||||
Invalid parameters (see /help revoke).=Ungültige Parameter (siehe „/help revoke“).
|
||||
Revoke privileges from yourself=Privilegien von Ihnen selbst entfernen
|
||||
Invalid parameters (see /help revokeme).=Ungültige Parameter (siehe „/help revokeme“).
|
||||
<name> <password>=<Name> <Passwort>
|
||||
Set player's password=Passwort von Spieler setzen
|
||||
Name field required.=Namensfeld benötigt.
|
||||
Your password was cleared by @1.=Ihr Passwort wurde von @1 geleert.
|
||||
Password of player "@1" cleared.=Passwort von Spieler „@1“ geleert.
|
||||
Your password was set by @1.=Ihr Passwort wurde von @1 gesetzt.
|
||||
Password of player "@1" set.=Passwort von Spieler „@1“ gesetzt.
|
||||
<name>=<Name>
|
||||
Set empty password for a player=Leeres Passwort für einen Spieler setzen
|
||||
Reload authentication data=Authentifizierungsdaten erneut laden
|
||||
Done.=Fertig.
|
||||
Failed.=Fehlgeschlagen.
|
||||
Remove a player's data=Daten eines Spielers löschen
|
||||
Player "@1" removed.=Spieler „@1“ gelöscht.
|
||||
No such player "@1" to remove.=Es gibt keinen Spieler „@1“, der gelöscht werden könnte.
|
||||
Player "@1" is connected, cannot remove.=Spieler „@1“ ist verbunden, er kann nicht gelöscht werden.
|
||||
Unhandled remove_player return code @1.=Nicht berücksichtigter remove_player-Rückgabewert @1.
|
||||
Cannot teleport out of map bounds!=Eine Teleportation außerhalb der Kartengrenzen ist nicht möglich!
|
||||
Cannot get player with name @1.=Spieler mit Namen @1 kann nicht gefunden werden.
|
||||
Cannot teleport, @1 is attached to an object!=Teleportation nicht möglich, @1 ist an einem Objekt befestigt!
|
||||
Teleporting @1 to @2.=Teleportation von @1 nach @2
|
||||
One does not teleport to oneself.=Man teleportiert sich doch nicht zu sich selbst.
|
||||
Cannot get teleportee with name @1.=Der zu teleportierende Spieler mit Namen @1 kann nicht gefunden werden.
|
||||
Cannot get target player with name @1.=Zielspieler mit Namen @1 kann nicht gefunden werden.
|
||||
Teleporting @1 to @2 at @3.=Teleportation von @1 zu @2 bei @3
|
||||
<X>,<Y>,<Z> | <to_name> | <name> <X>,<Y>,<Z> | <name> <to_name>=<X>,<Y>,<Z> | <zu_Name> | <Name> <X>,<Y>,<Z> | <Name> <zu_Name>
|
||||
Teleport to position or player=Zu Position oder Spieler teleportieren
|
||||
You don't have permission to teleport other players (missing privilege: @1).=Sie haben nicht die Erlaubnis, andere Spieler zu teleportieren (fehlendes Privileg: @1).
|
||||
([-n] <name> <value>) | <name>=([-n] <Name> <Wert>) | <Name>
|
||||
Set or read server configuration setting=Serverkonfigurationseinstellung setzen oder lesen
|
||||
Failed. Use '/set -n <name> <value>' to create a new setting.=Fehlgeschlagen. Benutzen Sie „/set -n <Name> <Wert>“, um eine neue Einstellung zu erstellen.
|
||||
@1 @= @2=@1 @= @2
|
||||
<not set>=<nicht gesetzt>
|
||||
Invalid parameters (see /help set).=Ungültige Parameter (siehe „/help set“).
|
||||
Finished emerging @1 blocks in @2ms.=Fertig mit Erzeugung von @1 Blöcken in @2 ms.
|
||||
emergeblocks update: @1/@2 blocks emerged (@3%)=emergeblocks-Update: @1/@2 Kartenblöcke geladen (@3%)
|
||||
(here [<radius>]) | (<pos1> <pos2>)=(here [<Radius>]) | (<Pos1> <Pos2>)
|
||||
Load (or, if nonexistent, generate) map blocks contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)=Lade (oder, wenn nicht existent, generiere) Kartenblöcke im Gebiet zwischen Pos1 und Pos2 (<Pos1> und <Pos2> müssen in Klammern stehen)
|
||||
Started emerge of area ranging from @1 to @2.=Start des Ladevorgangs des Gebiets zwischen @1 und @2.
|
||||
Delete map blocks contained in area pos1 to pos2 (<pos1> and <pos2> must be in parentheses)=Kartenblöcke innerhalb des Gebiets zwischen Pos1 und Pos2 löschen (<Pos1> und <Pos2> müssen in Klammern stehen)
|
||||
Successfully cleared area ranging from @1 to @2.=Gebiet zwischen @1 und @2 erfolgreich geleert.
|
||||
Failed to clear one or more blocks in area.=Fehlgeschlagen: Ein oder mehrere Kartenblöcke im Gebiet konnten nicht geleert werden.
|
||||
Resets lighting in the area between pos1 and pos2 (<pos1> and <pos2> must be in parentheses)=Setzt das Licht im Gebiet zwischen Pos1 und Pos2 zurück (<Pos1> und <Pos2> müssen in Klammern stehen)
|
||||
Successfully reset light in the area ranging from @1 to @2.=Das Licht im Gebiet zwischen @1 und @2 wurde erfolgreich zurückgesetzt.
|
||||
Failed to load one or more blocks in area.=Fehlgeschlagen: Ein oder mehrere Kartenblöcke im Gebiet konnten nicht geladen werden.
|
||||
List mods installed on the server=Installierte Mods auf dem Server auflisten
|
||||
Cannot give an empty item.=Ein leerer Gegenstand kann nicht gegeben werden.
|
||||
Cannot give an unknown item.=Ein unbekannter Gegenstand kann nicht gegeben werden.
|
||||
Giving 'ignore' is not allowed.=„ignore“ darf nicht gegeben werden.
|
||||
@1 is not a known player.=@1 ist kein bekannter Spieler.
|
||||
@1 partially added to inventory.=@1 teilweise ins Inventar eingefügt.
|
||||
@1 could not be added to inventory.=@1 konnte nicht ins Inventar eingefügt werden.
|
||||
@1 added to inventory.=@1 zum Inventar hinzugefügt.
|
||||
@1 partially added to inventory of @2.=@1 teilweise ins Inventar von @2 eingefügt.
|
||||
@1 could not be added to inventory of @2.=@1 konnte nicht ins Inventar von @2 eingefügt werden.
|
||||
@1 added to inventory of @2.=@1 ins Inventar von @2 eingefügt.
|
||||
<name> <ItemString> [<count> [<wear>]]=<Name> <ItemString> [<Anzahl> [<Abnutzung>]]
|
||||
Give item to player=Gegenstand an Spieler geben
|
||||
Name and ItemString required.=Name und ItemString benötigt.
|
||||
<ItemString> [<count> [<wear>]]=<ItemString> [<Anzahl> [<Abnutzung>]]
|
||||
Give item to yourself=Gegenstand Ihnen selbst geben
|
||||
ItemString required.=ItemString benötigt.
|
||||
<EntityName> [<X>,<Y>,<Z>]=<EntityName> [<X>,<Y>,<Z>]
|
||||
Spawn entity at given (or your) position=Entity an angegebener (oder Ihrer eigenen) Position spawnen
|
||||
EntityName required.=EntityName benötigt.
|
||||
Unable to spawn entity, player is nil.=Entity konnte nicht gespawnt werden, Spieler ist nil.
|
||||
Cannot spawn an unknown entity.=Ein unbekanntes Entity kann nicht gespawnt werden.
|
||||
Invalid parameters (@1).=Ungültige Parameter (@1).
|
||||
@1 spawned.=@1 gespawnt.
|
||||
@1 failed to spawn.=@1 konnte nicht gespawnt werden.
|
||||
Destroy item in hand=Gegenstand in der Hand zerstören
|
||||
Unable to pulverize, no player.=Konnte nicht pulverisieren, kein Spieler.
|
||||
Unable to pulverize, no item in hand.=Konnte nicht pulverisieren, kein Gegenstand in der Hand.
|
||||
An item was pulverized.=Ein Gegenstand wurde pulverisiert.
|
||||
[<range>] [<seconds>] [<limit>]=[<Reichweite>] [<Sekunden>] [<Limit>]
|
||||
Check who last touched a node or a node near it within the time specified by <seconds>. Default: range @= 0, seconds @= 86400 @= 24h, limit @= 5. Set <seconds> to inf for no time limit=Überprüfen, wer als letztes einen Node oder einen Node in der Nähe innerhalb der in <Sekunden> angegebenen Zeitspanne angefasst hat. Standard: Reichweite @= 0, Sekunden @= 86400 @= 24h, Limit @= 5. <Sekunden> auf „inf“ setzen, um Zeitlimit zu deaktivieren.
|
||||
Rollback functions are disabled.=Rollback-Funktionen sind deaktiviert.
|
||||
That limit is too high!=Dieses Limit ist zu hoch!
|
||||
Checking @1 ...=Überprüfe @1 ...
|
||||
Nobody has touched the specified location in @1 seconds.=Niemand hat die angegebene Position seit @1 Sekunden angefasst.
|
||||
@1 @2 @3 -> @4 @5 seconds ago.=@1 @2 @3 -> @4 vor @5 Sekunden.
|
||||
Punch a node (range@=@1, seconds@=@2, limit@=@3).=Hauen Sie einen Node (Reichweite@=@1, Sekunden@=@2, Limit@=@3).
|
||||
(<name> [<seconds>]) | (:<actor> [<seconds>])=(<Name> [<Sekunden>]) | (:<Akteur> [<Sekunden>])
|
||||
Revert actions of a player. Default for <seconds> is 60. Set <seconds> to inf for no time limit=Aktionen eines Spielers zurückrollen. Standard für <Sekunden> ist 60. <Sekunden> auf „inf“ setzen, um Zeitlimit zu deaktivieren
|
||||
Invalid parameters. See /help rollback and /help rollback_check.=Ungültige Parameter. Siehe /help rollback und /help rollback_check.
|
||||
Reverting actions of player '@1' since @2 seconds.=Die Aktionen des Spielers „@1“ seit @2 Sekunden werden rückgängig gemacht.
|
||||
Reverting actions of @1 since @2 seconds.=Die Aktionen von @1 seit @2 Sekunden werden rückgängig gemacht.
|
||||
(log is too long to show)=(Protokoll ist zu lang für die Anzeige)
|
||||
Reverting actions succeeded.=Die Aktionen wurden erfolgreich rückgängig gemacht.
|
||||
Reverting actions FAILED.=FEHLGESCHLAGEN: Die Aktionen konnten nicht rückgängig gemacht werden.
|
||||
Show server status=Serverstatus anzeigen
|
||||
This command was disabled by a mod or game.=Dieser Befehl wurde von einer Mod oder einem Spiel deaktiviert.
|
||||
[<0..23>:<0..59> | <0..24000>]=[<0..23>:<0..59> | <0..24000>]
|
||||
Show or set time of day=Tageszeit anzeigen oder setzen
|
||||
Current time is @1:@2.=Es ist jetzt @1:@2 Uhr.
|
||||
You don't have permission to run this command (missing privilege: @1).=Sie haben nicht die Erlaubnis, diesen Befehl auszuführen (fehlendes Privileg: @1).
|
||||
Invalid time.=Ungültige Zeit.
|
||||
Time of day changed.=Tageszeit geändert.
|
||||
Invalid hour (must be between 0 and 23 inclusive).=Ungültige Stunde (muss zwischen 0 und 23 inklusive liegen).
|
||||
Invalid minute (must be between 0 and 59 inclusive).=Ungültige Minute (muss zwischen 0 und 59 inklusive liegen).
|
||||
Show day count since world creation=Anzahl Tage seit der Erschaffung der Welt anzeigen
|
||||
Current day is @1.=Aktueller Tag ist @1.
|
||||
[<delay_in_seconds> | -1] [reconnect] [<message>]=[<Verzögerung_in_Sekunden> | -1] [reconnect] [<Nachricht>]
|
||||
Shutdown server (-1 cancels a delayed shutdown)=Server herunterfahren (-1 bricht einen verzögerten Abschaltvorgang ab)
|
||||
Server shutting down (operator request).=Server wird heruntergefahren (Betreiberanfrage).
|
||||
Ban the IP of a player or show the ban list=Die IP eines Spielers verbannen oder die Bannliste anzeigen
|
||||
The ban list is empty.=Die Bannliste ist leer.
|
||||
Ban list: @1=Bannliste: @1
|
||||
Player is not online.=Spieler ist nicht online.
|
||||
Failed to ban player.=Konnte Spieler nicht verbannen.
|
||||
Banned @1.=@1 verbannt.
|
||||
<name> | <IP_address>=<Name> | <IP_Adresse>
|
||||
Remove IP ban belonging to a player/IP=Einen IP-Bann auf einen Spieler zurücknehmen
|
||||
Failed to unban player/IP.=Konnte Bann auf Spieler/IP nicht zurücknehmen.
|
||||
Unbanned @1.=Bann auf @1 zurückgenommen.
|
||||
<name> [<reason>]=<Name> [<Grund>]
|
||||
Kick a player=Spieler hinauswerfen
|
||||
Failed to kick player @1.=Spieler @1 konnte nicht hinausgeworfen werden.
|
||||
Kicked @1.=@1 hinausgeworfen.
|
||||
[full | quick]=[full | quick]
|
||||
Clear all objects in world=Alle Objekte in der Welt löschen
|
||||
Invalid usage, see /help clearobjects.=Ungültige Verwendung, siehe /help clearobjects.
|
||||
Clearing all objects. This may take a long time. You may experience a timeout. (by @1)=Lösche alle Objekte. Dies kann eine lange Zeit dauern. Eine Netzwerkzeitüberschreitung könnte für Sie auftreten. (von @1)
|
||||
Objects cleared.=Objekte gelöscht.
|
||||
Cleared all objects.=Alle Objekte gelöscht.
|
||||
<name> <message>=<Name> <Nachricht>
|
||||
Send a direct message to a player=Eine Direktnachricht an einen Spieler senden
|
||||
Invalid usage, see /help msg.=Ungültige Verwendung, siehe /help msg.
|
||||
The player @1 is not online.=Der Spieler @1 ist nicht online.
|
||||
DM from @1: @2=DN von @1: @2
|
||||
Message sent.=Nachricht gesendet.
|
||||
Get the last login time of a player or yourself=Den letzten Loginzeitpunkt eines Spielers oder Ihren eigenen anfragen
|
||||
@1's last login time was @2.=Letzter Loginzeitpunkt von @1 war @2.
|
||||
@1's last login time is unknown.=Letzter Loginzeitpunkt von @1 ist unbekannt.
|
||||
Clear the inventory of yourself or another player=Das Inventar von Ihnen oder einem anderen Spieler leeren
|
||||
You don't have permission to clear another player's inventory (missing privilege: @1).=Sie haben nicht die Erlaubnis, das Inventar eines anderen Spielers zu leeren (fehlendes Privileg: @1).
|
||||
@1 cleared your inventory.=@1 hat Ihr Inventar geleert.
|
||||
Cleared @1's inventory.=Inventar von @1 geleert.
|
||||
Player must be online to clear inventory!=Spieler muss online sein, um das Inventar leeren zu können!
|
||||
Players can't be killed, damage has been disabled.=Spieler können nicht getötet werden, Schaden ist deaktiviert.
|
||||
Player @1 is not online.=Spieler @1 ist nicht online.
|
||||
You are already dead.=Sie sind schon tot.
|
||||
@1 is already dead.=@1 ist bereits tot.
|
||||
@1 has been killed.=@1 wurde getötet.
|
||||
Kill player or yourself=Einen Spieler oder Sie selbst töten
|
||||
Available commands: @1=Verfügbare Befehle: @1
|
||||
Use '/help <cmd>' to get more information, or '/help all' to list everything.=„/help <Befehl>“ benutzen, um mehr Informationen zu erhalten, oder „/help all“, um alles aufzulisten.
|
||||
Available commands:=Verfügbare Befehle:
|
||||
Command not available: @1=Befehl nicht verfügbar: @1
|
||||
[all | privs | <cmd>]=[all | privs | <Befehl>]
|
||||
Get help for commands or list privileges=Hilfe für Befehle erhalten oder Privilegien auflisten
|
||||
Available privileges:=Verfügbare Privilegien:
|
||||
Command=Befehl
|
||||
Parameters=Parameter
|
||||
For more information, click on any entry in the list.=Für mehr Informationen klicken Sie auf einen beliebigen Eintrag in der Liste.
|
||||
Double-click to copy the entry to the chat history.=Doppelklicken, um den Eintrag in die Chathistorie einzufügen.
|
||||
Command: @1 @2=Befehl: @1 @2
|
||||
Available commands: (see also: /help <cmd>)=Verfügbare Befehle: (siehe auch: /help <Befehl>)
|
||||
Close=Schließen
|
||||
Privilege=Privileg
|
||||
Description=Beschreibung
|
||||
print [<filter>] | dump [<filter>] | save [<format> [<filter>]] | reset=print [<Filter>] | dump [<Filter>] | save [<Format> [<Filter>]]
|
||||
Handle the profiler and profiling data=Den Profiler und Profilingdaten verwalten
|
||||
Statistics written to action log.=Statistiken zum Aktionsprotokoll geschrieben.
|
||||
Statistics were reset.=Statistiken wurden zurückgesetzt.
|
||||
Usage: @1=Verwendung: @1
|
||||
Format can be one of txt, csv, lua, json, json_pretty (structures may be subject to change).=Format kann entweder „txt“, „csv“, „lua“, „json“ oder „json_pretty“ sein (die Struktur kann sich in Zukunft ändern).
|
||||
(no description)=(keine Beschreibung)
|
||||
Can interact with things and modify the world=Kann mit Dingen interagieren und die Welt verändern
|
||||
Can speak in chat=Kann im Chat sprechen
|
||||
Can modify 'shout' and 'interact' privileges=Kann die „shout“- und „interact“-Privilegien anpassen
|
||||
Can modify privileges=Kann Privilegien anpassen
|
||||
Can teleport self=Kann sich selbst teleportieren
|
||||
Can teleport other players=Kann andere Spieler teleportieren
|
||||
Can set the time of day using /time=Kann die Tageszeit mit /time setzen
|
||||
Can do server maintenance stuff=Kann Serverwartungsdinge machen
|
||||
Can bypass node protection in the world=Kann den Schutz auf Blöcken in der Welt umgehen
|
||||
Can ban and unban players=Kann Spieler verbannen und entbannen
|
||||
Can kick players=Kann Spieler hinauswerfen
|
||||
Can use /give and /giveme=Kann /give und /giveme benutzen
|
||||
Can use /setpassword and /clearpassword=Kann /setpassword und /clearpassword benutzen
|
||||
Can use fly mode=Kann den Flugmodus benutzen
|
||||
Can use fast mode=Kann den Schnellmodus benutzen
|
||||
Can fly through solid nodes using noclip mode=Kann durch feste Blöcke mit dem Geistmodus fliegen
|
||||
Can use the rollback functionality=Kann die Rollback-Funktionalität benutzen
|
||||
Allows enabling various debug options that may affect gameplay=Erlaubt die Aktivierung diverser Debugoptionen, die das Spielgeschehen beeinflussen könnten
|
||||
Unknown Item=Unbekannter Gegenstand
|
||||
Air=Luft
|
||||
Ignore=Ignorieren
|
||||
You can't place 'ignore' nodes!=Sie können keine „ignore“-Blöcke platzieren!
|
@ -12,8 +12,6 @@ if(ENABLE_SYSTEM_GMP)
|
||||
else()
|
||||
message (STATUS "Detecting GMP from system failed.")
|
||||
endif()
|
||||
else()
|
||||
message (STATUS "Detecting GMP from system disabled! (ENABLE_SYSTEM_GMP=0)")
|
||||
endif()
|
||||
|
||||
if(NOT USE_SYSTEM_GMP)
|
||||
|
@ -1,26 +1,25 @@
|
||||
# Look for JSONCPP if asked to.
|
||||
# We use a bundled version by default because some distros ship versions of
|
||||
# JSONCPP that cause segfaults and other memory errors when we link with them.
|
||||
# See https://github.com/minetest/minetest/issues/1793
|
||||
# Look for JsonCpp, with fallback to bundeled version
|
||||
|
||||
mark_as_advanced(JSON_LIBRARY JSON_INCLUDE_DIR)
|
||||
option(ENABLE_SYSTEM_JSONCPP "Enable using a system-wide JSONCPP. May cause segfaults and other memory errors!" FALSE)
|
||||
option(ENABLE_SYSTEM_JSONCPP "Enable using a system-wide JsonCpp" TRUE)
|
||||
set(USE_SYSTEM_JSONCPP FALSE)
|
||||
|
||||
if(ENABLE_SYSTEM_JSONCPP)
|
||||
find_library(JSON_LIBRARY NAMES jsoncpp)
|
||||
find_path(JSON_INCLUDE_DIR json/allocator.h PATH_SUFFIXES jsoncpp)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Json DEFAULT_MSG JSON_LIBRARY JSON_INCLUDE_DIR)
|
||||
|
||||
if(JSON_FOUND)
|
||||
message(STATUS "Using system JSONCPP library.")
|
||||
if(JSON_LIBRARY AND JSON_INCLUDE_DIR)
|
||||
message(STATUS "Using JsonCpp provided by system.")
|
||||
set(USE_SYSTEM_JSONCPP TRUE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT JSON_FOUND)
|
||||
message(STATUS "Using bundled JSONCPP library.")
|
||||
if(NOT USE_SYSTEM_JSONCPP)
|
||||
message(STATUS "Using bundled JsonCpp library.")
|
||||
set(JSON_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/jsoncpp)
|
||||
set(JSON_LIBRARY jsoncpp)
|
||||
add_subdirectory(lib/jsoncpp)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(Json DEFAULT_MSG JSON_LIBRARY JSON_INCLUDE_DIR)
|
||||
|
@ -52,6 +52,31 @@ enum ClientEventType : u8
|
||||
CLIENTEVENT_MAX,
|
||||
};
|
||||
|
||||
struct ClientEventHudAdd
|
||||
{
|
||||
u32 server_id;
|
||||
u8 type;
|
||||
v2f pos, scale;
|
||||
std::string name;
|
||||
std::string text, text2;
|
||||
u32 number, item, dir;
|
||||
v2f align, offset;
|
||||
v3f world_pos;
|
||||
v2s32 size;
|
||||
s16 z_index;
|
||||
};
|
||||
|
||||
struct ClientEventHudChange
|
||||
{
|
||||
u32 id;
|
||||
HudElementStat stat;
|
||||
v2f v2fdata;
|
||||
std::string sdata;
|
||||
u32 data;
|
||||
v3f v3fdata;
|
||||
v2s32 v2s32data;
|
||||
};
|
||||
|
||||
struct ClientEvent
|
||||
{
|
||||
ClientEventType type;
|
||||
@ -93,38 +118,12 @@ struct ClientEvent
|
||||
{
|
||||
u32 id;
|
||||
} delete_particlespawner;
|
||||
struct
|
||||
{
|
||||
u32 server_id;
|
||||
u8 type;
|
||||
v2f *pos;
|
||||
std::string *name;
|
||||
v2f *scale;
|
||||
std::string *text;
|
||||
u32 number;
|
||||
u32 item;
|
||||
u32 dir;
|
||||
v2f *align;
|
||||
v2f *offset;
|
||||
v3f *world_pos;
|
||||
v2s32 *size;
|
||||
s16 z_index;
|
||||
std::string *text2;
|
||||
} hudadd;
|
||||
ClientEventHudAdd *hudadd;
|
||||
struct
|
||||
{
|
||||
u32 id;
|
||||
} hudrm;
|
||||
struct
|
||||
{
|
||||
u32 id;
|
||||
HudElementStat stat;
|
||||
v2f *v2fdata;
|
||||
std::string *sdata;
|
||||
u32 data;
|
||||
v3f *v3fdata;
|
||||
v2s32 *v2s32data;
|
||||
} hudchange;
|
||||
ClientEventHudChange *hudchange;
|
||||
SkyboxParams *set_sky;
|
||||
struct
|
||||
{
|
||||
|
@ -839,6 +839,9 @@ private:
|
||||
void pauseAnimation();
|
||||
void resumeAnimation();
|
||||
|
||||
void pauseAnimation();
|
||||
void resumeAnimation();
|
||||
|
||||
// ClientEvent handlers
|
||||
void handleClientEvent_None(ClientEvent *event, CameraOrientation *cam);
|
||||
void handleClientEvent_PlayerDamage(ClientEvent *event, CameraOrientation *cam);
|
||||
@ -2737,48 +2740,32 @@ void Game::handleClientEvent_HudAdd(ClientEvent *event, CameraOrientation *cam)
|
||||
{
|
||||
LocalPlayer *player = client->getEnv().getLocalPlayer();
|
||||
|
||||
u32 server_id = event->hudadd.server_id;
|
||||
u32 server_id = event->hudadd->server_id;
|
||||
// ignore if we already have a HUD with that ID
|
||||
auto i = m_hud_server_to_client.find(server_id);
|
||||
if (i != m_hud_server_to_client.end()) {
|
||||
delete event->hudadd.pos;
|
||||
delete event->hudadd.name;
|
||||
delete event->hudadd.scale;
|
||||
delete event->hudadd.text;
|
||||
delete event->hudadd.align;
|
||||
delete event->hudadd.offset;
|
||||
delete event->hudadd.world_pos;
|
||||
delete event->hudadd.size;
|
||||
delete event->hudadd.text2;
|
||||
delete event->hudadd;
|
||||
return;
|
||||
}
|
||||
|
||||
HudElement *e = new HudElement;
|
||||
e->type = (HudElementType)event->hudadd.type;
|
||||
e->pos = *event->hudadd.pos;
|
||||
e->name = *event->hudadd.name;
|
||||
e->scale = *event->hudadd.scale;
|
||||
e->text = *event->hudadd.text;
|
||||
e->number = event->hudadd.number;
|
||||
e->item = event->hudadd.item;
|
||||
e->dir = event->hudadd.dir;
|
||||
e->align = *event->hudadd.align;
|
||||
e->offset = *event->hudadd.offset;
|
||||
e->world_pos = *event->hudadd.world_pos;
|
||||
e->size = *event->hudadd.size;
|
||||
e->z_index = event->hudadd.z_index;
|
||||
e->text2 = *event->hudadd.text2;
|
||||
e->type = static_cast<HudElementType>(event->hudadd->type);
|
||||
e->pos = event->hudadd->pos;
|
||||
e->name = event->hudadd->name;
|
||||
e->scale = event->hudadd->scale;
|
||||
e->text = event->hudadd->text;
|
||||
e->number = event->hudadd->number;
|
||||
e->item = event->hudadd->item;
|
||||
e->dir = event->hudadd->dir;
|
||||
e->align = event->hudadd->align;
|
||||
e->offset = event->hudadd->offset;
|
||||
e->world_pos = event->hudadd->world_pos;
|
||||
e->size = event->hudadd->size;
|
||||
e->z_index = event->hudadd->z_index;
|
||||
e->text2 = event->hudadd->text2;
|
||||
m_hud_server_to_client[server_id] = player->addHud(e);
|
||||
|
||||
delete event->hudadd.pos;
|
||||
delete event->hudadd.name;
|
||||
delete event->hudadd.scale;
|
||||
delete event->hudadd.text;
|
||||
delete event->hudadd.align;
|
||||
delete event->hudadd.offset;
|
||||
delete event->hudadd.world_pos;
|
||||
delete event->hudadd.size;
|
||||
delete event->hudadd.text2;
|
||||
delete event->hudadd;
|
||||
}
|
||||
|
||||
void Game::handleClientEvent_HudRemove(ClientEvent *event, CameraOrientation *cam)
|
||||
@ -2800,77 +2787,52 @@ void Game::handleClientEvent_HudChange(ClientEvent *event, CameraOrientation *ca
|
||||
|
||||
HudElement *e = nullptr;
|
||||
|
||||
auto i = m_hud_server_to_client.find(event->hudchange.id);
|
||||
auto i = m_hud_server_to_client.find(event->hudchange->id);
|
||||
if (i != m_hud_server_to_client.end()) {
|
||||
e = player->getHud(i->second);
|
||||
}
|
||||
|
||||
if (e == nullptr) {
|
||||
delete event->hudchange.v3fdata;
|
||||
delete event->hudchange.v2fdata;
|
||||
delete event->hudchange.sdata;
|
||||
delete event->hudchange.v2s32data;
|
||||
delete event->hudchange;
|
||||
return;
|
||||
}
|
||||
|
||||
switch (event->hudchange.stat) {
|
||||
case HUD_STAT_POS:
|
||||
e->pos = *event->hudchange.v2fdata;
|
||||
break;
|
||||
#define CASE_SET(statval, prop, dataprop) \
|
||||
case statval: \
|
||||
e->prop = event->hudchange->dataprop; \
|
||||
break
|
||||
|
||||
case HUD_STAT_NAME:
|
||||
e->name = *event->hudchange.sdata;
|
||||
break;
|
||||
switch (event->hudchange->stat) {
|
||||
CASE_SET(HUD_STAT_POS, pos, v2fdata);
|
||||
|
||||
case HUD_STAT_SCALE:
|
||||
e->scale = *event->hudchange.v2fdata;
|
||||
break;
|
||||
CASE_SET(HUD_STAT_NAME, name, sdata);
|
||||
|
||||
case HUD_STAT_TEXT:
|
||||
e->text = *event->hudchange.sdata;
|
||||
break;
|
||||
CASE_SET(HUD_STAT_SCALE, scale, v2fdata);
|
||||
|
||||
case HUD_STAT_NUMBER:
|
||||
e->number = event->hudchange.data;
|
||||
break;
|
||||
CASE_SET(HUD_STAT_TEXT, text, sdata);
|
||||
|
||||
case HUD_STAT_ITEM:
|
||||
e->item = event->hudchange.data;
|
||||
break;
|
||||
CASE_SET(HUD_STAT_NUMBER, number, data);
|
||||
|
||||
case HUD_STAT_DIR:
|
||||
e->dir = event->hudchange.data;
|
||||
break;
|
||||
CASE_SET(HUD_STAT_ITEM, item, data);
|
||||
|
||||
case HUD_STAT_ALIGN:
|
||||
e->align = *event->hudchange.v2fdata;
|
||||
break;
|
||||
CASE_SET(HUD_STAT_DIR, dir, data);
|
||||
|
||||
case HUD_STAT_OFFSET:
|
||||
e->offset = *event->hudchange.v2fdata;
|
||||
break;
|
||||
CASE_SET(HUD_STAT_ALIGN, align, v2fdata);
|
||||
|
||||
case HUD_STAT_WORLD_POS:
|
||||
e->world_pos = *event->hudchange.v3fdata;
|
||||
break;
|
||||
CASE_SET(HUD_STAT_OFFSET, offset, v2fdata);
|
||||
|
||||
case HUD_STAT_SIZE:
|
||||
e->size = *event->hudchange.v2s32data;
|
||||
break;
|
||||
CASE_SET(HUD_STAT_WORLD_POS, world_pos, v3fdata);
|
||||
|
||||
case HUD_STAT_Z_INDEX:
|
||||
e->z_index = event->hudchange.data;
|
||||
break;
|
||||
CASE_SET(HUD_STAT_SIZE, size, v2s32data);
|
||||
|
||||
case HUD_STAT_TEXT2:
|
||||
e->text2 = *event->hudchange.sdata;
|
||||
break;
|
||||
CASE_SET(HUD_STAT_Z_INDEX, z_index, data);
|
||||
|
||||
CASE_SET(HUD_STAT_TEXT2, text2, sdata);
|
||||
}
|
||||
|
||||
delete event->hudchange.v3fdata;
|
||||
delete event->hudchange.v2fdata;
|
||||
delete event->hudchange.sdata;
|
||||
delete event->hudchange.v2s32data;
|
||||
#undef CASE_SET
|
||||
|
||||
delete event->hudchange;
|
||||
}
|
||||
|
||||
void Game::handleClientEvent_SetSky(ClientEvent *event, CameraOrientation *cam)
|
||||
@ -3431,7 +3393,8 @@ bool Game::nodePlacement(const ItemDefinition &selected_def,
|
||||
const ItemStack &selected_item, const v3s16 &nodepos, const v3s16 &neighbourpos,
|
||||
const PointedThing &pointed, const NodeMetadata *meta)
|
||||
{
|
||||
std::string prediction = selected_def.node_placement_prediction;
|
||||
const auto &prediction = selected_def.node_placement_prediction;
|
||||
|
||||
const NodeDefManager *nodedef = client->ndef();
|
||||
ClientMap &map = client->getEnv().getClientMap();
|
||||
MapNode node;
|
||||
@ -3501,8 +3464,7 @@ bool Game::nodePlacement(const ItemDefinition &selected_def,
|
||||
|
||||
if (!found) {
|
||||
errorstream << "Node placement prediction failed for "
|
||||
<< selected_def.name << " (places "
|
||||
<< prediction
|
||||
<< selected_def.name << " (places " << prediction
|
||||
<< ") - Name not known" << std::endl;
|
||||
// Handle this as if prediction was empty
|
||||
// Report to server
|
||||
@ -3513,9 +3475,14 @@ bool Game::nodePlacement(const ItemDefinition &selected_def,
|
||||
const ContentFeatures &predicted_f = nodedef->get(id);
|
||||
|
||||
// Predict param2 for facedir and wallmounted nodes
|
||||
// Compare core.item_place_node() for what the server does
|
||||
u8 param2 = 0;
|
||||
|
||||
if (predicted_f.param_type_2 == CPT2_WALLMOUNTED ||
|
||||
const u8 place_param2 = selected_def.place_param2;
|
||||
|
||||
if (place_param2) {
|
||||
param2 = place_param2;
|
||||
} else if (predicted_f.param_type_2 == CPT2_WALLMOUNTED ||
|
||||
predicted_f.param_type_2 == CPT2_COLORED_WALLMOUNTED) {
|
||||
v3s16 dir = nodepos - neighbourpos;
|
||||
|
||||
@ -3526,9 +3493,7 @@ bool Game::nodePlacement(const ItemDefinition &selected_def,
|
||||
} else {
|
||||
param2 = dir.Z < 0 ? 5 : 4;
|
||||
}
|
||||
}
|
||||
|
||||
if (predicted_f.param_type_2 == CPT2_FACEDIR ||
|
||||
} else if (predicted_f.param_type_2 == CPT2_FACEDIR ||
|
||||
predicted_f.param_type_2 == CPT2_COLORED_FACEDIR) {
|
||||
v3s16 dir = nodepos - floatToInt(client->getEnv().getLocalPlayer()->getPosition(), BS);
|
||||
|
||||
@ -3539,11 +3504,9 @@ bool Game::nodePlacement(const ItemDefinition &selected_def,
|
||||
}
|
||||
}
|
||||
|
||||
assert(param2 <= 5);
|
||||
|
||||
//Check attachment if node is in group attached_node
|
||||
if (((ItemGroupList) predicted_f.groups)["attached_node"] != 0) {
|
||||
static v3s16 wallmounted_dirs[8] = {
|
||||
// Check attachment if node is in group attached_node
|
||||
if (itemgroup_get(predicted_f.groups, "attached_node") != 0) {
|
||||
const static v3s16 wallmounted_dirs[8] = {
|
||||
v3s16(0, 1, 0),
|
||||
v3s16(0, -1, 0),
|
||||
v3s16(1, 0, 0),
|
||||
@ -3568,11 +3531,11 @@ bool Game::nodePlacement(const ItemDefinition &selected_def,
|
||||
}
|
||||
|
||||
// Apply color
|
||||
if ((predicted_f.param_type_2 == CPT2_COLOR
|
||||
if (!place_param2 && (predicted_f.param_type_2 == CPT2_COLOR
|
||||
|| predicted_f.param_type_2 == CPT2_COLORED_FACEDIR
|
||||
|| predicted_f.param_type_2 == CPT2_COLORED_WALLMOUNTED)) {
|
||||
const std::string &indexstr = selected_item.metadata.getString(
|
||||
"palette_index", 0);
|
||||
const auto &indexstr = selected_item.metadata.
|
||||
getString("palette_index", 0);
|
||||
if (!indexstr.empty()) {
|
||||
s32 index = mystoi(indexstr);
|
||||
if (predicted_f.param_type_2 == CPT2_COLOR) {
|
||||
@ -3612,11 +3575,10 @@ bool Game::nodePlacement(const ItemDefinition &selected_def,
|
||||
soundmaker->m_player_rightpunch_sound = selected_def.sound_place_failed;
|
||||
return false;
|
||||
}
|
||||
} catch (InvalidPositionException &e) {
|
||||
} catch (const InvalidPositionException &e) {
|
||||
errorstream << "Node placement prediction failed for "
|
||||
<< selected_def.name << " (places "
|
||||
<< prediction
|
||||
<< ") - Position not loaded" << std::endl;
|
||||
<< prediction << ") - Position not loaded" << std::endl;
|
||||
soundmaker->m_player_rightpunch_sound = selected_def.sound_place_failed;
|
||||
return false;
|
||||
}
|
||||
|
@ -291,7 +291,7 @@ void WieldMeshSceneNode::setExtruded(const std::string &imagename,
|
||||
}
|
||||
material.setFlag(video::EMF_ANISOTROPIC_FILTER, m_anisotropic_filter);
|
||||
// mipmaps cause "thin black line" artifacts
|
||||
#if (IRRLICHT_VERSION_MAJOR >= 1 && IRRLICHT_VERSION_MINOR >= 8) || IRRLICHT_VERSION_MAJOR >= 2
|
||||
#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR >= 8) || IRRLICHT_VERSION_MAJOR >= 2
|
||||
material.setFlag(video::EMF_USE_MIP_MAPS, false);
|
||||
#endif
|
||||
if (m_enable_shaders) {
|
||||
@ -300,23 +300,27 @@ void WieldMeshSceneNode::setExtruded(const std::string &imagename,
|
||||
}
|
||||
}
|
||||
|
||||
static scene::SMesh *createSpecialNodeMesh(Client *client, content_t id, std::vector<ItemPartColor> *colors, const ContentFeatures &f, std::string const shader_name = {})
|
||||
static scene::SMesh *createSpecialNodeMesh(Client *client, MapNode n,
|
||||
std::vector<ItemPartColor> *colors, const ContentFeatures &f,
|
||||
std::string const shader_name = {})
|
||||
{
|
||||
MeshMakeData mesh_make_data(client, false);
|
||||
MeshCollector collector;
|
||||
mesh_make_data.setSmoothLighting(false);
|
||||
MapblockMeshGenerator gen(&mesh_make_data, &collector);
|
||||
u8 param2 = 0;
|
||||
if (f.param_type_2 == CPT2_WALLMOUNTED ||
|
||||
|
||||
if (n.getParam2()) {
|
||||
// keep it
|
||||
} else if (f.param_type_2 == CPT2_WALLMOUNTED ||
|
||||
f.param_type_2 == CPT2_COLORED_WALLMOUNTED) {
|
||||
if (f.drawtype == NDT_TORCHLIKE)
|
||||
param2 = 1;
|
||||
n.setParam2(1);
|
||||
else if (f.drawtype == NDT_SIGNLIKE ||
|
||||
f.drawtype == NDT_NODEBOX ||
|
||||
f.drawtype == NDT_MESH)
|
||||
param2 = 4;
|
||||
n.setParam2(4);
|
||||
}
|
||||
gen.renderSingle(id, param2);
|
||||
gen.renderSingle(n.getContent(), n.getParam2());
|
||||
|
||||
IShaderSource *shader_source = shader_name.empty() ? nullptr : client->getShaderSource();
|
||||
colors->clear();
|
||||
@ -424,9 +428,12 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che
|
||||
m_meshnode->setScale(def.wield_scale * WIELD_SCALE_FACTOR);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
default: {
|
||||
// Render non-trivial drawtypes like the actual node
|
||||
mesh = createSpecialNodeMesh(client, id, &m_colors, f, "object_shader");
|
||||
MapNode n(id);
|
||||
n.setParam2(def.place_param2);
|
||||
|
||||
mesh = createSpecialNodeMesh(client, n, &m_colors, f, "object_shader");
|
||||
changeToMesh(mesh);
|
||||
mesh->drop();
|
||||
m_meshnode->setScale(
|
||||
@ -434,6 +441,7 @@ void WieldMeshSceneNode::setItem(const ItemStack &item, Client *client, bool che
|
||||
/ (BS * f.visual_scale));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
u32 material_count = m_meshnode->getMaterialCount();
|
||||
for (u32 i = 0; i < material_count; ++i) {
|
||||
@ -533,7 +541,7 @@ void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result)
|
||||
content_t id = ndef->getId(def.name);
|
||||
|
||||
FATAL_ERROR_IF(!g_extrusion_mesh_cache, "Extrusion mesh cache is not yet initialized");
|
||||
|
||||
|
||||
scene::SMesh *mesh = nullptr;
|
||||
|
||||
// Shading is on by default
|
||||
@ -594,12 +602,16 @@ void getItemMesh(Client *client, const ItemStack &item, ItemMesh *result)
|
||||
result->buffer_colors.emplace_back(l0.has_color, l0.color);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
default: {
|
||||
// Render non-trivial drawtypes like the actual node
|
||||
mesh = createSpecialNodeMesh(client, id, &result->buffer_colors, f);
|
||||
MapNode n(id);
|
||||
n.setParam2(def.place_param2);
|
||||
|
||||
mesh = createSpecialNodeMesh(client, n, &result->buffer_colors, f);
|
||||
scaleMesh(mesh, v3f(0.12, 0.12, 0.12));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
u32 mc = mesh->getMeshBufferCount();
|
||||
for (u32 i = 0; i < mc; ++i) {
|
||||
|
@ -71,13 +71,11 @@ ItemDefinition& ItemDefinition::operator=(const ItemDefinition &def)
|
||||
stack_max = def.stack_max;
|
||||
usable = def.usable;
|
||||
liquids_pointable = def.liquids_pointable;
|
||||
if(def.tool_capabilities)
|
||||
{
|
||||
tool_capabilities = new ToolCapabilities(
|
||||
*def.tool_capabilities);
|
||||
}
|
||||
if (def.tool_capabilities)
|
||||
tool_capabilities = new ToolCapabilities(*def.tool_capabilities);
|
||||
groups = def.groups;
|
||||
node_placement_prediction = def.node_placement_prediction;
|
||||
place_param2 = def.place_param2;
|
||||
sound_place = def.sound_place;
|
||||
sound_place_failed = def.sound_place_failed;
|
||||
range = def.range;
|
||||
@ -120,8 +118,8 @@ void ItemDefinition::reset()
|
||||
sound_place = SimpleSoundSpec();
|
||||
sound_place_failed = SimpleSoundSpec();
|
||||
range = -1;
|
||||
|
||||
node_placement_prediction = "";
|
||||
place_param2 = 0;
|
||||
}
|
||||
|
||||
void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const
|
||||
@ -183,6 +181,8 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const
|
||||
os << serializeString16(wield_overlay);
|
||||
|
||||
os << serializeString16(short_description);
|
||||
|
||||
os << place_param2;
|
||||
}
|
||||
|
||||
void ItemDefinition::deSerialize(std::istream &is)
|
||||
@ -255,6 +255,8 @@ void ItemDefinition::deSerialize(std::istream &is)
|
||||
inventory_overlay = deSerializeString16(is);
|
||||
wield_overlay = deSerializeString16(is);
|
||||
short_description = deSerializeString16(is);
|
||||
|
||||
place_param2 = readU8(is); // 0 if missing
|
||||
} catch(SerializationError &e) {};
|
||||
}
|
||||
|
||||
|
@ -86,6 +86,7 @@ struct ItemDefinition
|
||||
// Server will update the precise end result a moment later.
|
||||
// "" = no prediction
|
||||
std::string node_placement_prediction;
|
||||
u8 place_param2;
|
||||
|
||||
/*
|
||||
Some helpful methods
|
||||
|
@ -85,7 +85,7 @@ class OreScatter : public Ore {
|
||||
public:
|
||||
OreScatter() : Ore(false) {}
|
||||
|
||||
ObjDef *clone() const;
|
||||
ObjDef *clone() const override;
|
||||
|
||||
void generate(MMVManip *vm, int mapseed, u32 blockseed,
|
||||
v3s16 nmin, v3s16 nmax, biome_t *biomemap) override;
|
||||
@ -95,7 +95,7 @@ class OreSheet : public Ore {
|
||||
public:
|
||||
OreSheet() : Ore(true) {}
|
||||
|
||||
ObjDef *clone() const;
|
||||
ObjDef *clone() const override;
|
||||
|
||||
u16 column_height_min;
|
||||
u16 column_height_max;
|
||||
@ -107,7 +107,7 @@ public:
|
||||
|
||||
class OrePuff : public Ore {
|
||||
public:
|
||||
ObjDef *clone() const;
|
||||
ObjDef *clone() const override;
|
||||
|
||||
NoiseParams np_puff_top;
|
||||
NoiseParams np_puff_bottom;
|
||||
@ -123,7 +123,7 @@ public:
|
||||
|
||||
class OreBlob : public Ore {
|
||||
public:
|
||||
ObjDef *clone() const;
|
||||
ObjDef *clone() const override;
|
||||
|
||||
OreBlob() : Ore(true) {}
|
||||
void generate(MMVManip *vm, int mapseed, u32 blockseed,
|
||||
@ -132,7 +132,7 @@ public:
|
||||
|
||||
class OreVein : public Ore {
|
||||
public:
|
||||
ObjDef *clone() const;
|
||||
ObjDef *clone() const override;
|
||||
|
||||
float random_factor;
|
||||
Noise *noise2 = nullptr;
|
||||
@ -147,7 +147,7 @@ public:
|
||||
|
||||
class OreStratum : public Ore {
|
||||
public:
|
||||
ObjDef *clone() const;
|
||||
ObjDef *clone() const override;
|
||||
|
||||
NoiseParams np_stratum_thickness;
|
||||
Noise *noise_stratum_thickness = nullptr;
|
||||
|
@ -1096,9 +1096,6 @@ void Client::handleCommand_DeleteParticleSpawner(NetworkPacket* pkt)
|
||||
|
||||
void Client::handleCommand_HudAdd(NetworkPacket* pkt)
|
||||
{
|
||||
std::string datastring(pkt->getString(0), pkt->getSize());
|
||||
std::istringstream is(datastring, std::ios_base::binary);
|
||||
|
||||
u32 server_id;
|
||||
u8 type;
|
||||
v2f pos;
|
||||
@ -1125,22 +1122,23 @@ void Client::handleCommand_HudAdd(NetworkPacket* pkt)
|
||||
} catch(PacketError &e) {};
|
||||
|
||||
ClientEvent *event = new ClientEvent();
|
||||
event->type = CE_HUDADD;
|
||||
event->hudadd.server_id = server_id;
|
||||
event->hudadd.type = type;
|
||||
event->hudadd.pos = new v2f(pos);
|
||||
event->hudadd.name = new std::string(name);
|
||||
event->hudadd.scale = new v2f(scale);
|
||||
event->hudadd.text = new std::string(text);
|
||||
event->hudadd.number = number;
|
||||
event->hudadd.item = item;
|
||||
event->hudadd.dir = dir;
|
||||
event->hudadd.align = new v2f(align);
|
||||
event->hudadd.offset = new v2f(offset);
|
||||
event->hudadd.world_pos = new v3f(world_pos);
|
||||
event->hudadd.size = new v2s32(size);
|
||||
event->hudadd.z_index = z_index;
|
||||
event->hudadd.text2 = new std::string(text2);
|
||||
event->type = CE_HUDADD;
|
||||
event->hudadd = new ClientEventHudAdd();
|
||||
event->hudadd->server_id = server_id;
|
||||
event->hudadd->type = type;
|
||||
event->hudadd->pos = pos;
|
||||
event->hudadd->name = name;
|
||||
event->hudadd->scale = scale;
|
||||
event->hudadd->text = text;
|
||||
event->hudadd->number = number;
|
||||
event->hudadd->item = item;
|
||||
event->hudadd->dir = dir;
|
||||
event->hudadd->align = align;
|
||||
event->hudadd->offset = offset;
|
||||
event->hudadd->world_pos = world_pos;
|
||||
event->hudadd->size = size;
|
||||
event->hudadd->z_index = z_index;
|
||||
event->hudadd->text2 = text2;
|
||||
m_client_event_queue.push(event);
|
||||
}
|
||||
|
||||
@ -1181,14 +1179,15 @@ void Client::handleCommand_HudChange(NetworkPacket* pkt)
|
||||
*pkt >> intdata;
|
||||
|
||||
ClientEvent *event = new ClientEvent();
|
||||
event->type = CE_HUDCHANGE;
|
||||
event->hudchange.id = server_id;
|
||||
event->hudchange.stat = (HudElementStat)stat;
|
||||
event->hudchange.v2fdata = new v2f(v2fdata);
|
||||
event->hudchange.v3fdata = new v3f(v3fdata);
|
||||
event->hudchange.sdata = new std::string(sdata);
|
||||
event->hudchange.data = intdata;
|
||||
event->hudchange.v2s32data = new v2s32(v2s32data);
|
||||
event->type = CE_HUDCHANGE;
|
||||
event->hudchange = new ClientEventHudChange();
|
||||
event->hudchange->id = server_id;
|
||||
event->hudchange->stat = static_cast<HudElementStat>(stat);
|
||||
event->hudchange->v2fdata = v2fdata;
|
||||
event->hudchange->v3fdata = v3fdata;
|
||||
event->hudchange->sdata = sdata;
|
||||
event->hudchange->data = intdata;
|
||||
event->hudchange->v2s32data = v2s32data;
|
||||
m_client_event_queue.push(event);
|
||||
}
|
||||
|
||||
|
@ -119,6 +119,8 @@ void read_item_definition(lua_State* L, int index,
|
||||
// "" = no prediction
|
||||
getstringfield(L, index, "node_placement_prediction",
|
||||
def.node_placement_prediction);
|
||||
|
||||
getintfield(L, index, "place_param2", def.place_param2);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
@ -43,8 +43,7 @@ public:
|
||||
Inventory *createDetachedInventory(const std::string &name, IItemDefManager *idef,
|
||||
const std::string &player = "");
|
||||
bool removeDetachedInventory(const std::string &name);
|
||||
bool checkDetachedInventoryAccess(
|
||||
const InventoryLocation &loc, const std::string &player) const;
|
||||
bool checkDetachedInventoryAccess(const InventoryLocation &loc, const std::string &player) const;
|
||||
|
||||
void sendDetachedInventories(const std::string &peer_name, bool incremental,
|
||||
std::function<void(const std::string &, Inventory *)> apply_cb);
|
||||
|
@ -20,8 +20,10 @@ packagedir=$builddir/packages
|
||||
libdir=$builddir/libs
|
||||
|
||||
# Test which win32 compiler is present
|
||||
which i586-mingw32msvc-windres &>/dev/null && toolchain_file=$dir/toolchain_i586-mingw32msvc.cmake
|
||||
which i686-w64-mingw32-windres &>/dev/null && toolchain_file=$dir/toolchain_i646-w64-mingw32.cmake
|
||||
which i686-w64-mingw32-gcc &>/dev/null &&
|
||||
toolchain_file=$dir/toolchain_i686-w64-mingw32.cmake
|
||||
which i686-w64-mingw32-gcc-posix &>/dev/null &&
|
||||
toolchain_file=$dir/toolchain_i686-w64-mingw32-posix.cmake
|
||||
|
||||
if [ -z "$toolchain_file" ]; then
|
||||
echo "Unable to determine which mingw32 compiler to use"
|
||||
|
@ -2,12 +2,14 @@
|
||||
SET(CMAKE_SYSTEM_NAME Windows)
|
||||
|
||||
# which compilers to use for C and C++
|
||||
SET(CMAKE_C_COMPILER i586-mingw32msvc-gcc)
|
||||
SET(CMAKE_CXX_COMPILER i586-mingw32msvc-g++)
|
||||
SET(CMAKE_RC_COMPILER i586-mingw32msvc-windres)
|
||||
# *-posix is Ubuntu's naming for the MinGW variant that comes with support
|
||||
# for pthreads / std::thread (required by MT)
|
||||
SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc-posix)
|
||||
SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++-posix)
|
||||
SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres)
|
||||
|
||||
# here is the target environment located
|
||||
SET(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc)
|
||||
SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32)
|
||||
|
||||
# adjust the default behaviour of the FIND_XXX() commands:
|
||||
# search headers and libraries in the target environment, search
|
Loading…
x
Reference in New Issue
Block a user