local PlayerInteract_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local interactive_pb = require('Proto/interactive_pb') local power_contrast_pb = require("Proto/power_contrast_pb") -- 加为好友>发送信息>邀请组队/申请组队>邀请进团>删除好友>添加仇人/删除仇人>加入黑名单/删除黑名单>举报 --方便排序处理 PlayerInteract_Model.InteractType = { CheckPlayerInfo = 0, --查看玩家信息 AddFriend = 1, SendMsg = 2, InviteJoinTeam = 3, -- 邀请组队 JoinTeam = 4, -- 申请入队 InviteLegion = 5, DeleteFriend = 6, -- 仇人 AddRival = 7, DeleteRival = 8, -- 黑名单 AddBlock = 9, DeleteBlock = 10, ---军团相关 AppointPost = 11, FireStatus = 12,--卸任身份 AppointLeader = 13, KickGuild = 14, GuildRecommend = 15, --军团引荐 ---职权相关 Inquire = 16, --请安 Silence = 17, --禁言 Punishment = 18, --问责 Promote = 19, --提拔 -- 聊天特殊相关 Report = 20, -- 举报 CancelCountryJob = 21, --国家免职 CountryShutUp = 22, --国家禁言 CountryReleaseShutUp = 23, --解除禁言 CountryAppointPost = 24, --国家任命 SpecialTeamInvite = 25, --战团邀请 SpecialTeamApply = 26, --战团申请 } local ids_InteractType = { [PlayerInteract_Model.InteractType.CheckPlayerInfo] = Const_IDS.IDS_TeamUI_CheckInformation, [PlayerInteract_Model.InteractType.AddFriend] = Const_IDS.IDS_Mutual_AddFriends, [PlayerInteract_Model.InteractType.SendMsg] = Const_IDS.IDS_Mutual_Send, [PlayerInteract_Model.InteractType.InviteJoinTeam] = Const_IDS.IDS_Mutual_InviteTeam, [PlayerInteract_Model.InteractType.JoinTeam] = Const_IDS.IDS_Mutual_ApplyTeam, [PlayerInteract_Model.InteractType.InviteLegion] = Const_IDS.IDS_Mutual_InviteGroup, [PlayerInteract_Model.InteractType.DeleteFriend] = Const_IDS.IDS_Mutual_DeleteFriends, [PlayerInteract_Model.InteractType.AddBlock] = Const_IDS.IDS_Mutual_AddBlacklist, [PlayerInteract_Model.InteractType.DeleteBlock] = Const_IDS.IDS_Mutual_DeleteBlacklist, [PlayerInteract_Model.InteractType.AppointPost] = Const_IDS.IDS_Guild_PlayerInfolistButton_ChangeJob, [PlayerInteract_Model.InteractType.FireStatus] = Const_IDS.IDS_GuildLeaderDismiss_Title, [PlayerInteract_Model.InteractType.AppointLeader] = Const_IDS.IDS_Guild_PlayerInfolistButton_ChangeLeader, [PlayerInteract_Model.InteractType.KickGuild] = Const_IDS.IDS_Guild_PlayerInfolistButton_Kick, [PlayerInteract_Model.InteractType.GuildRecommend] = Const_IDS.IDS_Guild_PlayerInfolistButton_Recommend, [PlayerInteract_Model.InteractType.Inquire] = Const_IDS.IDS_OfficialPrivilege_Button1, [PlayerInteract_Model.InteractType.Silence] = Const_IDS.IDS_OfficialPrivilege_Button3, [PlayerInteract_Model.InteractType.Punishment] = Const_IDS.IDS_OfficialPrivilege_Button4, [PlayerInteract_Model.InteractType.Promote] = Const_IDS.IDS_OfficialPrivilege_Button5, [PlayerInteract_Model.InteractType.AddRival] = Const_IDS.IDS_Rival_AddRival, [PlayerInteract_Model.InteractType.DeleteRival] = Const_IDS.IDS_Rival_DeleteRival, [PlayerInteract_Model.InteractType.Report] = Const_IDS.IDS_Report_JuBao, [PlayerInteract_Model.InteractType.CancelCountryJob] = Const_IDS.IDS_Country_DismissOfficerBtn, [PlayerInteract_Model.InteractType.CountryReleaseShutUp] = Const_IDS.IDS_Country_UnmuteBtn, [PlayerInteract_Model.InteractType.CountryAppointPost] = Const_IDS.IDS_Country_ChangeOfficerTitleBtn, [PlayerInteract_Model.InteractType.CountryShutUp] = Const_IDS.IDS_Country_Mute, [PlayerInteract_Model.InteractType.SpecialTeamInvite] = Const_IDS.IDS_HeroMatch3v3_InviteTeam, [PlayerInteract_Model.InteractType.SpecialTeamApply] = Const_IDS.IDS_HeroMatch3v3_ApplyTeam, } function PlayerInteract_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageGetPlayerInteractiveInfo, private.GetPlayerInteractiveInfoResp) NetManager.RegisterMsgCB(MessageEnums.MessagePowerContrastGetOtherShowInfo, private.PowerContrastGetOtherShowInfoResp) NetManager.RegisterMsgCB(MessageEnums.MessagePowerContrastGetOtherLineupInfo, private.PowerContrastGetOtherLineupInfoResp) NetManager.RegisterMsgCB(MessageEnums.MessagePowerContrastGsPk, private.PowerContrastGsPkResp) end function PlayerInteract_Model.PowerContrastGetOtherShowInfoReq(acid) local msg = power_contrast_pb.PowerContrastGetOtherShowInfoReq() msg.TargetAcid = acid NetManager.SendMessage(MessageEnums.MessagePowerContrastGetOtherShowInfo, msg) end function private.PowerContrastGetOtherShowInfoResp(msgResp) if msgResp.Resp.Code == 0 then UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UICharacterInfoPopUp, msgResp) end end function PlayerInteract_Model.PowerContrastGetOtherLineupInfoReq(acid, selectHeroId) private.powerContrastSelectHeroId = selectHeroId local msg = power_contrast_pb.PowerContrastGetOtherLineupInfoReq() msg.TargetAcid = acid NetManager.SendMessage(MessageEnums.MessagePowerContrastGetOtherLineupInfo, msg) end function private.PowerContrastGetOtherLineupInfoResp(msgResp) if msgResp.Resp.Code == 0 then UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UICharacterFormationPopUp, { detailHeroInfo = msgResp.UpdateHeroes, selectHeroId = private.powerContrastSelectHeroId, awakenBreakInfo = msgResp.awakenBreakInfo }) EventSystem.Dispatch(EventID.UI_GetOthersFormationInfo, msgResp.UpdateHeroes) end end function PlayerInteract_Model.PowerContrastGsPkReq(acid, showInfo) private.comparePlayerShowInfo = showInfo local msg = power_contrast_pb.PowerContrastGsPkReq() msg.TargetAcid = acid NetManager.SendMessage(MessageEnums.MessagePowerContrastGsPk, msg) end function private.PowerContrastGsPkResp(msgResp) if msgResp.Resp.Code == 0 then local sourceType2GsListDic, sourceTypeList, leftTotalGS, rightTotalGS = private.GetGsCompareParam(msgResp) UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UICharacterContrastPopUp, { comparePlayerShowInfo = private.comparePlayerShowInfo, sourceType2GsListDic = sourceType2GsListDic, sourceTypeList = sourceTypeList, leftTotalGS = leftTotalGS, rightTotalGS = rightTotalGS }) end end --战力对比小类排序 function private.GsSortRule(gsData1, gsData2) return gsData1.gsConfig.SortID < gsData2.gsConfig.SortID end --战力对比大类排序 function private.SourceSortRule(sourceData_1, sourceData_2) return sourceData_1.sourceType < sourceData_2.sourceType end function private.GetTargetGsByType(targetGs, gsType) for i, v in ipairs(targetGs) do if v.GsType == gsType then return v.Gs end end return 0 end function private.GetGsByType(gsArray, gsType) for _, v in ipairs(gsArray) do if v.GsType == gsType then return v.Gs end end return nil end --获取战力对比信息 function private.GetGsCompareParam(serverGsInfo) local sourceType2GsListDic = {} --K:大类 V:小类列表 local sourceTypeList = {} --大类别的列表 local leftTotalGS = serverGsInfo.PlayerTotalGs local rightTotalGS = serverGsInfo.TargetTotalGs for _,v in DataSheetManager.PowerContrast:GetEnumerator() do local isUnlock = false local targetGs = private.GetGsByType(serverGsInfo.TargetGs, v.ContrastID) local playerGs = private.GetGsByType(serverGsInfo.PlayerGs, v.ContrastID) if (playerGs and playerGs >= 0) or (targetGs and targetGs >= 0) then playerGs = playerGs or 0 targetGs = targetGs or 0 isUnlock = true end --如果双方该功能不解锁,不显示 if isUnlock then local gsLeft = playerGs < 0 and 0 or playerGs local gsRight = targetGs < 0 and 0 or targetGs local infos = sourceType2GsListDic[v.typeSource] if infos == nil then infos = {} sourceType2GsListDic[v.typeSource] = infos end local gsData = { gsLeft = gsLeft, gsRight = gsRight, gsConfig = v, } table.insert(infos, gsData) end end for i, v in pairs(sourceType2GsListDic) do local typeGsLeft = 0 local typeGsRight = 0 for _, gsData in ipairs(v) do typeGsLeft = typeGsLeft + gsData.gsLeft typeGsRight = typeGsRight + gsData.gsRight end local data = { leftSumGs = typeGsLeft, rightSumGs = typeGsRight, ids = v[1].gsConfig.typeSourceIDS, gsTypeNum = #v, sourceType = i, } table.insert(sourceTypeList, data) --对小类列表排序 table.sort(v, private.GsSortRule) end table.sort(sourceTypeList, private.SourceSortRule) return sourceType2GsListDic, sourceTypeList, leftTotalGS, rightTotalGS end function PlayerInteract_Model.GetPlayerInteractiveInfoReq(TargetACID, occasionType, extraParameter) --机器人不请求 if UTL.String.IsRobotByAcid(TargetACID) then return end local msg = interactive_pb.GetPlayerInteractiveInfoReq() msg.TargetACID = TargetACID if occasionType then msg.Occasion = occasionType end private.extraParameter = extraParameter NetManager.SendMessage(MessageEnums.MessageGetPlayerInteractiveInfo,msg) end function private.GetPlayerInteractiveInfoResp(msgResp) if msgResp.Resp.Code == 0 then PlayerInteract_Model.OpenFriendInteract(msgResp, private.extraParameter) private.extraParameter = nil end end function PlayerInteract_Model.OpenFriendInteract(msgResp, extraParameter) UIManager.OpenView(Const_UI_Lua.UIEnum.UIPlayerInteractionView, {msgResp = msgResp, extraParameter = extraParameter}) end function PlayerInteract_Model.Execute(InteractType, targetData, extraParameter) local type = InteractType if PlayerInteract_Model.InteractType.AddFriend == type then PlayerInteract_Model.AddFriend(targetData) elseif PlayerInteract_Model.InteractType.CheckPlayerInfo == type then PlayerInteract_Model.CheckPlayerInfo(targetData) elseif PlayerInteract_Model.InteractType.SendMsg == type then UIManager.CloseView(Const_UI_Lua.UIEnum.UITeamInvitedPanel) UIManager.CloseView(Const_UI_Lua.UIEnum.UITeamApplyPanel) PlayerInteract_Model.SendMsg(targetData) elseif PlayerInteract_Model.InteractType.InviteJoinTeam == type then private.InviteJoinTeam(targetData) elseif PlayerInteract_Model.InteractType.JoinTeam == type then PlayerInteract_Model.JoinTeam(targetData) elseif PlayerInteract_Model.InteractType.InviteLegion == type then PlayerInteract_Model.InviteLegion(targetData) elseif PlayerInteract_Model.InteractType.DeleteFriend == type then PlayerInteract_Model.DeleteFriend(targetData) elseif PlayerInteract_Model.InteractType.AddBlock == type then PlayerInteract_Model.AddBlock(targetData) elseif PlayerInteract_Model.InteractType.DeleteBlock == type then PlayerInteract_Model.DeleteBlock(targetData) elseif PlayerInteract_Model.InteractType.AppointPost == type then CTL.Guild.OpenAppointPostView(targetData) elseif PlayerInteract_Model.InteractType.KickGuild == type then MDL.Guild.GuildKickOutMemberReq(targetData.HeadInfo.acid, targetData.HeadInfo.name) elseif PlayerInteract_Model.InteractType.AppointLeader == type then MDL.Guild.GuildChangeLeaderReq(targetData.HeadInfo.acid, targetData.HeadInfo.name) elseif PlayerInteract_Model.InteractType.FireStatus == type then PlayerInteract_Model.FireStatus(targetData) elseif PlayerInteract_Model.InteractType.GuildRecommend == type then CTL.Guild.SendRecommend(targetData.HeadInfo.acid, targetData.HeadInfo.name) elseif PlayerInteract_Model.InteractType.Inquire == type or PlayerInteract_Model.InteractType.Silence == type or PlayerInteract_Model.InteractType.Punishment == type or PlayerInteract_Model.InteractType.Promote == type then CTL.OfficialPrivilege.ExecuteInteractOptBtn(type, targetData.HeadInfo.acid) elseif PlayerInteract_Model.InteractType.AddRival == type then MDL.Rival.RivalOperationRequest(targetData.HeadInfo.acid, MDL.Rival.RivalOperationType.RivalOptCommonEnemy) elseif PlayerInteract_Model.InteractType.DeleteRival == type then PlayerInteract_Model.DeleteRival(targetData) elseif PlayerInteract_Model.InteractType.Report == type then UIManager.OpenView(Const_UI_Lua.UIEnum.UIFriendReport, {beReportAcid = targetData.HeadInfo.acid, beReportName = targetData.HeadInfo.name, reportContent = extraParameter.chatContent}) elseif PlayerInteract_Model.InteractType.CancelCountryJob == type then CTL.Country.CancelJob(targetData.HeadInfo.acid) elseif PlayerInteract_Model.InteractType.CountryShutUp == type then CTL.Country.CountryMute(targetData.HeadInfo.acid, targetData.HeadInfo.name) elseif PlayerInteract_Model.InteractType.CountryReleaseShutUp == type then CTL.Country.CountryUnMute(targetData.HeadInfo.acid, targetData.HeadInfo.name) elseif PlayerInteract_Model.InteractType.CountryAppointPost == type then CTL.Country.CountryAppointPost(targetData.HeadInfo) elseif PlayerInteract_Model.InteractType.SpecialTeamInvite == type then CTL.SpecialTeam.TryInviteMember(targetData.HeadInfo) elseif PlayerInteract_Model.InteractType.SpecialTeamApply == type then CTL.SpecialTeam.TryApplyTeam(targetData.TeamWarID) end end --加为好友 function PlayerInteract_Model.AddFriend(targetData) if targetData.TargetOpenFriend == false then if targetData.HeadInfo.IsCross then --对方未开启跨服好友 CTL.Tips.AddTipsMsg(Const_IDS.IDS_FriendCrossLock) return else --对方未开启好友 CTL.Tips.AddTipsMsg(Const_IDS.IDS_Mutual_ConditionFriend) return end end --判断是否在对方的黑名单中 if targetData.InTargetEnemy then CTL.Tips.AddTipsMsg(Const_IDS.IDS_Friend_HisBlacklist1) return end MDL.Friend.SendApplyFriend(targetData.HeadInfo.acid) end --查看玩家信息 function PlayerInteract_Model.CheckPlayerInfo(targetData) local acid = targetData.HeadInfo.acid PlayerInteract_Model.CheckPlayerInfoByAcid(acid) end function PlayerInteract_Model.CheckPlayerInfoByAcid(acid) if CTL.ChannelChat.SelfIsDead() then CTL.Tips.AddTipsMsg(Const_IDS.IDS_DeadNote) else PlayerInteract_Model.PowerContrastGetOtherShowInfoReq(acid) end end --发送信息 function PlayerInteract_Model.SendMsg(targetData) if targetData.TargetOpenFriend == false then --对方未开启好友 CTL.Tips.AddTipsMsg(Const_IDS.IDS_Mutual_ConditionChat) return end --判断是否在对方的黑名单中 if targetData.InTargetEnemy then CTL.Tips.AddTipsMsg(Const_IDS.IDS_Friend_HisBlacklist2) return end --只有非同战区且非跨服好友时,才不允许私聊 if not targetData.HeadInfo.IsCross and not targetData.IsSameWarZone then CTL.Tips.AddTipsMsgAndPlaySound(Const_IDS.IDS_FriendCrossChatLimit) return end --非好友时,开服前4天不允许私聊 if not MDL.Friend.IsPlayerFriend(targetData.HeadInfo.acid) then local privateChatDay = DataSheetManager.ConstData:GetDataByID("PrivateChatDay").IntValue if MDL.Player.GetPersonalServerDayCount() < privateChatDay then CTL.Tips.AddTipsMsg(string.FormatByIdsId(Const_IDS.IDS_PrivateChat_Tips, privateChatDay)) return end end -- 尝试关闭推荐好友界面 UIManager.CloseView(Const_UI_Lua.UIEnum.UIFriendRecommendation) --打开好友界面,选中acid CTL.Friend.PrivateTalkToAcid(targetData.HeadInfo.acid) end --邀请组队 function private.InviteJoinTeam(targetData) MDL.Team.TeamInviteReq(targetData.HeadInfo.acid) end --申请入队 function PlayerInteract_Model.JoinTeam(targetData) local teamInfo = targetData.TeamInfo CTL.Team.SendTeamApplyRequest(teamInfo.teamId, teamInfo.target, teamInfo.limit) end --邀请进团 function PlayerInteract_Model.InviteLegion(targetData) MDL.Guild.InvitePlayer(targetData.HeadInfo.acid) end --删除好友 function PlayerInteract_Model.DeleteFriend(targetData) MDL.Friend.SendDeleteFriend(targetData.HeadInfo.acid) end --加入黑名单 function PlayerInteract_Model.AddBlock(targetData) --拉黑需要弹二级弹窗 if MDL.Friend.GetListNum(MDL.Friend.ListType.Black) < MDL.Friend.Max_Black_Num then local isFriend = MDL.Friend.IsPlayerFriend(targetData.HeadInfo.acid) if isFriend then local func = function() MDL.Friend.BlackOperationReq(targetData.HeadInfo.acid, true) end UTL.MessageBox.ShowOKCancelBox(nil, Const_IDS.IDS_Friend_JoinBlacklist1,func, nil) else MDL.Friend.BlackOperationReq(targetData.HeadInfo.acid, true) end else CTL.Tips.AddTipsMsg(Const_IDS.IDS_Friend_BlacklistNumList) -- 您的黑名单列表已达上限 end end --删除黑名单 function PlayerInteract_Model.DeleteBlock(targetData) local func = function() MDL.Friend.BlackOperationReq(targetData.HeadInfo.acid, false) end UTL.MessageBox.ShowOKCancelBox(nil, Const_IDS.IDS_Friend_IfDeleteBlacklist1, func, nil) end -- 删除仇人 function PlayerInteract_Model.DeleteRival(targetData) local func = function() MDL.Rival.RivalOperationRequest(targetData.HeadInfo.acid, MDL.Rival.RivalOperationType.RivalOptRemoveList) end UTL.MessageBox.ShowOKCancelBox(nil, string.FormatByIdsId(Const_IDS.IDS_Rival_DeleteRivalConfirmDesc, targetData.HeadInfo.name), func, nil) end ---团长卸任自己身份 function PlayerInteract_Model.FireStatus(targetData) if MDL.Guild.CurClickIdentityId then local name = UIUtils.GetLocalizedTxt(Const_IDS[DataSheetManager.GuildStatus:GetDataByID(MDL.Guild.CurClickIdentityId).JobName]) local str =string.FormatByIdsId(Const_IDS.IDS_GuildLeaderDismissConfirm_Label, targetData.HeadInfo.name, name) UTL.MessageBox.ShowOKCancelBox(nil, str, function () MDL.Guild.GuildAppointIdentityReq(targetData.HeadInfo.acid,MDL.Guild.CurClickIdentityId,true) end, nil) else local name = UIUtils.GetLocalizedTxt(Const_IDS[DataSheetManager.GuildJob:GetDataByID(MDL.Guild.CurClickJobId).JobName]) local str =string.FormatByIdsId(Const_IDS.IDS_GuildLeaderDismissConfirm_Label, targetData.HeadInfo.name, name) UTL.MessageBox.ShowOKCancelBox(nil, str, function () MDL.Guild.GuildAppointJobReq(targetData.HeadInfo.acid,MDL.Guild.JobEnum.Common) end, nil) end end function PlayerInteract_Model.SetBtnText(btnText, InteractType) UIUtils.SetLabelText(btnText, ids_InteractType[InteractType]) end function PlayerInteract_Model.GetIDS(InteractType) return ids_InteractType[InteractType] end PlayerInteract_Model.OccasionType = { GuildMainView = 1, GuildMemberView = 2, WarZoneChannel = 3, ChannelChat = 4, CountryOfficial = 5, --国家官职 显示卸任按钮 CountryMember = 6, --国家成员 显示任命按钮 } function PlayerInteract_Model.AddBtnsByOccasion(list,occasionType, acid) if occasionType == PlayerInteract_Model.OccasionType.GuildMainView then if MDL.Guild.GetMyGuildInfo().jobTitle == MDL.Guild.JobEnum.Leader then table.insert( list, MDL.PlayerInteract.InteractType.FireStatus) end elseif occasionType == PlayerInteract_Model.OccasionType.GuildMemberView then if MDL.Guild.JobHasPermission(MDL.Guild.GetMyGuildInfo().jobTitle,MDL.Guild.AuthorityEnum.GuildAppoint1) then local memberData = MDL.Guild.GetMemberData(acid) if CTL.Guild.IsHighJob(MDL.Guild.GetMyGuildInfo().jobTitle,memberData.jobTitle) then table.insert(list ,MDL.PlayerInteract.InteractType.AppointPost) end end if MDL.Guild.JobHasPermission(MDL.Guild.GetMyGuildInfo().jobTitle,MDL.Guild.AuthorityEnum.GuildChangeLeader) then table.insert(list ,MDL.PlayerInteract.InteractType.AppointLeader) end if MDL.Guild.JobHasPermission(MDL.Guild.GetMyGuildInfo().jobTitle,MDL.Guild.AuthorityEnum.GuildKick) then local memberData = MDL.Guild.GetMemberData(acid) if CTL.Guild.IsHighJob(MDL.Guild.GetMyGuildInfo().jobTitle,memberData.jobTitle) then table.insert(list ,MDL.PlayerInteract.InteractType.KickGuild) end end elseif occasionType == PlayerInteract_Model.OccasionType.ChannelChat and GameAppInfo.IsChinesePackage() then table.insert(list, MDL.PlayerInteract.InteractType.Report) elseif occasionType == PlayerInteract_Model.OccasionType.CountryOfficial then if MDL.Country.CanChangeJob(acid) then table.insert(list, MDL.PlayerInteract.InteractType.CancelCountryJob) end elseif occasionType == PlayerInteract_Model.OccasionType.CountryMember then if MDL.Country.CanChangeJob(acid) then table.insert(list, MDL.PlayerInteract.InteractType.CountryAppointPost) end end end return PlayerInteract_Model