359 lines
10 KiB
Lua
359 lines
10 KiB
Lua
------------------------------------------------
|
|
-- 作者: _SqL_
|
|
-- 日期: 2019-06-12
|
|
-- 文件: RoleTitleSystem.lua
|
|
-- 模块: RoleTitleSystem
|
|
-- 描述: 角色称号系统
|
|
------------------------------------------------
|
|
local TitleData = require "Logic.RoleTitle.TitleData"
|
|
local ItemContianerSystem = CS.Thousandto.Code.Logic.ItemContianerSystem
|
|
|
|
local RoleTitleSystem = {
|
|
-- 当前穿戴的称号
|
|
CurrWearTitle = nil,
|
|
-- 称号类型数据
|
|
TitleTypeData = List:New(),
|
|
-- 拥有的称号列表
|
|
CurrHaveTitleList = List:New(),
|
|
-- 称号数据
|
|
TitlesData = Dictionary:New(),
|
|
-- initialize
|
|
Initalized = false,
|
|
-- 红点
|
|
RedPoint = false,
|
|
-- 获取的新称号
|
|
NewTitleDic = Dictionary:New(),
|
|
-- 当前显示提示中的称号id
|
|
ShowTitleId = 0
|
|
}
|
|
|
|
local L_TitleTypeData = {
|
|
Type = nil,
|
|
Name = nil,
|
|
ShowRed = false
|
|
}
|
|
|
|
function RoleTitleSystem:Initialize()
|
|
local _types = List:New()
|
|
DataConfig.DataTitle:Foreach(function(k, v)
|
|
if v.CanShow >= 1 then
|
|
-- 屏蔽成就
|
|
if v.Type == 2 then
|
|
return
|
|
end
|
|
if _types:Contains(v.Type) then
|
|
self.TitlesData[v.Type]:Add(TitleData:New(v))
|
|
else
|
|
_types:Add(v.Type)
|
|
self.TitlesData[v.Type] = List:New()
|
|
self.TitlesData[v.Type]:Add(TitleData:New(v))
|
|
local _data = Utils.DeepCopy(L_TitleTypeData)
|
|
_data.Type = v.Type
|
|
_data.Name = v.TypeName
|
|
self.TitleTypeData:Add(_data)
|
|
end
|
|
end
|
|
end)
|
|
table.sort(self.TitleTypeData, function(a, b)
|
|
return a.Type < b.Type
|
|
end)
|
|
for k, v in pairs(self.TitlesData) do
|
|
table.sort(v, function(a, b)
|
|
return a.Sort < b.Sort
|
|
end)
|
|
end
|
|
|
|
-- GameCenter.RegFixEventHandle(LogicEventDefine.EVENT_ITEM_CHANGE_UPDATE, self.ItemChange, self)
|
|
end
|
|
|
|
function RoleTitleSystem:UnInitialize()
|
|
self.TitlesData:Clear()
|
|
self.TitleTypeData:Clear()
|
|
self.CurrHaveTitleList:Clear()
|
|
-- GameCenter.UnRegFixEventHandle(LogicEventDefine.EVENT_ITEM_CHANGE_UPDATE, self.ItemChange, self)
|
|
end
|
|
|
|
-- 排序
|
|
function RoleTitleSystem:SortData()
|
|
for k, v in pairs(self.TitlesData) do
|
|
table.sort(v, function(a, b)
|
|
if a.Have == b.Have then
|
|
return a.Sort < b.Sort
|
|
else
|
|
return a.Have == true
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
|
|
-- 更新称号数据
|
|
function RoleTitleSystem:UpdateTitleData(t, info)
|
|
for i = 1, #self.TitlesData[t] do
|
|
if self.TitlesData[t][i].TitleID == info.id then
|
|
self.TitlesData[t][i]:UpdateInfo(info)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 每次同步称号数据的时候 移除拥有状态
|
|
function RoleTitleSystem:Remove()
|
|
for k, v in pairs(self.TitlesData) do
|
|
for i = 1, #v do
|
|
v[i]:Remove()
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 设置穿戴的称号
|
|
function RoleTitleSystem:SetCurrTitleInfo(info)
|
|
local _cfg = DataConfig.DataTitle[info.id]
|
|
if _cfg then
|
|
self.CurrWearTitle = TitleData:New(_cfg)
|
|
self.CurrWearTitle:UpdateInfo(info)
|
|
end
|
|
end
|
|
|
|
-- 当前穿戴的称号id
|
|
function RoleTitleSystem:GetCurrTitleID()
|
|
if self.CurrWearTitle then
|
|
return self.CurrWearTitle.TitleID
|
|
else
|
|
return 0
|
|
end
|
|
end
|
|
|
|
-- 刷新角色称号在场景中的显示
|
|
function RoleTitleSystem:RefreshPlayerTitleHUD()
|
|
local _p = GameCenter.GameSceneSystem:GetLocalPlayer()
|
|
if _p then
|
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_HUD_UPDATE_HEADINFO, _p)
|
|
end
|
|
end
|
|
|
|
-- 检测称号物品是否自动使用
|
|
function RoleTitleSystem:CheckTitleItemUse(titleId)
|
|
if not self.Initalized then
|
|
return false
|
|
end
|
|
local _cfg = DataConfig.DataTitle[titleId]
|
|
if _cfg then
|
|
if _cfg.CanShow >= 1 and _cfg.Activation == 1 then
|
|
if self.CurrHaveTitleList:Contains(titleId) then
|
|
return false
|
|
else
|
|
return true
|
|
end
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
-- 使用称号物品
|
|
function RoleTitleSystem:ItemChange(obj, sender)
|
|
-- if obj then
|
|
-- local _items = GameCenter.ItemContianerSystem:GetItemListByCfgidNOGC(ContainerType.ITEM_LOCATION_BAG, obj)
|
|
-- if _items.Count > 0 and _items[0].Type == ItemType.Title then
|
|
-- self:SetRoleTitleRedPoint()
|
|
-- end
|
|
-- end
|
|
end
|
|
|
|
-- 获取称号info
|
|
function RoleTitleSystem:GetTitleInfo(titleType, id)
|
|
for i = 1, #self.TitlesData[titleType] do
|
|
if self.TitlesData[titleType][i].TitleID == id then
|
|
return self.TitlesData[titleType][i]
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
-- 称号红点
|
|
function RoleTitleSystem:ShowRed()
|
|
return self.RedPoint
|
|
end
|
|
|
|
-- 设置称号红点
|
|
function RoleTitleSystem:SetRoleTitleRedPoint()
|
|
GameCenter.RedPointSystem:CleraFuncCondition(FunctionStartIdCode.RoleTitle)
|
|
local _num = 0
|
|
for i = 1, #self.TitleTypeData do
|
|
local _red = self:CheckRedPoint(self.TitleTypeData[i].Type)
|
|
self.TitleTypeData[i].ShowRed = _red
|
|
if _red then
|
|
_num = _num + 1
|
|
end
|
|
end
|
|
self.RedPoint = _num > 0
|
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_TITLE_REDPOINT)
|
|
GameCenter.MainFunctionSystem:SetAlertFlag(FunctionStartIdCode.RoleTitle, self.RedPoint)
|
|
end
|
|
|
|
-- 检测红点
|
|
function RoleTitleSystem:CheckRedPoint(t)
|
|
local _num = 0
|
|
for i = 1, self.TitlesData[t]:Count() do
|
|
local _info = self.TitlesData[t][i]
|
|
local _items = GameCenter.ItemContianerSystem:GetItemListByCfgidNOGC(ContainerType.ITEM_LOCATION_BAG, _info.TitleID)
|
|
self.TitlesData[t][i].ShowRed = _items.Count > 0 and (not _info.Have) and _items[0].Type == ItemType.Title
|
|
if self.TitlesData[t][i].ShowRed then
|
|
_num = _num + 1
|
|
end
|
|
end
|
|
return _num > 0
|
|
end
|
|
|
|
-----------------------msg----------------------
|
|
-- 请求激活称号
|
|
function RoleTitleSystem:ReqActiveTitle(id)
|
|
local _req = {}
|
|
_req.id = id
|
|
GameCenter.Network.Send("MSG_Title.ReqActiveTitle", _req)
|
|
end
|
|
|
|
-- 穿戴称号
|
|
function RoleTitleSystem:ReqWearTitle(id)
|
|
local _req = {}
|
|
_req.id = id
|
|
GameCenter.Network.Send("MSG_Title.ReqWearTitle", _req)
|
|
end
|
|
|
|
-- 卸下称号
|
|
function RoleTitleSystem:ReqDownTitle(id)
|
|
local _req = {}
|
|
_req.id = id
|
|
GameCenter.Network.Send("MSG_Title.ReqDownTitle", _req)
|
|
end
|
|
|
|
-- 获取需要隐藏的
|
|
function RoleTitleSystem:GetNeedHideTitleList()
|
|
local _count = self.CurrHaveTitleList:Count();
|
|
if _count > 0 then
|
|
local _cfg = DataConfig.DataTitle;
|
|
local _list = nil;
|
|
for i = 1, _count do
|
|
local _cfgItem = _cfg[self.CurrHaveTitleList[i]];
|
|
if _cfgItem.CanShow > 1 then
|
|
if not _list then
|
|
_list = List:New();
|
|
end
|
|
_list:Add(_cfgItem.CanShow);
|
|
end
|
|
end
|
|
return _list;
|
|
end
|
|
end
|
|
|
|
-- 是否有新获得到称号
|
|
function RoleTitleSystem:IsHaveGetNewByBigType(bigType)
|
|
local _keys = self.NewTitleDic:GetKeys();
|
|
if _keys and #_keys > 0 then
|
|
for i = 1, #_keys do
|
|
if self.NewTitleDic[_keys[i]].Type == bigType then
|
|
return true;
|
|
end
|
|
end
|
|
end
|
|
return false;
|
|
end
|
|
|
|
-- 是否是新获得到称号
|
|
function RoleTitleSystem:IsGetNewTitle(id)
|
|
return self.NewTitleDic:ContainsKey(id);
|
|
end
|
|
|
|
-- 是否是新获得到称号
|
|
function RoleTitleSystem:RemoveNewTitle(id)
|
|
if self.NewTitleDic:ContainsKey(id) then
|
|
self.NewTitleDic:Remove(id);
|
|
end
|
|
end
|
|
|
|
-- 激活称号返回
|
|
function RoleTitleSystem:GS2U_ResActiveTitle(msg)
|
|
if msg.info then
|
|
local _cfg = DataConfig.DataTitle[msg.info.id]
|
|
if _cfg and _cfg.CanShow >= 1 then
|
|
self.ShowTitleId = msg.info.id
|
|
self.NewTitleDic[msg.info.id] = _cfg
|
|
if not self.CurrHaveTitleList:Contains(msg.info.id) then
|
|
self.CurrHaveTitleList:Add(msg.info.id)
|
|
end
|
|
self:UpdateTitleData(_cfg.Type, msg.info)
|
|
local _info = TitleData:New(_cfg)
|
|
_info:UpdateInfo(msg.info)
|
|
self:SetRoleTitleRedPoint()
|
|
self:SortData()
|
|
-- 暂时屏蔽
|
|
-- if self.CurrWearTitle then
|
|
-- if self.CurrWearTitle.Level < _cfg.Quality then
|
|
-- self:ReqWearTitle(msg.info.id)
|
|
-- else
|
|
-- if self.CurrWearTitle.TitleID == _info.TitleID then
|
|
-- self.CurrWearTitle = _info
|
|
-- end
|
|
-- GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_TITLE_REFRESH_TITLESTATE)
|
|
-- end
|
|
-- else
|
|
-- self:ReqWearTitle(msg.info.id)
|
|
-- end
|
|
if _cfg.IsAutoWear == 1 then
|
|
GameCenter.PushFixEvent(UILuaEventDefine.UITitleTipsForm_OPEN);
|
|
GameCenter.PushFixEvent(UILuaEventDefine.UITitleTipsForm_Refresh);
|
|
end
|
|
GameCenter.PushFixEvent(LogicLuaEventDefine.EID_EVENT_TITLE_REFRESH_MARRIAGE_USE)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 穿戴称号返回
|
|
function RoleTitleSystem:GS2U_ResWearTitle(msg)
|
|
if msg.info and msg.info.id ~= 0 then
|
|
self:SetCurrTitleInfo(msg.info)
|
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_TITLE_REFRESH_TITLESTATE)
|
|
Utils.ShowPromptByEnum("WearTitle", self.CurrWearTitle.TitleName)
|
|
end
|
|
end
|
|
|
|
-- 卸下称号返回
|
|
function RoleTitleSystem:GS2U_ResDownTitle(msg)
|
|
if msg.id == self.CurrWearTitle.TitleID then
|
|
Utils.ShowPromptByEnum("TakeOffTitle", self.CurrWearTitle.TitleName)
|
|
self.CurrWearTitle = nil
|
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_TITLE_REFRESH_TITLESTATE)
|
|
end
|
|
end
|
|
|
|
-- 称号数据,上线发送
|
|
function RoleTitleSystem:GS2U_ResTitleInfo(msg)
|
|
if msg.wear then
|
|
if msg.wear.id ~= 0 then
|
|
self:SetCurrTitleInfo(msg.wear)
|
|
self:RefreshPlayerTitleHUD()
|
|
end
|
|
end
|
|
if msg.list then
|
|
self:Remove()
|
|
self.CurrHaveTitleList:Clear()
|
|
for i = 1, #msg.list do
|
|
self.CurrHaveTitleList:Add(msg.list[i].id)
|
|
local _cfg = DataConfig.DataTitle[msg.list[i].id]
|
|
if _cfg then
|
|
self:UpdateTitleData(_cfg.Type, msg.list[i])
|
|
end
|
|
end
|
|
else
|
|
self:Remove()
|
|
self.CurrHaveTitleList:Clear()
|
|
end
|
|
self:SortData()
|
|
self.Initalized = true
|
|
self:SetRoleTitleRedPoint()
|
|
-- 移除称号 刷新称号列表
|
|
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_TITLE_REFRESH_TITLESTATE)
|
|
end
|
|
|
|
return RoleTitleSystem
|