Nuovo sistema immunità + continuata astrazione

master
Marco 2020-04-01 17:20:15 +02:00
parent 72f254693a
commit 86ddd78113
3 changed files with 83 additions and 68 deletions

35
api.lua
View File

@ -17,7 +17,6 @@ local function nextID() end
local arenasID
local players_in_game = {} --KEY: player name, INDEX: arenaID
local players_in_queue = {} --KEY: player name, INDEX: arenaID
local immunity_time = 3
local arena_default_max_players = 2
local arena_default_min_players = 1
@ -40,6 +39,7 @@ arena_lib.arena_default = {
local prefix = "[Arena_lib] "
local load_time = 3
local celebration_time = 3
local immunity_time = 3
function arena_lib.settings(def)
@ -56,6 +56,10 @@ function arena_lib.settings(def)
celebration_time = def.celebration_time
end
if def.immunity_time then
immunity_time = def.immunity_time
end
end
@ -172,12 +176,12 @@ function arena_lib.load_celebration(arena_ID, winner_name)
for pl_name, stats in pairs(arena.players) do
local inv = minetest.get_player_by_name(pl_name):get_inventory()
local weapon = inv:get_stack("main", 1)
local meta = weapon:get_meta():set_int("immune", 1)
inv:set_stack("main", 1, weapon)
-- giocatori immortali
if not inv:contains_item("main", "arena_lib.immunity") then
inv:set_stack("main", 8, "arena_lib:immunity")
end
minetest.get_player_by_name(pl_name):set_nametag_attributes({color = {a = 255, r = 255, g = 255, b = 255}})
minetest.chat_send_player(pl_name, prefix .. winner_name .. " ha vinto la partita")
end
@ -204,6 +208,8 @@ function arena_lib.end_arena(arena)
arena_lib.update_sign(arena.sign, arena)
arena_lib.update_storage()
minetest.get_player_by_name(pl_name):get_inventory():set_list("main", {})
arena_lib.on_end()
--TODO: teleport lobby, metti variabile locale
@ -312,18 +318,15 @@ end
function arena_lib.immunity(player)
local p_name = player:get_player_name()
local weapon = player:get_inventory():get_stack("main", 1)
local immunity_item = ItemStack("arena_lib:immunity")
local inv = player:get_inventory()
weapon:get_meta():set_int("immune", 1)
player:get_inventory():set_stack("main", 1, weapon)
inv:set_stack("main", 8, immunity_item)
minetest.after(immunity_time, function()
if player == nil then return end -- he may disconnect
if player:get_inventory():get_stack("main", 1):get_meta():get_int("immune") == 1 then
weapon:get_meta():set_int("immune", 0)
player:get_inventory():set_stack("main", 1, weapon)
if player == nil then return end -- they may disconnect
if inv:contains_item("main", immunity_item) then
inv:remove_item("main", immunity_item)
end
end)
@ -382,9 +385,7 @@ end
-----------------SETTERS----------------------
----------------------------------------------
function arena_lib.set_immunity_time(time)
immunity_time = time
end
----------------------------------------------
---------------FUNZIONI LOCALI----------------

58
items.lua Normal file
View File

@ -0,0 +1,58 @@
minetest.register_node("arena_lib:immunity", {
description = "Sei immune!"
inventory_image = "arena_immunity.png"
groups = {not_in_creative_inventory = 1, oddly_breakable_by_hand = "2"},
})
--[[sovrascrizione "on_punch" nodo base dei cartelli per farli entrare
nell'arena se sono cartelli appositi e "on_timer" per teletrasportali in partita quando la queue finisce]]
minetest.register_tool("arena_lib:create_sign", {
description = "Left click on a sign to create an entrance or to remove it",
inventory_image = "arena_createsign.png",
groups = {not_in_creative_inventory = 1, oddly_breakable_by_hand = "2"},
on_use = function(itemstack, user, pointed_thing)
local pos = minetest.get_pointed_thing_position(pointed_thing)
if pos == nil then return end -- nel caso sia aria, sennò crasha
local node = minetest.get_node(pos)
local def = minetest.registered_items[node.name]
--controllo se è un cartello
if def and def.entity_info then
def.number_of_lines = 5
local arena_ID = itemstack:get_meta():get_int("arenaID")
local arena = arena_lib.arenas[arena_ID]
-- controllo se c'è già un cartello assegnato a quell'arena. Se è lo stesso lo rimuovo, sennò annullo
if next(arena.sign) ~= nil then
if minetest.serialize(pos) == minetest.serialize(arena.sign) then
minetest.set_node(pos, {name = "air"})
arena.sign = {}
minetest.chat_send_player(user:get_player_name(), "Cartello dell'arena " .. arena.name .. " rimosso con successo")
else
minetest.chat_send_player(user:get_player_name(), minetest.colorize("#e6482e", "[!] Esiste già un cartello per quest'arena!"))
end
return end
-- cambio la scritta
arena_lib.update_sign(pos, arena)
-- aggiungo il cartello ai cartelli dell'arena
arena.sign = pos
-- salvo l'ID come metadato nel cartello
minetest.get_meta(pos):set_int("arenaID", arena_ID)
else
minetest.chat_send_player(user:get_player_name(), minetest.colorize("#e6482e", "[!] L'oggetto non è un cartello!"))
end
end,
})

View File

@ -1,6 +1,13 @@
--
-- For the item to set signs, being a declaration of a new item, look at items.lua
--
local function in_game_txt(arena) end
minetest.override_item("default:sign_wall", {
on_punch = function(pos, node, puncher, pointed_thing)
@ -99,57 +106,6 @@ minetest.override_item("default:sign_wall", {
--[[sovrascrizione "on_punch" nodo base dei cartelli per farli entrare
nell'arena se sono cartelli appositi e "on_timer" per teletrasportali in partita quando la queue finisce]]
minetest.register_tool("arena_lib:create_sign", {
description = "Left click on a sign to create an entrance or to remove it",
inventory_image = "arena_createsign.png",
groups = {not_in_creative_inventory = 1, oddly_breakable_by_hand = "2"},
on_use = function(itemstack, user, pointed_thing)
local pos = minetest.get_pointed_thing_position(pointed_thing)
if pos == nil then return end -- nel caso sia aria, sennò crasha
local node = minetest.get_node(pos)
local def = minetest.registered_items[node.name]
--controllo se è un cartello
if def and def.entity_info then
def.number_of_lines = 5
local arena_ID = itemstack:get_meta():get_int("arenaID")
local arena = arena_lib.arenas[arena_ID]
-- controllo se c'è già un cartello assegnato a quell'arena. Se è lo stesso lo rimuovo, sennò annullo
if next(arena.sign) ~= nil then
if minetest.serialize(pos) == minetest.serialize(arena.sign) then
minetest.set_node(pos, {name = "air"})
arena.sign = {}
minetest.chat_send_player(user:get_player_name(), "Cartello dell'arena " .. arena.name .. " rimosso con successo")
else
minetest.chat_send_player(user:get_player_name(), minetest.colorize("#e6482e", "[!] Esiste già un cartello per quest'arena!"))
end
return end
-- cambio la scritta
arena_lib.update_sign(pos, arena)
-- aggiungo il cartello ai cartelli dell'arena
arena.sign = pos
-- salvo l'ID come metadato nel cartello
minetest.get_meta(pos):set_int("arenaID", arena_ID)
else
minetest.chat_send_player(user:get_player_name(), minetest.colorize("#e6482e", "[!] L'oggetto non è un cartello!"))
end
end,
})
function arena_lib.set_sign(sender, arena_name)
local arena_ID, arena = arena_lib.get_arena_by_name(arena_name)