ChatModel = ChatModel or BaseClass(BaseModel) ChatModel.SELECT_CHAT_VIEW_TARBAR = "SELECT_CHAT_VIEW_TARBAR" ChatModel.SELECT_FACE_ITEM = "SELECT_FACE_ITEM" ChatModel.SELECT_TEXT_FACE_ITEM = "SELECT_TEXT_FACE_ITEM" ChatModel.SELECT_HISTROY_ITEM = "SELECT_HISTROY_ITEM" ChatModel.SELECT_GOOD_ITEM = "SELECT_GOOD_ITEM" ChatModel.SELECT_PARTNER_ITEM = "SELECT_PARTNER_ITEM" ChatModel.SELECT_COORD_ITEM = "SELECT_COORD_ITEM" ChatModel.DELETE_CECRET_CHAT_ITEM = "DELETE_CECRET_CHAT_ITEM" ChatModel.SELECT_OTHER_PLAYER = "ChatModel.SELECT_OTHER_PLAYER" -- 算中其他玩家item ChatModel.SEND_MSG = "ChatModel.SEND_MSG" --发送消息 ChatModel.ADD_NEW_MSG = "ADD_NEW_MSG" ChatModel.SHOW_TAB_RED_POINT = "ChatModel.SHOW_TAB_RED_POINT" -- 显示标签红点 ChatModel.CHANGE_CHANNEL_SEND_INTERVAL = "ChatModel.CHANGE_CHANNEL_SEND_INTERVAL" -- 改变发送间隔 ChatModel.UPDATE_SEND_TIME = "UPDATE_SEND_TIME" ChatModel.REFRESH_FRIEND = "REFRESH_FRIEND" ChatModel.REFRESH_MEMBER = "REFRESH_MEMBER" ChatModel.CLEAR_DATA = "CLEAR_DATA" ChatModel.SHOW_LINE_TIME = 60 * 30 --说话间隔大于该时间 就要添加横线时间显示项 ChatModel.PLAY_VOICE = "PLAY_VOICE"--语音播放事件 ChatModel.UPDATE_INDIVID_VIEW = "ChatModel.UPDATE_INDIVID_VIEW" --表情界面更新 ChatModel.SEND_MSG_IN_VIEW = "ChatModel.SEND_MSG_IN_VIEW" --通过聊天界面发送内容 ChatModel.UPDATE_HORNTV_NUM = "ChatModel.UPDATE_HORNTV_NUM" --更新喇叭排队数量 ChatModel.SHOW_BAG_SELECT_BG = "ChatModel.SHOW_BAG_SELECT_BG" --显示背包选中图片 ChatModel.REFRESH_VIEW = "ChatModel.REFRESH_VIEW" --刷新界面 ChatModel.DEL_CHAT_ITEM = "ChatModel.DEL_CHAT_ITEM" --删除聊天 ChatModel.DEL_NOTICE_CHAT_ITEM = "ChatModel.DEL_NOTICE_CHAT_ITEM" --删除公告聊天 ChatModel.CROSS_HORN_HAS_CHANGE = "ChatModel.CROSS_HORN_HAS_CHANGE" --跨服喇叭数量变化 ChatModel.HORN_HAS_CHANGE = "ChatModel.HORN_HAS_CHANGE" --喇叭数量变化 ChatModel.SAVE_CHAT_HISTORY_INFO = "ChatModel.SAVE_CHAT_HISTORY_INFO" --保存历史输入 ChatModel.SELECT_HISTORY_TEXT_ITEM = "ChatModel.SELECT_HISTORY_TEXT_ITEM" --点击历史item ChatModel.SAVE_MAINUI_CHAT_HISTORY_INFO = "ChatModel.SAVE_MAINUI_CHAT_HISTORY_INFO" --主界面UI聊天记录 ChatModel.CLICK_POS_BTN = "ChatModel.CLICK_POS_BTN" --点击坐标按钮 ChatModel.HIDE_MIAN_UI_CHAT_VIEW = "ChatModel.HIDE_MIAN_UI_CHAT_VIEW" --关闭打开聊天主界面的 处理表情包bug ChatModel.INIT_FIRST_GAME_CHAT_DATA = "ChatModel.INIT_FIRST_GAME_CHAT_DATA" ChatModel.SEND_PROTOCAL = "ChatModel.SEND_PROTOCAL" --发送协议 ChatModel.CHANGE_HEIGHT = "ChatModel.CHANGE_HEIGHT" --高度计算用 ChatModel.Update_MAINUI_GUILD_MSG_RED = "ChatModel.Update_MAINUI_GUILD_MSG_RED" -- 更新主界面社团红点 --ChatModel.MIAN_UI_CHAT_VIEW_LOADED = "ChatModel.MIAN_UI_CHAT_VIEW_LOADED" --左下加载完毕 --如果这边键值对改变的话 MainUIModel.VoiceType 这边也要对应调整 ChatModel.CHANNEL_GENERAL = 99 --综合频道 ChatModel.CHANNEL_SYSTEM = 10 --系统 ChatModel.CHANNEL_WORLD = 1 --世界 ChatModel.CHANNEL_HORN = 2 --喇叭 ChatModel.CHANNEL_NEAR = 3 --区域 ChatModel.CHANNEL_GUILD = 4 --社团 ChatModel.CHANNEL_TEAM = 5 --队伍 ChatModel.CHANNEL_CECRET = 6 --私聊频道 ChatModel.CHANNEL_INVITE = 11 --组队(招募)频道(用于发布组队邀请) ChatModel.CHANNEL_BARRAGE = 12--弹幕聊天(只针对活动场景的聊天) ChatModel.CHANNEL_CROSS = 13 --跨服聊天 ChatModel.CHANNEL_REPLY = 14 --答题频道 ChatModel.CHANNEL_3V3_TEAM = 15 --3v3 ChatModel.CHANNEL_1VN = 16 --1vN频道 ChatModel.CHANNEL_BEACH = 17 --温泉 ChatModel.CHANNEL_GUILDTV = 19 --跑马弹幕频道 ChatModel.CHANNEL_GUARDIAN_THREE = 20 --绝地守卫频道 ChatModel.CHANNEL_COUNTRY = 21 -- 本国跨服频道 ChatModel.ALL = 90 -- 显示“世界” “招募” “社团” “队伍” ChatModel.CHANNEL_NONE = 0 --无 --把频道放进列表,主界面顺序滑动切换(暂时弃用) ChatModel.CHANNEL_MAINUI_SHOW = { [1] = ChatModel.ALL, [2] = ChatModel.CHANNEL_WORLD, [3] = ChatModel.CHANNEL_GUILD, [4] = ChatModel.CHANNEL_INVITE, [5] = ChatModel.CHANNEL_TEAM, [6] = ChatModel.CHANNEL_SYSTEM -- [7] = ChatModel.CHANNEL_CROSS } -- info 里的 chuanwen_type (后端是这样定的) -- 1:传闻跑马灯飘(屏幕上方)、2:频道普通消息、 -- 3:传闻跑马灯中部(屏幕中部)、4:玩法活动横幅 ChatModel.CHUANWEN_TYPE = { UP_CHUANWEN = 1, NORMAL = 2, MIDDLE_CHUANWEN = 3, ACTIVITY_CHUANWEN = 4, } --11001--is_mySelf_send ChatModel.CHAT_COMMON_TYPE = { COMMON = 0, SYSTEM = 1, } ChatModel.INDIVIDUATION_FACE = 1 ChatModel.INDIVIDUATION_TEXT = 3 ChatModel.INDIVIDUATION_ITEM = 5 ChatModel.INDIVIDUATION_PARTNER = 2 ChatModel.INDIVIDUATION_POS = 4 ChatModel.INDIVIDUATION_HISTROY = 6 ChatModel.REQUEST_CCMD_EVENT = "ChatModel.REQUEST_CCMD_EVENT"--请求协议 ChatModel.REQUEST_CACHE_EVENT = "ChatModel.REQUEST_CACHE_EVENT"--请求缓存协议 ChatModel.ON_RESULT_OF_SPEECH = "ChatModel.ON_RESULT_OF_SPEECH"--语音SDK识别结果返回 ChatModel.ON_END_OF_SPEECH = "ChatModel.ON_END_OF_SPEECH"--语音SDK录制结果返回 ChatModel.BROADCAST_VOICE_TEXT = "ChatModel.BROADCAST_VOICE_TEXT"--广播语音文字 ChatModel.WORLD_CHAT_ITEM_ID = 240202--世界聊天消耗的道具 ChatModel.STOP_VOICE_PLAY = "ChatModel.STOP_VOICE_PLAY" ChatModel.CHANGE_LIMIT_WAY = "ChatModel.CHANGE_LIMIT_WAY" --改变频道屏蔽选项 ChatModel.ADD_MAINUI_WELCOME_HORN = "ChatModel.ADD_MAINUI_WELCOME_HORN" --主界面喇叭显示用语添加 ChatModel.Bubble = 1 --气泡 ChatModel.Photo = 2 --相框 ChatModel.MAX_LEN_LIST = { [ChatModel.CHANNEL_GENERAL] = 30, [ChatModel.CHANNEL_SYSTEM] = 30, [ChatModel.CHANNEL_WORLD] = 30, [ChatModel.CHANNEL_GUILD] = 30, [ChatModel.CHANNEL_TEAM] = 30, [ChatModel.CHANNEL_CECRET] = 20, [ChatModel.CHANNEL_HORN] = 30, [ChatModel.CHANNEL_NEAR] = 30, [ChatModel.CHANNEL_INVITE] = 30, [ChatModel.CHANNEL_CROSS] = 30, [ChatModel.CHANNEL_COUNTRY] = 30, [ChatModel.CHANNEL_REPLY] = 30, [ChatModel.CHANNEL_3V3_TEAM] = 30, [ChatModel.CHANNEL_1VN] = 30, [ChatModel.CHANNEL_GUILDTV] = 20, [ChatModel.CHANNEL_BEACH] = 20, [ChatModel.CHANNEL_GUARDIAN_THREE] = 20, } ChatModel.MSG_TYPE = { TEXT = 1, VOICE = 2, } ChatModel.LIMIY_WAY = { CHAT = 1, BABY = 2, RECRUIT = 3 --招募 } ChatModel.LIMIY_WAY_NAME = { [1] = "屏蔽聊天", [2] = "屏蔽晒娃", [3] = "屏蔽招募" } --玩家屏蔽频道列表 ChatModel.RedPointType = { -- 11016协议的红点类型 GUILD_APPLY_LIST = 1, } function ChatModel:__init() ChatModel.Instance = self self.tv_state = true self.tv_list = {} self.selected_chatView_tabbar_item = nil self.selected_histroy_item = nil self.selected_textface_item = nil self.selected_face_item = nil self.selected_partner_item = nil self.selected_good_item = nil self.clicked_item = nil --点击超链接item(包括mainui) self.clicked_role_item = nil --点击人物菜单 self.main_role_chat_list = ChatModel:GetAllMainRoleContent() or {} --缓存玩家聊天记录 --最大20条 self.send_timer_list = {} --用来缓存所有发送时间间隔Timer self.send_start_time_list = {} --用来缓存所有频道的发送时间间隔 self.request_cache = false -- 是否已经请求缓存信息 self.curr_channel = 0 --当前频道 -- 这个是玩家选择tab后更新的 self.chating_key_id = 0 -- 当前密聊玩家的值 self.pre_bar_index = 0 --上一个tabbar的索引 self.curr_bar_index = ChatModel.CHANNEL_WORLD -- 当前tabbar的索引 -- 这个curr_bar_index是外边主界面传进来的,这个为主 self.world_chat_method = 0 -- 世界聊天发言的方式,可能通过次数或者道具 0 次数 1 道具 self.chat_args_dic = {} --当前聊天内容所需发送的参数列表 [类型,列表[参数]] self.chick_hyperlink_mark = false self.curr_individuation_bar_index = 1 self.reg_channel = 0 self.voice_id = 0 self.voice_path = 0 self.cecret_chat_list = {} --密聊列表 self.all_chat_list = {} -- 用来记录每个频道的数据 self.all_chat_list_count = {} -- 用来记录每个频道收到的消息的数量,用来显示红点 self.check_timer_list = {} self.delay_timer_list = {} self.gonggao_vo = nil self.delay_horn_list = {} self.say_cache = nil self.need_feast_chat = false self.chat_bag_view_is_open = false self.last_Gg_list = {} --用来记录上一次的公告数据 self.require_11010_times = 4 self.limit_way_list = {} --频道屏蔽 self.chat_priate_info = {} self.welcomeList = {} -- 新主界面欢迎喇叭显示文本列表 self.welcomeListIndex = 1 --显示的index self.has_new_guild_red = 0 -- 未读社团消息数量 end function ChatModel:Clear() self.tv_state = true self.tv_list = {} self.selected_chatView_tabbar_item = nil self.selected_histroy_item = nil self.selected_textface_item = nil self.selected_face_item = nil self.selected_partner_item = nil self.selected_good_item = nil self.clicked_item = nil self.clicked_role_item = nil self.main_role_chat_list = ChatModel:GetAllMainRoleContent() or {} self.send_timer_list = {} self.send_start_time_list = {} self.request_cache = false self.curr_channel = 0 self.chating_key_id = 0 self.pre_bar_index = 0 self.curr_bar_index = ChatModel.CHANNEL_WORLD--CHANNEL_SYSTEM self.world_chat_method = 0 self.chat_args_dic = {} self.chick_hyperlink_mark = false self.curr_individuation_bar_index = 1 self.reg_channel = 0 self.voice_id = 0 self.voice_path = 0 self.reg_txt = nil self.loading_voice = nil self.cecret_chat_list = {} self.all_chat_list = {} self.all_chat_list_count = {} self.limit_way_list = {} self:ClearGongGaoTimer() self.get_chat = false self.chatMessage = nil self.chat_priate_info = {} end --计算每种频道收到的信息数量 function ChatModel:CaclulationMsgCount(info) if info then --不记录自己发的信息 local main_role_id = RoleManager.Instance:GetMainRoleId() if info.player_id == main_role_id then return end if info.channel == ChatModel.CHANNEL_CECRET then local cur_list = self.all_chat_list_count[info.channel] if cur_list == nil then cur_list = {} end self.all_chat_list_count[info.channel] = cur_list local len = TableSize(info.player_list) if len == 2 then local key_id = info.player_list[1].player_id == main_role_id and info.player_list[2].player_id or info.player_list[1].player_id local condition_1 = key_id ~= self.chating_key_id if condition_1 then if cur_list[key_id] == nil then cur_list[key_id] = 0 end cur_list[key_id] = cur_list[key_id] + 1 self:Fire(ChatModel.SHOW_TAB_RED_POINT, self.all_chat_list_count) end end elseif info.channel ~= ChatModel.CHANNEL_SYSTEM then local channel = info.channel --== ChatModel.CHANNEL_HORN and ChatModel.CHANNEL_WORLD or info.channel if self.curr_channel ~= channel then if channel == ChatModel.CHANNEL_HORN then if self.curr_channel ~= ChatModel.CHANNEL_WORLD then if self.all_chat_list_count[ChatModel.CHANNEL_WORLD] == nil then self.all_chat_list_count[ChatModel.CHANNEL_WORLD] = 0 end self.all_chat_list_count[ChatModel.CHANNEL_WORLD] = self.all_chat_list_count[ChatModel.CHANNEL_WORLD] + 1 end end if self.all_chat_list_count[channel] == nil then self.all_chat_list_count[channel] = 0 end self.all_chat_list_count[channel] = self.all_chat_list_count[channel] + 1 self:Fire(ChatModel.SHOW_TAB_RED_POINT, self.all_chat_list_count) end end end end --获取需要私聊的id function ChatModel:GetNeedChatKey() local cur_list = self.all_chat_list_count[ChatModel.CHANNEL_CECRET] if cur_list ~= nil then for k, v in pairs(cur_list) do if v > 0 then return k end end end end function ChatModel:AddMsg(info) -- 以下频道发言有次数限制 需要协议获取 if info.channel == ChatModel.CHANNEL_CROSS then self:Fire(ChatModel.REQUEST_CCMD_EVENT, 11011, ChatModel.CHANNEL_CROSS) -- elseif info.channel == ChatModel.CHANNEL_COUNTRY then -- self:Fire(ChatModel.REQUEST_CCMD_EVENT, 11011, ChatModel.CHANNEL_COUNTRY) end -- 历史聊天记录 if info.player_id == RoleManager:getInstance():GetMainRoleVo().role_id then if info.channel ~= ChatModel.CHANNEL_INVITE then --非组队邀请信息 local s, e = string.find(info.msg, "") local args = false local save_str = "" if s == 1 then args = Split(info.msg, "@") end if args then save_str = string.format("<%s>", GoodsModel:getInstance():getGoodsName(tonumber(args[3]))) else save_str = info.msg end local count local c_list = {}--保存color标签的所有数据 if save_str then p1, p2, color_str, content_str = string.find(save_str, "%^/.]-)%>([^%>^/.]-)%<%/color") count = 1 while p1 do c_list[count] = {} c_list[count].color = color_str c_list[count].text = content_str c_list[count].start_pos = p1 p1, p2, color_str, content_str = string.find(save_str, "%^/.]-)%>([^%>^/.]-)%<%/color", p1 + 1) count = count + 1 end end if #c_list > 0 then save_str = "" for i,v in ipairs(c_list) do save_str = save_str..v.text end end local cookie = CookieWrapper.Instance:GetCookie(CookieLevelType.Account, ChatModel.SAVE_CHAT_HISTORY_INFO) cookie = cookie or {} local has_same_str = false for i, v in ipairs(cookie) do if v == save_str then has_same_str = true break end end if not has_same_str then table.insert(cookie, 1, save_str) for i = Config.ConfigChat.custom_history_num + 1, #cookie do table.remove(cookie, Config.ConfigChat.custom_history_num + 1) end CookieWrapper.Instance:SaveCookie(CookieLevelType.Account, CookieTimeType.TYPE_ALWAYS, ChatModel.SAVE_CHAT_HISTORY_INFO, cookie) end end end if info and info.channel ~= ChatModel.CHANNEL_NONE then if self:MsgNeedFilter(info) then return false end if self:IsPlayerInBlack(info) then return false end if info.channel == ChatModel.CHANNEL_CECRET then self:DealWithCerectSystemMsg(info) elseif info.channel == ChatModel.CHANNEL_HORN then self:DealWithHornSystemMsg(info) elseif info.channel == ChatModel.CHANNEL_REPLY then elseif info.channel == ChatModel.CHANNEL_1VN then else self:DealWithOtherSystemMsg(info) end --记录当前世界聊天剩余的次数 if info.channel == ChatModel.CHANNEL_WORLD then info.world_chat_method = self.world_chat_method end --判断是否是答题频道 --[[ if info.channel == ChatModel.CHANNEL_1VN then info.channel = ChatModel.CHANNEL_CROSS --消息发到队伍频道里去 CSOnevNModel:getInstance():SetOnevNChatInfo(info) --设置1vn CSOnevNModel:getInstance():Fire(BattleFieldDefine.CSOnevN.Event.UPDATE_CHAT_MSG, info) elseif info.channel == ChatModel.CHANNEL_INVITE then CSPvPModel.GetInstance():SetMessageEnlist(info) EventSystem.Fire(GlobalEventSystem,CSPvPEvent.REFRESH_TALK_DATA,ChatModel.CHANNEL_INVITE,info.msg,info)--3v3 elseif info.channel == ChatModel.CHANNEL_3V3_TEAM then info.channel = ChatModel.CHANNEL_TEAM --消息发到队伍频道里去 EventSystem.Fire(GlobalEventSystem,CSPvPEvent.REFRESH_TALK_DATA,ChatModel.CHANNEL_3V3_TEAM,info.msg,info)--3v3 elseif info.channel == ChatModel.CHANNEL_GUILD or info.channel == ChatModel.CHANNEL_WORLD then if info.is_pvp_enlist then CSPvPModel.GetInstance():SetMessageEnlist(info) EventSystem.Fire(GlobalEventSystem,CSPvPEvent.REFRESH_TALK_DATA,ChatModel.CHANNEL_INVITE,info.msg,info) end end ]] -- 社团消息需要记录未读的消息数目 if info.channel == ChatModel.CHANNEL_GUILD and info.player_id then local is_old_msg = not (self.login_time_cache and info.time - self.login_time_cache >= 0) -- 刚登陆拿的历史消息不管 local role_id = RoleManager.Instance:GetMainRoleId() local is_self = info.player_id == role_id -- 自己的消息不算 if not is_old_msg and not is_self then self:SetGuildChannelRedDot(true) end end self:CaclulationMsgCount(info) self:Fire(ChatModel.ADD_NEW_MSG, info) end return true end --获得正在聊天的玩家名字 function ChatModel:GetChatingRoleName(key_id) local len = #self.cecret_chat_list local vo = nil for i = 1, len do vo = self.cecret_chat_list[i] if vo.key_id == key_id then return vo.name end end return "玩家名字" end --打包指定频道的时间信息 目的是为了添加一项横线时间显示 function ChatModel:PackChatInfo(channel, time, key_id) local info = {} info.channel = channel info.time = time info.key_id = key_id info.is_line = true return info end --通过聊天界面的tabbar索引来获取当前频道值 function ChatModel:GetChannelWithId(id) for k, v in pairs(Config.ConfigChat.channel_level) do if v.channel == id then return v end end end --根据频道获取Icon function ChatModel:GetChannelIconWithChannel(channel) local vo = nil for k,v in pairs(Config.ConfigChat.channel_level) do if v.channel == channel then return v.channel_icon end end return "chat_channel_1" end --根据频道获取name 包括颜色 function ChatModel:GetChannelNameWithChannel(channel) local vo = nil for i = 1, #Config.ConfigChat.channel_level do vo = Config.ConfigChat.channel_level[i] if vo.channel == channel then if not vo.color2 then return end local name = "".."["..vo.name.."]".."" -- if vo.channel == ChatModel.CHANNEL_SYSTEM then --这会综合频道变成系统 -- name = "".."[系统]".."" -- end return (name) end end if channel == ChatModel.ALL then return string.format("[所有]", ColorUtil.ORANGE) end return "[未知]" end --根据频道获取Icon function ChatModel:GetChannelColorWithChannel(channel) local vo = nil for i = 1, #Config.ConfigChat.channel_level do vo = Config.ConfigChat.channel_level[i] if vo.channel == channel then return vo.color end end return "#848484" end function ChatModel:GetTipWithShowType(showtype) local vo = nil for i = 1, #Config.ConfigChat.tips do vo = Config.ConfigChat.tips[i] if vo.type == showtype then return vo.icon, vo.color end end return "chat_channel_1", "#333c4e" --"#848484" end function ChatModel:getInstance() if ChatModel.Instance == nil then ChatModel.New() end return ChatModel.Instance end function ChatModel:SeletedChatViewTabbar(item, not_fire_event) if self.selected_chatView_tabbar_item == item then return end if self.selected_chatView_tabbar_item then self.selected_chatView_tabbar_item:SetSelect(false) end self.selected_chatView_tabbar_item = item if self.selected_chatView_tabbar_item then self.selected_chatView_tabbar_item:SetSelect(true) if not not_fire_event then self:Fire(ChatModel.SELECT_CHAT_VIEW_TARBAR, self.selected_chatView_tabbar_item) end end end function ChatModel:SeletedTextFaceItem(item) if self.selected_textface_item then self.selected_textface_item:SetSelect(false) end self.selected_textface_item = item if self.selected_textface_item then self.selected_textface_item:SetSelect(true) self:Fire(ChatModel.SELECT_TEXT_FACE_ITEM, self.selected_textface_item) end end function ChatModel:SeletedHistroyItem(item) if self.selected_histroy_item then self.selected_histroy_item:SetSelect(false) end self.selected_histroy_item = item if self.selected_histroy_item then self.selected_histroy_item:SetSelect(true) self:Fire(ChatModel.SELECT_HISTROY_ITEM, self.selected_histroy_item) end end function ChatModel:SeletedFaceItem(item) if self.selected_face_item then self.selected_face_item:SetSelect(false) end self.selected_face_item = item if self.selected_face_item then self.selected_face_item:SetSelect(true) self:Fire(ChatModel.SELECT_FACE_ITEM, self.selected_face_item) end end function ChatModel:SeletedHistoryTextItem(item) if self.selected_history_text_item then self.selected_history_text_item:SetSelect(false) end self.selected_history_text_item = item if self.selected_history_text_item then self.selected_history_text_item:SetSelect(true) self:Fire(ChatModel.SELECT_HISTORY_TEXT_ITEM, self.selected_history_text_item.str) end end function ChatModel:SelectedPartnerItem(item) if self.selected_partner_item == item then return end if self.selected_partner_item then self.selected_partner_item:SetSelect(false) end self.selected_partner_item = item if self.selected_partner_item then self.selected_partner_item:SetSelect(true) self:Fire(ChatModel.SELECT_PARTNER_ITEM, self.selected_partner_item.vo) end end function ChatModel:SelectedGoodItem(item) if self.selected_good_item == item then return end if self.selected_good_item then self.selected_good_item:SetSelect(false) end self.selected_good_item = item if self.selected_good_item then self.selected_good_item:SetSelect(true) self:Fire(ChatModel.SELECT_GOOD_ITEM, self.selected_good_item.vo) end end function ChatModel:GetTVList() return self.tv_list end --处理不需要特殊处理的信息 function ChatModel:DealWithOtherSystemMsg(info) local curr_list = self.all_chat_list[info.channel] if curr_list == nil then curr_list = {} self.all_chat_list[info.channel] = curr_list end table.insert(curr_list, info) if #curr_list > ChatModel.MAX_LEN_LIST[info.channel] then table.remove(curr_list, 1) end end --根据频道删除玩家聊天信息 function ChatModel:DelMsgInChannelById(channel, id) local index_tb = {} local channel_list = self.all_chat_list[channel] if channel_list then if channel == ChatModel.CHANNEL_CECRET then self:ClearChannelMessageNum(ChatModel.CHANNEL_CECRET, id) CookieWrapper.Instance:DeleteChatHistroyFile(id) else for k, v in pairs(channel_list) do if v.player_id == id then table.insert(index_tb, k) end end local del = 0 local num = 0 for k, v in ipairs(index_tb) do del = v - num table.remove(channel_list, del) num = num + 1 if self.all_chat_list_count[channel] and self.all_chat_list_count[channel] > 0 then self.all_chat_list_count[channel] = self.all_chat_list_count[channel] - 1 end end end end end function ChatModel:DelMsgInNoticeChannelById( notice_id ) local index_tb = {} if self.all_chat_list[ChatModel.CHANNEL_SYSTEM] then for k, v in pairs(self.all_chat_list[ChatModel.CHANNEL_SYSTEM]) do if v.notice_id == notice_id then table.insert(index_tb, k) end end local del = 0 local num = 0 for k, v in ipairs(index_tb) do del = v - num table.remove(self.all_chat_list[ChatModel.CHANNEL_SYSTEM], del) num = num + 1 if self.all_chat_list_count[ChatModel.CHANNEL_SYSTEM] and self.all_chat_list_count[ChatModel.CHANNEL_SYSTEM] > 0 then self.all_chat_list_count[ChatModel.CHANNEL_SYSTEM] = self.all_chat_list_count[ChatModel.CHANNEL_SYSTEM] - 1 end end end self:Fire(ChatModel.SHOW_TAB_RED_POINT, self.all_chat_list_count) end --处理喇叭信息 gg_flag --只发滚屏而且频道不是 CHANNEL_WORLD CHANNEL_HORN 就要设为ture function ChatModel:DealWithHornSystemMsg(info, front,gg_flag) --插入喇叭延迟列表 info.gm = 0 table.insert(self.delay_horn_list, info) --触发喇叭滚动 SysInfoCtrl.Instance:AppendMsg(SysInfoCtrl.SysInfoType.HORN) if gg_flag then return end local curr_list = self.all_chat_list[ChatModel.CHANNEL_WORLD] local horn_list = self.all_chat_list[ChatModel.CHANNEL_HORN] if curr_list == nil then curr_list = {} self.all_chat_list[ChatModel.CHANNEL_WORLD] = curr_list end if horn_list == nil then horn_list = {} self.all_chat_list[ChatModel.CHANNEL_HORN] = horn_list end if front then --插入到最前面 table.insert(curr_list, 1, info) else table.insert(curr_list, info) end -- print("ChatModel:DealWithHornSystemMsg", curr_list[#curr_list].msg) table.insert(horn_list, info) if #curr_list > ChatModel.MAX_LEN_LIST[ChatModel.CHANNEL_WORLD] then table.remove(curr_list, 1) end if #horn_list > ChatModel.MAX_LEN_LIST[ChatModel.CHANNEL_HORN] then table.remove(horn_list, 1) end end --移除喇叭延迟列表 function ChatModel:RemoveDelayHorn() local info = table.remove(self.delay_horn_list, 1) self:Fire(ChatModel.UPDATE_HORNTV_NUM) return info end --获取喇叭延迟列表数量 function ChatModel:GetDelayHornNum() return #self.delay_horn_list end --添加gm喇叭 function ChatModel:AddGmHorn(scmd) local vo = {name = "系统", channel = scmd.channel, time = TimeUtil:getServerTime(), msg = scmd.msg, showtype = ChatModel.CHANNEL_HORN, lastTime = scmd.time, gm = scmd.gm} --插入喇叭延迟列表 table.insert(self.delay_horn_list, vo) --排序 local arg = {"gm", "time"} local condition = {Array.UPPER, Array.LOWER} SortTools.MoreKeysSorter(self.delay_horn_list, arg, condition) self:Fire(ChatModel.ADD_NEW_MSG, vo) --触发喇叭滚动 SysInfoCtrl.Instance:AppendMsg(SysInfoCtrl.SysInfoType.HORN) end --处理私聊信息 function ChatModel:DealWithCerectSystemMsg(info) --取私聊对象id作为key local curr_list = self.all_chat_list[info.channel] if curr_list == nil then --原先的祖传代码获取离线消息时根本就不读cookie直接创了个空表覆盖了,这里一定要拿一下缓存才行 curr_list = CookieWrapper.Instance:GetChatHistroy(info.player_list[1].player_id,true)--根据id获取聊天缓存 self.all_chat_list[info.channel] = curr_list end local len = TableSize(info.player_list) if string.find(info.msg," ChatModel.MAX_LEN_LIST[ChatModel.CHANNEL_CECRET] then table.remove(curr_player_list, 1) end local len = #self.cecret_chat_list local hasCache = false --是否是已有的密聊玩家 local vo = nil for i = 1, len do vo = self.cecret_chat_list[i] if vo.key_id == tonumber(key_id) then --有可能上线缓存的信息 发过来 if vo.time < info.time then vo.time = info.time end hasCache = true break end end if not hasCache then if #self.cecret_chat_list > 5 then table.remove(self.cecret_chat_list, 5) end table.insert(self.cecret_chat_list, DeepCopy(info)) local function sort_func(v1, v2) return v1.time > v2.time end table.sort(self.cecret_chat_list, sort_func) self:GetSimpleCecretInfoSave() end end end --处理缓存信息, 私聊的缓存不需要处理 function ChatModel:DealWithCacheMsg(info) if info.channel == ChatModel.CHANNEL_CECRET then return end local curr_list = self.all_chat_list[info.channel] if curr_list == nil then curr_list = {} self.all_chat_list[info.channel] = curr_list end local len = TableSize(info.player_list) if len > 0 then --为了跟之前的结构匹配,对于缓存的信息,添加了以下几个信息 info.name = info.player_list[1].name info.player_id = info.player_list[1].player_id info.level = info.player_list[1].level info.career = info.player_list[1].career info.dress_list = info.player_list[1].dress_list info.guild_id = info.player_list[1].guild_id info.sex = info.player_list[1].sex info.turn = info.player_list[1].turn info.vip_flag = info.player_list[1].vip_flag info.sup_vip_type = info.player_list[1].sup_vip_type info.picture = info.player_list[1].picture info.picture_ver = info.player_list[1].picture_ver info.ser_id = info.player_list[1].ser_id info.ser_num = info.player_list[1].ser_num info.ser_name = info.player_list[1].ser_name info.profile_photo_id = info.player_list[1].profile_photo_id info.GM = info.player_list[1].GM if info.auto_id ~= 0 then --语音的 info.voice_id = info.auto_id info.data_ver = info.client_ver info.iType = ChatModel.MSG_TYPE.VOICE info.length = info.voice_msg_time end -- print("=============>>> YiRan:ChatModel [start:830]info ------------------------------------------") -- PrintTable(info) -- print("=============>>> YiRan:ChatModel [end] ------------------------------------------") end end function ChatModel:GetSimpleHistroyInfoSave(chatlist) local list = {} for i, info in ipairs(chatlist) do --控制一下聊天记录数量,超过限制数量就不要加入转化了 if #chatlist - i <= ChatModel.MAX_LEN_LIST[ChatModel.CHANNEL_CECRET] then --构造最基本信息 info.msg = string.gsub(info.msg, '(["])', "") local vo = { channel = info.channel, msg = info.msg, time = info.time, player_id = info.player_id, key_id = info.key_id, level = info.level, name = info.name, career = info.career, dress_list = info.dress_list, guild_id = info.guild_id, iType = info.iType, length = info.length, voice_id = info.voice_id, data_ver = info.data_ver, sex = info.sex, turn = info.turn, vip_flag = info.vip_flag, sup_vip_type = info.sup_vip_type, ser_id = info.ser_id, ser_num = info.ser_num, ser_name = info.ser_name, GM = info.GM, profile_photo_id = info.profile_photo_id } table.insert(list, vo) end end return list end function ChatModel:GetSimpleCecretInfoSave() local list = {} for i, info in ipairs(self.cecret_chat_list) do --构造最基本信息 local v = {} if info.key_id == info.player_list[1].player_id then v = info.player_list[1] else v = info.player_list[2] end local vo = { time = info.time, key_id = info.key_id, player_list = { [1] = { player_id = v.player_id, name = v.name, level = v.level, career = v.career, vip_flag = v.vip_flag, sup_vip_type = v.sup_vip_type, touxian = v.touxian, guild_id = v.guild_id, ser_id = v.ser_id, ser_num = v.ser_num, ser_name = v.ser_name, }, }, } table.insert(list, vo) end --密聊列表最大5个,只在有新的人才会保存信息。但这里可以再做优化 CookieWrapper.Instance:SaveCookie(CookieLevelType.Account, CookieTimeType.TYPE_ALWAYS, CookieKey.CECRET_HISTROY, list) end --获取喇叭需要的配置信息 function ChatModel:GetHornVo() local vo = nil for i = 1, #Config.ConfigChat.channel_level do vo = Config.ConfigChat.channel_level[i] if vo.channel == ChatModel.CHANNEL_HORN then return vo end end return nil end --获取当前所在频道所需等级 function ChatModel:GetCurChannelNeedLevel() return Config.ConfigChat.channel_level[self.curr_bar_index].level end --获取私聊需要的等级 function ChatModel:GetCecretNeedLevel() local vo = nil for i = 1, #Config.ConfigChat.channel_level do vo = Config.ConfigChat.channel_level[i] if vo.channel == ChatModel.CHANNEL_CECRET then return vo.level end end return 1 end --根据频道获取频道所在的index function ChatModel:GetTabIndexWithChannel(channel) local vo = nil for i = 1, #Config.ConfigChat.channel_level do vo = Config.ConfigChat.channel_level[i] if vo.channel == channel then return i end end return 1 end --检查当前时间是否能发送 function ChatModel:CheckCurrentTimeCanSend(channel, send_interval) if self.send_start_time_list[channel] == nil or Status.NowTime - self.send_start_time_list[channel] >= send_interval then return true end return false end function ChatModel:GetPassTimeFromSend(channel, send_interval) if self.send_start_time_list[channel] == nil then return - 1 else return send_interval - (Status.NowTime - self.send_start_time_list[channel]) end end --改变频道的发送时间 function ChatModel:ChangeChannelSendStartTime(vo, time) local main_role_id = RoleManager.Instance:GetMainRoleId() if vo.player_id == main_role_id then self.send_start_time_list[vo.channel] = time end end --是否需要显示私聊Item的红点 function ChatModel:NeedShowCecretItemRedPoint(key_id) local cur_list = self.all_chat_list_count[ChatModel.CHANNEL_CECRET] if cur_list == nil then return false end if cur_list[key_id] ~= nil and cur_list[key_id] > 0 then return true, cur_list[key_id] end return false end --清除消息记录的条数 function ChatModel:ClearChannelMessageNum(channel, key_id) if channel == ChatModel.CHANNEL_CECRET then local cur_list = self.all_chat_list_count[channel] if cur_list ~= nil and cur_list[key_id] ~= nil then cur_list[key_id] = nil end else self.all_chat_list_count[channel] = nil end end --是否黑名单玩家 function ChatModel:IsPlayerInBlack(info) return SocialityModel:getInstance():GetVoById(Config.ConfigSocial.RelativeType.black, info.player_id) end --判断频道信息是否需要屏蔽 function ChatModel:MsgNeedFilter(info) local channel = info.channel local setting_type = SettingModel.TYPE.TEXT--info.iType 语音随文字的 就这样写 --如果是自己则不屏蔽 local main_role_id = RoleManager.Instance:GetMainRoleId() if channel == ChatModel.CHANNEL_CECRET then local len = TableSize(info.player_list) if len == 2 then if main_role_id == info.player_list[1].player_id then return false end end else if main_role_id == info.player_id then return false end end local subtype = SettingModel.C2T[channel] if subtype then return SettingModel:getInstance():GetSettingInfo(setting_type, subtype) == 0 else return false end end function ChatModel:AddArgs(key, t) --只能保存一个 -- if not IsTableEmpty(self.chat_args_dic) then -- self.chat_args_dic = {} -- end self.chat_args_dic[key] = t end function ChatModel:IsHasArgs(str) for w in string.gmatch(str, "<.->") do if self.chat_args_dic[w] ~= nil then return w end end return false end function ChatModel:GetAllArgsText(str) --目前能保存多个key,每次替换Input<>内容,遍历dic与<>内容作比较,有则发送参数,可用于发送多个道具信息 --只发送一个则可以只保存单个参数,不需要用到dic结构(对比优化) local text = "" for w in string.gmatch(str, "<.->") do if self.chat_args_dic[w] ~= nil then text = text .. self.chat_args_dic[w][1] .. "," end end text = string.sub(text, 1, -2) return "[" .. text .. "]" end function ChatModel:GetHyperlinkText(str) local text = "" for w in string.gmatch(str, "<.->") do if self.chat_args_dic[w] ~= nil then text = LanguageFilter.ConvPartten(w) str = string.gsub(str, text, self.chat_args_dic[w][2]) end end return str end function ChatModel:AddMainRoleChatContent(content, player_id) if player_id ~= RoleManager.Instance:GetMainRoleId() then return end if #self.main_role_chat_list >= 20 then table.remove(self.main_role_chat_list, 1) end content = PackageSpecialTab(content) content = self:DeleteSpecialSign(content) table.insert(self.main_role_chat_list, content) CookieWrapper.Instance:SaveCookie(CookieLevelType.Account, CookieTimeType.TYPE_ALWAYS, CookieKey.CHAT_HISTROY, self.main_role_chat_list) end function ChatModel:GetAllMainRoleContent() return CookieWrapper.Instance:GetCookie(CookieLevelType.Account, CookieKey.CHAT_HISTROY) end function ChatModel:DeleteSpecialSign(content) content = string.gsub(content, "", "") content = string.gsub(content, "", "") content = string.gsub(content, "", "") content = string.gsub(content, "", "") content = string.gsub(content, "", "") content = string.gsub(content, "", "") content = string.gsub(content, '(["])', "") return content end function ChatModel:ShowGoodTips(vo) if not self.clicked_item or not self.clicked_item.transform then --协议返回后,界面已销毁 self.chick_hyperlink_mark = false return end local t = ConfigItemMgr.Instance:GetGoodItem(vo.type_id) -- if t.type then local pos = self.clicked_item.transform.localPosition GoodsModel:getInstance():SetBaseInfo(vo) if t.type == GoodsModel.TYPE.EQUIP then -- UIToolTipMgr:getInstance():AppendEquipTips(vo.type_id, pos.x, pos.y, vo,nil,true) local equip_cfg = EquipModel:getInstance():GetEquipmentCfg(vo.type_id) if equip_cfg then local equip_pos = equip_cfg.equip_type local series = equip_cfg.series vo.equip_suit_type = equip_pos local stren_data = EquipModel:getInstance():GetBagEquipAwaraItemInfo(vo) stren_data.key_value = "other_show" UIToolTipMgr:getInstance():AppendEquipTips(vo.type_id, pos.x, pos.y,stren_data and stren_data.goods_vo,nil,nil,nil,stren_data and stren_data.key_value) else -- Message.show("没有装备配置哦") end elseif t.type == 39 then UIToolTipMgr:getInstance():AppendBeastShowTips(vo, pos.x, pos.y) else UIToolTipMgr:getInstance():AppendGoodsTips(vo.type_id, pos.x, pos.y, vo) end end self.chick_hyperlink_mark = false self.clicked_item = nil end function ChatModel:FireSpecialTab(param_list,x,y) if param_list[1] == "goods3" then --请求刷新装备数据 local type_id = tonumber(param_list[2]) local basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(type_id) if basic and (basic.type == GoodsModel.TYPE.EQUIP or basic.type == 39) then local rating = tonumber(param_list[3]) local intro = StrToTable(param_list[4]) or {} local vo = SCMD15001.New() vo.equip_extra_attr = intro vo.rating = rating vo.type_id = type_id vo.color = basic.color vo.overall_rating = rating GoodsModel:getInstance():AddDynamic(vo) if basic.type == GoodsModel.TYPE.EQUIP then ChatModel:getInstance():ShowGoodTips(vo) elseif basic.type == 39 then UIToolTipMgr:getInstance():AppendBeastShowTips(vo) end else UIToolTipMgr:getInstance():AppendGoodsTips(tonumber(param_list[2]),x,y) end self.chick_hyperlink_mark = false self.clicked_item = nil elseif param_list[1] == "goods6" then --goods3是后台填传闻用到,收到协议后进行特殊解析 --goods6是客户端用的,无需解析,直接把极品属性字符串转成table local type_id = tonumber(param_list[2]) local basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(type_id) if basic and (basic.type == GoodsModel.TYPE.EQUIP or basic.type == 39) then local rating = tonumber(param_list[3]) local intro = StrToTable(param_list[4]) local vo = SCMD15001.New() vo.equip_extra_attr = intro vo.rating = rating vo.type_id = type_id vo.color = basic.color vo.overall_rating = rating GoodsModel:getInstance():AddDynamic(vo) if basic.type == GoodsModel.TYPE.EQUIP then ChatModel:getInstance():ShowGoodTips(vo) elseif basic.type == 39 then UIToolTipMgr:getInstance():AppendBeastShowTips(vo) end else UIToolTipMgr:getInstance():AppendGoodsTips(tonumber(param_list[2])) end self.chick_hyperlink_mark = false self.clicked_item = nil elseif param_list[1] == "goods8" then local type_id = tonumber(param_list[2]) local basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(type_id) if basic and (basic.type == GoodsModel.TYPE.EQUIP or basic.type == 39) then local rating = tonumber(param_list[3]) local intro = StrToTable(param_list[4]) local vo = SCMD15001.New() vo.equip_extra_attr = intro vo.rating = rating vo.type_id = type_id vo.color = basic.color vo.overall_rating = rating GoodsModel:getInstance():AddDynamic(vo) if basic.type == GoodsModel.TYPE.EQUIP then ChatModel:getInstance():ShowGoodTips(vo) elseif basic.type == 39 then UIToolTipMgr:getInstance():AppendBeastShowTips(vo) end else UIToolTipMgr:getInstance():AppendGoodsTips(tonumber(param_list[2])) end self.chick_hyperlink_mark = false self.clicked_item = nil elseif param_list[1] == "goods4" then --请求刷新物品数据 local basic = GoodsModel:getInstance():GetGoodsBasicByTypeId(tonumber(param_list[2])) if basic and basic.type == GoodsModel.TYPE.EQUIP then GoodsModel:getInstance():Fire(GoodsModel.REQUEST_GOODS_DYNAMIC, tonumber(param_list[3]), tonumber(param_list[4])) else UIToolTipMgr:getInstance():AppendGoodsTips(tonumber(param_list[2])) self.chick_hyperlink_mark = false self.clicked_item = nil end elseif param_list[1] == "team" then --进入组队 local teamInfo = TeamModel:getInstance():GetTeamInfoByID( tonumber(param_list[2]) ) if teamInfo and teamInfo.need_password and teamInfo.need_password ~= "" then GlobalEventSystem:Fire(EventName.OPEN_TEAM_PASSWORD_VIEW, teamInfo.team_id) return end GlobalEventSystem:Fire(TeamModel.APPLY_JOIN_TEAM, param_list[2]) elseif param_list[1] == "race_act" then local subtype = LimitTimeRankModel:getInstance():GetSubTypeByType(tonumber(param_list[2])) if subtype then LimitTimeRankModel:getInstance():Fire(LimitTimeRankDefine.OPEN_LIMIT_TIME_RANK_VIEW, tonumber(param_list[2]), subtype) end end end function ChatModel:AddInfoToChatView(content, channel, tip) -- tip 为小喇叭弹出,记得其他模块没特殊要求别填1 --和传闻事件基本相似,除了系统频道外,都会隐藏红色背景 if not content or not channel then return end local vo = {channel = channel, time = TimeUtil:getServerTime(), msg = content, showtype = ChatModel.CHANNEL_SYSTEM, tip = tip} self:AddMsg(vo) end function ChatModel:GetErrorCode(code, strParam) local tmp = Config.Errorcode[code] local str = "未知返回码" .. code if tmp then str = Config.Errorcode[code].about if strParam then local args = Split(strParam, ",") for i, v in ipairs(args) do str = string.gsub(str, "{"..i.."}", v) end end end return str end function ChatModel:StartGongGaoList(vo) if not vo then return end for i,data in pairs(self.last_Gg_list) do --遍历旧表 如果新的公告记录表里面有旧表的数据就不做操作 没有的话就删除记录 local boo = false --判断标志 是否有记录 for i,v in ipairs(vo.notice_list) do if data.id == v.id then --如果有记录 标志为true boo = true end end if not boo then --没有记录就做删除 ChatModel:getInstance():Fire(ChatModel.DEL_NOTICE_CHAT_ITEM,data.id) ChatModel:getInstance():DelMsgInNoticeChannelById(data.id) end end for i,v in ipairs(vo.notice_list) do --每次都缓存新的公告记录 self.last_Gg_list[v.id] = v end self:ClearGongGaoTimer() if #vo.notice_list < 1 then return end --self:ClearGongGaoTimer() self.gonggao_vo = vo local count = 0 for k, v in pairs(vo.notice_list) do local tb = Split(v.source, ",") for m, n in pairs(tb) do if n == ClientConfig.plat_name or n == "" then local ser_time = TimeUtil:getServerTime() local time = v.start_time - ser_time if time <= 0 then --超过时间, 就按照顺序隔180秒播放 count = count + 1 v.start_time = TimeUtil:getServerTime() + count * 180 end self:GongGaoTimer(v) end end end end function ChatModel:GongGaoTimer(vo) if not vo then return end if TimeUtil:getServerTime() > vo.end_time then return end if vo.state == 0 then ChatModel:getInstance():Fire(ChatModel.DEL_NOTICE_CHAT_ITEM,vo.id) ChatModel:getInstance():DelMsgInNoticeChannelById(vo.id) return end local ser_time = TimeUtil:getServerTime() local time = vo.start_time - ser_time vo.content = ""..vo.content.."" local count = 0 local check_time_id, delay_time_id = nil, nil --数据开始时间>现在时间,马上发送 local function onCheck() local cfg, scmd = {subtype = ChatModel.CHANNEL_SYSTEM} ,{url = vo.url,notice_id = vo.id} if vo.type == 0 then self:DealWithHornSystemMsg({name = "公告", msg = vo.content}, true,true) elseif vo.type == 1 then GlobalEventSystem:Fire(EventName.SHOW_CHUANWEN, vo.content, cfg, scmd) elseif vo.type == 2 then self:DealWithHornSystemMsg({name = "公告", msg = vo.content}, true,true) GlobalEventSystem:Fire(EventName.SHOW_CHUANWEN, vo.content, cfg, scmd) end count = count + 1 if (vo.send_count ~= 0 and vo.send_count <= count) or TimeUtil:getServerTime() > vo.end_time then GlobalTimerQuest:CancelQuest(check_time_id) check_time_id = nil end end local function onDelay() check_time_id = GlobalTimerQuest:AddPeriodQuest(onCheck, vo.send_gap, -1) table.insert(self.check_timer_list, check_time_id) GlobalTimerQuest:CancelQuest(delay_time_id) delay_time_id = nil end if vo.send_gap > 3 then --不能小于3 间隔太小,定时器有问题 if time > 0 then delay_time_id = GlobalTimerQuest:AddDelayQuest(onDelay, time) --时间大于0 就延迟发送 table.insert(self.delay_timer_list, delay_time_id) else check_time_id = GlobalTimerQuest:AddPeriodQuest(onCheck, vo.send_gap, -1) --不大于0 立马发送 table.insert(self.check_timer_list, check_time_id) end end onCheck()--修改后立马要发送一条 然后其他按间隔来 end function ChatModel:ClearGongGaoTimer() for i, v in ipairs(self.delay_timer_list) do GlobalTimerQuest:CancelQuest(v) end for i, v in ipairs(self.check_timer_list) do GlobalTimerQuest:CancelQuest(v) end self.delay_timer_list = {} self.check_timer_list = {} end function ChatModel:UpdateRegText(scmd) local check_list = self.all_chat_list[scmd.channel] if check_list then for k, v in pairs(check_list) do if v.voice_id == scmd.auto_id then v.msg = scmd.voice_text break end end end end --argStr 格式是 "@A@B@C" function ChatModel:GetSpecFindStr() local key, argStr = "", "" if SceneManager:getInstance():IsValhallaFightScene() then key = "valhallapk" argStr = "@"..ValhallaModel:GetInstance().pk_id end return key, argStr end function ChatModel:GetDressIdByType(dress_list, dress_type) if dress_list then for i, v in ipairs(dress_list) do --1气泡 2相框 if v.dress_type == dress_type then return v.dress_id end end end end function ChatModel:SetCrossChatTime(count) -- print("ChatModel:SetCrossChatTime", count) self.crossChatTime = count self:Fire(ChatModel.CROSS_HORN_HAS_CHANGE, count) end function ChatModel:GoodChange() self:Fire(ChatModel.HORN_HAS_CHANGE) end function ChatModel:SetChannelGennealList(channelID) if channelID ~= ChatModel.CHANNEL_GENERAL then return end --只在需要设置综合频道才使用 local all_chat_list = self.all_chat_list local channelGeneralList = {} if all_chat_list then for channel,list in pairs(all_chat_list) do if channel ~= ChatModel.CHANNEL_GENERAL and channel ~= ChatModel.CHANNEL_HORN and channel ~= ChatModel.CHANNEL_CECRET then --喇叭会加入世界频道····可能祖传代码就要这样做 for k,v in pairs(list) do table.insert(channelGeneralList,v) end end end end local sort_func = function ( a, b ) --生成是倒序 return a.time < b.time end table.sort(channelGeneralList, sort_func) local cutNum = #channelGeneralList - ChatModel.MAX_LEN_LIST[ChatModel.CHANNEL_GENERAL] if cutNum > 0 then for i=1,cutNum do table.remove(channelGeneralList,1) end end all_chat_list[ChatModel.CHANNEL_GENERAL] = channelGeneralList --Message.show(#self.all_chat_list[ChatModel.CHANNEL_GENERAL]) end --存储未读私聊消息 function ChatModel:SetPriateChatInfo(info) if not info then return end local len = TableSize(info.player_list) if len == 2 then local role_id = RoleManager.Instance:GetMainRoleId() if role_id == info.player_list[1].player_id then info.key_id = info.player_list[2].player_id else info.key_id = info.player_list[1].player_id end info.name = info.player_list[1].name self.chat_priate_info[info.key_id] = {} self.chat_priate_info[info.key_id] = info.player_list[1].player_id end end --获取未读私聊消息 function ChatModel:GetPriateChatInfo( ) return self.chat_priate_info end --更新未读私聊消息 function ChatModel:UpdatePriateChatInfo(id) if not id then return end for k,v in pairs(self.chat_priate_info) do if k == id then self.chat_priate_info[k] = nil end end end function ChatModel:SetChatInfo( info,vo ) self.get_chat = info self.chatMessage = vo end function ChatModel:GetChatInfo( ) return self.get_chat,self.chatMessage end function ChatModel:SetConfigLangExtraWelcomeList( ) local config_language_extra = Config.Languageextra self.welcomeList = {} for k,v in pairs(config_language_extra) do if v.module_id == 110 then --if v.id ~= 1 then --开始显示第一条 --if v.tip == 1 then -- tip 为1的才加 local str = Trim( ChuanWenManager:getInstance():FormatColorTag2(v.content, true) ) table.insert(self.welcomeList,str) --end --end end end end function ChatModel:StopWelcomeHorn( ) if self.play_welcom_horn_id then GlobalTimerQuest:CancelQuest(self.play_welcom_horn_id) self.play_welcom_horn_id = nil end end function ChatModel:StartMainUIWelcomeHorn( ) self:StopWelcomeHorn( ) local function onTimer( ) local new_index = math.random(1, #self.welcomeList) if new_index == self.welcomeListIndex then self.welcomeListIndex = self.welcomeListIndex + 1 if self.welcomeListIndex > #self.welcomeList then self.welcomeListIndex = 1 end else self.welcomeListIndex = new_index end welcomeShowTxt = self.welcomeList[self.welcomeListIndex] self:Fire(ChatModel.ADD_MAINUI_WELCOME_HORN, welcomeShowTxt) end self.play_welcom_horn_id = GlobalTimerQuest:AddPeriodQuest(onTimer,Config.ConfigChat.MainUIWelcomeHornTime) onTimer() -- 先调一次 end function ChatModel:GetGoodsTipNum( )--11060协议专用小喇叭显示,后端无法传只得前端写死读 local config_language_extra = Config.Languageextra return config_language_extra["0@2"].tip end function ChatModel:SetVo11023(vo) self.vo11023 = vo end function ChatModel:GetVo11023( ) return self.vo11023 end function ChatModel:GetAiMsgList( ) if not self:GetVo11023( ) or not self:GetVo11023( ).cache_list then return end --print("=============>>> YiRan:ChatModel [start:1459] self:GetVo11023( ).cache_list ------------------------------------------") --PrintTable(self:GetVo11023( ).cache_list) --print("=============>>> YiRan:ChatModel [end] ------------------------------------------") local role_id = RoleManager.Instance:GetMainRoleId() local server_id = RoleManager.Instance.mainRoleInfo.server_id local creatMsg = { ["args"] = {}, ["result"] = 0, ["auto_id"] = 0, ["player_list"] = { [1] = { ["GM"] = 0, ["guild_name"] = "", ["vip_flag"] = 0, ["profile_photo_id"] = 0, ["realm"] = 0, ["player_id"] = 0, ["ser_num"] = 666, ["sex"] = 1, ["role_id"] = role_id, ["touxian"] = 0, ["picture_ver"] = 0, ["turn_stage"] = 0, ["grade_id"] = 0, -- ["deity_id"] = 0, -- ["image_id"] = 0, -- ["marriage_id"] = 0, -- ["is_marriage"] = 0, ["picture"] = 0, ["sup_vip_type"] = 0, -- ["escort_state"] = 0, -- ["marriage_name"] = "", ["level"] = "", ["god_id"] = 0, ["star_soul_id"] = 0, ["ser_id"] = 125, ["position_name"] = "", ["turn"] = 0, ["career"] = 0, ["position"] = 0, ["guild_id"] = 0, ["dsgt_id"] = 0, ["sprite_id"] = 607001, ["name"] = "信息自定义", ["ser_name"] = "one server", ["ser_id"] = server_id, } }, ["channel"] = 1, ["voice_msg_time"] = 0, ["time"] = 1579058986, ["msg"] = "模拟信息自定义~~~~", ["client_ver"] = 0, } local transf_cache_list = {} for k,v in pairs(self:GetVo11023( ).cache_list) do transf_cache_list[k] = DeepCopy(creatMsg) transf_cache_list[k].msg = v.msg transf_cache_list[k].player_list[1].profile_photo_id = v.picture transf_cache_list[k].player_list[1].sex = v.sex transf_cache_list[k].player_list[1].vip_flag = v.vip --暂时没有vip transf_cache_list[k].player_list[1].lv = v.lv transf_cache_list[k].player_list[1].name = v.name transf_cache_list[k].time = v.time end return transf_cache_list -- self:AddMsg(msgVo) end function ChatModel:IsCrossServerChannel( channel_id ) return channel_id == ChatModel.CHANNEL_CROSS or channel_id == ChatModel.CHANNEL_BEACH or channel_id == ChatModel.CHANNEL_COUNTRY end -- 根据频道channel清除聊天缓存和聊天内容条目数量 function ChatModel:ClearAllMsgDataByChannel(channel) if not channel then return end self.all_chat_list[channel] = nil self.all_chat_list_count[channel] = nil end ----------主界面聊天社团图标红点-start--------- function ChatModel:SetGuildChannelRedDot( bool ) if self.has_new_guild_red == nil then self.has_new_guild_red = 0 end if bool then self.has_new_guild_red = self.has_new_guild_red + 1 else self.has_new_guild_red = 0 end self:Fire(ChatModel.Update_MAINUI_GUILD_MSG_RED) end function ChatModel:GetGuildChannelRedDot( ) return self.has_new_guild_red or 0 end -- 初始化登陆时间(用来区别历史消息) function ChatModel:InitLoginTime( ) self.login_time_cache = TimeUtil:getServerTime() self:SetGuildChannelRedDot( false ) end ----------主界面聊天社团图标红点-end----------- --版本更新的提示 function ChatModel:SetClientUpdateInfo( vo ) self.client_update_info = vo end function ChatModel:GetClientUpdateInfo( ) return self.client_update_info end