源战役客户端
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 

532 行
15 KiB

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