diff --git a/SETTINGS.lua b/SETTINGS.lua index fcaaeee..ace49e5 100644 --- a/SETTINGS.lua +++ b/SETTINGS.lua @@ -51,6 +51,21 @@ skywars_settings.background_height = 11 -- The x position offset from the background border of the first buttons row -- in real coordinates, the bigger it is the righter the row will be placed. +--[[ + 1.7 + |------|--------------------> x + | | + | * * * Background * * * + | * | * + | * | * + 6.6 ---*-- Button1 Button2 * --> FIRST ROW + | * Button3 Button4 * + | * * + | * * + | * * * * * * * * * * * * + | + \/ y +]] skywars_settings.starting_x = 1.7 -- The y position offset from the background border of the first buttons row @@ -72,6 +87,12 @@ skywars_settings.buttons_width = 1.8 -- The buttons height in real coordinates. skywars_settings.buttons_height = 1.6 + + + +-- AUTO EQUIP. SYSTEM -- + + -- The items importances that are used by the auto equip system: -- when a player takes an item from a chest, if it has a greater -- importance and it's in the same group of the one in the hotbar, @@ -113,6 +134,7 @@ skywars_settings.items_importances = { + -- MAP RESET SYSTEM SETTINGS -- diff --git a/_arena_lib/arena_callbacks.lua b/_arena_lib/arena_callbacks.lua index 4586e9c..16d72a2 100644 --- a/_arena_lib/arena_callbacks.lua +++ b/_arena_lib/arena_callbacks.lua @@ -3,6 +3,11 @@ local function remove_privs() end local function create_barrier_cage() end local function keep_teleporting() end local function drop_items() end +local update_timer_hud = skywars.update_timer_hud +local kill_players_out_map = skywars.kill_players_out_map +local add_node = minetest.add_node +local get_node = minetest.get_node +local remove_node = minetest.remove_node minetest.register_on_joinplayer(function(player) @@ -45,7 +50,7 @@ arena_lib.on_start("skywars", function(arena) skywars.generate_HUD(arena, pl_name) player:set_physics_override({ speed = skywars_settings.player_speed, - gravity=1, + gravity=1, jump=1 }) skywars.activate_enderpearl(player, arena) @@ -149,7 +154,7 @@ end) arena_lib.on_enable("skywars", function(arena, pl_name) - local fast_enable = pl_name:find("@") + local fast_enable = pl_name:find("@") local arena_lib_translator = minetest.get_translator("arena_lib") pl_name = pl_name:gsub("@", "") @@ -190,8 +195,8 @@ end) arena_lib.on_time_tick("skywars", function(arena) - skywars.kill_players_out_map(arena) - skywars.update_timer_hud(arena) + kill_players_out_map(arena) + update_timer_hud(arena) end) @@ -207,7 +212,7 @@ function add_privs(pl_name) local privs = minetest.get_player_privs(pl_name) local player = minetest.get_player_by_name(pl_name) - -- preventing players with noclip to fall when placing nodes + -- Preventing players with noclip to fall when placing nodes. if privs.noclip then player:get_meta():set_string("sw_can_noclip", "true") privs.noclip = nil @@ -256,10 +261,11 @@ function create_barrier_cage(player) for _, relative_pos in pairs(glass_nodes) do local node_pos = vector.round(vector.add(original_pos, relative_pos)) - if minetest.get_node(node_pos).name == "air" then - minetest.add_node(node_pos, {name="skywars:barrier"}) + + if get_node(node_pos).name == "air" then + add_node(node_pos, {name="skywars:barrier"}) minetest.after(skywars_settings.loading_time, function() - minetest.remove_node(node_pos) + remove_node(node_pos) end) end end @@ -276,8 +282,8 @@ function drop_items(player) for i, itemstack in pairs(inv) do local pl_pos = player:get_pos() - local random_x = pl_pos.x + math.random() + math.random(-noise, noise-1) - local random_z = pl_pos.z + math.random() + math.random(-noise, noise-1) + local random_x = pl_pos.x + math.random() + math.random(-noise-1, noise-1) + local random_z = pl_pos.z + math.random() + math.random(-noise-1, noise-1) local random_pos = { x = random_x, y = pl_pos.y, diff --git a/_chest_handler/chest_setter.lua b/_chest_handler/chest_setter.lua index 10a08a4..63181f1 100644 --- a/_chest_handler/chest_setter.lua +++ b/_chest_handler/chest_setter.lua @@ -1,10 +1,11 @@ local function fill_chests() end local function generate_particles() end - function skywars.place_chests(arena) + local add_node = minetest.add_node + for i=1, #arena.chests do - minetest.add_node(arena.chests[i].pos, {name="default:chest"}) + add_node(arena.chests[i].pos, {name="default:chest"}) end fill_chests(arena) end @@ -26,9 +27,12 @@ end function fill_chests(arena) + local get_meta = minetest.get_meta + local select_random_treasures = skywars.select_random_treasures + for i, chest in pairs(arena.chests) do - local treasures = skywars.select_random_treasures(chest, arena) - local meta = minetest.get_meta(chest.pos) + local treasures = select_random_treasures(chest, arena) + local meta = get_meta(chest.pos) local inv = meta:get_inventory() inv:set_list("main", {}) diff --git a/_chest_handler/treasures.lua b/_chest_handler/treasures.lua index 9b6c374..adbd299 100644 --- a/_chest_handler/treasures.lua +++ b/_chest_handler/treasures.lua @@ -1,5 +1,8 @@ -- Select the treasures to put in the chests inventory local mod = "skywars" +local random = math.random +local ceil = math.ceil +local table_insert = table.insert local function treasure_to_itemstack() end @@ -35,13 +38,13 @@ end function skywars.select_random_treasures(chest, arena) local preciousness_filtered_treasures = {} local generated_treasures = {} - local treasure_amount = math.ceil(math.random(chest.min_treasures, chest.max_treasures)) + local treasure_amount = ceil(random(chest.min_treasures, chest.max_treasures)) local treasures_to_be_generated = treasure_amount for i = 1, #arena.treasures do local treasure = arena.treasures[i] if treasure.preciousness >= chest.min_preciousness and treasure.preciousness <= chest.max_preciousness then - table.insert(preciousness_filtered_treasures, treasure) + table_insert(preciousness_filtered_treasures, treasure) end end @@ -49,13 +52,13 @@ function skywars.select_random_treasures(chest, arena) for i = 1, treasures_to_be_generated do if not generated_treasures[i] then for j = 1, #preciousness_filtered_treasures do - local random = math.random(1, 100) + local random = random(1, 100) local treasure_itemstack = treasure_to_itemstack(preciousness_filtered_treasures[j]) if treasure_itemstack == "error" then return generated_treasures end if treasure_itemstack and random % (preciousness_filtered_treasures[j].rarity * 10) == 0 then - table.insert(generated_treasures, treasure_itemstack) + table_insert(generated_treasures, treasure_itemstack) break end end diff --git a/_hud/hud_manager.lua b/_hud/hud_manager.lua index 7fb4d75..5a12cf0 100644 --- a/_hud/hud_manager.lua +++ b/_hud/hud_manager.lua @@ -1,8 +1,8 @@ local saved_huds = {} -- id = hud - +local get_player_by_name = minetest.get_player_by_name function skywars.generate_HUD(arena, pl_name) - local player = minetest.get_player_by_name(pl_name) + local player = get_player_by_name(pl_name) local players_count_ local players_killed_ local timer_ @@ -89,7 +89,7 @@ end function skywars.remove_HUD(arena, pl_name) - local player = minetest.get_player_by_name(pl_name) + local player = get_player_by_name(pl_name) for name, id in pairs(saved_huds[pl_name]) do if type(id) == "table" then id = id.id end @@ -109,7 +109,7 @@ function skywars.update_players_counter(arena, players_amount_updated) end for pl_name in pairs(arena.players) do - local player = minetest.get_player_by_name(pl_name) + local player = get_player_by_name(pl_name) if arena.players_original_amount == nil then return end @@ -121,7 +121,7 @@ end function skywars.increment_players_killed(pl_name) - local player = minetest.get_player_by_name(pl_name) + local player = get_player_by_name(pl_name) local players_killed = saved_huds[pl_name].players_killed.amount + 1 saved_huds[pl_name].players_killed.amount = players_killed @@ -132,7 +132,7 @@ end function skywars.update_timer_hud(arena) for pl_name in pairs(arena.players) do - local player = minetest.get_player_by_name(pl_name) + local player = get_player_by_name(pl_name) player:hud_change(saved_huds[pl_name].timer, "text", arena.current_time) end end \ No newline at end of file diff --git a/_map_handler/map_reset.lua b/_map_handler/map_reset.lua index 0c581bc..8978aa5 100644 --- a/_map_handler/map_reset.lua +++ b/_map_handler/map_reset.lua @@ -4,6 +4,7 @@ local function reset_node_inventory() end local deserialize = minetest.deserialize local add_node = minetest.add_node local get_node = minetest.get_node +local get_inventory = minetest.get_inventory local on_step = minetest.registered_entities["__builtin:item"].on_step minetest.registered_entities["__builtin:item"].match_id = -2 @@ -123,10 +124,18 @@ end function reset_node_inventory(pos) local location = {type="node", pos = pos} - local inv = minetest.get_inventory(location) + local inv = get_inventory(location) if inv then for index, list in ipairs(inv:get_lists()) do inv:set_list(list, {}) end end -end \ No newline at end of file +end + + + +minetest.register_on_mods_loaded(function() + for i, arena in pairs(arena_lib.mods["skywars"].arenas) do + arena.is_resetting = false + end +end) \ No newline at end of file diff --git a/_map_handler/map_saving.lua b/_map_handler/map_saving.lua index e03f480..4aa9dbb 100644 --- a/_map_handler/map_saving.lua +++ b/_map_handler/map_saving.lua @@ -1,4 +1,5 @@ local function save_node() end +local get_inventory = minetest.get_inventory minetest.register_on_placenode(function(pos, newnode, player, oldnode, itemstack, pointed_thing) @@ -73,7 +74,8 @@ function skywars.save_nodes_with_inventories(arena) local maps = skywars.load_table("maps") local manip = minetest.get_voxel_manip() local emerged_pos1, emerged_pos2 = manip:read_from_map(arena.min_pos, arena.max_pos) - local area = VoxelArea:new({MinEdge=emerged_pos1, MaxEdge=emerged_pos2}) + local emerged_area = VoxelArea:new({MinEdge=emerged_pos1, MaxEdge=emerged_pos2}) + local original_area = VoxelArea:new({MinEdge=arena.min_pos, MaxEdge=arena.max_pos}) local nodes = manip:get_data() local get_inventory = minetest.get_inventory local get_name_from_content_id = minetest.get_name_from_content_id @@ -84,11 +86,11 @@ function skywars.save_nodes_with_inventories(arena) maps[arena.name].always_to_be_reset_nodes = {} -- Saving every node with an inventory. - for i in area:iterp(emerged_pos1, emerged_pos2) do - local node_pos = area:position(i) - local location = {type="node", pos=node_pos} + for i in emerged_area:iterp(emerged_pos1, emerged_pos2) do + local node_pos = emerged_area:position(i) + local location = {type = "node", pos = node_pos} - if get_inventory(location) then + if original_area:containsp(node_pos) and get_inventory(location) then local node = get_node(node_pos) local serialized_pos = serialize(node_pos) diff --git a/_map_handler/map_utils.lua b/_map_handler/map_utils.lua index d3ee82e..0fbdf62 100644 --- a/_map_handler/map_utils.lua +++ b/_map_handler/map_utils.lua @@ -1,6 +1,9 @@ +local get_player_by_name = minetest.get_player_by_name + + function skywars.kill_players_out_map(arena) for pl_name in pairs(arena.players) do - local player = minetest.get_player_by_name(pl_name) + local player = get_player_by_name(pl_name) local pl_pos = player:get_pos() local min_pos = vector.add(arena.min_pos, 5) local max_pos = vector.subtract(arena.max_pos, 5) @@ -21,27 +24,9 @@ end -minetest.register_node("skywars:barrier", { - description = skywars.T("Unbreakable without skywars_admin priv transparent node"), - drawtype = "airlike", - paramtype = "light", - sunlight_propagates = true, - air_equivalent = true, - drop = "", - inventory_image = "sw_node_barrier.png", - wield_image = "sw_node_barrier.png", - groups = {oddly_breakable_by_hand = 2}, - can_dig = function(pos, player) - if minetest.get_player_privs(player:get_player_name()).skywars_admin then - return true - end - return false - end -}) - - - function skywars.iterate_area_nodes(min_pos, max_pos, func) + local get_node = minetest.get_node + for x = 1, max_pos.x - min_pos.x do for y = 1, max_pos.y - min_pos.y do for z = 1, max_pos.z - min_pos.z do @@ -50,7 +35,7 @@ function skywars.iterate_area_nodes(min_pos, max_pos, func) y = min_pos.y+y, z = min_pos.z+z } - local node = minetest.get_node(node_pos) + local node = get_node(node_pos) local func_result = func(node, node_pos) if func_result then return func_result end diff --git a/_player/auto_equip_items.lua b/_player/auto_equip_items.lua index 9f932cf..2e891bf 100644 --- a/_player/auto_equip_items.lua +++ b/_player/auto_equip_items.lua @@ -71,11 +71,9 @@ function compare_items(item1, item2) local item1_category, item1_importance = get_item_importance(item1) local item2_category, item2_importance = get_item_importance(item2) - if item1_category and item2_category then - if item1_category == item2_category then - if item1_importance > item2_importance then return item1 - elseif item1_importance < item2_importance then return item2 end - end + if (item1_category and item2_category) and (item1_category == item2_category) then + if item1_importance > item2_importance then return item1 + elseif item1_importance < item2_importance then return item2 end end end diff --git a/_tests/map_reset.lua b/_tests/map_reset.lua index 219dde7..30d868d 100644 --- a/_tests/map_reset.lua +++ b/_tests/map_reset.lua @@ -17,9 +17,10 @@ function skywars.test_async_speed(arena) local area_size = 10 local min_pos = arena.min_pos local max_pos = vector.add(min_pos, area_size) + local set_node = minetest.set_node skywars.iterate_area_nodes(min_pos, max_pos, function(node, node_pos) - minetest.set_node(node_pos, {name="skywars:test_node"}) + set_node(node_pos, {name="skywars:test_node"}) end) minetest.after(1, function() skywars.reset_map(arena, true) end) @@ -85,20 +86,4 @@ function get_nodes_at_arena_edges(arena) local node2 = minetest.get_node(arena.max_pos) return node1, node2 -end - - - -minetest.register_node("skywars:test_node", { - description = "Skywars test node, don't use it!", - groups = {crumbly=1, soil=1, dig_immediate=3}, - tiles = {"sw_node_test.png"}, -}) - - - -minetest.register_on_mods_loaded(function() - for i, arena in pairs(arena_lib.mods["skywars"].arenas) do - arena.is_resetting = false - end -end) \ No newline at end of file +end \ No newline at end of file diff --git a/init.lua b/init.lua index 9de3fb7..ddb28c9 100644 --- a/init.lua +++ b/init.lua @@ -32,6 +32,7 @@ arena_lib.register_minigame("skywars", { dofile(minetest.get_modpath("skywars") .. "/chatcmdbuilder.lua") +dofile(minetest.get_modpath("skywars") .. "/nodes.lua") dofile(minetest.get_modpath("skywars") .. "/utils.lua") dofile(minetest.get_modpath("skywars") .. "/_map_handler/map_utils.lua") dofile(minetest.get_modpath("skywars") .. "/_map_handler/map_reset.lua") diff --git a/nodes.lua b/nodes.lua new file mode 100644 index 0000000..b28a74e --- /dev/null +++ b/nodes.lua @@ -0,0 +1,25 @@ +minetest.register_node("skywars:barrier", { + description = skywars.T("Unbreakable without skywars_admin priv transparent node"), + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + air_equivalent = true, + drop = "", + inventory_image = "sw_node_barrier.png", + wield_image = "sw_node_barrier.png", + groups = {oddly_breakable_by_hand = 2}, + can_dig = function(pos, player) + if minetest.get_player_privs(player:get_player_name()).skywars_admin then + return true + end + return false + end +}) + + + +minetest.register_node("skywars:test_node", { + description = "Skywars test node, don't use it!", + groups = {crumbly=1, soil=1, dig_immediate=3}, + tiles = {"sw_node_test.png"}, +}) \ No newline at end of file diff --git a/utils.lua b/utils.lua index 326dbf2..7b9aa7b 100644 --- a/utils.lua +++ b/utils.lua @@ -27,7 +27,7 @@ end --- reordering the corners positions so that min_pos is smaller than max_pos +-- Reordering the corners positions so that min_pos is smaller than max_pos. function skywars.reorder_positions(min_pos, max_pos) local temp