Page 1 of 1

[modding]Introduire un délai entre deux appels de swap_node

PostPosted: Sun May 05, 2019 10:39
by Grossam
Bonjour,

j'ai posé la question sur la partie anglophone du serveur et sur l'IRC destiné au modding, mais je n'y ai pas trouvé d'aide.

Dans ce bout de code : https://pastebin.com/p33eVDNd le swap_node de la ligne 43 devrait se produire une seconde et demie après celui de la ligne 37. Mais non, la ligne 43 s'exécute de suite, et on n'a même pas le temps d'apercevoir l'autre node (en commentant la ligne 43, on voit que la ligne 37 s'éxécute bien).

D'où provient ce comportement étrange, et comment le contourner ? Il n'y a pas un sleep ou un wait en natif dans LUA ou dans l'API Minetest ?

Merci !

Re: [modding]Introduire un délai entre deux appels de swap_n

PostPosted: Sun May 05, 2019 11:08
by fwhcat
Salut Grossam,
peux-tu essayer avec os.time() et os.difftime() qui calcule directement l'écart en secondes?

Code: Select all
    -- wait 5 seconds before swapping the node again please !
    local t0 = os.time()
    while os.difftime(os.time(), t0) <= 5 do end
    minetest.swap_node(pos, {name = "scifi_nodes:palm_scanner_off", param2 = node.param2})


(On ne sait jamais).

Re: [modding]Introduire un délai entre deux appels de swap_n

PostPosted: Sun May 05, 2019 13:33
by Grossam
Aucun changement… ça doit être une histoire de threads dans l'implémentation du moteur ?

Re: [modding]Introduire un délai entre deux appels de swap_n

PostPosted: Mon May 06, 2019 16:47
by Gael de Sailly
Salut,

Un problème plus embêtant avec ce code c'est que même si ça marche, ça va occuper le serveur pendant 1.5s alors qu'il pourrait faire autre chose, et ça va créer du lag.

Grossam wrote:Il n'y a pas un sleep ou un wait en natif dans LUA ou dans l'API Minetest ?

Il y a minetest.after qui exécute une fonction avec un délai et sans monopoliser le serveur.

Le code ressemblerait à ça :
Code: Select all
    minetest.swap_node(pos, {name = "scifi_nodes:palm_scanner_checking", param2 = node.param2})
    minetest.sound_play("scifi_nodes_palm_scanner", {max_hear_distance = 8, pos = pos, gain = 1.0})

    -- wait a minute please !
    minetest.after(1.5, function()
        minetest.swap_node(pos, {name = "scifi_nodes:palm_scanner_off", param2 = node.param2})
        -- etc.
    end)

Re: [modding]Introduire un délai entre deux appels de swap_n

PostPosted: Mon May 06, 2019 17:39
by Grossam
Oui, on m'a a parlé sur le forum anglais. J'ai refait avec et ça marche au poil.

Sinon il y a un truc plus propre avec les timers (je vais peut-être refaire mon implémentation du coup) :

fonction toggle_scanner : scanner_off → scanner_checking → scanner_on → scanner_off…

Avec à chaque transition l'initialisation d'un timer et le on_timer qui va bien dans le register_node concerné.

Si tu es curieux, le dépot est là : https://git.fwhost.eu/Grossam/scifi_nodes