local BulletScreen_Model = {} local private = {} local bullet_screen_opt_pb = require('Proto.bullet_screen_opt_pb') local MyBulletTextSize = DataSheetManager.ConstData:GetDataByID("MyBulletTextSize").IntValue local OthersBulletTextSize = DataSheetManager.ConstData:GetDataByID("OthersBulletTextSize").IntValue local MyBulletColor = "#" .. DataSheetManager.ConstData:GetDataByID("MyBulletColor").StringValue local OthersBulletColor = "#" .. DataSheetManager.ConstData:GetDataByID("OthersBulletColor").StringValue local TLBulletWordNum = DataSheetManager.ConstData:GetDataByID("TLBulletWordNum").IntValue function BulletScreen_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageBulletScreenTimeLine, private.BulletScreenTimeLineResp) NetManager.RegisterMsgCB(MessageEnums.MessageGetBulletScreenTimeLine, private.GetBulletScreenTimeLineResp) private.lowSpeed = nil private.highSpeed = nil private.track = nil private.tlHistoryBulletMsg = {} end function BulletScreen_Model.OpenTLBulletScreen(timeLineId) -- 1.5.000 版本后开启弹幕功能 if GameAppInfo.IsVersionGreaterThan15000() then local data = DataSheetManager.TimeLineBulletScreen:GetDataByID(timeLineId) if data then BulletScreen_Model.SetUpdateTime(FP.tonumberV1(DataSheetManager.ConstData:GetDataByID("BulletDistanceDuration").FloatValue)) BulletScreen_Model.SetSpeed(DataSheetManager.ConstData:GetDataByID("TLBulletSpeedLow").IntValue, DataSheetManager.ConstData:GetDataByID("TLBulletSpeedHigh").IntValue) BulletScreen_Model.SetTrack(DataSheetManager.ConstData:GetDataByID("TLBulletLine").IntListValue) local msgList = {} for i, v in DataSheetManager.BulletScreenGroup:GetDataByBulletScreenGroupID_ChildID(data.BulletScreenGroupID) do local selfMsg = BulletScreen_Model.GetTLBulletMsg(timeLineId, v.ChildID) if selfMsg then for k, info in ipairs(selfMsg) do table.insert(msgList, {content = info, fontColor = MyBulletColor, fontSize = MyBulletTextSize}) end end table.insert(msgList, {content = UIUtils.GetLocalizedTxt(Const_IDS[v.IDS]), fontColor = OthersBulletColor, fontSize = OthersBulletTextSize, afterId = v.ChildID}) end --如果afterId为-1,则为在表里的所有弹幕之后发送的 local lastMsg = BulletScreen_Model.GetTLBulletMsg(timeLineId, -1) if lastMsg then for k, info in ipairs(lastMsg) do table.insert(msgList, {content = info, fontColor = MyBulletColor, fontSize = MyBulletTextSize}) end end BulletScreen_Model.OpenBulletScreen(msgList, timeLineId) if MDL.Player.GetPublicSentimentUnLock() then UIManager.OpenSpecialView(Const_UI_Lua.UIEnum.UIBulletChatPanel, {wordLimit = TLBulletWordNum}) end end end end --region 打开界面相关方法 --[[ msgList[1] = { content = string, fontColor = string("#49F9FF"), 颜色的十六进制码前边要加上#号,否则不生效 fontSize = number, } ]]-- ---@param timeLineId 如果打开TL弹幕界面需要传入,不需要则不用传入 function BulletScreen_Model.OpenBulletScreen(msgList, timeLineId) if GameAppInfo.IsVersionGreaterThan15000() then local context = { msgList = msgList, track = private.track, lowSpeed = private.lowSpeed, highSpeed = private.highSpeed, updateTime = private.updateTime, timeLineId = timeLineId, } if MDL.Player.GetPublicSentimentUnLock() then UIManager.OpenSpecialView(Const_UI_Lua.UIEnum.UIBulletScreenPanel, context) end UIManager.OpenSpecialView(Const_UI_Lua.UIEnum.UISpecialTipsPanel, nil, "Tips/UITipsPanel") end end function BulletScreen_Model.CloseBulletScreen() UIManager.CloseSpecialView(Const_UI_Lua.UIEnum.UIBulletScreenPanel) UIManager.CloseSpecialView(Const_UI_Lua.UIEnum.UISpecialTipsPanel) end function BulletScreen_Model.CloseTLBulletScreen() UIManager.CloseSpecialView(Const_UI_Lua.UIEnum.UIBulletScreenPanel) UIManager.CloseSpecialView(Const_UI_Lua.UIEnum.UIBulletChatPanel) UIManager.CloseSpecialView(Const_UI_Lua.UIEnum.UISpecialTipsPanel) end --设置弹幕的速度上下限,取这个区间随机值 --只传入lowSpeed视为一个恒定值 function BulletScreen_Model.SetSpeed(lowSpeed, highSpeed) private.lowSpeed = lowSpeed private.highSpeed = highSpeed end --设置弹幕update的时间 function BulletScreen_Model.SetUpdateTime(updateTime) private.updateTime = updateTime end --设置弹幕使用的轨道,可以直接传入一个table = {1,2,3,...} 也可以分别传入轨道 function BulletScreen_Model.SetTrack(param, ...) if type(param) == "table" then private.track = param else private.track = {} private.track[1] = param for i, v in ipairs(...) do table.insert(private.track, v) end end end --endregion function BulletScreen_Model.GetTLBulletMsg(timeLineId, afterId) if private.tlHistoryBulletMsg[timeLineId] then return private.tlHistoryBulletMsg[timeLineId][afterId] end end function private.SetTLBulletMsg(info) local timeLineId = info.timeLineId local afterId = info.param if not private.tlHistoryBulletMsg[timeLineId] then private.tlHistoryBulletMsg[timeLineId] = {} end if not private.tlHistoryBulletMsg[timeLineId][afterId] then private.tlHistoryBulletMsg[timeLineId][afterId] = {} end table.insert(private.tlHistoryBulletMsg[timeLineId][afterId], info.content) end --region 协议相关 function BulletScreen_Model.GetBulletScreenTimeLineReq(timeLineId) local isSuccess, __ = DataSheetManager.TimeLineBulletScreen:TryGetDataByID(timeLineId) if not isSuccess then return end private.tlHistoryBulletMsg[timeLineId] = {} local msg = bullet_screen_opt_pb.GetBulletScreenTimeLineReq() msg.timeLineId = timeLineId NetManager.SendMessage(MessageEnums.MessageGetBulletScreenTimeLine, msg) end function private.GetBulletScreenTimeLineResp(msgResp) if msgResp.Resp.Code == 0 then for i, v in ipairs(msgResp.info) do private.SetTLBulletMsg(v) end MDL.BulletScreen.OpenTLBulletScreen(msgResp.timeLineId) end end ---@param afterId 该弹幕后一个要播放的文本所在的表里的ID(为了标识这个弹幕出现的时机) function BulletScreen_Model.BulletScreenTimeLineReq(timeLineId, afterId, content) local msg = bullet_screen_opt_pb.BulletScreenTimeLineReq() msg.info.timeLineId = timeLineId msg.info.param = afterId msg.info.content = content NetManager.SendMessage(MessageEnums.MessageBulletScreenTimeLine, msg) end function private.BulletScreenTimeLineResp(msgResp) if msgResp.Resp.Code == 0 then local info = msgResp.info private.SetTLBulletMsg(info) CTL.BulletScreen.AddMsg({content = info.content, fontColor = MyBulletColor, fontSize = MyBulletTextSize}, 1) else local msgData = DataSheetManager.ErrorCode:GetDataByID(msgResp.Resp.Code) if msgData.type == 3 then -- IDS飘字提示 CTL.Tips.AddSpecialTipsMsg(Const_IDS[msgData.IDS]) end end end --endregion return BulletScreen_Model