1439 lines
48 KiB
Lua
Executable File
1439 lines
48 KiB
Lua
Executable File
THTD_MAX_BONUS_TOWER = 3
|
||
|
||
local thtd_skin_list =
|
||
{
|
||
["suwako"] =
|
||
{
|
||
[1] = "models/thd_hero/suwako/cloth01/suwako_cloth01.vmdl",
|
||
},
|
||
["meirin"] =
|
||
{
|
||
[1] = "models/thd_hero/meirin/cloth01/meirin_cloth01.vmdl",
|
||
},
|
||
["sanae"] =
|
||
{
|
||
[1] = "models/thd_hero/sanae/cloth01/sanae_jk.vmdl",
|
||
},
|
||
["mystia"] =
|
||
{
|
||
[1] = "models/thd_hero/mystia/cloth01/mystia_cloth01.vmdl",
|
||
},
|
||
}
|
||
|
||
function OnTouhouReleaseTowerSpellStart(keys)
|
||
local caster = keys.caster
|
||
local target = keys.target
|
||
|
||
if caster:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="not_enough_item_slot"})
|
||
EmitSoundOn("Sound_THTD.thtd_star_up_fail", caster)
|
||
return
|
||
end
|
||
|
||
if target:THTD_IsTower() and target:GetOwner() == caster then
|
||
local item = target.thtd_item
|
||
if item == nil then return end
|
||
|
||
if item.locked_by_player_id == nil then
|
||
target:THTD_DropItemAll()
|
||
end
|
||
target:AddNewModifier(caster, nil, "modifier_touhoutd_release_hidden", {})
|
||
target:SetAbsOrigin(Vector(0,0,0))
|
||
target:AddNoDraw()
|
||
target:THTD_DestroyLevelEffect()
|
||
target:RemoveModifierByName("modifier_hidden_bar")
|
||
target:THTD_ResetTowerDamage()
|
||
|
||
item:THTD_UpdateItemStarLevel()
|
||
caster:AddItem(item)
|
||
|
||
for k,v in pairs(caster.thtd_hero_tower_list) do
|
||
if v == target then
|
||
table.remove(caster.thtd_hero_tower_list,k)
|
||
break
|
||
end
|
||
end
|
||
|
||
for k,v in pairs(caster.thtd_hero_tower_list) do
|
||
if v==nil or v:IsNull() or v:IsAlive()==false or v:THTD_IsHidden() then
|
||
table.remove(caster.thtd_hero_tower_list,k)
|
||
end
|
||
end
|
||
|
||
caster.thtd_game_info["food_count"] = #caster.thtd_hero_tower_list
|
||
SetNetTableTowerList(caster)
|
||
|
||
-- 取消相关buff
|
||
for k,v in pairs(caster.thtd_hero_tower_list) do
|
||
if v ~= target then
|
||
local modifiers = v:FindAllModifiers()
|
||
for _, modifier in pairs(modifiers) do
|
||
if modifier:GetCaster() == target and THTD_IsRemainBuff(modifier:GetName()) == false then modifier:Destroy() end
|
||
end
|
||
end
|
||
end
|
||
|
||
local entities = Entities:FindAllByClassname("npc_dota_creature")
|
||
for k,v in pairs(entities) do
|
||
if v~=nil and v:IsNull()==false and v:IsAlive() and v.thtd_spawn_unit_owner~=nil and v.thtd_spawn_unit_owner==target then
|
||
v:AddNoDraw()
|
||
v:ForceKill(false)
|
||
end
|
||
end
|
||
|
||
local unitName = target:GetUnitName()
|
||
|
||
-- 取消来源本单位的buff
|
||
if unitName == "hatate" then
|
||
local inners = THTD_FindUnitsInner(target)
|
||
local outers = THTD_FindUnitsOuter(target)
|
||
for k,v in pairs(inners) do
|
||
if THTD_IsValid(v) and v:HasModifier("modifier_hatate01_news_buff") then
|
||
if v:FindModifierByName("modifier_hatate01_news_buff"):GetCaster() == target then
|
||
v:RemoveModifierByName("modifier_hatate01_news_buff")
|
||
end
|
||
end
|
||
end
|
||
for k,v in pairs(outers) do
|
||
if THTD_IsValid(v) and v:HasModifier("modifier_hatate01_news_buff") then
|
||
if v:FindModifierByName("modifier_hatate01_news_buff"):GetCaster() == target then
|
||
v:RemoveModifierByName("modifier_hatate01_news_buff")
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 取消辉夜buff
|
||
for i=1,4 do
|
||
local buff = "modifier_kaguya_03_"..i.."_buff"
|
||
if target:HasModifier(buff) then
|
||
target:RemoveModifierByName(buff)
|
||
end
|
||
end
|
||
|
||
caster:THTD_HeroComboRefresh()
|
||
end
|
||
end
|
||
|
||
function PutTowerToPoint(keys)
|
||
local caster = keys.caster
|
||
if caster:IsRealHero() == false then return end
|
||
local targetPoint = keys.target_points[1]
|
||
local itemName = keys.ability:GetAbilityName()
|
||
local tower = keys.ability.tower
|
||
local playerid = caster:GetPlayerOwnerID()
|
||
|
||
if caster.thtd_game_info["food_count"] ~= #caster.thtd_hero_tower_list then
|
||
caster.thtd_game_info["food_count"] = #caster.thtd_hero_tower_list
|
||
SetNetTableTowerList(caster)
|
||
end
|
||
if caster.thtd_game_info["food_count"] >= GameRules.GameData.max_food then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "display_custom_error", {msg="not_enough_food"} )
|
||
return
|
||
end
|
||
|
||
if IsMaxCountCheckOK(caster, itemName) == false then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "display_custom_error", {msg="the_same_card_reach_to_limit"} )
|
||
return
|
||
end
|
||
|
||
if SpawnSystem.IsUnLimited == false and IsBonusTower(itemName) and GetBonusTowerCount(caster) >= THTD_MAX_BONUS_TOWER then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "show_message", {msg="#bonus_tower_limit", duration=5, params={count=1}, color="#0ff"} )
|
||
return
|
||
end
|
||
|
||
if GameRules.GameData.new_card_list ~= "" and string.find(","..GameRules.GameData.new_card_list..",",","..keys.ability:THTD_GetCardName()..",") ~= nil and GameRules.PlayerData[caster:GetPlayerOwnerID()].vip == 0 and tostring(PlayerResource:GetSteamID(caster:GetPlayerOwnerID())) ~= GameRules.GameData.admin then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="new_card_test_tip"})
|
||
return
|
||
end
|
||
|
||
if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE and SpawnSystem.IsUnLimited == false and IsBonusTower(itemName) then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="funny_mode_bonus_no_use_tip"})
|
||
end
|
||
|
||
if tower == nil then
|
||
local spawnTowerName = towerNameList[itemName]["cardname"]
|
||
tower = CreateUnitByName(
|
||
spawnTowerName,
|
||
targetPoint,
|
||
false,
|
||
caster,
|
||
caster,
|
||
caster:GetTeam()
|
||
)
|
||
|
||
if (GameRules.GameData.is_open_day == 1 or GameRules.PlayerData[playerid].vip == 1 or tostring(PlayerResource:GetSteamID(playerid)) == GameRules.GameData.admin) and thtd_skin_list[spawnTowerName] ~= nil then
|
||
local skin_index = RandomInt(1, #thtd_skin_list[spawnTowerName])
|
||
local model_name = thtd_skin_list[spawnTowerName][skin_index]
|
||
|
||
tower:SetModel(model_name)
|
||
tower:SetOriginalModel(model_name)
|
||
end
|
||
|
||
tower:SetControllableByPlayer(playerid, true)
|
||
tower:SetOwner(caster)
|
||
tower:SetHullRadius(50)
|
||
FindClearSpaceForUnit(tower, targetPoint, false)
|
||
|
||
tower:SetForwardVector(Vector(0,-1,tower:GetForwardVector().z))
|
||
keys.ability.tower = tower
|
||
else
|
||
if tower:GetOwner() ~= caster then
|
||
tower:SetOwner(caster)
|
||
tower:SetControllableByPlayer(playerid, true)
|
||
end
|
||
tower:SetAbsOrigin(targetPoint)
|
||
tower:SetContextThink(DoUniqueString("FindClearSpaceForUnit"),
|
||
function()
|
||
if GetDistanceBetweenTwoVec2D(tower:GetOrigin(),targetPoint) < 100 then
|
||
tower:RemoveModifierByName("modifier_touhoutd_release_hidden")
|
||
tower:RemoveNoDraw()
|
||
FindClearSpaceForUnit(tower, targetPoint, false)
|
||
tower:THTD_DestroyLevelEffect()
|
||
tower:THTD_CreateLevelEffect()
|
||
return nil
|
||
end
|
||
return 0.1
|
||
end,
|
||
0)
|
||
tower:SetForwardVector((Vector(0,0,128)-caster:GetAbsOrigin()):Normalized())
|
||
end
|
||
|
||
tower:SetHealth(1)
|
||
|
||
if keys.ability:THTD_IsCardHasVoice() == true then
|
||
EmitSoundOn(THTD_GetVoiceEvent(towerNameList[itemName]["cardname"],"spawn"),tower)
|
||
end
|
||
|
||
tower.thtd_item = keys.ability
|
||
caster:TakeItem(keys.ability)
|
||
tower:SetMana(0)
|
||
caster:EmitSound("Sound_THTD.thtd_set_tower")
|
||
|
||
table.insert(caster.thtd_hero_tower_list,tower)
|
||
caster.thtd_game_info["food_count"] = #caster.thtd_hero_tower_list
|
||
SetNetTableTowerList(caster)
|
||
|
||
tower:AddNewModifier(caster, nil, "modifier_touhoutd_building", {})
|
||
tower:SetContextThink(DoUniqueString("thtd_modifier_touhoutd_building"),
|
||
function()
|
||
if GameRules:IsGamePaused() then return 0.03 end
|
||
if tower:GetHealth() >= tower:GetMaxHealth() then
|
||
tower:AddNewModifier(tower, nil, "modifier_hidden_bar", {})
|
||
tower:RemoveModifierByName("modifier_touhoutd_building")
|
||
|
||
caster:THTD_HeroComboRefresh()
|
||
tower:SetLuckDay()
|
||
tower:EnableAi()
|
||
return nil
|
||
end
|
||
tower:SetHealth(tower:GetHealth()+4)
|
||
return 0.04
|
||
end,
|
||
0)
|
||
|
||
if tower.isFirstSpawn ~= true then
|
||
tower.isFirstSpawn = true
|
||
tower:THTD_InitExp()
|
||
tower:AddNewModifier(caster, nil, "modifier_touhoutd_root", {})
|
||
else
|
||
tower:THTD_DestroyLevelEffect()
|
||
tower:THTD_CreateLevelEffect()
|
||
end
|
||
|
||
local modifiers = tower:FindAllModifiers()
|
||
for _, modifier in pairs(modifiers) do
|
||
if THTD_IsRemainBuff(modifier:GetName()) == false and modifier:GetCaster() ~= tower and THTD_IsValid(modifier:GetCaster()) == false then
|
||
modifier:Destroy()
|
||
end
|
||
end
|
||
|
||
local powerLevelFromItem = tower.thtd_power_from_item or 0
|
||
local powerLevelFromCard = 0
|
||
if GameRules.PlayerData[playerid]["level_list"] ~= nil then
|
||
powerLevelFromCard = GameRules.PlayerData[playerid]["level_list"][itemName] or 0
|
||
end
|
||
local count = math.min(999, powerLevelFromItem + powerLevelFromCard)
|
||
local modifier = tower:FindModifierByName("modifier_fairy_count")
|
||
if modifier == nil then
|
||
if count > 0 then
|
||
tower:AddNewModifier(tower, nil, "modifier_fairy_count", nil):SetStackCount(count)
|
||
end
|
||
elseif count ~= modifier:GetStackCount() then
|
||
if count > 0 then
|
||
modifier:SetStackCount(count)
|
||
else
|
||
tower.thtd_power_level = nil
|
||
target:RemovePowerBonus()
|
||
tower:RemoveAbility("e316")
|
||
tower:RemoveModifierByName('modifier_texiao_star')
|
||
end
|
||
end
|
||
|
||
if tower:HasModifier("modifier_fairy_count") then
|
||
if towerNameList[itemName]["quality"] == 1 then
|
||
tower.thtd_power_level = tower:FindModifierByName("modifier_fairy_count"):GetStackCount()
|
||
tower:AddPowerBonus()
|
||
AddAbilityAndSetLevel(tower, "e316")
|
||
tower:EmitSound("Sound_THTD.thtd_star_up")
|
||
end
|
||
end
|
||
end
|
||
|
||
|
||
THTD_STAR_ITEM =
|
||
{
|
||
[1] = "item_1003",
|
||
[2] = "item_1004",
|
||
[3] = "item_1005",
|
||
[4] = "item_1006",
|
||
}
|
||
|
||
THTD_SEIGA_STAR_ITEM =
|
||
{
|
||
[1] = "item_1011",
|
||
[2] = "item_1012",
|
||
[3] = "item_1013",
|
||
[4] = "item_1014",
|
||
}
|
||
|
||
function StarUp(keys)
|
||
local caster = keys.caster
|
||
local player = caster:GetPlayerOwner()
|
||
local hero = player:GetAssignedHero()
|
||
local star = caster:THTD_GetStar()
|
||
|
||
-- print("-----------this tower buffs:")
|
||
-- local modifiers = caster:FindAllModifiers()
|
||
-- for _, modifier in pairs(modifiers) do
|
||
-- print(modifier:GetName())
|
||
-- end
|
||
-- print("-----------enemy buffs:")
|
||
-- local buffs = {}
|
||
-- local targets = THTD_FindUnitsAll(caster)
|
||
-- for k, v in pairs(targets) do
|
||
-- local modifiers = v:FindAllModifiers()
|
||
-- for _, modifier in pairs(modifiers) do
|
||
-- local name = modifier:GetName()
|
||
-- local isExist = false
|
||
-- for _, b in pairs(buffs) do
|
||
-- if b == name then
|
||
-- isExist = true
|
||
-- break
|
||
-- end
|
||
-- end
|
||
-- if not isExist then
|
||
-- table.insert(buffs, name)
|
||
-- print(name)
|
||
-- end
|
||
-- end
|
||
-- end
|
||
|
||
-- local ens = Entities:FindAllInSphere(caster:GetAbsOrigin(), 3000)
|
||
-- for k,v in pairs(ens) do
|
||
-- print("---------------")
|
||
-- print(v:GetClassname())
|
||
-- if v:GetClassname() == "dota_death_prophet_exorcism_spirit" then
|
||
-- -- print(v:GetUnitName())
|
||
-- local f = v:GetOwner()
|
||
-- if f ~= nil then print(f:GetUnitName()) end
|
||
-- -- v:Kill()
|
||
-- -- UTIL_Remove(v)
|
||
-- end
|
||
-- end
|
||
|
||
|
||
|
||
if caster:THTD_GetLevel() < THTD_MAX_LEVEL or star >= 5 then
|
||
if player then
|
||
EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster)
|
||
end
|
||
return
|
||
end
|
||
|
||
composeItem = {}
|
||
|
||
for item_slot = 0,5 do
|
||
local item = caster:GetItemInSlot(item_slot)
|
||
if item ~= nil and item.locked_by_player_id == nil then
|
||
local tower = item:THTD_GetTower()
|
||
if tower ~= nil and tower:THTD_GetStar() == star and tower:THTD_GetLevel() == THTD_MAX_LEVEL then
|
||
if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE and tower:GetUnitName() == "minoriko" then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="minoriko_cannot_be_material"})
|
||
else
|
||
table.insert(composeItem,item)
|
||
end
|
||
end
|
||
if item:GetAbilityName() == THTD_STAR_ITEM[star] or item:GetAbilityName() == THTD_SEIGA_STAR_ITEM[star] then
|
||
table.insert(composeItem,item)
|
||
end
|
||
end
|
||
end
|
||
|
||
for item_slot = 0,5 do
|
||
local item = hero:GetItemInSlot(item_slot)
|
||
if item ~= nil and item.locked_by_player_id == nil then
|
||
local tower = item:THTD_GetTower()
|
||
if tower ~= nil and tower:THTD_GetStar() == star and tower:THTD_GetLevel() == THTD_MAX_LEVEL then
|
||
if GameRules:GetCustomGameDifficulty() >= FUNNY_MODE and tower:GetUnitName() == "minoriko" then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="minoriko_cannot_be_material"})
|
||
else
|
||
table.insert(composeItem,item)
|
||
end
|
||
end
|
||
if item:GetAbilityName() == THTD_STAR_ITEM[star] or item:GetAbilityName() == THTD_SEIGA_STAR_ITEM[star] then
|
||
table.insert(composeItem,item)
|
||
end
|
||
end
|
||
end
|
||
|
||
if (#composeItem >= star) then
|
||
for i=1,star do
|
||
OnItemDestroyed(caster, composeItem[i], false)
|
||
end
|
||
caster:THTD_StarUp()
|
||
else
|
||
EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster)
|
||
end
|
||
composeItem = {}
|
||
end
|
||
|
||
function ExpUp(keys)
|
||
local caster = keys.caster
|
||
local player = caster:GetPlayerOwner()
|
||
local hero = player:GetAssignedHero()
|
||
|
||
item = caster:GetItemInSlot(0)
|
||
|
||
if item ~= nil then
|
||
if item:THTD_GetCardName() == nil or string.find(item:THTD_GetCardName(),"item_20") ~= nil then
|
||
EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster)
|
||
return
|
||
end
|
||
|
||
if item.locked_by_player_id ~= nil then
|
||
EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster)
|
||
if player then
|
||
CustomGameEventManager:Send_ServerToPlayer(player , "display_custom_error", {msg="item_is_locked"} )
|
||
end
|
||
return
|
||
end
|
||
|
||
caster:EmitSound("Sound_THTD.thtd_exp_up")
|
||
local tower = item:THTD_GetTower()
|
||
local exp = 3000
|
||
if tower ~= nil then
|
||
if tower:GetUnitName() == "minoriko" and GameRules:GetCustomGameDifficulty() >= FUNNY_MODE then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="minoriko_cannot_be_material"})
|
||
EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster)
|
||
return
|
||
end
|
||
exp = (1000 + tower:THTD_GetExp()/5)*1500*(item:THTD_GetCardQuality()+1)/1000
|
||
end
|
||
if item:THTD_GetCardName() == caster:GetUnitName() then
|
||
caster:THTD_SetAbilityLevelUp()
|
||
elseif item:THTD_GetCardName() == "BonusEgg" then
|
||
exp = (1000 + 5400/5)*1500*(item:THTD_GetCardQuality()+1)/1000
|
||
end
|
||
caster:THTD_AddExp(exp)
|
||
OnItemDestroyed(caster, item, false)
|
||
else
|
||
EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster)
|
||
end
|
||
end
|
||
|
||
function BlinkToPoint(keys)
|
||
local caster = keys.caster
|
||
local targetPoint = keys.target_points[1]
|
||
|
||
-- 向量a点,b点,用b-a是a朝向b
|
||
-- local forward = (targetPoint - caster:GetAbsOrigin()):Normalized()
|
||
-- FindClearSpaceForUnit(caster, caster:GetAbsOrigin() + forward * 200, false)
|
||
|
||
FindClearSpaceForUnit(caster, targetPoint, false)
|
||
caster:EmitSound("Sound_THTD.ability_touhoutd_blink.End")
|
||
|
||
if RollPercentage(50) then
|
||
if caster:HasModifier("modifier_rainbow_tail") then
|
||
caster:RemoveModifierByName("modifier_rainbow_tail")
|
||
else
|
||
caster:AddNewModifier(caster, nil, "modifier_rainbow_tail", nil)
|
||
end
|
||
end
|
||
end
|
||
|
||
function OnKillUnitSpellStart(keys)
|
||
local caster = EntIndexToHScript(keys.caster_entindex)
|
||
local target = keys.target
|
||
-- PrintTable(keys.ability:GetAbilityKeyValues())
|
||
caster:EmitSound("Sound_THTD.ability_touhoutd_kill")
|
||
local effectIndex = ParticleManager:CreateParticle("particles/econ/items/lina/lina_ti6/lina_ti6_laguna_blade.vpcf", PATTACH_CUSTOMORIGIN, caster)
|
||
ParticleManager:SetParticleControl(effectIndex, 0, caster:GetOrigin()+Vector(0,0,128))
|
||
ParticleManager:SetParticleControl(effectIndex, 1, target:GetOrigin())
|
||
ParticleManager:DestroyParticleSystem(effectIndex,false)
|
||
|
||
if target.is_random_boss == nil or target:GetHealthPercent() <= 50 then
|
||
caster:NpcKill(target)
|
||
else
|
||
target:SetHealth(math.max(10, target:GetHealth() - target:GetMaxHealth() * 0.5))
|
||
end
|
||
end
|
||
|
||
function CloseStar(keys)
|
||
local caster = keys.caster
|
||
|
||
if caster.thtd_close_star ~= true then
|
||
caster.thtd_close_star = true
|
||
else
|
||
caster.thtd_close_star = false
|
||
end
|
||
|
||
for index,tower in pairs(caster.thtd_hero_tower_list) do
|
||
if tower ~= nil and tower:IsNull() == false then
|
||
if caster.thtd_close_star == true and tower.thtd_is_effect_open == true and caster.focusTarget ~= tower then
|
||
tower:THTD_DestroyLevelEffect()
|
||
elseif caster.thtd_close_star == false and tower.thtd_is_effect_open == false then
|
||
tower:THTD_CreateLevelEffect()
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
function OnTouhoutdExUp(keys)
|
||
local caster = EntIndexToHScript(keys.caster_entindex)
|
||
local target = keys.target
|
||
|
||
if not target:THTD_IsTower() then
|
||
return
|
||
end
|
||
|
||
if target:GetUnitName() == "rumia" and target:THTD_GetStar() == 5 and target:GetOwner() == caster and caster.thtd_ability_rumia_ex_lock ~= true then
|
||
target:EmitSound("Hero_Wisp.Tether")
|
||
caster.thtd_ability_rumia_ex_lock = true
|
||
target:THTD_UpgradeEx()
|
||
target:SetAttackCapability(DOTA_UNIT_CAP_MELEE_ATTACK)
|
||
target:SetModel("models/thd2/rumia_ex/rumia_ex.vmdl")
|
||
target:SetOriginalModel("models/thd2/rumia_ex/rumia_ex.vmdl")
|
||
target:SetModelScale(0.7)
|
||
local modifier = target:AddNewModifier(target, nil, "modifier_attack_time", {})
|
||
modifier:SetStackCount(6)
|
||
|
||
local attack_power_ability=target:FindAbilityByName("ability_common_power_buff")
|
||
if attack_power_ability ~= nil then
|
||
if attack_power_ability:GetLevel() < attack_power_ability:GetMaxLevel() then
|
||
attack_power_ability:SetLevel(5)
|
||
end
|
||
end
|
||
|
||
return
|
||
end
|
||
|
||
if caster:GetPlayerOwnerID() ~= target:GetPlayerOwnerID() then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="target_is_error"})
|
||
return
|
||
end
|
||
|
||
if tostring(PlayerResource:GetSteamID(caster:GetPlayerOwnerID())) == GameRules.GameData.admin then
|
||
if target.thtd_power_level == nil then
|
||
if caster.is_team_mode ~= true then
|
||
local unitName = target:GetUnitName()
|
||
if unitName ~= "minoriko" and unitName ~= "sizuha" and unitName ~= "lily" and unitName ~= "nazrin" then
|
||
caster.is_team_mode = true
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_chat_msg", {msg="#team_rank_tip", params={player_name=PlayerResource:GetPlayerName(caster:GetPlayerOwnerID()),reason="潜能已激活"}})
|
||
end
|
||
end
|
||
target.thtd_power_level = 10
|
||
local modifier = target:FindModifierByName("modifier_fairy_count") or target:AddNewModifier(target, nil, "modifier_fairy_count", nil)
|
||
modifier:SetStackCount(10)
|
||
AddAbilityAndSetLevel(target, "e316")
|
||
target:EmitSound("Sound_THTD.thtd_star_up")
|
||
elseif target.thtd_power_level == 10 then
|
||
target.thtd_power_level = 50
|
||
target:FindModifierByName("modifier_fairy_count"):SetStackCount(50)
|
||
target:EmitSound("Sound_THTD.thtd_star_up")
|
||
elseif target.thtd_power_level == 50 then
|
||
target.thtd_power_level = 100
|
||
target:FindModifierByName("modifier_fairy_count"):SetStackCount(100)
|
||
target:EmitSound("Sound_THTD.thtd_star_up")
|
||
elseif target.thtd_power_level == 100 then
|
||
target.thtd_power_level = 666
|
||
target:FindModifierByName("modifier_fairy_count"):SetStackCount(666)
|
||
target:EmitSound("Sound_THTD.thtd_star_up")
|
||
elseif target.thtd_power_level == 666 then
|
||
target.thtd_power_level = 999
|
||
target:FindModifierByName("modifier_fairy_count"):SetStackCount(999)
|
||
target:EmitSound("Sound_THTD.thtd_star_up")
|
||
elseif target.thtd_power_level == 999 then
|
||
target.thtd_power_level = nil
|
||
target:RemoveModifierByName("modifier_fairy_count")
|
||
target:RemovePowerBonus()
|
||
target:RemoveAbility("e316")
|
||
target:RemoveModifierByName('modifier_texiao_star')
|
||
target:EmitSound("Sound_THTD.thtd_star_up_fail")
|
||
end
|
||
target:AddPowerBonus()
|
||
else
|
||
if target.thtd_power_level == nil and target:HasModifier("modifier_fairy_count") then
|
||
if caster.is_team_mode ~= true then
|
||
local unitName = target:GetUnitName()
|
||
if unitName ~= "minoriko" and unitName ~= "sizuha" and unitName ~= "lily" and unitName ~= "nazrin" then
|
||
caster.is_team_mode = true
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_chat_msg", {msg="#team_rank_tip", params={player_name=PlayerResource:GetPlayerName(caster:GetPlayerOwnerID()),reason="潜能已激活"}})
|
||
end
|
||
end
|
||
target.thtd_power_level = target:FindModifierByName("modifier_fairy_count"):GetStackCount()
|
||
target:AddPowerBonus()
|
||
AddAbilityAndSetLevel(target, "e316")
|
||
target:EmitSound("Sound_THTD.thtd_star_up")
|
||
end
|
||
end
|
||
end
|
||
|
||
function OnIntervalThinkHeroEffect(keys)
|
||
local caster = EntIndexToHScript(keys.caster_entindex)
|
||
if caster:GetUnitName() ~= "npc_dota_hero_juggernaut" then return end
|
||
local effectFile = {
|
||
-- "particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_v2_idle_rare.vpcf",
|
||
"particles/econ/items/juggernaut/jugg_arcana/juggernaut_arcana_loadout_rare_model.vpcf"
|
||
}
|
||
local attachment = {
|
||
"attach_hitloc",
|
||
-- "blade_attachment",
|
||
-- "attach_sword"
|
||
}
|
||
|
||
if caster.display_effect ~= nil then
|
||
ParticleManager:DestroyParticleSystem(caster.display_effect, true)
|
||
end
|
||
|
||
local effectRandom = RandomInt(1, #effectFile)
|
||
local effectAttach = attachment[RandomInt(1, #attachment)]
|
||
-- print(effectRandom)
|
||
-- print(effectAttach)
|
||
local effectIndex = ParticleManager:CreateParticle(effectFile[effectRandom], PATTACH_CUSTOMORIGIN, caster)
|
||
ParticleManager:SetParticleControlEnt(effectIndex , 0, caster, 5, effectAttach, Vector(0,0,0), true)
|
||
caster.display_effect = effectIndex
|
||
-- if effectRandom == 1 then
|
||
-- ParticleManager:SetParticleControlEnt(effectIndex , 1, caster, 5, effectAttach, Vector(-70,-110,0), true)
|
||
-- ParticleManager:SetParticleControlEnt(effectIndex , 3, caster, 5, effectAttach, Vector(0,0,0), true)
|
||
-- else
|
||
-- ParticleManager:SetParticleControlEnt(effectIndex , 3, caster, 5, effectAttach, Vector(0,0,0), true)
|
||
-- end
|
||
end
|
||
|
||
function DrawNormalCard(keys)
|
||
local caster = keys.caster
|
||
local playerid = caster:GetPlayerOwnerID()
|
||
|
||
if caster:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT or caster:IsRealHero() == false then
|
||
if keys.ability:IsItem()==false then
|
||
PlayerResource:ModifyGold(caster:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem)
|
||
end
|
||
local player = caster:GetPlayerOwner()
|
||
EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster)
|
||
if player then
|
||
if caster:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then
|
||
CustomGameEventManager:Send_ServerToPlayer(player, "display_custom_error", {msg="not_enough_item_slot"})
|
||
end
|
||
end
|
||
return
|
||
end
|
||
|
||
local drawList = {}
|
||
drawList[1] = {}
|
||
drawList[2] = {}
|
||
|
||
for k,v in pairs(towerPlayerList[caster.thtd_player_id+1]) do
|
||
if v["quality"] == 1 and v["itemName"] ~= "BonusEgg" then
|
||
for i=1,v["count"] do
|
||
table.insert(drawList[1],v["itemName"])
|
||
end
|
||
elseif v["quality"] == 2 and v["itemName"] ~= "BonusEgg" then
|
||
for i=1,v["count"] do
|
||
table.insert(drawList[2],v["itemName"])
|
||
end
|
||
end
|
||
end
|
||
|
||
local rChance = 20
|
||
local chance = RandomInt(1,100)
|
||
local itemName = nil
|
||
if chance <= rChance then
|
||
if #drawList[2] > 0 then
|
||
itemName = drawList[2][RandomInt(1,#drawList[2])]
|
||
else
|
||
THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), 1000 , true, DOTA_ModifyGold_SellItem)
|
||
end
|
||
else
|
||
if #drawList[1] > 0 then
|
||
itemName = drawList[1][RandomInt(1,#drawList[1])]
|
||
else
|
||
THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), 250 , true, DOTA_ModifyGold_SellItem)
|
||
end
|
||
end
|
||
if caster:THTD_AddCardPoolItem(itemName) == false then
|
||
if keys.ability:IsItem()==false then
|
||
PlayerResource:ModifyGold(caster:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem)
|
||
end
|
||
return
|
||
end
|
||
|
||
if GameRules.player_bb_buff[playerid]["item_3012"] > 0 and RollPercentage(GameRules.player_bb_buff[playerid]["item_3012"]) then
|
||
local quality = towerNameList[itemName]["quality"]
|
||
local itemBonus = nil
|
||
if quality == 2 then
|
||
itemBonus = CreateItem("item_2004", nil, nil)
|
||
elseif quality == 3 then
|
||
itemBonus = CreateItem("item_2003", nil, nil)
|
||
elseif quality == 4 then
|
||
itemBonus = CreateItem("item_2002", nil, nil)
|
||
end
|
||
if itemBonus ~= nil then
|
||
itemBonus.owner_player_id = playerid
|
||
itemBonus:SetPurchaser(caster)
|
||
itemBonus:SetPurchaseTime(1.0)
|
||
|
||
if caster:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then
|
||
CreateItemOnPositionSync(caster:GetAbsOrigin(), itemBonus)
|
||
else
|
||
caster:AddItem(itemBonus)
|
||
end
|
||
end
|
||
end
|
||
|
||
if keys.ability:IsItem() then
|
||
local charge = keys.ability:GetCurrentCharges()
|
||
if charge > 1 then
|
||
keys.ability:SetCurrentCharges(charge-1)
|
||
else
|
||
caster:RemoveItem(keys.ability)
|
||
end
|
||
else
|
||
if GameRules.player_bb_buff[playerid]["item_3018"] < 1 then
|
||
PlayerResource:ModifyGold(playerid, math.floor((keys.ability:GetGoldCost(keys.ability:GetLevel()-1)) * (1 - GameRules.player_bb_buff[playerid]["item_3018"])) , true, DOTA_ModifyGold_SellItem)
|
||
end
|
||
end
|
||
|
||
drawList = {}
|
||
end
|
||
|
||
function DrawSeniorCard(keys)
|
||
local caster = keys.caster
|
||
local playerid = caster:GetPlayerOwnerID()
|
||
|
||
if caster:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT or caster:IsRealHero() == false then
|
||
if keys.ability:IsItem()==false then
|
||
PlayerResource:ModifyGold(caster:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem)
|
||
end
|
||
EmitSoundOn("Sound_THTD.thtd_star_up_fail",caster)
|
||
local player = caster:GetPlayerOwner()
|
||
if player then
|
||
if caster:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then
|
||
CustomGameEventManager:Send_ServerToPlayer(player, "display_custom_error", {msg="not_enough_item_slot"})
|
||
end
|
||
end
|
||
return
|
||
end
|
||
|
||
local drawList = {}
|
||
drawList[2] = {}
|
||
drawList[3] = {}
|
||
drawList[4] = {}
|
||
|
||
for k,v in pairs(towerPlayerList[caster:GetPlayerOwnerID()+1]) do
|
||
if v["quality"] == 2 and v["itemName"] ~= "BonusEgg" then
|
||
for i=1,v["count"] do
|
||
table.insert(drawList[2],v["itemName"])
|
||
end
|
||
elseif v["quality"] == 3 and v["itemName"] ~= "BonusEgg" then
|
||
for i=1,v["count"] do
|
||
table.insert(drawList[3],v["itemName"])
|
||
end
|
||
elseif v["quality"] == 4 and v["itemName"] ~= "BonusEgg" then
|
||
for i=1,v["count"] do
|
||
table.insert(drawList[4],v["itemName"])
|
||
end
|
||
end
|
||
end
|
||
|
||
local ssrChance = 5
|
||
local srChance = 20
|
||
|
||
local chance = RandomInt(1,100)
|
||
if caster.thtd_chance_count["SSR"] == nil then
|
||
caster.thtd_chance_count["SSR"] = 0
|
||
end
|
||
if caster.thtd_chance_count["SSR"] >= 100/ssrChance then
|
||
chance = 1
|
||
end
|
||
if chance > ssrChance then
|
||
caster.thtd_chance_count["SSR"] = caster.thtd_chance_count["SSR"] + 1
|
||
end
|
||
|
||
local itemName = nil
|
||
if chance <= ssrChance then
|
||
caster.thtd_chance_count["SSR"] = 0
|
||
if #drawList[4] > 0 then
|
||
itemName = drawList[4][RandomInt(1,#drawList[4])]
|
||
else
|
||
THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), 5000 , true, DOTA_ModifyGold_SellItem)
|
||
end
|
||
elseif chance <= (ssrChance + srChance) then
|
||
if #drawList[3] > 0 then
|
||
itemName = drawList[3][RandomInt(1,#drawList[3])]
|
||
else
|
||
THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), 2500 , true, DOTA_ModifyGold_SellItem)
|
||
end
|
||
else
|
||
if #drawList[2] > 0 then
|
||
itemName = drawList[2][RandomInt(1,#drawList[2])]
|
||
else
|
||
THTD_ModifyGoldEx(caster:GetPlayerOwnerID(), 1000 , true, DOTA_ModifyGold_SellItem)
|
||
end
|
||
end
|
||
if caster:THTD_AddCardPoolItem(itemName) == false then
|
||
if keys.ability:IsItem()==false then
|
||
PlayerResource:ModifyGold(caster:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem)
|
||
end
|
||
return
|
||
end
|
||
|
||
if GameRules.player_bb_buff[playerid]["item_3012"] > 0 and RollPercentage(GameRules.player_bb_buff[playerid]["item_3012"]) then
|
||
local quality = towerNameList[itemName]["quality"]
|
||
local itemBonus = nil
|
||
if quality == 2 then
|
||
itemBonus = CreateItem("item_2004", nil, nil)
|
||
elseif quality == 3 then
|
||
itemBonus = CreateItem("item_2003", nil, nil)
|
||
elseif quality == 4 then
|
||
itemBonus = CreateItem("item_2002", nil, nil)
|
||
end
|
||
if itemBonus ~= nil then
|
||
itemBonus.owner_player_id = playerid
|
||
itemBonus:SetPurchaser(caster)
|
||
itemBonus:SetPurchaseTime(1.0)
|
||
|
||
if caster:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then
|
||
CreateItemOnPositionSync(caster:GetAbsOrigin(), itemBonus)
|
||
else
|
||
caster:AddItem(itemBonus)
|
||
end
|
||
end
|
||
end
|
||
|
||
if keys.ability:IsItem() then
|
||
local charge = keys.ability:GetCurrentCharges()
|
||
if charge > 1 then
|
||
keys.ability:SetCurrentCharges(charge-1)
|
||
else
|
||
caster:RemoveItem(keys.ability)
|
||
end
|
||
else
|
||
if GameRules.player_bb_buff[playerid]["item_3018"] < 1 then
|
||
PlayerResource:ModifyGold(playerid, math.floor((keys.ability:GetGoldCost(keys.ability:GetLevel()-1)) * (1 - GameRules.player_bb_buff[playerid]["item_3018"])) , true, DOTA_ModifyGold_SellItem)
|
||
end
|
||
end
|
||
|
||
drawList = {}
|
||
end
|
||
|
||
local itemReplaceOrigin =
|
||
{
|
||
[1] = Vector(-2100,3540,144),
|
||
[2] = Vector(1830,3540,144),
|
||
[3] = Vector(1830,-2300,144),
|
||
[4] = Vector(-2100,-2300,144)
|
||
}
|
||
|
||
function SortItem(keys)
|
||
local caster = keys.caster
|
||
local playerid = caster:GetPlayerOwnerID()
|
||
|
||
-- 弹出储藏处物品
|
||
if caster:GetNumItemsInStash() > 0 then
|
||
for i=THTD_MAX_ITEM_SLOT,THTD_ITEM_TPSCROLL_SLOT-1 do
|
||
local targetItem = caster:GetItemInSlot(i)
|
||
if targetItem ~= nil and targetItem:IsNull() == false then
|
||
caster:EjectItemFromStash(targetItem)
|
||
local box = targetItem:GetContainer()
|
||
if box ~= nil then
|
||
box:SetAbsOrigin(caster.spawn_position)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
local sortedItemPos = {}
|
||
local iH = 0
|
||
local iV = 0
|
||
local items = Entities:FindAllByClassname("dota_item_drop")
|
||
table.sort(items, function(a,b)
|
||
local aItem = a:GetContainedItem()
|
||
local bItem = b:GetContainedItem()
|
||
if aItem ~= nil and bItem == nil then return true end
|
||
if aItem == nil and bItem ~= nil then return false end
|
||
if aItem == nil and bItem == nil then return true end
|
||
if aItem:IsStackable() == true and bItem:IsStackable() == false then return true end
|
||
if aItem:IsStackable() == false and bItem:IsStackable() == true then return false end
|
||
local aName = aItem:GetAbilityName()
|
||
local bName = bItem:GetAbilityName()
|
||
if string.sub(aName,1,6) ~= "item_3" and string.sub(bName,1,6) == "item_3" then return true end
|
||
if string.sub(aName,1,6) == "item_3" and string.sub(bName,1,6) ~= "item_3" then return false end
|
||
if string.sub(aName,1,6) == "item_3" and string.sub(bName,1,6) == "item_3" then return tonumber(string.sub(aName,7,9)) < tonumber(string.sub(bName,7,9)) end
|
||
local aData = towerNameList[aName]
|
||
local bData = towerNameList[bName]
|
||
if aData ~= nil and bData == nil then return true end
|
||
if aData == nil and bData ~= nil then return false end
|
||
if aData == nil and bData == nil then return aName < bName end
|
||
if aData["cardname"] == "BonusEgg" and bData["cardname"] ~= "BonusEgg" then return true end
|
||
if aData["cardname"] ~= "BonusEgg" and bData["cardname"] == "BonusEgg" then return false end
|
||
if string.sub(aData["cardname"],1,5) == "item_" and string.sub(bData["cardname"],1,5) ~= "item_" then return true end
|
||
if string.sub(aData["cardname"],1,5) ~= "item_" and string.sub(bData["cardname"],1,5) == "item_" then return false end
|
||
return (aData["quality"] > bData["quality"])
|
||
end)
|
||
for _,v in pairs(items) do
|
||
local containedItem = v:GetContainedItem()
|
||
if containedItem.locked_by_player_id == nil and (containedItem.owner_player_id == playerid or (containedItem:GetPurchaser() ~= nil and containedItem:GetPurchaser():GetPlayerOwnerID() == playerid)) then
|
||
local itemName = containedItem:GetAbilityName()
|
||
if sortedItemPos[itemName] == nil then
|
||
sortedItemPos[itemName] = GetSpawnLineOffsetVector(caster.spawn_index, itemReplaceOrigin[caster.spawn_index], iH * 200, iV * 200)
|
||
if iH < 9 then
|
||
iH = iH + 1
|
||
else
|
||
iH = 0
|
||
iV = iV + 1
|
||
end
|
||
end
|
||
v:SetAbsOrigin(sortedItemPos[itemName])
|
||
THTD_ItemSetScale(containedItem)
|
||
end
|
||
end
|
||
sortedItemPos = {}
|
||
end
|
||
|
||
function OnIntervalThinkAutoCast(keys)
|
||
if keys.ability:GetAutoCastState() then
|
||
if keys.ability:GetLevel() ~= 2 then
|
||
keys.ability:SetLevel(2)
|
||
end
|
||
else
|
||
if keys.ability:GetLevel() ~= 1 then
|
||
keys.ability:SetLevel(1)
|
||
end
|
||
end
|
||
end
|
||
|
||
function BuyEgg(keys)
|
||
local caster = keys.caster
|
||
local hero = caster:GetHero()
|
||
|
||
if hero:GetNumItemsInInventory() >= THTD_MAX_ITEM_SLOT then
|
||
PlayerResource:ModifyGold(hero:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem)
|
||
CustomGameEventManager:Send_ServerToPlayer(hero:GetPlayerOwner(), "display_custom_error", {msg="not_enough_item_slot"})
|
||
return
|
||
end
|
||
|
||
caster:EmitSound("Sound_THTD.thtd_buy")
|
||
|
||
local item = CreateItem(keys.item_name, hero, hero)
|
||
if item ~= nil then
|
||
item.owner_player_id = hero.thtd_player_id
|
||
hero:AddItem(item)
|
||
else
|
||
PlayerResource:ModifyGold(hero:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem)
|
||
end
|
||
end
|
||
|
||
local roll_card_type =
|
||
{
|
||
[1] = {
|
||
["Level1"] = 1,
|
||
},
|
||
[2] = {
|
||
["Level1"] = 2,
|
||
},
|
||
[3] = {
|
||
["Level2"] = 3,
|
||
},
|
||
[4] = {
|
||
["Level2"] = 3,
|
||
["Level3"] = 1,
|
||
},
|
||
[5] = {
|
||
["Level3"] = 5,
|
||
},
|
||
}
|
||
|
||
function RollCard(keys)
|
||
local caster = keys.caster
|
||
local hero = caster:GetHero()
|
||
local level = keys.ability:GetLevel() + 2
|
||
|
||
caster:EmitSound("UI.Xidd")
|
||
|
||
if hero.is_game_over == true then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="hero_is_game_over"})
|
||
return
|
||
end
|
||
|
||
if caster.roll_card_count == nil then
|
||
caster.roll_card_count = 0
|
||
end
|
||
|
||
if caster.roll_card_count >= 50 then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="roll_card_reach_to_max"})
|
||
PlayerResource:ModifyGold(caster:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem)
|
||
return
|
||
end
|
||
|
||
if caster.roll_card_count >= SpawnSystem.CurWave then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="roll_card_reach_to_wave"})
|
||
PlayerResource:ModifyGold(caster:GetPlayerOwnerID(), keys.ability:GetGoldCost(keys.ability:GetLevel()-1) , true, DOTA_ModifyGold_SellItem)
|
||
return
|
||
end
|
||
|
||
caster.roll_card_count = caster.roll_card_count + 1
|
||
print("----- roll_card_count : ", caster.roll_card_count)
|
||
|
||
local count = 0
|
||
for k,v in pairs(roll_card_type[level]) do
|
||
if k == "Level1" then
|
||
local drawList = {}
|
||
|
||
drawList[1] = {}
|
||
for k,v in pairs(towerNameList) do
|
||
if v["quality"] == 1 and v["cardname"] ~= "BonusEgg" then
|
||
table.insert(drawList[1],k)
|
||
end
|
||
end
|
||
|
||
for i=1,v do
|
||
local item = CreateItem(drawList[1][RandomInt(1,#drawList[1])], nil, nil)
|
||
if item ~= nil then
|
||
item.owner_player_id = hero.thtd_player_id
|
||
item:SetPurchaser(hero)
|
||
item:SetPurchaseTime(1.0)
|
||
local origin = GetSpawnLineOffsetVector(hero.spawn_index, hero.spawn_position, count * 130, -150)
|
||
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_shinki/ability_shinki_01.vpcf", PATTACH_CUSTOMORIGIN, nil)
|
||
ParticleManager:SetParticleControl(effectIndex, 0, origin - Vector(0,0,750))
|
||
ParticleManager:DestroyParticleSystem(effectIndex,false)
|
||
caster:SetContextThink(DoUniqueString("thtd_shinki_01_effect_wait"),
|
||
function()
|
||
if GameRules:IsGamePaused() then return 0.03 end
|
||
CreateItemOnPositionSync(origin,item)
|
||
THTD_ItemSetScale(item)
|
||
return nil
|
||
end,
|
||
3.0)
|
||
count = count + 1
|
||
end
|
||
end
|
||
|
||
elseif k == "Level2" then
|
||
local drawList = {}
|
||
|
||
drawList[1] = {}
|
||
drawList[2] = {}
|
||
|
||
for k,v in pairs(towerNameList) do
|
||
if v["quality"] == 1 and v["cardname"] ~= "BonusEgg" then
|
||
table.insert(drawList[1],k)
|
||
elseif v["quality"] == 2 and v["cardname"] ~= "BonusEgg" and v["cardname"] ~= "item_2021" then
|
||
table.insert(drawList[2],k)
|
||
end
|
||
end
|
||
|
||
for i=1,v do
|
||
local chance = RandomInt(0,100)
|
||
local item = nil
|
||
if chance <=20 then
|
||
if #drawList[2] > 0 then
|
||
item = CreateItem(drawList[2][RandomInt(1,#drawList[2])], nil, nil)
|
||
end
|
||
elseif chance > 20 then
|
||
if #drawList[1] > 0 then
|
||
item = CreateItem(drawList[1][RandomInt(1,#drawList[1])], nil, nil)
|
||
end
|
||
end
|
||
|
||
if item~=nil then
|
||
item.owner_player_id = hero.thtd_player_id
|
||
item:SetPurchaser(hero)
|
||
item:SetPurchaseTime(1.0)
|
||
local origin
|
||
if string.sub(item:GetAbilityName(), 1, 6) == "item_2" then
|
||
origin = GetSpawnLineOffsetVector(hero.spawn_index, hero.spawn_position, count * 130, 0)
|
||
else
|
||
origin = GetSpawnLineOffsetVector(hero.spawn_index, hero.spawn_position, count * 130, -150)
|
||
end
|
||
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_shinki/ability_shinki_01.vpcf", PATTACH_CUSTOMORIGIN, nil)
|
||
ParticleManager:SetParticleControl(effectIndex, 0, origin - Vector(0,0,750))
|
||
ParticleManager:DestroyParticleSystem(effectIndex,false)
|
||
caster:SetContextThink(DoUniqueString("thtd_shinki_01_effect_wait"),
|
||
function()
|
||
if GameRules:IsGamePaused() then return 0.03 end
|
||
CreateItemOnPositionSync(origin,item)
|
||
THTD_ItemSetScale(item)
|
||
return nil
|
||
end,
|
||
3.0)
|
||
count = count + 1
|
||
end
|
||
end
|
||
|
||
elseif k == "Level3" then
|
||
local drawList = {}
|
||
|
||
drawList[2] = {}
|
||
drawList[3] = {}
|
||
drawList[4] = {}
|
||
|
||
for k,v in pairs(towerNameList) do
|
||
if v["quality"] == 2 and v["cardname"] ~= "BonusEgg" and v["cardname"] ~= "item_2021" then
|
||
table.insert(drawList[2],k)
|
||
elseif v["quality"] == 3 and v["cardname"] ~= "BonusEgg" and v["cardname"] ~= "item_2022" and v["cardname"] ~= "item_2001" then
|
||
table.insert(drawList[3],k)
|
||
elseif v["quality"] == 4 and v["cardname"] ~= "BonusEgg" then
|
||
table.insert(drawList[4],k)
|
||
end
|
||
end
|
||
|
||
for i=1,v do
|
||
local chance = RandomInt(1,100)
|
||
|
||
if caster.thtd_chance_count == nil then
|
||
caster.thtd_chance_count = {}
|
||
end
|
||
if caster.thtd_chance_count["shinki_SSR"] == nil then
|
||
caster.thtd_chance_count["shinki_SSR"] = 0
|
||
end
|
||
if caster.thtd_chance_count["shinki_SSR"] >= 20 then
|
||
chance = 0
|
||
end
|
||
if chance > 5 then
|
||
caster.thtd_chance_count["shinki_SSR"] = caster.thtd_chance_count["shinki_SSR"] + 1
|
||
end
|
||
|
||
local item = nil
|
||
if chance <=5 then
|
||
caster.thtd_chance_count["shinki_SSR"] = 0
|
||
if #drawList[4] > 0 then
|
||
item = CreateItem(drawList[4][RandomInt(1,#drawList[4])], nil, nil)
|
||
end
|
||
elseif chance <= 25 then
|
||
if #drawList[3] > 0 then
|
||
item = CreateItem(drawList[3][RandomInt(1,#drawList[3])], nil, nil)
|
||
end
|
||
elseif chance > 25 then
|
||
if #drawList[2] > 0 then
|
||
item = CreateItem(drawList[2][RandomInt(1,#drawList[2])], nil, nil)
|
||
end
|
||
end
|
||
|
||
if item~=nil then
|
||
item.owner_player_id = hero.thtd_player_id
|
||
item:SetPurchaser(hero)
|
||
item:SetPurchaseTime(1.0)
|
||
local origin
|
||
if string.sub(item:GetAbilityName(), 1, 6) == "item_2" then
|
||
origin = GetSpawnLineOffsetVector(hero.spawn_index, hero.spawn_position, count * 130, 0)
|
||
else
|
||
if item:THTD_GetCardQuality() == 4 then
|
||
origin = GetSpawnLineOffsetVector(hero.spawn_index, hero.spawn_position, count * 130, -150*2)
|
||
else
|
||
origin = GetSpawnLineOffsetVector(hero.spawn_index, hero.spawn_position, count * 130, -150)
|
||
end
|
||
end
|
||
local effectIndex = ParticleManager:CreateParticle("particles/heroes/thtd_shinki/ability_shinki_01.vpcf", PATTACH_CUSTOMORIGIN, nil)
|
||
ParticleManager:SetParticleControl(effectIndex, 0, origin - Vector(0,0,750))
|
||
ParticleManager:DestroyParticleSystem(effectIndex,false)
|
||
caster:SetContextThink(DoUniqueString("thtd_shinki_01_effect_wait"),
|
||
function()
|
||
if GameRules:IsGamePaused() then return 0.03 end
|
||
CreateItemOnPositionSync(origin,item)
|
||
THTD_ItemSetScale(item)
|
||
return nil
|
||
end,
|
||
3.0)
|
||
count = count + 1
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
if caster.roll_card_count == 8 then
|
||
keys.ability:SetLevel(2)
|
||
elseif caster.roll_card_count == 16 then
|
||
keys.ability:SetLevel(3)
|
||
end
|
||
end
|
||
|
||
function SkipWave(keys)
|
||
local caster = keys.caster
|
||
local hero = caster:GetHero()
|
||
|
||
local goldCost = keys.ability:GetGoldCost(keys.ability:GetLevel()-1)
|
||
local keyCount = keys.ability:GetSpecialValueFor("count")
|
||
|
||
if not SpawnSystem.IsUnLimited then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="only_unlimited_wave"})
|
||
PlayerResource:ModifyGold(hero:GetPlayerOwnerID(), goldCost, true, DOTA_ModifyGold_SellItem)
|
||
return
|
||
end
|
||
if SpawnSystem.ReachToWave ~= nil then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="skip_wave_exist"})
|
||
PlayerResource:ModifyGold(hero:GetPlayerOwnerID(), goldCost, true, DOTA_ModifyGold_SellItem)
|
||
return
|
||
end
|
||
|
||
local count = 0
|
||
local hTPSlotItem = hero:GetItemInSlot(DOTA_ITEM_TP_SCROLL)
|
||
if hTPSlotItem then
|
||
count = hTPSlotItem:GetCurrentCharges()
|
||
end
|
||
if keyCount > 0 then
|
||
if count < keyCount then
|
||
PlayerResource:ModifyGold(hero:GetPlayerOwnerID(), goldCost, true, DOTA_ModifyGold_SellItem)
|
||
CustomGameEventManager:Send_ServerToPlayer(hero:GetPlayerOwner(), "display_custom_error", {msg="not_enough_key_count"})
|
||
return
|
||
end
|
||
count = count - keyCount
|
||
if count <= 0 then
|
||
hTPSlotItem:RemoveSelf()
|
||
else
|
||
hTPSlotItem:SetCurrentCharges(count)
|
||
end
|
||
Service:SaveKeyCount(hero.thtd_player_id)
|
||
end
|
||
|
||
SpawnSystem.ReachToWave = SpawnSystem.CurWave - 50 + keys.AddWave
|
||
if SpawnSystem.CurWave <= 150 and SpawnSystem.ReachToWave > 100 then
|
||
SpawnSystem:RemoveBoss()
|
||
end
|
||
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_chat_msg", {msg="#skip_wave_tip", params={player_name=PlayerResource:GetPlayerName(caster:GetPlayerOwnerID()),item_name=keys.ItemName,wave=SpawnSystem.ReachToWave}})
|
||
EmitAnnouncerSound("Quest.Completed")
|
||
end
|
||
|
||
local bonus_tower_table =
|
||
{
|
||
"minoriko",
|
||
"nazrin",
|
||
"lily",
|
||
"daiyousei",
|
||
"sizuha",
|
||
"toramaru",
|
||
"seiga",
|
||
}
|
||
|
||
function IsBonusTower(itemName, isUnit)
|
||
local towerName
|
||
if isUnit == true then
|
||
towerName = itemName
|
||
else
|
||
towerName = towerNameList[itemName]["cardname"]
|
||
end
|
||
for k,v in pairs(bonus_tower_table) do
|
||
if v == towerName then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function GetBonusTowerCount(hero)
|
||
local count = 0
|
||
for k,v in pairs(hero.thtd_hero_tower_list) do
|
||
if IsBonusTower(v:GetUnitName(), true) then
|
||
count = count + 1
|
||
end
|
||
end
|
||
return count
|
||
end
|
||
|
||
function AddManaRegenPercentage(keys)
|
||
keys.caster:THTD_AddManaRegenPercentage(keys.mana_regen, "ability_common_mana_regen_bonus")
|
||
end
|
||
|
||
function AddPowerAttackPercentage(keys)
|
||
keys.caster:THTD_AddPowerPercentage(keys.power_up, "ability_common_power_bonus")
|
||
keys.caster:THTD_AddAttackPercentage(keys.power_up, "ability_common_power_bonus")
|
||
end
|
||
|
||
function AddAttackSpeed(keys)
|
||
keys.caster:THTD_AddAttackSpeed(keys.attack_speed, "ability_common_attack_speed", true)
|
||
end
|
||
|
||
function OnEquipItem(keys)
|
||
local caster = keys.caster
|
||
local item = keys.ability
|
||
print()
|
||
print("-----"..caster:GetUnitName().." equip "..item:GetAbilityName())
|
||
-- 不延时有bug
|
||
if caster:THTD_IsTower() then
|
||
caster:SetContextThink(DoUniqueString("dota_timer"),
|
||
function()
|
||
if GameRules:IsGamePaused() then return 0.06 end
|
||
caster:ItemEquipBonus(item)
|
||
return nil
|
||
end,
|
||
0.15)
|
||
end
|
||
end
|
||
|
||
function OnUnequipItem(keys)
|
||
local caster = keys.caster
|
||
local item = keys.ability
|
||
print()
|
||
print("-----"..caster:GetUnitName().." unequip "..item:GetAbilityName())
|
||
if caster:THTD_IsTower() then
|
||
caster:SetContextThink(DoUniqueString("dota_timer"),
|
||
function()
|
||
if GameRules:IsGamePaused() then return 0.06 end
|
||
caster:ItemEquipBonus(item)
|
||
return nil
|
||
end,
|
||
0.15)
|
||
end
|
||
end
|
||
|
||
function OnCloseAI(keys)
|
||
local caster = keys.caster
|
||
|
||
-- local base_power = caster.thtd_attack
|
||
-- local percentage = caster:THTD_GetAttackPercentage()
|
||
-- local bonus_power = math.floor(base_power * percentage/100)
|
||
-- print("----percentage : ", tostring(percentage).."%")
|
||
-- print("base attack : ", base_power)
|
||
-- print("bonus attack : ", bonus_power)
|
||
print("crit : ", caster:THTD_GetCritDamage())
|
||
print("chance : ", caster:THTD_GetCritChance())
|
||
|
||
if caster.thtd_close_ai ~= true then
|
||
caster.thtd_close_ai = true
|
||
CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="#change_to_close_ai", duration=5, params={}, color="#0ff"} )
|
||
else
|
||
caster.thtd_close_ai = false
|
||
CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="#change_to_open_ai", duration=5, params={}, color="#0ff"} )
|
||
-- 神子和幽幽子,是否开启大招
|
||
local unitName = caster:GetUnitName()
|
||
if unitName=="miko" then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "ai_skill_enable", {entity=caster:GetEntityIndex(), name=unitName, skill=4})
|
||
-- thtd_miko_04_cast
|
||
elseif unitName=="yuyuko" then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "ai_skill_enable", {entity=caster:GetEntityIndex(), name=unitName, skill=3})
|
||
-- thtd_yuyuko_03_cast
|
||
elseif unitName=="keine" then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "ai_skill_enable", {entity=caster:GetEntityIndex(), name=unitName, skill=2})
|
||
-- thtd_keine_02_cast
|
||
elseif unitName=="patchouli" then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner() , "ai_skill_enable", {entity=caster:GetEntityIndex(), name=unitName, skill=2})
|
||
-- thtd_patchouli_02_cast
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 定点施放技能
|
||
function OnCastPointAI(keys)
|
||
local caster = EntIndexToHScript(keys.caster_entindex)
|
||
local targetPoint = keys.target_points[1]
|
||
local range = GetDistanceBetweenTwoVec2D(caster:GetOrigin(), targetPoint)
|
||
if range <= 100 then
|
||
caster.thtd_last_cast_point = nil
|
||
CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="#change_to_close_cast_on_fixed_point", duration=5, params={}, color="#0ff"} )
|
||
elseif range > keys.ability:GetCastRange() then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="cast_range_out"})
|
||
else
|
||
caster.thtd_last_cast_point = targetPoint
|
||
CustomGameEventManager:Send_ServerToPlayer( caster:GetPlayerOwner() , "show_message", {msg="#change_to_open_cast_on_fixed_point", duration=5, params={}, color="#0ff"} )
|
||
end
|
||
end
|
||
|
||
-- 玩具
|
||
function OnSpellStartCosmetic( event )
|
||
local caster = event.caster
|
||
local abilityname = event.Ability
|
||
local ability = caster:AddAbility(abilityname)
|
||
-- 所有玩具技能清单在官方的PUI的images\spellicons\consumables下同名称
|
||
ability:SetLevel(1)
|
||
ability:EndCooldown()
|
||
ability:SetHidden(true)
|
||
ability:CastAbility()
|
||
caster:SetContextThink(DoUniqueString("dota_timer"),
|
||
function()
|
||
caster:RemoveAbility(abilityname)
|
||
return nil
|
||
end,
|
||
0.3)
|
||
end
|
||
|
||
-- 礼物包
|
||
function OnSpellStartBundle( keys )
|
||
local caster = keys.caster
|
||
local playerid = caster:GetPlayerOwnerID()
|
||
|
||
if not caster:IsRealHero() then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="only_hero_use"})
|
||
keys.ability:EndCooldown()
|
||
return
|
||
end
|
||
|
||
if caster:GetNumItemsInInventory() > 6 then
|
||
CustomGameEventManager:Send_ServerToPlayer(caster:GetPlayerOwner(), "display_custom_error", {msg="not_enough_item_slot"})
|
||
return
|
||
end
|
||
|
||
keys.ability:RemoveSelf()
|
||
-- caster:AddItemByName(keys.Item1)
|
||
-- caster:AddItemByName(keys.Item2)
|
||
-- caster:AddItemByName(keys.Item3)
|
||
-- caster:AddItemByName(keys.Item4)
|
||
for i=1,4 do
|
||
local item = CreateItem(keys["Item"..tostring(i)], nil, nil)
|
||
if item ~= nil then
|
||
item.owner_player_id = playerid
|
||
caster:AddItem(item)
|
||
end
|
||
end
|
||
end
|
||
|
||
function IsMaxCountCheckOK(hero, itemName)
|
||
local towerName = towerNameList[itemName]["cardname"]
|
||
local quality = towerNameList[itemName]["quality"]
|
||
local maxCount = (5 - quality) * 2
|
||
|
||
maxCount = math.floor(maxCount * (1 + (GameRules.player_bb_buff[hero.thtd_player_id]["item_3020"] or 0)/100))
|
||
|
||
if quality > 1 then
|
||
local count = 0
|
||
for k,v in pairs(hero.thtd_hero_tower_list) do
|
||
if v:GetUnitName() == towerName then
|
||
count = count + 1
|
||
end
|
||
end
|
||
if count >= maxCount then
|
||
return false
|
||
else
|
||
return true
|
||
end
|
||
else
|
||
return true
|
||
end
|
||
end
|
||
|
||
function OnCreatedDecreaseArmor(keys)
|
||
keys.target:AddPhysicalArmor(-keys.armor)
|
||
end
|
||
|
||
function OnDestroyDecreaseArmor(keys)
|
||
keys.target:AddPhysicalArmor(keys.armor)
|
||
end
|
||
|
||
function OnCreatedDecreaseMagicArmor(keys)
|
||
keys.target:AddMagicalResist(-keys.magic_armor)
|
||
end
|
||
|
||
function OnDestroyDecreaseMagicArmor(keys)
|
||
keys.target:AddMagicalResist(keys.magic_armor)
|
||
end
|