Ваша Дальность каста и Усиление маг. урона в лЮа / Your Cast range and Spell Amp

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

Danis

Продвинутый
12 Июн 2016
285
0
Проект
Custom Hero Arena
Дошли мои ручки до переписывания своей линзы и вот к чему это привело:
Я залез посмотреть как реализованы подобные предметы в других кастомках и пришел к выводу что они почти все юзают модификатор "modifier_item_aether_lens" и не трудно догадаться что можно сделать кое какую шляпу.
Код:
function modifier_lens_five_passive:OnCreated( )
	local ability = self:GetAbility()
	if IsServer() then 
		self.modifier = self:GetCaster():AddNewModifier(self:GetCaster(),ability,"modifier_item_aether_lens",{})
	end
end

function modifier_lens_five_passive:OnDestroy( )
	local caster = self:GetCaster()
	if IsServer() then 
		local mod_list = caster:FindAllModifiers()
		for _,mod in pairs(mod_list) do 
			if mod == self.modifier then 
				mod:Destroy()
			end
		end
	end
end
И в кв предмета надо прописать следующие кеи
Код:
"AbilitySpecial"
{
      "01"
      {
        "var_type" "FIELD_INTEGER"
        "cast_range_bonus" "ваш бонус каст ренжа"
      }
      "02"
      {
        "var_type" "FIELD_INTEGER"
        "spell_amp" "ваш ампл. спелл дамага"
      }
}

Если надо на ДД писать, то там вроде должно быть не трудно, просто пихаете функции отдельно и запускаете 1 из них при поднятии итема а другую при убирании.
 
Последнее редактирование модератором:
Эт что, модификатор как бы сам ищет в предмете эти величины? А не пробовал сделать тогда так:

Код:
AddNewModifier(self:GetCaster(),ability,"modifier_item_aether_lens",{cast_range_bonus = 100,spell_amp = 100 })

если сработает, то ты нашел стандартные параметры для модификатора и не обязательно будет реализовывать его через вещь.

А если не сработает, то надо попробовать этот фокус провернуть с абилкой. Должно будет сработать, ведь вещь по сути тоже абилка. И в итоге имеем халявный способ мудрить свои абилки/вещи с подобной фигней.
 
Последнее редактирование модератором:
Особенно позабавил поиск модификатора в OnDestroy

Я думаю что больше никак его не найти, если будут у кастера несколько предметов с разными статами и с этим модификатором, то могут пойти траблы..
 
Последнее редактирование модератором:
[quote author=CryDeS link=topic=1316.msg8205#msg8205 date=1486807415]
Кек?
[/quote]
Ты не прав
 
[quote author=CryDeS link=topic=1316.msg8207#msg8207 date=1486809374]
Кек? :D
[/quote]

А вот это уже пойдет :)
 
[quote author=Илья link=topic=1316.msg8196#msg8196 date=1486760462]
Эт что, модификатор как бы сам ищет в предмете эти величины? А не пробовал сделать тогда так:

Код:
AddNewModifier(self:GetCaster(),ability,"modifier_item_aether_lens",{cast_range_bonus = 100,spell_amp = 100 })
[/quote]

Так не работает, только что проверил(

Вообщем теперь эта шняга имеет такой код
Код:
"AbilitySpecial"
   {
      "04"
      {
        "var_type" "FIELD_INTEGER"
        "spell_amp" "5 10 15 20 25"
      }
      "05"
      {
        "var_type" "FIELD_INTEGER"
        "cast_range_bonus" "200 300 325 350 375"
      }
}
Код:
function modifier_lens_five_passive:OnCreated( )
	local ability = self:GetAbility()
	self.modifier = self:GetCaster():AddNewModifier(self:GetCaster(),ability,"modifier_item_aether_lens",{})
end

function modifier_lens_five_passive:OnDestroy( )
	local caster = self:GetCaster()
	caster:RemoveCurrentModifier(self.modifier)
end

Код:
function CDOTA_BaseNPC:RemoveCurrentModifier( modifier )
 local caster = self
 local mod_list = caster:FindAllModifiersByName(modifier:GetName())
 for _,mod in pairs(mod_list) do 
  if mod == modifier then 
   mod:Destroy()
  end
 end
end
 
Последнее редактирование модератором:
Почему нельзя сделать так?
Код:
self.modifier:Destroy()
 
[quote author=ZLOY link=topic=1316.msg8210#msg8210 date=1486813021]
Почему нельзя сделать так?
Код:
self.modifier:Destroy()
[/quote]
мозг: потрачено :c
 
[quote author=CryDeS link=topic=1316.msg8211#msg8211 date=1486813324]
мозг: потрачено :c
[/quote]

сагласин, патрачено :'(

[quote author=ZLOY link=topic=1316.msg8210#msg8210 date=1486813021]
Почему нельзя сделать так?
Код:
self.modifier:Destroy()
[/quote]
Из-за того потому что я усложняю себе жизнь.
 
Ты конечно прав что можно сделать просто Destroy, но поиск его у юнита все равно не лишний. Вызов дестрой у модифаера которого на юните нет - краш игры. По крайней мере раньше так было. Теперь везде проверяю.
 
Ты конечно прав что можно сделать просто Destroy, но поиск его у юнита все равно не лишний. Вызов дестрой у модифаера которого на юните нет - краш игры. По крайней мере раньше так было. Теперь везде проверяю.
Максимум что может быть - ошибка, как с другими обьектами, которые уже удалены из игры.
Но и тут IsNull() спасает
 
Последнее редактирование модератором:
Неправда. Никакой ошибки - просто инстант краш. И модифаеры - не сущности и проверить их на валидность нельзя.
 
Код:
local hero = PlayerResource:GetSelectedHeroEntity(playerID)
local modifier = hero:AddNewModifier(hero,nil,"modifier_hide_lua",{duration = 1})
Timers:CreateTimer(2,function() modifier:Destroy() end )
Код:
This object has been deleted from C++ and no longer exists. (Use :IsNull() to detect this.)
 
Последнее редактирование модератором:
Ну значит пофиксили когда-то.

to:DotaCustomGames <DotaCustomGames@valvesoftware.com>
date:Sat, Apr 16, 2016 at 3:34 PM
subject:Modifier related crash
 
Последнее редактирование модератором:
Реклама: