Actualiser init.lua
This commit is contained in:
parent
0cbc0811f4
commit
60e1153e16
344
init.lua
344
init.lua
@ -1,9 +1,5 @@
|
||||
local S = minetest.get_translator("chest_recovery") -- Récupérer le traducteur pour ce mod
|
||||
|
||||
-- settings
|
||||
|
||||
local setting_give_recovery_compass = minetest.settings:get_bool("chest_recovery_give_recovery_compass", false)
|
||||
|
||||
|
||||
chest_positions = {}
|
||||
|
||||
@ -309,13 +305,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
|
||||
-- Traitement du bouton de transfert
|
||||
if fields.transfer then
|
||||
if setting_give_recovery_compass == true then
|
||||
-- Supprimer les éléments de récupération du joueur
|
||||
for i = 1, player_inv:get_size("main") do
|
||||
local stack = player_inv:get_stack("main", i)
|
||||
if stack:get_name():find("mcl_compass:.*_recovery") then
|
||||
player_inv:remove_item("main", stack)
|
||||
end
|
||||
-- Supprimer les éléments de récupération du joueur
|
||||
for i = 1, player_inv:get_size("main") do
|
||||
local stack = player_inv:get_stack("main", i)
|
||||
if stack:get_name():find("mcl_compass:.*_recovery") then
|
||||
player_inv:remove_item("main", stack)
|
||||
end
|
||||
end
|
||||
|
||||
@ -406,204 +400,168 @@ minetest.register_privilege("chest_recovery_bypass", {
|
||||
|
||||
|
||||
|
||||
-- Fonction appelée lorsqu'un joueur meurt
|
||||
minetest.register_on_dieplayer(function(player)
|
||||
-- Récupérer l'inventaire du joueur et la position
|
||||
local player_inv = player:get_inventory()
|
||||
local pos = player:get_pos()
|
||||
|
||||
-- Réglage des coordonnées en entiers
|
||||
pos.x = math.floor(pos.x)
|
||||
pos.y = math.floor(pos.y)
|
||||
pos.z = math.floor(pos.z)
|
||||
|
||||
-- Afficher les coordonnées du joueur après la mort
|
||||
minetest.chat_send_player(player:get_player_name(), S("You are dead, at the coordinates: ") .. minetest.pos_to_string(pos))
|
||||
|
||||
-- Fonction appelée lorsqu'un joueur meurt
|
||||
minetest.register_on_dieplayer(function(player)
|
||||
-- Récupérer l'inventaire du joueur
|
||||
local player_inv = player:get_inventory()
|
||||
local pos = player:get_pos()
|
||||
pos.y = pos.y -- Réglage de la coordonnée Y (elle semble inchangée)
|
||||
-- Déclare les variables pour les positions des mondes
|
||||
local worldoverworld = 0
|
||||
local worldend = -27003
|
||||
local worldnether = -29038
|
||||
local worldoverworldhaut = 20000
|
||||
local worldendhaut = -2130
|
||||
local worldnetherhaut = -27140
|
||||
local worldoverworldbas = -193
|
||||
local worldendbas = -28745
|
||||
local worldnetherbas = -29135
|
||||
|
||||
-- rendre les cordonner en entier
|
||||
pos.x = math.floor(pos.x)
|
||||
pos.y = math.floor(pos.y)
|
||||
local backuppos = pos.y
|
||||
pos.z = math.floor(pos.z)
|
||||
-- Calcul des positions intermédiaires
|
||||
local worldnetherendmiddle = (worldnetherhaut + worldendbas) / 2
|
||||
local worldendoverworldmiddle = (worldendhaut + worldoverworldbas) / 2
|
||||
|
||||
|
||||
-- Envoyer un message au joueur indiquant ses coordonnées après la mort
|
||||
minetest.chat_send_player(player:get_player_name(), S("You are dead, at the coordinates : ") .. minetest.pos_to_string(pos))
|
||||
--dans le log
|
||||
minetest.log("action", player:get_player_name() .. " died at " .. minetest.pos_to_string(pos))
|
||||
|
||||
|
||||
|
||||
--si y estentre -27000 et -28000 alors on met la position a -27000
|
||||
if pos.y < -27000 and pos.y > -28000 then
|
||||
pos.y = -27001
|
||||
-- Logique pour définir la position en fonction de pos.y
|
||||
if pos.y < worldnetherbas then
|
||||
pos.y = worldnether
|
||||
elseif pos.y > worldnetherhaut and pos.y < worldendbas then
|
||||
if pos.y < worldnetherendmiddle then
|
||||
pos.y = worldnether
|
||||
else
|
||||
pos.y = worldend
|
||||
end
|
||||
elseif pos.y > worldendhaut and pos.y < worldoverworldbas then
|
||||
if pos.y < worldendoverworldmiddle then
|
||||
pos.y = worldend
|
||||
else
|
||||
pos.y = worldoverworld
|
||||
end
|
||||
elseif pos.y > worldoverworldhaut then
|
||||
pos.y = worldoverworld
|
||||
end
|
||||
|
||||
|
||||
--detecter si la postion du pos est dans un bloc vide
|
||||
local node = minetest.get_node(pos)
|
||||
--si le node name n'est pas air alors on marque le message
|
||||
-- Vérifie si le nom du nœud n'est pas "air"
|
||||
--verifie si le pos est entre worldendbas et worldend alors on le met a worldend
|
||||
if pos.y > worldendbas and pos.y < worldend then
|
||||
pos.y = worldend
|
||||
end
|
||||
|
||||
-- Récupérer le nœud à la position du joueur décédé
|
||||
local node = minetest.get_node(pos)
|
||||
|
||||
-- Vérifier si le nœud n'est pas de l'air
|
||||
if node.name ~= "air" then
|
||||
-- Sauvegarde la position initiale de y
|
||||
backuppos = pos.y
|
||||
|
||||
-- Recherche de la position d'un bloc vide au-dessus de la position
|
||||
while node.name ~= "air" do
|
||||
pos.y = pos.y + 1
|
||||
node = minetest.get_node(pos)
|
||||
|
||||
if node.name == "mcl_core:bedrock" then
|
||||
pos.y = pos.y - 1
|
||||
-- Vérifie si la position est dans le Nether
|
||||
if pos.y >= worldnetherbas and pos.y <= worldnetherhaut then
|
||||
local testnether = 0
|
||||
while node.name ~= "air" do
|
||||
pos.y = pos.y + 1
|
||||
node = minetest.get_node(pos)
|
||||
|
||||
if node.name == "mcl_nether:netherrack" or node.name == "mcl_blackstone:nether_gold" then
|
||||
minetest.remove_node(pos)
|
||||
pos.y = pos.y - 1
|
||||
else
|
||||
pos.y = backuppos
|
||||
|
||||
while node.name ~= "air" do -- tant que le nom du nœud n'est pas "air"
|
||||
pos.y = pos.y - 1
|
||||
node = minetest.get_node(pos)
|
||||
|
||||
if node.name == "mcl_core:bedrock" then
|
||||
pos.y = backuppos
|
||||
-- Casse le bloc pour poser le coffre
|
||||
minetest.remove_node(pos)
|
||||
pos.y = pos.y + 1
|
||||
end
|
||||
if node.name == "mcl_core:bedrock" then
|
||||
pos.y = worldnether
|
||||
if testnether == 1 then
|
||||
-- Réinitialiser la position à (0, 0, 0) si déjà modifié
|
||||
pos.x = 0
|
||||
pos.y = 0
|
||||
pos.z = 0
|
||||
end
|
||||
|
||||
--pos.y = pos.y - 1
|
||||
testnether = 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- On marque le message avec la nouvelle position
|
||||
end
|
||||
|
||||
|
||||
--verifi si les co du coffre sont entre -31000 et -31000
|
||||
if pos.y < -31000 and pos.y > -32000 then
|
||||
--verifi si le y de la position backup est entre -31000 et -32000
|
||||
if backuppos < -31000 and backuppos > -32000 then
|
||||
--on remet la position backup pour la position du coffre
|
||||
pos.y = backuppos
|
||||
else
|
||||
--on met la position du coffre a 0
|
||||
pos.y = 0
|
||||
end
|
||||
end
|
||||
|
||||
--verifi si les co du coffre sont n'est pas plus haut que 30000
|
||||
if pos.y > 30000 then
|
||||
--on met la position du coffre a 0
|
||||
pos.y = 0
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- Placer un coffre de récupération à la position du joueur décédé
|
||||
minetest.set_node(pos, {name = "chest_recovery:chest"})
|
||||
minetest.chat_send_player(player:get_player_name(), S("your recovery chest is in position: ") .. minetest.pos_to_string(pos))
|
||||
--dans le log
|
||||
minetest.log("action", player:get_player_name() .. " recovery chest is in position: " .. minetest.pos_to_string(pos))
|
||||
|
||||
|
||||
-- Obtenir les métadonnées et l'inventaire du coffre de récupération
|
||||
local chest_meta = minetest.get_meta(pos)
|
||||
local chest_inv = chest_meta:get_inventory()
|
||||
|
||||
local is_empty = true
|
||||
|
||||
--met en metadonnée le nom du joueur
|
||||
chest_meta:set_string("owner", player:get_player_name())
|
||||
--met en metadonnée la date de la mort
|
||||
chest_meta:set_string("date", os.date("%Y-%m-%d %H:%M:%S"))
|
||||
|
||||
--log dans les logs
|
||||
minetest.log("action", player:get_player_name() .. " died at " .. minetest.pos_to_string(pos) .. " and his items are in the recovery chest at " .. minetest.pos_to_string(pos))
|
||||
|
||||
-- Transférer les objets de l'inventaire du joueur au coffre de récupération
|
||||
for _, listname in ipairs({"main", "armor", "offhand", "craft"}) do -- Pour chaque liste d'objets
|
||||
for i = 1, player_inv:get_size(listname) do -- Pour chaque emplacement
|
||||
local stack = player_inv:get_stack(listname, i) -- Récupérer l'objet
|
||||
--log dans les logs
|
||||
minetest.log("action", player:get_player_name() .. " died at " .. minetest.pos_to_string(pos) .. " and his items are in the recovery chest at " .. minetest.pos_to_string(pos) .. " with " .. stack:get_name() .. " number " .. stack:get_count())
|
||||
chest_inv:set_stack(listname, i, stack) -- Placer l'objet dans le coffre
|
||||
player_inv:set_stack(listname, i, ItemStack(nil)) -- Supprimer l'objet de l'inventaire du joueur
|
||||
if not stack:is_empty() then -- Si l'objet n'est pas vide
|
||||
is_empty = false
|
||||
end
|
||||
-- Si la position n'est pas dans le Nether, chercher l'air
|
||||
while node.name ~= "air" do
|
||||
pos.y = pos.y + 1
|
||||
node = minetest.get_node(pos)
|
||||
end
|
||||
end
|
||||
|
||||
-- Si l'inventaire du joueur était vide, supprimer le coffre
|
||||
if is_empty then
|
||||
minetest.remove_node(pos)
|
||||
else
|
||||
-- Mettre à jour le formulaire du coffre avec les emplacements d'objets
|
||||
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if setting_give_recovery_compass == true then
|
||||
-- Define compass_frames as a global variable
|
||||
compass_frames = 32
|
||||
|
||||
minetest.register_on_respawnplayer(function(player)
|
||||
-- Generate a new random frame for the recovery compass
|
||||
local random_frame = math.random(0, compass_frames - 1)
|
||||
|
||||
-- Create the recovery compass item
|
||||
local recovery_compass = ItemStack("mcl_compass:" .. random_frame .. "_recovery")
|
||||
local player_inv_2 = player:get_inventory()
|
||||
|
||||
if player_inv_2 then
|
||||
player_inv_2:add_item("main", recovery_compass)
|
||||
end
|
||||
|
||||
end)
|
||||
end
|
||||
|
||||
-- Placer un coffre de récupération à la position du joueur décédé
|
||||
minetest.set_node(pos, {name = "chest_recovery:chest"})
|
||||
minetest.chat_send_player(player:get_player_name(), S("Your recovery chest is in position: ") .. minetest.pos_to_string(pos))
|
||||
|
||||
-- Obtenir les métadonnées et l'inventaire du coffre de récupération
|
||||
local chest_meta = minetest.get_meta(pos)
|
||||
local chest_inv = chest_meta:get_inventory()
|
||||
|
||||
minetest.register_chatcommand("open_chest", {
|
||||
description = "Ouvre un coffre à distance",
|
||||
params = "<pos>",
|
||||
privs = {chest_recovery_bypass=true},
|
||||
func = function(player_name, param)
|
||||
local pos = minetest.string_to_pos(param)
|
||||
if not pos then
|
||||
return false, "Position invalide. Utilisez le format (x,y,z)."
|
||||
local is_empty = true
|
||||
|
||||
-- Mettre en métadonnée le nom du joueur et la date de la mort
|
||||
chest_meta:set_string("owner", player:get_player_name())
|
||||
chest_meta:set_string("date", os.date("%Y-%m-%d %H:%M:%S"))
|
||||
|
||||
-- Transférer les objets de l'inventaire du joueur au coffre de récupération
|
||||
for _, listname in ipairs({"main", "armor", "offhand", "craft"}) do
|
||||
for i = 1, player_inv:get_size(listname) do
|
||||
local stack = player_inv:get_stack(listname, i)
|
||||
chest_inv:set_stack(listname, i, stack)
|
||||
player_inv:set_stack(listname, i, ItemStack(nil))
|
||||
if not stack:is_empty() then
|
||||
is_empty = false
|
||||
end
|
||||
|
||||
local player = minetest.get_player_by_name(player_name)
|
||||
if not player then
|
||||
return false, "Joueur introuvable."
|
||||
end
|
||||
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name ~= "chest_recovery:chest" then
|
||||
return false, "Aucun coffre trouvé à cette position."
|
||||
end
|
||||
|
||||
local meta = minetest.get_meta(pos)
|
||||
local owner = meta:get_string("owner")
|
||||
--if owner ~= player_name and owner ~= "" then
|
||||
-- return false, "Vous n'avez pas la permission d'ouvrir ce coffre."
|
||||
--end
|
||||
|
||||
-- Afficher le formspec du coffre
|
||||
local formspec = get_inventory_formspec(pos, player_name, owner)
|
||||
minetest.show_formspec(player_name, "chest_recovery:chest", formspec)
|
||||
|
||||
return true, "Coffre ouvert à distance."
|
||||
end,
|
||||
})
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
-- Si l'inventaire du joueur était vide, supprimer le coffre
|
||||
if is_empty then
|
||||
minetest.remove_node(pos)
|
||||
end
|
||||
end)
|
||||
|
||||
-- Définir le nombre de frames pour la boussole de récupération
|
||||
local compass_frames = 32
|
||||
|
||||
-- Fonction appelée lors du respawn d'un joueur
|
||||
minetest.register_on_respawnplayer(function(player)
|
||||
-- Générer un nouveau cadre aléatoire pour la boussole de récupération
|
||||
local random_frame = math.random(0, compass_frames - 1)
|
||||
|
||||
-- Créer l'objet de la boussole de récupération
|
||||
local recovery_compass = ItemStack("mcl_compass:" .. random_frame .. "_recovery")
|
||||
local player_inv_2 = player:get_inventory()
|
||||
|
||||
if player_inv_2 then
|
||||
player_inv_2:add_item("main", recovery_compass)
|
||||
end
|
||||
end)
|
||||
|
||||
-- Commande pour ouvrir un coffre à distance
|
||||
minetest.register_chatcommand("open_chest", {
|
||||
description = "Ouvre un coffre à distance",
|
||||
params = "<pos>",
|
||||
privs = {chest_recovery_bypass=true},
|
||||
func = function(player_name, param)
|
||||
local pos = minetest.string_to_pos(param)
|
||||
if not pos then
|
||||
return false, "Position invalide. Utilisez le format (x,y,z)."
|
||||
end
|
||||
|
||||
local player = minetest.get_player_by_name(player_name)
|
||||
if not player then
|
||||
return false, "Joueur introuvable."
|
||||
end
|
||||
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name ~= "chest_recovery:chest" then
|
||||
return false, "Aucun coffre trouvé à cette position."
|
||||
end
|
||||
|
||||
local meta = minetest.get_meta(pos)
|
||||
local owner = meta:get_string("owner")
|
||||
|
||||
-- Afficher le formspec du coffre
|
||||
local formspec = get_inventory_formspec(pos, player_name, owner)
|
||||
minetest.show_formspec(player_name, "chest_recovery:chest", formspec)
|
||||
|
||||
return true, "Coffre ouvert à distance."
|
||||
end,
|
||||
})
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user