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
, is_water
)
15 lingering_effect_at
[pos
] = {color
= color
, timer
= 30, def
= def
, is_water
= is_water
}
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)
32 texture
= "mcl_potions_droplet.png"
34 texture
= "mcl_potions_sprite.png"
36 minetest
.add_particlespawner({
39 minpos
= {x
=pos
.x
-d
, y
=pos
.y
+0.5, z
=pos
.z
-d
},
40 maxpos
= {x
=pos
.x
+d
, y
=pos
.y
+1, z
=pos
.z
+d
},
41 minvel
= {x
=-0.5, y
=0, z
=-0.5},
42 maxvel
= {x
=0.5, y
=0.5, z
=0.5},
43 minacc
= {x
=-0.2, y
=0, z
=-0.2},
44 maxacc
= {x
=0.2, y
=.05, z
=0.2},
49 collisiondetection
= true,
51 texture
= texture
.."^[colorize:"..vals
.color
..":127",
54 -- Extinguish fire if water bottle
56 if mcl_potions
._extinguish_nearby_fire(pos
, d
) then
57 vals
.timer
= vals
.timer
- 3.25
61 -- Affect players and mobs
62 for _
, obj
in pairs(minetest
.get_objects_inside_radius(pos
, d
)) do
64 local entity
= obj
:get_luaentity()
65 if obj
:is_player() or entity
._cmi_is_mob
then
67 vals
.def
.potion_fun(obj
)
68 -- TODO: Apply timer penalty only if the potion effect was acutally applied
69 vals
.timer
= vals
.timer
- 3.25
74 if vals
.timer
<= 0 then lingering_effect_at
[pos
] = nil end
83 function mcl_potions
.register_lingering(name
, descr
, color
, def
)
85 local id
= "mcl_potions:"..name
.."_lingering"
86 local longdesc
= def
.longdesc
87 if not def
.no_effect
then
88 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.")
90 longdesc
= longdesc
.. "\n" .. def
.longdesc
93 minetest
.register_craftitem(id
, {
96 _doc_items_longdesc
= longdesc
,
97 _doc_items_usagehelp
= S("Use the “Punch” key to throw it."),
98 inventory_image
= lingering_image(color
),
99 groups
= {brewitem
=1, not_in_creative_inventory
=0},
100 on_use
= function(item
, placer
, pointed_thing
)
102 local dir
= placer
:get_look_dir();
103 local pos
= placer
:getpos();
104 local obj
= minetest
.add_entity({x
=pos
.x
+dir
.x
,y
=pos
.y
+2+dir
.y
,z
=pos
.z
+dir
.z
}, id
.."_flying")
105 obj
:setvelocity({x
=dir
.x
*velocity
,y
=dir
.y
*velocity
,z
=dir
.z
*velocity
})
106 obj
:setacceleration({x
=dir
.x
*-3, y
=-9.8, z
=dir
.z
*-3})
107 obj
:get_luaentity()._thrower
= placer
:get_player_name()
108 if not minetest
.is_creative_enabled(placer
:get_player_name()) then
114 _on_dispense
= function(stack
, dispenserpos
, droppos
, dropnode
, dropdir
)
115 local s_pos
= vector
.add(dispenserpos
, vector
.multiply(dropdir
, 0.51))
116 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")
118 obj
:set_velocity({x
=dropdir
.x
*velocity
,y
=dropdir
.y
*velocity
,z
=dropdir
.z
*velocity
})
119 obj
:set_acceleration({x
=dropdir
.x
*-3, y
=-9.8, z
=dropdir
.z
*-3})
125 minetest
.register_entity(id
.."_flying",{
126 textures
= {lingering_image(color
)},
128 visual_size
= {x
=w
/2,y
=w
/2},
129 collisionbox
= {-0.1,-0.1,-0.1,0.1,0.1,0.1},
131 on_step
= function(self
, dtime
)
132 local pos
= self
.object
:get_pos()
133 local node
= minetest
.get_node(pos
)
136 if n
~= "air" and n
~= "mcl_portals:portal" and n
~= "mcl_portals:portal_end" or mcl_potions
.is_obj_hit(self
, pos
) then
137 minetest
.sound_play("mcl_potions_breaking_glass", {pos
= pos
, max_hear_distance
= 16, gain
= 1})
138 add_lingering_effect(pos
, color
, def
, name
== "water")
139 local texture
, minacc
, maxacc
140 if name
== "water" then
141 texture
= "mcl_potions_droplet.png"
142 minacc
= {x
=-0.2, y
=-0.05, z
=-0.2}
143 maxacc
= {x
=0.2, y
=0.05, z
=0.2}
145 texture
= "mcl_potions_sprite.png"
146 minacc
= {x
=-0.2, y
=0, z
=-0.2}
147 maxacc
= {x
=0.2, y
=.05, z
=0.2}
149 minetest
.add_particlespawner({
152 minpos
= {x
=pos
.x
-d
, y
=pos
.y
+0.5, z
=pos
.z
-d
},
153 maxpos
= {x
=pos
.x
+d
, y
=pos
.y
+1, z
=pos
.z
+d
},
154 minvel
= {x
=-0.5, y
=0, z
=-0.5},
155 maxvel
= {x
=0.5, y
=0.5, z
=0.5},
162 collisiondetection
= true,
164 texture
= texture
.."^[colorize:"..color
..":127",
166 if name
== "water" then
167 mcl_potions
._extinguish_nearby_fire(pos
, d
)
175 -- -- register_lingering("weakness", S("Lingering Weakness Potion"), "#6600AA", {
176 -- -- potion_fun = function(player) mcl_potions.weakness_func(player, -4, mcl_potions.DURATION*mcl_potions.INV_FACTOR*0.25) end,
177 -- -- -- TODO: Fix tooltip
178 -- -- tt = time_string(mcl_potions.DURATION*mcl_potions.INV_FACTOR*0.25)
181 -- -- register_lingering("weakness_plus", S("Lingering Weakness Potion +"), "#7700BB", {
182 -- -- potion_fun = function(player) mcl_potions.weakness_func(player, -4, mcl_potions.DURATION_PLUS*mcl_potions.INV_FACTOR*0.25) end,
183 -- -- -- TODO: Fix tooltip
184 -- -- tt = time_string(mcl_potions.DURATION*mcl_potions.INV_FACTOR*0.25)
187 -- -- register_lingering("strength", S("Lingering Strength Potion"), "#D444D4", {
188 -- -- potion_fun = function(player) mcl_potions.strength_func(player, 3, mcl_potions.DURATION*0.25) end,
189 -- -- -- TODO: Fix tooltip
190 -- -- tt = time_string(mcl_potions.DURATION*0.25)
193 -- -- register_lingering("strength_2", S("Lingering Strength Potion II"), "#D444F4", {
194 -- -- potion_fun = function(player) mcl_potions.strength_func(player, 6, smcl_potions.DURATION_2*0.25) end,
195 -- -- -- TODO: Fix tooltip
196 -- -- tt = time_string(mcl_potions.DURATION_2*0.25)
199 -- -- register_lingering("strength_plus", S("Lingering Strength Potion +"), "#D444E4", {
200 -- -- potion_fun = function(player) mcl_potions.strength_func(player, 3, mcl_potions.DURATION_PLUS*0.25) end,
201 -- -- -- TODO: Fix tooltip
202 -- -- tt = time_string(mcl_potions.DURATION_PLUS*0.25)