Page 1 of 1

HUD get connected players länge

PostPosted: Sat Dec 01, 2018 20:15
by niwla23
Hallo,
ich bin gerade dabei einen Kasten zu schreiben (in Lua), der Infos über den Server anzeigt. Ich möchte gerne anzeigen wie viele Spieler online sind. dazu habe ich local b = minetest.get_connected_players oben eingefügt und weiter unten in der HUD definition text = #b, geschrieben um die Länge der Liste und damit die Anzahl der Spieler zu bekommen.
Hier der Code:
Code: Select all
local players_hud_id = {}
local b = minetest.get_connected_players


minetest.register_on_joinplayer(function(player)

   local player_name = player:get_player_name()

   players_hud_id[player_name] = player:hud_add({
     hud_elem_type = "image",
     position  = {x = 0.97, y = 0.5},
     offset    = {x = -220, y = 0},
     text      = "anzeige.png",
     scale     = { x = 1, y = 1},
     alignment = { x = 1, y = 0 },
   })

   players_hud_id[player_name] = player:hud_add({
     hud_elem_type = "text",
     position  = {x = 0.97, y = 0.35},
     offset    = {x = -220, y = 0},
     text      = "MT Citybuild",
     scale     = { x = 100, y = 100},
     alignment = { x = 3, y = 3 },
     number    = 0xFFFFFF,
   })

   players_hud_id[player_name] = player:hud_add({
     hud_elem_type = "text",
     position  = {x = 0.97, y = 0.4},
     offset    = {x = -220, y = 0},
     text      = #b,
     scale     = { x = 100, y = 100},
     alignment = { x = 1, y = 1 },
     number    = 0xFFFFFF,
   })
end)

Aber das will nicht funktionieren:
minetestausgabe.PNG
(39.53 KiB) Not downloaded yet

Ich verstehe das nicht, ist es doch keine Liste? Ich hoffe jemand weiß, was das Problem ist.

Re: HUD get connected players länge

PostPosted: Sun Dec 02, 2018 15:02
by Krock
Du verweist mit "b" zur Funktion "minetest.get_connected_players". Um die Rückgabewerte der Funktion zu erhalten (Spielerliste), musst du folglich die Funktion aufrufen.
Code: Select all
-- Entweder so:
     text      = #b(),
-- Oder mit dem ursprünglichen Funktionsnamen direkt:
     text      = #minetest.get_connected_players(),


PS: Versuch' nicht, "minetest.get_connected_players()" im Hauptcode aufzurufen -> Verweis zu Erklärung viewtopic.php?p=336701#p336701

Re: HUD get connected players länge

PostPosted: Sun Dec 02, 2018 16:38
by niwla23
Danke!
Ich kriege das mit dem automatischem Update aber nicht hin. Im Minetest Modding book steht da dieser Befehl. Aber ich weiß nicht was bei places,text und places_text ersetzt ewerden muss.(Was ist die ID?)
Code: Select all
local players_hud_id = {}
local b = minetest.get_connected_players


minetest.register_on_joinplayer(function(player)

   local player_name = player:get_player_name()

   players_hud_id[player_name] = player:hud_add({
     hud_elem_type = "image",
     position  = {x = 0.97, y = 0.5},
     offset    = {x = -220, y = 0},
     text      = "anzeige.png",
     scale     = { x = 1, y = 1},
     alignment = { x = 1, y = 0 },
   })

   players_hud_id[player_name] = player:hud_add({
     hud_elem_type = "text",
     position  = {x = 0.97, y = 0.35},
     offset    = {x = -220, y = 0},
     text      = "MT Citybuild",
     scale     = { x = 100, y = 100},
     alignment = { x = 3, y = 3 },
     number    = 0xFFFFFF,
   })

   players_hud_id[player_name] = player:hud_add({
     hud_elem_type = "text",
     position  = {x = 0.97, y = 0.4},
     offset    = {x = -220, y = 0},
     text      = #b(),
     scale     = { x = 100, y = 100},
     alignment = { x = 1, y = 1 },
     number    = 0xFFFFFF,
   })


   minetest.register_on_joinplayer(
   player:hud_change(ids["places"], "text", places_text)
 )

 
end)

Re: HUD get connected players länge

PostPosted: Mon Dec 10, 2018 18:12
by niwla23
Also hier jetzt nochmal eine neue Version die immer noch nicht funktioniert:
Code: Select all
local players_hud_id = {}
local b = minetest.get_connected_players


