Added kills counter HUD and some checks on arena_lib.on_enable

master
Giov4 2020-09-11 20:43:04 +02:00
parent 7ec12de5e5
commit 5580a06648
12 changed files with 132 additions and 79 deletions

View File

@ -36,4 +36,3 @@ skywars_settings.show_minimap = false
-- The players walking speed when ther're playing a match
skywars_settings.player_speed = 1

View File

@ -32,7 +32,7 @@ between 2 and 4
count: the item amount
/skywars addtreasure <arena name> <item> <rarity (min 2.0, max
1000.0)> <preciousness> <count>
20.0)> <preciousness> <count>
4) Setting the chests in the arena using:
@ -62,9 +62,9 @@ remember that the old schematic won't be deleted!
6) Enabling the arena using
/skywars enable <arena name>
wars to read all the commands
To modify the game settings
Once you've done this you can click the sign and start playing :)
You can use /help sky (such as the messages prefix or the
hub spawn point) you can edit the SETTINGS.lua file
You can use /help skywars to read all the commands
To modify the game settings (such as the messages prefix or the
hub spawn point) you can edit the SETTINGS.lua file

View File

@ -12,12 +12,6 @@ end)
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)
@ -60,31 +54,45 @@ arena_lib.on_death("skywars", function(arena, pl_name, reason)
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))
-- arena.HUDs[killer].players_killed[1] == HUD ID
-- arena.HUDs[killer].players_killed[2] == players amount
reason.object:hud_change(arena.HUDs[killer].players_killed[1], "text", tostring(arena.HUDs[killer].players_killed[2] + 1))
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)
skywars.update_players_counter(arena)
end)
arena_lib.on_quit("skywars", function(arena, pl_name)
skywars.update_player_counter(arena, false)
skywars.update_players_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)
skywars.update_players_counter(arena, false)
end)
arena_lib.on_kick("skywars", function(arena, pl_name)
skywars.update_player_counter(arena, false)
skywars.update_players_counter(arena, false)
skywars.remove_HUD(arena, pl_name)
end)
arena_lib.on_enable("skywars", function(arena, pl_name)
if arena.treasures[1] == nil or arena.chests[1] == nil or arena.schematic == "" then
skywars.print_error(pl_name, skywars.T("@1 wasn't configured properly!", arena.name))
return false
end
return true
end)

View File

