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

Не, нельзя вызвать даже там GetIntellect().

Добавил в абилку метод:

Код:
function greater_defense:GetArmor()

local caster = self:GetCaster()
	
return caster:GetIntellect()

end


А в модификаторе вызываю:

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

И результат тот же.
 
[quote author=Илья link=topic=833.msg3682#msg3682 date=1460488500]
Не, нельзя вызвать даже там GetIntellect().

Добавил в абилку метод:

Код:
function greater_defense:GetArmor()

local caster = self:GetCaster()
	
return caster:GetIntellect()

end


А в модификаторе вызываю:

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

И результат тот же.
[/quote]
Неправильно
Код:
function ds_sniper_shot:OnSpellStart ()
	if IsServer () then
    local caster = self:GetCaster()
    self.caster = caster:GetPhysicalArmorValue()
  end
end

function ds_sniper_shot:GetArmor()
  return self.caster
end
 
Код:
LinkLuaModifier("modifier_physical_armor_bonus", "modifiers/modifier_physical_armor_bonus.lua", LUA_MODIFIER_MOTION_NONE )

greater_defense = class({})


function greater_defense:OnSpellStart()

	if IsServer () then
    local caster = self:GetCaster()
    self.caster = caster:GetIntellect()
		local target = self:GetCursorTarget()
		local bonus = caster:GetIntellect()
		target:AddNewModifier( caster, self, "modifier_physical_armor_bonus", {duration = 3, armor = bonus} )					
  end

end

function greater_defense:GetArmor()
	
return self.caster

end


И в модификаторе:
Код:
function modifier_physical_armor_bonus:GetModifierPhysicalArmorBonus()
	
	return self:GetAbility():GetArmor()
	
end


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

Насчет IsServer () - он не влияет на отработку, он нужен, чтобы когда произойдет сбой в обработке кода, на экране пользователей не полетели красные письмена.
 
Последнее редактирование модератором:
Я даже догадываюсь, почему такой очевидный способ не помогает: параметры в скриптах живут до тех пор, пока идет его сеанс. Скрипт абилки завершает свой сеанс, когда завершается последнее действие в OnSpellStart.

И в тот момент, когда мы вызываем свой геттер GetArmor() в скрипте модификатора - начинается новый сеанс с чистыми параметрами.

Попробую глобалку использовать, хоть и стараюсь обходиться без них...
 
Не, я на сегодня сдаюсь: геттеры модификаторов даже глобалки правят в ноль. Будто у них там своя жизнь происходит.

Если придумаю красивый способ, выложу. Если идеи будут у кого - жду.
А пока буду пользоваться рабочим, но не достаточно красивым способом.
 
Я даже догадываюсь, почему такой очевидный способ не помогает: параметры в скриптах живут до тех пор, пока идет его сеанс. Скрипт абилки завершает свой сеанс, когда завершается последнее действие в OnSpellStart.

И в тот момент, когда мы вызываем свой геттер GetArmor() в скрипте модификатора - начинается новый сеанс с чистыми параметрами.

Попробую глобалку использовать, хоть и стараюсь обходиться без них...
Вешай балванку и через нее узнавай
Странно что у тебя не работает
 
Последнее редактирование модератором:
А у тебя получается получить интеллект в геттере?
Или как-то передать его туда? Именно интеллект, хотя и сила и ловкость из той же оперы.
 
А у тебя получается получить интеллект в геттере?
Или как-то передать его туда? Именно интеллект, хотя и сила и ловкость из той же оперы.
Самого кастера получается, а статы я получал в модификаторе уже
 
Последнее редактирование модератором:
Кастера то и в модификаторе можно получить.

И как ты статы получал там?
 
[quote author=Adam Smith link=topic=833.msg3692#msg3692 date=1460493497]
Код:
function zerno:OnCreated()
local caster = self:GetAbility():GetCurrentCaster()
local stats = caster:GetStrength()
[/quote]
а потом юзай так
self.stats = stats
и они доступны в любом участке кода мод.
 
В OnCreated как раз таки можно их получить.
А как дальше использовал?
 
А попробуй, если интересно и будет время, сделать такую абилку, что навешивает баф доп брони равной интеллекту кастующего. Мне интересно, может дело именно в типе модификатора.
 
И пример с силой, что ты мне скинул - там модификатор на что ты использовал?
 
Илья, а что, на тот момент нельзя было сделать так?
Код:
if modifier_bh_bloodrage == nil then
  modifier_bh_bloodrage = class({})
end
function modifier_bh_bloodrage:IsHidden()
  return false
end
function modifier_bh_bloodrage:OnCreated( kv )
  self.caster = self:GetAbility():GetCaster()
  self.stacks = self:GetAbility():GetCaster():GetModifierStackCount("modifier_stacks", self.caster)
  self.damage = self:GetAbility():GetSpecialValueFor("damage")
  self.ms = self:GetAbility():GetSpecialValueFor("ms")
  self.as = self:GetAbility():GetSpecialValueFor("as")
end
function modifier_bh_bloodrage:OnRefresh( kv )
  self.caster = self:GetAbility():GetCaster()
  self.stacks = self:GetAbility():GetCaster():GetModifierStackCount("modifier_stacks", self.caster)
  self.damage = self:GetAbility():GetSpecialValueFor("damage")
  self.ms = self:GetAbility():GetSpecialValueFor("ms")
  self.as = self:GetAbility():GetSpecialValueFor("as")
end
function modifier_bh_bloodrage:DeclareFunctions()
  local funcs = {
   MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE,
   MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE,
   MODIFIER_PROPERTY_MOVESPEED_MAX,
   MODIFIER_PROPERTY_MOVESPEED_LIMIT,
   MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT
  }
  return funcs
end
function modifier_bh_bloodrage:GetModifierAttackSpeedBonus_Constant()
  return self.as + self.stacks * self.as
end
function modifier_bh_bloodrage:GetModifierPreAttack_BonusDamage()
  return self.damage + self.stacks * self.damage
end
function modifier_bh_bloodrage:GetModifierMoveSpeed_Max()
  return 1000
end
function modifier_bh_bloodrage:GetModifierMoveSpeed_Limit()
  return 1000
end
function modifier_bh_bloodrage:GetModifierMoveSpeedBonus_Percentage()
  return self.ms + self.stacks * self.ms
end
 
Последнее редактирование модератором:
Если сначало что-то было потом стало nil, то почему бы не юзнуть глобалку?

Записать пока было и чёрт с ним)
 
Если сначало что-то было потом стало nil, то почему бы не юзнуть глобалку?

Записать пока было и чёрт с ним)
Щас бы без повода глобальные переменные засорять, ага.
 
Последнее редактирование модератором:
если тебе не нравится чисто визуально стаки то их можно сделать спрятанными и вместе с тем когда они вешаются на юнита на него вешать модификатор пустышку с описанием.
 
Код:
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
скажите а как сделать чтобы скил при применении просто нанёс урон и как получить значение количаста стаков модификатора
 
Реклама: