[MOD WIP] Problème : Mod sans effets
-
- New member
- Posts: 7
- Joined: Wed May 31, 2023 13:25
- GitHub: Kaizokumi
- In-game: Mr_Diamond
[MOD WIP] Problème : Mod sans effets
Bonjour,
Je souhaite réaliser un mod, permettant d'allumer basiquement des lightstones de quatre couleurs avec une fonction mathématique pour choisir aléatoirement une lightstone à allumer mais rien ne s'allume à l'activation du levier. Je soupçonnais une erreur dans le code mais le jeu m'aurais sans doute signalé directement une erreur dans le init.lua lors de l'exécution du monde mais celui-ci s'est démarré correctement. Mon dossier de mod est normalement complet avec la présence d'un init.lua et d'un mod.conf permettant d'indiquer la dépendance avec le mod "mesecons", je n'avais besoin de rien d'autres pour faire fonctionner mon mod. Je vous poste le code LUA associé.
lamp_red_is_on = 0
lamp_green_is_on = 0
lamp_yellow_is_on = 0
lamp_blue_is_on = 0
lamp_activation = 0
lamp_state = {0, 0, 0, 0}
local lamp_pos_red = {x=-25, y=15.5, z=62}
local lamp_pos_green = {x=-25, y=15.5, z=63}
local lamp_pos_yellow = {x=-25, y=15.5, z=64}
local lamp_pos_blue = {x=-25, y=15.5, z=65}
switch_pos = {x=-24, y=15.5, z=67}
switch_is_on = minetest.find_node_near(switch_pos, 1, "mesecons_walllever:wall_lever_on")
switch_is_on = 1
if switch_is_on == 1 then
lamp_activation = math.random(1,4)
if lamp_activation == 1 then
lamp_state[1] = 1
minetest.set_node({x=-25, y=15.5, z=62}, {name="mesecons_lightstone:lightstone_red_on"})
minetest.after(3, function()
minetest.set_node({x=-25, y=15.5, z=62}, {name="mesecons_lightstone:lightstone_red_off"})
end)
else
lamp_state[1] = 0
end
if lamp_activation == 2 then
lamp_state[2] = 1
minetest.set_node({x=-25, y=15.5, z=63}, {name="mesecons_lightstone:lightstone_green_on"})
minetest.after(3, function()
minetest.set_node({x=-25, y=15.5, z=63}, {name="mesecons_lightstone:lightstone_green_off"})
end)
else
lamp_state[2] = 0
end
if lamp_activation == 3 then
lamp_state[3] = 1
minetest.set_node({x=-25, y=15.5, z=64}, {name="mesecons_lightstone:lightstone_yellow_on"})
minetest.after(3, function()
minetest.set_node({x=-25, y=15.5, z=64}, {name="mesecons_lightstone:lightstone_yellow_off"})
end)
else
lamp_state[3] = 0
end
if lamp_activation == 4 then
lamp_state[4] = 1
minetest.set_node({x=-25, y=15.5, z=65}, {name="mesecons_lightstone:lightstone_blue_on"})
minetest.after(3, function()
minetest.set_node({x=-25, y=15.5, z=65}, {name="mesecons_lightstone:lightstone_blue_off"})
end)
else
lamp_state[4] = 0
end
else
minetest.set_node({x=-25, y=15.5, z=62}, {name="mesecons_lightstone:lightstone_red_off"})
minetest.set_node({x=-25, y=15.5, z=63}, {name="mesecons_lightstone:lightstone_green_off"})
minetest.set_node({x=-25, y=15.5, z=64}, {name="mesecons_lightstone:lightstone_yellow_off"})
minetest.set_node({x=-25, y=15.5, z=65}, {name="mesecons_lightstone:lightstone_blue_off"})
lamp_activation = 0
end
Il est probable que mon code a pu être un peu plus simple mais je vous poste ce que j'ai réalisé pour l'instant, en insistant que le concept est ultra simple. N'hésitez pas à me poser des questions sur mon problème, si besoin.
Merci d'avance pour votre aide.
Je souhaite réaliser un mod, permettant d'allumer basiquement des lightstones de quatre couleurs avec une fonction mathématique pour choisir aléatoirement une lightstone à allumer mais rien ne s'allume à l'activation du levier. Je soupçonnais une erreur dans le code mais le jeu m'aurais sans doute signalé directement une erreur dans le init.lua lors de l'exécution du monde mais celui-ci s'est démarré correctement. Mon dossier de mod est normalement complet avec la présence d'un init.lua et d'un mod.conf permettant d'indiquer la dépendance avec le mod "mesecons", je n'avais besoin de rien d'autres pour faire fonctionner mon mod. Je vous poste le code LUA associé.
lamp_red_is_on = 0
lamp_green_is_on = 0
lamp_yellow_is_on = 0
lamp_blue_is_on = 0
lamp_activation = 0
lamp_state = {0, 0, 0, 0}
local lamp_pos_red = {x=-25, y=15.5, z=62}
local lamp_pos_green = {x=-25, y=15.5, z=63}
local lamp_pos_yellow = {x=-25, y=15.5, z=64}
local lamp_pos_blue = {x=-25, y=15.5, z=65}
switch_pos = {x=-24, y=15.5, z=67}
switch_is_on = minetest.find_node_near(switch_pos, 1, "mesecons_walllever:wall_lever_on")
switch_is_on = 1
if switch_is_on == 1 then
lamp_activation = math.random(1,4)
if lamp_activation == 1 then
lamp_state[1] = 1
minetest.set_node({x=-25, y=15.5, z=62}, {name="mesecons_lightstone:lightstone_red_on"})
minetest.after(3, function()
minetest.set_node({x=-25, y=15.5, z=62}, {name="mesecons_lightstone:lightstone_red_off"})
end)
else
lamp_state[1] = 0
end
if lamp_activation == 2 then
lamp_state[2] = 1
minetest.set_node({x=-25, y=15.5, z=63}, {name="mesecons_lightstone:lightstone_green_on"})
minetest.after(3, function()
minetest.set_node({x=-25, y=15.5, z=63}, {name="mesecons_lightstone:lightstone_green_off"})
end)
else
lamp_state[2] = 0
end
if lamp_activation == 3 then
lamp_state[3] = 1
minetest.set_node({x=-25, y=15.5, z=64}, {name="mesecons_lightstone:lightstone_yellow_on"})
minetest.after(3, function()
minetest.set_node({x=-25, y=15.5, z=64}, {name="mesecons_lightstone:lightstone_yellow_off"})
end)
else
lamp_state[3] = 0
end
if lamp_activation == 4 then
lamp_state[4] = 1
minetest.set_node({x=-25, y=15.5, z=65}, {name="mesecons_lightstone:lightstone_blue_on"})
minetest.after(3, function()
minetest.set_node({x=-25, y=15.5, z=65}, {name="mesecons_lightstone:lightstone_blue_off"})
end)
else
lamp_state[4] = 0
end
else
minetest.set_node({x=-25, y=15.5, z=62}, {name="mesecons_lightstone:lightstone_red_off"})
minetest.set_node({x=-25, y=15.5, z=63}, {name="mesecons_lightstone:lightstone_green_off"})
minetest.set_node({x=-25, y=15.5, z=64}, {name="mesecons_lightstone:lightstone_yellow_off"})
minetest.set_node({x=-25, y=15.5, z=65}, {name="mesecons_lightstone:lightstone_blue_off"})
lamp_activation = 0
end
Il est probable que mon code a pu être un peu plus simple mais je vous poste ce que j'ai réalisé pour l'instant, en insistant que le concept est ultra simple. N'hésitez pas à me poser des questions sur mon problème, si besoin.
Merci d'avance pour votre aide.
Re: [MOD WIP] Problème : Mod sans effets
Ce code ressemble à quelque chose qui pourrait être dans un "Lua controller" ou similaire que l'on trouve parfois dans les mods orientés automatisation. Dans ce cas, en général, un évènement déclenche l'exécution du code (c'est géré par le mod principal).
Mais ici, je ne vois aucune partie du code dans une fonction, ce qui est très suspect car ce code ne sera au mieux exécuté qu'une seule fois, au chargement, s'il est bien dans init.lua.
Je vais supposer quand même que ce code fait partie d'une fonction - typiquement une fonction enregistrée par minetest.on_punch() sur le levier, ce qui est assez classique.
Il y a des choses qui ne paraissent pas très cohérentes dans ce code, comme par exemple le fait de faire switch_is_on=minetest.find_node_near(...) et tout de suite après, de faire switch_is_on=1. La première ligne n'a servi à rien, puisque la valeur obtenue est aussitôt écrasée. De plus, find_node_near() retourne une coordonnée, mais d'après le nom et l'utilisation que tu en fais, tu veux plutôt un booléen (vrai/faux).
Je pense que cette ligne switch_is_on a été mise là pour déboguer, mais le test qui porte sur cette variable qui vient après ne teste pas ce que tu souhaites eut égard à find_node_near(). Il faut plutôt faire "if switch_is_on then ..." car find_node_near() retourne "nil" s'il ne trouve rien, et "nil" en Lua est équivalent à "false" (toutes autres valeurs sont équivalentes à "true").
Remarque marginale, je ne comprends pas le rôle de lamp_activation=0 vers la fin. Quelle était l'intention ici ? De même, je ne comprends pas le rôle du tableau lamp_state ; on affecte des valeurs dedans, mais on ne fait rien avec ?
Autre petite remarque, les coordonnées non-entières n'ont pas trop de sens pour les blocs; le centre du cube est la coordonnée du bloc et les composantes sont toutes entières. Si tu as vu ces 15.5 dans le jeu, c'est probablement parce que vues du point de vue du personnage-joueur; les entités comme celles-là ont des coordonnées non-entières (heureusement), mais si tu es debout sur un cube, tu es +0.5 au-dessus du centre du cube (la coordonnée du joueur n'est pas au centre du pavé qu'il forme, mais à ces pieds, pour des raisons pratiques).
J'ai peut-être mal compris des choses, l'absence d'indentation rend le code un peu difficile à suivre.
Mais ici, je ne vois aucune partie du code dans une fonction, ce qui est très suspect car ce code ne sera au mieux exécuté qu'une seule fois, au chargement, s'il est bien dans init.lua.
Je vais supposer quand même que ce code fait partie d'une fonction - typiquement une fonction enregistrée par minetest.on_punch() sur le levier, ce qui est assez classique.
Il y a des choses qui ne paraissent pas très cohérentes dans ce code, comme par exemple le fait de faire switch_is_on=minetest.find_node_near(...) et tout de suite après, de faire switch_is_on=1. La première ligne n'a servi à rien, puisque la valeur obtenue est aussitôt écrasée. De plus, find_node_near() retourne une coordonnée, mais d'après le nom et l'utilisation que tu en fais, tu veux plutôt un booléen (vrai/faux).
Je pense que cette ligne switch_is_on a été mise là pour déboguer, mais le test qui porte sur cette variable qui vient après ne teste pas ce que tu souhaites eut égard à find_node_near(). Il faut plutôt faire "if switch_is_on then ..." car find_node_near() retourne "nil" s'il ne trouve rien, et "nil" en Lua est équivalent à "false" (toutes autres valeurs sont équivalentes à "true").
Remarque marginale, je ne comprends pas le rôle de lamp_activation=0 vers la fin. Quelle était l'intention ici ? De même, je ne comprends pas le rôle du tableau lamp_state ; on affecte des valeurs dedans, mais on ne fait rien avec ?
Autre petite remarque, les coordonnées non-entières n'ont pas trop de sens pour les blocs; le centre du cube est la coordonnée du bloc et les composantes sont toutes entières. Si tu as vu ces 15.5 dans le jeu, c'est probablement parce que vues du point de vue du personnage-joueur; les entités comme celles-là ont des coordonnées non-entières (heureusement), mais si tu es debout sur un cube, tu es +0.5 au-dessus du centre du cube (la coordonnée du joueur n'est pas au centre du pavé qu'il forme, mais à ces pieds, pour des raisons pratiques).
J'ai peut-être mal compris des choses, l'absence d'indentation rend le code un peu difficile à suivre.
My game? It's Minefall.
-
- New member
- Posts: 7
- Joined: Wed May 31, 2023 13:25
- GitHub: Kaizokumi
- In-game: Mr_Diamond
Re: [MOD WIP] Problème : Mod sans effets
Bonjour,
Alors, si tu es en train de me dire qu'il s'agit d'un code qui devrait être inclus dans un LUA Controller, c'est justement ce qu'il doit me manquer précisément pour activer le programme sur le jeu, tu m'as déjà aidé sur quelque chose d'essentiel. x)
Lorsque tu m'as parlé de l'histoire de la fonction, il devrait probablement manquer la déclaration d'une fonction quelque part même s'il me semble que créer une fonction n'est pas très utile, en raison du programme très court que je présente qui consiste tout simplement à exécuter des lignes de conditions mais il manque sûrement des éléments primordiaux, et c'est justement cela que je voudrais éclairer dans ce sujet. D'ailleurs, je te confirme que ce programme est bel et bien dans le fichier "init.lua".
Concernant la variable "switch_is_on=minetest.find_node_near", je souhaitais déclarer la position du switch (levier) pour ensuite déclarer en effet une variable booléen qui consiste à définir si le switch est allumé ou éteint. En d'autres termes, je souhaitais réaliser une identification de l'état du levier pour ensuite le "convertir" dans une variable booléenne.
Pour lamp_activation=0, je souhaitais tout simplement "forcer" le module à s'éteindre après que les lumière soit éteintes.
Quant au tableau lamp_state, ça me sert à convertir les quatre lampes de différentes couleurs en tableau, avec la position ordonnée des quatre lampes et au moment des conditions, la tableau pouvait aider à les localiser pour les activer chacun.
Et enfin concernant les coordonnées, j'ai longtemps essayé de chercher comment marchent la position des blocs en jeu mais tu m'as confirmé (et je te remercie) que la position du bloc s'identifie en son centre, donc ce n'est pas 15.5 mais plutôt 15 c'est cela ?
Alors, si tu es en train de me dire qu'il s'agit d'un code qui devrait être inclus dans un LUA Controller, c'est justement ce qu'il doit me manquer précisément pour activer le programme sur le jeu, tu m'as déjà aidé sur quelque chose d'essentiel. x)
Lorsque tu m'as parlé de l'histoire de la fonction, il devrait probablement manquer la déclaration d'une fonction quelque part même s'il me semble que créer une fonction n'est pas très utile, en raison du programme très court que je présente qui consiste tout simplement à exécuter des lignes de conditions mais il manque sûrement des éléments primordiaux, et c'est justement cela que je voudrais éclairer dans ce sujet. D'ailleurs, je te confirme que ce programme est bel et bien dans le fichier "init.lua".
Concernant la variable "switch_is_on=minetest.find_node_near", je souhaitais déclarer la position du switch (levier) pour ensuite déclarer en effet une variable booléen qui consiste à définir si le switch est allumé ou éteint. En d'autres termes, je souhaitais réaliser une identification de l'état du levier pour ensuite le "convertir" dans une variable booléenne.
Pour lamp_activation=0, je souhaitais tout simplement "forcer" le module à s'éteindre après que les lumière soit éteintes.
Quant au tableau lamp_state, ça me sert à convertir les quatre lampes de différentes couleurs en tableau, avec la position ordonnée des quatre lampes et au moment des conditions, la tableau pouvait aider à les localiser pour les activer chacun.
Et enfin concernant les coordonnées, j'ai longtemps essayé de chercher comment marchent la position des blocs en jeu mais tu m'as confirmé (et je te remercie) que la position du bloc s'identifie en son centre, donc ce n'est pas 15.5 mais plutôt 15 c'est cela ?
Re: [MOD WIP] Problème : Mod sans effets
Je ne pense pas, vu que ça contredit clairement ton titre car un Lua Controller est un élément dans un mod - ou alors il y a un malentendu sur la terminologie. Mais la question de l'activation est celle que je posais. Tel quel, ton mod est "activé" une fois à l'initialisation du jeu puis plus jamais.Mr_Diamond wrote: ↑Tue Jan 02, 2024 15:46Bonjour,
Alors, si tu es en train de me dire qu'il s'agit d'un code qui devrait être inclus dans un LUA Controller, c'est justement ce qu'il doit me manquer précisément pour activer le programme sur le jeu, tu m'as déjà aidé sur quelque chose d'essentiel. x)
Ce qu'il fait est d'ailleurs probablement invalide car cette phase d'initialisation est un peu particulière; pour quelques fonctions, il est dit explicitement dans la doc qu'elles ne marcheront pas à ce moment, mais ce doit être vrai pour beaucoup plus. Notamment le placement de blocs qui me paraît très litigieux à ce moment, et il est possible que le moteur Minetest ignore complètement ces instructions (quoiqu'on pourrait s'attendre à ce qu'il s'arrête sur erreur purement et simplement - à ce propos, as-tu regardé dans les logs s'il ne t'insultait pas par hasard?).
Si tu veux vraiment cela, je pense qu'il faudrait essayer de différer l'exécution avec minetest.after()
L'explication est confuse. La déclaration de la position est dans la variable switch_pos, pour être précis.Concernant la variable "switch_is_on=minetest.find_node_near", je souhaitais déclarer la position du switch (levier) pour ensuite déclarer en effet une variable booléen qui consiste à définir si le switch est allumé ou éteint. En d'autres termes, je souhaitais réaliser une identification de l'état du levier pour ensuite le "convertir" dans une variable booléenne.
find_node_near détecte la présence dans ce voisinage d'un well_lever_on - qui fait office ici d'interrupteur allumé.
Mais sur la ligne suivante tu décides autoritairement qu'il est là (d'une manière un peu étrange d'ailleurs, Lua sait ce que "true" et "false" veulent dire (*)), et le "if" suivant sera toujours vrai.
D'ailleurs fait important à propos de find_node_near(), il faut ajouter un "true" en dernier paramètre sinon il regarde partout sauf à la position indiquée...
Oui, les coordonnées des blocs sont toujours entières, et correspondent au centre du cube. Mais probablement que l'API est tolérante et arrondit d'elle-même de toutes façons. Tu pourrais le constater par toi-même si tu affichais une position de bloc retournée par l'API, comme par exemple switch_is_on juste après le find_node_near()Et enfin concernant les coordonnées, j'ai longtemps essayé de chercher comment marchent la position des blocs en jeu mais tu m'as confirmé (et je te remercie) que la position du bloc s'identifie en son centre, donc ce n'est pas 15.5 mais plutôt 15 c'est cela ?
---
(*) si cela vient de la pratique d'un autre langage, gardes bien à l'esprit que pour Lua, 0 n'est pas équivalent à "false" comme on le voit parfois ailleurs.
My game? It's Minefall.
-
- New member
- Posts: 7
- Joined: Wed May 31, 2023 13:25
- GitHub: Kaizokumi
- In-game: Mr_Diamond
Re: [MOD WIP] Problème : Mod sans effets
Si je comprends bien, une grande partie de mes fonctions sur mon programme ne peuvent pas marcher durant la "phase d'initialisation" du jeu ? Donc en effet, il faudrait faire en sorte que le programme puisse s'exécuter après cette phase d'initialisation avec un minetest.after() ou alors imposer une condition en rapport avec la connexion du joueur au monde, par exemple ?Je ne pense pas, vu que ça contredit clairement ton titre car un Lua Controller est un élément dans un mod - ou alors il y a un malentendu sur la terminologie. Mais la question de l'activation est celle que je posais. Tel quel, ton mod est "activé" une fois à l'initialisation du jeu puis plus jamais.
Ce qu'il fait est d'ailleurs probablement invalide car cette phase d'initialisation est un peu particulière; pour quelques fonctions, il est dit explicitement dans la doc qu'elles ne marcheront pas à ce moment, mais ce doit être vrai pour beaucoup plus. Notamment le placement de blocs qui me paraît très litigieux à ce moment, et il est possible que le moteur Minetest ignore complètement ces instructions (quoiqu'on pourrait s'attendre à ce qu'il s'arrête sur erreur purement et simplement - à ce propos, as-tu regardé dans les logs s'il ne t'insultait pas par hasard?).
Si tu veux vraiment cela, je pense qu'il faudrait essayer de différer l'exécution avec minetest.after()
Je comprends tout à fait pour la déclaration du switch_is_on=1, je la supprimerai plus tard. Ayant un peu réfléchi, est-ce que l'idée de poser la condition de l'existence du wall_lever_on avec des coordonnées (comme tu m'as annoncé précédemment que la fonction minetest.find_node_near va donner des coordonnée, ce qui me semble assez logique) serait une possibilité d'activation du module (l'activation d'une des quatres lampes) ?L'explication est confuse. La déclaration de la position est dans la variable switch_pos, pour être précis.
find_node_near détecte la présence dans ce voisinage d'un well_lever_on - qui fait office ici d'interrupteur allumé.
Mais sur la ligne suivante tu décides autoritairement qu'il est là (d'une manière un peu étrange d'ailleurs, Lua sait ce que "true" et "false" veulent dire (*)), et le "if" suivant sera toujours vrai.
D'ailleurs fait important à propos de find_node_near(), il faut ajouter un "true" en dernier paramètre sinon il regarde partout sauf à la position indiquée...
Par exemple, je peux faire ceci pour désigner que le levier est activé (en repostant le code avec les corrections et les indentations) :
Code: Select all
switch_is_on = 0
lamp_activation = 0
lamp_state = {0, 0, 0, 0}
lamp_pos_red = {x=-25, y=15, z=62}
lamp_pos_green = {x=-25, y=15, z=63}
lamp_pos_yellow = {x=-25, y=15, z=64}
lamp_pos_blue = {x=-25, y=15, z=65}
switch_pos = {x=-24, y=15, z=67}
switch_is_on = minetest.find_node_near(switch_pos, 1, "mesecons_walllever:wall_lever_on", true)
if switch_is_on == switch_pos then
lamp_activation = math.random(1,4)
if lamp_activation == 1 then
lamp_state[1] = 1
minetest.set_node({x=-24, y=15, z=62}, {name="mesecons_lightstone:lightstone_red_on"})
minetest.after(3, function()
minetest.set_node({x=-24, y=15, z=62}, {name="mesecons_lightstone:lightstone_red_off"})
end)
else
lamp_state[1] = 0
end
if lamp_activation == 2 then
lamp_state[2] = 1
minetest.set_node({x=-24, y=15, z=63}, {name="mesecons_lightstone:lightstone_green_on"})
minetest.after(3, function()
minetest.set_node({x=-24, y=15, z=63}, {name="mesecons_lightstone:lightstone_green_off"})
end)
else
lamp_state[2] = 0
end
if lamp_activation == 1 then
lamp_state[3] = 1
minetest.set_node({x=-24, y=15, z=64}, {name="mesecons_lightstone:lightstone_yellow_on"})
minetest.after(3, function()
minetest.set_node({x=-24, y=15, z=64}, {name="mesecons_lightstone:lightstone_yellow_off"})
end)
else
lamp_state[3] = 0
end
if lamp_activation == 1 then
lamp_state[4] = 1
minetest.set_node({x=-24, y=15, z=65}, {name="mesecons_lightstone:lightstone_blue_on"})
minetest.after(3, function()
minetest.set_node({x=-24, y=15, z=65}, {name="mesecons_lightstone:lightstone_blue_off"})
end)
else
lamp_state[4] = 0
end
else
lamp_activation = 0
end
Re: [MOD WIP] Problème : Mod sans effets
Globalement oui. Encore que j'ai l'intuition que ce n'est pas ce que l'on veut réellement. Typiquement pour ce genre de chose, on voudra placer cette action sur l'activation du levier; et dans ce cas le code irait dans un callback comme on_construct (pour le bloc mesecons_walllever:wall_lever_on).Mr_Diamond wrote: ↑Wed Jan 03, 2024 14:25Si je comprends bien, une grande partie de mes fonctions sur mon programme ne peuvent pas marcher durant la "phase d'initialisation" du jeu ? Donc en effet, il faudrait faire en sorte que le programme puisse s'exécuter après cette phase d'initialisation avec un minetest.after() ou alors imposer une condition en rapport avec la connexion du joueur au monde, par exemple ?
Ça va dans le bon sens, mais dans ce cas find_node_near() est un peu "tordu" car on sait exactement où doit être le levier. Voici ce que j'écrirais (pas de garantie que ça marche mieux, c'est juste pour montrer):Par exemple, je peux faire ceci pour désigner que le levier est activé (en repostant le code avec les corrections et les indentations) :
Code: Select all
-- Mettre le max de choses en "local".
local lamp_state = {0, 0, 0, 0}
local lamp_pos_red = {x=-25, y=15, z=62}
local lamp_pos_green = {x=-25, y=15, z=63}
local lamp_pos_yellow = {x=-25, y=15, z=64}
local lamp_pos_blue = {x=-25, y=15, z=65}
local switch_pos = {x=-24, y=15, z=67}
-- ici je condense beaucoup. En moins condensé on dirait:
-- local bloc=get_node(switch_pos)
-- if bloc.name=="mesecons_walllever:wall_lever_on"
-- Comme j'indiquais, vu qu'on sait exactement où est l'interrupteur, on peut simplement demander au moteur le nom du bloc qu'il y a là.
if minetest.get_node(switch_pos).name=="mesecons_walllever:wall_lever_on" then
local lamp_activation = math.random(1,4)
lamp_state[lamp_activation]=1 -- ça remplace tous les lamp_state[x]=1 dans les ifs.
if lamp_activation == 1 then
minetest.set_node(lamp_pos_red, {name="mesecons_lightstone:lightstone_red_on"})
minetest.after(3, function()
minetest.set_node(lamp_post_red, {name="mesecons_lightstone:lightstone_red_off"})
end)
-- ici et plus bas j'ai supprimé lamp_state[x]=0 car lamp_state est déjà initialisé avec tout à 0.
elseif lamp_activation == 2 then
minetest.set_node(lamp_pos_green, {name="mesecons_lightstone:lightstone_green_on"})
minetest.after(3, function()
minetest.set_node(lamp_pos_green, {name="mesecons_lightstone:lightstone_green_off"})
end)
elseif lamp_activation == 3 then
minetest.set_node(lamp_pos_yellow, {name="mesecons_lightstone:lightstone_yellow_on"})
minetest.after(3, function()
minetest.set_node(lamp_pos_yellow, {name="mesecons_lightstone:lightstone_yellow_off"})
end)
elseif lamp_activation == 4 then
minetest.set_node(lamp_pos_blue, {name="mesecons_lightstone:lightstone_blue_on"})
minetest.after(3, function()
minetest.set_node(lamp_pos_blue, {name="mesecons_lightstone:lightstone_blue_off"})
end)
end
else
-- sinon "bonne nuit les petits"
minetest.set_node(lamp_pos_red, {name="mesecons_lightstone:lighstone_red_off"})
minetest.set_node(lamp_pos_yellow, {name="mesecons_lightstone:lighstone_yellow_off"})
minetest.set_node(lamp_pos_green, {name="mesecons_lightstone:lighstone_green_off"})
minetest.set_node(lamp_pos_blue, {name="mesecons_lightstone:lighstone_blue_off"})
end
Il reste à envelopper le tout dans un minetest.after() pour faire ça après l'init du jeu. 10 secondes devraient largement être suffisantes.
My game? It's Minefall.
-
- New member
- Posts: 7
- Joined: Wed May 31, 2023 13:25
- GitHub: Kaizokumi
- In-game: Mr_Diamond
Re: [MOD WIP] Problème : Mod sans effets
C'est une excellente idée pour la condition basé sur le nom du bloc présent. Je n'avais jamais pensé à cela, en tout cas. Je te remercie beaucoup. J'essaierai d'adapter avec le code que tu m'as proposé. D'ailleurs, dans ton code, tu as conseillé que je dois mettre un maximum de variable "local" mais pourquoi ? Les variables "local" ont réellement un intérêt tout particulier dans le code ?Ça va dans le bon sens, mais dans ce cas find_node_near() est un peu "tordu" car on sait exactement où doit être le levier. Voici ce que j'écrirais (pas de garantie que ça marche mieux, c'est juste pour montrer):
Re: [MOD WIP] Problème : Mod sans effets
C'est un peu une question "d'hygiène" et un peu une question de performances.Mr_Diamond wrote: ↑Tue Jan 09, 2024 10:44Les variables "local" ont réellement un intérêt tout particulier dans le code ?
Pour l'hygiène, ce qui n'est pas déclaré local est global, donc tous les mods peuvent voir tes variables - peut-être pas trop grave en soi, mais cela veut aussi dire que si un autre mod fait pareil avec un nom de variable identique, vous allez vous "marcher dessus". Minetest il me semble te traite de pollueur dans ses logs si tu fais ça.
Pour les perfs, c'est lié à un aspect du fonctionnement de Lua: les références locales sont plus rapides que les références globales [1].
C'est pour cela d'ailleurs que l'on voit dans certains mods
Code: Select all
local abs=math.abs
Donc c'est une bonne habitude à prendre que d'utiliser "local".
---
[1] Pour ceux qui tomberaient sur le fil et penseraient que ça sort de mon enviable séant magnifique, cf. Lua Performance tips (PDF) - et oui, je sais que le Lua de Minetest est un peu particulier (JIT).
My game? It's Minefall.
-
- New member
- Posts: 7
- Joined: Wed May 31, 2023 13:25
- GitHub: Kaizokumi
- In-game: Mr_Diamond
Re: [MOD WIP] Problème : Mod sans effets
J'ai réalisé quelques tests mais toujours rien de la part de ces lampes, elles restent éteintes. Du coup, pour faire plus simple, j'ai supprimé les autres lampes et adapté mon code et le tien pour qu'une seule, donc il s'agit seulement d'un interrupteur pour allumer une lampe, rien de plus classique. Je te montre comment j'ai adapté ton code :
Minetest n'a pas pu démarrer le monde car il m'affiche "attempt to index a nil value" vers la fonction minetest.get_node. Très mystérieux...
Code: Select all
local lamp_pos_red = {x=-57, y=9.5, z=6}
local switch_pos = {x=-56, y=9.5, z=1}
if minetest.get_node(switch_pos).name=="mesecons_walllever:wall_lever_on" then
minetest.set_node(lamp_pos_red, {name="mesecons_lightstone:lightstone_red_on"})
minetest.after(3, function()
minetest.set_node(lamp_pos_red, {name="mesecons_lightstone:lightstone_red_off"})
end)
else
minetest.set_node(lamp_pos_red, {name="mesecons_lightstone:lighstone_red_off"})
end
-
- New member
- Posts: 7
- Joined: Wed May 31, 2023 13:25
- GitHub: Kaizokumi
- In-game: Mr_Diamond
Re: [MOD WIP] Problème : Mod sans effets
J'ai pu résoudre le problème avec le minetest.after, j'avais oublié de mettre la fonction au début. J'ai pu constaté en actionnant le levier une réaction de la lampe rouge qui s'est allumé, comme prévu dans la fonction, seulement je ne peux pas le réactionner plus tard, après qu'elle se soit éteinte et j'ai subitement repensé à ce que tu m'avais dis par rapport à l'exécution de la fonction qui ne s'effectuait qu'une seule fois au démarrage du monde. Je ne l'avais pas vraiment compris d'ailleurs...