added player effects to some stuff

This commit is contained in:
kaadmy 2015-10-24 11:36:31 -07:00
parent 9aefb69043
commit f9e121fe85
6 changed files with 160 additions and 54 deletions

View File

@ -1,2 +1,3 @@
default
farming
player_effects
farming?

View File

@ -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()

View File

@ -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)

View File

@ -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()

View File

@ -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

View File

@ -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")