Added support for 3d_armor mod:

+ Custom hotbar equipment system
master
Giov4 2020-09-18 23:51:20 +02:00
parent 329a240973
commit 647f57242a
9 changed files with 194 additions and 2 deletions

View File

@ -21,6 +21,7 @@ arena_lib.on_start("skywars", function(arena)
for pl_name in pairs(arena.players) do
local player = minetest.get_player_by_name(pl_name)
skywars.activate_hotbar(player)
skywars.generate_HUD(arena, pl_name)
player:set_physics_override({speed=arena.players[pl_name].speed})
@ -34,7 +35,11 @@ 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)
skywars.deactivate_hotbar(player)
skywars.remove_HUD(arena, pl_name)
skywars.remove_all(player)
end
end)
@ -46,6 +51,7 @@ arena_lib.on_end("skywars", function(arena, players)
for pl_name in pairs(arena.players) do
local player = minetest.get_player_by_name(pl_name)
skywars.remove_all(player)
-- restore player's original speed
player:set_physics_override({speed=arena.players[pl_name].speed})
end
@ -54,6 +60,8 @@ 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 ~= nil and reason.object:is_player() then
local killer = reason.object:get_player_name()
@ -67,6 +75,8 @@ arena_lib.on_death("skywars", function(arena, pl_name, reason)
arena_lib.send_message_players_in_arena(arena, skywars_settings.prefix .. skywars.T("@1 is dead", pl_name))
end
skywars.remove_all(player)
skywars.deactivate_hotbar(player)
arena_lib.remove_player_from_arena(pl_name, 1)
skywars.update_players_counter(arena)
end)
@ -74,6 +84,7 @@ end)
arena_lib.on_quit("skywars", function(arena, pl_name)
skywars.deactivate_hotbar(minetest.get_player_by_name(pl_name))
skywars.update_players_counter(arena, false)
skywars.remove_HUD(arena, pl_name)
end)
@ -81,14 +92,21 @@ end)
arena_lib.on_disconnect("skywars", function(arena, pl_name)
local player = minetest.get_player_by_name(pl_name)
skywars.deactivate_hotbar(player)
skywars.update_players_counter(arena, false)
skywars.remove_all(player)
end)
arena_lib.on_kick("skywars", function(arena, pl_name)
arena_lib.on_kick("skywars", function(arena, pl_name)
local player = minetest.get_player_by_name(pl_name)
skywars.deactivate_hotbar(player)
skywars.update_players_counter(arena, false)
skywars.remove_HUD(arena, pl_name)
skywars.remove_all(player)
end)
@ -113,6 +131,10 @@ end)
arena_lib.on_timer_tick("skywars", function(arena)
arena.time_passed = arena.time_passed + 1
for pl_name in pairs(arena.players) do
skywars.apply_armor_slots(minetest.get_player_by_name(pl_name))
end
if arena.time_passed % 5 == 0 then
skywars.kill_players_out_map(arena)
end

View File

@ -0,0 +1,13 @@
for name in pairs(minetest.registered_items) do
if armor:get_element(name) ~= nil then
minetest.override_item(name, {
on_secondary_use = function(itemstack, user)
local pl_name = user:get_player_name()
local arena
if arena_lib.is_player_in_arena(pl_name, "skywars") and arena_lib.get_arena_by_player(pl_name).in_loading == false then
skywars.add_armor(minetest.get_player_by_name(pl_name), itemstack:get_name())
end
end
})
end
end

View File

@ -0,0 +1,21 @@
function skywars.activate_hotbar(player)
local meta = player:get_meta()
meta:set_string("hotbar", player:hud_get_hotbar_image())
meta:set_int("itemcount", player:hud_get_hotbar_itemcount())
meta:set_string("hotbar_selected", player:hud_get_hotbar_selected_image())
player:hud_set_hotbar_itemcount(10)
player:hud_set_hotbar_image("hotbar.png")
player:hud_set_hotbar_selected_image("hotbar_selected.png")
end
function skywars.deactivate_hotbar(player)
local meta = player:get_meta()
player:hud_set_hotbar_itemcount(meta:get_int("itemcount"))
player:hud_set_hotbar_image(meta:get_string("hotbar"))
player:hud_set_hotbar_selected_image(meta:get_string("hotbar_selected"))
end

View File

@ -0,0 +1,16 @@
minetest.register_on_mods_loaded(function()
local mod_exists = false
for i=1, #minetest.get_modnames() do
if minetest.get_modnames()[i] == "3d_armor" then
mod_exists = true
break
end
end
if mod_exists then
dofile(minetest.get_modpath("skywars") .. "/_compatible_mods/_3d_armor/utils.lua")
dofile(minetest.get_modpath("skywars") .. "/_compatible_mods/_3d_armor/hotbar.lua")
dofile(minetest.get_modpath("skywars") .. "/_compatible_mods/_3d_armor/armors.lua")
end
end)

View File

@ -0,0 +1,120 @@
local slot_type = {[0] = "feet", [1] = "legs", [2] = "torso", [3] = "head"}
local function move_armor_to_slot(player, armor_name)
local armor_type = armor:get_element(armor_name)
local slots = player:hud_get_hotbar_itemcount()
local inv = player:get_inventory()
local function switch_items(slot_offset)
local wielded_armor = inv:get_stack("main", slots-slot_offset)
inv:set_stack("main", slots-slot_offset, ItemStack(armor_name))
minetest.after(0, function() inv:set_stack("main", player:get_wield_index(), ItemStack(wielded_armor:get_name())) end)
end
-- if the armor is equal to one of the slot types then switch the items
for i=0, 4 do
if armor_type == slot_type[i] then
switch_items(i)
end
end
end
local function get_weared_armor(player)
local pl_name, armor_inv = armor:get_valid_player(player, "[add_armor_inventory]")
local weared_armor = {} -- "type" = "armor"
-- Stores the weared armor types and items
for i=1, armor_inv:get_size("armor") do
local item_name = armor_inv:get_stack("armor", i):get_name()
local type = armor:get_element(item_name)
if type ~= nil then
weared_armor[type] = item_name
end
end
return weared_armor
end
function skywars.add_armor(player, armor_name, update_slots)
local pl_name, armor_inv = armor:get_valid_player(player, "[add_armor_inventory]")
if not pl_name then
return
elseif armor:get_element(armor_name) == nil then
return
end
local weared_armor = get_weared_armor(player)
local armor_type = armor:get_element(armor_name) -- (the type is called element by 3d_armor)
-- Checks if there's an armor with this type already
if weared_armor[armor_type] ~= nil then
armor_inv:remove_item("armor", ItemStack(weared_armor[armor_type]))
end
armor_inv:add_item("armor", ItemStack(armor_name))
if update_slots == nil or update_slots then move_armor_to_slot(player, armor_name) end
armor:set_player_armor(player)
armor:save_armor_inventory(player)
end
function skywars.remove_all(player)
local name, armor_inv = armor:get_valid_player(player, "[remove_all]")
if not name then
return
end
armor_inv:set_list("armor", {})
armor:set_player_armor(player)
armor:save_armor_inventory(player)
end
function skywars.remove_armor(player, armor_name)
local pl_name, armor_inv = armor:get_valid_player(player, "[add_armor_inventory]")
if not pl_name then
return
elseif armor:get_element(armor_name) == nil then
return
end
armor_inv:remove_item("armor", ItemStack(armor_name))
armor:set_player_armor(player)
armor:save_armor_inventory(player)
end
function skywars.apply_armor_slots(player)
local name, armor_inv = armor:get_valid_player(player, "[apply_slots]")
if not name then return end
local slots = player:hud_get_hotbar_itemcount()
local inv = player:get_inventory()
local weared_armor = get_weared_armor(player) -- "type" = "armor"
local function get_armor_type(slot_offset) return armor:get_element(inv:get_stack("main", slots-slot_offset):get_name()) end
-- iterate over each armor slot
for slot = 0, 4 do
-- if the slot is empty remove that armor type, otherwise add the armor that it contains
if get_armor_type(slot) == nil and weared_armor[slot_type[slot]] ~= nil then
skywars.remove_armor(player, weared_armor[slot_type[slot]])
-- if the slot contains an armor and it is the same as the slot type equip it
elseif get_armor_type(slot) ~= nil and get_armor_type(slot) == slot_type[slot] then
skywars.add_armor(player, inv:get_stack("main", slots-slot):get_name(), false)
end
end
end

View File

@ -1,6 +1,5 @@
ChatCmdBuilder.new("skywars",
function(cmd)
cmd:sub("tutorial",
function(sender)
skywars.print_msg(sender, [[

View File

@ -33,6 +33,7 @@ arena_lib.register_minigame("skywars", {
dofile(minetest.get_modpath("skywars") .. "/chatcmdbuilder.lua")
dofile(minetest.get_modpath("skywars") .. "/_compatible_mods/_3d_armor/init.lua")
dofile(minetest.get_modpath("skywars") .. "/_storage/storage_manager.lua")
dofile(minetest.get_modpath("skywars") .. "/_hud/hud_manager.lua")
dofile(minetest.get_modpath("skywars") .. "/commands.lua")

BIN
textures/hotbar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B