minetest.register_on_joinplayer(function(player)

   local player_name = player:get_player_name()

   players_hud_id[player_name] = player:hud_add({
     hud_elem_type = "image",
     position  = {x = 0.97, y = 0.5},
     offset    = {x = -220, y = 0},
     text      = "anzeige.png",
     scale     = { x = 1, y = 1},
     alignment = { x = 1, y = 0 },
   })

   players_hud_id[player_name] = player:hud_add({
     hud_elem_type = "text",
     position  = {x = 0.97, y = 0.35},
     offset    = {x = -220, y = 0},
     text      = "MT Citybuild",
     scale     = { x = 100, y = 100},
     alignment = { x = 3, y = 3 },
     number    = 0xFFFFFF,
   })

   local online = player:hud_add({
     hud_elem_type = "text",
     position  = {x = 0.97, y = 0.4},
     offset    = {x = -220, y = 0},
     text      = #b(),
     scale     = { x = 100, y = 100},
     alignment = { x = 1, y = 1 },
     number    = 0xFFFFFF,
   })


   minetest.register_on_joinplayer(
   player:hud_change(online, "text", #b())

)
end)

Hier die Fehlermeldung:
minetestfehlerhudboolean.PNG
(27.47 KiB) Not downloaded yet

PS: Die fehlermeldung taucht erst auf wenn ein Client joint.
Ich hoffe jemand versteht den fehler.

Re: HUD get connected players länge

PostPosted: Mon Dec 10, 2018 19:11
by Krock
Protip: In deiner `debug.txt` Datei (ganz unten) werden die Fehler detailliert aufgezeichnet. Es wird dir in der Zukunft sehr helfen, das eigentliche Problem zu finden.

Fehler in Zeile 39-42.
1) Du versuchst ein Callback in einem Callback zu registrieren. NOT LIKE THIS. Einfach "minetest.register_on_joinplayer(" und die dazugehörige Klammer unterhalb entfernen
2) Zeile 39: "minetest.register_on_joinplayer" erwartet eine Funktion als erstes Argument. Vergleich' es mal mit Zeile 5 bzw. 43.

Ich glaube, du wolltest stattdessen "minetest.after" verwenden, um das HUD nach einigen Sekunden aktualisieren zu lassen.

Re: HUD get connected players länge

PostPosted: Tue Dec 11, 2018 15:38
by niwla23
Danke, auf minetest.after war ich nicht gekommen, aber ist irgendwie logisch sonst wird es ja nur bei einem Spieler angezeigt.
Ich habe den Code nun nochmal geändert:
Code: Select all

local players_hud_id = {}
local b = minetest.get_connected_players


minetest.register_on_joinplayer(function(player)

  player_name = player:get_player_name()

   players_hud_id[player_name] = player:hud_add({
     hud_elem_type = "image",
     position  = {x = 0.97, y = 0.5},
     offset    = {x = -220, y = 0},
     text      = "anzeige.png",
     scale     = { x = 1, y = 1},
     alignment = { x = 1, y = 0 },
   })

   players_hud_id[player_name] = player:hud_add({
     hud_elem_type = "text",
     position  = {x = 0.97, y = 0.35},
     offset    = {x = -220, y = 0},
     text      = "MT Citybuild",
     scale     = { x = 100, y = 100},
     alignment = { x = 3, y = 3 },
     number    = 0xFFFFFF,
   })

   local online = player:hud_add({
     hud_elem_type = "text",
     position  = {x = 0.97, y = 0.4},
     offset    = {x = -220, y = 0},
     text      = #b(),
     scale     = { x = 100, y = 100},
     alignment = { x = 1, y = 1 },
     number    = 0xFFFFFF,
   })
end)


local player = player_name
minetest.after(10, function(player)

    player:hud_change(online, "text", #b())
end)


So kommt aber diese Meldung:
.__ __ __
_____ |__| ____ _____/ |_ ____ _______/ |_
/ \| |/ \_/ __ \ __\/ __ \ / ___/\ __\
| Y Y \ | | \ ___/| | \ ___/ \___ \ | |
|__|_| /__|___| /\___ >__| \___ >____ > |__|
\/ \/ \/ \/ \/
2018-12-11 16:34:24: ACTION[Main]: World at [C:\Program Files\Minetest\minetest-0.4.17.1-win64\bin\..\worlds\virusbanwelt]
2018-12-11 16:34:24: ACTION[Main]: Server for gameid="minetest" listening on 0.0.0.0:30000.
2018-12-11 16:34:27: ACTION[Server]: Niwla [127.0.0.1] joins game.
2018-12-11 16:34:27: ACTION[Server]: Niwla joins game. List of players: Niwla
2018-12-11 16:34:27: WARNING[Server]: Assignment to undeclared global "player_name" inside a function at ...inetest\minetest-0.4.17.1-win64\bin\..\mods\hud\init.lua:8.
2018-12-11 16:34:33: ACTION[Server]: Niwla places node default:cobble at (41,9,-103)
2018-12-11 16:34:33: ACTION[Server]: Niwla places node default:cobble at (50,9,-114)
2018-12-11 16:34:34: ERROR[Main]: ServerError: AsyncErr: environment_Step: Runtime error from mod 'hud' in callback environment_Step(): ...inetest\minetest-0.4.17.1-win64\bin\..\mods\hud\init.lua:44: attempt to index local 'player' (a nil value)
2018-12-11 16:34:34: ERROR[Main]: stack traceback:
2018-12-11 16:34:34: ERROR[Main]: ...inetest\minetest-0.4.17.1-win64\bin\..\mods\hud\init.lua:44: in function 'func'
2018-12-11 16:34:34: ERROR[Main]: ...\minetest-0.4.17.1-win64\bin\..\builtin\common\after.lua:18: in function <...\minetest-0.4.17.1-win64\bin\..\builtin\common\after.lua:4>
2018-12-11 16:34:34: ERROR[Main]: ...minetest-0.4.17.1-win64\bin\..\builtin\game\register.lua:420: in function <...minetest-0.4.17.1-win64\bin\..\builtin\game\register.lua:400>
2018-12-11 16:34:34: ERROR[Main]: stack traceback:
2018-12-11 16:34:34: ACTION[Server]: Niwla leaves game. List of players: