+ Completed chest system

master
Giov4 2020-09-07 23:37:12 +00:00 committed by Zughy
parent dc71074afd
commit 149f9aa014
16 changed files with 877 additions and 204 deletions

39
SETTINGS.lua Normal file
View File

@ -0,0 +1,39 @@
--[[
! WARNING !
Don't change the variables' names if you don't know what you're doing
(skywars_settings.variable_name = value)
]]
-- ARENA LIB'S SETTINGS --
-- The table that stores all the global variables, don't touch this.
skywars_settings = {}
-- Where players will be teleported when a match ends.
skywars_settings.hub_spawn_point = {x = -177, y = 8.5, z = 247}
-- The time between the loading state and the start of the match.
skywars_settings.loading_time = 5
-- The time to wait before the loading phase starts. It gets triggered when the minimium amount of players has been reached to start the queue.
skywars_settings.queue_waiting_time = 10
-- The time between the end of the match and the respawn at the hub.
skywars_settings.celebration_time = 3
-- What's going to appear in most of the lines printed by murder.
skywars_settings.prefix = "Skywars > "
-- Whether to show the players nametags while in game.
-- false = don't / true = do
skywars_settings.show_nametags = false
-- Whether to allow players to use the builtin minimap function.
skywars_settings.show_minimap = false
-- The players walking speed when ther're playing a match
skywars_settings.player_speed = 1

67
TUTORIAL.txt Normal file
View File

@ -0,0 +1,67 @@
These are the steps to follow in order to create and configure an
arena:
1) Creating the arena using:
/skywars create <arena name> [min players] [max players]
where min players is equal to the minimun amount of players to make
the arena start, and max players to the maximum amount of players that
an arena can have.
2) Editing the arena using:
/skywars edit <arena name>
in this menu you can add spawn points and set up the sign to enter the
arena: the spawn points are where the players will spawn when they
enter the arena, while the sign is just the way to enter it (by
clicking it).
3) Setting the arena treasures (the items that can spawn in the
chests):
item: the item name
rarity: how often it will spawn in chests (the rarity gap between two
treasures should be at least of 2)
preciousness: in which chests it can be put, for example a chest with
a preciousness range 2-4 can spawn just items with a preciousness
between 2 and 4
count: the item amount
/skywars addtreasure <arena name> <item> <rarity (min 2.0, max
1000.0)> <preciousness> <count>
4) Setting the chests in the arena using:
/skywars addchest <arena name> <min_preciousness> <max_preciousness>
<min_treasures_amount (min. 1)> <max_treasures_amount>
to add a chest use this command on the block you want it to spawn, it
will automatically be filled with the right items when the match
starts
5) Saving the map schematic using:
/skywars pos1
/skywars pos2
/skywars createschematic <arena name> <schematic_name>
in order to automatically reset the map on every match, you have to
create a schematic file; to do so, simply specify the corners of the
map by facing NORTH (you can press F5 to know where you're facing),
and by being sure pos1 Z is SMALLER than pos2 Z (/skywars pos1 and
/skywars pos2 to set the two corners).
!If you overwrite a schematic that you've already created before make
sure to reload the server, so that it can be loaded correctly, and
remember that the old schematic won't be deleted!
6) Enabling the arena using
/skywars enable <arena name>
Once you've done this you can click the sign and start playing :)

View File

@ -1,30 +1,90 @@
arena_lib.on_load("skywars", function(arena)
if arena.reset == false then
minetest.place_schematic(arena.pos1, arena.schematic)
arena.reset = true
end
skywars.place_chests(arena)
skywars.fill_chests(arena)
end)
arena_lib.on_join("skywars", function(p_name, arena)
arena_lib.on_join("skywars", function(pl_name, arena)
end)
arena_lib.on_start("skywars", function(arena)
for pl_name in pairs(arena.players) do
local player = minetest.get_player_by_name(pl_name)
skywars.generate_HUD(arena, pl_name)
player:set_physics_override({speed=arena.players[pl_name].speed})
-- saving original speed
arena.players[pl_name].speed = player:get_physics_override().speed
end
end)
arena_lib.on_celebration("skywars", function(arena, winner_name)
for pl_name in pairs(arena.players) do
skywars.remove_HUD(arena, pl_name)
end
end)
arena_lib.on_end("skywars", function(arena, players)
arena.reset = false
for pl_name in pairs(arena.players) do
local player = minetest.get_player_by_name(pl_name)
-- restore player's original speed
player:set_physics_override({speed=arena.players[pl_name].speed})
end
end)
arena_lib.on_death("skywars", function(arena, p_name, reason)
arena_lib.on_death("skywars", function(arena, pl_name, reason)
if reason.type == "punch" then
if reason.object ~= nil and reason.object:is_player() then
local killer = reason.object:get_player_name()
arena_lib.send_message_players_in_arena(arena, skywars_settings.prefix .. skywars.T("@1 was killed by @2", pl_name, killer))
end
else
arena_lib.send_message_players_in_arena(arena, skywars_settings.prefix .. skywars.T("@1 is dead", pl_name))
end
arena_lib.remove_player_from_arena(pl_name, 1)
skywars.update_player_counter(arena)
end)
arena_lib.on_quit("skywars", function(arena)
arena_lib.on_quit("skywars", function(arena, pl_name)
skywars.update_player_counter(arena, false)
skywars.remove_HUD(arena, pl_name)
end)
arena_lib.on_disconnect("skywars", function(arena, pl_name)
skywars.update_player_counter(arena, false)
end)
arena_lib.on_kick("skywars", function(arena, pl_name)
skywars.update_player_counter(arena, false)
skywars.remove_HUD(arena, pl_name)
end)

View File

@ -1,2 +0,0 @@
--Registra un nodo chest dedicato in modo tale che se viene rimosso cicla nelle arene e si toglie da
--sola dalle chests delle properties.

View File

@ -1,45 +1,17 @@
--Il necessario per impostare dove sono le chest nelle mappe. Vedi MOBA con gli spawner.
-- This sets the map chests
local mod = "skywars"
ChatCmdBuilder.new("skywars", function(cmd)
cmd:sub("addchest :arena", function(sender, arena_name)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
local pos = vector.floor(minetest.get_player_by_name(sender):get_pos())
local function fill_chest_inv(chest, arena)
table.insert(arena.chests, pos)
end)
cmd:sub("removechest :arena", function(sender, arena_name)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
local pos = vector.floor(minetest.get_player_by_name(sender):get_pos())
table.remove(arena.chests, pos)
end)
end)
function skywars.fill_chests(arena)
for chest_pos in arena.chests do
fill_chest_inv(chest_pos, arena)
end
end
local function fill_chest_inv(chest_pos, arena)
local t_min = 4 -- minimum amount of treasures found in a chest
local t_max = 7 -- maximum amount of treasures found in a chest
local t_min = chest.min_treasures
local t_max = chest.max_treasures
local treasure_amount = math.ceil(math.random(t_min, t_max))
local minp = 0 --scale*4 -- minimal preciousness: 0..4
local maxp = 10 --scale*4+2.1 -- maximum preciousness: 2.1..6.1
local minp = chest.min_preciousness
local maxp = chest.max_preciousness
-- returns an itemstacks table that contains the chosen treasures
local treasures = skywars.select_random_treasures(treasure_amount, minp, maxp, arena)
local meta = minetest.get_meta(chest_pos)
local meta = minetest.get_meta(chest.pos)
local inv = meta:get_inventory()
for i=1, #treasures do
@ -48,8 +20,18 @@ local function fill_chest_inv(chest_pos, arena)
end
function skywars.place_chests(arena)
for chest_pos in arena.chests do
minetest.set_node(chest_pos, "default:chest")
function skywars.fill_chests(arena)
for i=1, #arena.chests do
fill_chest_inv(arena.chests[i], arena)
end
end
function skywars.place_chests(arena)
for i=1, #arena.chests do
minetest.add_node(arena.chests[i].pos, {name="default:chest"})
end
end

View File

@ -1,99 +1,6 @@
--Il necessario per aggiungere items possibili alle chest.
-- Select the treasures to put in the chests inventory
local mod = "skywars"
ChatCmdBuilder.new("skywars", function(cmd)
cmd:sub("addtreasure :treasure :rarity :preciousness :count :arena", function(sender, treasure_name, rarity, preciousness, count, arena_name)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
table.insert(arena.treasures, {name = treasure_name, rarity = rarity, count = count, preciousness = preciousness})
end)
cmd:sub("removetreasure :treasure :arena", function(sender, treasure_name, arena_name)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
table.remove(arena.treasures, {name = treasure_name, rarity, preciousness})
end)
end)
function skywars.select_random_treasures(treasure_amount, min_preciousness, max_preciousness, arena)
if #arena.treasures == 0 and treasure_amount >= 1 then
minetest.log("info","[treasurer] I was asked to return "..count.." treasure(s) but I cant return any because no treasure was registered to me.")
return {}
end
if treasure_amount == nil then treasure_amount = 1 end
local sum = 0
local cumulate = {}
local randoms = {}
-- copy treasures into helper table
local p_treasures = {}
for i=1,#arena.treasures do
table.insert(p_treasures, #arena.treasures[i])
end
if(min_preciousness ~= nil) then
-- filter out too unprecious treasures
for t=#p_treasures,1,-1 do
if((p_treasures[t].preciousness) < min_preciousness) then
table.remove(p_treasures,t)
end
end
end
if(max_preciousness ~= nil) then
-- filter out too precious treasures
for t=#p_treasures,1,-1 do
if(p_treasures[t].preciousness > max_preciousness) then
table.remove(p_treasures,t)
end
end
end
for t=1,#p_treasures do
sum = sum + p_treasures[t].rarity
cumulate[t] = sum
end
for c=1,count do
randoms[c] = math.random() * sum
end
local treasures = {}
for c=1,count do
for t=1,#p_treasures do
if randoms[c] < cumulate[t] then
table.insert(treasures, p_treasures[t])
break
end
end
end
local itemstacks = {}
for i=1,#treasures do
itemstacks[i] = treasure_to_itemstack(treasures[i])
end
if #itemstacks < count then
minetest.log("info","[treasurer] I was asked to return "..count.." treasure(s) but I could only return "..(#itemstacks)..".")
end
return itemstacks
end
local function treasure_to_itemstack(treasure)
local itemstack = {}
itemstack.name = treasure.name
itemstack.count = determine_count(treasure)
return ItemStack(itemstack)
end
local function determine_count(treasure)
if(type(treasure.count)=="number") then
@ -107,3 +14,88 @@ local function determine_count(treasure)
end
end
end
local function treasure_to_itemstack(treasure)
local itemstack = {}
itemstack.name = treasure.name
itemstack.count = determine_count(treasure)
return ItemStack(itemstack)
end
function skywars.select_random_treasures(treasure_amount, min_preciousness, max_preciousness, arena)
if #arena.treasures == 0 and treasure_amount >= 1 then
minetest.log("info","[treasurer] I was asked to return "..treasure_amount.." treasure(s) but I cant return any because no treasure was registered to me.")
return {}
end
if treasure_amount == nil or treasure_amount == 0 then treasure_amount = 1 end
-- sorting the table from the rarest to the least rare treasure, so that if one of them has rarity one
-- and it's at index one it doesn't prevent other treasures from appearing
for j=#arena.treasures, 2, -1 do
for i=1, #arena.treasures-1 do
if arena.treasures[i].rarity < arena.treasures[i+1].rarity then
local temp = arena.treasures[i]
arena.treasures[i] = arena.treasures[i+ 1]
arena.treasures[i + 1] = temp
end
end
end
-- helper table
local p_treasures = {}
-- copying arena.treasures in p_treasures
for i=1, #arena.treasures do
table.insert(p_treasures, arena.treasures[i])
end
if(min_preciousness ~= nil) then
-- filter out too unprecious treasures
for t=#p_treasures, 1, -1 do
if(p_treasures[t].preciousness < min_preciousness) then
table.remove(p_treasures,t)
end
end
end
if(max_preciousness ~= nil) then
-- filter out too precious treasures
for t=#p_treasures,1,-1 do
if(p_treasures[t].preciousness > max_preciousness) then
table.remove(p_treasures,t)
end
end
end
local treasures = {}
-- while the generated treasures are less then the desired amount
while #treasures < treasure_amount do
for c=1,treasure_amount do
-- if there isn't a treasure
if treasures[c] == nil then
for t=1,#p_treasures do
local random = math.random(1, 1000)
-- if the random number is a multiple of the item rarity then select it
if random % p_treasures[t].rarity == 0 then
table.insert(treasures, p_treasures[t])
end
end
end
end
end
local itemstacks = {}
for i=1,#treasures do
itemstacks[i] = treasure_to_itemstack(treasures[i])
end
if #itemstacks < treasure_amount then
minetest.log("info","[treasurer] I was asked to return "..treasure_amount.." treasure(s) but I could only return "..(#itemstacks)..".")
end
return itemstacks
end

58
_hud/hud_manager.lua Normal file
View File

@ -0,0 +1,58 @@
function skywars.generate_HUD(arena, pl_name)
local player = minetest.get_player_by_name(pl_name)
local players_
local background_
background_ = player:hud_add({
hud_elem_type = "image",
position = {x = 1, y = 1},
offset = {x = -109, y = -32},
text = "sw_players_hud.png",
alignment = { x = 1.0},
scale = { x = 3, y = 3},
number = 0xFFFFFF,
})
-- The number of players in the game
players_ = player:hud_add({
hud_elem_type = "text",
position = {x = 1, y = 1},
offset = {x = -85, y = -32},
text = arena.players_amount,
alignment = { x = 0},
scale = { x = 100, y = 100},
number = 0x7d7071,
})
-- Save the huds of each player
arena.HUDs[pl_name] = {background = background_, players = players_}
end
function skywars.remove_HUD(arena, pl_name)
local player = minetest.get_player_by_name(pl_name)
player:hud_remove(arena.HUDs[pl_name].background)
player:hud_remove(arena.HUDs[pl_name].players)
end
function skywars.update_player_counter(arena, players_updated)
local pl_amount = arena.players_amount
-- if arena.players_amount hasn't been updated yet
if players_updated == false then
pl_amount = pl_amount-1
end
-- updating the player counter HUD
for pl_name in pairs(arena.players) do
local player = minetest.get_player_by_name(pl_name)
player:hud_change(arena.HUDs[pl_name].players, "text", pl_amount)
end
end

View File

@ -1,3 +1,8 @@
--Crea i file delle mappe con world edit e li salva.
--Le mappe avranno delle proprietà settate per sapere dove siano le chest e fare i refill.
--Le posizioni delle chest possono essere salvate sulle properties della mappa come faccio per gli spawner sul MOBA.
-- Creates the schematic using pos1 (the first corner of the map) and pos2 (the second one)
function skywars.create_schematic(sender, pos1, pos2, name, arena)
minetest.create_schematic(pos1, pos2, nil, minetest.get_worldpath() .. "/" .. name .. ".mts", nil)
arena.schematic = minetest.get_worldpath() .. "/" .. name .. ".mts"
arena_lib.change_arena_property(sender, "skywars", arena.name, "pos1", pos1)
arena_lib.change_arena_property(sender, "skywars", arena.name, "schematic", arena.schematic)
end

View File

@ -1 +0,0 @@
--Carica il file della mappa quando inizia/finisce la partita, devo ancora decidermi.

View File

@ -1,71 +1,467 @@
local mod = "skywars"
ChatCmdBuilder.new("skywars", function(cmd)
ChatCmdBuilder.new("skywars",
function(cmd)
cmd:sub("create :arena", function(sender, arena_name)
arena_lib.create_arena(sender, mod, arena_name)
end)
cmd:sub("tutorial",
function(sender)
minetest.chat_send_player(sender, [[
These are the steps to follow in order to create and configure an
arena:
cmd:sub("create :arena :minplayers:int :maxplayers:int", function(sender, arena_name, min_players, max_players)
arena_lib.create_arena(sender, mod, arena_name, min_players, max_players)
end)
cmd:sub("create :arena :minplayers:int :maxplayers:int :killcap:int", function(sender, arena_name, min_players, max_players)
arena_lib.create_arena(sender, mod, arena_name, min_players, max_players)
local id, arena = arena_lib.get_arena_by_name("moba", arena_name)
end)
1) Creating the arena using:
-- rimozione arene
cmd:sub("remove :arena", function(sender, arena_name)
arena_lib.remove_arena(sender, mod, arena_name)
end)
/skywars create <arena name> [min players] [max players]
where min players is equal to the minimun amount of players to make
the arena start, and max players to the maximum amount of players that
an arena can have.
-- lista arene
cmd:sub("list", function(sender)
arena_lib.print_arenas(sender, mod)
end)
-- info su un'arena specifica
cmd:sub("info :arena", function(sender, arena_name)
arena_lib.print_arena_info(sender, mod, arena_name)
2) Editing the arena using:
/skywars edit <arena name>
in this menu you can add spawn points and set up the sign to enter the
arena: the spawn points are where the players will spawn when they
enter the arena, while the sign is just the way to enter it (by
clicking it).
3) Setting the arena treasures (the items that can spawn in the
chests):
item: the item name
rarity: how often it will spawn in chests (the rarity gap between two
treasures should be at least of 2)
preciousness: in which chests it can be put, for example a chest with
a preciousness range 2-4 can spawn just items with a preciousness
between 2 and 4
count: the item amount
/skywars addtreasure <arena name> <item> <rarity (min 2.0, max
1000.0)> <preciousness> <count>
4) Setting the chests in the arena using:
/skywars addchest <arena name> <min_preciousness> <max_preciousness>
<min_treasures_amount (min. 1)> <max_treasures_amount>
to add a chest use this command on the block you want it to spawn, it
will automatically be filled with the right items when the match
starts
5) Saving the map schematic using:
/skywars pos1
/skywars pos2
/skywars createschematic <arena name> <schematic_name>
in order to automatically reset the map on every match, you have to
create a schematic file; to do so, simply specify the corners of the
map by facing NORTH (you can press F5 to know where you're facing),
and by being sure pos1 Z is SMALLER than pos2 Z (/skywars pos1 and
/skywars pos2 to set the two corners).
!If you overwrite a schematic that you've already created before make
sure to reload the server, so that it can be loaded correctly, and
remember that the old schematic won't be deleted!
6) Enabling the arena using
/skywars enable <arena name>
Once you've done this you can click the sign and start playing :)
]])
end)
-- info su stats partita
cmd:sub("score :arena", function(sender, arena_name)
arena_lib.print_arena_stats(sender, mod, arena_name)
end)
-- create arena
cmd:sub("create :arena", function(name, arena_name)
arena_lib.create_arena(name, "skywars", arena_name)
end)
-- modifiche arena
--editor
cmd:sub("edit :arena", function(sender, arena)
arena_lib.enter_editor(sender, mod, arena)
end)
--inline
-- cartello arena
cmd:sub("create :arena :minplayers:int :maxplayers:int", function(name, arena_name, min_players, max_players)
arena_lib.create_arena(name, "skywars", arena_name, min_players, max_players)
end)
-- remove arena
cmd:sub("remove :arena", function(name, arena_name)
arena_lib.remove_arena(name, "skywars", arena_name)
end)
-- list of the arenas
cmd:sub("list", function(name)
arena_lib.print_arenas(name, "skywars")
end)
-- info on a specific arena
cmd:sub("info :arena", function(name, arena_name)
arena_lib.print_arena_info(name, "skywars", arena_name)
end)
-- this sets the spawns using the player position
cmd:sub("setspawn :arena", function(name, arena)
arena_lib.set_spawner(name, "skywars", arena)
end)
cmd:sub("setspawn :arena", function(name, arena)
arena_lib.set_spawner(name, "skywars", arena)
end)
-- this sets the arena's sign
cmd:sub("setsign :arena", function(sender, arena)
arena_lib.set_sign(sender, nil, nil, mod, arena)
arena_lib.set_sign(sender, nil, nil, "skywars", arena)
end)
-- spawner (ie. deleteall)
cmd:sub("setspawn :arena :param:text :ID:int", function(sender, arena, param, ID)
arena_lib.set_spawner(sender, mod, arena, param, ID)
-- enter editor mode
cmd:sub("edit :arena", function(sender, arena)
arena_lib.enter_editor(sender, "skywars", arena)
end)
cmd:sub("setspawn :arena", function(sender, arena)
arena_lib.set_spawner(sender, mod, arena)
-- enable and disable arenas
cmd:sub("enable :arena", function(name, arena)
arena_lib.enable_arena(name, "skywars", arena)
end)
-- abilitazione e disabilitazione arene
cmd:sub("enable :arena", function(sender, arena)
arena_lib.enable_arena(sender, mod, arena)
end)
cmd:sub("disable :arena", function(sender, arena)
arena_lib.disable_arena(sender, mod, arena)
end)
end)
cmd:sub("disable :arena", function(name, arena)
arena_lib.disable_arena(name, "skywars", arena)
end)
--------------------
-- ! CHEST CMDS ! --
--------------------
cmd:sub("addtreasure :arena :treasure :rarity:number :preciousness:int :count:int",
function(sender, arena_name, treasure_name, rarity, preciousness, count)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
return
elseif arena.enabled == true then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 must be disabled!", arena_name))
return
elseif count <= 0 then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Count has to be greater than 0!"))
return
elseif rarity < 2 then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Rarity has to be greater than 2!"))
return
elseif ItemStack(treasure_name):is_known() == false then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 doesn't exist!", treasure_name))
return
end
table.insert(arena.treasures, {name = treasure_name, rarity = rarity, count = count, preciousness = preciousness})
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Treasure added!"))
end)
cmd:sub("removetreasure :arena :treasure", function(sender, arena_name, treasure_name)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
local found = false
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
return
elseif arena.enabled == true then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 must be disabled!", arena_name))
return
end
for i=1, #arena.treasures do
if arena.treasures[i].name == treasure_name then
table.remove(arena.treasures, i)
found = true
break
end
end
arena_lib.change_arena_property(sender, "skywars", arena_name, "treasures", arena.treasures, false)
if found then minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Treasure removed!"))
else minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Treasure not found!")) end
end)
cmd:sub("copytreasures :fromarena :toarena", function(sender, from, to)
local id, from_arena = arena_lib.get_arena_by_name("skywars", from)
local id2, to_arena = arena_lib.get_arena_by_name("skywars", to)
local found = false
if from_arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("First arena not found!"))
return
elseif to_arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Second arena not found!"))
return
elseif from_arena == to_arena then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("The arenas must be different!"))
return
elseif to_arena.enabled == true then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 must be disabled!", to))
return
end
to_arena.treasures = {}
for i=1, #from_arena.treasures do
to_arena.treasures[i] = from_arena.treasures[i]
end
arena_lib.change_arena_property(sender, "skywars", to, "treasures", to_arena.treasures, false)
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 treasures have been copied to @2!", from, to))
end)
cmd:sub("gettreasures :arena", function(sender, arena_name)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
local found = false
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
return
end
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("TREASURES LIST:"))
for i=1, #arena.treasures do
local treasure = arena.treasures[i]
minetest.chat_send_player(sender, tostring(i) .. ".\n" ..
skywars.T(
"name: @1 @nrarity: @2 @npreciousness: @3 @ncount: @4",
treasure.name, treasure.rarity, treasure.preciousness, treasure.count
)
)
end
end)
cmd:sub("addchest :arena :minpreciousness:int :maxpreciousness:int :tmin:int :tmax:int",
function(sender, arena_name, min_preciousness, max_preciousness, t_min, t_max)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
local pos = vector.floor(minetest.get_player_by_name(sender):get_pos())
local chest =
{
pos = {x = pos.x, y= pos.y + 1, z = pos.z},
min_preciousness = min_preciousness,
max_preciousness = max_preciousness,
min_treasures = t_min,
max_treasures = t_max,
id = #arena.chests+1
}
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
return
elseif arena.enabled == true then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 must be disabled!", arena_name))
return
elseif t_min <= 0 or t_max <= 0 then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("The minimum or maximum amount of treasures has to be greater than 0!"))
return
end
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Chest added!"))
table.insert(arena.chests, chest)
arena_lib.change_arena_property(sender, "skywars", arena_name, "chests", arena.chests, false)
end)
cmd:sub("getchests :arena", function(sender, arena_name)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
local found = false
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
return
end
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("CHEST LIST:"))
for i=1, #arena.chests do
local chest_pos = tostring(arena.chests[i].pos.x) .. " " .. tostring(arena.chests[i].pos.y) .. " " .. tostring(arena.chests[i].pos.z)
minetest.chat_send_player(sender, skywars.T("ID: @1 - POSITION: @2", arena.chests[i].id, chest_pos))
end
end)
cmd:sub("removechest :arena :id:int", function(sender, arena_name, chest_id)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
local found = false
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
return
elseif arena.enabled == true then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 must be disabled!", arena_name))
return
end
for i=1, #arena.chests do
if arena.chests[i].id == chest_id then
table.remove(arena.chests, i)
found = true
break
end
end
arena_lib.change_arena_property(sender, "skywars", arena_name, "chests", arena.chests, false)
if found then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Chest removed!"))
else
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Chest not found!"))
end
end)
------------------
-- ! MAP CMDS ! --
------------------
cmd:sub("pos1", function(sender)
local player = minetest.get_player_by_name(sender)
player:get_meta():set_string("pos1", minetest.serialize(player:get_pos()))
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Position saved!"))
end)
cmd:sub("pos2", function(sender)
local player = minetest.get_player_by_name(sender)
player:get_meta():set_string("pos2", minetest.serialize(player:get_pos()))
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Position saved!"))
end)
cmd:sub("createschematic :arena :name",
function(sender, arena_name, name)
local id, arena = arena_lib.get_arena_by_name("skywars", arena_name)
local player = minetest.get_player_by_name(sender)
local pos1 = minetest.deserialize(player:get_meta():get_string("pos1"))
local pos2 = minetest.deserialize(player:get_meta():get_string("pos2"))
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
return
end
if arena.enabled == true then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("@1 must be disabled!", arena_name))
return
end
if pos1 == "" or pos2 == "" then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Pos1 or pos2 are not set!"))
return
end
skywars.create_schematic(sender, {x = pos1.x, y = pos1.y, z = pos1.z}, {x = pos2.x, y = pos2.y, z = pos2.z}, name, arena)
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Schematic @1 created! You can use /skywars info @2 to know its folder (see schematic=PATH)", name, arena_name))
end)
cmd:sub("getpos", function(sender)
function round(num, numDecimalPlaces)
return string.format("%." .. (numDecimalPlaces or 0) .. "f", num)
end
local pos = minetest.get_player_by_name(sender):get_pos()
local readable_pos = "[X Y Z] " .. round(pos.x, 1) .. " " .. round(pos.y, 1) .. " " .. round(pos.z, 1)
minetest.chat_send_player(sender, readable_pos)
end)
end, {
description = [[
Arena_lib:
- tutorial
- create <arena name> [min players] [max players]
- edit <arena name>
- remove <arena name>
- info <arena name>
- list
- enable <arena name>
- disable <arena name>
Skywars commands:
- addtreasure <arena name> <item> <rarity (min 2.0, max 1000.0)>
<preciousness> <count>
- removetreasure <arena name> <treasure name>
- gettreasures <arena name>
- copytreasures <(from) arena name> <(to) arena name>: this will copy
the first arena treasures in to the second one (! the second one will
be overwritten !)
- addchest <arena name> <min_preciousness> <max_preciousness>
<min_treasures_amount (min. 1)> <max_treasures_amount>
- removechest <id>
- getchests <arena name>: shows id and position of each chest
- pos1
- pos2
- createschematic <arena name> <pos1x> <pos1y> <pos1z> <pos2x> <pos2y>
<pos2z> <schematic_name>
- getpos
]],
privs = { skywars_admin = true }
})
minetest.register_privilege("skywars_admin", {
description = "With this you can use /skywars"
})

View File

@ -1 +1,2 @@
arena_lib
default

View File

@ -1,29 +1,43 @@
dofile(minetest.get_modpath("skywars") .. "/SETTINGS.lua")
skywars = {}
skywars.T = minetest.get_translator("skywars")
arena_lib.register_minigame("skywars", {
prefix = "[Skywars] ",
hub_spawn_point = { x = 8, y = 6, z = 4 },
prefix = skywars_settings.prefix,
hub_spawn_point = skywars_settings.hub_spawn_point,
join_while_in_progress = false,
celebration_time = 5,
celebration_time = skywars_settings.celebration_time,
loading_time = skywars_settings.loading_time,
queue_waiting_time = skywars_settings.queue_waiting_time,
temp_properties = {
HUDs = {}
},
properties = {
chests = {},
treasures = {}, --items da mettere nelle chest
},
temp_properties = {
kill_leader = "",
first_blood = "",
treasures = {}, -- items to put in the chests
schematic = "",
pos1 = {},
reset = false
},
player_properties = {
killstreak = 0,
speed = skywars_settings.player_speed
}
})
dofile(minetest.get_modpath("skywars") .. "/chatcmdbuilder.lua")
dofile(minetest.get_modpath("skywars") .. "/_hud/hud_manager.lua")
dofile(minetest.get_modpath("skywars") .. "/commands.lua")
dofile(minetest.get_modpath("skywars") .. "/_chest_handler/chest_setter.lua")
dofile(minetest.get_modpath("skywars") .. "/_chest_handler/chest.lua")
dofile(minetest.get_modpath("skywars") .. "/_chest_handler/treasures.lua")
dofile(minetest.get_modpath("skywars") .. "/_map_handler/map_create.lua")
dofile(minetest.get_modpath("skywars") .. "/_map_handler/map_gen.lua")
dofile(minetest.get_modpath("skywars") .. "/_arena_lib/arena_manager.lua")
local schematic_manager = minetest.request_insecure_environment()
function skywars.save_schematic(pos1, pos2, name, arena)
minetest.create_schematic(p1, p2, nil, minetest.get_worldpath() .. "\\" .. name, nil)
end

