|
|
- SkillVo = SkillVo or BaseClass()
-
- local SkillVo = SkillVo
- local string_len = string.len
- local string_sub = string.sub
- local table_insert = table.insert
- local math_max = math.max
- local tonumber = tonumber
-
- SkillVo.SkillType =
- {
- Initiative = 1, --主动
- Passitive = 2, --被动
- Assist = 3, --辅助
- Menpai = 4, --门派技能
- }
-
- --怒气技能id列表
- SkillVo.AngerSkillId =
- {
- [101091] = true,
- [102091] = true,
- [103091] = true,
- [104091] = true,
- }
-
- function SkillVo:__init(skillId)
- self.id = skillId --技能id
- self.level= 0 --技能等级
- self.useTime = 0 --技能触发时间
- self:getComboSkill()
-
- self.canLearn = false
- end
- function SkillVo:__defineVar()
- return {
- _class_type = self,
- --_cid = self._id,
- _iid = _in_obj_ins_id,
- id = 1,
- level = 0,
- totalLevel = 1,
- canLearn = false,
- skill_link = nil,
- useTime = 0,
- }
- end
-
- function SkillVo:getName()
- if self.name == nil then
- self.name = self:getBasic("name")
- if self.name ~= nil then
- self.name = Trim(self.name)
- end
- end
- return self.name
- end
- --角色
- function SkillVo:getCarrer()
- if self.career == nil then
- self.career = self:getBasic("career")
- end
- return self.career
- end
-
- -- 技能类型 1主动技能,2被动技能,3辅助技能,4增益技能
- function SkillVo:GetSkillType()
- if self.type == nil then
- self.type = self:getBasic("type")
- end
- return self.type
- end
-
- --获取技能类型字符串
- function SkillVo:GetSkillTypeStr()
- return WordManager:GetSkillTypeStr(self:GetSkillType())
- end
-
- --是否是幻光技能
- function SkillVo:IsDailyLightSkill()
- if self.is_daily_litght_skill == nil then
- self.is_daily_litght_skill = self:getCarrer() == 13
- end
- return self.is_daily_litght_skill
- end
-
- --攻击参照类型 1自己 2选取对象
- function SkillVo:GetSkillAttObj()
- if self.att_obj == nil then
- self.att_obj = self:getBasic("att_obj")
- end
- return self.att_obj
- end
-
- --是否是特殊技能(永恒回复)
- function SkillVo:IsSpecialSkill()
- return self.id == 109100
- end
-
- --是否是禁跳技能
- function SkillVo:IsForbidJumpSkill()
- return self.id == 109101
- end
-
- --是否是被动技能
- function SkillVo:IsPassitiveSkill()
- return self:GetSkillType() == SkillVo.SkillType.Passitive
- end
-
- --是否普攻
- function SkillVo:IsNormal()
- if self.is_normal == nil then
- self.is_normal = self:getBasic("is_normal")
- end
- return self.is_normal == 1
- end
-
- --是否副技能
- function SkillVo:IsComboSkill()
- if self.is_combo == nil then
- self.is_combo = self:getBasic("is_combo")
- end
- return self.is_combo == 1
- end
-
- --是否怒气技能
- function SkillVo:IsAngerSkill()
- return SkillVo.AngerSkillId[self.id]
- end
- --选取模式 1自己,2最近敌方,3最近队友
- function SkillVo:GetSelectType()
- if self.obj == nil then
- self.obj = self:getBasic("obj")
- end
- return self.obj
- end
-
- --(0客户端直接播放,1等服务端返回播)
- function SkillVo:GetBroadcast()
- if self.broadcast == nil then
- self.broadcast = self:getBasic("broadcast")
- end
- return self.broadcast
- end
-
- --(是否前摇技能)
- function SkillVo:IsPreSwingSkill()
- if self.is_shake_pre == nil then
- self.is_shake_pre = self:getBasic("is_shake_pre")
- end
- return self.is_shake_pre == 1
- end
-
- --获取蓄能连招
- function SkillVo:getSkillLink()
- if self.skill_link == nil then
- self.skill_link = {}
- local link_str = self:getBasic("skill_link")
- if link_str and string_len(link_str) > 4 then
- link_str = string_sub(link_str, 3, -3)
- local tmp_arr = Split(link_str, ",")
- for i=1, #tmp_arr do
- local s = tmp_arr[i]
- table_insert(self.skill_link, tonumber(s))
- end
- end
- end
- return self.skill_link
- end
-
- --获取攻击目标数量
- function SkillVo:GetAttackNum(level)
- --假定攻击数量不受等级影响
- if not self.attack_role_num then
- self.attack_role_num, self.attack_mon_num = 0,0
- local level_vo = self:getLevelVo(level)
- if level_vo then
- local num_str = level_vo.num
- if num_str and string_len(num_str) > 4 then
- num_str = string_sub(num_str, 3, -3)
- local tmp_arr = Split(num_str, ",")
- self.attack_role_num, self.attack_mon_num = tonumber(tmp_arr[1]) or 0,tonumber(tmp_arr[2]) or 0
- end
- end
- end
- return self.attack_role_num, self.attack_mon_num
- --[[
- level = level or self.level
- local level_vo = self:getLevelVo(level)
- -- print("获取攻击目标数量", self.id, self.level, level_vo)
- if level_vo then
- local num_str = level_vo.num
- local role_num,mon_num = 0,0
- if num_str and string_len(num_str) > 4 then
- num_str = string_sub(num_str, 3, -3)
- local tmp_arr = Split(num_str, ",")
- role_num,mon_num = tonumber(tmp_arr[1]) or 0,tonumber(tmp_arr[2]) or 0
- end
- return role_num,mon_num
- else
- return 0,0
- end
- ]]
- end
-
- --是否群攻模式
- function SkillVo:IsAoeMode()
- if self.is_aoe_mode == nil then
- local mod = self:getBasic("mod")
- if mod then
- mod = tonumber(mod)
- if mod == 1 then
- self.is_aoe_mode = false
- else
- self.is_aoe_mode = true
- end
- else
- self.is_aoe_mode = true
- end
- end
- return self.is_aoe_mode
- end
- --AOE时选取目标的方式
- function SkillVo:GetAoeMode()
- if self.aoe_mod == nil then
- local str = self:getBasic("range")
- if str then
- self.aoe_mod = tonumber(str)
- if self.aoe_mod == 0 then
- self.aoe_mod = 1
- end
- else
- self.aoe_mod = 1
- end
- end
- return self.aoe_mod
- end
-
- --CD时间,配置的
- function SkillVo:getCd(level)
- level = level or self.level
- local level_vo = self:getLevelVo(level)
- if level_vo and level_vo.cd then
- self.cd = tonumber(level_vo.cd) or 0
- else
- self.cd = 0
- end
- return self.cd
- end
-
- function SkillVo:startCD()
- self.useTime = Status.NowTime
- end
-
- function SkillVo:clearCD()
- self.useTime = 0
- end
-
- function SkillVo:refreshCD(time)
- self.useTime = self.useTime - time
- end
-
- --真实的cd时间
- function SkillVo:getRealCD()
- local ret_cd = 0
- local cfg_cd = self:getCd()
- if self.useTime ~= 0 then
- if Status.NowTime - self.useTime > ((self:getCd() / 1000) - 0.5) then
- ret_cd = 0
- else
- ret_cd = math.max(0,(self:getCd() / 1000) - ( Status.NowTime - self.useTime ))
- end
- end
- return ret_cd
- end
-
- function SkillVo:CoolDown()
- local cd_info = SkillManager:getInstance().cd_skill_list[self.id]
- local last_release_time = SkillManager:getInstance():GetReleaseMainSkill(self.id)
- if (cd_info and cd_info:IsPlaying()) or self:getRealCD() > 0 then --or Status.NowTime - last_release_time < 1.5 then
- return false
- end
-
- return true
- end
-
- function SkillVo:getLevelVo(level)
- -- print("= = =SkillVo:getLevelVo:", self.id, level)
- level = (level == nil or level == 0) and 1 or level
- local lvs = self:getBasic("lvs")
- if lvs ~= nil and level <= tonumber(lvs.lvs_total) then
- return lvs[level]
- end
- return nil
- end
-
- function SkillVo:GetTotalLevel()
- local lvs = self:getBasic("lvs")
- return tonumber(lvs.lvs_total)
- end
-
- function SkillVo:IsMaxLevel()
- local max_lv = self:GetTotalLevel()
- return self.level and self.level >= max_lv
- end
-
- --取攻击距离
- function SkillVo:GetDistance(level)
- if not self.attack_distance then
- level = level or self.level
- local level_vo = self:getLevelVo(level)
- if level_vo then
- local distance = tonumber(level_vo.distance)
- if distance == nil then
- distance = 50
- end
- self.attack_distance = distance
- else
- self.attack_distance = 50
- end
- end
- return self.attack_distance
- --[[
- level = level or self.level
- local level_vo = self:getLevelVo(level)
- if level_vo then
- local distance = tonumber(level_vo.distance)
- if distance == nil then
- distance = 50
- end
- return distance
- else
- return 50
- end
- ]]
- end
-
- --攻击范围
- function SkillVo:GetArea(level)
- if not self.attack_area then
- level = level or self.level
- local level_vo = self:getLevelVo(level)
- if level_vo then
- self.attack_area = tonumber(level_vo.area)
- end
- end
- return self.attack_area
- --[[
- level = level or self.level
- local level_vo = self:getLevelVo(level)
- if level_vo then
- local area = tonumber(level_vo.area)
- return area
- end
- return 0
- ]]
- end
-
-
- --获取combo技(类似战士旋风,需要客户端自动每隔一段时间发一次技能)
- function SkillVo:getComboSkill()
- if self.combo_skills == nil then
- self.combo_skills = {}
- local skillCfg = SkillManager.Instance:GetFightSkillMovie(self.id)
- local comboSkills = skillCfg and skillCfg.comboSkills
- if comboSkills then
- local time = 0
- local info = nil
- for i = 1, #comboSkills do
- local delta = tonumber(comboSkills[i][1]) / 1000
- local skill_id = tonumber(comboSkills[i][2])
- time = time + delta
- info = {time = time,
- skill_id = skill_id}
-
-
- table_insert(self.combo_skills, info)
- end
- end
- end
- return self.combo_skills
- end
-
- --获取多段伤害的段数跟间隔,返回值:段数(默认1,大于1才算多段伤害),时间间隔
- function SkillVo:getMultiHurtInfo( )
- if not self.multi_segment then
- self.multi_segment = self:getBasic("multistage")
- end
- if self.multi_segment and self.multi_segment > 1 then
- if not self.multi_interval then
- self.multi_interval = tonumber(self:getBasic("stage_cd")) or 0
- self.multi_interval = self.multi_interval / 1000 --毫秒转秒
- end
- return self.multi_segment, self.multi_interval
- end
- return 1, 0
- end
-
- --[[
- 功能:获取技能的基本信息
- 其他.
- 作者:zsm
- ]]
- function SkillVo:getBasic(str)
- local basic = SkillManager.getInstance():getSkillFromConfig(self.id)
- if basic == nil then
- return nil
- end
- return basic[str]
- end
-
- function SkillVo:__delete( )
- end
-
- function SkillVo:GetNeedLevel( level )
- level = level or self.level
- local levelVo = self:getLevelVo( level)
- local lv = 0
- if levelVo then
- lv = levelVo.condition.lv
- end
- return lv or 0
- end
- function SkillVo:GetNeedCoin( level )
- level = level or self.level
- local levelVo = self:getLevelVo( level)
- local coin = 0
- if levelVo then
- coin = levelVo.condition.coin
- end
- return coin or 0
- end
-
- function SkillVo:GetCondition()
- local levelVo = self:getLevelVo(level or self.level)
- if levelVo then
- cdt = levelVo.condition
- if cdt.lv then
- return "level",cdt.lv
- elseif cdt.turn then
- return "turn",cdt.turn
- elseif cdt.yhbg then
- return "yhbg",cdt.yhbg
- elseif cdt.finish_dun then
- return "finish_dun",cdt.finish_dun
- end
- end
- end
-
- function SkillVo:GetNextConditionByKey(key, level)
- level = level or self.level
- local total_level = self:GetTotalLevel()
- if level >= total_level then
- return false
- end
- local levelVo = self:getLevelVo( level + 1)
- if levelVo then
- cdt = levelVo.condition
- if cdt.lv and key == "level" then
- return cdt.lv
- elseif cdt.turn and key == "turn" then
- return cdt.turn
- elseif cdt.vip and key == "vip" then
- return cdt.vip
- elseif cdt.goods and key == "goods" then
- return cdt.goods
- end
- end
- return false
- end
-
- function SkillVo:getAnger(level)
- level = level or self.level
- local vo= self:getLevelVo(level);
- if vo==nil then
- return -1
- end
- local use_str = Trim(vo.use)
- local mp_str = string_sub(use_str, 2, -2)
- if string_len(mp_str)==0 then
- -- print("技能不耗怒气~~", self.id)
- return 0
- else
- mp_str = string_sub(mp_str, 2, -2)
- local tmp_strs = Split(mp_str, ",")
- if #tmp_strs >= 2 then
- for i = 1,#tmp_strs do
- if tmp_strs[i] == "anger" then
- return tonumber(tmp_strs[i+1]) or 0
- end
- end
- end
- end
- return 0
- end
-
- function SkillVo:GetDesc(level)
- level = level or self.level
- local vo= self:getLevelVo(level);
- if vo == nil then
- return -1
- end
- return Trim(vo.desc)
- end
-
-
- function SkillVo:GetPower(level)
- local is_have = true
- level = level or self.level
- if level == 0 then
- is_have = false
- level = 1
- end
- local _,power = GetSkillAttrBySkill( self.id, level, true, is_have)
- return power
- end
-
- function SkillVo:GetAttrOffsetByLevel(cur_level, next_level)
- local t = {}
-
- if cur_level == 0 then
- local next_vo = self:getLevelVo(next_level)
- local next_attr = Trim(next_vo.base_attr)
- if next_attr ~= "" and next_attr ~= "[]" then
- local next_attr_list =ErlangParser:GetInstance():Parse(next_attr)
- t = next_attr_list
- end
- elseif next_level > cur_level then
- local next_vo = self:getLevelVo(next_level)
- local cur_vo = self:getLevelVo(cur_level)
- local next_attr = Trim(next_vo.base_attr)
- local cur_attr = Trim(cur_vo.base_attr)
- if next_attr ~= "" and next_attr ~= "[]" and cur_attr ~= "" and cur_attr ~= "[]" then
- local next_attr_list =ErlangParser:GetInstance():Parse(next_attr)
- local cur_attr_list =ErlangParser:GetInstance():Parse(cur_attr)
- for i,v in ipairs(next_attr_list) do
- t[i] = v
- for _i,_v in ipairs(cur_attr_list) do
- if v[2] == _v[2] then
- t[i][3] = math.abs(v[3]-_v[3])
- end
- end
- end
- end
- end
- return t
- end
-
- --是否可以升级
- function SkillVo:CanUp(level)
- local b = false
- level = level or self.level
- local total_level = self:GetTotalLevel()
- if level < total_level then
- local is_enable = true
- --还没有达到技能的学习条件
- is_enable = self:CanUpButGoods(level)
- if not is_enable then
- return false
- end
-
- --判断是否有足够的材料升级
- local goods = self:GetNextConditionByKey("goods", level)
- if goods then
- for i,v in ipairs(goods) do
- local own_count = GoodsModel:getInstance():GetTypeGoodsNum(v[1])
- if own_count and tonumber(v[2]) and own_count < tonumber(v[2]) then
- is_enable = false
- break
- end
- end
- b = is_enable
- end
- end
- return b
- end
-
- --除了道具可以升级
- function SkillVo:CanUpButGoods(level)
- local b = true
- level = level or self.level
- local total_level = self:GetTotalLevel()
- -- print(">>> 00 = ",level , total_level, level < total_level )
- if level < total_level then
- --比较条件
- local t = {
- level = RoleManager.Instance:GetMainRoleVo().level,
- turn = RoleManager.Instance:GetMainRoleVo().turn,
- vip = RoleManager.Instance:GetMainRoleVo().vip_flag,
- }
- for k,v in pairs(t) do
- local _value = self:GetNextConditionByKey(k, level)
- _value = tonumber(_value)
- if _value and _value > v then
- return false
- end
- end
- else
- return false
- end
- return b
- end
-
-
- function SkillVo:GetSkillAttrList(ignore_list, have_level)
- local attrs = {}
- local total_level = self:GetTotalLevel()
- for i=1,total_level do
- if not ignore_list or ignore_list[i] == nil then
- local des = self:GetDesc(i)
- if have_level then
- local t =
- {
- level = i,
- des = des,
- }
- table_insert(attrs, t)
- else
- table_insert(attrs, des)
- end
-
- end
- end
- return attrs
- end
|