@ -79,7 +79,7 @@ function skywars.select_random_treasures(treasure_amount, min_preciousness, max_
-- if there isn't a treasure
if treasures[c] == nil then
for t=1,#p_treasures do
local random = math.random(1, 1000)
local random = math.random(1, 20)
-- if the random number is a multiple of the item rarity then select it
if random % p_treasures[t].rarity == 0 then

View File

@ -1,13 +1,14 @@
function skywars.generate_HUD(arena, pl_name)
local player = minetest.get_player_by_name(pl_name)
local players_
local background_
local players_killed_
local background_players_
local background_kill_counter_
background_ = player:hud_add({
background_players_counter_ = player:hud_add({
hud_elem_type = "image",
position = {x = 1, y = 1},
offset = {x = -109, y = -32},
position = {x = 1, y = 0.45},
offset = {x = -109, y = 80},
text = "sw_players_hud.png",
alignment = { x = 1.0},
scale = { x = 3, y = 3},
@ -15,18 +16,45 @@ function skywars.generate_HUD(arena, pl_name)
})
-- The number of players in the game
players_ = player:hud_add({
players_count_ = player:hud_add({
hud_elem_type = "text",
position = {x = 1, y = 1},
offset = {x = -85, y = -32},
position = {x = 1, y = 0.45},
offset = {x = -85, y = 80},
text = arena.players_amount,
alignment = { x = 0},
scale = { x = 100, y = 100},
number = 0x7d7071,
})
background_kill_counter_ = player:hud_add({
hud_elem_type = "image",
position = {x = 1, y = 0.45},
offset = {x = -109, y = 0},
text = "sw_kill_counter_hud.png",
alignment = { x = 1.0},
scale = { x = 3, y = 3},
number = 0xFFFFFF,
})
-- The number of players killed
players_killed_ = player:hud_add({
hud_elem_type = "text",
position = {x = 1, y = 0.45},
offset = {x = -85, y = 0},
text = 0,
alignment = { x = 0},
scale = { x = 100, y = 100},
number = 0x7d7071,
})
-- Save the huds of each player
arena.HUDs[pl_name] = {background = background_, players = players_}
arena.HUDs[pl_name] = {
background_players_counter = background_players_counter_,
players_count = players_count_,
-- HUD ID, amount of players killed
players_killed = {players_killed_, 0},
background_kill_counter = background_kill_counter_
}
end
@ -34,14 +62,16 @@ 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)
player:hud_remove(arena.HUDs[pl_name].background_players_counter)
player:hud_remove(arena.HUDs[pl_name].background_kill_counter)
player:hud_remove(arena.HUDs[pl_name].players_count)
player:hud_remove(arena.HUDs[pl_name].players_killed[1])
end
function skywars.update_player_counter(arena, players_updated)
function skywars.update_players_counter(arena, players_updated)
local pl_amount = arena.players_amount
-- if arena.players_amount hasn't been updated yet
@ -53,6 +83,6 @@ function skywars.update_player_counter(arena, players_updated)
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)
player:hud_change(arena.HUDs[pl_name].players_count, "text", pl_amount)
end
end
end

View File

@ -303,4 +303,4 @@ local function run_tests()
end
if not minetest then
run_tests()
end
end

View File

@ -5,11 +5,11 @@ function(cmd)
cmd:sub("tutorial",
function(sender)
minetest.chat_send_player(sender, [[
skywars.print_msg(sender, [[
(If you find it uncomfortable to read the tutorial from the chat
you can read it from a file in the mod folder called TUTORIAL.txt)
These are the steps to follow in order to create and configure an
arena:
@ -165,25 +165,28 @@ function(cmd)
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!"))
skywars.print_error(sender, 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))
skywars.print_error(sender, 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!"))
skywars.print_error(sender, 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!"))
skywars.print_error(sender, skywars.T("Rarity has to be greater than 2!"))
return
elseif rarity > 20 then
skywars.print_error(sender, skywars.T("Rarity has to be smaller than 21!"))
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))
skywars.print_error(sender, 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!"))
skywars.print_msg(sender, skywars.T("Treasure added!"))
end)
@ -193,10 +196,10 @@ function(cmd)
local found = false
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
skywars.print_error(sender, 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))
skywars.print_error(sender, skywars.T("@1 must be disabled!", arena_name))
return
end
@ -210,8 +213,8 @@ function(cmd)
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
if found then skywars.print_msg(sender, skywars.T("Treasure removed!"))
else skywars.print_error(sender, skywars.T("Treasure not found!")) end
end)
@ -222,16 +225,16 @@ function(cmd)
local found = false
if from_arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("First arena not found!"))
skywars.print_error(sender, 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!"))
skywars.print_error(sender, 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!"))
skywars.print_error(sender, 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))
skywars.print_error(sender, skywars.T("@1 must be disabled!", to))
return
end
@ -241,7 +244,7 @@ function(cmd)
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))
skywars.print_msg(sender, skywars.T("@1 treasures have been copied to @2!", from, to))
end)
@ -251,14 +254,14 @@ function(cmd)
local found = false
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
skywars.print_error(sender, skywars.T("Arena not found!"))
return
end
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("TREASURES LIST:"))
skywars.print_msg(sender, skywars.T("TREASURES LIST:"))
for i=1, #arena.treasures do
local treasure = arena.treasures[i]
minetest.chat_send_player(sender, tostring(i) .. ".\n" ..
skywars.print_msg(sender, tostring(i) .. ".\n" ..
skywars.T(
"name: @1 @nrarity: @2 @npreciousness: @3 @ncount: @4",
treasure.name, treasure.rarity, treasure.preciousness, treasure.count
@ -284,17 +287,17 @@ function(cmd)
}
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
skywars.print_error(sender, 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))
skywars.print_error(sender, 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!"))
skywars.print_error(sender, 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!"))
skywars.print_msg(sender, skywars.T("Chest added!"))
table.insert(arena.chests, chest)
arena_lib.change_arena_property(sender, "skywars", arena_name, "chests", arena.chests, false)
end)
@ -305,14 +308,14 @@ function(cmd)
local found = false
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
skywars.print_error(sender, skywars.T("Arena not found!"))
return
end
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("CHEST LIST:"))
skywars.print_msg(sender, 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))
skywars.print_msg(sender, skywars.T("ID: @1 - POSITION: @2", arena.chests[i].id, chest_pos))
end
end)
@ -323,10 +326,10 @@ function(cmd)
local found = false
if arena == nil then
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Arena not found!"))
skywars.print_error(sender, 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))
skywars.print_error(sender, skywars.T("@1 must be disabled!", arena_name))
return
end
@ -340,9 +343,9 @@ function(cmd)
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!"))
skywars.print_msg(sender, skywars.T("Chest removed!"))
else
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Chest not found!"))
skywars.print_error(sender, skywars.T("Chest not found!"))
end
end)
@ -356,7 +359,7 @@ function(cmd)
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!"))
skywars.print_msg(sender, skywars.T("Position saved!"))
end)
@ -366,7 +369,7 @@ function(cmd)
player:get_meta():set_string("pos2", minetest.serialize(player:get_pos()))
minetest.chat_send_player(sender, skywars_settings.prefix .. skywars.T("Position saved!"))
skywars.print_msg(sender, skywars.T("Position saved!"))
end)
@ -379,23 +382,23 @@ function(cmd)
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!"))
skywars.print_error(sender, 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))
skywars.print_error(sender, 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!"))
skywars.print_error(sender, 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))
skywars.print_msg(sender, skywars.T("Schematic @1 created! You can use /skywars info @2 to know its folder (see schematic=PATH)", name, arena_name))
end)
@ -409,7 +412,7 @@ function(cmd)
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)
skywars.print_msg(sender, readable_pos)
end)
end, {
@ -435,7 +438,7 @@ end, {
Skywars commands:
- addtreasure <arena name> <item> <rarity (min 2.0, max 1000.0)>
- addtreasure <arena name> <item> <rarity (min 2.0, max 20.0)>
<preciousness> <count>
- removetreasure <arena name> <treasure name>

View File

@ -1,2 +1,2 @@
arena_lib
default
default

View File

@ -27,6 +27,7 @@ arena_lib.register_minigame("skywars", {
})
dofile(minetest.get_modpath("skywars") .. "/chatcmdbuilder.lua")
dofile(minetest.get_modpath("skywars") .. "/_hud/hud_manager.lua")
dofile(minetest.get_modpath("skywars") .. "/commands.lua")
@ -37,7 +38,17 @@ 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)
---------------
-- ! UTILS ! --
---------------
function skywars.print_error(player, msg)
minetest.chat_send_player(player, minetest.colorize("#e6482e", skywars_settings.prefix .. msg))
end
function skywars.print_msg(player, msg)
minetest.chat_send_player(player, skywars_settings.prefix .. msg)
end

View File

@ -11,7 +11,7 @@ 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:
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!
@ -21,10 +21,11 @@ name: @1 @nrarity: @2 @npreciousness: @3 @ncount: @4=nome: @1 @nrarità: @2 @npr
Chest added!=Cassa aggiunta!
Chest removed!=Cassa rimossa!
Chest not found!=Cassa non trovata!
CHEST LIST:=LISTA DI CASSE
CHEST LIST:=LISTA DELLE 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 wasn't configured properly!=@1 non è stata configurata correttamente
@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

View File

@ -25,7 +25,8 @@ 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 wasn't configured properly!=
@1 must be disabled!=
Pos1 or pos2 are not set!=
@1 was killed by @2=
@1 is dead=
@1 is dead=

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 B