initialisation du repository

master
Laurent REMY 2019-07-26 12:47:04 +02:00
parent dece7bf08d
commit e31f50922d
15 changed files with 457 additions and 2 deletions

View File

@ -1,2 +1,58 @@
# minetest-pandore
Mod minetest permettant de générer une boîte de Pandore
# Minetest : Pandore
## Un peu d'histoire pour placer le contexte
*Pour plus d'infos sur le mythe, faites un saut sur [wikipédia](https://fr.wikipedia.org/wiki/Pandore) par exemple!*
La mythologie grecque nous raconte que Pandore était une femme fabriquée par les dieux de l'Olympe. Zeus lui remit une boîte, avec ordre de ne pas l'ouvrir.
Humaine comme pas deux, Pandore a ouvert la boîte, et là, c'est le drame! Parce que Zeus y avait enfermé tous les maux de l'humanité, qui purent donc joyeusement se répandre sur Terre. A nous la vieillesse, la mort, la famine, la misère, j'en passe et des meilleures. Au fond de la boîte, il y avait quand même un truc qui trainait et qu'on appel l'espoir... Bref, c'est pas gagné, mais on peut le faire, Just Do It comme dirait l'autre!
## Pandore et Minetest
Et c'est là qu'arrive Minetest.
Minetest étant un micro-monde, il est normal qu'il vive aussi ce fabuleux mythe de Pandore. Graines2Tech a donc initié un mod Pandore pour Minetest.
[Graines2Tech](http://graines2tech.com) propose de faire découvrir le numérique à tous ceux qui se sentent jeunes, par des activités ludiques et créatives, du pixel-art au stop-motion, de la programmation à la robotique, des jeux déconnectés à l'impression 3D.
Et quoi de mieux pour découvrir la programmation que de réalise son propre mod sous Minetest? Ben rien, je suis bien d'accord :) Graines2Tech a donc proposé à des participants, lors d'un stage, de créer des plaies pour une boîte de Pandore.
Et vous avez le résultat sous les yeux!
# Le mod Pandore
## Compatibilité
Le mod Pandore a été développé et testé pour minetest 0.4.17.1.
## Mode d'emploi
Ce repository comprend plusieurs mods:
- le mod principal **pandore**
- un répertoire pour chacune des plaies créées par les participants
Pour créer une plaie, il suffit de créer un mod! [Plus d'informations sur la création de mod minetest.](https://dev.minetest.net/Installing_Mods)
Vous aurez besoin du mod *pandore* pour initier la boîte de Pandore dans minetest.
Pour charger une plaie dans la boîte de Pandore, il suffit de faire appel à la méthode *pandore.register_plaie* ; cette méthode prend 3 paramètres:
1. le nom de la plaie
2. une fonction permettant d'exécuter la plaie sur un joueur; un paramètre sera passé à cette fonction qui contiendra un objet [player](https://dev.minetest.net/Player) correspondant à la victime de la plaie
3. *[optionnel, défaut = false]* un booléen indiquant que la plaie doit s'appliquer à tous les joueurs ; si la valeur est *false*, un joueur sera choisi au hasard parmi les joueurs connectés
## Fonctionnement
Lorsqu'un joueur se connecte dans le monde, après un délai (*pandore.delai_pop*) de quelques secondes, le mod *pandore* créé une boîte de Pandore (*pandore:boite*) a proximité du joueur s'il n'en existe pas déjà.
La boîte de Pandore s'ouvre automatiquement et libère une plaie au hasard au bout d'un certain délai (compris entre *pandore.delai_min* et *pandore.delai_max*). La boîte peut également être ouverte par un joueur via un clic droit. Un joueur ne pourra pas ré-ouvrir la boîte avant un certain délai (*pandore.delai_min*).
Lorsque la boîte s'ouvre, un message est affiché pour tous les joueurs si la plaie concerne tous les joueurs, ou pour le joueur concerné le cas échéant. Si la plaie ne concerne pas tous les joueurs, un joueur est choisi au hasard parmi les joueurs connectés. Après un certain délai (*pandore.delai_plaie*), la plaie est lancé sur la ou les vicitime.s.
# A votre écoute!
N'hésitez pas à nous faire part de tous vos commentaires, et à créer des tickets pour de nouvelles fonctionnalités sur le mod *pandore* ou des bugs que vous pourriez trouver.
Un grand merci à vous!
L'équipe Graines2Tech

116
pandore/init.lua Normal file
View File

@ -0,0 +1,116 @@
--initialisation du mod
pandore = {
mod_name = "pandore", --nom du mod
nombre_plaies = 0, --nombre total de plaies chargées
plaies = {}, --liste des plaies disponibles
limite = 30, --rayon de la limite en block pour poser une boîte autour du joueur
delai_max = 180, --temps d'attente maximum en secondes entre le déclenchement de deux plaies
delai_min = 60, --temps d'attente minimum en secondes entre le déclenchement de deux plaies
delai_pop = 10, --delai entre l'apparition du joueur et la création de sa boîte
delai_plaie = 2, --delai entre l'ouverture de la boîte et le lancement de la plaie
players = {}, --liste associative des noms des joueurs et de la date de dernière activation d'une boîte
register_plaie = function(name,fn,all) --enregistre une plaie dans la liste de plaies; si all = true, la plaie s'exécute sur tous les joueurs (par défaut, all=false => joueur au hasard)
all = all or false
if pandore.plaies[name] == nil then
pandore.plaies[name] = {
action = fn,
tous = al
}
pandore.nombre_plaies = pandore.nombre_plaies+1
minetest.log("info","La plaie "..name.." a été chargée")
else
minetest.log("info","La plaie '"..name.."' a déjà été chargée.")
end
end,
ouvrir = function(player_name) --ouvre la boite de Pandore
if pandore.nombre_plaies > 0 then
local ouv_ok = true
local player = ""
if not (player_name == nil) then
--un joueur a ouvert la boîte
player = " par "..player_name
local now = minetest.get_gametime()
if pandore.players[player_name] == nil then
pandore.players[player_name] = minetest.get_gametime()
elseif (now - pandore.players[player_name]) > pandore.delai_min then
pandore.players[player_name] = minetest.get_gametime()
else
ouv_ok = false
minetest.chat_send_all("Il ne faut pas abuser de la boîte de Pandore, "..player_name.."...")
end
end
if ouv_ok then
--ouverture de la boîte
local plaie_names = {}
for i,v in pairs(pandore.plaies) do
plaie_names[#plaie_names+1] = i
end
local plaie = pandore.plaies[plaie_names[math.random(#plaie_names)]]
local joueurs = minetest.get_connected_players()
if plaie.tous then
minetest.chat_send_all("Une boîte de Pandore a été ouverte"..player.."!")
minetest.after(pandore.delai_plaie,function(joueurs)
for _, victime in ipairs(joueurs) do
plaie.action(victime)
end
end,joueurs)
else
local victime = joueurs[math.random(#joueurs)]
minetest.chat_send_player(victime:get_player_name(),"Une boîte de Pandore a été ouverte pour toi"..player.."!")
minetest.after(pandore.delai_plaie,plaie.action,victime)
end
end
end
end,
ajouter = function(player) --ajoute une boîte de Pandore près du joueur player
if pandore.nombre_plaies > 0 then
local nom = player:get_player_name()
local pos = player:get_pos()
local pos_inf = vector.subtract(pos,pandore.limite)
local pos_sup = vector.add(pos,pandore.limite)
local pos_boites = minetest.find_nodes_in_area_under_air(pos_inf, pos_sup,{"pandore:boite"})
if #pos_boites == 0 then
local pos_sols = minetest.find_nodes_in_area_under_air(pos_inf, pos_sup,{"group:soil"})
if #pos_sols > 0 then
local pos_boite = vector.add(pos_sols[math.random(#pos_sols)],{x=0,y=1,z=0})
minetest.set_node(pos_boite, {name ='pandore:boite'})
minetest.log("info","Une boîte de Pandore a été posée à "..dump(pos_boite))
minetest.chat_send_all("Bienvenue "..nom..", une boîte de Pandore a été déposée pour toi!")
else
minetest.log("info","Aucune boîte de Pandore posée pour "..nom)
end
end
end
end,
}
-- on place une boîte de Pandore après le chargement des joueurs
minetest.register_on_joinplayer(function(player)
minetest.after(pandore.delai_pop,pandore.ajouter,player)
end)
--la boîte de Pandore
minetest.register_node(pandore.mod_name..":boite", {
description = "La boîte de Pandore",
tiles = {"pandore.png"},
is_ground_content = true,
groups ={not_in_creative_inventory = 1},
sunlight_propagates = false,
walkable = false,
pointable = true,
diggable = false,
climbable = false,
buildable_to =false,
drawtype = "normal",
light_source = 2,
on_rightclick = function(pos, node, player, itemstack, pointed_thing)
pandore.ouvrir(player:get_player_name())
end,
on_construct = function(pos)
local timer=minetest.get_node_timer(pos)
timer:set((math.random(pandore.delai_max - pandore.delai_min) + pandore.delai_min),0)
end,
on_timer = function(pos, elapsed)
pandore.ouvrir()
end
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 690 B

2
pandore_cage/depends.txt Normal file
View File

@ -0,0 +1,2 @@
default
pandore

61
pandore_cage/init.lua Normal file
View File

@ -0,0 +1,61 @@
--initialisation du mod
pandore_cage = {
mod_name = "pandore_cage", --nom du mod
node_base = "default:obsidian_block", --nom du node servant de sol et de toit à la cage
node_paroi = "default:glass", --nom du node servant de paroi à la cage
node_interieur = "default:lava_source", --nom du node servant de contenu à la cage
delai_cage = 5, --délai avant disparition de la cage
set_cage = function(player) --place une cage autour du joueur player
local pos = player:get_pos()
minetest.chat_send_all(player:get_player_name() .. ": bonne baignade!")
--etage du bas
for i=-2,2 do
for a=-2,2 do
minetest.set_node(vector.add(pos,{x=a,y=-1,z=i}),{name=pandore_cage.node_base})
end
end
--etage du haut
for i=-2,2 do
for a=-2,2 do
minetest.set_node(vector.add(pos,{x=a,y=3,z=i}),{name=pandore_cage.node_base})
end
end
--etage milieu
for b=0,2 do
--paroi
for i=-2,2 do
minetest.set_node(vector.add(pos,{x=2,y=b,z=i}),{name=pandore_cage.node_paroi})
minetest.set_node(vector.add(pos,{x=-2,y=b,z=i}),{name=pandore_cage.node_paroi})
end
for a=-1,1 do
minetest.set_node(vector.add(pos,{x=a,y=b,z=2}),{name=pandore_cage.node_paroi})
minetest.set_node(vector.add(pos,{x=a,y=b,z=-2}),{name=pandore_cage.node_paroi})
end
--contenu
for i=-1,1 do
for a=-1,1 do
minetest.set_node(vector.add(pos,{x=a,y=b,z=i}),{name=pandore_cage.node_interieur})
end
end
end
--suppression de la cage
minetest.after(pandore_cage.delai_cage,function(pos)
pandore_cage.remove_cage(pos)
end,pos)
end,
remove_cage = function(pos) --supprimer une cage à la position pos
for b=-1,3 do
for i=-2,2 do
for a=-2,2 do
minetest.remove_node(vector.add(pos,{x=a,y=b,z=i}))
end
end
end
end,
}
pandore.register_plaie(pandore_cage.mod_name,pandore_cage.set_cage)

3
pandore_ivy/depends.txt Normal file
View File

@ -0,0 +1,3 @@
default
pandore
fire

104
pandore_ivy/init.lua Normal file
View File

@ -0,0 +1,104 @@
--initialisation du mod
pandore_ivy = {
mod_name = "pandore_ivy", --nom du mod
delai_expansion = 15, --délai d'expansion de la plaie
rayon_max_expansion = 10, --rayon maximal d'expansion de la plaie
dommages = 20, --dommages infligés par la plaie
delai_remede = 2, --délai d'expansion du remède
rayon_max_remede = 10, --rayon maximal d'expansion du remède
delai_suppression = 5, --délai avant suppression du remede
node_test = "default:dirt_with_grass", --node à tester avant de placer la plaie
set_ivy = function(player) --place une plante au pied du joueur player
local pos_under = vector.subtract(player:get_pos(),{x=0,y=1,z=0})
local node_under = minetest.get_node(pos_under)
local nom = player:get_player_name()
if node_under.name == pandore_ivy.node_test then
minetest.chat_send_all(nom .. ": tu vas te faire planter...")
minetest.set_node(pos, {name =pandore_ivy.mod_name..":ivy"})
else
minetest.chat_send_all(nom .. " ne se trouve pas sur l'herbe, dommage...")
end
end,
}
minetest.register_node(pandore_ivy.mod_name .. ":ivy", {
description = "Ivy",
tiles = {"ivy.png"},
is_ground_content = false,
groups ={
snappy = 2,
choppy = 2,
oddly_breakable_by_hand = 3,
flammable = 18,
},
sunlight_propagates = false,
walkable = false,
pointable = true,
diggable = true,
climbable = false,
buildable_to =true,
drawtype = "plantlike",
light_source = 0,
drop = pandore_ivy.mod_name .. ":ivy",
damage_per_second = pandore_ivy.dommages,
on_construct = function(pos)
local timer=minetest.get_node_timer(pos)
timer:set(math.random(pandore_ivy.delai_expansion) + 15,0)
end,
on_timer = function(pos, elapsed)
local pos_grasss = minetest.find_nodes_in_area_under_air(vector.add(pos,{x=-math.random(pandore_ivy.rayon_max_expansion),y=-math.random(pandore_ivy.rayon_max_expansion),z=-math.random(pandore_ivy.rayon_max_expansion)}),vector.add(pos,{x=math.random(pandore_ivy.rayon_max_expansion),y=math.random(pandore_ivy.rayon_max_expansion),z=math.random(pandore_ivy.rayon_max_expansion)}),{pandore_ivy.node_test})
if #pos_grasss > 0 then
minetest.set_node(vector.add(pos_grasss[math.random(#pos_grasss)],{x=0,y=1,z=0}), {name =pandore_ivy.mod_name..":ivy"})
local timer=minetest.get_node_timer(pos)
timer:set(math.random(pandore_ivy.delai_expansion) + 15,0)
end
end
})
minetest.register_craft({
type = "shapeless",
output = pandore_ivy.mod_name .. ":ivy2",
recipe = {pandore_ivy.mod_name .. ":ivy", "fire:flint_and_steel"},
})
minetest.register_node(pandore_ivy.mod_name .. ":ivy2", {
description = "Ivy Brulée",
tiles = {"ivy2.png"},
is_ground_content = false,
groups ={
snappy = 2,
choppy = 2,
oddly_breakable_by_hand = 3,
flammable = 3
},
sunlight_propagates = false,
walkable = false,
pointable = true,
diggable = true,
climbable = false,
buildable_to =true,
drawtype = "plantlike",
light_source = 0,
drop = pandore_ivy.mod_name .. ":ivy2",
damage_per_second = 0,
on_construct = function(pos)
local timer=minetest.get_node_timer(pos)
timer:set(pandore_ivy.delai_suppression,0)
minetest.after(pandore_ivy.delai_remede,function(pos)
local pos_inf = vector.add(pos,{x=-math.random(pandore_ivy.rayon_max_remede),y=-math.random(pandore_ivy.rayon_max_remede),z=-math.random(pandore_ivy.rayon_max_remede)})
local pos_sup = vector.add(pos,{x=math.random(pandore_ivy.rayon_max_remede),y=math.random(pandore_ivy.rayon_max_remede),z=math.random(pandore_ivy.rayon_max_remede)})
local pos_ivys = minetest.find_nodes_in_area(pos_inf,pos_sup,{pandore_ivy.mod_name..":ivy"})
for i,v in ipairs(pos_ivys) do
minetest.set_node(v,{name=pandore_ivy.mod_name..":ivy2"})
end
end,pos)
end,
on_timer = function(pos, elapsed)
minetest.remove_node(pos)
end
})
pandore.register_plaie(pandore_ivy.mod_name,pandore_ivy.set_ivy)

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

2
pandore_lave/depends.txt Normal file
View File

@ -0,0 +1,2 @@
default
pandore

31
pandore_lave/init.lua Normal file
View File

@ -0,0 +1,31 @@
--initialisation du mod
pandore_lave = {
mod_name = "pandore_lave", --nom du mod
duree_lave = 5, --durée avant disparition de la lave
node_test = "default:dirt_with_grass", --node à remplacer par de la lave
rayon = 0, --étendue de la lave (0=1 seul node)
set_lave = function(player) --place de la lave sous le joueur player
local pos_under = vector.subtract(player:get_pos(),{x=0,y=1,z=0})
local nom = player:get_player_name()
local node_under = minetest.get_node(pos_under)
if node_under.name == pandore_lave.node_test then
minetest.chat_send_all(nom .. ": le sol c'est de la lave!")
for i=0-pandore_lave.rayon,0+pandore_lave.rayon do
for j=0-pandore_lave.rayon,0+pandore_lave.rayon do
minetest.set_node(vector.add(pos_under,{x=i,y=0,z=j}), {name = 'default:lava_source'})
end
end
minetest.after(pandore_lave.duree_lave,function(pos)
for i=0-pandore_lave.rayon,0+pandore_lave.rayon do
for j=0-pandore_lave.rayon,0+pandore_lave.rayon do
minetest.set_node(vector.add(pos_under,{x=i,y=0,z=j}), {name = pandore_lave.node_test})
end
end
end,pos_under)
else
minetest.chat_send_all(nom .. " échappe à la lave, dommage...")
end
end
}
pandore.register_plaie(pandore_lave.mod_name,pandore_lave.set_lave)

View File

@ -0,0 +1,2 @@
default
pandore

78
pandore_nuage/init.lua Normal file
View File

@ -0,0 +1,78 @@
--initialisation du mod
pandore_nuage = {
mod_name = "pandore_nuage", --nom du mod
dommages = 10, --dommages infligées par les flèches
vitesse_fleche = 10, --vitesse de chute d'une flèche
delai_fleches = 3, --coefficient de délai entre deux flèches
hauteur_nuage = 10, --hauteur du nuage par rapport au joueur
duree_nuage = 10, --durée en secondes du nuage
set_nuage = function(player) --place un nuage au dessus du joueur player
minetest.chat_send_all(player:get_player_name() .. ": tu es maudit!")
local pos = vector.add(player:get_pos(),{x=0, y=pandore_nuage.hauteur_nuage, z=0})
minetest.set_node(pos, {name =pandore_nuage.mod_name .. ":nuage_maudit"})
minetest.set_node(vector.add(pos,{x=-1, y=0, z=0}), {name =pandore_nuage.mod_name .. ":nuage_maudit"})
minetest.set_node(vector.add(pos,{x=1, y=0, z=0}), {name =pandore_nuage.mod_name .. ":nuage_maudit"})
minetest.set_node(vector.add(pos,{x=0, y=0, z=-1}), {name =pandore_nuage.mod_name .. ":nuage_maudit"})
minetest.set_node(vector.add(pos,{x=0, y=0, z=1}), {name =pandore_nuage.mod_name .. ":nuage_maudit"})
end
}
minetest.register_node(pandore_nuage.mod_name .. ":nuage_maudit", {
description = "vole et envoi des fleches enpoisones",
tiles = {"nuage.png"},
groups ={
snappy = 2,
},
is_ground_content = false,
sunlight_propagates = false,
walkable = false,
pointable = true,
diggable = true,
climbable = false,
buildable_to =false,
drawtype = "normal",
light_source = 0,
on_construct = function(pos)
local timer=minetest.get_node_timer(pos)
timer:set((math.random(pandore_nuage.delai_fleches)+8)/10,0)
minetest.after(pandore_nuage.duree_nuage,function(pos)
minetest.remove_node(pos)
end,pos)
end,
on_timer = function (pos,elapsed)
minetest.set_node(vector.add(pos,{x=0,y=-1,z=0}),{name=pandore_nuage.mod_name .. ":fleche"})
local timer=minetest.get_node_timer(pos)
timer:set((math.random(pandore_nuage.delai_fleches)+1)/10,0)
end
})
minetest.register_node(pandore_nuage.mod_name .. ":fleche", {
description='enpoisoner',
tiles={'fleche.png'},
drawtype="plantlike",
groups={
not_in_creative_inventory=1,
},
is_ground_content = false,
sunlight_propagates = false,
walkable = false,
pointable = false,
diggable = false,
climbable = false,
buildable_to =false,
damage_per_second = pandore_nuage.dommages,
on_construct = function(pos)
local timer=minetest.get_node_timer(pos)
timer:set(1/pandore_nuage.vitesse_fleche,0)
end,
on_timer = function (pos,elapsed)
local pos_under = vector.add(pos,{x=0,y=-1,z=0})
local node_under = minetest.get_node(pos_under)
if node_under.name == "air" then
minetest.set_node(pos_under,{name=pandore_nuage.mod_name .. ":fleche"})
end
minetest.remove_node(pos)
end
})
pandore.register_plaie(pandore_nuage.mod_name,pandore_nuage.set_nuage)

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 B