462 lines
16 KiB
Lua
462 lines
16 KiB
Lua
local UIWidgetBase = require_ex('Common/Core/UIWidgetBase')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FriendListCell = HL.Class('FriendListCell', UIWidgetBase)
|
|
|
|
|
|
FriendListCell.info = HL.Field(HL.Userdata)
|
|
|
|
|
|
FriendListCell.id = HL.Field(HL.Number) << 0
|
|
|
|
|
|
FriendListCell.charInfos = HL.Field(HL.Table)
|
|
|
|
|
|
FriendListCell.charInstanceIdList = HL.Field(HL.Table)
|
|
|
|
|
|
FriendListCell.charCellList = HL.Field(HL.Table)
|
|
|
|
|
|
FriendListCell.arg = HL.Field(HL.Table)
|
|
|
|
|
|
FriendListCell.showCharInfoCallBack = HL.Field(HL.Function)
|
|
|
|
|
|
FriendListCell.searchKey = HL.Field(HL.String) << ""
|
|
|
|
|
|
FriendListCell.m_buildNodeId = HL.Field(HL.Number) << 0
|
|
|
|
|
|
|
|
|
|
FriendListCell._OnFirstTimeInit = HL.Override() << function(self)
|
|
self.showCharInfoCallBack = function()
|
|
|
|
|
|
self:_OnCharInfoClick(1)
|
|
end
|
|
|
|
self.view.headBtn.onClick:RemoveAllListeners()
|
|
self.view.headBtn.onClick:AddListener(function()
|
|
logger.info("点击好友头像")
|
|
if self.arg.onPlayerClick then
|
|
self.arg.onPlayerClick(self.view.headRectTransform, self.info.roleId, self.showCharInfoCallBack)
|
|
end
|
|
end)
|
|
self.view.shipBtn.onClick:RemoveAllListeners()
|
|
self.view.shipBtn.onClick:AddListener(function()
|
|
logger.info("点击好友飞船")
|
|
if self.arg.onShipClick then
|
|
self.arg.onShipClick(self.info.roleId)
|
|
end
|
|
end)
|
|
self.view.msgBtn.onClick:RemoveAllListeners()
|
|
self.view.msgBtn.onClick:AddListener(function()
|
|
logger.info("点击好友消息")
|
|
if self.arg.onMessageClick then
|
|
self.arg.onMessageClick(self.info.roleId)
|
|
end
|
|
end)
|
|
self.view.acceptFriendBtn.onClick:RemoveAllListeners()
|
|
self.view.acceptFriendBtn.onClick:AddListener(function()
|
|
logger.info("点击acceptFriend")
|
|
if self.arg.onAcceptClick then
|
|
self.arg.onAcceptClick(self.info.roleId)
|
|
end
|
|
end)
|
|
self.view.notAcceptFriendBtn.onClick:RemoveAllListeners()
|
|
self.view.notAcceptFriendBtn.onClick:AddListener(function()
|
|
logger.info("点击notAccept消息")
|
|
if self.arg.onNotAcceptClick then
|
|
self.arg.onNotAcceptClick(self.info.roleId)
|
|
end
|
|
end)
|
|
self.view.removeBlackListBtn.onClick:RemoveAllListeners()
|
|
self.view.removeBlackListBtn.onClick:AddListener(function()
|
|
logger.info("点击Remove消息")
|
|
if self.arg.onRemoveClick then
|
|
self.arg.onRemoveClick(self.info.roleId)
|
|
end
|
|
end)
|
|
self.view.addFriendBtn.onClick:RemoveAllListeners()
|
|
self.view.addFriendBtn.onClick:AddListener(function()
|
|
logger.info("点击Add消息")
|
|
FriendUtils.FRIEND_CELL_INIT_FUNC.onAddClick(self.info.roleId, self.m_buildNodeId)
|
|
end)
|
|
|
|
self.view.chatBtn.onClick:RemoveAllListeners()
|
|
self.view.chatBtn.onClick:AddListener(function()
|
|
logger.info("点击 chatBtn")
|
|
if self.arg.onChatClick then
|
|
self.arg.onChatClick(self.info.roleId)
|
|
end
|
|
end)
|
|
|
|
self.view.spreadBtn.onClick:RemoveAllListeners()
|
|
self.view.spreadBtn.onClick:AddListener(function()
|
|
logger.info("点击 spreadBtn")
|
|
if self.arg.onSpaceshipVisitorClick then
|
|
self.arg.onSpaceshipVisitorClick(self.info.roleId, self.view.spreadIconRect)
|
|
end
|
|
end)
|
|
|
|
self.view.psnInfoBtnForBlackUser.onClick:RemoveAllListeners()
|
|
self.view.psnInfoBtnForBlackUser.onClick:AddListener(function()
|
|
logger.info("点击 psnInfoBtn")
|
|
if self.arg.onPsnInfoClick then
|
|
self.arg.onPsnInfoClick(self.info.psnData.AccountId)
|
|
end
|
|
end)
|
|
self.view.psnInfoBtnForNoGameUser.onClick:RemoveAllListeners()
|
|
self.view.psnInfoBtnForNoGameUser.onClick:AddListener(function()
|
|
logger.info("点击 psnInfoBtn")
|
|
if self.arg.onPsnInfoClick then
|
|
self.arg.onPsnInfoClick(self.info.psnData.AccountId)
|
|
end
|
|
end)
|
|
end
|
|
|
|
|
|
|
|
FriendListCell.SetLoadingState = HL.Method() << function(self)
|
|
self.view.emptyStateCtrl:SetState("Loading")
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FriendListCell.RefreshFriendListCell = HL.Method(HL.Number, HL.Table, HL.String) << function(self, id, arg, searchKey)
|
|
self.view.psnInfoBtnForBlackUser.gameObject:SetActiveIfNecessary(false)
|
|
self.id = id
|
|
self.arg = arg
|
|
self.searchKey = searchKey
|
|
self:_FirstTimeInit()
|
|
|
|
local stateName = arg.stateName
|
|
self.view.emptyStateCtrl:SetState("Normal")
|
|
if stateName == "Stranger" then
|
|
if GameInstance.player.friendSystem.friendInfoDic:ContainsKey(id) then
|
|
self.view.stateController:SetState(stateName .. "_Friend")
|
|
elseif GameInstance.player.friendSystem:ContainWaitAcceptRequestID(id) then
|
|
self.view.stateController:SetState(stateName .. "_Wait")
|
|
else
|
|
self.view.stateController:SetState(stateName)
|
|
end
|
|
else
|
|
self.view.stateController:SetState(stateName)
|
|
end
|
|
|
|
local showInfo = nil
|
|
if stateName == "SpaceshipVisitor" then
|
|
local friendDicIndex = FriendUtils.FRIEND_CELL_INIT_CONFIG.Friend.infoDicIndex
|
|
local success, friendInfo = GameInstance.player.friendSystem:GetDictInfo(friendDicIndex):TryGetValue(self.id)
|
|
|
|
local strangerDicIndex = FriendUtils.FRIEND_CELL_INIT_CONFIG.Stranger.infoDicIndex
|
|
local success2, strangerInfo = GameInstance.player.friendSystem:GetDictInfo(strangerDicIndex):TryGetValue(self.id)
|
|
if success and friendInfo.init then
|
|
showInfo = friendInfo
|
|
elseif success2 and strangerInfo.init then
|
|
showInfo = strangerInfo
|
|
else
|
|
logger.info("未找到好友数据 " .. self.id)
|
|
self.view.emptyStateCtrl:SetState("NoData")
|
|
return
|
|
end
|
|
|
|
else
|
|
local success, info = GameInstance.player.friendSystem:GetDictInfo(arg.infoDicIndex):TryGetValue(self.id)
|
|
if not success then
|
|
logger.info("未找到好友数据 " .. self.id)
|
|
self.view.emptyStateCtrl:SetState("NoData")
|
|
return
|
|
end
|
|
showInfo = info
|
|
end
|
|
|
|
if showInfo.init == false then
|
|
logger.error("好友数据未初始化 " .. self.id)
|
|
end
|
|
|
|
self.info = showInfo
|
|
self:_RefreshFriendCellInfo()
|
|
if self.view.msgBtn.gameObject.activeSelf then
|
|
self.view.msgBtn.gameObject:SetActive(not GameInstance.player.spaceship.isViewingFriend and GameInstance.player.friendSystem:PlayerInBlackList(self.info.roleId) == false)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FriendListCell.RefreshFriendListCellByPsnId = HL.Method(HL.String, HL.Table, HL.String) << function(self, id, arg, searchKey)
|
|
self.arg = arg
|
|
self.searchKey = searchKey
|
|
|
|
local stateName = arg.stateName
|
|
self.view.emptyStateCtrl:SetState("Normal")
|
|
|
|
local success, info = GameInstance.player.friendSystem:GetPsnDictByIndex(self.arg.infoDicIndex):TryGetValue(id)
|
|
|
|
if not success then
|
|
logger.error(CS.Beyond.ELogChannel.Friend,"未找到好友数据 " .. id)
|
|
self.view.emptyStateCtrl:SetState("NoData")
|
|
return
|
|
end
|
|
self.view.addFriendBtn.onClick:ChangeBindingPlayerAction("friend_add_psn")
|
|
self.id = info.roleId
|
|
self:_FirstTimeInit()
|
|
|
|
if stateName == "Normal" then
|
|
|
|
if info.roleId == 0 then
|
|
self:_UpdateUnRegisterPlayer(info)
|
|
return
|
|
end
|
|
|
|
|
|
if GameInstance.player.friendSystem.blackListInfoDic:ContainsKey(info.roleId) then
|
|
stateName = "BlackList"
|
|
elseif GameInstance.player.friendSystem:ContainWaitAcceptRequestID(info.roleId) then
|
|
stateName = "Stranger_Wait"
|
|
elseif not GameInstance.player.friendSystem.friendInfoDic:ContainsKey(info.roleId) then
|
|
stateName = "Stranger"
|
|
end
|
|
elseif stateName == "BlackList" and info.roleId == 0 then
|
|
self:_UpdateUnRegisterPlayer(info)
|
|
return
|
|
end
|
|
self.view.psnInfoBtnForBlackUser.gameObject:SetActiveIfNecessary(true)
|
|
self.view.stateController:SetState(stateName)
|
|
self.info = info
|
|
self:_RefreshFriendCellInfo()
|
|
if stateName == "BlackList" then
|
|
|
|
self.view.removeBlackListBtn.gameObject:SetActiveIfNecessary(false)
|
|
end
|
|
if self.view.msgBtn.gameObject.activeSelf then
|
|
self.view.msgBtn.gameObject:SetActive(not GameInstance.player.spaceship.isViewingFriend)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
FriendListCell._UpdateUnRegisterPlayer = HL.Method(HL.Any) << function(self, info)
|
|
|
|
self.view.emptyStateCtrl:SetState("NonGameUser")
|
|
self.view.sonyNameTxt.text = info.psName
|
|
self.info = info
|
|
self.view.playerHeadBtnForNoGameUser.onClick:RemoveAllListeners()
|
|
self.view.playerHeadBtnForNoGameUser.onClick:AddListener(function()
|
|
local args = {
|
|
transform = self.view.headRectTransform,
|
|
cellHeight = FriendUtils.CELL_HEIGHT,
|
|
actions = {
|
|
[1] = {
|
|
text = Language.LUA_FRIEND_TIP_PSN_INFO,
|
|
action = function()
|
|
FriendUtils.FRIEND_CELL_INIT_FUNC.onPsnInfoClick(self.info.psnData.AccountId)
|
|
end
|
|
}
|
|
}
|
|
}
|
|
Notify(MessageConst.SHOW_NAVI_TARGET_ACTION_MENU, args)
|
|
end)
|
|
end
|
|
|
|
|
|
|
|
FriendListCell._RefreshFriendCellInfo = HL.Method() << function(self)
|
|
self.charInfos = {}
|
|
|
|
self.view.commonPlayerHead:UpdateHideSignature(self.arg.hideSignature)
|
|
|
|
local hasValue, _ = GameInstance.player.spaceship:TryGetRoom(Tables.spaceshipConst.guestRoomId)
|
|
local showShipBtn = hasValue and self.view.shipBtn.gameObject.activeSelf
|
|
self.view.shipBtn.gameObject:SetActiveIfNecessary(showShipBtn)
|
|
|
|
local onPlayerHeadClick = self.arg.onPlayerClick and function()
|
|
|
|
local isBlack = GameInstance.player.friendSystem.blackListInfoDic:ContainsKey(self.info.roleId)
|
|
if isBlack then
|
|
Notify(MessageConst.SHOW_TOAST, Language.LUA_FRIEND_IN_BLACK_LIST)
|
|
return
|
|
end
|
|
local isStranger = not GameInstance.player.friendSystem.friendInfoDic:ContainsKey(self.info.roleId)
|
|
|
|
if isStranger then
|
|
FriendUtils.FRIEND_CELL_INIT_FUNC.onStrangerPlayerClick(self.view.headRectTransform, self.info.roleId, self.showCharInfoCallBack)
|
|
else
|
|
FriendUtils.FRIEND_CELL_INIT_FUNC.onFriendPlayerClick(self.view.headRectTransform, self.info.roleId, self.showCharInfoCallBack, showShipBtn and self.info.guestRoomUnlock)
|
|
end
|
|
end or false
|
|
|
|
self.view.commonPlayerHead:InitCommonPlayerHeadByRoleId(self.info.roleId, onPlayerHeadClick, self.searchKey)
|
|
|
|
if self.arg.showVisitorTimeText then
|
|
self.view.visitorState.gameObject:SetActive(true)
|
|
self.view.onlineState.gameObject:SetActive(false)
|
|
self.view.visitorTxt.text = self.arg.showVisitorTimeText
|
|
else
|
|
self.view.visitorState.gameObject:SetActive(false)
|
|
self.view.onlineState.gameObject:SetActive(true)
|
|
end
|
|
|
|
self.view.onlineState:SetState(self.info.playerOnlineState:ToString())
|
|
if self.info.playerOnlineState == CS.Beyond.Gameplay.PlayerOnlineState.Online then
|
|
self.view.onlineTimeTxt.text = Language.LUA_FRIEND_ONLINE
|
|
elseif self.info.lastDateTime ~= 0 then
|
|
self.view.onlineTimeTxt.text = string.format(Language.LUA_FRIEND_LAST_ONLINE_TIME, UIUtils.getLeftTime(DateTimeUtils.GetCurrentTimestampBySeconds() - self.info.lastDateTime))
|
|
else
|
|
self.view.onlineTimeTxt.text = ""
|
|
end
|
|
|
|
self.charCellList = {}
|
|
self.charInstanceIdList = {}
|
|
for i = 1, FriendUtils.FriendShowCharsCount do
|
|
local state = self.view.charInfoGroup["charCellRoot" .. i]
|
|
if i <= self.info.charInfos.Count and self.info.charInfos[CSIndex(i)] then
|
|
local item = self.info.charInfos[CSIndex(i)]
|
|
local charConfig = Tables.characterTable:GetValue(item.templateId)
|
|
self.charInfos[i] = {
|
|
templateId = item.templateId,
|
|
instId = item.instId,
|
|
level = item.level,
|
|
ownTime = 0,
|
|
rarity = charConfig.rarity,
|
|
potentialLevel = item.potentialLevel,
|
|
noHpBar = true,
|
|
|
|
singleSelect = false,
|
|
selectIndex = -1,
|
|
}
|
|
self.charInstanceIdList[i] = item.instId
|
|
local cell = self.view.charInfoGroup["charHeadCell" .. i]
|
|
state:SetState("Normal")
|
|
cell:InitCharFormationHeadCell(self.charInfos[i], function()
|
|
self:_OnCharInfoClick(i)
|
|
end)
|
|
else
|
|
self.charInfos[i] = {}
|
|
state:SetState("NoChar")
|
|
end
|
|
end
|
|
|
|
local chatInfo = GameInstance.player.friendChatSystem:GetChatInfo(self.info.roleId)
|
|
if chatInfo then
|
|
if chatInfo.unReadNum > 0 then
|
|
self.view.messageNumNode.gameObject:SetActive(true)
|
|
self.view.msgRedDotNumber.gameObject:SetActive(true)
|
|
|
|
self.view.messageNumText.text = chatInfo.unReadNum > 99 and "99+" or tostring(chatInfo.unReadNum)
|
|
else
|
|
self.view.messageNumNode.gameObject:SetActive(false)
|
|
self.view.msgRedDotNumber.gameObject:SetActive(false)
|
|
end
|
|
else
|
|
self.view.messageNumNode.gameObject:SetActive(false)
|
|
self.view.msgRedDotNumber.gameObject:SetActive(false)
|
|
end
|
|
|
|
|
|
if self.view.shipBtn.gameObject.activeSelf then
|
|
local friendInfo = GameInstance.player.spaceship:GetFriendRoleInfo()
|
|
if friendInfo and friendInfo.roleId == self.info.roleId then
|
|
self.view.shipBtn.enabled = false
|
|
self.view.shipBtnStateController:SetState("CurState")
|
|
self.view.lockMask.gameObject:SetActive(false)
|
|
elseif not self.info.guestRoomUnlock then
|
|
self.view.shipBtn.enabled = false
|
|
self.view.lockMask.gameObject:SetActive(true)
|
|
self.view.shipBtnStateController:SetState("LockState")
|
|
else
|
|
self.view.shipBtn.enabled = true
|
|
self.view.shipBtnStateController:SetState("NormalState")
|
|
self.view.lockMask.gameObject:SetActive(false)
|
|
end
|
|
local isCurrent = self.info.helpFlag ~= CS.Proto.FRIEND_SPACESHIP_HELP_STATUS.CanHelp and "CompleteState" or "IncompleteState"
|
|
self.view.shipHelp.gameObject:SetActiveIfNecessary(self.info.helpFlag ~= CS.Proto.FRIEND_SPACESHIP_HELP_STATUS.Invalid)
|
|
self.view.shipHelp:SetState(isCurrent)
|
|
end
|
|
|
|
if self.info.businessCardTopicId ~= nil then
|
|
local success, topicCfg = Tables.businessCardTopicTable:TryGetValue(self.info.businessCardTopicId)
|
|
if success then
|
|
self.view.themeImg:LoadSprite(UIConst.UI_BUSINESS_CARD_ICON_PATH, topicCfg.id)
|
|
self.view.themeImagePair.color = UIUtils.getColorByString(topicCfg.color)
|
|
else
|
|
logger.error("未找到名片主题配置 " .. self.info.businessCardTopicId)
|
|
end
|
|
else
|
|
logger.error("好友名片主题ID为空 " .. self.info.roleId)
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
FriendListCell._OnCharInfoClick = HL.Method(HL.Number) << function(self, cellIndex)
|
|
if GameInstance.player.friendSystem:PlayerInBlackList(self.info.roleId) then
|
|
Notify(MessageConst.SHOW_TOAST, Language.LUA_FRIEND_IN_BLACK_LIST)
|
|
return
|
|
end
|
|
local templateIdList = {}
|
|
for _, v in pairs(self.charInfos) do
|
|
table.insert(templateIdList, v.templateId)
|
|
end
|
|
FriendUtils.openFriendCharInfo(self.info.roleId, self.info.charInfos[CSIndex(cellIndex)].templateId, templateIdList)
|
|
end
|
|
|
|
|
|
|
|
FriendListCell._OnEnable = HL.Override() << function(self)
|
|
if not self.info then
|
|
return
|
|
end
|
|
local chatInfo = GameInstance.player.friendChatSystem:GetChatInfo(self.info.roleId)
|
|
if chatInfo then
|
|
if chatInfo.unReadNum > 0 then
|
|
self.view.messageNumNode.gameObject:SetActive(true)
|
|
self.view.msgRedDotNumber.gameObject:SetActive(true)
|
|
|
|
self.view.messageNumText.text = chatInfo.unReadNum > 99 and "99+" or tostring(chatInfo.unReadNum)
|
|
else
|
|
self.view.messageNumNode.gameObject:SetActive(false)
|
|
self.view.msgRedDotNumber.gameObject:SetActive(false)
|
|
end
|
|
else
|
|
self.view.messageNumNode.gameObject:SetActive(false)
|
|
self.view.msgRedDotNumber.gameObject:SetActive(false)
|
|
end
|
|
end
|
|
|
|
HL.Commit(FriendListCell)
|
|
return FriendListCell
|
|
|