Divergent/mods/Arrival/gamedata/scripts/arrival_environmental_parti...

323 lines
9.2 KiB
Plaintext

--==============================================================================================
--Yet Another Winter Mod snowfall script
--Author: Daedalus-Prime
-- Edit by demonized:
-- Refactor of script for easier adding and toggling of particles
-- Check for playing particles depending on ray collision
-- Playing particles outside of covers depending on location where actor entered the cover for muh immersion
-- Saving entered cover position and restoring it on save/load
-- edit by FabioConte for Anomqly Season's Redux (05.02.2023)
-- edit by S.e.m.i.t.o.n.e. for 'The Arrival' mod
--==============================================================================================
function on_game_start()
RegisterScriptCallback("actor_on_update", actor_on_update)
RegisterScriptCallback("save_state", save_state)
RegisterScriptCallback("load_state", load_state)
end
local ray = function(pos, dir, args)
local pos = pos and vector():set(pos.x or pos[1], pos.y or pos[2], pos.z or pos[3]) or device().cam_pos
local dir = dir and vector():set(dir.x or dir[1], dir.y or dir[2], dir.z or dir[3]) or device().cam_dir
local args = args or {}
local pick = ray_pick()
pick:set_position(pos)
pick:set_direction(dir)
pick:set_flags(args.flags or 2)
pick:set_range(args.range or 200)
if args.ignore_object then
pick:set_ignore_object(args.ignore_object)
end
pick:query()
return pick
end
local snow_particle_foggy = particles_object("semitone\\environmental\\seed1") --set particles to variables
local snow_particle_foggy1 = particles_object("semitone\\environmental\\seed2")
local snow_particle_foggy2 = particles_object("semitone\\environmental\\tree_leaves_stormy")
local snow_particle_foggy3 = particles_object("lanforse\\fog_mist")
-- These particles wont play inside at all
dont_play_inside_particles = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
}
weather_to_particles = {
["default"] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = false,
[snow_particle_foggy3] = false,
},
["w_ccgim_fog"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = false,
[snow_particle_foggy3] = false,
},
["w_clear_foggy"] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = false,
[snow_particle_foggy3] = false,
},
["w_clear1"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_clear2"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_cloudy1"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_cloudy2"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_cloudy2_dark"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_cloudy3"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_cloudy4"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_deaspir_foggy"] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_foggy1"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = false,
[snow_particle_foggy3] = false,
},
["w_foggy2"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = false,
[snow_particle_foggy3] = false,
},
["w_foggy3"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = false,
[snow_particle_foggy3] = false,
},
["w_indoor_agr_underground"] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = false,
[snow_particle_foggy3] = false,
},
["w_indoor_ambient"] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = false,
[snow_particle_foggy3] = false,
},
["w_indoor_default"] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = false,
[snow_particle_foggy3] = false,
},
["w_indoor_jupiter_underground"] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = false,
[snow_particle_foggy3] = false,
},
["w_indoor_sarcofag"] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = false,
[snow_particle_foggy3] = false,
},
["w_partly1"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_partly2"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_partly3"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_partly4"] = {
[snow_particle_foggy] = true,
[snow_particle_foggy1] = true,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_rain1"] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_rain2"] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_rain3"] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_storm1"] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_storm2"] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
["w_swtc_tuman"] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = true,
[snow_particle_foggy3] = false,
},
[0] = {
[snow_particle_foggy] = false,
[snow_particle_foggy1] = false,
[snow_particle_foggy2] = false,
[snow_particle_foggy3] = false,
},
}
function switch_particles(particle_table, pos, is_inside)
local pos = pos or device().cam_pos
for k, v in pairs(particle_table) do
-- Disable particles that are in dont_play_inside_particles table if inside
if is_inside and dont_play_inside_particles[k] then
if k:playing() then
k:stop()
end
else
if v then
if k:playing() then
k:move_to(pos, VEC_ZERO)
else
k:play_at_pos(pos)
end
else
if k:playing() then
k:stop_deffered()
end
end
end
end
end
local ray_args = {
range = 30
}
local inside_pos
function actor_on_update()
-- Check current weather
local weather = level.get_weather()
-- Detection of cover by rain collision
local cam_pos = device().cam_pos
local r1 = ray(cam_pos, VEC_Y, ray_args)
local r2 = ray(cam_pos, vector():set(VEC_Y):add(vector():set(1.5, 0, 0)), ray_args)
local r3 = ray(cam_pos, vector():set(VEC_Y):add(vector():set(-1.5, 0, 0)), ray_args)
local r4 = ray(cam_pos, vector():set(VEC_Y):add(vector():set(0, 0, 1.5)), ray_args)
local r5 = ray(cam_pos, vector():set(VEC_Y):add(vector():set(0, 0, -1.5)), ray_args)
local r = r1:get_distance() > 0
and r2:get_distance() > 0
and r3:get_distance() > 0
and r4:get_distance() > 0
and r5:get_distance() > 0
-- Set variable for whether the player is in an emission safe zone or not
local is_inside = GetEvent("current_safe_cover") or r
-- Set variable for whether the player is in an underground level or not
local is_underground = GetEvent("underground")
-- If exists saved position where actor entered cover, apply it
local pos
if is_inside then
if inside_pos then
pos = vector():set(inside_pos.x, cam_pos.y, inside_pos.z)
else
inside_pos = cam_pos
pos = inside_pos
end
else
inside_pos = nil
end
snowfall(weather, is_inside, is_underground, pos)
end
function snowfall(weather, is_inside, is_underground, inside_pos)
if is_underground then
switch_particles(weather_to_particles[0], inside_pos, is_inside)
UnregisterScriptCallback("actor_on_update", actor_on_update)
return
end
if (is_inside and not inside_pos) or not weather_to_particles[weather] then
switch_particles(weather_to_particles[0], inside_pos, is_inside)
return
end
switch_particles(weather_to_particles[weather], inside_pos, is_inside)
end
function save_state(m_data)
m_data.snowfall_inside_pos = inside_pos and utils_data.vector_to_string(inside_pos)
end
function load_state(m_data)
inside_pos = m_data.snowfall_inside_pos and utils_data.string_to_vector(m_data.snowfall_inside_pos)
end