Files
Endfield-Data/LuaScripts/UI/Panels/FacSaveBlueprint/FacSaveBlueprintCtrl.lua
2025-12-02 20:37:18 +07:00

466 lines
15 KiB
Lua

local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.FacSaveBlueprint
FacSaveBlueprintCtrl = HL.Class('FacSaveBlueprintCtrl', uiCtrl.UICtrl)
FacSaveBlueprintCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.FAC_ON_SAVE_BLUEPRINT] = 'FacOnSaveBlueprint',
[MessageConst.FAC_ON_MODIFY_BLUEPRINT] = 'FacOnModifyBlueprint',
[MessageConst.FAC_ON_FETCH_BLUEPRINT] = 'FacOnFetchBlueprint',
[MessageConst.FAC_ON_GET_GIFT_BLUEPRINT] = 'FacOnGetGiftBlueprint',
[MessageConst.FAC_ON_UNLOCK_TECH_TREE_UI] = 'OnRefreshTechTree',
[MessageConst.ON_UNLOCK_FAC_TECH_PACKAGE] = 'OnRefreshTechTree',
[MessageConst.FAC_ON_UNLOCK_TECH_TIER_UI] = 'OnRefreshTechTree',
}
FacSaveBlueprintCtrl.m_bpInst = HL.Field(CS.Beyond.Gameplay.RemoteFactory.RemoteFactoryBlueprintInstance)
FacSaveBlueprintCtrl.m_csBP = HL.Field(CS.Beyond.Gameplay.RemoteFactory.RemoteFactoryBlueprint)
FacSaveBlueprintCtrl.m_isCreate = HL.Field(HL.Boolean) << false
FacSaveBlueprintCtrl.m_isEditing = HL.Field(HL.Boolean) << false
FacSaveBlueprintCtrl.m_isSharing = HL.Field(HL.Boolean) << false
FacSaveBlueprintCtrl.m_isImporting = HL.Field(HL.Boolean) << false
FacSaveBlueprintCtrl.m_blueprintID = HL.Field(HL.Any) << 0
FacSaveBlueprintCtrl.m_shareCode = HL.Field(HL.Any)
FacSaveBlueprintCtrl.m_fromFriend = HL.Field(HL.Boolean) << false
FacSaveBlueprintCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
self.view.cancelBtn.onClick:AddListener(function()
self:_OnClickClose()
end)
self.view.closeBtn.onClick:AddListener(function()
self:_OnClickClose()
end)
self.view.saveBtn.onClick:AddListener(function()
self:_OnClickSave()
end)
local bpAbnormalIconHelper
if arg then
self.m_blueprintID = arg.id
self.m_bpInst = arg.bpInst
self.m_csBP = self.m_bpInst.info.bp
self.m_isCreate = false
self.m_isSharing = arg.isSharing or false
self.m_isImporting = arg.isImporting or false
self.m_isEditing = arg.bpInst.sourceType == CS.Beyond.Gameplay.RemoteFactory.RemoteFactoryBlueprintSourceType.Mine and not self.m_isSharing
self.m_fromFriend = arg.fromFriend or false
if arg.shareCode then
self.m_shareCode = arg.shareCode
end
if not self.m_isEditing then
bpAbnormalIconHelper = FactoryUtils.createBPAbnormalIconHelper()
end
else
self.m_csBP = LuaSystemManager.factory:GetBlueprintFromBatchSelectTargets()
self.m_isCreate = true
self.m_isEditing = true
end
if self.m_isSharing then
self.view.titleTxt.text = Language.LUA_FAC_BLUEPRINT_SHARE_TITLE
elseif self.m_isCreate then
self.view.titleTxt.text = Language.LUA_FAC_BLUEPRINT_CREATE_TITLE
elseif self.m_isEditing then
self.view.titleTxt.text = Language.LUA_FAC_BLUEPRINT_EDIT_TITLE
else
self.view.titleTxt.text = Language.LUA_FAC_BLUEPRINT_VIEW_TITLE
end
self.view.blueprintContent.view.deviceCell.moreDeviceCell.gameObject:SetActive(false)
if self.m_isSharing then
self.view.closeBtn.gameObject:SetActive(false)
else
self.view.closeBtn.gameObject:SetActive(true)
end
self:_RefreshBlueprintContent()
self.view.blueprintPreview:InitBlueprintPreview(self.m_csBP, self.m_isEditing, bpAbnormalIconHelper)
self.view.main:SetState(self.m_isImporting and "Importing" or (self.m_isSharing and "Photo" or (self.m_isEditing and "Editing" or "ViewOnly")))
if self.m_isSharing then
self.animationWrapper:SampleToInAnimationEnd()
end
if DeviceInfo.usingController then
self:_RefreshController()
end
end
FacSaveBlueprintCtrl._RefreshController = HL.Method() << function(self)
if self.m_isSharing then
self:_SetActiveControllerMouse(false)
return
end
self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({ self.view.inputGroup.groupId })
self.view.blueprintContent:SetActiveControllerNode(self.m_isEditing and FacConst.FocusStateTable.UnFocused or FacConst.FocusStateTable.None)
self.view.blueprintContent.view.topContainer.onIsFocusedChange:RemoveAllListeners()
self.view.blueprintContent.view.topContainer.onIsFocusedChange:AddListener(function(isFocused)
self:_SetActiveControllerMouse(not isFocused)
self.view.blueprintContent:SetActiveControllerNode(isFocused and FacConst.FocusStateTable.Focused or FacConst.FocusStateTable.UnFocused)
if isFocused then
UIUtils.setAsNaviTarget(self.view.blueprintContent.view.changeIconBtn)
end
end)
self.view.blueprintContent.view.content.onIsFocusedChange:RemoveAllListeners()
self.view.blueprintContent.view.content.onIsFocusedChange:AddListener(function(isFocused)
self:_SetActiveControllerMouse(not isFocused)
end)
self.view.blueprintPreview.view.leftBottomNode.gameObject:SetActive(true)
self:BindInputPlayerAction("fac_blueprint_move_mouse", function() end,self.view.inputGroup.groupId)
if not self.m_bpInst or (self.m_bpInst.sourceType == CS.Beyond.Gameplay.RemoteFactory.RemoteFactoryBlueprintSourceType.Mine) then
self.view.blueprintContent.view.activeKeyHintState:SetState("EditBlueprint")
self.view.blueprintContent.view.tagNode.button.interactable = true
self.view.blueprintPreview.view.controllerEditBtn.gameObject:SetActive(true)
self.view.blueprintPreview.view.controllerEditBtn.onClick:RemoveAllListeners()
self.view.blueprintPreview.view.controllerEditBtn.onClick:AddListener(function()
self.view.blueprintPreview:_OnClick()
end)
end
if not self.m_bpInst then
return
end
if (self.m_bpInst.sourceType == CS.Beyond.Gameplay.RemoteFactory.RemoteFactoryBlueprintSourceType.Sys or self.m_bpInst.sourceType == CS.Beyond.Gameplay.RemoteFactory.RemoteFactoryBlueprintSourceType.Preset) then
InputManagerInst:ToggleGroup(self.view.blueprintContent.view.topBinding.groupId,false)
end
if self.m_bpInst.sourceType == CS.Beyond.Gameplay.RemoteFactory.RemoteFactoryBlueprintSourceType.Gift then
self.view.blueprintContent.view.tagNode.button.interactable = false
InputManagerInst:ToggleGroup(self.view.blueprintContent.view.topBinding.groupId,false)
if FactoryUtils.isOtherPeopleGiftBlueprint(self.m_bpInst) then
self.view.blueprintContent.view.activeKeyHint.actionId = "fac_blueprint_more"
self.view.blueprintContent.view.activeKeyHintState:SetState("SaveBlueprint")
self:BindInputPlayerAction("fac_blueprint_more", function()
self:_SetActiveControllerMouse(false)
self.view.blueprintContent:_SeeMoreInfo({
onClose = function()
self:_SetActiveControllerMouse(true)
end
})
end)
end
end
end
FacSaveBlueprintCtrl._SetActiveControllerMouse = HL.Method(HL.Boolean) << function(self, active)
self.view.blueprintPreview.mouseShow = active
self.view.blueprintPreview.view.leftBottomNode.gameObject:SetActive(active)
if not active then
self.view.blueprintPreview:_CancelHover()
end
end
FacSaveBlueprintCtrl._OnClickSave = HL.Method() << function(self)
self:_CheckIsChangedAndDo(function(name, desc, icon, colorId, tagIds)
if self.m_isCreate then
local csBPSys = GameInstance.player.remoteFactory.blueprint
if csBPSys.myBlueprints.Count >= Tables.facBlueprintConst.MyBluePrintNumMax then
Notify(MessageConst.SHOW_TOAST, Language.LUA_FAC_BLUEPRINT_SAVE_FAIL_FOR_MAX_COUNT)
self:PlayAnimationOutAndClose()
return
end
self.view.blueprintPreview:ApplyIconChanges()
GameInstance.player.remoteFactory.blueprint:SendSaveBlueprint(self.m_csBP, name, desc, icon, colorId, tagIds)
elseif self.m_isEditing then
Notify(MessageConst.SHOW_POP_UP, {
content = Language.LUA_FAC_BLUEPRINT_SAVE_CHANGE_HINT,
warningContent = Language.LUA_FAC_BLUEPRINT_SAVE_CHANGE_WARNING_HINT,
onConfirm = function()
local changedProdIconDic = self.view.blueprintPreview:GetChangedIcons()
GameInstance.player.remoteFactory.blueprint:SendModifyBlueprint(self.m_bpInst.param.myBpUid, name, desc, icon, colorId, tagIds, changedProdIconDic)
end
})
end
end,function()
self:PlayAnimationOutAndClose()
end)
end
FacSaveBlueprintCtrl._OnClickClose = HL.Method() << function(self)
self:_CheckIsChangedAndDo(function()
Notify(MessageConst.SHOW_POP_UP, {
content = Language.LUA_FAC_BLUEPRINT_CHANGE_NOT_SAVE_HINT,
onConfirm = function()
self:PlayAnimationOutAndClose()
end
})
end, function()
self:PlayAnimationOutAndClose()
end)
end
FacSaveBlueprintCtrl._CheckIsChangedAndDo = HL.Method(HL.Function, HL.Opt(HL.Function)) << function(self, actionOnChange, actionOnNotChange)
local contentView = self.view.blueprintContent.view
local name = contentView.nameInputField.text
name = string.isEmpty(name) and Language.LUA_FAC_BLUEPRINT_DEFAULT_NAME or name
local desc = contentView.descInputField.text
local icon = self.view.blueprintContent.curIcon
local colorId = self.view.blueprintContent.curColorId
local tagIds = self.view.blueprintContent:GetSortedTagIds()
local isChanged
if self.m_isCreate then
isChanged = true
elseif self.m_isEditing then
if name ~= self.m_bpInst.info.name then
isChanged = true
elseif desc ~= self.m_bpInst.info.desc then
isChanged = true
elseif icon ~= self.m_bpInst.info.icon.icon then
isChanged = true
elseif colorId ~= self.m_bpInst.info.icon.baseColor then
isChanged = true
elseif self.view.blueprintPreview:HasIconChanged() then
isChanged = true
else
local oldTagIds = self.m_bpInst.info.tags
if #tagIds ~= oldTagIds.Count then
isChanged = true
else
for k, id in ipairs(tagIds) do
if oldTagIds[CSIndex(k)] ~= id then
isChanged = true
break
end
end
end
end
end
if isChanged then
actionOnChange(name, desc, icon, colorId, tagIds)
elseif actionOnNotChange then
actionOnNotChange()
end
end
FacSaveBlueprintCtrl.FacOnModifyBlueprint = HL.Method(HL.Opt(HL.Any)) << function(self, _)
Notify(MessageConst.SHOW_TOAST, Language.LUA_FAC_BLUEPRINT_CHANGE_SAVED)
self:PlayAnimationOutAndClose()
end
FacSaveBlueprintCtrl.FacOnSaveBlueprint = HL.Method() << function(self)
Notify(MessageConst.FAC_EXIT_DESTROY_MODE, true)
PhaseManager:OpenPhaseFast(PhaseId.FacBlueprint, { blueprintType = "Mine" })
self:PlayAnimationOutAndClose()
Notify(MessageConst.SHOW_TOAST, Language.LUA_FAC_BLUEPRINT_SAVED)
end
FacSaveBlueprintCtrl.FacOnFetchBlueprint = HL.Method(HL.Any) << function(self, arg)
Notify(MessageConst.SHOW_TOAST, Language.LUA_FAC_BLUEPRINT_GIFT_SAVE_SUCCESS)
self:PlayAnimationOutAndClose()
end
FacSaveBlueprintCtrl._UpdateSceneView = HL.Method() << function(self)
local range = GameInstance.remoteFactoryManager.batchSelect.selectedRange
local gridPos = range.center
local width = range.width
local height = range.height
local rectInt = CS.UnityEngine.RectInt(gridPos.x - math.floor(width / 2), gridPos.y - math.floor(height / 2), width, height)
CSFactoryUtil.SetSelectGrids(rectInt, CS.Beyond.Gameplay.Factory.GlobalSharedData.MapGridRendererData.MapGridInfo.SelectType.BLUEPRINT)
local camTarns = CameraManager.mainCamera.transform
local needReverse = lume.round(camTarns.localEulerAngles.y) % 180 ~= 0
local horSize = needReverse and height or width
local verSize = needReverse and width or height
local horExtraSize = horSize * 0.3
local camTarget = LuaSystemManager.factory.topViewCamTarget
local targetPos = Vector3(range.center.x, camTarget.position.y, range.center.y)
targetPos = targetPos + camTarns.right * horExtraSize
camTarget:DOKill()
camTarget:DOMove(targetPos, 0.5)
local camCtrl = LuaSystemManager.factory.m_topViewCamCtrl
camCtrl:AdjustCameraForRange(horSize + horExtraSize, verSize, function(pos)
return FactoryUtils.clampTopViewCamTargetPosition(pos)
end)
end
FacSaveBlueprintCtrl._ResetSceneView = HL.Method() << function(self)
local camCtrl = LuaSystemManager.factory.m_topViewCamCtrl
camCtrl:ResetCameraAdjustForRange()
CSFactoryUtil.ClearSelectGrids()
end
FacSaveBlueprintCtrl.FacOnGetGiftBlueprint = HL.Method() << function(self)
if not self:IsShow() then
return
end
self:_RefreshImportState()
end
FacSaveBlueprintCtrl._RefreshImportState = HL.Method() << function(self)
local found = false
for _, v in pairs(GameInstance.player.remoteFactory.blueprint.giftBlueprintHandles) do
if not v.loadedBlueprintInstance then
self.view.importBtn.gameObject:SetActive(false)
GameInstance.player.remoteFactory.blueprint:GetGiftBlueprint()
return
end
local old = v.loadedBlueprintInstance.param
local new = self.m_bpInst.param
if old.bpGiftUid == new.bpGiftUid and old.shareIdx == new.shareIdx and old.targetRoleId == new.targetRoleId then
found = true
break
end
end
if found then
self.view.importBtn.gameObject:SetActive(false)
self.view.savedNode.gameObject:SetActive(true)
self.view.savedNode.onClick:AddListener(function()
Notify(MessageConst.SHOW_TOAST, Language.LUA_WIKI_CRAFTING_BLUEPRINT_ALREADY_SAVED)
end)
else
self.view.importBtn.onClick:RemoveAllListeners()
self.view.importBtn.onClick:AddListener(function()
GameInstance.player.remoteFactory.blueprint:SendFetchGiftBlueprint(self.m_shareCode)
end)
self.view.blueprintPreview.view.controllerEditBtn.interactable = false
self.view.importBtn.gameObject:SetActive(true)
end
end
FacSaveBlueprintCtrl._RefreshBlueprintContent = HL.Method() << function(self)
local bpAbnormalIconHelper
if not self.m_isEditing then
bpAbnormalIconHelper = FactoryUtils.createBPAbnormalIconHelper()
end
self.view.blueprintContent:InitBlueprintContent(self.m_bpInst, self.m_blueprintID,self.m_csBP, self.m_isEditing, self.m_isSharing, bpAbnormalIconHelper)
if self.m_isImporting then
self:_RefreshImportState()
end
if self.m_isCreate then
FactoryUtils.SetCreatorName(self.view.blueprintContent, true)
end
end
FacSaveBlueprintCtrl.OnRefreshTechTree = HL.Method(HL.Opt(HL.Any)) << function(self, _)
if self:IsShow() then
self:_RefreshBlueprintContent()
if DeviceInfo.usingController then
self:_RefreshController()
end
end
end
HL.Commit(FacSaveBlueprintCtrl)