136 lines
3.5 KiB
Lua
136 lines
3.5 KiB
Lua
local modpath = minetest.get_modpath("3d_armor")
|
|
|
|
dofile(modpath .. "/api.lua")
|
|
dofile(modpath .. "/armor.lua")
|
|
|
|
local S = armor.S
|
|
|
|
local function init_player_armor(initplayer)
|
|
local name = initplayer:get_player_name()
|
|
local armor_inv = minetest.create_detached_inventory(name .. "_armor", {
|
|
allow_put = function(_, _, index, stack, initplayer)
|
|
if initplayer:get_player_name() == name then
|
|
local item = minetest.registered_tools[stack:get_name()]
|
|
local group = item and item.groups
|
|
if group then
|
|
if group.armor_head and index == 1 then
|
|
return 1
|
|
end
|
|
if group.armor_torso and index == 2 then
|
|
return 1
|
|
end
|
|
if group.armor_legs and index == 3 then
|
|
return 1
|
|
end
|
|
if group.armor_feet and index == 4 then
|
|
return 1
|
|
end
|
|
end
|
|
end
|
|
return 0
|
|
end,
|
|
allow_take = function(_, _, _, stack, initplayer)
|
|
if initplayer:get_player_name() == name then
|
|
return stack:get_count()
|
|
end
|
|
return 0
|
|
end,
|
|
allow_move = function()
|
|
return 0
|
|
end,
|
|
on_put = function(_, _, _, _, initplayer)
|
|
armor:handle_inventory(initplayer)
|
|
end,
|
|
on_take = function(_, _, _, _, initplayer)
|
|
armor:handle_inventory(initplayer)
|
|
end
|
|
}, name)
|
|
|
|
armor_inv:set_size("armor", 4)
|
|
armor:load_armor_inventory(initplayer)
|
|
armor.def[name] = {
|
|
level = 0,
|
|
state = 0,
|
|
count = 0,
|
|
heal = 0
|
|
}
|
|
armor.textures[name] = {armor = "blank.png"}
|
|
minetest.after(1, function()
|
|
armor:handle_inventory(initplayer)
|
|
end)
|
|
end
|
|
|
|
local C = default.colors
|
|
|
|
armor:register_on_damage(function(player, _, stack)
|
|
local name = player:get_player_name()
|
|
local def = stack:get_definition()
|
|
if name and def and def.description and stack:get_wear() > 63500 then
|
|
minetest.chat_send_player(name, C.gold ..
|
|
S("Your @1 is almost broken!", (C.ruby .. def.description .. C.gold)))
|
|
minetest.sound_play("default_tool_breaks", {to_player = name})
|
|
end
|
|
end)
|
|
|
|
armor:register_on_destroy(function(player, _, stack)
|
|
local name = player:get_player_name()
|
|
local def = stack:get_definition()
|
|
if name and def and def.description then
|
|
minetest.chat_send_player(name, C.gold ..
|
|
S("Your @1 got destroyed!", (C.ruby .. def.description .. C.gold)))
|
|
minetest.sound_play("default_tool_breaks", {to_player = name, gain = 2.0})
|
|
end
|
|
end)
|
|
|
|
minetest.register_on_joinplayer(function(player)
|
|
local name = player:get_player_name()
|
|
minetest.after(0, function()
|
|
player = minetest.get_player_by_name(name)
|
|
if player then
|
|
init_player_armor(player)
|
|
end
|
|
end)
|
|
end)
|
|
|
|
minetest.register_on_leaveplayer(function(player)
|
|
local name = player:get_player_name()
|
|
if name then
|
|
armor.def[name] = nil
|
|
armor.textures[name] = nil
|
|
end
|
|
end)
|
|
|
|
minetest.register_on_dieplayer(function(player)
|
|
local name = player:get_player_name()
|
|
local pos = player:get_pos()
|
|
if name and pos then
|
|
local armor_inv = armor:get_armor_inventory(player)
|
|
if armor_inv then
|
|
for i = 1, armor_inv:get_size("armor") do
|
|
local stack = armor_inv:get_stack("armor", i)
|
|
if stack:get_count() > 0 then
|
|
minetest.item_drop(stack, nil, pos)
|
|
end
|
|
end
|
|
armor_inv:set_list("armor", {})
|
|
end
|
|
armor:handle_inventory(player)
|
|
end
|
|
end)
|
|
|
|
local random = math.random
|
|
minetest.register_on_player_hpchange(function(player, hp_change, reason)
|
|
if player and not (reason and reason.type and reason.type == "drown")
|
|
and hp_change < 0 then
|
|
local name = player:get_player_name()
|
|
if name then
|
|
local heal = armor.def[name].heal
|
|
if heal >= random(100) then
|
|
hp_change = 0
|
|
end
|
|
end
|
|
armor:update_armor(player)
|
|
end
|
|
return hp_change
|
|
end)
|