144 lines
4.2 KiB
Lua
Executable File
144 lines
4.2 KiB
Lua
Executable File
-- 需启用 info.xml 的 creator.js
|
||
|
||
local PERMANENT_HERO_ABILITIES = {
|
||
"seasonal_summon_cny_balloon",
|
||
"seasonal_summon_ti9_balloon",
|
||
"seasonal_ti9_instruments",
|
||
"seasonal_decorate_tree",
|
||
"high_five",
|
||
"seasonal_ti9_banner",
|
||
}
|
||
|
||
local PATREON_LEVEL_FOR_ABILITY = {
|
||
["high_five"] = 0,
|
||
["seasonal_ti9_banner"] = 1,
|
||
["seasonal_summon_cny_balloon"] = 0,
|
||
["seasonal_summon_dragon"] = 0,
|
||
["seasonal_summon_cny_tree"] = 0,
|
||
["seasonal_firecrackers"] = 0,
|
||
["seasonal_ti9_shovel"] = 0,
|
||
["seasonal_ti9_instruments"] = 0,
|
||
["seasonal_ti9_monkey"] = 0,
|
||
["seasonal_summon_ti9_balloon"] = 0,
|
||
["seasonal_throw_snowball"] = 0,
|
||
["seasonal_festive_firework"] = 0,
|
||
["seasonal_decorate_tree"] = 0,
|
||
["seasonal_summon_snowman"] = 0,
|
||
}
|
||
|
||
local ABILITIES_CANT_BE_REMOVED = {
|
||
["high_five"] = true,
|
||
["seasonal_ti9_banner"] = true
|
||
}
|
||
|
||
local MAX_COSMETIC_ABILITIES = 6
|
||
|
||
local function GetCosmeticAbilitiesCount( npc )
|
||
local count = 0
|
||
|
||
for i = 0, npc:GetAbilityCount() - 1 do
|
||
local ability = npc:GetAbilityByIndex( i )
|
||
if ability and PATREON_LEVEL_FOR_ABILITY[ability:GetAbilityName()] then
|
||
count = count + 1
|
||
end
|
||
end
|
||
|
||
return count
|
||
end
|
||
|
||
local function AddAbilityIfNeed( npc, abilityName, sendReload )
|
||
if npc:IsRealHero() and not npc:FindAbilityByName( abilityName ) and PATREON_LEVEL_FOR_ABILITY[abilityName] and GetCosmeticAbilitiesCount( npc ) < MAX_COSMETIC_ABILITIES then
|
||
local new_ability = npc:AddAbility( abilityName )
|
||
|
||
new_ability:SetLevel( 1 )
|
||
new_ability:SetHidden( false )
|
||
|
||
if sendReload then
|
||
CustomGameEventManager:Send_ServerToAllClients( "cosmetic_abilities_reload_hud", nil )
|
||
end
|
||
end
|
||
end
|
||
|
||
ListenToGameEvent( "npc_spawned", function( keys )
|
||
local npc = EntIndexToHScript( keys.entindex )
|
||
|
||
if npc:IsRealHero() then
|
||
for _, ability_name in pairs( PERMANENT_HERO_ABILITIES ) do
|
||
AddAbilityIfNeed( npc, ability_name)
|
||
end
|
||
end
|
||
end, nil )
|
||
|
||
local function CheckAbilityAndUnit( abilityName, npcIndex )
|
||
local npc = EntIndexToHScript( npcIndex )
|
||
|
||
if not npc or not npc:GetClassname():find( "npc_dota_" ) or not PATREON_LEVEL_FOR_ABILITY[abilityName] then
|
||
return
|
||
end
|
||
|
||
-- if p and p.level < PATREON_LEVEL_FOR_ABILITY[abilityName] then
|
||
-- CustomGameEventManager:Send_ServerToPlayer( PlayerResource:GetPlayer( id ), "display_custom_error", { message = "#nopatreonerror" } )
|
||
-- return
|
||
-- end
|
||
|
||
return true
|
||
end
|
||
|
||
CustomGameEventManager:RegisterListener( "cosmetic_abilities_try_activate", function( id, keys )
|
||
CheckAbilityAndUnit( keys.ability, keys.unit )
|
||
end )
|
||
|
||
CustomGameEventManager:RegisterListener( "cosmetic_abilities_take", function( id, keys )
|
||
if CheckAbilityAndUnit( keys.ability, keys.unit ) then
|
||
AddAbilityIfNeed( EntIndexToHScript( keys.unit ), keys.ability, true )
|
||
end
|
||
end )
|
||
|
||
CustomGameEventManager:RegisterListener( "cosmetic_abilities_delete", function( id, keys )
|
||
if not PATREON_LEVEL_FOR_ABILITY[keys.ability] or ABILITIES_CANT_BE_REMOVED[keys.ability] then return end
|
||
EntIndexToHScript( keys.unit ):RemoveAbility( keys.ability )
|
||
CustomGameEventManager:Send_ServerToAllClients( "cosmetic_abilities_reload_hud", nil )
|
||
end )
|
||
|
||
|
||
|
||
--------------------------------------------------------------------------------
|
||
|
||
-- 最多放置7个,简洁方式
|
||
-- local TOY_ABILITY = {
|
||
-- ["high_five"] = 0,
|
||
-- ["seasonal_ti9_banner"] = 0,
|
||
-- ["seasonal_summon_cny_balloon"] = 1,
|
||
-- ["seasonal_summon_ti9_balloon"] = 1,
|
||
-- ["seasonal_summon_dragon"] = 0,
|
||
-- ["seasonal_summon_cny_tree"] = 0,
|
||
-- ["seasonal_firecrackers"] = 0,
|
||
-- ["seasonal_ti9_shovel"] = 0,
|
||
-- ["seasonal_ti9_instruments"] = 0,
|
||
-- ["seasonal_ti9_monkey"] = 0,
|
||
-- ["seasonal_throw_snowball"] = 0,
|
||
-- ["seasonal_festive_firework"] = 1,
|
||
-- ["seasonal_decorate_tree"] = 1,
|
||
-- ["seasonal_summon_snowman"] = 0,
|
||
-- }
|
||
|
||
-- -- 击掌和战斗旗帜,位于物品栏上方
|
||
-- ListenToGameEvent( "npc_spawned", function( keys )
|
||
-- local npc = EntIndexToHScript( keys.entindex )
|
||
-- if npc:IsRealHero() then
|
||
-- local count = 0
|
||
-- for k,v in pairs(TOY_ABILITY) do
|
||
-- if not npc:FindAbilityByName(k) then
|
||
-- if v == 1 then
|
||
-- local ability = npc:AddAbility(k)
|
||
-- ability:SetLevel( 1 )
|
||
-- ability:SetHidden( false )
|
||
-- count = count + 1
|
||
-- if count >= 7 then
|
||
-- break
|
||
-- end
|
||
-- end
|
||
-- end
|
||
-- end
|
||
-- end
|
||
-- end, nil ) |