local XUiGridMulitiplayerRoomChar = XClass(nil, "XUiGridMulitiplayerRoomChar") local RImgArmsColor = CS.UnityEngine.Color.white local XUiPanelMultiDimRoomChar = require("XUi/XUiMultiDim/XUiPanelMultiDimRoomChar") local XUiPanelMultiDimAbility = require("XUi/XUiMultiDim/XUiPanelMultiDimAbility") local XSpecialTrainActionRandom = require("XUi/XUiSpecialTrainBreakthrough/XSpecialTrainActionRandom") function XUiGridMulitiplayerRoomChar:Ctor(ui, parent, index, rolePanel, effectObj, params) self.GameObject = ui.gameObject self.Transform = ui.transform self.Parent = parent self.Index = index self.RolePanel = rolePanel self.CuteRandomController = XSpecialTrainActionRandom.New() self.EffectObj = effectObj self.Params = params or {} XTool.InitUiObject(self) XUiHelper.RegisterClickEvent(self, self.BtnDetailInfo, self.OnBtnDetailInfoClick) XUiHelper.RegisterClickEvent(self, self.BtnAddFriend, self.OnBtnAddFriendClick) XUiHelper.RegisterClickEvent(self, self.BtnChangeLeader, self.OnBtnChangeLeaderClick) XUiHelper.RegisterClickEvent(self, self.BtnKick, self.OnBtnKickClick) XUiHelper.RegisterClickEvent(self, self.BtnItem, self.OnBtnItemClick) XUiHelper.RegisterClickEvent(self, self.BtnFriend, self.OnBtnFriendClick) XUiHelper.RegisterClickEvent(self, self.BtnWorld, self.OnBtnWorldClick) XUiHelper.RegisterClickEvent(self, self.BtnTeam, self.OnBtnTeamClick) XUiHelper.RegisterClickEvent(self, self.BtnMultiDimFriend, self.OnBtnFriendClick) XUiHelper.RegisterClickEvent(self, self.BtnMultiDimGuild, self.OnBtnGuildClick) self.CharacterPets:GetObject("BtnClick").CallBack = function() self:OnBtnPetClick() end self:InitMultiDim() self.PanelMultiDimNoCharacter.gameObject:SetActiveEx(self.Params.IsMultiDim == true) self.PanelCountDown.gameObject:SetActiveEx(false) end function XUiGridMulitiplayerRoomChar:InitMultiDim() if self.Params.IsMultiDim then self.MultiDimPanel = XUiPanelMultiDimRoomChar.New(self.PanelMultiDimNoCharacter,self.Params.MultiDimCareer,self.Index) self.MultiDimAbilityPanel = XUiPanelMultiDimAbility.New(self.PanelMultiDimAbility) end end function XUiGridMulitiplayerRoomChar:InitCharData(playerData, callback) self.PanelInfo.gameObject:SetActiveEx(true) self.PanelHaveCharacter.gameObject:SetActiveEx(true) self.PanelNoCharacter.gameObject:SetActiveEx(false) self.PanelOperation.gameObject:SetActiveEx(false) self:StopTimer() self.PanelChat.gameObject:SetActiveEx(false) self:RefreshPlayer(playerData, callback) end function XUiGridMulitiplayerRoomChar:InitEmpty() self.PlayerData = nil self.PanelInfo.gameObject:SetActiveEx(false) self.PanelHaveCharacter.gameObject:SetActiveEx(false) self.PanelNoCharacter.gameObject:SetActiveEx(true) self.PanelInvite.gameObject:SetActiveEx(false) self.PanelChat.gameObject:SetActiveEx(false) self.PanelAssist.gameObject:SetActiveEx(false) self.PanelStaminaBar.gameObject:SetActiveEx(false) self.ImgAdd.gameObject:SetActiveEx(not self.Params.IsMultiDim) self:StopTimer() self.RolePanel:HideRoleModel() self:CloseEffctObje() if self.Params.IsMultiDim then local career = XDataCenter.MultiDimManager.GetMatchCareer() self.MultiDimPanel:Refresh(career) end end function XUiGridMulitiplayerRoomChar:CheckOpenEffctObje() if not self.EffectObj then return end if not self.PlayerData then self.EffectObj.gameObject:SetActiveEx(false) return end if self.Parent:CheckActiveOn(self.PlayerData.Id) then self.EffectObj.gameObject:SetActiveEx(false) self.EffectObj.gameObject:SetActiveEx(true) else self.EffectObj.gameObject:SetActiveEx(false) end end function XUiGridMulitiplayerRoomChar:CloseEffctObje() if not self.EffectObj then return end self.EffectObj.gameObject:SetActiveEx(false) end function XUiGridMulitiplayerRoomChar:RefreshPlayer(playerData, callback) local medalConfig = XMedalConfigs.GetMeadalConfigById(playerData.MedalId) local medalIcon = nil if medalConfig then medalIcon = medalConfig.MedalIcon end if medalIcon ~= nil then self.ImgMedalIcon:SetRawImage(medalIcon) self.ImgMedalIcon.gameObject:SetActiveEx(true) else self.ImgMedalIcon.gameObject:SetActiveEx(false) end self.PlayerData = playerData self.TxtName.text = XDataCenter.SocialManager.GetPlayerRemark(playerData.Id, playerData.Name) XUiPlayerLevel.UpdateLevel(playerData.Level, self.TxtLevel) self.ImgLeader.gameObject:SetActiveEx(playerData.Leader) -- 准备状态 if playerData.State == XDataCenter.RoomManager.PlayerState.Select then self.ImgReady.gameObject:SetActiveEx(false) self.ImgModifying.gameObject:SetActiveEx(true) elseif playerData.State == XDataCenter.RoomManager.PlayerState.Ready or playerData.Leader then self.ImgReady.gameObject:SetActiveEx(true) self.ImgModifying.gameObject:SetActiveEx(false) else self.ImgReady.gameObject:SetActiveEx(false) self.ImgModifying.gameObject:SetActiveEx(false) end -- 战斗类型 local charId = playerData.FightNpcData.Character.Id local quality = playerData.FightNpcData.Character.Quality local npcId = XCharacterConfigs.GetCharNpcId(charId, quality) local npcTemplate = XCharacterConfigs.GetNpcTemplate(npcId) self.RImgArms:SetRawImage(XCharacterConfigs.GetNpcTypeIcon(npcTemplate.Type)) -- 战斗力 self.TxtAbility.text = playerData.FightNpcData.Character.Ability local partner = XDataCenter.PartnerManager.CreatePartnerEntityByPartnerData(playerData.FightNpcData.Partner) local IsHasPartner = partner and next(partner) if IsHasPartner then self.CharacterPets:GetObject("RImgType"):SetRawImage(partner:GetIcon()) end self.CharacterPets:GetObject("RImgType").gameObject:SetActiveEx(IsHasPartner) self.CharacterPets.gameObject:SetActiveEx(IsHasPartner or playerData.Id == XPlayer.Id) -- 操作按钮状态 local curRole = self.Parent:GetCurRole() if curRole and curRole.Leader then self.BtnChangeLeader.ButtonState = CS.UiButtonState.Normal self.BtnKick.ButtonState = CS.UiButtonState.Normal else self.BtnChangeLeader.ButtonState = CS.UiButtonState.Disable self.BtnKick.ButtonState = CS.UiButtonState.Disable end -- 助战次数 local stageId = XDataCenter.RoomManager.RoomData.StageId local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId) if stageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then self.PanelAssist.gameObject:SetActiveEx(playerData.HaveFirstPass) self.TxtAssisitCount.text = playerData.AssistCount else self.PanelAssist.gameObject:SetActiveEx(false) end -- 耐力条 if stageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then local active = not playerData.HaveFirstPass and playerData.Id == XPlayer.Id self.PanelStaminaBar.gameObject:SetActiveEx(active) if active then local maxStamina = XArenaOnlineConfigs.MAX_NAILI local curStamina = maxStamina - XDataCenter.ArenaOnlineManager.GetCharEndurance(charId) local text = CS.XTextManager.GetText("RoomStamina", curStamina, maxStamina) self.TxtMyStamina.text = text self.ImgStaminaExpFill.fillAmount = curStamina / maxStamina end else self.PanelStaminaBar.gameObject:SetActiveEx(false) end -- 模型s self.RolePanel:ShowRoleModel() local charId = playerData.FightNpcData.Character.Id if XCharacterCuteConfig.CheckHasCuteModel(charId) and XDataCenter.AprilFoolDayManager.IsInCuteModelTime() then self.RolePanel:UpdateCuteModel(nil, charId, nil, nil, nil, nil, true) self.CuteRandomController:Stop() self.CuteRandomController:SetAnimator(self.RolePanel:GetAnimator(), {}, self.RolePanel) self.CuteRandomController:Play() else local isCute = XDataCenter.FubenSpecialTrainManager.IsStageCute(stageId) local needDisplayController = false if isCute then needDisplayController = XCharacterCuteConfig.GetNeedDisplayController(stageId) end --拍照关特殊处理,防止对其他活动产生影响 if XFubenSpecialTrainConfig.IsSpecialTrainStage(stageId, XFubenSpecialTrainConfig.StageType.Photo) then self.RolePanel:UpdateCharacterModelByFightNpcData(playerData.FightNpcData, callback, isCute, needDisplayController,true) else self.RolePanel:UpdateCharacterModelByFightNpcData(playerData.FightNpcData, callback, isCute, needDisplayController) end end local char = playerData.FightNpcData.Character if XTool.IsNumberValid(char.LiberateAureoleId) then local resourcesId local fashionId = char.FashionId if XTool.IsNumberValid(fashionId) then resourcesId = XDataCenter.FashionManager.GetResourcesId(fashionId) else resourcesId = XDataCenter.FashionManager.GetFashionResourceIdByCharId(char.Id) end local modelName if resourcesId then modelName = XDataCenter.CharacterManager.GetCharResModel(resourcesId) else modelName = self:GetModelName(char.Id) end local rootName, _ = XDataCenter.FashionManager.GetFashionLiberationEffectRootAndPath(char.FashionId) -- 获取该角色手环挂点名字 self.RolePanel:SetLiberationEffect(modelName, rootName, char.LiberateAureoleId, char.Id) end self:CheckOpenEffctObje() --特训关特殊处理 self:RefreshSpecialTrain(playerData) --多维挑战特殊处理 self.PanelMultiDimAbility.gameObject:SetActiveEx(self.Params.IsMultiDim) if self.Params.IsMultiDim then self.PanelAbility.gameObject:SetActiveEx(not self.Params.IsMultiDim) self.MultiDimAbilityPanel:Refresh(playerData) end end function XUiGridMulitiplayerRoomChar:ShowOperationPanel() self.IsShowOperationPanel = not self.IsShowOperationPanel if self.IsShowOperationPanel then -- 操作按钮状态 local curRole = self.Parent:GetCurRole() if curRole and curRole.Leader then self.BtnChangeLeader.ButtonState = CS.UiButtonState.Normal self.BtnKick.ButtonState = CS.UiButtonState.Normal else self.BtnChangeLeader.ButtonState = CS.UiButtonState.Disable self.BtnKick.ButtonState = CS.UiButtonState.Disable end end self.PanelOperation.gameObject:SetActiveEx(self.IsShowOperationPanel) end function XUiGridMulitiplayerRoomChar:ShowInvitePanel() self.IsShowInvitePanel = not self.IsShowInvitePanel self.PanelMultiDimInvite.gameObject:SetActiveEx(self.IsShowInvitePanel and self.Params.IsMultiDim) self.PanelInvite.gameObject:SetActiveEx(self.IsShowInvitePanel and (not self.Params.IsMultiDim)) end function XUiGridMulitiplayerRoomChar:ShowSameCharTips(enable) self.PanelSameCharTips.gameObject:SetActive(enable) end function XUiGridMulitiplayerRoomChar:CloseAllOperationPanel() self.Parent:CloseAllOperationPanel() end function XUiGridMulitiplayerRoomChar:CloseOperationPanelAndInvitePanel() if self.PlayerData then self.PanelOperation.gameObject:SetActiveEx(false) self.IsShowOperationPanel = false else self.PanelInvite.gameObject:SetActiveEx(false) self.IsShowInvitePanel = false end end function XUiGridMulitiplayerRoomChar:OpenSelectCharView() local playerData = self.PlayerData if not playerData or playerData.State == XDataCenter.RoomManager.PlayerState.Ready then XUiManager.TipText("OnlineCancelReadyBeforeSelectCharacter") return end XDataCenter.RoomManager.BeginSelectRequest() local stageId = XDataCenter.RoomManager.RoomData.StageId local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId) local characterLimitType = XFubenConfigs.GetStageCharacterLimitType(stageId) local limitBuffId = XFubenConfigs.GetStageCharacterLimitBuffId(stageId) local charId = playerData.FightNpcData.Character.Id if XDataCenter.FubenSpecialTrainManager.CheckSpecialTrainTypeRobot(stageId) then charId = XDataCenter.FubenSpecialTrainManager.GetRobotIdByStageIdAndCharId(stageId, charId) XLuaUiManager.Open("UiBattleRoomRoleDetail", stageId, XDataCenter.TeamManager.CreateTempTeam({charId, 0, 0}), 1, require("XUi/XUiSpecialTrainYuanXiao/XUiSpecialTrainBattleRoomRoleDetail")) elseif XDataCenter.FubenSpecialTrainManager.IsStageCute(stageId) then charId = XDataCenter.FubenSpecialTrainManager.GetRobotIdByStageIdAndCharId(stageId, charId) XLuaUiManager.Open("UiBattleRoomRoleDetailCute", stageId, XDataCenter.TeamManager.CreateTempTeam({charId, 0, 0}), 1, { AOPCloseBefore = function(proxy, rootUi) self:OnSelectCharacter(rootUi.Team:GetEntityIds()) end }) else if XTool.USENEWBATTLEROOM then XLuaUiManager.Open("UiBattleRoomRoleDetail", stageId , XDataCenter.TeamManager.CreateTempTeam({charId, 0, 0}) , 1, { AOPSetJoinBtnIsActiveAfter = function(proxy, rootUi) rootUi.BtnQuitTeam.gameObject:SetActiveEx(false) end, AOPCloseBefore = function(proxy, rootUi) self:OnSelectCharacter(rootUi.Team:GetEntityIds()) end, GetEntities = function() return XDataCenter.CharacterManager.GetOwnCharacterList(XCharacterConfigs.CharacterType.Normal) end }) else XLuaUiManager.Open("UiRoomCharacter", { [1] = playerData.FightNpcData.Character.Id }, 1, handler(self, self.OnSelectCharacter), stageInfo.Type, characterLimitType, { IsHideQuitButton = true, LimitBuffId = limitBuffId, StageId = stageId }) end end end function XUiGridMulitiplayerRoomChar:OnSelectCharacter(charIdMap) if not XDataCenter.RoomManager.RoomData then -- 被踢出房间不回调 return end XDataCenter.RoomManager.EndSelectRequest() if not charIdMap then return end local charId = charIdMap[1] XDataCenter.RoomManager.Select(charId, function(code) if code ~= XCode.Success then XUiManager.TipCode(code) return end local stageType = XDataCenter.RoomManager.StageInfo.Type if stageType == XDataCenter.FubenManager.StageType.ArenaOnline then if self.PlayerData.FightNpcData.Character.Id ~= charId then self.Parent:InsertFightSuccessTips() end elseif XDataCenter.FubenSpecialTrainManager.IsSpecialTrainBreakthroughType(stageType) then XDataCenter.FubenSpecialTrainManager.RequestBreakthroughSetRobotId(charId) else if stageType == XDataCenter.FubenManager.StageType.SpecialTrainSnow then XDataCenter.FubenSpecialTrainManager.SetSnowGameRobotId(charId) end XUiManager.TipText("OnlineFightSuccess", XUiManager.UiTipType.Success) end end) end function XUiGridMulitiplayerRoomChar:ShowCountDownPanel(enable) self.PanelCountDown.gameObject:SetActiveEx(enable) end function XUiGridMulitiplayerRoomChar:SetCountDownTime(second) self.TxtCountDown.text = second end -- 聊天相关 function XUiGridMulitiplayerRoomChar:StopTimer() if self.Timer then XScheduleManager.UnSchedule(self.Timer) self.Timer = nil end end function XUiGridMulitiplayerRoomChar:RefreshChat(chatDataLua) local isEmoji = chatDataLua.MsgType == ChatMsgType.Emoji local maxWorld = XFubenConfigs.ROOM_MAX_WORLD self.LeftTime = XFubenConfigs.ROOM_WORLD_TIME self:StopTimer() if isEmoji then local icon = XDataCenter.ChatManager.GetEmojiIcon(chatDataLua.Content) self.RImgEmoji:SetRawImage(icon) else local str = string.InsertStr(chatDataLua.Content, maxWorld, "\n") self.TxtDesc.text = str end self.Timer = XScheduleManager.ScheduleForever(function() self.LeftTime = self.LeftTime - 1 if self.LeftTime <= 0 then self:StopTimer() self.PanelChat.gameObject:SetActiveEx(false) return end end, XScheduleManager.SECOND, 0) self.PanelChat.gameObject:SetActiveEx(true) self.PanelDailog.gameObject:SetActive(not isEmoji) self.PanelEmoji.gameObject:SetActive(isEmoji) self.PanelChatEnable:PlayTimelineAnimation() end ----------------------- 按钮回调 ----------------------- function XUiGridMulitiplayerRoomChar:OnBtnDetailInfoClick() -- 查看信息 XDataCenter.PersonalInfoManager.ReqShowInfoPanel(self.PlayerData.Id, handler(self, self.CloseAllOperationPanel)) end function XUiGridMulitiplayerRoomChar:OnBtnAddFriendClick() -- 加好友 XDataCenter.SocialManager.ApplyFriend(self.PlayerData.Id, handler(self, self.CloseAllOperationPanel)) end function XUiGridMulitiplayerRoomChar:OnBtnChangeLeaderClick() local curRole = self.Parent:GetCurRole() if not curRole or not curRole.Leader then return end --转移队长 XDataCenter.RoomManager.ChangeLeader(self.PlayerData.Id, handler(self, self.CloseAllOperationPanel)) end function XUiGridMulitiplayerRoomChar:OnBtnKickClick() local curRole = self.Parent:GetCurRole() if not curRole or not curRole.Leader then return end --移出队伍 XDataCenter.RoomManager.KickOut(self.PlayerData.Id, handler(self, self.CloseAllOperationPanel)) end function XUiGridMulitiplayerRoomChar:OnBtnItemClick() self.Parent:CloseAllOperationPanel(self.Index) if self.PlayerData then if self.PlayerData.Id == XPlayer.Id then self:OpenSelectCharView() else self:ShowOperationPanel() end else self:ShowInvitePanel() end end function XUiGridMulitiplayerRoomChar:OnBtnPetClick() local playerData = self.PlayerData if not playerData or playerData.State == XDataCenter.RoomManager.PlayerState.Ready then XUiManager.TipText("OnlineCancelReadyBeforeSelectCharacter") return end if self.PlayerData.Id ~= XPlayer.Id then self:OnBtnItemClick() return end local charId = playerData.FightNpcData.Character.Id if XRobotManager.CheckIsRobotId(charId) then self:OnBtnItemClick() return end local isCanOpenUiPartner = XDataCenter.PartnerManager.GoPartnerCarry(charId, false, function() XDataCenter.RoomManager.EndSelectRequest(function() XDataCenter.RoomManager.Select(charId) end) end) if isCanOpenUiPartner then XDataCenter.RoomManager.BeginSelectRequest() end end function XUiGridMulitiplayerRoomChar:OnBtnFriendClick() self.Parent:CloseAllOperationPanel() local roomData = XDataCenter.RoomManager.RoomData if not roomData or not roomData.StageId then return end local roomType = MultipleRoomType.Normal local stageInfo = XDataCenter.FubenManager.GetStageInfo(roomData.StageId) if stageInfo.Type == XDataCenter.FubenManager.StageType.ArenaOnline then roomType = MultipleRoomType.ArenaOnline elseif stageInfo.Type == XDataCenter.FubenManager.StageType.FubenPhoto then roomType=MultipleRoomType.FubenPhoto end XLuaUiManager.Open("UiMultiplayerInviteFriend", roomType) end function XUiGridMulitiplayerRoomChar:OnBtnGuildClick() if not XDataCenter.GuildManager.IsJoinGuild() then XUiManager.TipText("ArenaNoGuildTips") return end self.Parent:CloseAllOperationPanel() local roomData = XDataCenter.RoomManager.RoomData if not roomData or not roomData.StageId then return end local roomType = MultipleRoomType.Normal local stageInfo = XDataCenter.FubenManager.GetStageInfo(roomData.StageId) if stageInfo.Type == XDataCenter.FubenManager.StageType.MultiDimOnline then roomType = MultipleRoomType.MultiDimOnline end XLuaUiManager.Open("UiMultiplayerInviteFriend", roomType) end function XUiGridMulitiplayerRoomChar:OnBtnWorldClick() self.Parent:CloseAllOperationPanel() --邀请世界 local cfgData = XDataCenter.FubenManager.GetStageCfg(XDataCenter.RoomManager.RoomData.StageId) local content = CS.XTextManager.GetText("OnlineInviteFriend", XPlayer.Name, cfgData.Name) local customContent = CS.XTextManager.GetText("OnlineInviteLink", XDataCenter.RoomManager.RoomData.Id .. "|" .. XDataCenter.RoomManager.RoomData.StageId) local sendChat = {} sendChat.ChannelType = ChatChannelType.World sendChat.Content = content sendChat.CustomContent = XMessagePack.Encode(customContent) sendChat.MsgType = ChatMsgType.Normal sendChat.TargetIds = { XPlayer.Id } local callBack = function() XUiManager.TipText("OnlineSendWorldSuccess") end XDataCenter.ChatManager.SendChat(sendChat, callBack, true) end function XUiGridMulitiplayerRoomChar:OnBtnTeamClick() self.Parent:CloseAllOperationPanel(self.Index) end function XUiGridMulitiplayerRoomChar:RefreshSpecialTrain(playerData) local rankScore = playerData.RankScore local stageId = XDataCenter.RoomManager.RoomData.StageId --冰雪感谢祭 local isSpecialTrainSnow = XFubenSpecialTrainConfig.IsSpecialTrainStage(stageId, XFubenSpecialTrainConfig.StageType.Snow) --元宵 local isSpecialTrainRhythm = XFubenSpecialTrainConfig.IsSpecialTrainStage(stageId, XFubenSpecialTrainConfig.StageType.Rhythm) if isSpecialTrainSnow or isSpecialTrainRhythm then self.RImgArms.color = RImgArmsColor local icon = XDataCenter.FubenSpecialTrainManager.GetIconByScore(rankScore) self.RImgArms:SetRawImage(icon) --self.TxtAbility.gameObject:SetActiveEx(false) --self.TxtParameter.gameObject:SetActiveEx(false) self.CharacterPets.gameObject:SetActiveEx(false) self.Skill.gameObject:SetActiveEx(false) if self.TxtScore then self.TxtScore.text = rankScore end --region 元宵2023 if isSpecialTrainRhythm then self.Skill.gameObject:SetActiveEx(true) if not self._YuanXiaoSkill then local XUi2023YuanXiaoRoomSkill = require("XUi/XUiSpecialTrainYuanXiao/YuanXiao2023/XUi2023YuanXiaoRoomSkill") self._YuanXiaoSkill = XUi2023YuanXiaoRoomSkill.New(self.Skill) end self._YuanXiaoSkill:Update(playerData) self.CharacterPets.gameObject:SetActiveEx(false) end --endregion 元宵2023 end -- 拍照2.0 local isSummerEpisodeNew = XFubenSpecialTrainConfig.IsSpecialTrainStage(stageId, XFubenSpecialTrainConfig.StageType.Photo) if isSummerEpisodeNew then self.PanelAbility.gameObject:SetActiveEx(false) self.CharacterPets.gameObject:SetActiveEx(false) end -- 魔方2.0 if XFubenSpecialTrainConfig.IsBreakthroughStage(stageId) then self.CharacterPets.gameObject:SetActiveEx(false) self.PanelSpecialTrainIcon.gameObject:SetActiveEx(false) end end return XUiGridMulitiplayerRoomChar