From 95aefe56e315585ecb3aa3ae06cbf251e676dee7 Mon Sep 17 00:00:00 2001 From: tenplus1 Date: Sun, 22 Sep 2024 14:28:20 +0100 Subject: [PATCH] tweak and tidy code --- init.lua | 373 ++++++++++++++++++++++++------------------------------- 1 file changed, 165 insertions(+), 208 deletions(-) diff --git a/init.lua b/init.lua index ef89b6e..40c320d 100644 --- a/init.lua +++ b/init.lua @@ -1,22 +1,15 @@ --[[ - walking on ice makes player walk faster, - stepping through snow slows player down, - touching a cactus hurts player, - suffocation when head is inside solid node, - player knock-back effects when punched. + walking on ice makes player walk faster, stepping through snow slows player down, + touching a cactus hurts player, suffocation when head is inside solid node, + player knock-back effects when punched, check for node on_walk_over function. PlayerPlus by TenPlus1 ]] 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 + local node_ok = function(pos, fallback) local node = minetest.get_node_or_nil(pos) @@ -28,218 +21,199 @@ local node_ok = function(pos, fallback) return fallback or "air" 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 time = 0 +local timer = 0 +-- main function run for each player minetest.register_globalstep(function(dtime) - time = time + dtime - - -- every 1 second - if time < 1 then - return - end - - -- reset time for next check - time = 0 + -- one second timer + timer = timer + dtime ; if timer < 1 then return end ; timer = 0 -- define locals outside loop local name, pos, ndef, def, nslow, nfast, prop - -- get list of players - local players = minetest.get_connected_players() - -- loop through players - for _,player in pairs(players) do + for _,player in pairs(minetest.get_connected_players()) do -- who am I? name = player:get_player_name() -if name and playerplus[name] then + if name and playerplus[name] then - -- where am I? - pos = player:get_pos() + -- where am I? + pos = player:get_pos() - -- what is around me? - playerplus[name].nod_stand = node_ok({ - x = pos.x, y = pos.y - 0.1, z = pos.z}) + -- node standing on + playerplus[name].nod_stand = node_ok( + {x = pos.x, y = pos.y - 0.1, z = pos.z}) - -- Does the node below me have an on_walk_over function set? - ndef = minetest.registered_nodes[playerplus[name].nod_stand] - if ndef and ndef.on_walk_over then - ndef.on_walk_over(pos, ndef, player) - end + -- Does the node below me have an on_walk_over function set? + ndef = minetest.registered_nodes[playerplus[name].nod_stand] - prop = player:get_properties() - - -- node at eye level - playerplus[name].nod_head = node_ok({ - x = pos.x, y = pos.y + prop.eye_height, z = pos.z}) - - -- node at foot level - playerplus[name].nod_feet = node_ok({ - x = pos.x, y = pos.y + 0.2, z = pos.z}) - - -- get player physics - def = player:get_physics_override() - - if armor_mod and armor and armor.def then - -- get player physics from armor - def.speed = armor.def[name].speed or def.speed - def.jump = armor.def[name].jump or def.jump - def.gravity = armor.def[name].gravity or def.gravity - end - - -- are we standing on any nodes that speed player up? - nfast = nil - - if playerplus[name].nod_stand == "default:ice" then - nfast = true - end - - -- are we standing on any nodes that slow player down? - nslow = nil - - if playerplus[name].nod_stand == "default:snow" - or playerplus[name].nod_stand == "default:snowblock" then - nslow = true - end - - -- apply speed changes - if nfast and not playerplus[name].nfast then - - if monoids 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.do_override(player) - else - def.speed = def.speed + 0.4 + if ndef and ndef.on_walk_over then + ndef.on_walk_over(pos, ndef, player) end - playerplus[name].nfast = true + prop = player:get_properties() - elseif not nfast and playerplus[name].nfast then + -- node at eye level + playerplus[name].nod_head = node_ok( + {x = pos.x, y = pos.y + prop.eye_height, z = pos.z}) - if monoids then + -- node at foot level + playerplus[name].nod_feet = node_ok( + {x = pos.x, y = pos.y + 0.2, z = pos.z}) - player_monoids.speed:del_change(player, playerplus[name].nfast) + -- get player physics + def = player:get_physics_override() + + if armor_mod and armor and armor.def then + + -- get player physics from armor + def.speed = armor.def[name].speed or def.speed + def.jump = armor.def[name].jump or def.jump + def.gravity = armor.def[name].gravity or def.gravity + end + + -- are we standing on any nodes that speed player up? + nfast = nil + + if playerplus[name].nod_stand == "default:ice" then + nfast = true + end + + -- are we standing on any nodes that slow player down? + nslow = nil + + if playerplus[name].nod_stand == "default:snow" + or playerplus[name].nod_stand == "default:snowblock" then + nslow = true + end + + -- apply speed changes + if nfast and not playerplus[name].nfast then + + if pova_mod then + + pova.add_override(name, "playerplus:nfast", {speed = 0.4}) + + pova.do_override(player) + + elseif monoids then + + playerplus[name].nfast = player_monoids.speed:add_change( + player, def.speed + 0.4) + else + def.speed = def.speed + 0.4 + end + + playerplus[name].nfast = true + + elseif not nfast and playerplus[name].nfast then + + if pova_mod then + + pova.del_override(name, "playerplus:nfast") + + pova.do_override(player) + + elseif monoids then + + player_monoids.speed:del_change(player, playerplus[name].nfast) + + playerplus[name].nfast = nil + else + def.speed = def.speed - 0.4 + end playerplus[name].nfast = nil - - elseif pova_mod then - - pova.del_override(name, "playerplus:nfast") - - pova.do_override(player) - else - def.speed = def.speed - 0.4 end - playerplus[name].nfast = nil - end + -- apply slowdown changes + if nslow and not playerplus[name].nslow then - -- apply slowdown changes - if nslow and not playerplus[name].nslow then + if pova_mod then - if monoids then + pova.add_override(name, "playerplus:nslow", {speed = -0.3}) - playerplus[name].nslow = player_monoids.speed:add_change( - player, def.speed - 0.3) + pova.do_override(player) - elseif pova_mod then + elseif monoids then - pova.add_override(name, "playerplus:nslow", {speed = -0.3}) + playerplus[name].nslow = player_monoids.speed:add_change( + player, def.speed - 0.3) + else + def.speed = def.speed - 0.3 + end - pova.do_override(player) - else - def.speed = def.speed - 0.3 - end + playerplus[name].nslow = true - playerplus[name].nslow = true + elseif not nslow and playerplus[name].nslow then - elseif not nslow and playerplus[name].nslow then + if pova_mod then - if monoids then + pova.del_override(name, "playerplus:nslow") - player_monoids.speed:del_change(player, playerplus[name].nslow) + pova.do_override(player) + + elseif monoids then + + player_monoids.speed:del_change(player, playerplus[name].nslow) + + playerplus[name].nslow = nil + else + def.speed = def.speed + 0.3 + end playerplus[name].nslow = nil - - elseif pova_mod then - - pova.del_override(name, "playerplus:nslow") - - pova.do_override(player) - else - def.speed = def.speed + 0.3 end - playerplus[name].nslow = nil - end + -- set player physics + if not monoids and not pova_mod then - -- set player physics - if not monoids and not pova_mod then - - player:set_physics_override({ - speed = def.speed, - jump = def.jump, - gravity = def.gravity - }) - end ---[[ - print ("Speed: " .. def.speed - .. " / Jump: " .. def.jump - .. " / Gravity: " .. def.gravity) -]] - -- Is player suffocating inside a normal node without no_clip privs? - local ndef = minetest.registered_nodes[playerplus[name].nod_head] - - if ndef.walkable == true - and ndef.drowning == 0 - and ndef.damage_per_second <= 0 - and ndef.groups.disable_suffocation ~= 1 - and ndef.drawtype == "normal" - and not minetest.check_player_privs(name, {noclip = true}) then - - if player:get_hp() > 0 then - player:set_hp(player:get_hp() - 2, {suffocation = true}) - end - end - - -- am I near a cactus? - local near = minetest.find_node_near(pos, 1, "default:cactus") - - if near then - - -- 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) + player:set_physics_override( + {speed = def.speed, jump = def.jump, gravity = def.gravity}) end +--print ("Speed: " .. def.speed .. " / Jump: " .. def.jump .. " / Gravity: " .. def.gravity) + + -- Is player suffocating inside a normal node without no_clip privs? + local ndef = minetest.registered_nodes[playerplus[name].nod_head] + + if ndef.walkable == true + and ndef.drowning == 0 + and ndef.damage_per_second <= 0 + and ndef.groups.disable_suffocation ~= 1 + and ndef.drawtype == "normal" + and not minetest.check_player_privs(name, {noclip = true}) then + + if player:get_hp() > 0 then + player:set_hp(player:get_hp() - 2, {suffocation = true}) + end + end + + -- am I near a cactus? + local near = minetest.find_node_near(pos, 1, "default:cactus") + + if near and vector.distance(pos, near) < 1.1 then + player:set_hp(player:get_hp() - 2, {cactus = true}) + end end - -end -- END if name - end end) - -- check for old sneak_glitch setting + 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) local name = player:get_player_name() @@ -252,65 +226,53 @@ minetest.register_on_joinplayer(function(player) end end) - -- clear when player leaves -minetest.register_on_leaveplayer(function(player) +minetest.register_on_leaveplayer(function(player) playerplus[ player:get_player_name() ] = nil end) - -- add privelage to disable knock-back + minetest.register_privilege("no_knockback", { - description = "Disables player knock-back effect", - give_to_singleplayer = false + description = "Disables player knock-back effect", give_to_singleplayer = false }) --- is player knock-back effect enabled? -if minetest.settings:get_bool("player_knockback") == true then - -- player knock-back function -local punchy = function( + +local function punchy( 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() -- is player attached to anything (mob, bed, boat etc.) - if player_api.player_attached[name] then - return - end - - if not dir then return end + if player_api.player_attached[name] then return end -- check if player has 'no_knockback' privelage local privs = minetest.get_player_privs(name) - if privs["no_knockback"] then - return - end + if privs["no_knockback"] then return end local damage = 0 - -- get tool damage if tool_capabilities then local armor = player:get_armor_groups() or {} local tmp + -- calculate knockback damage for group,_ in pairs( (tool_capabilities.damage_groups or {}) ) do tmp = time_from_last_punch / (tool_capabilities.full_punch_interval or 1.4) - if tmp < 0 then - tmp = 0.0 - elseif tmp > 1 then - tmp = 1.0 - end + if tmp < 0 then tmp = 0.0 elseif tmp > 1 then tmp = 1.0 end damage = damage + (tool_capabilities.damage_groups[group] or 0) * tmp end - -- check for knockback value + -- if custom value found then use instead if tool_capabilities.damage_groups["knockback"] then damage = tool_capabilities.damage_groups["knockback"] end @@ -320,19 +282,17 @@ local punchy = function( 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 - player:add_velocity({ - x = dir.x * kb, - y = -1, - z = dir.z * kb - }) + player:add_velocity({x = dir.x * kb, y = -1, z = dir.z * kb}) 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", { description = "Sword of Boing", @@ -352,11 +312,8 @@ minetest.override_item("default:mese", { }) ]] - -- add lucky blocks (if damage and stamina active) + if minetest.get_modpath("lucky_block") then - - local MP = minetest.get_modpath("playerplus") - - dofile(MP .. "/lucky_block.lua") + dofile(minetest.get_modpath("playerplus") .. "/lucky_block.lua") end