Передача параметров в модификатор lua

Илья

Друзья CG
25 Сен 2015
2,348
41
Итак, может, после перекура я и сам допру, где допускаю ошибку, но пока что задам вопрос:

Хочу чтобы моя абилка накладывала баф брони, сила которого зависит от интеллекта кастующего.
Собственно, вот абилка:

Код:
LinkLuaModifier("modifier_physical_armor_bonus", "modifiers/modifier_physical_armor_bonus.lua", LUA_MODIFIER_MOTION_NONE )

greater_defense = class({})


function greater_defense:OnSpellStart()

local caster = self:GetCaster()	
local target = self:GetCursorTarget()
local bonus = caster:GetIntellect()/50
target:AddNewModifier( caster, self, "modifier_physical_armor_bonus", {duration = 10, armor = bonus} )

end

И вот модификатор бафа:

Код:
modifier_physical_armor_bonus = class({})

function modifier_physical_armor_bonus:IsHidden()
	return false
end

function modifier_physical_armor_bonus:DeclareFunctions()
	local funcs = {
		MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS,
	}
 
	return funcs
end

function modifier_physical_armor_bonus:GetTexture()
  return "omniknight_repel"
end



function modifier_physical_armor_bonus:OnCreated(params)
	if IsServer() then
		self.armor = params.armor
		self:SetStackCount(self.armor)
		print(self:GetCaster():GetIntellect())
	end
end


function modifier_physical_armor_bonus:GetModifierPhysicalArmorBonus()
	
	return self:GetStackCount()
	
end


function modifier_physical_armor_bonus:RemoveOnDeath()
	return true
end


Что у меня есть сейчас: абилка работает, но не красиво. Некрасиво потому, что я нашел пока что только один выход - через стаки.

Собственно, как можно наблюдать в коде абилки, я передаю в модификатор количество интеллекта кастующего

Код:
local bonus = caster:GetIntellect()/50
target:AddNewModifier( caster, self, "modifier_physical_armor_bonus", {duration = 10, armor = bonus} )

и в момент создания модификатора на цели задаю такое же количесто стаков.

Код:
self.armor = params.armor
self:SetStackCount(self.armor)

Далее в момент запроса доп. брони у модификатора, я возвращаю попрошайкам это количество стаков.

Код:
function modifier_physical_armor_bonus:GetModifierPhysicalArmorBonus()
	return self:GetStackCount()
end

Что мне не нравится в этом варианте: стаки мне не нравятся. Внешне.

Почему же я пока что остановился на этом варианте? Потому что,к моему глубокому удивлению, у меня не получается в момент навешивания бафа
Код:
modifier_physical_armor_bonus:GetModifierPhysicalArmorBonus()
пользоваться вещами из
Код:
modifier_physical_armor_bonus:OnCreated(params)

Кроме того, я обнаружил то, что в момент навешивания бафа мы можем получить
Код:
self:GetCaster()
Но не можем получить
Код:
self:GetCaster():GetIntellect()
Однако в момент создания модификатора все работает:
Код:
print(self:GetCaster():GetIntellect())


На гитхабе есть похожий вариант, но что-то он отказывается работать.


Может, кто-то знает, что я упускаю?
 
Последнее редактирование модератором:

Adam Smith

Друзья CG
4 Окт 2014
473
2
Код:
function modifier_murlock_heart:GetModifierConstantHealthRegen( params )
 local regen = self:GetCaster():GetMaxHealth()*self.regen
	return regen
end
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Я же писал, что не обратиться к интеллекту кастера оттуда.

Скинь свой created.
 

Adam Smith

Друзья CG
4 Окт 2014
473
2
Я же писал, что не обратиться к интеллекту кастера оттуда.

Скинь свой created.
Код:
murlock_heart = class({})

LinkLuaModifier( "modifier_murlock_heart_check", "heroes/hero_murlock/murlock_heart.lua", LUA_MODIFIER_MOTION_NONE )
LinkLuaModifier( "modifier_murlock_heart", "heroes/hero_murlock/murlock_heart.lua", LUA_MODIFIER_MOTION_NONE )

function murlock_heart:GetIntrinsicModifierName()
	return "modifier_murlock_heart_check"
