源战役客户端
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 

502 行
16 KiB

CSGWarModel = CSGWarModel or BaseClass(BaseVo)
local table_insert = table.insert
function CSGWarModel:__init()
CSGWarModel.Instance = self
self:InitCSGWarCityCFG()
-- self:InitCSGWarKVCFG()
self:Reset()
end
function CSGWarModel:Reset()
self.CSGWar_base_info = {}--活动基础信息
self.CSGWar_occupy_info = {}--占领信息 结算之后才会有的
self.CSGWar_sign_info = {}--帮战参赛信息-报名阶段和活动进行中
self.CSGWar_guild_sign_list = {}--社团报名榜
self.CSGWar_support_sign_list = {}--外援报名榜
self.CSGWar_city_info = {}--场景城池信息
self.CSGWar_result_info = {}--结算信息
self.CSGWar_group_info = {}--社团分组信息
self.CSGWar_fight_guild_info = {} --本阵营参战公会id表
self.CSGWar_support_info = {} --应援信息表
self.CSGWar_record_info = {}--日志信息
self.CSGWar_overlord_info = {}--霸主限购信息
self.my_support_num = 0--我的应援次数
self.free_support_num = 0--我的免费应援次数
self.is_CSGWar_sign = false--是否已经报名了
self.support_view_toggle = false
self.has_open_csgwar_view = false--是否已经开过界面了
self.start_wait_info = true
self.wait_list = {}
self.CSGWar_red_data = {}--缓存红点数据
self.CSGWar_activity_tip_open_data = {}--缓存邀请函打开记录,报名,声援,开战在活动期间只弹一次
end
function CSGWarModel:GetInstance()
if CSGWarModel.Instance == nil then
CSGWarModel.Instance = CSGWarModel.New()
end
return CSGWarModel.Instance
end
function CSGWarModel:getInstance()
if CSGWarModel.Instance == nil then
CSGWarModel.Instance = CSGWarModel.New()
end
return CSGWarModel.Instance
end
--场景城区配置
function CSGWarModel:InitCSGWarCityCFG( )
local cfg = Config.Crossguildwarscene
for i,v in ipairs(cfg) do
v.city_pos = stringtotable(v.flag)
v.monster_pos = stringtotable(v.mon_list)
end
end
--常量配置
function CSGWarModel:InitCSGWarKVCFG( )
self.CSGWar_kv_cfg = {}
local cfg = Config.Crossguildwarconfig
for i,v in pairs(cfg) do
self.CSGWar_kv_cfg[Trim(v.key)] = v
end
end
function CSGWarModel:GetCSGWarKVCFG( key )
if not self.CSGWar_kv_cfg then
self:InitCSGWarKVCFG()
end
return self.CSGWar_kv_cfg[key]
end
function CSGWarModel:SetCSGWarBaseInfo( vo )
self.CSGWar_base_info = vo
self:ChangeVar("CSGWar_base_info", self.CSGWar_base_info, false, true)
end
function CSGWarModel:GetCSGWarBaseInfo( )
return self.CSGWar_base_info
end
function CSGWarModel:SetCSGWarOccupyInfo( vo )
local data = {}
for ii,vv in ipairs(vo.city_list) do
data[vv.city_id] = vv
end
self.CSGWar_occupy_info = data
self:ChangeVar("CSGWar_occupy_info", self.CSGWar_occupy_info, false, true)
end
function CSGWarModel:GetCSGWarOccupyInfo()
return self.CSGWar_occupy_info
end
function CSGWarModel:SetCSGWarSignInfo( vo )
local country = KfWorldModel:GetInstance():GetMyCountryId()
self.CSGWar_fight_guild_info = {}
self.is_CSGWar_sign = vo.is_sign_up == 1
self.last_sign_time = vo.last_sign
local data = {}
for ii,vv in ipairs(vo.guild_list) do
data[vv.fact_id] = vv
if vv.fact_id == country then
self.CSGWar_fight_guild_info[vv.guild_id] = true
end
end
self.CSGWar_sign_info = data
self:ChangeVar("CSGWar_sign_info", self.CSGWar_sign_info, false, true)
end
function CSGWarModel:GetCSGWarSignInfo( index )
return self.CSGWar_sign_info
end
function CSGWarModel:IsCSGWarSign( )
return self.is_CSGWar_sign
end
function CSGWarModel:GetLastSignTime( )
return self.last_sign_time or 0
end
--社团报名榜
function CSGWarModel:SetCSGWarGuildSignList( vo )
self.CSGWar_guild_sign_list = vo.rank_list
self:Fire(CSGWarConst.UPDATE_CSGWAR_SIGN_LIST)
end
function CSGWarModel:GetCSGWarGuildSignList( )
return self.CSGWar_guild_sign_list
end
--外援报名榜
function CSGWarModel:SetCSGWarSupportSignList( vo )
self.CSGWar_support_sign_list = vo.rank_list
self:Fire(CSGWarConst.UPDATE_CSGWAR_SIGN_LIST)
end
function CSGWarModel:GetCSGWarSupportSignList( )
return self.CSGWar_support_sign_list
end
function CSGWarModel:SetCSGWarCityInfo( vo )
local data = {}
for i,v in ipairs(vo) do
data[v.city_id] = v
end
self.CSGWar_city_info = data
self:Fire(CSGWarConst.UPDATE_CSGWAR_CITY_INFO)
end
function CSGWarModel:GetCSGWarCityInfo( )
return self.CSGWar_city_info
end
function CSGWarModel:SetCSGWarResultInfo( vo )
self.CSGWar_result_info = vo
self:ChangeVar("CSGWar_result_info", self.CSGWar_result_info, false, true)
end
function CSGWarModel:GetCSGWarResultInfo( )
return self.CSGWar_result_info
end
--是否在活动中
function CSGWarModel:IsCSGWarOpen( )
local bool = false
if self.CSGWar_base_info then
bool = self.CSGWar_base_info.switch == 1 and self.CSGWar_base_info.state == CSGWarConst.CSGWAR_STATE.START
or self.CSGWar_base_info.state == CSGWarConst.CSGWAR_STATE.SIGN
or self.CSGWar_base_info.state == CSGWarConst.CSGWAR_STATE.SUPPORT
end
return bool
end
--阵营分组信息
function CSGWarModel:SetCSGWarCountryInfo( vo )
for i,v in ipairs(vo) do
if not self.CSGWar_group_info[v.group] then
self.CSGWar_group_info[v.group] = {}
end
self.CSGWar_group_info[v.group][v.guild_id] = v
end
end
--通过帮派id获取阵营
function CSGWarModel:GetCountryIdByGuildId( guild_id )
for i,v in pairs(self.CSGWar_group_info) do
if v[guild_id] then
return i
end
end
return 0
end
--根据帮派id获取是否是参战的公会
function CSGWarModel:IsCSGWarFightGuild( guild_id )
return self.CSGWar_fight_guild_info[guild_id] or false
end
--设置应援列表
function CSGWarModel:SetCSGWarSupportInfo( vo )
self.my_support_num = vo.cur_help_num
self.free_support_num = vo.free_help_num
local all_support_num = 0
if not self.CSGWar_support_info then
self.CSGWar_support_info = {}
end
local data = {}
for i,v in ipairs(vo.help_list) do
data[v.fact_id] = v
all_support_num = all_support_num + v.help_num
end
self.CSGWar_support_info = data
self.all_support_num = all_support_num
self.CSGWar_support_info.all_support_num = all_support_num
self:ChangeVar("CSGWar_support_info", self.CSGWar_support_info, false, true)
end
function CSGWarModel:GetCSGWarSupportInfo( )
return self.CSGWar_support_info or {}
end
function CSGWarModel:GetMySupportNum( )
return self.my_support_num
end
function CSGWarModel:GetMyFreeSupportNum( )
return self.free_support_num
end
function CSGWarModel:SetCSGWarRecordInfo( vo )
local data = {}
local temp_data = {}
local temp_city = {}
for i,v in ipairs(vo.logs) do
temp_data = {
time = v.time,
}
temp_city = {}
for iii,vvv in ipairs(v.city_list) do
temp_city[vvv.city_id] = vvv
end
temp_data.city_list = DeepCopy(temp_city)
data[#data+1] = DeepCopy(temp_data)
end
self.CSGWar_record_info = data
self:ChangeVar("CSGWar_record_info", self.CSGWar_record_info, false, true)
end
function CSGWarModel:GetCSGWarRecordInfo( )
return self.CSGWar_record_info
end
function CSGWarModel:IsCSGWarNeedRed( )
local bool = false
local base_data = self:GetCSGWarBaseInfo()
--没有打开过界面报名期间就有红点
self.CSGWar_red_data.one_red = false
if base_data and TableSize(base_data) > 0 and base_data.state == CSGWarConst.CSGWAR_STATE.SIGN and base_data.switch == 1 then
if not self.has_open_csgwar_view then
if not self:IsCSGWarSignPlayer() then
bool = true
self.CSGWar_red_data.one_red = true
end
end
end
--有免费应援次数也有红点
self.CSGWar_red_data.support_red = false
if base_data and TableSize(base_data) > 0 and base_data.state == CSGWarConst.CSGWAR_STATE.SUPPORT and base_data.switch == 1 then
bool = bool or self:GetMyFreeSupportNum() > 0
self.CSGWar_red_data.support_red = self:GetMyFreeSupportNum() > 0
end
--战场开启,可以进的玩家有红点
self.CSGWar_red_data.fight_red = false
if base_data and TableSize(base_data) > 0 and base_data.state == CSGWarConst.CSGWAR_STATE.START and base_data.switch == 1 then
bool = bool or self:IsCSGWarSignPlayer()
self.CSGWar_red_data.fight_red = self:IsCSGWarSignPlayer()
end
--日常占领奖励可领取红点
--可领取的时机为不是报名和不是开打阶段
local occupy_red_data = {}
self.CSGWar_red_data.occupy_red = false
if base_data and TableSize(base_data) > 0 and (base_data.state == CSGWarConst.CSGWAR_STATE.IDLE or base_data.state == CSGWarConst.CSGWAR_STATE.END) and base_data.switch == 1 then
local data = self:GetCSGWarOccupyInfo()
local server_id = RoleManager.Instance.mainRoleInfo.server_id
for i,v in pairs(data) do
if server_id == v.server_id and v.is_received_reward == 0 then
bool = true
occupy_red_data[v.city_id] = true
self.CSGWar_red_data.occupy_red = true
end
end
end
self.CSGWar_red_data.occupy_red_data = occupy_red_data
self:Fire(CSGWarConst.ANS_CSGWAR_RED)
return bool
end
function CSGWarModel:GetCSGWarRedData( )
return self.CSGWar_red_data
end
--是否是参战玩家
function CSGWarModel:IsCSGWarSignPlayer( )
return self.is_CSGWar_sign
end
--判断是否可以弹邀请函
function CSGWarModel:CheckCanOpenCSGWarTip( )
local base_data = self:GetCSGWarBaseInfo()
if self:IsCSGWarSignPlayer() and TableSize(base_data) > 0 and base_data.state == CSGWarConst.CSGWAR_STATE.START and base_data.switch == 1 then
if not self.CSGWar_activity_tip_open_data[CSGWarConst.CSGWAR_STATE.START] then
GlobalEventSystem:Fire(EventName.OPEN_ACITVITY_TIP,601,nil,true)
self.CSGWar_activity_tip_open_data[CSGWarConst.CSGWAR_STATE.START] = true
end
end
end
--等待协议数据
function CSGWarModel:SetCSGWarWaitInfo( scmd_num )
self.wait_list[scmd_num] = true
if self.start_wait_info and self.wait_list[60100] and self.wait_list[60102] then
self.start_wait_info = false
self:CheckCanOpenCSGWarTip()
end
end
function CSGWarModel:SetCSGWarOverlordInfo( vo )
self.CSGWar_overlord_info = vo
end
function CSGWarModel:GetCSGWarOverlordInfo( )
return self.CSGWar_overlord_info
end
----------公示相关-start---------
-- 通过活动日历判断是否需要展示公示界面
function CSGWarModel:NeedShowCSGWarResult()
-- 要满足跨服
local cur_stage = KfWorldModel:GetInstance():GetCurStage( )
if cur_stage < 2 then
return false
end
-- 要有占领数据
if TableSize(self:GetCSGWarOccupyInfo()) <= 0 then
return false
end
-- 要满足开服/跨服天数
local act_cfg = Config.Ac["601@0@1"]
local act_cfg_merge = Config.Ac["601@0@2"]
local open_day = ServerTimeModel:getInstance():GetOpenServerDay()
local merge_day = ServerTimeModel:getInstance():GetMergeServerDay()
local openDay_limit = tonumber(stringtotable(act_cfg.open_day)[1][1])
local mergeDay_limt = tonumber(stringtotable(act_cfg_merge.merge_day)[1][1])
-- 有合服 且合服天数小于等于限制条件则不显示
if mergeDay_limt and merge_day > 0 and merge_day < mergeDay_limt then
return false
-- 有开服限制 且开服天数小于等于限制条件则不显示
elseif openDay_limit and open_day > 0 and open_day < openDay_limit then
return false
end
local act_end_week = stringtotable(act_cfg.week)[1] -- 活动结束是周几
local act_end_time = stringtotable(act_cfg.time_region)[1][2] -- 活动结束时间(时分)
local act_open_hour = tonumber(act_end_time[1])
local act_open_min = tonumber(act_end_time[2])
local show_time = 24 * 3600 * self:GetCSGWarKVCFG( "public_time" ).value -- 公示持续时间 3天
local show_end_time = false -- 展示结束时间
local key_time -- 刚满足开服时间的那一天的时间戳
if mergeDay_limt and merge_day > 0 then
key_time = ServerTimeModel:getInstance():GetMergeServerTime() + (mergeDay_limt - 1) * 3600 * 24
else
key_time = ServerTimeModel:getInstance():GetOpenServerTime() + (openDay_limit - 1) * 3600 * 24
end
local act_first_open_time = self:GetNextWeekDayTime( act_end_week, key_time, act_open_hour, act_open_min, 0)
local cur_time = TimeUtil:getServerTime()
-- 当前时间在开服后第一次开活动的时间内 (特殊判断第一个满足的周N )
show_end_time = act_first_open_time + show_time
--print('=======Msh:CSGWarModel.lua[359] =======', TimeUtil:timeConversion(key_time, 'mm-dd hh:MM:ss'))
--print('=======Msh:CSGWarModel.lua[359] =======', TimeUtil:timeConversion(act_first_open_time, 'mm-dd hh:MM:ss'))
--print('=======Msh:CSGWarModel.lua[359] =======', TimeUtil:timeConversion(show_end_time, 'mm-dd hh:MM:ss'))
if cur_time <= show_end_time then
if cur_time >= act_first_open_time then
return true, show_end_time
else
--print('=======Msh:CSGWarModel.lua[363] =======', data)
return false
end
end
-- 正常的自然周判断
local last_open_time = self:GetLastWeekDayTime( act_end_week, cur_time, act_open_hour, act_open_min, 0)
show_end_time = last_open_time + show_time
if cur_time <= show_end_time and cur_time > last_open_time then
return true, show_end_time
else
--print('=======Msh:CSGWarModel.lua[373] =======', data)
return false
end
end
-- 传入时间time得到 该时间的【上一个周几week】 的 【hour点min分sec秒】 的时间戳
function CSGWarModel:GetLastWeekDayTime( week, t_time, hour, min, sec )
local t_time = t_time or TimeUtil:getServerTime()
local date = os.date("*t", t_time)
local date_n = {
year = date.year,
month = date.month,
day = date.day,
hour = hour or 0,
min = min or 0,
sec = sec or 0,
}
local cur_time = os.time(date_n)
local cur_week_day = tonumber(os.date("%w", cur_time)) -- 今天周几
cur_week_day = cur_week_day == 0 and 7 or cur_week_day
local offset_day = self:GetLastOrNextWeekOffset( cur_week_day, week, true)
local one_day_sec = 24 * 60 * 60
local target_time = cur_time - offset_day * one_day_sec
if t_time - target_time >= 7 * one_day_sec and cur_week_day == tonumber(week) then -- 两个时间的间隔超过七天(不合理)
-- 特殊判断临界值的情况
return cur_time
end
return target_time
end
-- 传入时间time得到 该时间的【下一个周几week】 的 【hour点min分sec秒】 的时间戳
function CSGWarModel:GetNextWeekDayTime( week, t_time, hour, min, sec)
local t_time = t_time or TimeUtil:getServerTime()
local date = os.date("*t", t_time)
local date_n = {
year = date.year,
month = date.month,
day = date.day,
hour = hour or 0,
min = min or 0,
sec = sec or 0,
}
local cur_time = os.time(date_n)
local cur_week_day = tonumber(os.date("%w", cur_time)) -- 今天周几
cur_week_day = cur_week_day == 0 and 7 or cur_week_day
if cur_week_day == tonumber(week) then
return cur_time
end
local offset_day = self:GetLastOrNextWeekOffset( cur_week_day, week)
local target_time = cur_time + offset_day * 24 * 60 * 60
return target_time
end
-- 当前周cur_week_day 与 获取的下一个 或 上一个 周week 的相差的天数
function CSGWarModel:GetLastOrNextWeekOffset( cur_week_day, week, is_last)
if is_last then -- 上一个周几
if week < cur_week_day then
return cur_week_day - week
else
return cur_week_day + 7 - week
end
else -- 下一个周几
if cur_week_day < week then
return week - cur_week_day
else
return week + 7 - cur_week_day
end
end
end
-- 获取公示的红点
function CSGWarModel:GetShowIconRed( )
-- 占领奖励红点
local bool1 = false
local red_data = self:GetCSGWarRedData()
if red_data.occupy_red then
bool1 = true
end
-- 每天首次登陆红点
local bool2 = self:GetLoginRed( )
return bool1 or bool2
end
-- 每天首次登陆红点cookie
function CSGWarModel:SetLoginCookie( bool )
CookieWrapper.Instance:SaveCookie(CookieLevelType.Account,
CookieTimeType.TYPE_DAY2, CookieKey.CSGWAR_SHOW_ICON_LOGIN_RED, bool)
CookieWrapper.Instance:WriteAll()
end
function CSGWarModel:GetLoginRed( )
local today_has_show = CookieWrapper.Instance:GetCookie(CookieLevelType.Account,
CookieKey.CSGWAR_SHOW_ICON_LOGIN_RED)
return not today_has_show
end
function CSGWarModel:SetLoginRed( bool )
if bool == false then
self:SetLoginCookie( true )
self:UpdateShowIconRed( )
end
end
-- 刷新公示图标红点
function CSGWarModel:UpdateShowIconRed( )
local bool = self:GetShowIconRed( )
GlobalEventSystem:Fire(ActivityIconManager.UPDATE_ICON_TIPS, 60101, bool)
end
----------公示相关-end-----------