From 5580a06648b28729abf0326e28c353dc6397c837 Mon Sep 17 00:00:00 2001 From: Giov4 Date: Fri, 11 Sep 2020 20:43:04 +0200 Subject: [PATCH] Added kills counter HUD and some checks on arena_lib.on_enable --- SETTINGS.lua | 1 - TUTORIAL.txt | 10 ++-- _arena_lib/arena_manager.lua | 28 +++++++---- _chest_handler/treasures.lua | 2 +- _hud/hud_manager.lua | 60 +++++++++++++++++------ chatcmdbuilder.lua | 2 +- commands.lua | 81 ++++++++++++++++--------------- depends.txt | 2 +- init.lua | 17 +++++-- locale/skywars.it.tr | 5 +- locale/template.txt | 3 +- textures/sw_kill_counter_hud.png | Bin 0 -> 485 bytes 12 files changed, 132 insertions(+), 79 deletions(-) create mode 100644 textures/sw_kill_counter_hud.png diff --git a/SETTINGS.lua b/SETTINGS.lua index 973e5d7..bf1ef58 100644 --- a/SETTINGS.lua +++ b/SETTINGS.lua @@ -36,4 +36,3 @@ skywars_settings.show_minimap = false -- The players walking speed when ther're playing a match skywars_settings.player_speed = 1 - diff --git a/TUTORIAL.txt b/TUTORIAL.txt index 1402843..c78f689 100644 --- a/TUTORIAL.txt +++ b/TUTORIAL.txt @@ -32,7 +32,7 @@ between 2 and 4 count: the item amount /skywars addtreasure +20.0)> 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 -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 \ No newline at end of file diff --git a/_arena_lib/arena_manager.lua b/_arena_lib/arena_manager.lua index 1db6a82..04aa4fd 100644 --- a/_arena_lib/arena_manager.lua +++ b/_arena_lib/arena_manager.lua @@ -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) \ No newline at end of file diff --git a/_chest_handler/treasures.lua b/_chest_handler/treasures.lua index 85aec72..f75c71b 100644 --- a/_chest_handler/treasures.lua +++ b/_chest_handler/treasures.lua @@ -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 diff --git a/_hud/hud_manager.lua b/_hud/hud_manager.lua index 6220911..887c909 100644 --- a/_hud/hud_manager.lua +++ b/_hud/hud_manager.lua @@ -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 \ No newline at end of file diff --git a/chatcmdbuilder.lua b/chatcmdbuilder.lua index 705b965..64fbca5 100644 --- a/chatcmdbuilder.lua +++ b/chatcmdbuilder.lua @@ -303,4 +303,4 @@ local function run_tests() end if not minetest then run_tests() -end +end \ No newline at end of file diff --git a/commands.lua b/commands.lua index 0e84a70..9be99ed 100644 --- a/commands.lua +++ b/commands.lua @@ -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 + - addtreasure - removetreasure diff --git a/depends.txt b/depends.txt index 38be5d6..fa411de 100644 --- a/depends.txt +++ b/depends.txt @@ -1,2 +1,2 @@ arena_lib -default +default \ No newline at end of file diff --git a/init.lua b/init.lua index c3005b0..e422152 100644 --- a/init.lua +++ b/init.lua @@ -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 \ No newline at end of file diff --git a/locale/skywars.it.tr b/locale/skywars.it.tr index e1d23a2..5aa38fc 100644 --- a/locale/skywars.it.tr +++ b/locale/skywars.it.tr @@ -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 diff --git a/locale/template.txt b/locale/template.txt index 58df104..5335e1b 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -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= \ No newline at end of file diff --git a/textures/sw_kill_counter_hud.png b/textures/sw_kill_counter_hud.png new file mode 100644 index 0000000000000000000000000000000000000000..d21075503b94ab0a07a5fb5361ca61c1ba2a58ed GIT binary patch literal 485 zcmV_8o00053NklAs=9K~NmP#Y+2Qm9}W5Gp4M4(%d>AHYozM@3v~$I^BZzk`VV0!})+h_hhvaIh5v zb!aycw8?ZG^dxC)Ni_Z-LoS#9dw2gwE&^i=c6qMc0{}vV;QICk7gv(~A{zuZFUAQG zVz`&01X6S}HXBjQMigGJ2db(ug;J#RxdXKU0L&$dJ^*0+QYdBVe2yuUGKEqmMak}& z6eUcdl&Px5WH|^~4gvsr&HC=Li|}+;VZ4wXVu=V|2VVu|x!m zVITf@($aikwqCJbvwn~Pz5@WT81{E#94kBFvaR|D{&>oQc60lXllM*Hx%hPvOCoiAlSQaKL9a;B*W0 z@Jw*=$=5eZotDwS$<(*##pg@Sl!22P;9`8`m**aY13rTZM?S@NP3ha=7Db;hoqiaO z)8E15IVsetI5sn-P794p7W1VBV6y{;2_ZuE9>ID(-`}9B8rx^qF2Yf7Z<(!E2mO#p bXQJ=}1U