Spieler zufällig auswählen

German
Post Reply
User avatar
Schrotthandy
New member
Posts: 6
Joined: Tue Feb 28, 2017 15:43
In-game: Schrotthandy

Spieler zufällig auswählen

by Schrotthandy » Post

Hallo!
Ich hätte eine Frage zur Modding Api von Minetest.
Und zwar müsste ich für ein Subgame eine Mod programmieren, dass zufällig ein Spieler ausgewählt wird, der dann einen bestimmten Text angezeigt bekommt. Ist das irgendwie möglich in Minetest oder wie könnte ich das Problem anders Lösen?

User avatar
Linuxdirk
Member
Posts: 3218
Joined: Wed Sep 17, 2014 11:21
In-game: Linuxdirk
Location: Germany
Contact:

Re: Spieler zufällig auswählen

by Linuxdirk » Post

Du musst alle Spieler in einem Table (z.B. all_players) haben, dann kannst du mit all_players[math.random(#all_players)] aus diesem Table einen zufälligen Spieler auswählen.

Soweit ich das auf die Schnelle sehen kann, gibt es kein minetest.get_all_players() oder so. Du könntest daher beim joinen das Player-Objekt in mit dem namen als ID einen Table packen (nicht vergessen, beim Verlassen den Eintrag anhand der ID wieder löschen)

User avatar
Schrotthandy
New member
Posts: 6
Joined: Tue Feb 28, 2017 15:43
In-game: Schrotthandy

Re: Spieler zufällig auswählen

by Schrotthandy » Post

@LinuxDirk Soll ich dann einfach ne globale Table erstellen und dann in der minetest.register_on_joinplayer Funktion minetest.get_player_by_name ausführen, und das Ergebnis als Tabellenspalte" abspeichern? Sorry, ich hab mich noch nicht so lange mit der Minetest Api beschäftigt und Lua beherrsche ich auch nicht im Schlaf :)

User avatar
Linuxdirk
Member
Posts: 3218
Joined: Wed Sep 17, 2014 11:21
In-game: Linuxdirk
Location: Germany
Contact:

Re: Spieler zufällig auswählen

by Linuxdirk » Post

Ich hab so was mal selbst in einer Mod benötigt.

Zum Einlesen:

Code: Select all

mymod_playertable = {}

minetest.register_on_joinplayer(function(player) -- wenn jemand joint
    minetest.after(1, function(player) -- kurz verzögern, wegen eventueller Lags
        local playerName = player:get_player_name()
        mymod_playertable[playerName] = {
            object = player,
            foo = 'bar'
            -- und so weiter
        }
    end, player)
end)
Dann hast du einen Table mit den ganzen Daten zu einem Spieler unter der ID die dem Namen des Spielers entspricht. Und daraus kannst du dann eben mit mymod_playertable[math.random(#mymod_playertable)] einen zufällige Eintrag auswählen, und bekommst die Daten als Table, die du beim eintragen angegeben hast.

Wenn du statt des weiteren Tables einfach nur mymod_playertable[playerName] = player machst, bekommst du als mymod_playertable[NAMEDESSPIELERS] das player-Objekt des angegebenen Spielers zurück (oder beiden fällen nil, wenn der Eintrag nicht existiert).

Zum Löschen:

Code: Select all

minetest.register_on_leaveplayer(function(player)
    local playerName = player:get_player_name()
    mymod_playertable[playerName] = nil
end)
Lässt sich aber sicher alles noch optimieren.

bell07
Member
Posts: 604
Joined: Sun Sep 04, 2016 15:15
GitHub: bell07

Re: Spieler zufällig auswählen

by bell07 » Post

Es muss keine extra-Player-Tabelle geführt werden, da Core bereits eine führt. Einen zufälligen Player würde ich wie folgt ermitteln:

Code: Select all

local playerlist = minetest.get_connected_players()
local randomplayer = playerlist[math.random(#playerlist)]

User avatar
Linuxdirk
Member
Posts: 3218
Joined: Wed Sep 17, 2014 11:21
In-game: Linuxdirk
Location: Germany
Contact:

Re: Spieler zufällig auswählen

by Linuxdirk » Post

Für diesen Fall reicht das definitiv aus, meine Mod macht noch viel mehr Mist damit, da reichts nicht. Aber gut zu wissen, dass das geht.

User avatar
Schrotthandy
New member
Posts: 6
Joined: Tue Feb 28, 2017 15:43
In-game: Schrotthandy

Re: Spieler zufällig auswählen

by Schrotthandy » Post

Okay Dankeschön :)
ich machs mit connected players :)

Post Reply

Who is online

Users browsing this forum: No registered users and 3 guests