31
locale/skywars.it.tr Normal file
View File

@ -0,0 +1,31 @@
# version 1.0.0
# author(s): Giov4
# reviewer(s):
# textdomain: skywars
Arena not found!=Arena non trovata!
Count has to be greater than 0!=La quantità deve essere maggiore di 0
Rarity has to be greater than 2!=La rarità deve essere maggiore di 2
@1 doesn't exist!=@1 non esiste!
Treasure added!=Tesoro aggiunto!
Treasure removed!=Tesoro rimosso!
Treasure not found!=Tesoro non trovato!
The minimum or maximum amount of treasures has to be greater than 0!=Il numero minimo o massimo di tesori deve essere maggiore di 0!
TREASURES LIST:=Lista dei tesori:
First arena not found!=Prima arena non trovata!
Second arena not found!=Seconda arena non trovata!
@1 treasures have been copied to @2!=I tesori di @1 sono stati copiati in @2!
The arenas must be different!=Le arene devono essere diverse!
# @n means "newline"
name: @1 @nrarity: @2 @npreciousness: @3 @ncount: @4=nome: @1 @nrarità: @2 @npreziosità: @3 @nquantità: @4
Chest added!=Cassa aggiunta!
Chest removed!=Cassa rimossa!
Chest not found!=Cassa non trovata!
CHEST LIST:=LISTA DI CASSE
ID: @1 - POSITION: @2=ID: @1 - POSIZIONE: @2
Position saved!=Posizione salvata
Schematic @1 created! You can use /skywars info @2 to know its folder (see schematic@=PATH)=Schematica @1 creata! Puoi usare /skywars info @2 per sapere dove è salvata (vedi schematic@=PERCORSO)
@1 must be disabled!=@1 deve essere disabilitata!
Pos1 or pos2 are not set!=Pos1 o pos2 non sono impostate
@1 was killed by @2=@1 è stato ucciso da @2
@1 is dead=@1 è morto

