added player effects to some stuff
This commit is contained in:
parent
9aefb69043
commit
f9e121fe85
|
@ -1,2 +1,3 @@
|
|||
default
|
||||
farming
|
||||
player_effects
|
||||
farming?
|
||||
|
|
|
@ -62,7 +62,7 @@ minetest.register_node(
|
|||
put_pos.y = put_pos.y - 0.5
|
||||
|
||||
clicker:setpos(put_pos)
|
||||
clicker:set_physics_override(1, 1, 1)
|
||||
player_effects.remove_effect(clicker, "inbed")
|
||||
clicker:set_eye_offset(vector.new(0, 0, 0), vector.new(0, 0, 0))
|
||||
clicker:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30)
|
||||
default.player_set_animation(clicker, "stand", 30)
|
||||
|
@ -75,7 +75,7 @@ minetest.register_node(
|
|||
put_pos.y = put_pos.y + 0.6
|
||||
|
||||
clicker:setpos(put_pos)
|
||||
clicker:set_physics_override(0, 0, 0)
|
||||
player_effects.apply_effect(clicker, "inbed")
|
||||
clicker:set_eye_offset(vector.new(0, -13, 0), vector.new(0, -13, 0))
|
||||
clicker:set_local_animation({x=162, y=166}, {x=162, y=166}, {x=162, y=166}, {x=162, y=168}, 30)
|
||||
default.player_set_animation(clicker, "lay", 30)
|
||||
|
@ -175,6 +175,19 @@ minetest.register_globalstep(
|
|||
end
|
||||
end)
|
||||
|
||||
player_effects.register_effect(
|
||||
"inbed",
|
||||
{
|
||||
title = "In bed",
|
||||
description = "If you're in a bed",
|
||||
duration = -1,
|
||||
physics = {
|
||||
speed = 0,
|
||||
jump = 0,
|
||||
gravity = 0,
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_on_respawnplayer(
|
||||
function(player)
|
||||
local name = player:get_player_name()
|
||||
|
|
|
@ -121,29 +121,6 @@ local function on_leaveplayer(player)
|
|||
player_lastpos[name] = nil
|
||||
end
|
||||
|
||||
minetest.register_privilege("uberspeed", "Can use /uberspeed command")
|
||||
|
||||
minetest.register_chatcommand(
|
||||
"uberspeed",
|
||||
{
|
||||
params = "[on|off|cinematic]",
|
||||
description = "Set Uberspeed",
|
||||
privs = {uberspeed = true},
|
||||
func = function(name, param)
|
||||
local player=minetest.get_player_by_name(name)
|
||||
|
||||
if param == "on" then
|
||||
player:set_physics_override({speed = 8})
|
||||
elseif param == "off" then
|
||||
player:set_physics_override({speed = 1})
|
||||
elseif param == "cinematic" then
|
||||
player:set_physics_override({speed = 2})
|
||||
else
|
||||
minetest.chat_send_player(name, "Bad param for /uberspeed; type /help uberspeed")
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_on_joinplayer(on_joinplayer)
|
||||
minetest.register_on_leaveplayer(on_leaveplayer)
|
||||
minetest.register_globalstep(step)
|
||||
|
|
|
@ -73,6 +73,17 @@ function hunger.update_bar(player)
|
|||
end
|
||||
|
||||
if minetest.setting_getbool("enable_damage") and minetest.setting_getbool("hunger_enable") then
|
||||
player_effects.register_effect(
|
||||
"hunger_eating",
|
||||
{
|
||||
title = "Eating",
|
||||
description = "If you are eating food",
|
||||
durtion = 2,
|
||||
physics = {
|
||||
speed = 0.6,
|
||||
}
|
||||
})
|
||||
|
||||
-- Prevent players from starving while afk (<--joke)
|
||||
minetest.register_on_dignode(
|
||||
function(pos, oldnode, player)
|
||||
|
@ -150,6 +161,9 @@ if minetest.setting_getbool("enable_damage") and minetest.setting_getbool("hunge
|
|||
local headpos = player:getpos()
|
||||
headpos.y = headpos.y + 1
|
||||
minetest.sound_play("hunger_eat", {pos = headpos, max_hear_distance = 8})
|
||||
|
||||
player_effects.apply_effect(player, "hunger_eating")
|
||||
|
||||
hunger.update_bar(player)
|
||||
hunger.save_hunger()
|
||||
|
||||
|
|
|
@ -9,6 +9,13 @@ local enable_blood = minetest.setting_getbool("mobs_enable_blood") or false
|
|||
mobs.protected = tonumber(minetest.setting_get("mobs_spawn_protected")) or 0
|
||||
mobs.remove = minetest.setting_getbool("remove_far_mobs") or false
|
||||
|
||||
local function is_too_near_spawn(pos)
|
||||
local sp = minetest.settting_getbool("static_spawn_point") or {x = 0, y = 0, z = 0}
|
||||
local rad = minetest.settting_getbool("static_spawn_radius") or 256
|
||||
|
||||
return (vector.distance(pos, sp) < rad)
|
||||
end
|
||||
|
||||
function mobs:register_mob(name, def)
|
||||
minetest.register_entity(
|
||||
name,
|
||||
|
@ -119,6 +126,8 @@ function mobs:register_mob(name, def)
|
|||
end
|
||||
end,
|
||||
do_attack = function(self, player, dist)
|
||||
if is_too_near_spawn(self:getpos()) then return end
|
||||
|
||||
if self.state ~= "attack" then
|
||||
if math.random(0,100) < 90
|
||||
and self.sounds.war_cry then
|
||||
|
|
|
@ -37,19 +37,38 @@ function player_effects.register_effect(name, def)
|
|||
title = def.title or name, -- good-looking name of the effect
|
||||
description = def.description or "The " .. name .. " effect", -- description of what the effect does
|
||||
duration = def.duration or 1, -- how long the effect lasts, <0 is infinite and has to be disabled manually
|
||||
additive = def.additive or false, -- if the same effect can be applied multiple times for a longer duration
|
||||
physics = def.physics or {} -- physics overrides for the player
|
||||
}
|
||||
|
||||
player_effects.registered_effects[name] = rd
|
||||
end
|
||||
|
||||
function player_effects.apply_effect(player, ename)
|
||||
local effect = player_effects.registered_effects[ename]
|
||||
function player_effects.get_registered_effect(ename)
|
||||
local e = player_effects.registered_effects[ename]
|
||||
|
||||
if not e then
|
||||
default.log("[mod:player_effects] Cannot find registered player effect " .. ename, "error")
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
return e
|
||||
end
|
||||
|
||||
function player_effects.apply_effect(player, ename)
|
||||
local effect = player_effects.get_registered_effect(ename)
|
||||
|
||||
if effect.duration >= 0 then
|
||||
player_effects.effects[player:get_player_name()][ename] = minetest.get_gametime() + effect.duration
|
||||
else
|
||||
player_effects.effects[player:get_player_name()][ename] = -1
|
||||
end
|
||||
|
||||
local phys = {speed = 1, jump = 1, gravity = 1}
|
||||
|
||||
for en, _ in pairs(player_effects.effects[player:get_player_name()]) do
|
||||
local effect = player_effects.get_registered_effect(en)
|
||||
|
||||
if player_effects.effects[player:get_player_name()][ename] == nil then
|
||||
local phys = player:get_physics_override()
|
||||
|
||||
if effect.physics.speed ~= nil then
|
||||
phys.speed = phys.speed * effect.physics.speed
|
||||
end
|
||||
|
@ -61,15 +80,9 @@ function player_effects.apply_effect(player, ename)
|
|||
if effect.physics.gravity ~= nil then
|
||||
phys.gravity = phys.gravity * effect.physics.gravity
|
||||
end
|
||||
|
||||
player:set_physics_override(phys)
|
||||
end
|
||||
|
||||
if effect.duration >= 0 then
|
||||
player_effects.effects[player:get_player_name()][ename] = minetest.get_gametime() + effect.duration
|
||||
else
|
||||
player_effects.effects[player:get_player_name()][ename] = -1
|
||||
end
|
||||
player:set_physics_override(phys)
|
||||
|
||||
save_effects()
|
||||
end
|
||||
|
@ -77,19 +90,24 @@ end
|
|||
function player_effects.remove_effect(player, ename)
|
||||
if player_effects.effects[player:get_player_name()][ename] == nil then return end
|
||||
|
||||
local phys = player:get_physics_override()
|
||||
local effect = player_effects.registered_effects[ename]
|
||||
|
||||
if effect.physics.speed ~= nil then
|
||||
phys.speed = phys.speed / effect.physics.speed
|
||||
end
|
||||
local phys = {speed = 1, jump = 1, gravity = 1}
|
||||
|
||||
if effect.physics.jump ~= nil then
|
||||
phys.jump = phys.jump / effect.physics.jump
|
||||
end
|
||||
for en, _ in pairs(player_effects.effects[player:get_player_name()]) do
|
||||
if en ~= ename then
|
||||
local effect = player_effects.get_registered_effect(en)
|
||||
|
||||
if effect.physics.gravity ~= nil then
|
||||
phys.gravity = phys.gravity / effect.physics.gravity
|
||||
if effect.physics.speed ~= nil then
|
||||
phys.speed = phys.speed * effect.physics.speed
|
||||
end
|
||||
|
||||
if effect.physics.jump ~= nil then
|
||||
phys.jump = phys.jump * effect.physics.jump
|
||||
end
|
||||
|
||||
if effect.physics.gravity ~= nil then
|
||||
phys.gravity = phys.gravity * effect.physics.gravity
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
player:set_physics_override(phys)
|
||||
|
@ -99,11 +117,43 @@ function player_effects.remove_effect(player, ename)
|
|||
save_effects()
|
||||
end
|
||||
|
||||
function player_effects.refresh_effects(player)
|
||||
local function check(ename)
|
||||
local phys = {speed = 1, jump = 1, gravity = 1}
|
||||
|
||||
for en, _ in pairs(player_effects.effects[player:get_player_name()]) do
|
||||
if en ~= ename then
|
||||
local effect = player_effects.get_registered_effect(en)
|
||||
|
||||
if effect.physics.speed ~= nil then
|
||||
phys.speed = phys.speed * effect.physics.speed
|
||||
end
|
||||
|
||||
if effect.physics.jump ~= nil then
|
||||
phys.jump = phys.jump * effect.physics.jump
|
||||
end
|
||||
|
||||
if effect.physics.gravity ~= nil then
|
||||
phys.gravity = phys.gravity * effect.physics.gravity
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
player:set_physics_override(phys)
|
||||
end
|
||||
|
||||
for ename, endtime in pairs(player_effects.effects[player:get_player_name()]) do
|
||||
check(ename)
|
||||
end
|
||||
|
||||
save_effects()
|
||||
end
|
||||
|
||||
function player_effects.clear_effects(player)
|
||||
-- call this if you want to clear all effects, it's faster and more efficient
|
||||
player:set_physics_override({speed = 1, jump = 1, gravity = 1})
|
||||
|
||||
player_effects.effects[player:get_player_name()] = nil
|
||||
player_effects.effects[player:get_player_name()] = {}
|
||||
|
||||
save_effects()
|
||||
end
|
||||
|
@ -119,7 +169,6 @@ local function step(dtime)
|
|||
for ename, endtime in pairs(player_effects.effects[name]) do
|
||||
if endtime > 0 then
|
||||
local timeleft = endtime - gt
|
||||
print(timeleft)
|
||||
if timeleft <= 0 then
|
||||
player_effects.remove_effect(player, ename)
|
||||
end
|
||||
|
@ -139,9 +188,9 @@ local function on_joinplayer(player)
|
|||
player_effects.effects[name] = {}
|
||||
end
|
||||
|
||||
save_effects()
|
||||
player_effects.refresh_effects(player)
|
||||
|
||||
player_effects.apply_effect(player, "lowgravity")
|
||||
save_effects()
|
||||
end
|
||||
|
||||
local function on_leaveplayer(player)
|
||||
|
@ -183,4 +232,47 @@ minetest.register_chatcommand(
|
|||
end
|
||||
})
|
||||
|
||||
player_effects.register_effect(
|
||||
"uberspeed",
|
||||
{
|
||||
title = "Uberspeed",
|
||||
description = "If you can go really fast",
|
||||
duration = -1,
|
||||
physics = {
|
||||
speed = 8,
|
||||
}
|
||||
})
|
||||
player_effects.register_effect(
|
||||
"uberspeed_cinematic",
|
||||
{
|
||||
title = "Cinematic",
|
||||
description = "Cinematic fast movement",
|
||||
duration = -1,
|
||||
physics = {
|
||||
speed = 2,
|
||||
}
|
||||
})
|
||||
minetest.register_privilege("uberspeed", "Can use /uberspeed command")
|
||||
minetest.register_chatcommand(
|
||||
"uberspeed",
|
||||
{
|
||||
params = "[on|off|cinematic]",
|
||||
description = "Set Uberspeed",
|
||||
privs = {uberspeed = true},
|
||||
func = function(name, param)
|
||||
local player=minetest.get_player_by_name(name)
|
||||
|
||||
if param == "on" then
|
||||
player_effects.apply_effect(player, "uberspeed")
|
||||
elseif param == "cinematic" then
|
||||
player_effects.apply_effect(player, "uberspeed_cinematic")
|
||||
elseif param == "off" then
|
||||
player_effects.remove_effect(player, "uberspeed")
|
||||
player_effects.remove_effect(player, "uberspeed_cinematic")
|
||||
else
|
||||
minetest.chat_send_player(name, "Bad param for /uberspeed; type /help uberspeed")
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
default.log("mod:player_effects", "loaded")
|
Loading…
Reference in New Issue