Files
Endfield-Data/LuaScripts/UI/Widgets/LockToggle.lua
2025-12-02 20:37:18 +07:00

137 lines
3.5 KiB
Lua

local UIWidgetBase = require_ex('Common/Core/UIWidgetBase')
LockToggle = HL.Class('LockToggle', UIWidgetBase)
LockToggle.itemId = HL.Field(HL.String) << ""
LockToggle.instId = HL.Field(HL.Number) << 0
LockToggle.canLock = HL.Field(HL.Boolean) << true
LockToggle._OnFirstTimeInit = HL.Override() << function(self)
self:RegisterMessage(MessageConst.ON_ITEM_LOCKED_STATE_CHANGED, function(arg)
self:_OnItemLockedStateChanged(arg)
end)
self.view.toggle.onValueChanged:AddListener(function(isOn)
self:_LockItem(isOn)
end)
self.view.canLockBtn.onClick:AddListener(function()
Notify(MessageConst.SHOW_TOAST, Language.LUA_FORBID_ITEM_LOCK_TOAST)
end)
self.view.toggle.clickOnHintTextId = "key_hint_item_lock_toggle"
self.view.toggle.clickOffHintTextId = "key_hint_item_lock_toggle"
end
LockToggle.InitLockToggle = HL.Method(HL.String, HL.Number).Return(HL.Boolean) << function(self, itemId, instId)
self:_FirstTimeInit()
self.itemId = ""
if not instId or instId <= 0 or not (GameInstance.player.inventory:TryGetInstItem(Utils.getCurrentScope(), instId)) then
self.view.gameObject:SetActive(false)
return false
end
local itemData = Tables.itemTable[itemId]
if itemData == nil then
self.view.gameObject:SetActive(false)
return false
end
local itemType = itemData.type
if itemType == GEnums.ItemType.Weapon or itemType == GEnums.ItemType.WeaponGem or itemType == GEnums.ItemType.Equip then
self.view.gameObject:SetActive(true)
else
self.view.gameObject:SetActive(false)
return false
end
local isItemInDepot = GameInstance.player.inventory:IsItemInDepot(Utils.getCurrentScope(), itemId, instId)
self.view.toggle.interactable = isItemInDepot
self.view.canLockBtn.gameObject:SetActive(not isItemInDepot)
if not isItemInDepot then
self.view.toggle:SetIsOnWithoutNotify(false)
return false
end
self.itemId, self.instId = itemId, instId
self:_UpdateLockedState()
return true
end
LockToggle._LockItem = HL.Method(HL.Boolean) << function(self, isOn)
if string.isEmpty(self.itemId) then
return
end
local isItemLock = GameInstance.player.inventory:IsItemLocked(Utils.getCurrentScope(), self.itemId, self.instId)
if isItemLock ~= isOn then
GameInstance.player.inventory:LockItem(Utils.getCurrentScope(), self.itemId, self.instId, isOn)
if isOn then
AudioAdapter.PostEvent("au_ui_btn_valuable_lock")
else
AudioAdapter.PostEvent("au_ui_btn_valuable_unlock")
end
end
end
LockToggle._OnItemLockedStateChanged = HL.Method(HL.Table) << function(self, args)
if string.isEmpty(self.itemId) then
return
end
self:_UpdateLockedState()
end
LockToggle._UpdateLockedState = HL.Method() << function(self)
local isLocked = GameInstance.player.inventory:IsItemLocked(Utils.getCurrentScope(), self.itemId, self.instId)
self.view.toggle:SetIsOnWithoutNotify(isLocked)
if DeviceInfo.usingController then
self:_UpdateControllerKeyHint(isLocked)
end
end
LockToggle._UpdateControllerKeyHint = HL.Method(HL.Boolean) << function(self, isLocked)
local bindingId = self.view.toggle.hoverConfirmBindingId
if bindingId > 0 then
InputManagerInst:SetBindingText(bindingId, isLocked and
Language.LUA_ITEM_UNLOCK_KEY_HINT or Language.LUA_ITEM_LOCK_KEY_HINT)
end
end
HL.Commit(LockToggle)
return LockToggle