tweak and tidy code

This commit is contained in:
tenplus1 2024-09-22 14:28:20 +01:00
parent a03ad5c299
commit 95aefe56e3

199
init.lua
View File

@ -1,22 +1,15 @@
--[[ --[[
walking on ice makes player walk faster, walking on ice makes player walk faster, stepping through snow slows player down,
stepping through snow slows player down, touching a cactus hurts player, suffocation when head is inside solid node,
touching a cactus hurts player, player knock-back effects when punched, check for node on_walk_over function.
suffocation when head is inside solid node,
player knock-back effects when punched.
PlayerPlus by TenPlus1 PlayerPlus by TenPlus1
]] ]]
playerplus = {} playerplus = {}
-- cache if player_monoids mod active?
local monoids = minetest.get_modpath("player_monoids")
local pova_mod = minetest.get_modpath("pova")
-- get node but use fallback for nil or unknown -- get node but use fallback for nil or unknown
local node_ok = function(pos, fallback) local node_ok = function(pos, fallback)
local node = minetest.get_node_or_nil(pos) local node = minetest.get_node_or_nil(pos)
@ -28,46 +21,41 @@ local node_ok = function(pos, fallback)
return fallback or "air" return fallback or "air"
end end
-- mod check and timer set
local monoids = minetest.get_modpath("player_monoids")
local pova_mod = minetest.get_modpath("pova")
local armor_mod = minetest.get_modpath("3d_armor") local armor_mod = minetest.get_modpath("3d_armor")
local time = 0 local timer = 0
-- main function run for each player
minetest.register_globalstep(function(dtime) minetest.register_globalstep(function(dtime)
time = time + dtime -- one second timer
timer = timer + dtime ; if timer < 1 then return end ; timer = 0
-- every 1 second
if time < 1 then
return
end
-- reset time for next check
time = 0
-- define locals outside loop -- define locals outside loop
local name, pos, ndef, def, nslow, nfast, prop local name, pos, ndef, def, nslow, nfast, prop
-- get list of players
local players = minetest.get_connected_players()
-- loop through players -- loop through players
for _,player in pairs(players) do for _,player in pairs(minetest.get_connected_players()) do
-- who am I? -- who am I?
name = player:get_player_name() name = player:get_player_name()
if name and playerplus[name] then if name and playerplus[name] then
-- where am I? -- where am I?
pos = player:get_pos() pos = player:get_pos()
-- what is around me? -- node standing on
playerplus[name].nod_stand = node_ok({ playerplus[name].nod_stand = node_ok(
x = pos.x, y = pos.y - 0.1, z = pos.z}) {x = pos.x, y = pos.y - 0.1, z = pos.z})
-- Does the node below me have an on_walk_over function set? -- Does the node below me have an on_walk_over function set?
ndef = minetest.registered_nodes[playerplus[name].nod_stand] ndef = minetest.registered_nodes[playerplus[name].nod_stand]
if ndef and ndef.on_walk_over then if ndef and ndef.on_walk_over then
ndef.on_walk_over(pos, ndef, player) ndef.on_walk_over(pos, ndef, player)
end end
@ -75,17 +63,18 @@ if name and playerplus[name] then
prop = player:get_properties() prop = player:get_properties()
-- node at eye level -- node at eye level
playerplus[name].nod_head = node_ok({ playerplus[name].nod_head = node_ok(
x = pos.x, y = pos.y + prop.eye_height, z = pos.z}) {x = pos.x, y = pos.y + prop.eye_height, z = pos.z})
-- node at foot level -- node at foot level
playerplus[name].nod_feet = node_ok({ playerplus[name].nod_feet = node_ok(
x = pos.x, y = pos.y + 0.2, z = pos.z}) {x = pos.x, y = pos.y + 0.2, z = pos.z})
-- get player physics -- get player physics
def = player:get_physics_override() def = player:get_physics_override()
if armor_mod and armor and armor.def then if armor_mod and armor and armor.def then
-- get player physics from armor -- get player physics from armor
def.speed = armor.def[name].speed or def.speed def.speed = armor.def[name].speed or def.speed
def.jump = armor.def[name].jump or def.jump def.jump = armor.def[name].jump or def.jump
@ -110,16 +99,16 @@ if name and playerplus[name] then
-- apply speed changes -- apply speed changes
if nfast and not playerplus[name].nfast then if nfast and not playerplus[name].nfast then
if monoids then if pova_mod then
playerplus[name].nfast = player_monoids.speed:add_change(
player, def.speed + 0.4)
elseif pova_mod then
pova.add_override(name, "playerplus:nfast", {speed = 0.4}) pova.add_override(name, "playerplus:nfast", {speed = 0.4})
pova.do_override(player) pova.do_override(player)
elseif monoids then
playerplus[name].nfast = player_monoids.speed:add_change(
player, def.speed + 0.4)
else else
def.speed = def.speed + 0.4 def.speed = def.speed + 0.4
end end
@ -128,17 +117,17 @@ if name and playerplus[name] then
elseif not nfast and playerplus[name].nfast then elseif not nfast and playerplus[name].nfast then
if monoids then if pova_mod then
player_monoids.speed:del_change(player, playerplus[name].nfast)
playerplus[name].nfast = nil
elseif pova_mod then
pova.del_override(name, "playerplus:nfast") pova.del_override(name, "playerplus:nfast")
pova.do_override(player) pova.do_override(player)
elseif monoids then
player_monoids.speed:del_change(player, playerplus[name].nfast)
playerplus[name].nfast = nil
else else
def.speed = def.speed - 0.4 def.speed = def.speed - 0.4
end end
@ -149,16 +138,16 @@ if name and playerplus[name] then
-- apply slowdown changes -- apply slowdown changes
if nslow and not playerplus[name].nslow then if nslow and not playerplus[name].nslow then
if monoids then if pova_mod then
playerplus[name].nslow = player_monoids.speed:add_change(
player, def.speed - 0.3)
elseif pova_mod then
pova.add_override(name, "playerplus:nslow", {speed = -0.3}) pova.add_override(name, "playerplus:nslow", {speed = -0.3})
pova.do_override(player) pova.do_override(player)
elseif monoids then
playerplus[name].nslow = player_monoids.speed:add_change(
player, def.speed - 0.3)
else else
def.speed = def.speed - 0.3 def.speed = def.speed - 0.3
end end
@ -167,17 +156,17 @@ if name and playerplus[name] then
elseif not nslow and playerplus[name].nslow then elseif not nslow and playerplus[name].nslow then
if monoids then if pova_mod then
player_monoids.speed:del_change(player, playerplus[name].nslow)
playerplus[name].nslow = nil
elseif pova_mod then
pova.del_override(name, "playerplus:nslow") pova.del_override(name, "playerplus:nslow")
pova.do_override(player) pova.do_override(player)
elseif monoids then
player_monoids.speed:del_change(player, playerplus[name].nslow)
playerplus[name].nslow = nil
else else
def.speed = def.speed + 0.3 def.speed = def.speed + 0.3
end end
@ -188,17 +177,12 @@ if name and playerplus[name] then
-- set player physics -- set player physics
if not monoids and not pova_mod then if not monoids and not pova_mod then
player:set_physics_override({ player:set_physics_override(
speed = def.speed, {speed = def.speed, jump = def.jump, gravity = def.gravity})
jump = def.jump,
gravity = def.gravity
})
end end
--[[
print ("Speed: " .. def.speed --print ("Speed: " .. def.speed .. " / Jump: " .. def.jump .. " / Gravity: " .. def.gravity)
.. " / Jump: " .. def.jump
.. " / Gravity: " .. def.gravity)
]]
-- Is player suffocating inside a normal node without no_clip privs? -- Is player suffocating inside a normal node without no_clip privs?
local ndef = minetest.registered_nodes[playerplus[name].nod_head] local ndef = minetest.registered_nodes[playerplus[name].nod_head]
@ -217,29 +201,19 @@ if name and playerplus[name] then
-- am I near a cactus? -- am I near a cactus?
local near = minetest.find_node_near(pos, 1, "default:cactus") local near = minetest.find_node_near(pos, 1, "default:cactus")
if near then if near and vector.distance(pos, near) < 1.1 then
player:set_hp(player:get_hp() - 2, {cactus = true})
-- am I touching the cactus? if so it hurts
for _,object in pairs(minetest.get_objects_inside_radius(near, 1.1)) do
object:punch(object, 0.1, {
full_punch_interval = 0.1,
damage_groups = {fleshy = 2}
}, near)
end end
end end
end -- END if name
end end
end) end)
-- check for old sneak_glitch setting -- check for old sneak_glitch setting
local old_sneak = minetest.settings:get_bool("old_sneak") local old_sneak = minetest.settings:get_bool("old_sneak")
-- set to blank on join (for 3rd party mods) -- set to blank on join and apply sneak glitch (for 3rd party mods)
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)
local name = player:get_player_name() local name = player:get_player_name()
@ -252,65 +226,53 @@ minetest.register_on_joinplayer(function(player)
end end
end) end)
-- clear when player leaves -- clear when player leaves
minetest.register_on_leaveplayer(function(player)
minetest.register_on_leaveplayer(function(player)
playerplus[ player:get_player_name() ] = nil playerplus[ player:get_player_name() ] = nil
end) end)
-- add privelage to disable knock-back -- add privelage to disable knock-back
minetest.register_privilege("no_knockback", { minetest.register_privilege("no_knockback", {
description = "Disables player knock-back effect", description = "Disables player knock-back effect", give_to_singleplayer = false
give_to_singleplayer = false
}) })
-- is player knock-back effect enabled?
if minetest.settings:get_bool("player_knockback") == true then
-- player knock-back function -- player knock-back function
local punchy = function(
local function punchy(
player, hitter, time_from_last_punch, tool_capabilities, dir, damage) player, hitter, time_from_last_punch, tool_capabilities, dir, damage)
if not dir then return end -- we need to know where to send player away from
local name = player:get_player_name() local name = player:get_player_name()
-- is player attached to anything (mob, bed, boat etc.) -- is player attached to anything (mob, bed, boat etc.)
if player_api.player_attached[name] then if player_api.player_attached[name] then return end
return
end
if not dir then return end
-- check if player has 'no_knockback' privelage -- check if player has 'no_knockback' privelage
local privs = minetest.get_player_privs(name) local privs = minetest.get_player_privs(name)
if privs["no_knockback"] then if privs["no_knockback"] then return end
return
end
local damage = 0 local damage = 0
-- get tool damage
if tool_capabilities then if tool_capabilities then
local armor = player:get_armor_groups() or {} local armor = player:get_armor_groups() or {}
local tmp local tmp
-- calculate knockback damage
for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do
tmp = time_from_last_punch / (tool_capabilities.full_punch_interval or 1.4) tmp = time_from_last_punch / (tool_capabilities.full_punch_interval or 1.4)
if tmp < 0 then if tmp < 0 then tmp = 0.0 elseif tmp > 1 then tmp = 1.0 end
tmp = 0.0
elseif tmp > 1 then
tmp = 1.0
end
damage = damage + (tool_capabilities.damage_groups[group] or 0) * tmp damage = damage + (tool_capabilities.damage_groups[group] or 0) * tmp
end end
-- check for knockback value -- if custom value found then use instead
if tool_capabilities.damage_groups["knockback"] then if tool_capabilities.damage_groups["knockback"] then
damage = tool_capabilities.damage_groups["knockback"] damage = tool_capabilities.damage_groups["knockback"]
end end
@ -320,19 +282,17 @@ local punchy = function(
local kb = math.min(32, damage * 2) local kb = math.min(32, damage * 2)
-- print ("---", player:get_player_name(), damage, kb) --print ("--- knockback", player:get_player_name(), damage, kb)
-- knock back player -- knock back player
player:add_velocity({ player:add_velocity({x = dir.x * kb, y = -1, z = dir.z * kb})
x = dir.x * kb,
y = -1,
z = dir.z * kb
})
end end
minetest.register_on_punchplayer(punchy) -- is player knock-back effect enabled?
end -- END if if minetest.settings:get_bool("player_knockback") ~= false then
minetest.register_on_punchplayer(punchy)
end
minetest.register_tool("playerplus:stick", { minetest.register_tool("playerplus:stick", {
description = "Sword of Boing", description = "Sword of Boing",
@ -352,11 +312,8 @@ minetest.override_item("default:mese", {
}) })
]] ]]
-- add lucky blocks (if damage and stamina active) -- add lucky blocks (if damage and stamina active)
if minetest.get_modpath("lucky_block") then if minetest.get_modpath("lucky_block") then
dofile(minetest.get_modpath("playerplus") .. "/lucky_block.lua")
local MP = minetest.get_modpath("playerplus")
dofile(MP .. "/lucky_block.lua")
end end