SandTableModel = SandTableModel or BaseClass(BaseVo, true)
|
|
local SandTableModel = SandTableModel
|
|
|
|
function SandTableModel:__init()
|
|
SandTableModel.Instance = self
|
|
self:Reset()
|
|
end
|
|
|
|
function SandTableModel:Reset()
|
|
-------------------------
|
|
self.point_match_temp = false--据点配置里的具体id配置对应的索引
|
|
-------------------------
|
|
self.act_info = false
|
|
self.point_date_list = {}--据点信息
|
|
self.buff_info = {}--buff信息列表
|
|
self.self_rank_info = {}--战功榜
|
|
self.dungeon_info = false
|
|
self.self_active_buff = {}--激活的buff
|
|
self.fight_rank_data = false
|
|
self.dungeon_cost_id = 100018--副本体力id
|
|
-------------------------
|
|
self.red_point_reward = {}
|
|
self.red_can_fight = false
|
|
end
|
|
|
|
function SandTableModel:getInstance()
|
|
if SandTableModel.Instance == nil then
|
|
SandTableModel.Instance = SandTableModel.New()
|
|
end
|
|
return SandTableModel.Instance
|
|
end
|
|
|
|
--获取据点配置
|
|
function SandTableModel:GetPointCfg( point_id )
|
|
if not point_id then return end
|
|
if not self.point_match_temp then
|
|
self.point_match_temp = {}
|
|
for k,v in pairs(Config.Crosspointfightpoint) do
|
|
self.point_match_temp[v.point_id] = k
|
|
end
|
|
end
|
|
local conf = false
|
|
if self.point_match_temp[point_id] then
|
|
conf = Config.Crosspointfightpoint[self.point_match_temp[point_id]]
|
|
elseif SandTableConst.PointList[SandTableConst.PointShow.MainCity][point_id] then
|
|
--主城
|
|
elseif SandTableConst.PointList[SandTableConst.PointShow.DoorPoint][point_id] then
|
|
--关口
|
|
end
|
|
return conf
|
|
end
|
|
|
|
--根据副本id获得据点类型
|
|
function SandTableModel:GetPointTypeByDunId( dun_id )
|
|
local dun_id = dun_id or SceneManager.Instance:GetCurrDunId()
|
|
for k,v in pairs(Config.Crosspointfightpoint) do
|
|
if v.dun_id == dun_id then
|
|
return v.type
|
|
end
|
|
end
|
|
end
|
|
|
|
--据点活动状态
|
|
function SandTableModel:GetActInfo( )
|
|
return self.act_info
|
|
end
|
|
function SandTableModel:SetActInfo( value )
|
|
self.act_info = value
|
|
end
|
|
|
|
--获得自己的阵营
|
|
function SandTableModel:GetFaction( )
|
|
local act_info = self:GetActInfo()
|
|
return act_info and act_info.faction or 0
|
|
end
|
|
|
|
--据点信息
|
|
function SandTableModel:GetPointDateList( point_id )
|
|
if point_id then
|
|
return self.point_date_list[point_id]
|
|
else
|
|
return self.point_date_list
|
|
end
|
|
end
|
|
function SandTableModel:SetPointDateList( value,is_reset )
|
|
if is_reset then
|
|
self.point_date_list = {}
|
|
end
|
|
local function sort_call( a,b )
|
|
--从大到小
|
|
return a.score > b.score
|
|
end
|
|
for k,v in pairs(value) do
|
|
table.sort( v.attack_info, sort_call )
|
|
self.point_date_list[v.point_id] = v
|
|
end
|
|
end
|
|
|
|
--buff信息
|
|
function SandTableModel:GetBuffInfo( )
|
|
return self.buff_info
|
|
end
|
|
function SandTableModel:SetBuffInfo( value )
|
|
self.buff_info = value or {}
|
|
end
|
|
|
|
function SandTableModel:GetBuffListByFaction( faction )
|
|
if not faction then return {} end
|
|
local list = {}
|
|
for k,v in pairs(self:GetBuffInfo( )) do
|
|
if v.faction == faction then
|
|
table.insert(list,v)
|
|
end
|
|
end
|
|
return list
|
|
end
|
|
|
|
--获得buff归属国
|
|
function SandTableModel:GetBuffFaction( point_id )
|
|
local buff_list = self:GetBuffInfo( )
|
|
for k,v in pairs(buff_list or {}) do
|
|
if point_id == v.point_id then
|
|
return v.faction
|
|
end
|
|
end
|
|
return 0
|
|
end
|
|
|
|
--副本内信息
|
|
function SandTableModel:GetDungeonInfo( )
|
|
return self.dungeon_info
|
|
end
|
|
function SandTableModel:SetDungeonInfo( value )
|
|
self.dungeon_info = value
|
|
end
|
|
|
|
--[[--战功榜
|
|
function SandTableModel:GetSelfRankInfo( )
|
|
return self.self_rank_info
|
|
end
|
|
function SandTableModel:SetSelfRankInfo( value )
|
|
self.self_rank_info = value
|
|
end
|
|
--]]
|
|
|
|
function SandTableModel:GetRedDot( need_new )
|
|
local bool_fight = self:CanFightRed( need_new )
|
|
local bool_sandtable = self:CanPointReward( need_new )
|
|
local csgwar_red_data = CSGWarModel:getInstance():GetCSGWarRedData()
|
|
local csgwar_red = csgwar_red_data.one_red or csgwar_red_data.support_red or csgwar_red_data.fight_red or csgwar_red_data.occupy_red
|
|
return bool_sandtable or csgwar_red or bool_fight
|
|
end
|
|
|
|
function SandTableModel:CanPointReward( need_new )
|
|
if need_new then
|
|
self.red_point_reward = {}
|
|
local point_list = self:GetPointDateList() or {}
|
|
for k,v in pairs(point_list) do
|
|
self:CanPointRewardByPointId( true, v.point_id )
|
|
end
|
|
end
|
|
for k,v in pairs(self.red_point_reward) do
|
|
if v == true then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
--是否可以获得节点奖励
|
|
function SandTableModel:CanPointRewardByPointId( need_new, point_id )
|
|
if not point_id then return false end
|
|
if need_new then
|
|
self.red_point_reward[point_id] = false
|
|
local server_data = self:GetPointDateList( point_id )
|
|
local cfg = self:GetPointCfg( point_id )
|
|
if server_data and cfg then
|
|
self.red_point_reward[point_id] = (server_data.award_time > 0) and ((TimeUtil:getServerTime() - server_data.award_time) >= cfg.interval_time)
|
|
end
|
|
end
|
|
return self.red_point_reward[point_id] or false
|
|
end
|
|
|
|
--可挑战红点
|
|
function SandTableModel:CanFightRed( need_new )
|
|
if need_new then
|
|
self.red_can_fight = false
|
|
local cur_num = CSMainModel:getInstance():GetCSMainArmsNum( ) or 0
|
|
local can_fight = false
|
|
local cost_info = false
|
|
for k,v in pairs(Config.Crosspointfightpoint) do
|
|
can_fight = self:GetPointCanFight(v.point_id)
|
|
if can_fight then
|
|
cost_info = stringtotable(v.cost)[1]
|
|
if cur_num >= cost_info[3] then
|
|
self.red_can_fight = true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return self.red_can_fight
|
|
end
|
|
|
|
--获得buff下次激活时间
|
|
function SandTableModel:GetBuffNextTime( curTime )
|
|
local buff_time_conf = self:GetBuffTimeConf( )
|
|
local curTime = curTime or TimeUtil:getServerTime()
|
|
-------------------------
|
|
local function check_call( curTime, index )
|
|
--index 第几次运算,如果不是第一次,那么就要回到那天的起点
|
|
local time_tb = os.date("*t", curTime)
|
|
if index > 0 then
|
|
time_tb.hour = 0
|
|
time_tb.min = 0
|
|
time_tb.sec = 0
|
|
end
|
|
local week_day = time_tb.wday - 1
|
|
week_day = week_day == 0 and 7 or week_day
|
|
if week_day == buff_time_conf[1] then
|
|
if (time_tb.hour < buff_time_conf[2][1]) or (time_tb.hour == buff_time_conf[2][1] and time_tb.min < buff_time_conf[2][2]) then
|
|
time_tb.hour = buff_time_conf[2][1]
|
|
time_tb.min = buff_time_conf[2][2]
|
|
return os.time(time_tb)
|
|
end
|
|
end
|
|
end
|
|
local result = false
|
|
for i=0,7 do
|
|
result = check_call( curTime + 86400 * i, i )
|
|
if result then
|
|
return result
|
|
end
|
|
end
|
|
end
|
|
|
|
--获得buff上次时间
|
|
function SandTableModel:GetBuffLastTime( )
|
|
local buff_time_conf = self:GetBuffTimeConf( )
|
|
local curTime = TimeUtil:getServerTime() - buff_time_conf[3]
|
|
return self:GetBuffNextTime( curTime )
|
|
end
|
|
|
|
--获得buff时间配置
|
|
function SandTableModel:GetBuffTimeConf( )
|
|
self.buff_time_conf = self.buff_time_conf or stringtotable(Config.Crosspointfightkv["buff_time"].value_content)
|
|
return self.buff_time_conf
|
|
end
|
|
|
|
--获得据点的buff配置
|
|
function SandTableModel:GetBuffSkillIdByPoint( point_id )
|
|
local point_conf = self:GetPointCfg( point_id )
|
|
if not point_conf then return end
|
|
return point_conf.buff
|
|
end
|
|
|
|
--根据据点id获得阵营
|
|
function SandTableModel:GetFactionByCityPoint( city_point_id )
|
|
return math.floor(city_point_id / 1000)
|
|
end
|
|
|
|
function SandTableModel:GetFactionByPoint( point )
|
|
if SandTableConst.PointList[SandTableConst.PointShow.MainCity][point] then
|
|
return self:GetFactionByCityPoint( point )
|
|
else
|
|
local data = self:GetPointDateList( point )
|
|
if data then
|
|
return data.faction
|
|
else
|
|
return 0
|
|
end
|
|
end
|
|
end
|
|
|
|
--当前本国已激活的buff
|
|
function SandTableModel:GetSelfActiveBuff( )
|
|
return self.self_active_buff or {}
|
|
end
|
|
function SandTableModel:SetSelfActiveBuff( value )
|
|
self.self_active_buff = value
|
|
end
|
|
|
|
--战斗对应积分配置
|
|
function SandTableModel:GetFightScoreCfg( point_id )
|
|
if not self.fight_score_cfg then
|
|
self.fight_score_cfg = {}
|
|
for k,v in pairs(Config.Crosspointfightscore) do
|
|
self.fight_score_cfg[v.dun_id] = self.fight_score_cfg[v.dun_id] or {}
|
|
self.fight_score_cfg[v.dun_id][#self.fight_score_cfg[v.dun_id]+1] = v
|
|
end
|
|
for k,v in pairs(self.fight_score_cfg) do
|
|
local function sort_call( a,b )
|
|
return a.value_max > b.value_max
|
|
end
|
|
table.sort( v, sort_call )
|
|
end
|
|
end
|
|
if point_id then
|
|
local dun_id = self:GetPointCfg( point_id ).dun_id
|
|
return self.fight_score_cfg[dun_id]
|
|
else
|
|
return self.fight_score_cfg
|
|
end
|
|
end
|
|
function SandTableModel:ResetFightScoreCfg( )
|
|
--切场景重置,减少使用
|
|
if self.fight_score_cfg then
|
|
self.fight_score_cfg = false
|
|
end
|
|
end
|
|
|
|
--获得战斗对应积分
|
|
function SandTableModel:GetFightScoreByKill( point_id,num )
|
|
if not point_id then return 0 end
|
|
num = num or 0
|
|
local cfg_list = self:GetFightScoreCfg( point_id ) or {}
|
|
for i,v in ipairs(cfg_list) do
|
|
if num >= v.value_max then
|
|
return v.score
|
|
end
|
|
end
|
|
return 0
|
|
end
|
|
|
|
--战斗榜单数据
|
|
function SandTableModel:GetFightRankData( )
|
|
return self.fight_rank_data
|
|
end
|
|
function SandTableModel:SetFightRankData( value )
|
|
if value.attact_rank then
|
|
local function sort_call( a,b )
|
|
--从大到小
|
|
return a.score > b.score
|
|
end
|
|
table.sort( value.attact_rank, sort_call )
|
|
end
|
|
self.fight_rank_data = value
|
|
end
|
|
|
|
--通过阵营获得据点列表
|
|
function SandTableModel:GetPointListByFaction( faction )
|
|
faction = faction or self:GetFaction()
|
|
local list = {}
|
|
for k,v in pairs(self:GetPointDateList() or {}) do
|
|
if v.faction == faction then
|
|
table.insert( list, v )
|
|
end
|
|
end
|
|
return list
|
|
end
|
|
|
|
--通过据点获得图标
|
|
function SandTableModel:GetIconByPoint( point ,is_big )
|
|
local point_list = SandTableConst.PointList
|
|
local point_show = SandTableConst.PointShow
|
|
local res_name = false
|
|
local image_index = 1
|
|
if point_list[point_show.SafePoint][point] then
|
|
res_name = is_big and "kfWorld_sand_point_2" or "sandTable_point_2"
|
|
image_index = is_big and 2 or 2
|
|
elseif point_list[point_show.DoorPoint][point] then
|
|
res_name = is_big and "kfWorld_sand_point_1" or "sandTable_point_3"
|
|
image_index = is_big and 1 or 3
|
|
elseif point_list[point_show.BuffPoint][point] then
|
|
res_name = is_big and "kfWorld_sand_point_5" or "sandTable_point_6"
|
|
image_index = is_big and 5 or 6
|
|
elseif point_list[point_show.FightPoint][point] then
|
|
if (point%2) == 0 then
|
|
res_name = is_big and "kfWorld_sand_point_4" or "sandTable_point_5"
|
|
image_index = is_big and 4 or 5
|
|
else
|
|
res_name = is_big and "kfWorld_sand_point_3" or "sandTable_point_4"
|
|
image_index = is_big and 3 or 4
|
|
end
|
|
else
|
|
res_name = is_big and "kfWorld_sand_point_1" or "sandTable_point_2"
|
|
image_index = is_big and 1 or 2
|
|
end
|
|
if is_big then
|
|
return "/client/assets/icon/kfworld/" .. res_name .. ".png", image_index
|
|
else
|
|
return res_name, image_index
|
|
end
|
|
end
|
|
|
|
--根据据点判断是否是自己的阵营
|
|
function SandTableModel:IsSelfFactionByPoint( point_id )
|
|
if not point_id then return false end
|
|
local sel_id = self:GetFaction()
|
|
local server_data = self:GetPointDateList( point_id )
|
|
if server_data then
|
|
return server_data.faction == sel_id
|
|
end
|
|
return false
|
|
end
|
|
|
|
--获得据点定时体力奖励
|
|
function SandTableModel:GetPointTimeReward( point )
|
|
local conf_point = self:GetPointCfg(point)
|
|
if not conf_point then return 0,{} end
|
|
local reward_list = stringtotable(conf_point.reward) or {}
|
|
if #reward_list > 0 then
|
|
return reward_list[1][3],reward_list
|
|
end
|
|
return 0, reward_list
|
|
end
|
|
|
|
function SandTableModel:GetRewardTimeByPoint( point_id )
|
|
if not point_id then return false end
|
|
if not self:IsSelfFactionByPoint( point_id ) then
|
|
return false
|
|
end
|
|
local data = self:GetPointDateList( point_id )
|
|
local cfg = self:GetPointCfg( point_id )
|
|
if data and cfg then
|
|
local curTime = TimeUtil:getServerTime()
|
|
local tem_time = curTime - data.award_time--间隔时间
|
|
tem_time = tem_time % cfg.interval_time
|
|
if tem_time > 0 then
|
|
local need_time = cfg.interval_time - tem_time
|
|
need_time = need_time > 0 and need_time or 0
|
|
return need_time
|
|
else
|
|
return 0
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
--判断节点是否可以操作
|
|
function SandTableModel:GetPointCanFight( point )
|
|
if not point then return end
|
|
local point_list = SandTableConst.PointList
|
|
local point_show = SandTableConst.PointShow
|
|
local my_faction = self:GetFaction( )
|
|
-------------------------
|
|
if point_list[point_show.MainCity][point] then
|
|
--主城不可操作
|
|
return false
|
|
end
|
|
if point_list[point_show.SafePoint][point] or point_list[point_show.DoorPoint][point] then
|
|
--非己方安全据点不可操作
|
|
if math.floor(point/1000) ~= my_faction then
|
|
return false
|
|
else
|
|
local data = self:GetPointDateList( point )
|
|
--连着线而且(无数据或者阵营不属于自己)
|
|
return self:GetPointIsLine( point ) and ((not data) or (data.faction~=self:GetFaction( )))
|
|
end
|
|
end
|
|
-- 判断是否有连接
|
|
local data = self:GetPointDateList( point )
|
|
return self:GetPointIsLine( point ) and ((not data) or (data.faction~=self:GetFaction( ) or
|
|
self:GetPointIsFighting( point )))
|
|
end
|
|
|
|
--判断据点是否是争夺中
|
|
function SandTableModel:GetPointIsFighting( point )
|
|
local data = self:GetPointDateList( point )
|
|
if data then
|
|
if #data.attack_info > 0 then
|
|
local max_score = 0
|
|
local conf = self:GetPointCfg( point )
|
|
for k,v in pairs(data.attack_info) do
|
|
max_score = max_score > v.score and max_score or v.score
|
|
end
|
|
--最高分小于总分,说明争夺中
|
|
return (max_score ~= 0) and (max_score < conf.base_score)
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
--是否可扫荡
|
|
function SandTableModel:GetPointCanSweep( point )
|
|
if self:GetPointCanFight( point ) then
|
|
local data = self:GetPointDateList( point )
|
|
if data and data.is_sweep == 1 then
|
|
if data.faction ~= self:GetFaction( ) then
|
|
return true
|
|
else
|
|
return #data.attack_info > 0
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
--据点是否有连接
|
|
function SandTableModel:GetPointIsLine( point )
|
|
local point_list = self:GetPointListByFaction( )
|
|
local cfg,link_conf = false,false
|
|
local my_faction = self:GetFaction( )
|
|
local const_point_list = SandTableConst.PointList
|
|
local const_point_show = SandTableConst.PointShow
|
|
for k,v in pairs(point_list) do
|
|
cfg = self:GetPointCfg( v.point_id )
|
|
if cfg then
|
|
link_conf = stringtotable(cfg.link_point) or {}
|
|
for kk,vv in pairs(link_conf) do
|
|
if tonumber(vv) == point then
|
|
if const_point_list[const_point_show.DoorPoint][tonumber(vv)] then
|
|
return (math.floor(vv/1000) == my_faction)
|
|
else
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if (point%1000 == 11) and math.floor(point/1000) == my_faction then
|
|
-- 第一个安全据点
|
|
return true
|
|
elseif (point%1000 == 12) and math.floor(point/1000) == my_faction then
|
|
if self:GetFactionByPoint( point-1 ) == my_faction then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function SandTableModel:GetShortNameStr( str )
|
|
str = str or ""
|
|
if SubStringGetTotalIndex(str) > 8 then
|
|
return SubStringUTF8(str, 1, 8) .. "..."
|
|
else
|
|
return str
|
|
end
|
|
end
|
|
|
|
function SandTableModel:GetFactionName( faction )
|
|
faction = faction or 0
|
|
return KfWorldModel:GetInstance():GetContrayNameById(faction) or ""
|
|
end
|