31
locale/template.txt Normal file
View File

@ -0,0 +1,31 @@
# version 1.0.0
# author(s):
# reviewer(s):
# textdomain: skywars
Arena not found!=
Count has to be greater than 0!=
Rarity has to be greater than 2!=
@1 doesn't exist!=
Treasure added!=
Treasure removed!=
Treasure not found!=
TREASURES LIST:=
The minimum or maximum amount of treasures has to be greater than 0!=
First arena not found!=
Second arena not found!=
@1 treasures have been copied to @2!=
The arenas must be different!=
# @n means "newline"
name: @1 @nrarity: @2 @npreciousness: @3 @ncount: @4=
Chest added!=
Chest removed!=
Chest not found!=
CHEST LIST:=
ID: @1 - POSITION: @2=
Position saved!=
Schematic @1 created! You can use /skywars info @2 to know its folder (see schematic@=PATH)=
@1 must be disabled!=
Pos1 or pos2 are not set!=
@1 was killed by @2=
@1 is dead=

View File

@ -1,2 +1,2 @@
name = skywars
description = Frag'em
description = Skywars is a PvP minigame where players battle each other on floating islands until there is only one survivor remaining. Each player spawns on their own island and when the round begins must prepare for battle before crossing to the other islands and fighting.

BIN
textures/sw_players_hud.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B