2020-04-26 18:10:46 +02:00
|
|
|
--[[
|
|
|
|
# Lightning Effect
|
|
|
|
Use this effect to cause lightning strikes.
|
2020-05-12 16:01:13 +02:00
|
|
|
Requires lightning mod in order to function. Uses default lightning configuration.
|
|
|
|
Expects an integer indicating a chance (between 0 and 1) for lightning to strike (per cycle and player).
|
2020-04-26 18:10:46 +02:00
|
|
|
]]
|
|
|
|
|
2020-04-13 01:58:27 +02:00
|
|
|
if not minetest.get_modpath("lightning") then return end
|
|
|
|
|
2020-04-16 10:04:34 +02:00
|
|
|
local EFFECT_NAME = "regional_weather:lightning"
|
|
|
|
|
2020-04-13 01:58:27 +02:00
|
|
|
lightning.auto = false
|
|
|
|
|
2020-04-13 13:40:36 +02:00
|
|
|
local rng = PcgRandom(82492402425)
|
|
|
|
|
2020-04-14 05:45:59 +02:00
|
|
|
-- simplified position chooser by Auke Kok (sofar) taken from lightning mod itself
|
|
|
|
-- see https://github.com/minetest-mods/lightning/blob/master/init.lua#L53-L91
|
|
|
|
-- "lightning" is licensed under GNU Lesser Public License 2.1 or any later revision
|
|
|
|
local function choose_pos(pos)
|
|
|
|
pos.x = math.floor(pos.x - (lightning.range_h / 2) + rng:next(1, lightning.range_h))
|
|
|
|
pos.y = pos.y + (lightning.range_v / 2)
|
|
|
|
pos.z = math.floor(pos.z - (lightning.range_h / 2) + rng:next(1, lightning.range_h))
|
|
|
|
|
|
|
|
local b, pos2 = minetest.line_of_sight(pos, {x = pos.x, y = pos.y - lightning.range_v, z = pos.z}, 1)
|
|
|
|
|
|
|
|
-- nothing but air found
|
|
|
|
if b then
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
|
|
|
local n = minetest.get_node({x = pos2.x, y = pos2.y - 1/2, z = pos2.z})
|
|
|
|
if n.name == "air" or n.name == "ignore" then
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
|
|
|
return pos2
|
|
|
|
end
|
|
|
|
|
2020-04-13 01:58:27 +02:00
|
|
|
local function handle_effect(player_data)
|
|
|
|
for playername, data in pairs(player_data) do
|
2020-05-12 16:01:13 +02:00
|
|
|
local chance = 0
|
|
|
|
for weather, value in pairs(data) do
|
|
|
|
if type(value) ~= "number" then
|
|
|
|
value = 1/20
|
|
|
|
end
|
|
|
|
chance = chance + value - (chance * value)
|
|
|
|
end
|
|
|
|
local random = math.random()
|
|
|
|
if random <= chance then
|
2020-04-14 05:45:59 +02:00
|
|
|
local player = minetest.get_player_by_name(playername)
|
|
|
|
local ppos = player:get_pos()
|
|
|
|
local position = choose_pos(ppos)
|
|
|
|
if position ~= nil then
|
|
|
|
lightning.strike(position)
|
|
|
|
end
|
2020-04-13 01:58:27 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-04-16 10:04:34 +02:00
|
|
|
climate_api.register_effect(EFFECT_NAME, handle_effect, "tick")
|
|
|
|
climate_api.set_effect_cycle(EFFECT_NAME, climate_api.LONG_CYCLE)
|