tweak and tidy code
This commit is contained in:
parent
a03ad5c299
commit
95aefe56e3
197
init.lua
197
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,31 +21,25 @@ 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()
|
||||
@ -62,12 +49,13 @@ if name and playerplus[name] then
|
||||
-- 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
|
||||
@ -75,17 +63,18 @@ if name and playerplus[name] then
|
||||
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})
|
||||
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})
|
||||
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
|
||||
@ -110,16 +99,16 @@ if name and playerplus[name] then
|
||||
-- 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
|
||||
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
|
||||
@ -128,17 +117,17 @@ if name and playerplus[name] then
|
||||
|
||||
elseif not nfast and playerplus[name].nfast then
|
||||
|
||||
if monoids then
|
||||
|
||||
player_monoids.speed:del_change(player, playerplus[name].nfast)
|
||||
|
||||
playerplus[name].nfast = nil
|
||||
|
||||
elseif pova_mod 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
|
||||
@ -149,16 +138,16 @@ if name and playerplus[name] then
|
||||
-- apply slowdown changes
|
||||
if nslow and not playerplus[name].nslow then
|
||||
|
||||
if monoids then
|
||||
|
||||
playerplus[name].nslow = player_monoids.speed:add_change(
|
||||
player, def.speed - 0.3)
|
||||
|
||||
elseif pova_mod then
|
||||
if pova_mod then
|
||||
|
||||
pova.add_override(name, "playerplus:nslow", {speed = -0.3})
|
||||
|
||||
pova.do_override(player)
|
||||
|
||||
elseif monoids then
|
||||
|
||||
playerplus[name].nslow = player_monoids.speed:add_change(
|
||||
player, def.speed - 0.3)
|
||||
else
|
||||
def.speed = def.speed - 0.3
|
||||
end
|
||||
@ -167,17 +156,17 @@ if name and playerplus[name] then
|
||||
|
||||
elseif not nslow and playerplus[name].nslow then
|
||||
|
||||
if monoids then
|
||||
|
||||
player_monoids.speed:del_change(player, playerplus[name].nslow)
|
||||
|
||||
playerplus[name].nslow = nil
|
||||
|
||||
elseif pova_mod then
|
||||
if pova_mod then
|
||||
|
||||
pova.del_override(name, "playerplus: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
|
||||
@ -188,17 +177,12 @@ if name and playerplus[name] 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
|
||||
})
|
||||
player:set_physics_override(
|
||||
{speed = def.speed, jump = def.jump, gravity = def.gravity})
|
||||
end
|
||||
--[[
|
||||
print ("Speed: " .. def.speed
|
||||
.. " / Jump: " .. def.jump
|
||||
.. " / Gravity: " .. def.gravity)
|
||||
]]
|
||||
|
||||
--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]
|
||||
|
||||
@ -217,29 +201,19 @@ if name and playerplus[name] then
|
||||
-- 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)
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user