я столкнулся с проблемой, код вроде как работает и отнимает ресурсы если они так уж и быть были, но если их нет - не беда, все равно мы дадим картование скила.
library AbilityCostLib initializer Init
private function GetAbilityGold takes integer abilid returns integer
return LoadInteger(udg_Hashtable, StringHash("KingAbilityCost | Gold"), abilid)
endfunction
private function GetAbilityWood takes integer abilid returns integer
return LoadInteger(udg_Hashtable, StringHash("KingAbilityCost | Wood"), abilid)
endfunction
private function GetAbilityFood takes integer abilid returns integer
return LoadInteger(udg_Hashtable, StringHash("KingAbilityCost | Food"), abilid)
endfunction
private function SaveAbilityCost takes integer abilid, integer gold, integer wood, integer food returns nothing
call SaveInteger(udg_Hashtable, StringHash("KingAbilityCost | Gold"), abilid, gold)
call SaveInteger(udg_Hashtable, StringHash("KingAbilityCost | Wood"), abilid, wood)
call SaveInteger(udg_Hashtable, StringHash("KingAbilityCost | Food"), abilid, food)
endfunction
private function InitAbilityCost takes nothing returns nothing
// Шаблон способности: Айди, золото, дерево, пища
call SaveAbilityCost('A00H', 300, 0, 0) //Массовая благодать
call SaveAbilityCost('A01I', 3000, 1500, 24) //Королевские гвардейцы
call SaveAbilityCost('A01H', 3000, 1500, 24) //Королевские Лучники
call SaveAbilityCost('A01J', 3000, 1500, 8) //Капитан Гвардии
call SaveAbilityCost('A01Y', 500, 0, 0) //Ярость Нежити
call SaveAbilityCost('A03R', 200, 0, 3) //Белый Волк
call SaveAbilityCost('A03H', 1000, 0, 0) //Темная Стая(Король)
call SaveAbilityCost('A08C', 600, 400, 0) //Спавн шахты
endfunction
//=========================================================================================================
private function CheckAbilityCost_Conditions takes nothing returns boolean
local integer abGold = GetAbilityGold(GetSpellAbilityId())
local integer abWood = GetAbilityWood(GetSpellAbilityId())
local integer abFood = GetAbilityFood(GetSpellAbilityId())
return abGold > 0 or abWood > 0 or abFood > 0
endfunction
private function GetUnusedFood takes player target returns integer
return GetPlayerState(target, PLAYER_STATE_RESOURCE_FOOD_CAP) - GetPlayerState(target, PLAYER_STATE_RESOURCE_FOOD_USED)
endfunction
private function CheckAbilityCost_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player pl = GetOwningPlayer(caster)
local integer userGold = GetPlayerState(pl, PLAYER_STATE_RESOURCE_GOLD)
local integer userWood = GetPlayerState(pl, PLAYER_STATE_RESOURCE_LUMBER)
local integer userFood = GetUnusedFood(pl)
local integer abGold = GetAbilityGold(GetSpellAbilityId())
local integer abWood = GetAbilityWood(GetSpellAbilityId())
local integer abFood = GetAbilityFood(GetSpellAbilityId())
if userGold >= abGold and userWood >= abWood and (userFood >= abFood or abFood == 0) then
call AdjustPlayerStateBJ(-abGold, pl, PLAYER_STATE_RESOURCE_GOLD)
call AdjustPlayerStateBJ(-abWood, pl, PLAYER_STATE_RESOURCE_LUMBER)
else
call IssueImmediateOrder(caster, "stop")
call DisplayTextToPlayer(pl, 0, 0, "У вас недостаточно ресурсов!")
endif
endfunction
//===========================================================================
private function Init takes nothing returns nothing
local trigger initACost = CreateTrigger()
local trigger checkCost = CreateTrigger()
call TriggerRegisterTimerEventSingle( initACost, 0.00 )
call TriggerAddAction( initACost, function InitAbilityCost )
call TriggerRegisterAnyUnitEventBJ( checkCost, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( checkCost, Condition( function CheckAbilityCost_Conditions ) )
call TriggerAddAction( checkCost, function CheckAbilityCost_Actions )
set checkCost = null
set initACost = null
endfunction
endlibrary
к сожалению сам не нашел проблему.
Принятый ответ
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Возможно стоит поменять событие каста способности с EVENT_PLAYER_UNIT_SPELL_EFFECT на
EVENT_PLAYER_UNIT_SPELL_CAST (начинает применять способность) , тогда и мана отниматься не будет. так как каст не пройдет при ошибке