205 lines
5.3 KiB
Lua
205 lines
5.3 KiB
Lua
local leg_immobilize_mul = pvp_revamped.config.leg_immobilize_mul
|
|
local player_data = pvp_revamped.player_data
|
|
local get_player_data = pvp_revamped.get_player_data
|
|
local player_persistent_data = pvp_revamped.player_persistent_data
|
|
local remove_text_center = pvp_revamped.remove_text_center
|
|
local clear_blockdata = pvp_revamped.clear_blockdata
|
|
local clear_shielddata = pvp_revamped.clear_shielddata
|
|
local set_immobilize_data = pvp_revamped.set_immobilize_data
|
|
local get_player_by_name = minetest.get_player_by_name
|
|
local add_item = minetest.add_item
|
|
local new = vector.new
|
|
local max = math.max
|
|
local min = math.min
|
|
|
|
-- Create an empty data sheet for the player.
|
|
minetest.register_on_joinplayer(function(player)
|
|
player_persistent_data[player:get_player_name()] = {
|
|
damage_texture_modifier = player:get_properties().damage_texture_modifier,
|
|
throw_style = player:get_meta():get_int("pvp_revamped.throw_style")
|
|
}
|
|
end)
|
|
|
|
-- Immobilize the player on fall.
|
|
minetest.register_on_player_hpchange(function(player, hp_change, reason)
|
|
local data = get_player_data(player:get_player_name())
|
|
local dmg = max(hp_change - player:get_hp(), 1)
|
|
local speed = min(1 / dmg * leg_immobilize_mul, 0.01)
|
|
|
|
if reason.type == "fall" then
|
|
data.immobilize = set_immobilize_data(player, speed, hp_change)
|
|
end
|
|
end)
|
|
|
|
-- Drops an item at the given or player's position.
|
|
local function drop(player, item, pos)
|
|
-- Check if the param is true or not.
|
|
if not pos then
|
|
-- Get the player's position.
|
|
pos = player:get_pos()
|
|
end
|
|
|
|
-- Create the item.
|
|
local obj = add_item(pos, item)
|
|
|
|
if obj then
|
|
obj:get_luaentity().collect = true
|
|
end
|
|
end
|
|
|
|
-- Clear up memory if the player leaves.
|
|
-- Drop any item the player is about to throw on leave.
|
|
-- Remove the shield entity.
|
|
minetest.register_on_leaveplayer(function(player)
|
|
local name = player:get_player_name()
|
|
local pdata = player_data[name]
|
|
|
|
player_persistent_data[name] = nil
|
|
|
|
if not pdata then
|
|
return
|
|
end
|
|
|
|
local throw_data = pdata.throw
|
|
|
|
if throw_data then
|
|
drop(player, throw_data.item)
|
|
end
|
|
|
|
local entity = pdata.entity
|
|
|
|
if entity then
|
|
entity.object:remove()
|
|
end
|
|
|
|
if pdata.block then
|
|
remove_text_center(player, "pvp_revamped:block_pool")
|
|
end
|
|
|
|
if pdata.shield then
|
|
remove_text_center(player, "pvp_revamped:shield_pool")
|
|
end
|
|
|
|
player_data[name] = nil
|
|
end)
|
|
|
|
-- Drop any item the player is about to throw on death.
|
|
-- Remove the shield entity.
|
|
minetest.register_on_dieplayer(function(player)
|
|
local name = player:get_player_name()
|
|
local pdata = player_data[name]
|
|
local old_ppd = player_persistent_data[name]
|
|
|
|
player_persistent_data[name] = {
|
|
damage_texture_modifier = old_ppd.damage_texture_modifier,
|
|
throw_style = old_ppd.throw_style
|
|
}
|
|
|
|
if not pdata then
|
|
return
|
|
end
|
|
|
|
local throw_data = pdata.throw
|
|
|
|
if throw_data then
|
|
drop(player, throw_data.item)
|
|
end
|
|
|
|
local entity = pdata.entity
|
|
|
|
if entity then
|
|
entity.object:remove()
|
|
end
|
|
|
|
local aim = pdata.aim
|
|
|
|
if aim then
|
|
-- Drop hand.
|
|
player:set_bone_position(aim.bone, aim.position, new(-180, 0, 0))
|
|
end
|
|
|
|
if pdata.immobilize then
|
|
player:set_physics_override({speed = 1, jump = 1})
|
|
end
|
|
|
|
if pdata.block then
|
|
remove_text_center(player, "pvp_revamped:block_pool")
|
|
end
|
|
|
|
if pdata.shield then
|
|
remove_text_center(player, "pvp_revamped:shield_pool")
|
|
end
|
|
|
|
player_data[name] = nil
|
|
end)
|
|
|
|
-- Drop any item the player is about to throw on shutdown.
|
|
-- Remove the shield entity.
|
|
minetest.register_on_shutdown(function()
|
|
for k, v in pairs(player_data) do
|
|
local throw_data = v.throw
|
|
|
|
if throw_data then
|
|
drop(get_player_by_name(k), throw_data.item)
|
|
end
|
|
end
|
|
end)
|
|
|
|
minetest.register_on_player_inventory_action(function(player)
|
|
local name = player:get_player_name()
|
|
|
|
if not player_data or not player_data[name] then
|
|
return
|
|
end
|
|
|
|
local pdata = player_data[name]
|
|
local data_shield = pdata.shield
|
|
|
|
if data_shield and not data_shield.armor_inv and player:get_wielded_item():get_name() ~= data_shield.name then
|
|
player_data[name].shield = nil
|
|
|
|
-- Remove un-used hud element.
|
|
remove_text_center(player, "pvp_revamped:shield_pool")
|
|
end
|
|
|
|
local data_block = pdata.block
|
|
|
|
if data_block and player:get_wielded_item():get_name() ~= data_block.name then
|
|
player_data[name].block = nil
|
|
|
|
-- Remove un-used hud element.
|
|
remove_text_center(player, "pvp_revamped:block_pool")
|
|
end
|
|
end)
|
|
|
|
local function break_guard(player, name)
|
|
if not player_data or not player_data[name] then
|
|
return
|
|
end
|
|
|
|
local pdata = player_data[name]
|
|
|
|
clear_shielddata(pdata.shield, player, name)
|
|
clear_blockdata(pdata.block, player, name)
|
|
|
|
player_data[name] = pdata
|
|
end
|
|
|
|
minetest.register_on_placenode(function(pos, newnode, placer)
|
|
if placer then
|
|
local name = placer:get_player_name()
|
|
|
|
-- Break guard if player placed a node.
|
|
break_guard(placer, name)
|
|
end
|
|
end)
|
|
|
|
minetest.register_on_dignode(function(pos, oldnode, digger)
|
|
if digger then
|
|
local name = digger:get_player_name()
|
|
|
|
-- Break guard if player dug a node.
|
|
break_guard(digger, name)
|
|
end
|
|
end)
|