skywars/_arena_lib/arena_callbacks.lua

303 lines
7.8 KiB
Lua

local function add_privs() end
local function remove_privs() end
local function create_barrier_cage() end
local function keep_teleporting() end
local function drop_items() end
minetest.register_on_joinplayer(function(player)
remove_privs(player:get_player_name())
end)
arena_lib.on_load("skywars", function(arena)
skywars.reset_map(arena)
for pl_name in pairs(arena.players) do
local player = minetest.get_player_by_name(pl_name)
create_barrier_cage(player)
player:get_inventory():add_item("main", "skywars:kit_selector")
end
arena_lib.HUD_send_msg_all(
"broadcast",
arena,
skywars.T("Select a kit using the item in your inventory"),
skywars_settings.loading_time
)
end)
arena_lib.on_start("skywars", function(arena)
arena.players_original_amount = arena.players_amount
arena.match_id = math.random(1, 9999999999)
skywars.place_chests(arena)
for pl_name in pairs(arena.players) do
local player = minetest.get_player_by_name(pl_name)
minetest.sound_play("sw_start", {to_player = pl_name})
add_privs(pl_name)
skywars.generate_HUD(arena, pl_name)
player:set_physics_override({
speed = skywars_settings.player_speed,
gravity=1,
jump=1
})
skywars.activate_enderpearl(player, arena)
player:get_inventory():remove_item("main", "skywars:kit_selector")
end
end)
arena_lib.on_celebration("skywars", function(arena, winner_name)
for pl_name in pairs(arena.players) do
local player = minetest.get_player_by_name(pl_name)
minetest.sound_play("sw_win", {to_player = pl_name})
remove_privs(pl_name)
skywars.block_enderpearl(player, arena)
end
skywars.reset_map(arena)
end)
arena_lib.on_end("skywars", function(arena, players)
for pl_name in pairs(players) do
local player = minetest.get_player_by_name(pl_name)
remove_privs(pl_name)
skywars.remove_HUD(arena, pl_name)
skywars.remove_armor(player)
end
end)
arena_lib.on_death("skywars", function(arena, pl_name, reason)
local player = minetest.get_player_by_name(pl_name)
if reason.type == "punch" then
if reason.object and reason.object:is_player() then
local killer = reason.object:get_player_name()
local killer_health = reason.object:get_hp()
arena_lib.send_message_players_in_arena(arena, skywars_settings.prefix .. skywars.T("@1 was killed by @2", pl_name, killer))
skywars.print_msg(pl_name, skywars.T("@1 killed you with @2 HPs", killer, killer_health))
skywars.increment_players_killed(killer)
end
end
for pl_name, _ in pairs(arena.players) do
minetest.sound_play("sw_pl_dead", {to_player = pl_name})
end
drop_items(player)
skywars.block_enderpearl(player, arena)
skywars.remove_armor(player)
arena_lib.remove_player_from_arena(pl_name, 1)
skywars.update_players_counter(arena)
end)
arena_lib.on_prequit("skywars", function(arena, pl_name)
if arena.in_loading then
return false
else
return true
end
end)
arena_lib.on_quit("skywars", function(arena, pl_name)
local player = minetest.get_player_by_name(pl_name)
remove_privs(pl_name)
skywars.update_players_counter(arena, false)
skywars.remove_HUD(arena, pl_name)
skywars.remove_armor(player)
skywars.block_enderpearl(player, arena)
end)
arena_lib.on_disconnect("skywars", function(arena, pl_name)
local player = minetest.get_player_by_name(pl_name)
skywars.update_players_counter(arena, false)
end)
arena_lib.on_kick("skywars", function(arena, pl_name)
local player = minetest.get_player_by_name(pl_name)
remove_privs(pl_name)
skywars.update_players_counter(arena, false)
skywars.remove_HUD(arena, pl_name)
skywars.remove_armor(player)
skywars.block_enderpearl(player, arena)
end)
arena_lib.on_enable("skywars", function(arena, pl_name)
local fast_enable = pl_name:find("@")
local arena_lib_translator = minetest.get_translator("arena_lib")
pl_name = pl_name:gsub("@", "")
if arena.treasures[1] == nil then
skywars.print_error(pl_name, skywars.T("You didn't set the treasures!"))
return false
elseif arena.chests[1] == nil then
skywars.print_error(pl_name, skywars.T("You didn't set the chests!"))
return false
elseif arena.min_pos.x == nil or arena.max_pos.x == nil then
skywars.print_error(pl_name, skywars.T("You didn't set the map corners!"))
return false
end
if not fast_enable then
skywars.print_msg(pl_name, skywars.T("The enabling process may take a few moments, please wait..."))
skywars.save_nodes_with_inventories(arena)
end
skywars.print_msg(pl_name, arena_lib_translator("Arena @1 successfully enabled", arena.name))
return true
end)
arena_lib.on_disable("skywars", function(arena, pl_name)
if arena.is_resetting then
skywars.print_error(pl_name, skywars.T("@1 is being reset!", arena.name))
return false
end
return true
end)
arena_lib.on_time_tick("skywars", function(arena)
skywars.kill_players_out_map(arena)
skywars.update_timer_hud(arena)
end)
arena_lib.on_timeout("skywars", function(arena)
arena_lib.load_celebration("skywars", arena, skywars.T("Nobody"))
arena_lib.send_message_players_in_arena(arena, skywars_settings.prefix .. skywars.T("Time is out, the match is over!"))
end)
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
if privs.noclip then
player:get_meta():set_string("sw_can_noclip", "true")
privs.noclip = nil
else
player:get_meta():set_string("sw_can_noclip", "false")
end
privs[skywars_settings.build_permission] = true
minetest.set_player_privs(pl_name, privs)
end
function remove_privs(pl_name)
local privs = minetest.get_player_privs(pl_name)
local player = minetest.get_player_by_name(pl_name)
if player:get_meta():get_string("sw_can_noclip") == "true" then
privs.noclip = true
end
if not privs.server and not privs["privs"] then
privs[skywars_settings.build_permission] = nil
end
minetest.set_player_privs(pl_name, privs)
end
function create_barrier_cage(player)
minetest.after(0.1, function()
local original_pos = player:get_pos()
local glass_nodes = {
{x = 0, y = -1, z = 0},
{x = 0, y = -2, z = 0},
{x = 1, y = 1, z = 0},
{x = -1, y = 1, z = 0},
{x = 0, y = 1, z = 1},
{x = 0, y = 1, z = -1},
{x = 0, y = 2, z = 0}
}
player:set_physics_override({gravity=0, jump=0})
player:add_player_velocity(vector.multiply(player:get_player_velocity(), -1))
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"})
minetest.after(skywars_settings.loading_time, function()
minetest.remove_node(node_pos)
end)
end
end
keep_teleporting(player, original_pos, skywars_settings.loading_time-1)
end)
end
function drop_items(player)
local inv = player:get_inventory():get_list("main")
local noise = 2
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_pos = {
x = random_x,
y = pl_pos.y,
z = random_z
}
minetest.item_drop(itemstack, player, random_pos)
end
end
function keep_teleporting(player, pos, seconds, current_second)
local step = 2
current_second = current_second or 1
if current_second > seconds then return end
minetest.after(step, function()
player:add_player_velocity(vector.multiply(player:get_player_velocity(), -1))
player:set_pos(pos)
keep_teleporting(player, pos, seconds, current_second + step)
end)
end