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

246 lines
8.2 KiB
Lua

local SocialBuildingSource = CS.Beyond.Gameplay.Factory.SocialBuildingSource
local uiCtrl = require_ex('UI/Panels/Base/UICtrl')
local PANEL_ID = PanelId.MapMarkDetailSocialBuilding
MapMarkDetailSocialBuildingCtrl = HL.Class('MapMarkDetailSocialBuildingCtrl', uiCtrl.UICtrl)
MapMarkDetailSocialBuildingCtrl.s_messages = HL.StaticField(HL.Table) << {
[MessageConst.ON_FAC_SOCIAL_BUILDING_RECEIVED] = "_OnFacSocialBuildingReceived",
[MessageConst.ON_FAC_RECEIVED_SOCIAL_BUILDING_DATA_UPDATED] = "_OnFacReceivedSocialBuildingDataUpdated",
}
MapMarkDetailSocialBuildingCtrl.m_existing = HL.Field(HL.Boolean) << false
MapMarkDetailSocialBuildingCtrl.m_markRuntimeData = HL.Field(HL.Userdata)
MapMarkDetailSocialBuildingCtrl.m_nodeId = HL.Field(HL.Number) << -1
MapMarkDetailSocialBuildingCtrl.m_social = HL.Field(CS.Beyond.Gameplay.RemoteFactory.ServerChapterInfo.ComponentHandler.Payload_Social)
MapMarkDetailSocialBuildingCtrl.m_isOthersSocialBuilding = HL.Field(HL.Boolean) << false
MapMarkDetailSocialBuildingCtrl.m_ownerId = HL.Field(HL.Number) << -1
MapMarkDetailSocialBuildingCtrl.OnCreate = HL.Override(HL.Any) << function(self, arg)
local markInstId = arg.markInstId
local commonArgs = {
markInstId = markInstId,
bigBtnActive = true,
}
local _, markRuntimeData = GameInstance.player.mapManager:GetMarkInstRuntimeData(markInstId)
self.m_markRuntimeData = markRuntimeData
local nodeId = markRuntimeData.nodeId
self.m_existing = nodeId ~= nil
if self.m_existing then
self.m_nodeId = nodeId
local social, source = FactoryUtils.getSocialBuildingDetails(nodeId, self.m_markRuntimeData.chapterId)
self.m_social = social
self.m_isOthersSocialBuilding = source == SocialBuildingSource.Others
self.m_ownerId = source == SocialBuildingSource.Mine and GameInstance.player.roleId or social.ownerId
else
self.m_isOthersSocialBuilding = true
self.m_ownerId = markRuntimeData.ownerId
commonArgs.bigBtnCallback = function()
self:_ReceiveSocialBuilding()
end
commonArgs.bigBtnText = Language.LUA_MAP_MARK_DETAIL_SOCIAL_BUILDING_RECEIVE_BTN_TEXT
commonArgs.bigBtnIconName = UIConst.MAP_DETAIL_BTN_ICON_NAME.TELEPORT
end
self.view.mapMarkDetailCommon:InitMapMarkDetailCommon(commonArgs)
end
MapMarkDetailSocialBuildingCtrl.OnShow = HL.Override() << function(self)
self:_UpdateView()
end
MapMarkDetailSocialBuildingCtrl._UpdateView = HL.Method() << function(self)
local active = self.m_isOthersSocialBuilding
self.view.receiveSocialBuildingTips.gameObject:SetActive(false)
self.view.sourceNode.gameObject:SetActive(false)
self.view.stabilityNode.gameObject:SetActive(active)
if active then
self:_UpdateSocialBuildingView()
end
end
MapMarkDetailSocialBuildingCtrl._UpdateSocialBuildingView = HL.Method() << function(self)
local ownerId = self.m_ownerId
if self.m_existing and self.m_social.preset then
local success, npcData = Tables.factorySocialBuildingNpcTable:TryGetValue(ownerId)
if not success then
logger.error("[MapMarkDetail] SocialBuilding: Npc data not found, npcId: " .. tostring(ownerId))
return
end
self.view.sourceNode.gameObject:SetActive(true)
self.view.npcCell.gameObject:SetActive(true)
self.view.contactFriendCell.gameObject:SetActive(false)
self.view.npcCell.playerHead:InitCommonPlayerHead(npcData.avatarPath, npcData.avatarFramePath,
false, 0, npcData.name, nil)
else
GameInstance.player.friendSystem:SyncSocialFriendInfo({ ownerId }, function()
local success, ownerInfo = GameInstance.player.friendSystem:TryGetFriendInfo(ownerId)
if not success then
logger.info("[MapMarkDetail] SocialBuilding: Owner info not found, roleId: " .. tostring(ownerId))
return
end
self.view.sourceNode.gameObject:SetActive(true)
self.view.npcCell.gameObject:SetActive(false)
self.view.contactFriendCell.gameObject:SetActive(true)
self.view.contactFriendCell:InitContactFriendCell(ownerId, ownerInfo, 0, nil)
local onClickAvatar = FriendUtils.FRIEND_CELL_HEAD_FUNC.BUSINESS_CARD_PHASE(ownerId).action
self.view.contactFriendCell.view.playerHead:SetClick(onClickAvatar)
end)
end
if self.m_existing then
self.view.stabilityTitleText.text = Language.LUA_MAP_MARK_DETAIL_SOCIAL_BUILDING_STABILITY_TITLE
local stabilityValue = FactoryUtils.getSocialBuildingStability(self.m_nodeId, self.m_markRuntimeData.chapterId)
self.view.stabilityValueText.text = string.format("%.0f%%", stabilityValue * 100)
else
local remoteFactorySystem = GameInstance.player.remoteFactory
self.view.stabilityTitleText.text = Language.LUA_MAP_MARK_DETAIL_SOCIAL_BUILDING_RECEPTION_TITLE
local buildingCount = remoteFactorySystem.receivedSocialBuildingCount
local buildingMaxCount = remoteFactorySystem.receivedSocialBuildingMaxCount
local isBuildingReceivable = buildingCount < buildingMaxCount
local receptionValueTextFormat = isBuildingReceivable
and "%s/%s"
or Language.LUA_MAP_MARK_DETAIL_SOCIAL_BUILDING_RECEPTION_VALUE_LIMIT
self.view.stabilityValueText.text = string.format(receptionValueTextFormat, buildingCount, buildingMaxCount)
self.view.receiveSocialBuildingTips.gameObject:SetActive(not isBuildingReceivable)
end
end
MapMarkDetailSocialBuildingCtrl._ReceiveSocialBuilding = HL.Method() << function(self)
local remoteFactorySystem = GameInstance.player.remoteFactory
local buildingCount = remoteFactorySystem.receivedSocialBuildingCount
local buildingMaxCount = remoteFactorySystem.receivedSocialBuildingMaxCount
local isBuildingReceivable = buildingCount < buildingMaxCount
if isBuildingReceivable then
self:_SendReceiveSocialBuilding()
else
UIManager:Open(PanelId.BuildingSharePop, {
onClickReplace = function(buildingLevelId, buildingNodeId, buildingOwnerId)
self:_SendReceiveSocialBuilding(buildingLevelId, buildingNodeId, buildingOwnerId)
end
})
end
end
MapMarkDetailSocialBuildingCtrl._SendReceiveSocialBuilding = HL.Method(HL.Opt(HL.String, HL.Number, HL.Number))
<< function(self, buildingLevelId, buildingNodeId, buildingOwnerId)
local markRuntimeData = self.m_markRuntimeData
local chatRoleId = markRuntimeData.chatRoleId
local chatMsgIndex = markRuntimeData.chatMsgIndex
if buildingLevelId and buildingNodeId and buildingOwnerId then
GameInstance.player.friendChatSystem:SendReceiveSocialBuilding(chatRoleId, chatMsgIndex, buildingLevelId, buildingNodeId, buildingOwnerId)
else
GameInstance.player.friendChatSystem:SendReceiveSocialBuilding(chatRoleId, chatMsgIndex)
end
end
MapMarkDetailSocialBuildingCtrl._OnFacSocialBuildingReceived = HL.Method() << function(self)
Notify(MessageConst.SHOW_TOAST, Language.LUA_FRIEND_RECEIVE_SOCIAL_BUILDING_SUCCESS)
end
MapMarkDetailSocialBuildingCtrl._OnFacReceivedSocialBuildingDataUpdated = HL.Method(HL.Table) << function(self, args)
if self.m_existing then
return
end
local markRuntimeData = self.m_markRuntimeData
local ownerId = markRuntimeData.ownerId
local levelId = markRuntimeData.levelId
local ownerNodeId = markRuntimeData.ownerNodeId
local received, socialBuildingInfo = GameInstance.player.remoteFactory:IsSocialBuildingReceived(ownerId, levelId, ownerNodeId)
if not received then
return
end
local chapterId = socialBuildingInfo.chapterId
local nodeId = socialBuildingInfo.nodeId
local success, markInstId = GameInstance.player.mapManager:GetFacMarkInstIdByNodeId(chapterId, nodeId)
if not success then
logger.error("[SocialBuilding] Fac mark inst id not found, nodeId: " .. tostring(nodeId))
return
end
GameInstance.player.mapManager:RemoveSocialBuildingMarks()
MapUtils.openMap(markInstId, levelId)
end
HL.Commit(MapMarkDetailSocialBuildingCtrl)