276 lines
7.1 KiB
Plaintext
276 lines
7.1 KiB
Plaintext
|
--[[
|
||
|
Interactivity for stove furniture
|
||
|
Author: HarukaSai (visit us at: https://discord.com/invite/efp)
|
||
|
Credits: Aoldri
|
||
|
19-06-2023
|
||
|
]]
|
||
|
|
||
|
local function use_container(id,pid)
|
||
|
local box = id and level.object_by_id(id)
|
||
|
if (box) then
|
||
|
--level.map_add_object_spot(id, "ui_pda2_actor_box_location", "st_ui_pda_actor_box") -- debug
|
||
|
curBoxID = pid
|
||
|
hide_hud_inventory()
|
||
|
box:use(db.actor)
|
||
|
return true -- destroy timed event
|
||
|
end
|
||
|
return false -- repeat timed event
|
||
|
end
|
||
|
|
||
|
-- called from item section in items.ltx
|
||
|
function access_inventory(obj)
|
||
|
local id = obj:id()
|
||
|
local m_data = alife_storage_manager.get_state()
|
||
|
local se_inv_box = m_data.stove_stashes and m_data.stove_stashes[id] and alife_object(m_data.stove_stashes[id])
|
||
|
if not (se_inv_box) then
|
||
|
-- position under map
|
||
|
local pos = vec_set(obj:position())
|
||
|
pos.y = pos.y - 50
|
||
|
|
||
|
-- create inventory_box_s
|
||
|
se_inv_box = alife_create(SYS_GetParam(0, obj:section(), "integrated_storage"),pos,obj:level_vertex_id(),obj:game_vertex_id())
|
||
|
|
||
|
end
|
||
|
if (se_inv_box) then
|
||
|
-- shouldn't be possible but very safe incase some sort of save corruption
|
||
|
if not (IsInvbox(nil,se_inv_box:clsid())) then
|
||
|
if m_data.stove_stashes then
|
||
|
m_data.stove_stashes[id] = nil
|
||
|
end
|
||
|
return
|
||
|
end
|
||
|
|
||
|
-- force strictly online
|
||
|
alife():set_switch_online(se_inv_box.id,true)
|
||
|
alife():set_switch_offline(se_inv_box.id,false)
|
||
|
|
||
|
-- Save container
|
||
|
if not (m_data.stove_stashes) then
|
||
|
m_data.stove_stashes = {}
|
||
|
end
|
||
|
m_data.stove_stashes[id] = se_inv_box.id
|
||
|
|
||
|
-- Object will come online next update so wait
|
||
|
CreateTimeEvent(id,"container",0,use_container,se_inv_box.id,id)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local ratio = utils_xml.screen_ratio()
|
||
|
GUI = nil -- instance, don't touch
|
||
|
|
||
|
class "UICookStove" (CUIScriptWnd)
|
||
|
|
||
|
function UICookStove:__init() super()
|
||
|
self:InitControls()
|
||
|
self:InitCallbacks()
|
||
|
end
|
||
|
|
||
|
function UICookStove:__finalize()
|
||
|
GUI = nil
|
||
|
end
|
||
|
|
||
|
function UICookStove:InitControls()
|
||
|
self:SetWndRect(Frect():set(0,0,1024,768))
|
||
|
self.wide = (device().width/device().height) > (1024/768 + 0.01)
|
||
|
|
||
|
self:SetAutoDelete(true)
|
||
|
|
||
|
local xml = CScriptXmlInit()
|
||
|
-- xml:ParseFile("ui_sleep_dialog.xml")
|
||
|
xml:ParseFile("ui_furniture_stove_dialog.xml")
|
||
|
|
||
|
self.back = xml:InitFrame("background", self)
|
||
|
|
||
|
self.icon = xml:InitStatic("icon", self.back)
|
||
|
self.icon_temp = xml:InitStatic("icon", self.back)
|
||
|
|
||
|
self.icon:SetWndSize(vector2():set( self.icon:GetWidth(), self.icon:GetWidth() / ratio ))
|
||
|
|
||
|
--self.btn_pickup = xml:Init3tButton("btn_pickup", self.back)
|
||
|
--self:Register(self.btn_pickup, "btn_pickup")
|
||
|
|
||
|
self.btn_close = xml:Init3tButton("btn_close", self.back)
|
||
|
self:Register(self.btn_close, "btn_close")
|
||
|
|
||
|
self.btn_access_stash = xml:Init3tButton("btn_access_stash", self.back)
|
||
|
self:Register(self.btn_access_stash, "btn_access_stash")
|
||
|
|
||
|
|
||
|
self.btn_use_stove = xml:Init3tButton("btn_use_stove", self.back)
|
||
|
self:Register(self.btn_use_stove, "btn_use_stove")
|
||
|
end
|
||
|
|
||
|
function UICookStove:AccessStash()
|
||
|
local obj = get_object_by_id(self.obj_id)
|
||
|
access_inventory(obj)
|
||
|
self:Close()
|
||
|
end
|
||
|
|
||
|
function UICookStove:GetStashObj()
|
||
|
local m_data = alife_storage_manager.get_state()
|
||
|
local se_inv_box = m_data.stove_stashes and m_data.stove_stashes[self.obj_id] and alife_object(m_data.stove_stashes[self.obj_id])
|
||
|
local stash_id = nil
|
||
|
if (se_inv_box) then
|
||
|
-- shouldn't be possible but very safe incase some sort of save corruption
|
||
|
if not (IsInvbox(nil,se_inv_box:clsid())) then
|
||
|
if m_data.stove_stashes then
|
||
|
m_data.stove_stashes[self.obj_id] = nil
|
||
|
end
|
||
|
return
|
||
|
end
|
||
|
|
||
|
-- force strictly online
|
||
|
alife():set_switch_online(se_inv_box.id,true)
|
||
|
alife():set_switch_offline(se_inv_box.id,false)
|
||
|
|
||
|
-- Save container
|
||
|
if not (m_data.stove_stashes) then
|
||
|
m_data.stove_stashes = {}
|
||
|
end
|
||
|
m_data.stove_stashes[self.obj_id] = se_inv_box.id
|
||
|
|
||
|
stash_id = se_inv_box.id
|
||
|
|
||
|
end
|
||
|
-- Object will come online next update so wait
|
||
|
CreateTimeEvent(self.obj_id,"move_stash",0,self.GiveStashToActor,self,stash_id)
|
||
|
end
|
||
|
|
||
|
function UICookStove:Pickup()
|
||
|
local obj = get_object_by_id(self.obj_id)
|
||
|
|
||
|
alife_create_item(self.section.item, db.actor)
|
||
|
|
||
|
local m_data = alife_storage_manager.get_state()
|
||
|
if m_data.stove_stashes then
|
||
|
local id = m_data.stove_stashes[self.obj_id]
|
||
|
local stash_obj = get_object_by_id(id)
|
||
|
if stash_obj then
|
||
|
stash_obj:iterate_inventory_box( function(temp, obj)
|
||
|
stash_obj:transfer_item(obj, db.actor)
|
||
|
end, stash_obj)
|
||
|
end
|
||
|
alife_release_id(id)
|
||
|
end
|
||
|
|
||
|
alife_release(obj)
|
||
|
self:Close()
|
||
|
end
|
||
|
|
||
|
function UICookStove:UseCook()
|
||
|
self:GetStashObj()
|
||
|
end
|
||
|
|
||
|
local item_ids = {}
|
||
|
local stash_obj_id = nil
|
||
|
|
||
|
function return_items()
|
||
|
if stash_obj_id == nil then return end
|
||
|
local stash_obj = get_object_by_id(stash_obj_id)
|
||
|
if stash_obj == nil then return end
|
||
|
|
||
|
for i, id in ipairs(item_ids) do
|
||
|
local item_obj = get_object_by_id(id)
|
||
|
if item_obj then
|
||
|
db.actor:transfer_item(item_obj, stash_obj)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function GUI_on_hide(name)
|
||
|
if name == "UICook" then
|
||
|
return_items()
|
||
|
UnregisterScriptCallback("GUI_on_hide", GUI_on_hide)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function UICookStove:GiveStashToActor(id)
|
||
|
local items = {}
|
||
|
|
||
|
if id then
|
||
|
local stash_obj = get_object_by_id(id)
|
||
|
stash_obj:iterate_inventory_box( function(temp, obj)
|
||
|
table.insert(items, obj:id())
|
||
|
stash_obj:transfer_item(obj, db.actor)
|
||
|
end, stash_obj)
|
||
|
end
|
||
|
|
||
|
item_ids = items
|
||
|
stash_obj_id = id
|
||
|
|
||
|
RegisterScriptCallback("GUI_on_hide", GUI_on_hide)
|
||
|
|
||
|
CreateTimeEvent(self.obj_id,"open_stove",0.1,self.OpenCookUI,self)
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
function UICookStove:OpenCookUI()
|
||
|
local obj = get_object_by_id(self.obj_id)
|
||
|
local cook_ui = item_cooking.start(obj, "fieldcooker")
|
||
|
self:Close()
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
function UICookStove:InitCallbacks()
|
||
|
self:AddCallback("btn_access_stash", ui_events.BUTTON_CLICKED, self.AccessStash, self)
|
||
|
--self:AddCallback("btn_pickup", ui_events.BUTTON_CLICKED, self.Pickup, self)
|
||
|
self:AddCallback("btn_use_stove", ui_events.BUTTON_CLICKED, self.UseCook, self)
|
||
|
self:AddCallback("btn_close", ui_events.BUTTON_CLICKED, self.Close, self)
|
||
|
end
|
||
|
|
||
|
function UICookStove:Initialize()
|
||
|
local obj = get_object_by_id(self.obj_id)
|
||
|
|
||
|
self.section = {}
|
||
|
self.section.placeable = obj:section() or "placeable_stove1"
|
||
|
self.section.item = SYS_GetParam(0, self.section.placeable, "item_section", "prop_stove2")
|
||
|
|
||
|
utils_xml.set_icon(self.section.item, false, self.icon_temp, self.icon)
|
||
|
|
||
|
self.btn_access_stash:Enable(SYS_GetParam(0, self.section.placeable, "integrated_storage") and true or false)
|
||
|
end
|
||
|
|
||
|
function UICookStove:TestAndShow(obj_id)
|
||
|
self.obj_id = obj_id
|
||
|
self:Initialize()
|
||
|
self:ShowDialog(true)
|
||
|
Register_UI("UICookStove","ui_furniture_stove")
|
||
|
end
|
||
|
|
||
|
function UICookStove:Update()
|
||
|
CUIScriptWnd.Update(self)
|
||
|
end
|
||
|
|
||
|
function UICookStove:OnTrackButton()
|
||
|
end
|
||
|
|
||
|
function UICookStove:OnKeyboard(dik, keyboard_action)
|
||
|
local res = CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
|
||
|
if (res == false) then
|
||
|
local bind = dik_to_bind(dik)
|
||
|
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
|
||
|
|
||
|
if dik == DIK_keys.DIK_ESCAPE then
|
||
|
self:Close()
|
||
|
end
|
||
|
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return res
|
||
|
end
|
||
|
|
||
|
function UICookStove:Close()
|
||
|
if (self:IsShown()) then
|
||
|
self:HideDialog()
|
||
|
end
|
||
|
|
||
|
Unregister_UI("UICookStove")
|
||
|
end
|
||
|
|
||
|
function start_dialog(obj_id)
|
||
|
if (GUI == nil) then
|
||
|
GUI = UICookStove()
|
||
|
end
|
||
|
GUI:TestAndShow(obj_id)
|
||
|
end
|