1 local S
= minetest
.get_translator("mcl_potions")
3 local lingering_image
= function(colorstring
, opacity
)
7 return "mcl_potions_splash_overlay.png^[colorize:"..colorstring
..":"..tostring(opacity
).."^mcl_potions_lingering_bottle.png"
11 local lingering_effect_at
= {}
13 local function add_lingering_effect(pos
, color
, def
)
15 lingering_effect_at
[pos
] = {color
= color
, timer
= 30, def
= def
}
20 local lingering_timer
= 0
21 minetest
.register_globalstep(function(dtime
)
23 lingering_timer
= lingering_timer
+ dtime
24 if lingering_timer
>= 1 then
26 for pos
, vals
in pairs(lingering_effect_at
) do
28 vals
.timer
= vals
.timer
- lingering_timer
29 local d
= 4 * (vals
.timer
/ 30.0)
31 minetest
.add_particlespawner({
34 minpos
= {x
=pos
.x
-d
, y
=pos
.y
+0.5, z
=pos
.z
-d
},
35 maxpos
= {x
=pos
.x
+d
, y
=pos
.y
+1, z
=pos
.z
+d
},
36 minvel
= {x
=-0.5, y
=0, z
=-0.5},
37 maxvel
= {x
=0.5, y
=0.5, z
=0.5},
38 minacc
= {x
=-0.2, y
=0, z
=-0.2},
39 maxacc
= {x
=0.2, y
=.05, z
=0.2},
44 collisiondetection
= true,
46 texture
= "mcl_potions_sprite.png^[colorize:"..vals
.color
..":127",
49 for _
, obj
in pairs(minetest
.get_objects_inside_radius(pos
, d
)) do
51 local entity
= obj
:get_luaentity()
52 if obj
:is_player() or entity
._cmi_is_mob
then
54 vals
.def
.potion_fun(obj
)
55 vals
.timer
= vals
.timer
/ 2
60 if vals
.timer
<= 0 then lingering_effect_at
[pos
] = nil end
69 function mcl_potions
.register_lingering(name
, descr
, color
, def
)
71 local id
= "mcl_potions:"..name
.."_lingering"
72 local longdesc
= def
.longdesc
73 if not def
.no_effect
then
74 longdesc
= S("A throwable potion that will shatter on impact, where it creates a magic cloud that lingers around for a while. Any player or mob inside the cloud will receive the potion's effect, possibly repeatedly.")
76 longdesc
= longdesc
.. "\n" .. def
.longdesc
79 minetest
.register_craftitem(id
, {
82 _doc_items_longdesc
= longdesc
,
83 _doc_items_usagehelp
= S("Use the “Punch” key to throw it."),
84 inventory_image
= lingering_image(color
),
85 groups
= {brewitem
=1, not_in_creative_inventory
=0},
86 on_use
= function(item
, placer
, pointed_thing
)
88 local dir
= placer
:get_look_dir();
89 local pos
= placer
:getpos();
90 local obj
= minetest
.add_entity({x
=pos
.x
+dir
.x
,y
=pos
.y
+2+dir
.y
,z
=pos
.z
+dir
.z
}, id
.."_flying")
91 obj
:setvelocity({x
=dir
.x
*velocity
,y
=dir
.y
*velocity
,z
=dir
.z
*velocity
})
92 obj
:setacceleration({x
=dir
.x
*-3, y
=-9.8, z
=dir
.z
*-3})
93 obj
:get_luaentity()._thrower
= placer
:get_player_name()
94 if not minetest
.is_creative_enabled(placer
:get_player_name()) then
100 _on_dispense
= function(stack
, dispenserpos
, droppos
, dropnode
, dropdir
)
101 local s_pos
= vector
.add(dispenserpos
, vector
.multiply(dropdir
, 0.51))
102 local obj
= minetest
.add_entity({x
=s_pos
.x
+dropdir
.x
,y
=s_pos
.y
+dropdir
.y
,z
=s_pos
.z
+dropdir
.z
}, id
.."_flying")
104 obj
:set_velocity({x
=dropdir
.x
*velocity
,y
=dropdir
.y
*velocity
,z
=dropdir
.z
*velocity
})
105 obj
:set_acceleration({x
=dropdir
.x
*-3, y
=-9.8, z
=dropdir
.z
*-3})
111 minetest
.register_entity(id
.."_flying",{
112 textures
= {lingering_image(color
)},
114 visual_size
= {x
=w
/2,y
=w
/2},
115 collisionbox
= {0,0,0,0,0,0},
116 on_step
= function(self
, dtime
)
117 local pos
= self
.object
:getpos()
118 local node
= minetest
.get_node(pos
)
121 if n
~= "air" and n
~= "mcl_portals:portal" and n
~= "mcl_portals:portal_end" or mcl_potions
.is_obj_hit(self
, pos
) then
122 minetest
.sound_play("mcl_potions_breaking_glass", {pos
= pos
, max_hear_distance
= 16, gain
= 1})
123 add_lingering_effect(pos
, color
, def
)
124 minetest
.add_particlespawner({
127 minpos
= {x
=pos
.x
-d
, y
=pos
.y
+0.5, z
=pos
.z
-d
},
128 maxpos
= {x
=pos
.x
+d
, y
=pos
.y
+1, z
=pos
.z
+d
},
129 minvel
= {x
=-0.5, y
=0, z
=-0.5},
130 maxvel
= {x
=0.5, y
=0.5, z
=0.5},
131 minacc
= {x
=-0.2, y
=0, z
=-0.2},
132 maxacc
= {x
=0.2, y
=.05, z
=0.2},
137 collisiondetection
= true,
139 texture
= "mcl_potions_sprite.png^[colorize:"..color
..":127",
147 -- -- register_lingering("weakness", S("Lingering Weakness Potion"), "#6600AA", {
148 -- -- potion_fun = function(player) mcl_potions.weakness_func(player, -4, mcl_potions.DURATION*mcl_potions.INV_FACTOR*0.25) end,
149 -- -- -- TODO: Fix tooltip
150 -- -- tt = time_string(mcl_potions.DURATION*mcl_potions.INV_FACTOR*0.25)
153 -- -- register_lingering("weakness_plus", S("Lingering Weakness Potion +"), "#7700BB", {
154 -- -- potion_fun = function(player) mcl_potions.weakness_func(player, -4, mcl_potions.DURATION_PLUS*mcl_potions.INV_FACTOR*0.25) end,
155 -- -- -- TODO: Fix tooltip
156 -- -- tt = time_string(mcl_potions.DURATION*mcl_potions.INV_FACTOR*0.25)
159 -- -- register_lingering("strength", S("Lingering Strength Potion"), "#D444D4", {
160 -- -- potion_fun = function(player) mcl_potions.strength_func(player, 3, mcl_potions.DURATION*0.25) end,
161 -- -- -- TODO: Fix tooltip
162 -- -- tt = time_string(mcl_potions.DURATION*0.25)
165 -- -- register_lingering("strength_2", S("Lingering Strength Potion II"), "#D444F4", {
166 -- -- potion_fun = function(player) mcl_potions.strength_func(player, 6, smcl_potions.DURATION_2*0.25) end,
167 -- -- -- TODO: Fix tooltip
168 -- -- tt = time_string(mcl_potions.DURATION_2*0.25)
171 -- -- register_lingering("strength_plus", S("Lingering Strength Potion +"), "#D444E4", {
172 -- -- potion_fun = function(player) mcl_potions.strength_func(player, 3, mcl_potions.DURATION_PLUS*0.25) end,
173 -- -- -- TODO: Fix tooltip
174 -- -- tt = time_string(mcl_potions.DURATION_PLUS*0.25)