CustomGames.ru - Dota 2 пользовательские игры

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

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Илья

  • Супермодератор
  • 2133
  • Мощь: 21
Итак, может, после перекура я и сам допру, где допускаю ошибку, но пока что задам вопрос:

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

Код
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())


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


Может, кто-то знает, что я упускаю?
« Последнее редактирование: 12-04-2016, 17:59:58 от Илья »

Оффлайн Adam Smith

  • Друзья CG
  • 476
  • Мощь: 6
  • жрять жри его
Код
function modifier_murlock_heart:GetModifierConstantHealthRegen( params )
  local regen = self:GetCaster():GetMaxHealth()*self.regen
return regen
end
« Последнее редактирование: 13-04-2016, 00:45:05 от -ExotiC- »
By PG.Freeman

Оффлайн Илья

  • Супермодератор
  • 2133
  • Мощь: 21
Я же писал, что не обратиться к интеллекту кастера оттуда.

Скинь свой created.

Оффлайн Adam Smith

  • Друзья CG
  • 476
  • Мощь: 6
  • жрять жри его
Я же писал, что не обратиться к интеллекту кастера оттуда.

Скинь свой 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
By PG.Freeman

Оффлайн Илья

  • Супермодератор
  • 2133
  • Мощь: 21
Спасибо, но жаль, для моего случая там ничего нет.


Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
Я же писал, что не обратиться к интеллекту кастера оттуда.

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

Оффлайн Adam Smith

  • Друзья CG
  • 476
  • Мощь: 6
  • жрять жри его
Спасибо, но жаль, для моего случая там ничего нет.
Код
return self:GetCaster():GetPhysicalArmorValue()*percent
By PG.Freeman

Оффлайн CryDeS

  • Друзья CG
  • 1212
  • Мощь: 12
Код
return self:GetCaster():GetPhysicalArmorValue()*percent
self:GetCaster() при использовании в бонусе армора ВЫДАСТ NIL с какого-то перепугу.

Оффлайн Adam Smith

  • Друзья CG
  • 476
  • Мощь: 6
  • жрять жри его
self:GetCaster() при использовании в бонусе армора ВЫДАСТ NIL с какого-то перепугу.
Код
юзайте self:GetParent()
By PG.Freeman

Оффлайн Илья

  • Супермодератор
  • 2133
  • Мощь: 21
У меня есть предположение, что когда мы кастуем (ну, вешаем баф), то кастер имеется.
И если обратить внимание на то, что запрос бонуса у модификатора происходит не один раз (я про постоянный 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
Будто модификаторы в несколько потоков фурычат...


Оффлайн Илья

  • Супермодератор
  • 2133
  • Мощь: 21
Код
юзайте self:GetParent()

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

Оффлайн Adam Smith

  • Друзья CG
  • 476
  • Мощь: 6
  • жрять жри его
У меня есть предположение, что когда мы кастуем (ну, вешаем баф), то кастер имеется.
И если обратить внимание на то, что запрос бонуса у модификатора происходит не один раз (я про постоянный 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
Будто модификаторы в несколько потоков фурычат...
Да не используй ты костыли, зааачем
Код
function pudge_flesh_heap_lua:GetFleshHeapKills()
if self.nKills == nil then
self.nKills = 0
end
return self.nKills
end
 
Дальше поймешь?
By PG.Freeman

Оффлайн Илья

  • Супермодератор
  • 2133
  • Мощь: 21
Я же тебе говорю, они нули.

Оффлайн Илья

  • Супермодератор
  • 2133
  • Мощь: 21
По логике вещей здесь мы определяем 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
  • 1212
  • Мощь: 12
По логике вещей здесь мы определяем 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 в последнем случае ноль.
А вот GetParent() возвращает кажется что надо.
update:
Вот только при попытке получить броню юнита у меня крашит доту ._.
« Последнее редактирование: 12-04-2016, 19:02:43 от CryDeS »