89 lines
2.2 KiB
Plaintext
89 lines
2.2 KiB
Plaintext
|
--[[
|
||
|
=====================================================================
|
||
|
Addon : Zone Quit
|
||
|
Link : https://www.moddb.com/mods/stalker-anomaly/addons/zone-quit
|
||
|
Author : party_50
|
||
|
Date : 19.02.2024
|
||
|
Last Edit : 21.02.2024
|
||
|
=====================================================================
|
||
|
--]]
|
||
|
|
||
|
|
||
|
local HAVE_TO_FINISH_STORY = true
|
||
|
local GATES_LEVEL = "l01_escape"
|
||
|
local GATES_POS = vector():set(-123.3811, -26.3140, -478.0168)
|
||
|
local TRIGGER_RADIUS = 3
|
||
|
local PAUSE_DURATION = 3000
|
||
|
|
||
|
local quit_zone_time = 0
|
||
|
local near_exit = false
|
||
|
local update_timer = 0
|
||
|
local dialog
|
||
|
|
||
|
|
||
|
class "exit_dialog" (CUIScriptWnd)
|
||
|
function exit_dialog:__init() super()
|
||
|
self:SetWndRect(Frect():set(0, 0, 1024, 768))
|
||
|
self.exit_mb = CUIMessageBoxEx()
|
||
|
self:Register(self.exit_mb, "exit_mb")
|
||
|
self:AddCallback("exit_mb", ui_events.MESSAGE_BOX_YES_CLICKED, self.OnMsgYes, self)
|
||
|
end
|
||
|
|
||
|
function exit_dialog:Show(mb_type, text)
|
||
|
self.exit_mb:InitMessageBox(mb_type)
|
||
|
self.exit_mb:SetText(text)
|
||
|
self.exit_mb:ShowDialog(true)
|
||
|
end
|
||
|
|
||
|
function exit_dialog:OnMsgYes()
|
||
|
quit_zone_time = time_global()
|
||
|
level.add_pp_effector("sleep_fade.ppe", 10006, false)
|
||
|
end
|
||
|
|
||
|
function show_dialog(mb_type, text)
|
||
|
if not dialog then
|
||
|
dialog = exit_dialog()
|
||
|
end
|
||
|
dialog:Show(mb_type, text)
|
||
|
end
|
||
|
|
||
|
function process_exit_dialog()
|
||
|
if has_alife_info("story_mode_disabled") or not HAVE_TO_FINISH_STORY or has_alife_info("operation_afterglow_complete") then
|
||
|
show_dialog("message_box_yes_no", "st_zone_quit_text")
|
||
|
else
|
||
|
actor_menu.set_msg(1, "st_zone_quit_not_done", 10)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function actor_on_update()
|
||
|
local tg = time_global()
|
||
|
if quit_zone_time == 0 and update_timer > tg then
|
||
|
return
|
||
|
end
|
||
|
update_timer = tg + 200
|
||
|
|
||
|
-- Following code is executed once per 200 ms
|
||
|
|
||
|
if level.name() ~= GATES_LEVEL then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if quit_zone_time == 0 and db.actor:position():distance_to(GATES_POS) < TRIGGER_RADIUS then
|
||
|
if not near_exit then
|
||
|
process_exit_dialog()
|
||
|
end
|
||
|
near_exit = true
|
||
|
else
|
||
|
near_exit = false
|
||
|
end
|
||
|
|
||
|
if quit_zone_time > 0 and time_global() - quit_zone_time > PAUSE_DURATION then
|
||
|
xr_effects.game_disconnect()
|
||
|
xr_effects.game_credits()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function on_game_start()
|
||
|
RegisterScriptCallback("actor_on_update", actor_on_update)
|
||
|
end
|