local uiCtrl = require_ex('UI/Panels/Base/UICtrl') local json = require("Common/Tools/json") local PANEL_ID = PanelId.CommonShare local waterMarkScale = 0.074 CommonShareCtrl = HL.Class('CommonShareCtrl', uiCtrl.UICtrl) local CLEAR_PANEL_ON_SHUTTER = { PanelId.Radio, PanelId.CommonToast, PanelId.LevelToast, PanelId.GuideLimited, PanelId.Marquee, } CommonShareCtrl.m_showPlayerInfo = HL.Field(HL.Boolean) << true CommonShareCtrl.m_arg = HL.Field(HL.Any) << nil CommonShareCtrl.m_isSaved = HL.Field(HL.Boolean) << false CommonShareCtrl.m_isInfoSaved = HL.Field(HL.Boolean) << false CommonShareCtrl.m_onClose = HL.Field(HL.Function) CommonShareCtrl.m_type = HL.Field(HL.String) << "" CommonShareCtrl.m_channelIdList = HL.Field(HL.Table) << nil CommonShareCtrl.m_clickSaveBtn = HL.Field(HL.Boolean) << false CommonShareCtrl.s_messages = HL.StaticField(HL.Table) << { [MessageConst.ON_SHARE_END] = 'OnShareEnd', } CommonShareCtrl.ScreenCaptureAndShare = HL.StaticMethod(HL.Any) << function(arg) if arg == nil then logger.error("CommonShareCtrl.ScreenCaptureAndShare: arg is nil") return end local this = UIManager:Open(PANEL_ID, arg) logger.info("CommonShareCtrl.ScreenCaptureAndShare: Sharing screen capture") if arg and not arg.rt then for _, id in pairs(CLEAR_PANEL_ON_SHUTTER) do UIManager:HideWithKey(id, "CommonShare") end CoroutineManager:StartCoroutine(function() local rt = CS.Beyond.UI.ScreenCaptureUtils.GetScreenCapture() arg.rt = rt local realScale = math.floor(Screen.height * waterMarkScale) / Screen.height waterMarkScale = realScale coroutine.waitForRenderDone() coroutine.step() local scale = waterMarkScale + 1 local ratio = 1 if this.view.rectTransform.rect.height > 0 then ratio = this.view.rectTransform.rect.width / this.view.rectTransform.rect.height this.view.hideRoot.aspectRatio = ratio LayoutRebuilder.ForceRebuildLayoutImmediate(this.view.hideRoot.transform) end local photoRealHeight = this.view.photoImgWithWaterMark.rectTransform.rect.width / ratio local offset = photoRealHeight * waterMarkScale / 2 this.view.photoImgWithWaterMark.rectTransform.offsetMin = Vector2(this.view.photoImgWithWaterMark.rectTransform.offsetMin.x, -offset) this.view.photoImgWithWaterMark.rectTransform.offsetMax = Vector2(this.view.photoImgWithWaterMark.rectTransform.offsetMax.x, offset) this.view.bottomNodeWaterMarkForCamera.rectTransform.sizeDelta = Vector2(0, math.floor(this.view.rectTransform.rect.height * waterMarkScale + 3)) this.view.bottomNodeWaterMarkUIForPos.rectTransform.sizeDelta = Vector2(0, photoRealHeight * waterMarkScale) coroutine.step() coroutine.step() local waterRt = CS.Beyond.UI.ScreenCaptureUtils.GetWaterMarkRT(scale, rt) arg.waterRt = waterRt coroutine.waitForRenderDone() coroutine.step() coroutine.step() for _, id in pairs(CLEAR_PANEL_ON_SHUTTER) do UIManager:ShowWithKey(id, "CommonShare") end this:OnCaptureEnd() this.animationWrapper:PlayInAnimation() end) else logger.error("CommonShareCtrl.ScreenCaptureAndShare: arg.rt is not nil, must be nil") end end CommonShareCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg) self.view.stateController:SetState(arg.needEdge == false and "HideAll" or "Hide") self:_StartCoroutine(function() coroutine.step() coroutine.step() self.view.controllerHintPlaceholder:InitControllerHintPlaceholder({ self.view.inputBindingGroupMonoTarget.groupId }) end) self.m_arg = arg self.m_onClose = arg.onClose self.m_type = arg.type self.view.copyBtn.onClick:RemoveAllListeners() self.view.copyBtn.onClick:AddListener(function() logger.info("CommonShareCtrl.OnCreate: Copy button clicked") if self.m_type == "Blueprint" then Unity.GUIUtility.systemCopyBuffer = string.format(Language.LUA_BLUEPRINT_SHARE_COPY_TIPS, arg.codeId) else Unity.GUIUtility.systemCopyBuffer = arg.codeId end EventLogManagerInst:GameEvent_CommonShareAction(self.m_type, self.m_channelIdList, "copy","") Notify(MessageConst.SHOW_TOAST, Language.LUA_SHARE_COPY_TIP) end) self.view.closeBtn.onClick:RemoveAllListeners() self.view.closeBtn.onClick:AddListener(function() if self.m_arg.isCloseFast then self:Close() else self:PlayAnimationOutAndClose() end end) if arg.showPlayerInfoToggle ~= false then self.view.playerInfoToggle.onValueChanged:RemoveAllListeners() self.view.playerInfoToggle.onValueChanged:AddListener(function(isOn) self.m_showPlayerInfo = isOn self:_ChangePlayerInfo() end) self.view.playerInfoToggle.gameObject:SetActiveIfNecessary(true) else self.view.playerInfoToggle.gameObject:SetActiveIfNecessary(false) end self.view.saveBtn.onClick:RemoveAllListeners() self.view.saveBtn.onClick:AddListener(function() logger.info("CommonShareCtrl.OnCreate: Save button clicked") EventLogManagerInst:GameEvent_CommonShareAction(self.m_type, self.m_channelIdList, "save","") if self.m_type == "PhotoShot" then EventLogManagerInst:GameEvent_Snapshot(3) end if self.m_showPlayerInfo and self.m_isInfoSaved then Notify(MessageConst.SHOW_TOAST, Language.LUA_COMMON_SHARE_SAVED) return end if not self.m_showPlayerInfo and self.m_isSaved then Notify(MessageConst.SHOW_TOAST, Language.LUA_COMMON_SHARE_SAVED) return end local currentPlatform = CS.UnityEngine.Application.platform local savePath = "" local isMob = not DeviceInfo.isPCorConsole local fileName = isMob and "ENDFIELD_SHARE_TEMP.png" or string.format("ENDFIELD_SHARE_%s.png", CS.Beyond.DateTimeUtils.GetCurrentTimestampBySeconds()) if UNITY_STANDALONE_WIN or UNITY_EDITOR_WIN then savePath = CS.System.IO.Path.Combine(CS.System.Environment.GetFolderPath(CS.System.Environment.SpecialFolder.MyPictures),"ENDFIELD", fileName) else savePath = isMob and CS.System.IO.Path.Combine(CS.UnityEngine.Application.temporaryCachePath, fileName) or CS.System.IO.Path.Combine(CS.UnityEngine.Application.persistentDataPath, fileName) end local isSave = 0 isSave = CS.Beyond.UI.ScreenCaptureUtils.SaveScreenCapture(self.m_showPlayerInfo and self.m_arg.waterRt or self.m_arg.rt, savePath) if not UNITY_EDITOR and currentPlatform == CS.UnityEngine.RuntimePlatform.PS5 then CS.Beyond.PS5ContentManager.instance:ExportContentFromFile(savePath, fileName) return end if isSave == CS.Beyond.UI.ScreenCaptureUtils.SaveErrorCode.None then if self.m_showPlayerInfo then self.m_isInfoSaved = true else self.m_isSaved = true end if isMob then local dataStr = Json.encode({ shareChannel = 0, imgPath = savePath, title = self.m_type == "Blueprint" and string.format(Language.LUA_SHARE_BLUEPRINT_TITLE, self.m_arg.codeId) or Language.LUA_SHARE_PHOTO_TITLE, desc = self.m_type == "Blueprint" and string.format(Language.LUA_SHARE_BLUEPRINT_DESC, self.m_arg.codeId) or Language.LUA_SHARE_PHOTO_DESC, extraData = "{}", }) CS.U8.SDK.U8SDKInterface.Instance:SetData(CS.Beyond.SDK.SDKDataType.SET_DATA_SHARE, dataStr) self.m_clickSaveBtn = true elseif currentPlatform == CS.UnityEngine.RuntimePlatform.WindowsPlayer or currentPlatform == CS.UnityEngine.RuntimePlatform.WindowsEditor then Notify(MessageConst.SHOW_TOAST, {Language.LUA_COMMON_SHARE_SAVE_SUCCESS .. savePath, 4}) else Notify(MessageConst.SHOW_TOAST, Language.LUA_COMMON_SHARE_SAVE_SUCCESS .. savePath) end logger.info(Language.LUA_SHARE_SAVE_SUCCESS .. savePath) elseif isSave == CS.Beyond.UI.ScreenCaptureUtils.SaveErrorCode.NoSpace then Notify(MessageConst.SHOW_TOAST, Language.LUA_COMMON_SHARE_SAVE_NO_SPACE) logger.info(Language.LUA_COMMON_SHARE_SAVE_NO_SPACE) elseif isSave == CS.Beyond.UI.ScreenCaptureUtils.SaveErrorCode.PermissionDenied then Notify(MessageConst.SHOW_TOAST, Language.LUA_COMMON_SHARE_SAVE_PERMISSION_DENIED) logger.info(Language.LUA_COMMON_SHARE_SAVE_PERMISSION_DENIED) end end) if arg == nil then logger.error("CommonShareCtrl.OnCreate: arg is nil") return end self.m_showPlayerInfo = arg.showPlayerInfo == nil and true or arg.showPlayerInfo self:_ChangePlayerInfo() self:_UpdateWaterInfo() end CommonShareCtrl.OnCaptureEnd = HL.Method() << function(self) if self.m_arg.onCaptureEnd then self.m_arg.onCaptureEnd() end self.view.photoImg.texture = self.m_arg.rt self.view.photoImgWithWaterMark.texture = self.m_arg.waterRt self.view.stateController:SetState("Show") if self.m_arg.type then self.view.stateController:SetState(self.m_arg.type) end self:_ChangePlayerInfo() self:_OnFadeInEnd() end CommonShareCtrl._UpdateWaterInfo = HL.Method() << function(self) self.view.bottomNodeWaterMarkUIForPos:InitBottomNodeWaterMarkUI(self.m_arg) self.view.bottomNodeWaterMarkForCamera:InitBottomNodeWaterMarkUI(self.m_arg) end CommonShareCtrl._ChangePlayerInfo = HL.Method() << function(self) if self.m_arg.rt == nil then return end if self.m_showPlayerInfo then self.view.photoImg.gameObject:SetActiveIfNecessary(false) self.view.photoImgWithWaterMark.gameObject:SetActiveIfNecessary(true) self.view.copyBtn.gameObject:SetActiveIfNecessary(true) else self.view.photoImg.gameObject:SetActiveIfNecessary(true) self.view.photoImgWithWaterMark.gameObject:SetActiveIfNecessary(false) self.view.copyBtn.gameObject:SetActiveIfNecessary(false) end end CommonShareCtrl._OnFadeInEnd = HL.Method() << function(self) self.view.succHintNode.gameObject:SetActiveIfNecessary(self.m_arg.success == true) if self.m_arg.showPlayerInfo == nil then self.view.playerInfoToggle.isOn = true else self.view.playerInfoToggle.isOn = self.m_arg.showPlayerInfo end local genTabCells = UIUtils.genCellCache(self.view.shareCell) local sdkInfo = {} self.m_channelIdList = {} local canShare = not DeviceInfo.isPCorConsole if canShare then local list = {} if CS.Beyond.SDK.SDKConsts.IsOverseaVersion() then list = Tables.overseaShareTable:GetValue(CS.Beyond.GameSetting.languageText).shareChannelIdList else list = Tables.shareTable:GetValue(CS.Beyond.SDK.SDKConsts.IsBilibiliVersion() and 1 or 0).shareChannelIdList end for i = 0, list.Count - 1 do local success, cfg = Tables.shareChannelTable:TryGetValue(list[i]) if success and list[i] ~= 0 and (GameInstance.player.friendSystem.ShareControl & (1 << list[i])) == 0 then table.insert(sdkInfo, { icon = cfg.icon, id = cfg.shareChannelId, sort = cfg.sort, }) end end table.sort(sdkInfo, function(a, b) return a.sort < b.sort end) genTabCells:Refresh(#sdkInfo, function(cell, luaIndex) local info = sdkInfo[luaIndex] cell.gameObject.name = "ShareCell_" .. luaIndex local fileName = "ENDFIELD_SHARE_TEMP.png" cell.shareImg:LoadSprite(UIConst.UI_SPRITE_SHARE_ICON, info.icon) cell.shareBtn.onClick:RemoveAllListeners() cell.shareBtn.onClick:AddListener(function() local savePath = CS.System.IO.Path.Combine(CS.UnityEngine.Application.temporaryCachePath, fileName) CS.Beyond.UI.ScreenCaptureUtils.SaveScreenCapture(self.m_showPlayerInfo and self.m_arg.waterRt or self.m_arg.rt, savePath) local dataStr = Json.encode({ shareChannel = info.id, imgPath = savePath, title = self.m_type == "Blueprint" and string.format(Language.LUA_SHARE_BLUEPRINT_TITLE, self.m_arg.codeId) or Language.LUA_SHARE_PHOTO_TITLE, desc = self.m_type == "Blueprint" and string.format(Language.LUA_SHARE_BLUEPRINT_DESC, self.m_arg.codeId) or Language.LUA_SHARE_PHOTO_DESC, extraData = "{}", }) CS.U8.SDK.U8SDKInterface.Instance:SetData(CS.Beyond.SDK.SDKDataType.SET_DATA_SHARE, dataStr) if self.m_type == "PhotoShot" then EventLogManagerInst:GameEvent_Snapshot(4) end end) end) self.view.shareMaxLayout.gameObject:SetActiveIfNecessary(#sdkInfo > 0) for _, info in ipairs(sdkInfo) do table.insert(self.m_channelIdList, info.id) end else self.view.shareMaxLayout.gameObject:SetActiveIfNecessary(false) end EventLogManagerInst:GameEvent_CommonShareStart(self.m_type, self.m_channelIdList, "") end CommonShareCtrl.OnShareEnd = HL.Method() << function(self, args) local code = unpack(args) if self.m_clickSaveBtn then self.m_clickSaveBtn = false logger.info("CommonShareCtrl.OnShareEnd: Share ended with code " .. tostring(code)) Notify(MessageConst.SHOW_TOAST, code == 0 and Language.LUA_COMMON_SHARE_SAVE_SUCCESS or Language.LUA_COMMON_SHARE_SAVE_PERMISSION_DENIED) EventLogManagerInst:GameEvent_CommonShareEnd(self.m_type, self.m_channelIdList, tostring(code), "") return end logger.info("CommonShareCtrl.OnShareEnd: Share ended with code " .. tostring(code)) Notify(MessageConst.SHOW_TOAST, code == 0 and Language.LUA_COMMON_SHARE_SUCCESS or Language.LUA_COMMON_SHARE_FAIL) EventLogManagerInst:GameEvent_CommonShareEnd(self.m_type, self.m_channelIdList, tostring(code), "") end CommonShareCtrl.OnShow = HL.Override() << function(self) UIManager:Hide(PanelId.UIDPanel) end CommonShareCtrl.OnClose = HL.Override() << function(self) UIManager:Show(PanelId.UIDPanel) if self.m_arg and self.m_arg.rt then CS.Beyond.UI.ScreenCaptureUtils.Release() end if self.m_onClose then self.m_onClose() end end HL.Commit(CommonShareCtrl)