Optimized perfomance + code cleaning

master
Giov4 2021-02-10 01:42:45 +01:00
parent 22f7a4f8f4
commit 8b8a8542ff
13 changed files with 117 additions and 77 deletions

View File

@ -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 --

View File

@ -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,

View File

@ -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", {})

View File

@ -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

View File

@ -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

View File

@ -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
end
minetest.register_on_mods_loaded(function()
for i, arena in pairs(arena_lib.mods["skywars"].arenas) do
arena.is_resetting = false
end
end)

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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)
end

View File

@ -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")

25
nodes.lua Normal file
View File

@ -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"},
})

View File

@ -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