forked from VoxeLibre/VoxeLibre
Added glowing effect
Also added on_save_effect callback to run cleanup
This commit is contained in:
parent
7ae31790bf
commit
09be413e3f
|
@ -94,6 +94,7 @@ end
|
||||||
-- on_hit_timer - function(object, factor, duration) - if defined runs a hit_timer depending on timer_uses_factor value
|
-- on_hit_timer - function(object, factor, duration) - if defined runs a hit_timer depending on timer_uses_factor value
|
||||||
-- on_end - function(object) - called when the effect wears off
|
-- on_end - function(object) - called when the effect wears off
|
||||||
-- after_end - function(object) - called when the effect wears off, after purging the data of the effect
|
-- after_end - function(object) - called when the effect wears off, after purging the data of the effect
|
||||||
|
-- on_save_effect - function(object - called when the effect is to be serialized for saving (supposed to do cleanup)
|
||||||
-- particle_color - string - colorstring for particles - defaults to #3000EE
|
-- particle_color - string - colorstring for particles - defaults to #3000EE
|
||||||
-- uses_factor - bool - whether factor affects the effect
|
-- uses_factor - bool - whether factor affects the effect
|
||||||
-- lvl1_factor - integer - factor for lvl1 effect - defaults to 1 if uses_factor
|
-- lvl1_factor - integer - factor for lvl1 effect - defaults to 1 if uses_factor
|
||||||
|
@ -144,6 +145,7 @@ function mcl_potions.register_effect(def)
|
||||||
pdef.on_step = def.on_step
|
pdef.on_step = def.on_step
|
||||||
pdef.on_hit_timer = def.on_hit_timer
|
pdef.on_hit_timer = def.on_hit_timer
|
||||||
pdef.on_end = def.on_end
|
pdef.on_end = def.on_end
|
||||||
|
pdef.on_save_effect = def.on_save_effect
|
||||||
if not def.particle_color then
|
if not def.particle_color then
|
||||||
pdef.particle_color = "#3000EE"
|
pdef.particle_color = "#3000EE"
|
||||||
else
|
else
|
||||||
|
@ -505,6 +507,72 @@ mcl_potions.register_effect({
|
||||||
lvl2_factor = 20,
|
lvl2_factor = 20,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
local GLOW_DISTANCE = 30
|
||||||
|
local CLOSE_GLOW_LIMIT = 3
|
||||||
|
local MIN_GLOW_SCALE = 1
|
||||||
|
local MAX_GLOW_SCALE = 4
|
||||||
|
local SCALE_DIFF = MAX_GLOW_SCALE - MIN_GLOW_SCALE
|
||||||
|
local SCALE_FACTOR = (GLOW_DISTANCE - CLOSE_GLOW_LIMIT) / SCALE_DIFF
|
||||||
|
local abs = math.abs
|
||||||
|
mcl_potions.register_effect({
|
||||||
|
name = "glowing",
|
||||||
|
description = S("Glowing"),
|
||||||
|
get_tt = function(factor)
|
||||||
|
return S("more visible at all times")
|
||||||
|
end,
|
||||||
|
on_start = function(object, factor)
|
||||||
|
EF.glowing[object].waypoints = {}
|
||||||
|
end,
|
||||||
|
on_step = function(dtime, object, factor, duration)
|
||||||
|
local pos = object:get_pos()
|
||||||
|
if not pos then return end
|
||||||
|
local x, y, z = pos.x, pos.y, pos.z
|
||||||
|
for _, player in pairs(minetest.get_connected_players()) do
|
||||||
|
local pp = player:get_pos()
|
||||||
|
if pp and player ~= object then
|
||||||
|
local hud_id = EF.glowing[object].waypoints[player]
|
||||||
|
if abs(pp.x-x) < GLOW_DISTANCE and abs(pp.y-y) < GLOW_DISTANCE
|
||||||
|
and abs(pp.z-z) < GLOW_DISTANCE then
|
||||||
|
local distance = vector.distance(pos, pp)
|
||||||
|
local scale
|
||||||
|
if distance <= CLOSE_GLOW_LIMIT then scale = MAX_GLOW_SCALE
|
||||||
|
elseif distance >= GLOW_DISTANCE then scale = MIN_GLOW_SCALE
|
||||||
|
else scale = (GLOW_DISTANCE - distance) / SCALE_FACTOR + MIN_GLOW_SCALE end
|
||||||
|
if hud_id then
|
||||||
|
player:hud_change(hud_id, "world_pos", pos)
|
||||||
|
player:hud_change(hud_id, "scale", {x = scale, y = scale})
|
||||||
|
else
|
||||||
|
EF.glowing[object].waypoints[player] = player:hud_add({
|
||||||
|
hud_elem_type = "image_waypoint",
|
||||||
|
position = {x = 0.5, y = 0.5},
|
||||||
|
scale = {x = scale, y = scale},
|
||||||
|
text = "mcl_potions_glow_waypoint.png",
|
||||||
|
alignment = {x = 0, y = -1},
|
||||||
|
world_pos = pos,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
elseif hud_id then
|
||||||
|
player:hud_remove(hud_id)
|
||||||
|
EF.glowing[object].waypoints[player] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
on_end = function(object)
|
||||||
|
for player, hud_id in pairs(EF.glowing[object].waypoints) do
|
||||||
|
if player:get_pos() then player:hud_remove(hud_id) end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
on_save_effect = function(object)
|
||||||
|
for player, hud_id in pairs(EF.glowing[object].waypoints) do
|
||||||
|
if player:get_pos() then player:hud_remove(hud_id) end
|
||||||
|
end
|
||||||
|
EF.glowing[object].waypoints = {}
|
||||||
|
end,
|
||||||
|
particle_color = "#FFFF00",
|
||||||
|
uses_factor = false,
|
||||||
|
})
|
||||||
|
|
||||||
mcl_potions.register_effect({
|
mcl_potions.register_effect({
|
||||||
name = "health_boost",
|
name = "health_boost",
|
||||||
description = S("Health Boost"),
|
description = S("Health Boost"),
|
||||||
|
@ -1334,6 +1402,7 @@ function mcl_potions._save_player_effects(player)
|
||||||
local meta = player:get_meta()
|
local meta = player:get_meta()
|
||||||
|
|
||||||
for name, effect in pairs(registered_effects) do
|
for name, effect in pairs(registered_effects) do
|
||||||
|
if effect.on_save_effect and EF[name][player] then effect.on_save_effect(player) end
|
||||||
meta:set_string("mcl_potions:_EF_"..name, minetest.serialize(EF[name][player]))
|
meta:set_string("mcl_potions:_EF_"..name, minetest.serialize(EF[name][player]))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 252 B |
Loading…
Reference in New Issue