Cooldown абилок с некоторым шансом.

  • Автор темы Автор темы Faith
  • Дата начала Дата начала

Faith

Пользователь
8 Сен 2016
18
0
Код:
function modifier_test_stats:OnAbilityExecuted(params)
 if IsServer() then
  local hHero = self:GetParent()
  local player = hHero:GetPlayerOwnerID()
  local rChance = 40 + hHero.int * 0.05
  local ability = params.ability
  if RollPercentage(rChance) then
   local manacost = ability:GetManaCost(ability:GetLevel() - 1)
   local cooldown = ability:GetCooldown(ability:GetLevel() - 1)
   hHero:SetMana(hHero:GetMana() + manacost)
   ability:StartCooldown(cooldown/2)
  end
 end
end

Кусок кода из луа модификатора, который работает криво.
При использовании абилок, проверяется шанс, если прокнуло , кд уменьшается в 2 раза + возращается мана за использование.
Мана возращается, кд не уменьшается - почему, немогу понять. Сначало думал что нельзя использовать функции с кд абилок при IsServer(), но при ВТФ моде кд уменьшается.
upd.
Так же не работает полное обнуление кулдауна - EndCooldown()
 
[quote author=Faith link=topic=1081.msg6129#msg6129 date=1473326859]
Код:
function modifier_test_stats:OnAbilityExecuted(params)
 if IsServer() then
  local hHero = self:GetParent()
  local player = hHero:GetPlayerOwnerID()
  local rChance = 40 + hHero.int * 0.05
  local ability = params.ability
  if RollPercentage(rChance) then
   local manacost = ability:GetManaCost(ability:GetLevel() - 1)
   local cooldown = ability:GetCooldown(ability:GetLevel() - 1)
   hHero:SetMana(hHero:GetMana() + manacost)
   ability:StartCooldown(cooldown/2)
  end
 end
end

Кусок кода из луа модификатора, который работает криво.
При использовании абилок, проверяется шанс, если прокнуло , кд уменьшается в 2 раза + возращается мана за использование.
Мана возращается, кд не уменьшается - почему, немогу понять. Сначало думал что нельзя использовать функции с кд абилок при IsServer(), но при ВТФ моде кд уменьшается.
upd.
Так же не работает полное обнуление кулдауна - EndCooldown()
[/quote]
Есть два стула.
params.ability - абилка которая наложила модификатор.
params.event_ability - абилка по нажатию которой сработал эвент.
Код:
function PassiveRefresh( keys )
	local caster 			= keys.caster
	local chance_ability 	= keys.ChanceAbility 
	local chance_ultimate 	= keys.ChanceUltimate 
	local ability 			= keys.event_ability

	if not ability then return end

	local ability_type = ability:GetAbilityType()

	if ability_type == DOTA_ABILITY_TYPE_ULTIMATE then
		chance_ability = chance_ultimate
	end

	if RollPercentage(chance_ability) then
		ability:EndCooldown() 
	end
	
end
 
CryDeS, спасибо.

Странно что при ВТФ моде, и ability:StartCooldown() все срабатывало через event.ability, да и мана рефрешилась, это и ввело меня в ступор.

UPD.
Через params.event_ability не получилось. Ссылается на пустую переменную ability.
Код:
function modifier_test_stats:OnAbilityExecuted(params)
 if IsServer() then
  local hHero = self:GetParent()
  local player = hHero:GetPlayerOwnerID()
  local refreshChance = 8 + hHero.int * 0.12
  local ability = params.event_ability
  if RollPercentage(refreshChance) then
   local particle = ParticleManager:CreateParticle("particles/units/heroes/hero_obsidian_destroyer/obsidian_destroyer_essence_effect.vpcf", PATTACH_ABSORIGIN, hHero)
   ParticleManager:SetParticleControl(particle, 0, hHero:GetAbsOrigin())
   local manacost = ability:GetManaCost(ability:GetLevel() - 1)
   local cooldown = ability:GetCooldown(ability:GetLevel() - 1)
   ability:StartCooldown(cooldown/2)
   hHero:SetMana(hHero:GetMana() + manacost)
  end
 end
end
 
Последнее редактирование модератором:
Faith, аблку обозначай self и, кстати, манакост можно просто убирать функцией self:RefundManaCost(), а не устанавливая ману

UPD: Ыыы, не заметил, что это модификатор
 
Faith, сделай DeepPrintTable(params) и возьми от туда нужный параметр
 
[quote author=Faith link=topic=1081.msg6137#msg6137 date=1473344018]
CryDeS, спасибо.

Странно что при ВТФ моде, и ability:StartCooldown() все срабатывало через event.ability, да и мана рефрешилась, это и ввело меня в ступор.

UPD.
Через params.event_ability не получилось. Ссылается на пустую переменную ability.
[/quote]
Запили тоже самое через датадривен, там точно есть event_ability.
Или принтани параметры, какие вообще есть.
 
params.ability - способность, которая вызвала ивент
 
Возможно после выполнения твоего кода абилка запускает стандартный кд
 
ZLOY, уже второй день не могу разобраться, если писать -wtf и использовать способности, то кд работает отлично. Но без -wtf кд всегда стандартное, даже если прокнуло.
CryDeS, датадривен не подходит, у меня там бонусы от статов зависят, и должны изменятся динамически.


Странно что и EndCooldown() так же не работает, пробовал сначало обнулят полностью, и сразу же стартовать новый с нужным мне значением.

Вот все параметры которые выдает DebugPrintTable(params) :
Код:
[  VScript       ]: ability:
[  VScript       ]: 		__self: userdata: 0x03292600
[  VScript       ]: activity: -1
[  VScript       ]: basher_tested: false
[  VScript       ]: cost: 0
[  VScript       ]: damage: 0
[  VScript       ]: damage_category: 0
[  VScript       ]: damage_flags: 0
[  VScript       ]: damage_type: -725810688
[  VScript       ]: diffusal_applied: false
[  VScript       ]: distance: 0
[  VScript       ]: do_not_consume: false
[  VScript       ]: fail_type: 2047
[  VScript       ]: gain: 0
[  VScript       ]: heart_regen_applied: false
[  VScript       ]: ignore_invis: false
[  VScript       ]: issuer_player_index: 1
[  VScript       ]: no_attack_cooldown: false
[  VScript       ]: order_type: 0
[  VScript       ]: original_damage: 0
[  VScript       ]: process_procs: true
[  VScript       ]: ranged_attack: false
[  VScript       ]: record: 0
[  VScript       ]: reincarnate: false
[  VScript       ]: target:
[  VScript       ]: 		__self: userdata: 0x032e4018
[  VScript       ]: unit:
[  VScript       ]: 		__self: userdata: 0x03278320
[  VScript       ]: 		agi: 5
[  VScript       ]: 		bFirstSpawned: true
[  VScript       ]: 		frd: 5
[  VScript       ]: 		int: 5
[  VScript       ]: 		lck: 5
[  VScript       ]: 		str: 5
 
Код:
Timers:CreateTimer(0.03,function()
	ability:EndCooldown()
	ability:StartCooldown(newCooldown)
end)
Так попробуй
 
[quote author=ZLOY link=topic=1081.msg6155#msg6155 date=1473429890]
Код:
Timers:CreateTimer(0.03,function()
	ability:EndCooldown()
	ability:StartCooldown(newCooldown)
end)
Так попробуй
[/quote]
Спасибо.
Сработало.
 
Чтоб не создавать новую тему, как решит данную проблему?
http://imgur.com/a/Wzvem

Когда убираю actionpanel всегда остается черная полоса снизу.
 
JavaScript:
GameUI.SetRenderBottomInsetOverride(0)
 
А что мешает пилить два модификатора, один из дд другой из луа?
 
Реклама: