635 lines
16 KiB
Lua
Executable File
635 lines
16 KiB
Lua
Executable File
local thtd_combo_table =
|
||
{
|
||
["cirno"] =
|
||
{
|
||
["letty_cirno"] =
|
||
{
|
||
["abilityName"] = "thtd_cirno_01",
|
||
}
|
||
},
|
||
["letty"] =
|
||
{
|
||
["letty_cirno"] =
|
||
{
|
||
["abilityName"] = "thtd_letty_01",
|
||
}
|
||
},
|
||
["lyrica"] =
|
||
{
|
||
["lyrica_lunasa_merlin"] =
|
||
{
|
||
["delay"] = 3,
|
||
["duration"] = 3,
|
||
["abilityName"] = "thtd_lyrica_01",
|
||
}
|
||
},
|
||
["lunasa"] =
|
||
{
|
||
["lyrica_lunasa_merlin"] =
|
||
{
|
||
["delay"] = 3,
|
||
["duration"] = 3,
|
||
}
|
||
},
|
||
["merlin"] =
|
||
{
|
||
["lyrica_lunasa_merlin"] =
|
||
{
|
||
["delay"] = 3,
|
||
["duration"] = 3,
|
||
}
|
||
},
|
||
["youmu"] =
|
||
{
|
||
["yuyuko_youmu"] =
|
||
{
|
||
["delay"] = 9,
|
||
["duration"] = 5,
|
||
["abilityName"] = "thtd_youmu_01",
|
||
},
|
||
["youmu_reisen"] =
|
||
{
|
||
["abilityName"] = "thtd_youmu_02",
|
||
}
|
||
},
|
||
["yuyuko"] =
|
||
{
|
||
["yuyuko_youmu"] =
|
||
{
|
||
["delay"] = 13,
|
||
["duration"] = 5,
|
||
["abilityName"] = "thtd_yuyuko_02",
|
||
},
|
||
["yuyuko_yukari"] =
|
||
{
|
||
["abilityName"] = "thtd_yuyuko_01",
|
||
}
|
||
},
|
||
["marisa"] =
|
||
{
|
||
["reimu_marisa"] =
|
||
{
|
||
["delay"] = 3,
|
||
["duration"] = 2,
|
||
["abilityName"] = "thtd_marisa_01",
|
||
["abilityName2"] = "thtd_marisa_03",
|
||
},
|
||
["marisa_alice"] =
|
||
{
|
||
["delay"] = 2,
|
||
["duration"] = 3,
|
||
["abilityName"] = "thtd_marisa_02",
|
||
}
|
||
},
|
||
["alice"] =
|
||
{
|
||
["marisa_alice"] =
|
||
{
|
||
["delay"] = 3,
|
||
["duration"] = 3,
|
||
["abilityName"] = "thtd_alice_03",
|
||
},
|
||
["reimu_alice"] =
|
||
{
|
||
["delay"] = 3,
|
||
["duration"] = 3,
|
||
["abilityName"] = "thtd_alice_02",
|
||
}
|
||
},
|
||
["koishi"] =
|
||
{
|
||
["koishi_satori"] =
|
||
{
|
||
["delay"] = 5,
|
||
["duration"] = 2,
|
||
["abilityName"] = "thtd_koishi_01",
|
||
}
|
||
},
|
||
["satori"] =
|
||
{
|
||
["koishi_satori"] =
|
||
{
|
||
["abilityName"] = "thtd_satori_02",
|
||
}
|
||
},
|
||
["sakuya"] =
|
||
{
|
||
["remilia_sakuya"] =
|
||
{
|
||
["delay"] = 3,
|
||
["duration"] = 3,
|
||
["abilityName"] = "thtd_sakuya_02",
|
||
},
|
||
["meirin_sakuya"] =
|
||
{
|
||
["abilityName"] = "thtd_sakuya_03",
|
||
}
|
||
},
|
||
["koakuma"] =
|
||
{
|
||
["koakuma_patchouli"] =
|
||
{
|
||
["delay"] = 7,
|
||
["duration"] = 3,
|
||
["abilityName"] = "thtd_koakuma_01",
|
||
}
|
||
},
|
||
["patchouli"] =
|
||
{
|
||
["koakuma_patchouli"] =
|
||
{
|
||
["delay"] = 5,
|
||
["duration"] = 2,
|
||
["abilityName"] = "thtd_patchouli_04",
|
||
}
|
||
},
|
||
["eirin"] =
|
||
{
|
||
["eirin_kaguya"] =
|
||
{
|
||
["delay"] = 2,
|
||
["duration"] = 2,
|
||
["abilityName"] = "thtd_eirin_01",
|
||
}
|
||
},
|
||
["kaguya"] =
|
||
{
|
||
["eirin_kaguya"] =
|
||
{
|
||
["delay"] = 2,
|
||
["duration"] = 3,
|
||
["abilityName"] = "thtd_kaguya_01",
|
||
}
|
||
},
|
||
["yukari"] =
|
||
{
|
||
["reimu_yukari"] =
|
||
{
|
||
["abilityName"] = "thtd_yukari_01",
|
||
},
|
||
["chen_yukari_ran"] =
|
||
{
|
||
["abilityName"] = "thtd_yukari_04",
|
||
}
|
||
},
|
||
["remilia"] =
|
||
{
|
||
["remilia_sakuya"] =
|
||
{
|
||
["abilityName"] = "thtd_remilia_04",
|
||
},
|
||
["remilia_flandre"] =
|
||
{
|
||
["abilityName"] = "thtd_remilia_02",
|
||
}
|
||
},
|
||
["reimu"] =
|
||
{
|
||
["rumia_reimu"] =
|
||
{
|
||
["abilityName"] = "thtd_reimu_01",
|
||
},
|
||
["reimu_marisa"] =
|
||
{
|
||
["abilityName"] = "thtd_reimu_02",
|
||
},
|
||
["reimu_yukari"] =
|
||
{
|
||
["abilityName"] = "thtd_reimu_04",
|
||
},
|
||
},
|
||
["flandre"] =
|
||
{
|
||
["remilia_flandre"] =
|
||
{
|
||
["abilityName"] = "thtd_flandre_02",
|
||
}
|
||
},
|
||
["soga"] =
|
||
{
|
||
["futo_soga"] =
|
||
{
|
||
["abilityName"] = "thtd_soga_03",
|
||
}
|
||
},
|
||
["minamitsu"] =
|
||
{
|
||
["nue_minamitsu"] =
|
||
{
|
||
["abilityName"] = "thtd_minamitsu_02",
|
||
}
|
||
},
|
||
["futo"] =
|
||
{
|
||
["futo_soga"] =
|
||
{
|
||
["abilityName"] = "thtd_futo_02",
|
||
}
|
||
},
|
||
["sanae"] =
|
||
{
|
||
["suwako_kanako_sanae"] =
|
||
{
|
||
["abilityName"] = "thtd_sanae_04",
|
||
}
|
||
},
|
||
["tenshi"] =
|
||
{
|
||
["tenshi_iku"] =
|
||
{
|
||
["abilityName"] = "thtd_tenshi_03",
|
||
}
|
||
},
|
||
["mokou"] =
|
||
{
|
||
["mokou_keine"] =
|
||
{
|
||
["abilityName"] = "thtd_mokou_01",
|
||
}
|
||
},
|
||
["reisen"] =
|
||
{
|
||
["youmu_reisen"] =
|
||
{
|
||
["abilityName"] = "thtd_reisen_02",
|
||
}
|
||
},
|
||
["utsuho"] =
|
||
{
|
||
["utsuho_rin"] =
|
||
{
|
||
["abilityName"] = "thtd_utsuho_01",
|
||
}
|
||
},
|
||
["keine"] =
|
||
{
|
||
["mokou_keine"] =
|
||
{
|
||
["abilityName"] = "thtd_keine_03",
|
||
}
|
||
},
|
||
["ran"] =
|
||
{
|
||
["chen_yukari_ran"] =
|
||
{
|
||
["abilityName"] = "thtd_ran_03",
|
||
}
|
||
},
|
||
["yoshika"] =
|
||
{
|
||
["yoshika_seiga"] =
|
||
{
|
||
["abilityName"] = "thtd_yoshika_01",
|
||
}
|
||
},
|
||
["rumia"] =
|
||
{
|
||
["rumia_reimu"] =
|
||
{
|
||
["abilityName"] = "thtd_rumia_04",
|
||
}
|
||
},
|
||
["meirin"] =
|
||
{
|
||
["meirin_sakuya"] =
|
||
{
|
||
["abilityName"] = "thtd_meirin_02",
|
||
}
|
||
},
|
||
["iku"] =
|
||
{
|
||
["tenshi_iku"] =
|
||
{
|
||
["abilityName"] = "thtd_iku_01",
|
||
}
|
||
},
|
||
["junko"] =
|
||
{
|
||
["junko_hecatia"] =
|
||
{
|
||
["abilityName"] = "thtd_junko_01",
|
||
}
|
||
},
|
||
["hecatia"] =
|
||
{
|
||
["junko_hecatia"] =
|
||
{
|
||
["abilityName"] = "thtd_hecatia_03",
|
||
}
|
||
},
|
||
["daiyousei"] =
|
||
{
|
||
["daiyousei_cirno"] =
|
||
{
|
||
["abilityName"] = "thtd_daiyousei_03",
|
||
}
|
||
},
|
||
}
|
||
|
||
function HasCombo(combo,name)
|
||
for k,v in pairs(combo) do
|
||
if k == name then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function CDOTA_BaseNPC:THTD_GetComboVoice(comboName)
|
||
local data = thtd_combo_table[self:GetUnitName()][comboName]
|
||
if data ~= nil and data["delay"] ~= nil then
|
||
data["comboName"] = comboName
|
||
else
|
||
data = nil
|
||
end
|
||
return data
|
||
end
|
||
|
||
-- 设置组合技能的生效或关闭,返回组合语音数据组,组合影响:升级技能为2级(可设置此等级下光环开启)、增加buff、返回语音。(和或)
|
||
function CDOTA_BaseNPC:THTD_Set_Combo(combo)
|
||
local comboVoiceTable = {}
|
||
|
||
local unitName = self:GetUnitName()
|
||
local comboList = thtd_combo_table[unitName]
|
||
if comboList == nil then
|
||
combo = {}
|
||
return comboVoiceTable
|
||
end
|
||
|
||
for k,v in pairs(comboList) do
|
||
local isChange = false
|
||
|
||
if v["abilityName"] ~= nil then
|
||
local ability = self:FindAbilityByName(v["abilityName"])
|
||
if ability == nil then
|
||
print("----------- "..unitName..": combo error, combo: "..k..", ability: "..v["abilityName"]..", ability is nil")
|
||
combo = {}
|
||
return comboVoiceTable
|
||
end
|
||
|
||
if ability:IsActivated() then
|
||
if HasCombo(combo, k) then
|
||
-- buff等级,如果为1,则仅开启buff不升级,否则升级,名称格式固定
|
||
local buffOrLevel = ability:GetSpecialValueFor("has_combo_buff")
|
||
if buffOrLevel > 0 and self:HasModifier("modifier_"..v["abilityName"].."_combo_buff") == false then
|
||
isChange = true
|
||
ability:ApplyDataDrivenModifier(self, self, "modifier_"..v["abilityName"].."_combo_buff", nil)
|
||
end
|
||
|
||
if ability:GetLevel() ~= 2 and buffOrLevel ~= 1 then
|
||
isChange = true
|
||
ability:SetLevel(2)
|
||
self[v["abilityName"].."bonus_level"] = nil
|
||
|
||
-- 升级后是否存在光环技能,名称格式固定
|
||
local auraName = "modifier_"..v["abilityName"].."_aura"
|
||
local auraLevel = ability:GetSpecialValueFor("open_aura_level") --开启等级要求
|
||
if auraLevel == 2 and self:HasModifier(auraName) == false then
|
||
ability:ApplyDataDrivenModifier(self, self, auraName, nil)
|
||
end
|
||
end
|
||
else
|
||
-- buff等级,如果为1,则仅开启buff不升级,否则升级
|
||
local buffOrLevel = ability:GetSpecialValueFor("has_combo_buff")
|
||
if buffOrLevel > 0 and self:HasModifier("modifier_"..v["abilityName"].."_combo_buff") then
|
||
isChange = true
|
||
self:RemoveModifierByName("modifier_"..v["abilityName"].."_combo_buff")
|
||
end
|
||
|
||
if ability:GetLevel() > 1 and buffOrLevel ~= 1 then
|
||
isChange = true
|
||
ability:SetLevel(1)
|
||
self[v["abilityName"].."bonus_level"] = nil
|
||
local auraName = "modifier_"..v["abilityName"].."_aura"
|
||
local auraLevel = ability:GetSpecialValueFor("open_aura_level")
|
||
if auraLevel > 1 and self:HasModifier(auraName) then
|
||
self:RemoveModifierByName(auraName)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
if v["abilityName2"] ~= nil then
|
||
local ability = self:FindAbilityByName(v["abilityName2"])
|
||
if ability == nil then
|
||
print("----------- "..unitName..": combo error, combo: "..k..", ability: "..v["abilityName2"]..", ability is nil")
|
||
combo = {}
|
||
return comboVoiceTable
|
||
end
|
||
|
||
if ability:IsActivated() then
|
||
if HasCombo(combo, k) then
|
||
-- buff等级,如果为1,则仅开启buff不升级,否则升级,名称格式固定
|
||
local buffOrLevel = ability:GetSpecialValueFor("has_combo_buff")
|
||
if buffOrLevel > 0 and self:HasModifier("modifier_"..v["abilityName2"].."_combo_buff") == false then
|
||
isChange = true
|
||
ability:ApplyDataDrivenModifier(self, self, "modifier_"..v["abilityName2"].."_combo_buff", nil)
|
||
end
|
||
|
||
if ability:GetLevel() ~= 2 and buffOrLevel ~= 1 then
|
||
isChange = true
|
||
ability:SetLevel(2)
|
||
self[v["abilityName2"].."bonus_level"] = nil
|
||
|
||
-- 升级后是否存在光环技能,名称格式固定
|
||
local auraName = "modifier_"..v["abilityName2"].."_aura"
|
||
local auraLevel = ability:GetSpecialValueFor("open_aura_level")
|
||
if auraLevel == 2 and self:HasModifier(auraName) == false then
|
||
ability:ApplyDataDrivenModifier(self, self, auraName, nil)
|
||
end
|
||
end
|
||
else
|
||
-- buff等级,如果为1,则仅开启buff不升级,否则升级
|
||
local buffOrLevel = ability:GetSpecialValueFor("has_combo_buff")
|
||
if buffOrLevel > 0 and self:HasModifier("modifier_"..v["abilityName2"].."_combo_buff") then
|
||
isChange = true
|
||
self:RemoveModifierByName("modifier_"..v["abilityName2"].."_combo_buff")
|
||
end
|
||
|
||
if ability:GetLevel() > 1 and buffOrLevel ~= 1 then
|
||
isChange = true
|
||
ability:SetLevel(1)
|
||
self[v["abilityName2"].."bonus_level"] = nil
|
||
local auraName = "modifier_"..v["abilityName2"].."_aura"
|
||
local auraLevel = ability:GetSpecialValueFor("open_aura_level")
|
||
if auraLevel > 1 and self:HasModifier(auraName) then
|
||
self:RemoveModifierByName(auraName)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
if isChange then
|
||
local voiceData = self:THTD_GetComboVoice(k)
|
||
if voiceData ~= nil then
|
||
table.insert(comboVoiceTable, voiceData)
|
||
end
|
||
end
|
||
end
|
||
|
||
combo = {}
|
||
return comboVoiceTable
|
||
end
|
||
|
||
|
||
function CDOTA_BaseNPC:THTD_chen_thtd_combo(combo)
|
||
local comboVoiceTable = {}
|
||
if HasCombo(combo,"chen_yukari_ran") then
|
||
if self.thtd_chen_01_distance_increase ~= 75 then
|
||
self.thtd_chen_01_distance_increase = 75
|
||
end
|
||
else
|
||
if self.thtd_chen_01_distance_increase ~= 100 then
|
||
self.thtd_chen_01_distance_increase = 100
|
||
end
|
||
end
|
||
combo = {}
|
||
return comboVoiceTable
|
||
end
|
||
|
||
function CDOTA_BaseNPC:THTD_sunny_thtd_combo(combo)
|
||
local comboVoiceTable = {}
|
||
|
||
if HasCombo(combo,"luna_star_sunny") and self.thtd_combo_fairyList == nil then
|
||
local hero = self:GetOwner()
|
||
local sunny = nil
|
||
local luna = nil
|
||
local star = nil
|
||
local sunnyList = {}
|
||
local lunaList = {}
|
||
local starList = {}
|
||
for k,v in pairs(hero.thtd_hero_tower_list) do
|
||
if v:GetUnitName() == "sunny" and v.thtd_is_in_fairy_combo~=true then
|
||
table.insert(sunnyList,v)
|
||
elseif v:GetUnitName() == "luna" and v.thtd_is_in_fairy_combo~=true then
|
||
table.insert(lunaList,v)
|
||
elseif v:GetUnitName() == "star" and v.thtd_is_in_fairy_combo~=true then
|
||
table.insert(starList,v)
|
||
end
|
||
end
|
||
if #sunnyList > 0 and #lunaList > 0 and #starList > 0 then
|
||
--最大连线距离
|
||
local maxDistance = 2000
|
||
for sunnyK,sunnyV in pairs(sunnyList) do
|
||
for lunaK,lunaV in pairs(lunaList) do
|
||
--计算连线距离,如果小于
|
||
if math.floor(GetDistanceBetweenTwoVec2D(sunnyV:GetAbsOrigin(), lunaV:GetAbsOrigin()) + 0.5) <= maxDistance then
|
||
for starK,starV in pairs(starList) do
|
||
--计算连线距离,如果小于
|
||
if math.floor(GetDistanceBetweenTwoVec2D(starV:GetAbsOrigin(), lunaV:GetAbsOrigin()) + 0.5) <= maxDistance and math.floor(GetDistanceBetweenTwoVec2D(starV:GetAbsOrigin(), sunnyV:GetAbsOrigin()) + 0.5) <= maxDistance then
|
||
sunny = sunnyV
|
||
luna = lunaV
|
||
star = starV
|
||
break
|
||
end
|
||
end
|
||
end
|
||
if sunny ~= nil then break end
|
||
end
|
||
if sunny ~= nil then break end
|
||
end
|
||
end
|
||
|
||
if sunny~=nil and luna~=nil and star~=nil then
|
||
local sunny_effectIndex = ParticleManager:CreateParticle("particles/heroes/daiyousei/ability_daiyousei_03.vpcf", PATTACH_CUSTOMORIGIN, sunny)
|
||
ParticleManager:SetParticleControlEnt(sunny_effectIndex , 0, sunny, 5, "attach_hitloc", Vector(0,0,0), true)
|
||
ParticleManager:SetParticleControlEnt(sunny_effectIndex , 1, luna, 5, "attach_hitloc", Vector(0,0,0), true)
|
||
|
||
local luna_effectIndex = ParticleManager:CreateParticle("particles/heroes/daiyousei/ability_daiyousei_03.vpcf", PATTACH_CUSTOMORIGIN, luna)
|
||
ParticleManager:SetParticleControlEnt(luna_effectIndex , 0, luna, 5, "attach_hitloc", Vector(0,0,0), true)
|
||
ParticleManager:SetParticleControlEnt(luna_effectIndex , 1, star, 5, "attach_hitloc", Vector(0,0,0), true)
|
||
|
||
local star_effectIndex = ParticleManager:CreateParticle("particles/heroes/daiyousei/ability_daiyousei_03.vpcf", PATTACH_CUSTOMORIGIN, star)
|
||
ParticleManager:SetParticleControlEnt(star_effectIndex , 0, star, 5, "attach_hitloc", Vector(0,0,0), true)
|
||
ParticleManager:SetParticleControlEnt(star_effectIndex , 1, sunny, 5, "attach_hitloc", Vector(0,0,0), true)
|
||
|
||
sunny.thtd_is_in_fairy_combo = true
|
||
star.thtd_is_in_fairy_combo = true
|
||
luna.thtd_is_in_fairy_combo = true
|
||
|
||
self.thtd_combo_fairyList =
|
||
{
|
||
sunny = sunny,
|
||
star = star,
|
||
luna = luna,
|
||
}
|
||
self:SetContextThink(DoUniqueString("thtd_fairy_combo"),
|
||
function()
|
||
if GameRules:IsGamePaused() then return 0.03 end
|
||
if THTD_IsValid(self) == false or THTD_IsValid(star) == false or THTD_IsValid(luna) == false then
|
||
ParticleManager:DestroyParticleSystem(luna_effectIndex,true)
|
||
luna.thtd_is_in_fairy_combo = nil
|
||
|
||
ParticleManager:DestroyParticleSystem(star_effectIndex,true)
|
||
star.thtd_is_in_fairy_combo = nil
|
||
|
||
ParticleManager:DestroyParticleSystem(sunny_effectIndex,true)
|
||
sunny.thtd_is_in_fairy_combo = nil
|
||
|
||
sunny.thtd_combo_fairyList = nil
|
||
|
||
self:GetOwner():THTD_HeroComboRefresh()
|
||
return nil
|
||
end
|
||
return 0.03
|
||
end,
|
||
0)
|
||
end
|
||
end
|
||
combo = {}
|
||
return comboVoiceTable
|
||
end
|
||
|
||
function CDOTA_BaseNPC:THTD_wriggle_thtd_combo(combo)
|
||
local comboVoiceTable = {}
|
||
if HasCombo(combo,"wriggle_rumia") then
|
||
if self.thtd_wriggle_rumia_combo ~= true then
|
||
self.thtd_wriggle_rumia_combo = true
|
||
end
|
||
else
|
||
if self.thtd_wriggle_rumia_combo ~= false then
|
||
self.thtd_wriggle_rumia_combo = false
|
||
end
|
||
end
|
||
combo = {}
|
||
return comboVoiceTable
|
||
end
|
||
|
||
|
||
function UpdatePrismriverComboName(caster,target)
|
||
if target.thtd_prismriver_comboName == nil then
|
||
target.thtd_prismriver_comboName = {[1]="",[2]="",[3]=""}
|
||
end
|
||
target.thtd_prismriver_comboName[1] = target.thtd_prismriver_comboName[2]
|
||
target.thtd_prismriver_comboName[2] = target.thtd_prismriver_comboName[3]
|
||
target.thtd_prismriver_comboName[3] = caster:GetUnitName()
|
||
end
|
||
|
||
function GetPrismriverComboName(target)
|
||
if target.thtd_prismriver_comboName == nil then
|
||
target.thtd_prismriver_comboName = {[1]="",[2]="",[3]=""}
|
||
end
|
||
return target.thtd_prismriver_comboName[1]..target.thtd_prismriver_comboName[2]..target.thtd_prismriver_comboName[3]
|
||
end
|
||
|
||
function ResetPrismriverComboName(target)
|
||
target.thtd_prismriver_comboName = {[1]="",[2]="",[3]=""}
|
||
end
|
||
|
||
function GetCountPrismriver(target)
|
||
if target.thtd_prismriver_comboName == nil then return 0 end
|
||
local count = 0
|
||
if target.thtd_prismriver_comboName[1] ~= "" then
|
||
count = count + 1
|
||
end
|
||
if target.thtd_prismriver_comboName[2] ~= "" then
|
||
count = count + 1
|
||
end
|
||
if target.thtd_prismriver_comboName[3] ~= "" then
|
||
count = count + 1
|
||
end
|
||
return count
|
||
end
|