diff --git a/mods/bed/depends.txt b/mods/bed/depends.txt index d77ba25..5191f1d 100644 --- a/mods/bed/depends.txt +++ b/mods/bed/depends.txt @@ -1,2 +1,3 @@ default -farming +player_effects +farming? diff --git a/mods/bed/init.lua b/mods/bed/init.lua index 7be1b0c..ef93089 100644 --- a/mods/bed/init.lua +++ b/mods/bed/init.lua @@ -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() diff --git a/mods/default/player.lua b/mods/default/player.lua index b8d3e71..068cfd5 100644 --- a/mods/default/player.lua +++ b/mods/default/player.lua @@ -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) diff --git a/mods/hunger/init.lua b/mods/hunger/init.lua index f4a0ae3..740c2ce 100644 --- a/mods/hunger/init.lua +++ b/mods/hunger/init.lua @@ -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() diff --git a/mods/mobs/api.lua b/mods/mobs/api.lua index d6ba804..7fb831e 100644 --- a/mods/mobs/api.lua +++ b/mods/mobs/api.lua @@ -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 diff --git a/mods/player_effects/init.lua b/mods/player_effects/init.lua index b630ca1..65eabd6 100644 --- a/mods/player_effects/init.lua +++ b/mods/player_effects/init.lua @@ -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") \ No newline at end of file