end

function murlock_heart:GetBehavior()
	local behav = DOTA_ABILITY_BEHAVIOR_PASSIVE
	return behav
end
modifier_murlock_heart_check = class({})

function modifier_murlock_heart_check:IsHidden()
 return true
end

function modifier_murlock_heart_check:OnCreated()
 if IsServer() then
  self:StartIntervalThink(0.1)
 end
end

function modifier_murlock_heart_check:OnIntervalThink()
 if IsServer() then
  local caster = self:GetParent()
  local heroes = FindUnitsInRadius(caster:GetTeamNumber(), caster:GetAbsOrigin(), nil, 265, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_NONE, FIND_ANY_ORDER, false)
   if #heroes == 0 then
    if not caster:HasModifier("modifier_murlock_heart") then
     caster:AddNewModifier(caster, self:GetAbility(), "modifier_murlock_heart", nil)
    end
   else
    if caster:HasModifier("modifier_murlock_heart") then
      caster:RemoveModifierByName("modifier_murlock_heart")
    end
   end
 end
end


modifier_murlock_heart = class({})

function modifier_murlock_heart:OnCreated( kv )
 self.regen = self:GetAbility():GetSpecialValueFor( "health_regen" )/100
 self.movespeed = self:GetAbility():GetSpecialValueFor( "bonus_movement_speed" )
	if IsServer() then
		local nFXIndex = ParticleManager:CreateParticle( "particles/units/heroes/hero_sven/sven_warcry_buff.vpcf", PATTACH_ABSORIGIN_FOLLOW, self:GetParent() )
		ParticleManager:SetParticleControlEnt( nFXIndex, 2, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_head", self:GetCaster():GetOrigin(), true )
		self:AddParticle( nFXIndex, false, false, -1, false, true )
	end
end

--------------------------------------------------------------------------------

function modifier_murlock_heart:OnRefresh( kv )
	self.regen = self:GetAbility():GetSpecialValueFor( "health_regen" )/100
	self.movespeed = self:GetAbility():GetSpecialValueFor( "bonus_movement_speed" )
end

--------------------------------------------------------------------------------

function modifier_murlock_heart:DeclareFunctions()
	local funcs = {
		MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE,
		MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT
	}

	return funcs
end

function modifier_murlock_heart:GetModifierMoveSpeedBonus_Percentage( params )
	return self.movespeed
end

--------------------------------------------------------------------------------

function modifier_murlock_heart:GetModifierConstantHealthRegen( params )
 local regen = self:GetCaster():GetMaxHealth()*self.regen
	return regen
end
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
Спасибо, но жаль, для моего случая там ничего нет.
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Я же писал, что не обратиться к интеллекту кастера оттуда.

Скинь свой created.
Почему то, некоторые части модификатора, например броня и хп не могут нормально получать параметры модификатора. Ни при создании закинутый self.armor_bonus, ни caster:GetHealth(), ибо он в один момент почему то начинает считать что все абсолютно = nil. Как пофиксить я так и не понял за гребанных полгода, почему так - тоже не очень допираю.
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=Adam Smith link=topic=833.msg3666#msg3666 date=1460486898]
Код:
return self:GetCaster():GetPhysicalArmorValue()*percent
[/quote]
self:GetCaster() при использовании в бонусе армора ВЫДАСТ NIL с какого-то перепугу.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
У меня есть предположение, что когда мы кастуем (ну, вешаем баф), то кастер имеется.
И если обратить внимание на то, что запрос бонуса у модификатора происходит не один раз (я про постоянный use геттера модификатора) то, видимо, кастера уже нет.
Ну, т.е. это как в случаях с таймерами, которым мы задали параметры, а в момент срабатывания таймера, параметров уже не существует.

Интересен был для меня вот еще какой момент:
Код:
function modifier_physical_armor_bonus:GetModifierPhysicalArmorBonus()
	
	
	local bonus = self:GetStackCount()
	self:SetStackCount(0)
	print(bonus)
	return bonus
	
end

Сначала идет self:SetStackCount(0),а уже потом local bonus = self:GetStackCount() :D
Будто модификаторы в несколько потоков фурычат...
 

Илья

Друзья CG
25 Сен 2015
2,348
41
[quote author=Adam Smith link=topic=833.msg3668#msg3668 date=1460487280]
Код:
юзайте self:GetParent()
[/quote]

Не,я пробовал, результат тот же.
 

Adam Smith

Друзья CG
4 Окт 2014
473
2
[quote author=Илья link=topic=833.msg3669#msg3669 date=1460487358]
У меня есть предположение, что когда мы кастуем (ну, вешаем баф), то кастер имеется.
И если обратить внимание на то, что запрос бонуса у модификатора происходит не один раз (я про постоянный use геттера модификатора) то, видимо, кастера уже нет.
Ну, т.е. это как в случаях с таймерами, которым мы задали параметры, а в момент срабатывания таймера, параметров уже не существует.

Интересен был для меня вот еще какой момент:
Код:
function modifier_physical_armor_bonus:GetModifierPhysicalArmorBonus()
	
	
	local bonus = self:GetStackCount()
	self:SetStackCount(0)
	print(bonus)
	return bonus
	
end

Сначала идет self:SetStackCount(0),а уже потом local bonus = self:GetStackCount() :D
Будто модификаторы в несколько потоков фурычат...
[/quote]
Да не используй ты костыли, зааачем
Код:
function pudge_flesh_heap_lua:GetFleshHeapKills()
	if self.nKills == nil then
		self.nKills = 0
	end
	return self.nKills
end
Дальше поймешь?
 

Илья

Друзья CG
25 Сен 2015
2,348
41
По логике вещей здесь мы определяем armor у self:

Код:
function modifier_physical_armor_bonus:OnCreated(params)
	
		self.armor = params.armor

	
end

А здесь мы его используем:
Код:
function modifier_physical_armor_bonus:GetModifierPhysicalArmorBonus()
	return self.armor
end

Но как сказал Cry, и я толдычу: self.armor в последнем случае ноль.
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=Илья link=topic=833.msg3673#msg3673 date=1460487617]
По логике вещей здесь мы определяем armor у self:

Код:
function modifier_physical_armor_bonus:OnCreated(params)
	
		self.armor = params.armor

	
end

А здесь мы его используем:
Код:
function modifier_physical_armor_bonus:GetModifierPhysicalArmorBonus()
	return self.armor
end

Но как сказал Cry, и я толдычу: self.armor в последнем случае ноль.
[/quote]
А вот GetParent() возвращает кажется что надо.
update:
Вот только при попытке получить броню юнита у меня крашит доту ._.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Я пробовал через GetParent(), не работало. проверю еще раз...
 

Adam Smith

Друзья CG
4 Окт 2014
473
2
IsServer() добавил??
Ты создаешь функцию в абилке
GetCastersArmor
в ней return арморчик

в модификаторе bonus = self:GetAbility():GetCastersArmor()
 

Илья

Друзья CG
25 Сен 2015
2,348
41
А пробую я вот так:

Код:
function modifier_physical_armor_bonus:GetModifierPhysicalArmorBonus()
	
	return self:GetParent():GetIntellect()
	
end

Результат тот же.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
IsServer() добавил??
Ты создаешь функцию в абилке
GetCastersArmor
в ней return арморчик

в модификаторе bonus = self:GetAbility():GetCastersArmor()

Нука, нука, а вот это дельное предложение. Сейчас пробнем.
 
Последнее редактирование модератором:

Adam Smith

Друзья CG
4 Окт 2014
473
2
Код:
ds_sniper_shot = class ({})

function ds_sniper_shot:GetBehavior ()
	if self:GetCaster ():HasScepter () then
		return DOTA_ABILITY_BEHAVIOR_PASSIVE
	end
	return DOTA_ABILITY_BEHAVIOR_NO_TARGET
end

function ds_sniper_shot:GetCooldown ()
	if self:GetCaster ():HasScepter () then
		return 0
	end
	return 100
end

function ds_sniper_shot:OnSpellStart ()
	if IsServer () then
		local caster = self:GetCaster()
        self.caster = caster:GetArmorValue()
	end
end
function ds_sniper_shot:GetCastersArmor()
  return self.caster
end
 
Реклама: