-- basic dynamic msg_box -- alundaio local ini = ini_file("sr_teleport_sections.ltx") class "msg_box_ui" (CUIScriptWnd) function msg_box_ui:__init(obj,disable_msg,item) super() self:SetWndRect(Frect():set(0,0,1024,768)) self:SetAutoDelete(true) self.name = obj and obj:name() self.disable_msg = disable_msg self.item = item if (string.find(self.name,obj:id())) then local story_name = get_object_story_id(obj:id()) self.name = story_name or self.name end if (not self.name or not ini:section_exist(self.name)) then printf("sr_teleport_sections.ltx: section doesn't exist %s",obj and obj:name()) return end if (alife_storage_manager.get_state().opened_routes ~= true) then if not (( txr_routes.scan_route(self.name)) or mlr_utils.load_var("routes_"..self.name)) then actor_menu.set_msg(1, game.translate_string("st_route_unknown"),5) self:InitCallBacks() self:OnMsgCancel() return end end --[[ local enable = ini:r_string_ex(self.name,"enable") enable = enable and xr_logic.pick_section_from_condlist(db.actor,obj,xr_logic.parse_condlist(obj,"enable",self.name,enable)) if (enable ~= "true") then local reject_on_disable = ini:r_bool_ex(self.name,"reject_on_disabled",false) if (reject_on_disable) then local warning = ini:r_string_ex(self.name,"warning") if (warning) then actor_menu.set_msg(1, game.translate_string(warning),5) end self:InitCallBacks() self:OnMsgCancel() end return end ]]-- self.obj = obj self.message_box = CUIMessageBoxEx() self:Register(self.message_box, "msg_box") self:InitCallBacks() if not (is_empty(xr_combat_ignore.fighting_with_actor_npcs)) then self:InitControls() else self:OnMsgOk() end end function msg_box_ui:__finalize() end function msg_box_ui:InitCallBacks() self:AddCallback("msg_box", ui_events.MESSAGE_BOX_OK_CLICKED, self.OnMsgOk, self) self:AddCallback("msg_box", ui_events.MESSAGE_BOX_CANCEL_CLICKED, self.OnMsgCancel, self) self:AddCallback("msg_box", ui_events.MESSAGE_BOX_YES_CLICKED, self.OnMsgOk, self) self:AddCallback("msg_box", ui_events.MESSAGE_BOX_NO_CLICKED, self.OnMsgCancel, self) end function msg_box_ui:OnMsgOk() local pos = ini:r_string_ex(self.name,"position") local path = pos == nil and ini:r_string_ex(self.name,"path") local point = path and patrol(path) if not (pos or point) then return end --if not (self.disable_msg) then level.add_pp_effector("sleep_fade.ppe", 1313, false) --end local function travel() if (ini:r_bool_ex(self.name,"autosave",false)) then xr_effects.scenario_autosave(nil,nil,{ini:r_string_ex(self.name,"hint") or "moving"}) end local p = pos and str_explode(pos,",") pos = p and vector():set(tonumber(p[1]),tonumber(p[2]),tonumber(p[3])) local allow_car = ini:r_bool_ex(self.name,"allow_vehicle",true) if (allow_car) then -- allow vehicles to teleport too local car = db.actor:get_attached_vehicle() if (car) then car:force_set_position(pos or point and point:point(0)) else db.actor:set_actor_position(pos or point and point:point(0)) end else -- If not wanting vehicles to teleport local car = db.actor:get_attached_vehicle() if (car) then db.actor:detach_vehicle() local cpos = ini:r_string_ex(self.name,"reject") local cpath = cpos == nil and ini:r_string_ex(self.name,"reject_path") local cpoint = cpath and patrol(cpath) local cp = cpos and str_explode(cpos,",") cpos = cp and vector():set(tonumber(cp[1]) or 0,tonumber(cp[2]) or 0,tonumber(cp[3]) or 0) if (cpos or cpoint) then TeleportObject(car:id(),cpos or cpoint and cpoint:point(0),cpoint and cpoint:level_vertex_id(0),cpoint and cpoint:game_vertex_id(0)) end end db.actor:set_actor_position(pos or point and point:point(0) or db.actor:position()) end if (pos and p[4]) then db.actor:set_actor_direction(tonumber(p[4]) or 0) end return true end SendScriptCallback("on_before_level_changing") CreateTimeEvent(0,"delay_travel",3,travel) end function msg_box_ui:OnMsgCancel() local pos = ini:r_string_ex(self.name,"reject") local path = pos == nil and ini:r_string_ex(self.name,"reject_path") local point = path and patrol(path) if not (pos or point) then return end local p = pos and str_explode(pos,",") pos = p and vector():set(tonumber(p[1]) or 0,tonumber(p[2]) or 0,tonumber(p[3]) or 0) db.actor:set_actor_position(pos or point and point:point(0) or db.actor:position()) if (pos and p[4]) then db.actor:set_actor_direction(tonumber(p[4]) or 0) return end db.actor:set_actor_direction(-device().cam_dir:getH()) end function msg_box_ui:InitControls() if (self.disable_msg) then if (not self.item or db.actor:object(self.item)) then self:OnMsgOk() else self:OnMsgCancel() end return end self.message_box:InitMessageBox("message_box_yes_no") self.message_box:ShowDialog(true) local next_level = game.translate_string(ini:r_string_ex(self.name,"hint") or "") local msg_str = game.translate_string("st_level_changer_descr") local str = strformat(msg_str, next_level) self.message_box:SetText(str) end