require("game.proto.110.Require110") require("game.chat.ChatModel") require("game.chat.TV") require("game.chat.ChatView") require("game.chat.ChatItem") require("game.chat.ChatBarBtn") require("game.chat.HornView") require("game.chat.IndividuationView") require("game.chat.ChannelSettingView") require("game.chat.VoiceVo") require("game.chat.ChatVoiceManager") require("game.chat.CecretView") require("game.chat.FaceItem") require("game.chat.TextFaceItem") require("game.chat.CecretChatItem") require("game.chat.HistroyItem") require("game.chat.PartnerShowItem") require("game.chat.EquipShowItem") require("game.chat.CecretShowItem") require("game.chat.ChatBagView") require("game.chat.ChatCustomTextView") require("game.chat.HistoryTextItem") require("game.chat.ChatChannelToggleItem") ChatController = ChatController or BaseClass(BaseController) local table_insert = table.insert function ChatController:__init() ChatController.Instance = self self.model = ChatModel:getInstance() self:RegisterProtocals() self:InitEvent() end function ChatController:RegisterProtocals() self:RegisterProtocal(11000, "on11000") self:RegisterProtocal(11001, "on11001") self:RegisterProtocal(11002, "on11002") self:RegisterProtocal(11102, "on11102") self:RegisterProtocal(11003, "on11003") self:RegisterProtocal(11004, "on11004") self:RegisterProtocal(11005, "on11005") self:RegisterProtocal(11010, "on11010") self:RegisterProtocal(11011, "on11011") self:RegisterProtocal(11013, "on11013") self:RegisterProtocal(11016, "on11016") self:RegisterProtocal(11017, "on11017") self:RegisterProtocal(11020, "on11020") self:RegisterProtocal(11021, "on11021") self:RegisterProtocal(11050, "on11050") self:RegisterProtocal(11014, "on11014") self:RegisterProtocal(11060, "on11060") self:RegisterProtocal(11061, "on11061") self:RegisterProtocal(11063, "on11063") self:RegisterProtocal(11022, "on11022") --社团求助 self:RegisterProtocal(11046, "on11046") self:RegisterProtocal(11064, "on11064")--通用怪物AI警戒传闻 self:RegisterProtocal(11066, "on11066")--屏蔽操作 self:RegisterProtocal(11065, "on11065")--屏蔽列表 self:RegisterProtocal(11067, "on11067")-- 剧情气泡推送 self:RegisterProtocal(11023, "on11023") --模拟聊天缓存 self:RegisterProtocal(11091, "on11091") --更新通知 end --公告 function ChatController:on11050() local vo = SCMD11050.New(true) self.model:StartGongGaoList(vo) end --物品不够的错误码 function ChatController:on11000() local vo = SCMD11000.New(true) if vo then ErrorCodeShow(vo.error_code) end end --通用文字聊天 function ChatController:on11001() local vo = SCMD11001.New(true) --if vo.result == 2 then return end -- 有些tips各种格式都有,先开出 local is_in_shield_list = SocialityModel:getInstance():IsRelaviveType(vo.player_id,Config.ConfigSocial.RelativeType.black) if is_in_shield_list then--屏蔽掉 return end for k,v in pairs(self.model.limit_way_list) do if v == ChatModel.LIMIY_WAY.BABY then-- and vo.channel == ChatModel.CHANNEL_CSCITY then local x_s,x_end = string.find(vo.msg,"@showbaby@") if x_end and x_end > 0 then return end end if v == ChatModel.LIMIY_WAY.CHAT then--then--and vo.channel == ChatModel.CHANNEL_CSCITY then local showbaby_s,showbaby_end = string.find(vo.msg,"@showbaby@") local team_s,team_end = string.find(vo.msg,"@team@") if not showbaby_s and not team_s then return end end if v == ChatModel.LIMIY_WAY.RECRUIT then--and vo.channel == ChatModel.CHANNEL_CSCITY then local team_s,team_end = string.find(vo.msg,"@team@") -- print("============>>> YiRan:ChatController [start:95]team_end:", team_end,"team_s:",team_s) if team_end and team_end > 0 then return end end end if vo.channel == ChatModel.CHANNEL_BARRAGE then--弹幕不走聊天框 SpiritWarModel:getInstance():TryAddDanMu(vo) DiamondFightModel:getInstance():TryAddDanMu(vo) else if vo.channel == ChatModel.CHANNEL_GUILDTV then--如果是跑马频道的消息 要先做个拼接 vo.guild_txt = vo.name..":"..vo.msg vo.length = CalStringTrueLength(vo.guild_txt) + 0.5--算出字符长度(固定有个0.5占位的中文冒号,应该当中文字符) --以下加入弹幕中 if GuildTVModel:GetInstance().can_fire_TV_barrage then--打开了弹幕界面才能开始发弹幕 local data = { name = vo.name, id = vo.role_id, time = vo.time, } data.content = vo.msg GuildTVModel:GetInstance():AddGuildTVBarrageMessage(data) end end vo.iType = ChatModel.MSG_TYPE.TEXT --信息的种类是消息非语音 self.model:AddMsg(vo) -- self.model:Fire(ChatModel.CHANGE_CHANNEL_SEND_INTERVAL, vo) self.model:Fire(ChatModel.UPDATE_SEND_TIME) self.model:AddMainRoleChatContent(vo.msg, vo.player_id) end end --通用文字私聊 function ChatController:on11003() --[[ channel:int8 // 频道 role_id:int64 // 玩家id figure:rec_figure // 形象数据 auto_id:int32 // 自增id receive_id:int32 // 接受者id voice_text:string // 语音文字内容 voice_msg_time:int16 // 语音时间(秒) ]] local scmd = {} local channel = self:ReadFmt("c") local ser_id = UserMsgAdapter.ReadFmt("h") local ser_num = UserMsgAdapter.ReadFmt("h") local ser_name = UserMsgAdapter.ReadFmt("s") -- if role_id == RoleManager:getInstance():GetMainRoleVo().role_id then -- return -- end scmd.player_list = {} local figure = {} local alength = self:ReadFmt("h") for i = 1, alength do local data = {player_id = self:ReadFmt("l")} FigureProtoVo.ReadFmt(data) table.insert(scmd.player_list, data) end local data_ver, voice_id, receive_id, voice_text, voice_msg_time, send_time = self:ReadFmt("lllshi") local lv_rank, combat_rank = self:ReadFmt("cc") local mainRoleVo = RoleManager:getInstance():GetMainRoleVo() scmd.iType = ChatModel.MSG_TYPE.VOICE scmd.voice_id = voice_id scmd.length = voice_msg_time scmd.channel = channel scmd.ser_id = ser_id scmd.ser_name = ser_name scmd.player_id = scmd.player_list[1].player_id scmd.msg = voice_text or "" scmd.args = "" scmd.result = 0 scmd.time = send_time scmd.data_ver = data_ver scmd.ser_num = ser_num scmd.lv_rank = lv_rank scmd.combat_rank = combat_rank if receive_id == 0 then setmetatable(scmd, {__index = scmd.player_list[1]}) end local engine_version = tonumber(AppConst.EnglineVer) if engine_version < scmd.data_ver and scmd.data_ver < 34 then return else ChatVoiceManager:getInstance():SetVoiceVersion(scmd.voice_id, scmd.data_ver) end local is_in_shield_list = SocialityModel:getInstance():IsRelaviveType(scmd.player_id,Config.ConfigSocial.RelativeType.black) if is_in_shield_list then--黑名单屏蔽掉 return end local catch = not self.model:AddMsg(scmd) self.model:Fire(ChatModel.CHANGE_CHANNEL_SEND_INTERVAL, scmd) self.model:Fire(ChatModel.UPDATE_SEND_TIME) self.model:AddMainRoleChatContent(scmd.msg, scmd.player_id) if catch then return end local subType = SettingModel.C2T[channel] local autoPlay = (subType == nil) or (SettingModel:getInstance():GetSettingInfo(SettingModel.TYPE.VOICE, subType) == 1) -- local key = GameSettingManager.blockChannel[channel] -- local has_block = GameSettingManager:getInstance():GetBlockProperty(key) -- 检查语音自动播放屏蔽 local has_block = (lua_settingM:GetBlockProperty("chatVoice") == true) -- 检查语音自动播放屏蔽 if autoPlay and not has_block then if SettingModel:getInstance():GetSettingInfo(SettingModel.TYPE.VOICE, SettingModel.SUBTYPE.AUTOPLAY) == 1 then local wifiState = Application.internetReachability == UnityEngine.NetworkReachability.IntToEnum(2) if wifiState then if not ChatVoiceManager:getInstance():GetVoice(scmd.voice_id) then self.model:Fire(ChatModel.REQUEST_CCMD_EVENT, 11004, scmd.voice_id, scmd.player_id, scmd.time, "") else ChatVoiceManager:getInstance():PlayVoice(scmd.voice_id) end end else if not ChatVoiceManager:getInstance():GetVoice(scmd.voice_id) then self.model:Fire(ChatModel.REQUEST_CCMD_EVENT, 11004, scmd.voice_id, scmd.player_id, scmd.time, "") else ChatVoiceManager:getInstance():PlayVoice(scmd.voice_id) end end end -- self.model:AddMsg(scmd) --print("channel, role_id, voice_msg_time, math.floor(tk_time), ticket =" , channel, role_id, math.floor(voice_msg_time), voice_text, voice_id) end --发送语音和语音文字信息 function ChatController:on11004() --[[ auto_id:int32 // 自增id data_send:byte32 // 语音内容 ]] local erroCode = self:ReadFmt("i") local voice_id = self:ReadFmt("l") local voice_data = self:ReadFmt("B") if erroCode ~= 1 then ErrorCodeShow(erroCode) return end ChatVoiceManager:getInstance():AddVoiceData(voice_id, voice_data) ChatVoiceManager:getInstance():PushPlay(voice_id) end function ChatController:on11005() local scmd = SCMD11005.New(true) if scmd.error_code ~= 1 then ErrorCodeShow(scmd.error_code) end end --缓存 function ChatController:on11010() local vo = SCMD11010.New(true) if vo and vo.cache_list and vo.cache_list[1] then self.model.all_chat_list[vo.cache_list[1].channel] = nil end if vo and vo.cache_list and #vo.cache_list > 0 then --在这防止多次添加 if vo.cache_list[1].channel == 1 then -- 世界频道的话需要插入缓存的假数据 local list = self.model:GetAiMsgList() --插入模拟对话的 if list then -- print("============>>> YiRan:ChatController [start:255] #vo.cache_list[1]:",#vo.cache_list,"#lis:t",#list) for k,v in pairs(list) do table.insert(vo.cache_list,v) end --print("============>>> YiRan:ChatController [start:255] #vo.cache_list[1]:",#vo.cache_list,"#lis:t",#list) end end local function sort_func(a, b) return a.time > b.time end table.sort( vo.cache_list, sort_func ) end for i = 1, #vo.cache_list do if vo.cache_list[i].result ~= 2 then ------陌生人离线私聊的特殊处理 if vo.cache_list[i].channel == 6 then --如果是私聊并且对方不在黑名单中不在最近联系人列表中时候,先把他加到最近联系人列表 if vo.cache_list[i].player_list[1].player_id ~= RoleManager.Instance.mainRoleInfo.role_id and not SocialityModel:getInstance():IsRelaviveType(vo.cache_list[i].player_list[1].player_id,Config.ConfigSocial.RelativeType.recent) and not SocialityModel:getInstance():IsRelaviveType(vo.cache_list[i].player_list[1].player_id,Config.ConfigSocial.RelativeType.black) then SocialityModel:getInstance():Fire(SocialityModel.REQUEST_CCMD_EVENT,14020,vo.cache_list[i].player_list[1].player_id) end self.model:SetPriateChatInfo(vo.cache_list[i])--存储私聊对象的消息 end ------ vo.cache_list[i].iType = ChatModel.MSG_TYPE.TEXT self.model:DealWithCacheMsg(vo.cache_list[i]) end end --添加进聊天框的顺序要反过来 if self.cache_msg_list == nil then self.cache_msg_list = {} end for i = #vo.cache_list, 1, -1 do if vo.cache_list[i].result ~= 2 then -- self.model:AddMsg(vo.cache_list[i]) local is_in_shield_list = SocialityModel:getInstance():IsRelaviveType(vo.cache_list[i].player_list[1].player_id,Config.ConfigSocial.RelativeType.black) if not is_in_shield_list then--屏蔽的不需要缓存 self.model:AddMsg(vo.cache_list[i]) end end end self.model.require_11010_times = self.model.require_11010_times - 1 if self.model.require_11010_times <= 0 then self.model:Fire(ChatModel.INIT_FIRST_GAME_CHAT_DATA) end end function ChatController:on11011() local vo = SCMD11011.New(true) self.model:SetCrossChatTime(vo.count) end --更新通知 function ChatController:on11091( ) local scmd = SCMD11091.New(true) self.model:SetClientUpdateInfo(scmd) local tb = {type = Config.ConfigMainIcon.TipType.client_update} MsgManager:getInstance():Add(tb) end function ChatController:on11022() local vo = SCMD11022.New(true) end --私聊的多加了一个figure,私聊会发送到这里 function ChatController:on11002(vo) local vo = SCMD11002.New(true) local is_in_shield_list = SocialityModel:getInstance():IsRelaviveType(vo.player_list[1].player_id,Config.ConfigSocial.RelativeType.black) if is_in_shield_list then--屏蔽掉 return end --不在最近联系人列表中人发来消息时加入最近联系人列表 if vo.player_list[1].player_id ~= RoleManager.Instance.mainRoleInfo.role_id and not SocialityModel:getInstance():IsRelaviveType(vo.player_list[1].player_id,Config.ConfigSocial.RelativeType.recent) then SocialityModel:getInstance():Fire(SocialityModel.REQUEST_CCMD_EVENT,14020,vo.player_list[1].player_id) end vo.iType = ChatModel.MSG_TYPE.TEXT self.model:AddMsg(vo) self.model:Fire(ChatModel.CHANGE_CHANNEL_SEND_INTERVAL, vo) self.model:Fire(ChatModel.UPDATE_SEND_TIME) self.model:AddMainRoleChatContent(vo.msg, vo.player_id) local player_id = vo.player_list[1].player_id --取出私聊对象的id if player_id ~= RoleManager.Instance.mainRoleInfo.role_id then --收到私聊消息后更新和该好友的最后私聊时间 SocialityModel:getInstance():UpdateLastChatTime(player_id,vo.time) self.model:SetChatInfo(true,vo) self.model:SetPriateChatInfo(vo)--存储私聊对象的消息 SocialityModel:getInstance():Fire(SocialityModel.REFRESH_SUB_BTN_RED)--刷新subBtn红点 GlobalEventSystem:Fire(EventName.REFRESH_SOCIAL_RED_DOT)--更新外部红点 end end --½ÓÊÕϵͳÐÅÏ¢ function ChatController:on11060() local scmd = SCMD11060.New(true) if scmd.type == 2 then if EmpowerModel:GetInstance():GetIsShowingGameView() and not EmpowerModel:GetInstance():GetIsShowingShopView() then return end if GoodsModel:getInstance():CheckCanFlyGood() then--检查飞道具图标的条件 MainUIModel:getInstance():AddFloatInfo(scmd.goods_list) if SceneManager:getInstance():IsExpDun() then--如果是经验副本并且是经验值道具 local goods_list = {} for i,v in ipairs(scmd.goods_list) do if v.goods_type_id == 100007 then goods_list[#goods_list + 1] = v.goods_type_id end end if #goods_list > 0 then MainUIModel:getInstance():PlayGoodsFlyList(goods_list) end end end end local function show(str) if scmd.type == 1 then if not GiftModel:getInstance():getIsOpenView() then--and not TreasureHuntModel:getInstance().bool_hunting -- and not CustomActivityModel:getInstance():getIsThrowEgg() then--礼包界面|寻宝过程|砸蛋过程中不显示提示 -- Message.show(str) end elseif scmd.type == 2 then ChatModel:getInstance():AddInfoToChatView(str, ChatModel.CHANNEL_SYSTEM, self.model:GetGoodsTipNum() or 0) elseif scmd.type == 3 then -- Message.show(str) ChatModel:getInstance():AddInfoToChatView(str, ChatModel.CHANNEL_SYSTEM, self.model:GetGoodsTipNum() or 0) end end local gvo = nil for i, v in ipairs(scmd.goods_list) do gvo = GoodsModel:getInstance():GetGoodsBasicByTypeId(v.goods_type_id) if gvo then local name = gvo.goods_name if gvo.type == 11 and (gvo.subtype == 10 or gvo.subtype == 11) then local type_id, _name, icon = EquipModel:getInstance():GetIdentifyGoodsNameAndIcon(gvo.type_id, RoleManager.Instance.mainRoleInfo.career, gvo.color) name = _name end -- str = "获得 " .. name .. "x" .. v.num .. "" local str = "获得 " .. name .. "x" .. v.num .. "" --改成用传闻面板特殊的颜色 show(str) -- Message.show(str) -- ChatModel:getInstance():AddInfoToChatView(str,ChatModel.CHANNEL_SYSTEM,1) end end -- GoodsModel:getInstance():Fire(GoodsModel.GET_A_GOODS) end --获得物品显示信息在右下角提示框内 function ChatController:on11061() local scmd = SCMD11061.New(true) local gvo = nil for i, v in ipairs(scmd.goods_list) do -- local typeId = v.typeId -- if v.style ~= 0 then -- typeId = GoodsModel:getInstance():GetMappingTypeId(v.style) -- end local typeId, lock = GoodsModel:getInstance():GetMappingTypeId(tonumber(v.style), tonumber(v.typeId)) gvo = GoodsModel:getInstance():GetGoodsBasicByTypeId(typeId) if gvo then local name = gvo.goods_name if gvo.type == 11 and (gvo.subtype == 10 or gvo.subtype == 11) then local type_id, _name, icon = EquipModel:getInstance():GetIdentifyGoodsNameAndIcon(gvo.type_id, RoleManager.Instance.mainRoleInfo.career, gvo.color) name = _name end local str = "" if v.count > 1 then str = "获得 " .. name .. "x" .. v.count .. "" else str = "获得 " .. name .. "" end Message.show(str) end end -- GoodsModel:getInstance():Fire(GoodsModel.GET_A_GOODS) end --获得物品显示信息在右下角提示框内 function ChatController:on11016() local vo = SCMD11016.New(true) if vo then --社团申请列表状态 if vo.module_id == 400 and vo.type == ChatModel.RedPointType.GUILD_APPLY_LIST then -- vo.num 在社团类型中对应【申请的职位】,0代表入团,其他代表职位 GuildModel:getInstance():SetApplyRedPointState(vo.num) -- GuildModel:getInstance():CheckGuildRedDot(Config.ConfigGuild.TabId.List, true) -- GlobalEventSystem:Fire(EventName.SHOW_FUNCTION_RED_POINT, 400, GuildModel:getInstance():CheckGuildRedDot()) -- elseif vo.module_id == 400 and vo.type == 2 then -- GlobalEventSystem:Fire(EventName.SHOW_FUNCTION_RED_POINT, 400, true) elseif vo.module_id == 339 and vo.type == 1 then -- local tb = {} -- tb.type = Config.ConfigMainIcon.TipType.guild_redpacket -- tb.zoom = true -- MsgManager:getInstance():Add(tb) elseif vo.module_id == 223 and vo.type == 1 then --鲜花 local tb = {} tb.type = Config.ConfigMainIcon.TipType.flower MsgManager:getInstance():Add(tb) GlobalEventSystem:Fire(EventName.REFRESH_SOCIAL_RED_DOT) elseif vo.module_id == 441 then --激活图鉴 GlobalEventSystem:Fire(EventName.SET_ACTIVE_PIC, vo.type, vo.num) end GlobalEventSystem:Fire(EventName.BROADCAST_RED_POINT_STATE, vo) end end --聊天频道的错误码消息 function ChatController:on11017() local vo = SCMD11017.New(true) --type 1只飘字 2只聊天框 3飘字加聊天框 -- PrintTable(vo) local str = self.model:GetErrorCode(vo.error_code, vo.error_code_args) if vo.type == 1 then if vo.error_code == 1500098 then --返回礼包模块去处理 GiftModel:getInstance():handleGiftShowAll(vo.error_code_args) else Message.show(str) end elseif vo.type == 2 then if vo.error_code == 6100035 then if SceneManager.Instance:IsOutdoorScene() then local scene_id = SceneManager.Instance:GetSceneId() local birth_x, birth_y = SceneManager.Instance:GetSceneBirthPos() local findVo = {type = FindVo.SCENE, sceneId = scene_id, id = 0, x = math.ceil(birth_x / SceneObj.LogicRealRatio.x), y = math.ceil(birth_y / SceneObj.LogicRealRatio.y)} local scene_name = SceneManager.Instance:GetSceneName() local content = string.format("", findVo.sceneId, findVo.x, findVo.y) str = str .. " " .. content end end self.model:AddInfoToChatView(str, ChatModel.CHANNEL_TEAM) elseif vo.type == 3 then Message.show(str) self.model:AddInfoToChatView(str, ChatModel.CHANNEL_TEAM) end end function ChatController:on11014() local vo = SCMD11014.New(true) if vo then Message.show("发送频率过快,请销后再试...", "fault") end end --广播语音文字 function ChatController:on11013() local scmd = SCMD11013.New(true) self.model:UpdateRegText(scmd) if self.model.curr_channel == scmd.channel then self.model:Fire(ChatModel.BROADCAST_VOICE_TEXT, scmd) end end function ChatController:on11020() local scmd = SCMD11020.New(true) Message.show(scmd.content) end function ChatController:on11021() local scmd = SCMD11021.New(true) self.model:AddGmHorn(scmd) end function ChatController:on11046() local scmd = SCMD11046.New(true) for k, v in pairs(scmd.list) do if RoleManager.Instance.mainRoleInfo.role_id ~= v.role_id then for channel, _ in pairs(self.model.all_chat_list) do self.model:DelMsgInChannelById(channel, v.role_id) end self.model:Fire(ChatModel.DEL_CHAT_ITEM, v.role_id) end end --更新界面 self.model:Fire(ChatModel.REFRESH_VIEW) self.model:Fire(ChatModel.SHOW_TAB_RED_POINT, self.model.all_chat_list_count) SocialityModel:getInstance():Fire(SocialityModel.UPDATE_SOCIALITY_VIEW) end --通用播放特效 function ChatController:on11063() local scmd = SCMD11063.New(true) local tb = {} tb.effect = scmd.effect SocialityModel:getInstance():PlayFlowerEffect(tb) end --通用怪物AI警戒传闻 function ChatController:on11064() local scmd = SCMD11064.New(true) local config = Config.Languageextra local key = scmd.module_id .. "@" .. scmd.id if config[key] and config[key].content then local str = ChuanWenManager:getInstance():FormatColorTag2(config[key].content, true) local data = { head_type = 1000, desc = str, head_name = scmd.name or "", hide_time = 8, dalay_time = 1, is_task_type = true, } GlobalEventSystem:Fire(EventName.SHOW_COM_DIALOGUE_SHOW_VIEW,data) end end function ChatController:on11065( )--屏蔽列表 local scmd = SCMD11065.New(true) for k,v in pairs(scmd.figure_list) do v.role_name = v.name v.vip = v.vip_flag v.lv = v.level end SocialityModel:getInstance():SetRelativeInfo(Config.ConfigSocial.RelativeType.black,scmd.figure_list) -- if not self.model.request_cache then--检测聊天缓存 -- self.model.request_cache = true -- if RoleManager.Instance.mainRoleInfo.guild_id > 0 then -- self.model:Fire(ChatModel.REQUEST_CACHE_EVENT, ChatModel.CHANNEL_GUILD) -- end -- self.model:Fire(ChatModel.REQUEST_CACHE_EVENT, ChatModel.CHANNEL_WORLD) -- self.model:Fire(ChatModel.REQUEST_CACHE_EVENT, ChatModel.CHANNEL_CECRET) -- end end function ChatController:on11067( )--屏蔽列表 local scmd = SCMD11067.New(true) SocialityModel:getInstance():Fire(SocialityModel.BROADCAST_MIDDLE_MESSAGE, scmd.module_id, scmd.id) end function ChatController:on11066( )--屏蔽操作 local scmd = SCMD11066.New(true) if scmd.errcode == 1 then Message.show("操作成功", "success") scmd.role_name = scmd.name scmd.vip = scmd.vip_flag scmd.lv = scmd.level SocialityModel:getInstance():UpdateShieldList(scmd.type,scmd) SocialityModel:getInstance():Fire(SocialityModel.REQUEST_SOCIAL_LIST) else ErrorCodeShow(scmd.errcode) end end --########### 模拟聊天缓存 ############## --protocol=11023 --{ -- s2c{ -- cache_list:array{ -- name:string -- sex:int8 -- vip:int8 -- picture:int32 -- msg:string // 数据 -- time:int32 // 服务器时间戳 -- } -- } --} function ChatController:on11023( )-- local scmd = SCMD11023.New(true) -- if scmd.errcode == 1 then -- print("=============>>> YiRan:ChatController [start:537] SCMD11023------------------------------------------") -- PrintTable(scmd) -- print("=============>>> YiRan:ChatController [end] ------------------------------------------") self.model:SetVo11023(scmd) -- else -- ErrorCodeShow(scmd.errcode) ----end end function ChatController:InitEvent() local onChangeAccount = function () self.model:ClearGongGaoTimer() self:StopLearnHorn() self.model:Fire(ChatModel.CLEAR_DATA)--清除主聊天界面的item self.model:InitLoginTime() end GlobalEventSystem:Bind(EventName.CHANGE_ACCOUNT, onChangeAccount) GlobalEventSystem:Bind(EventName.CHANGE_ROLE, onChangeAccount) local function onChangeLevel( ) local role_lv = RoleManager.Instance:GetMainRoleLevel2() --if self.need_reset_lv_list[role_lv] then -- self:StarPlayTeachingHorn() --end end RoleManager.Instance.mainRoleInfo:Bind(EventName.CHANGE_LEVEL, onChangeLevel) --切换账号 local gameStartHandler = function () self.model:Fire(ChatModel.CLEAR_DATA)--清除主聊天界面的item if self.ChatView then self.ChatView:Close() end self.model:Clear() self.cache_msg_list = {} -- lua_settingM:LoadChatVoiceSetting() self:SendFmtToGame(11050)--请求11050 self:SendFmtToGame(11065)--请求屏蔽列表 --self:StarPlayTeachingHorn() self.model:InitLoginTime() end GlobalEventSystem:Bind(EventName.GAME_START, gameStartHandler) local function onSendMsgHandler(channel, content, target_id, args, is_mySelf_send)--is_mySelf_send是否是玩家自己发的如果是就是1 -- print('Cat:ChatController.lua[484] channel, content, target_id, args', channel, content, target_id, args) is_mySelf_send = is_mySelf_send or ChatModel.CHAT_COMMON_TYPE.COMMON--默认发0告诉服务端是玩家正常发言 self.model:Fire(ChatModel.REQUEST_CCMD_EVENT, 11001, channel, content, target_id, args, is_mySelf_send) end self.model:Bind(ChatModel.SEND_MSG, onSendMsgHandler) local function onShowGonggaoHandler(info) if info then local vo = {channel = ChatModel.CHANNEL_SYSTEM, time = Status.NowTime, msg = info.content} vo.iType = ChatModel.MSG_TYPE.TEXT self.model:AddMsg(vo) end end GlobalEventSystem:Bind(EventName.SHOW_GONGGAO, onShowGonggaoHandler) local function onShowChuanwenHandler(content, chuanwen_cfg, scmd) if chuanwen_cfg.subtype ~= 0 and content then -- local tmpChannel = Config.ConfigChat.channel_level[chuanwen_cfg.subtype].channel -- local vo = {channel = ChatModel.CHANNEL_SYSTEM,time = Status.NowTime,msg = content} -- channel = tmpChannel -- local vo = {channel=chuanwen_cfg.subtype, time=Status.NowTime, msg=content,showtype=ChatModel.CHANNEL_SYSTEM, tip=chuanwen_cfg.tip} -- self.model:AddMsg(vo) scmd.channel = chuanwen_cfg.subtype -- scmd.time = Status.NowTime scmd.time = TimeUtil:getServerTime() scmd.msg = content if not scmd.type or scmd.type == 11015 then scmd.showtype = ChatModel.CHANNEL_SYSTEM end -- scmd.tip = chuanwen_cfg.tip -- 这会增添了自己的tip scmd.iType = ChatModel.MSG_TYPE.TEXT self.model:AddMsg(scmd) end end GlobalEventSystem:Bind(EventName.SHOW_CHUANWEN, onShowChuanwenHandler) --通用聊天 local function onRequestHandler(...) local args_list = {...} if args_list[1] == 11001 then local channel = args_list[2] local receiveId = args_list[4] or 0 local data = args_list[3] local args = args_list[5] or "" local tk_time = Status.NowTime local ticket = "ticket" local is_mySelf_send = args_list[6] or ChatModel.CHAT_COMMON_TYPE.COMMON self:SendFmtToGame(11001, "clssisc", channel, receiveId, data, args, math.floor(tk_time), ticket, is_mySelf_send) print("发送聊天:", channel, receiveId, data, args, math.floor(tk_time), ticket, is_mySelf_send) elseif args_list[1] == 11003 then --[[ channel:int8 // 频道 receive_id:int64 // 接受者id voice_msg_time:int32 // 语音时间(秒) tk_time:int32 // 时间戳 ticket:string // 加密字符 data_send:byte32 // 语音内容 voice_text:string // 语音文字内容 auto_id:int32 // 自增id is_end:int8 // 是否完成语音信息发送(1:完成,2:未完成)CMD11012返回1后继续发送语音剩余部分 ]] local channel = args_list[2] local receive_id = args_list[3] or 0 local voice_msg_time = args_list[4] local tk_time = Status.NowTime local ticket = "ticket" local data_send = args_list[5] local voice_text = args_list[6] or "" local auto_id = args_list[7] local is_end = 0 local voiceLength = 0 for i = 0, data_send.Length - 1 do if i == data_send.Length - 1 then is_end = 1 end UserMsgAdapter.WriteBegin(11003) UserMsgAdapter.WriteFMT("cliis", channel, receive_id, math.floor(voice_msg_time), math.floor(tk_time), ticket) UserMsgAdapter.WriteFMT("B", data_send[i]) UserMsgAdapter.WriteFMT("slc", voice_text, auto_id, is_end) UserMsgAdapter.SendToGame() voiceLength = voiceLength + data_send[i].Length end Debugger.Log("Voice Data Size is "..voiceLength) --print("channel, receive_id, voice_msg_time, math.floor(tk_time), ticket =" , channel, receive_id, math.floor(voice_msg_time), math.floor(tk_time), ticket, voice_text, auto_id, is_end, data_send.Length) elseif args_list[1] == 11004 then --[[ auto_id:int32 // 自增id player_id:int64 // 语音信息发送者id tk_time:int32 // unix时间戳 ticket:string // 加密字符 ]] local auto_id = args_list[2] local player_id = args_list[3] local voice_msg_time = args_list[4] local ticket = "ticket" UserMsgAdapter.WriteBegin(11004) UserMsgAdapter.WriteFMT("llis", auto_id, player_id, math.floor(voice_msg_time), ticket) UserMsgAdapter.SendToGame() --print("auto_id, player_id, voice_msg_time, ticket =" , auto_id, player_id, math.floor(voice_msg_time),ticket) elseif args_list[1] == 11005 then self:SendFmtToGame(11005, "clls", args_list[2], args_list[3], args_list[4], args_list[5]) elseif args_list[1] == 11022 then self:SendFmtToGame(args_list[1], "cls", args_list[2], args_list[3], args_list[4]) elseif args_list[1] == 11011 then self:SendFmtToGame(args_list[1], "c", args_list[2]) end end self.model:Bind(ChatModel.REQUEST_CCMD_EVENT, onRequestHandler) local function onOpenChatView(channel) if self.ChatView == nil then self.ChatView = ChatView.New() end if not self.ChatView:HasOpen() then self.ChatView:Open(channel) end end GlobalEventSystem:Bind(EventName.OPEN_CHAT_VIEW, onOpenChatView) local function onCloseChatView() if self.ChatView and self.ChatView:HasOpen() then self.ChatView:Close() end end GlobalEventSystem:Bind(EventName.CLOSE_CHAT_VIEW, onCloseChatView) --打开私聊一对一 用于从其他模块进入聊天 local function onOpenCecretChannel(key_id, name) if self.ChatView == nil then self.ChatView = ChatView.New() local index = self.model:GetTabIndexWithChannel(ChatModel.CHANNEL_CECRET) self.ChatView:Open(index) end if not self.ChatView.is_moving and not self.ChatView:HasOpen() then local index = self.model:GetTabIndexWithChannel(ChatModel.CHANNEL_CECRET) self.ChatView:Open(index) end self.ChatView:OpenCecretChannel(key_id, name) end GlobalEventSystem:Bind(EventName.OPEN_CHAT_CECRET_CHANNEL, onOpenCecretChannel) local function onOpenHornView() if self.HornView == nil then self.HornView = HornView.New() end if self.HornView:HasOpen() then self.HornView:Close() else self.HornView:Open() end end GlobalEventSystem:Bind(EventName.OPEN_HORN_VIEW, onOpenHornView) local function onOpenIndividuationView(bar_index, pos_x, pos_y, is_close_after_sendpos, chating_key_id,is_reset_anchor, scale_num) if self.IndividuationView == nil then self.IndividuationView = IndividuationView.New() end if self.IndividuationView:HasOpen() then self.IndividuationView:Close() else self.IndividuationView:Open(bar_index, pos_x, pos_y, is_close_after_sendpos, chating_key_id, is_reset_anchor, scale_num) end end GlobalEventSystem:Bind(EventName.OPEN_INDIVIDUATION_VIEW, onOpenIndividuationView) local function onCloseIndividuationView() if self.IndividuationView and self.IndividuationView:HasOpen() then self.IndividuationView:Close() end end GlobalEventSystem:Bind(EventName.CLOSE_INDIVIDUATION_VIEW, onCloseIndividuationView) local function onOpenChatBagView() if self.ChatBagView == nil then self.ChatBagView = ChatBagView.New() end self.ChatBagView:Open() -- if self.ChatBagView:HasOpen() then -- self.ChatBagView:Close() -- else -- self.ChatBagView:Open() -- end end GlobalEventSystem:Bind(EventName.OPEN_CHAT_BAG_VIEW, onOpenChatBagView) local function onCloseChatBagView() if self.ChatBagView and self.ChatBagView:HasOpen() then self.ChatBagView:Close() end end GlobalEventSystem:Bind(EventName.CLOSE_CHAT_BAG_VIEW, onCloseChatBagView) local function onOpenChatCustomTextView(index) if self.ChatCustomTextView == nil then self.ChatCustomTextView = ChatCustomTextView.New() end if self.ChatCustomTextView:HasOpen() then self.ChatCustomTextView:Close() else self.ChatCustomTextView:Open(index) end end GlobalEventSystem:Bind(EventName.OPEN_CHAT_CUSTOM_TEXT_VIEW, onOpenChatCustomTextView) -- local function onOpenChannelSettingView() -- if self.ChannelSettingView == nil then -- self.ChannelSettingView = ChannelSettingView.New() -- end -- if self.ChannelSettingView:HasOpen() then -- self.ChannelSettingView:Close() -- else -- self.ChannelSettingView:Open() -- end -- end -- GlobalEventSystem:Bind(EventName.OPEN_CHANNELSETTING_VIEW, onOpenChannelSettingView) local function onRequestCacheMsg(channel) self:SendFmtToGame(11010, "c", channel) end self.model:Bind(ChatModel.REQUEST_CACHE_EVENT, onRequestCacheMsg) local function onChangeChannelSendStartTime(vo) self.model:ChangeChannelSendStartTime(vo, Status.NowTime) end self.model:Bind(ChatModel.CHANGE_CHANNEL_SEND_INTERVAL, onChangeChannelSendStartTime) -- local function onRequestWorldChatNum() -- --请求缓存 -- if not self.model.request_cache then -- self.model.request_cache = true -- self.model:Fire(ChatModel.REQUEST_CACHE_EVENT, ChatModel.CHANNEL_WORLD) -- if RoleManager.Instance.mainRoleInfo.guild_id > 0 then -- self.model:Fire(ChatModel.REQUEST_CACHE_EVENT, ChatModel.CHANNEL_GUILD) -- end -- end -- end -- GlobalEventSystem:Bind(EventName.GAME_START, onRequestWorldChatNum) local function onRequestRedPointState(module_id, type) self:SendFmtToGame(11016, "hh", module_id, type) end GlobalEventSystem:Bind(EventName.REQUEST_RED_POINT_STATE, onRequestRedPointState) --处理屏蔽功能11066协议的发送 local function ON_SEND_PROTOCAL( ... ) local args = {...} if args[1] == 11065 then elseif args[1] == 11066 then self:SendFmtToGame(args[1], "cl", args[2],args[3]) else self:SendFmtToGame(args[1]) end end self.model:Bind(ChatModel.SEND_PROTOCAL, ON_SEND_PROTOCAL) GlobalEventSystem:Bind(ChatModel.ON_RESULT_OF_SPEECH, function(reg_txt) reg_txt = LanguageFilter.FilterMsg(reg_txt) self.model.reg_txt = reg_txt if not self.model.loading_voice then if SettingModel:getInstance():GetSettingInfo(SettingModel.TYPE.VOICE, SettingModel.SUBTYPE.TEXTONLY) == 1 then self.model:Fire(ChatModel.REQUEST_CCMD_EVENT, 11001, self.model.reg_channel, reg_txt, self.model.chating_key_id or 0, "", nil, "") else if self.model.sendAlready then self.model:Fire(ChatModel.REQUEST_CCMD_EVENT, 11005, self.model.reg_channel, self.model.reg_receive_id, self.model.voice_id, reg_txt) else self:SendVoice() end end -- local scmd = {auto_id = self.model.voice_id, channel = self.model.reg_channel, voice_text = reg_txt} -- self.model:UpdateRegText(scmd) -- self.model:Fire(ChatModel.BROADCAST_VOICE_TEXT, scmd) end end) GlobalEventSystem:Bind(ChatModel.ON_END_OF_SPEECH, function(data) if self.model.end_speech_data then if data ~= "" then Message.show(data) end self.model.end_speech_data = nil else self.model.end_speech_data = data end if not self.model.loading_voice and not self.model.sendAlready then print("tanar: ChatController [910] Bind ON_END_OF_SPEECH") self:SendVoice() end end) GlobalEventSystem:Bind(EventName.CHANGE_ACCOUNT, function() self.model.voice_id = nil self.model.reg_channel = nil self.model.loading_voice = nil self.model.end_speech_data = nil ChatVoiceManager:getInstance():Reset() end) GlobalEventSystem:Bind(EventName.CHANGE_ROLE, function() self.model.voice_id = nil self.model.reg_channel = nil self.model.loading_voice = nil self.model.end_speech_data = nil ChatVoiceManager:getInstance():Reset() end) local function onGuildChange() local guild_id = RoleManager.Instance:GetMainRoleVo().guild_id if not guild_id or guild_id == 0 then self.model.all_chat_list[ChatModel.CHANNEL_GUILD] = nil end end RoleManager:getInstance():GetMainRoleVo():BindOne("guild_id", onGuildChange) local function onOpenLockScreenView( ) --进入省电模式关闭聊天界面 if self.ChatView then self.ChatView:Close() end end GlobalEventSystem:Bind(SceneEventType.SCREEN_BRIGHT_DEL_EVENT, onOpenLockScreenView) end function ChatController:SendVoice() print("tanar: ChatController [949] =========== SendVoice") print("tanar: [ChatController 950]=> self.model.voice_id: ",self.model.voice_id) if self.model.voice_id and SettingModel:getInstance():GetSettingInfo(SettingModel.TYPE.VOICE, SettingModel.SUBTYPE.TEXTONLY) == 0 then ChatVoiceManager:getInstance():AddMainRoleVoicePath(self.model.voice_id, self.model.voice_path) local sendId = self.model.voice_id local function onLoadCallback(voice_data, time_len) print("tanar: [ChatController 956]=> onLoadCallback: ",self.model.reg_channel) print("tanar: [ChatController 957]=> self.model.voice_id == sendId: ",self.model.voice_id == sendId) if self.model.voice_id == sendId and self.model.reg_channel then local channel = self.model.reg_channel local receive_id = self.model.chating_key_id or 0 local voice_msg_time = math.max(1, math.floor(time_len + 0.5)) local data_send = voice_data local voice_text local auto_id = self.model.voice_id if self.model.reg_txt then voice_text = self.model.reg_txt self.model.reg_txt = nil else voice_text = "" self.model.reg_receive_id = receive_id end self.model.reg_txt = nil self.model:Fire(ChatModel.REQUEST_CCMD_EVENT, 11003, channel, receive_id, voice_msg_time, data_send, voice_text, auto_id) self.model.sendAlready = true end end self.model.loading_voice = true self.model.sendAlready = nil ChatVoiceManager:getInstance():LoadMainRoleVoiceData(self.model.voice_id, onLoadCallback) end end function ChatController:StopLearnHorn( ) if self.play_learn_id then GlobalTimerQuest:CancelQuest(self.play_learn_id) self.play_learn_id = nil end SysInfoCtrl.Instance:HideHornView(true) end function ChatController:StarPlayTeachingHorn( ) self.need_reset_lv_list = {} --到特定等级需要刷新 if self.play_learn_id then GlobalTimerQuest:CancelQuest(self.play_learn_id) self.play_learn_id = nil end local chuanwen_list = {} local role_lv = RoleManager.Instance:GetMainRoleLevel2() for _,v in pairs(Config.ConfigChat.teaching) do if role_lv < v.start_lv then self.need_reset_lv_list[v.start_lv] = true end if role_lv < v.end_lv + 1 then self.need_reset_lv_list[v.end_lv+1] = true end if role_lv >= v.start_lv and role_lv <= v.end_lv then for _,vo in pairs(v.msg_list) do table_insert(chuanwen_list,vo) end end end local index = 1 local chuanwen_len = #chuanwen_list if chuanwen_len > 0 then local function onTimer( ) local cfg, scmd = {subtype = ChatModel.CHANNEL_SYSTEM} ,{} if index > chuanwen_len then index = 1 end local msg = chuanwen_list[index].msg or "" msg = Trim(msg) index = index + 1 if msg ~= "" then ChatModel:getInstance():DealWithHornSystemMsg({name = "系统", msg = msg,is_teaching = true}, true,true) GlobalEventSystem:Fire(EventName.SHOW_CHUANWEN, msg, cfg, scmd) end end self.play_learn_id = GlobalTimerQuest:AddPeriodQuest(onTimer,Config.ConfigChat.teachingTime) setTimeout(onTimer,5) end end