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

Отображение модификаторов(declarefunctions).

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

Оффлайн I_GRIN_I

  • Продвинутый
  • 376
  • Мощь: 6
  • Научиться бы скриптить...
Ох, давно я не заходил, надо перевести до конца статью... В общем, по делу. У меня есть код:
Код
if bh_bloodrage == nil then
bh_bloodrage = class({})
end
LinkLuaModifier( "modifier_bh_bloodrage","heroes/bh/bloodrage",LUA_MODIFIER_MOTION_NONE)
function bh_bloodrage:OnSpellStart()
local caster = self:GetCaster()
local level = self:GetLevel() - 1
local duration = self:GetLevelSpecialValueFor("duration",level)
caster:AddNewModifier(caster,self,"modifier_bh_bloodrage",{duration = duration})
end
function bh_bloodrage:IsRefreshable()
return false
end

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():GetOwner()
self.stacks = self:GetAbility():GetOwner():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():GetOwner()
self.stacks = self:GetAbility():GetOwner():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.stacks * self.as
end
function modifier_bh_bloodrage:GetModifierPreAttack_BonusDamage()
return 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.stacks * self.ms
end
И еще один код, чтобы вы понимали, откуда берутся стаки:
Код
if bh_mark == nil then
bh_mark = class({})
end
LinkLuaModifier("modifier_markenemy","heroes/bh/mark",LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier("modifier_markfriend","heroes/bh/mark",LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier("modifier_stacks","heroes/bh/mark",LUA_MODIFIER_MOTION_NONE)
function bh_mark:GetCooldown( nLevel )
if self:GetCaster():HasScepter() then
return self:GetSpecialValueFor( "coldownscepter" )
end
return self.BaseClass.GetCooldown( self, nLevel )
end
function bh_mark:CastFilterResultTarget( hTarget )
if self:GetCaster() == hTarget then
return UF_FAIL_CUSTOM
end
if hTarget:IsCreep() or hTarget:IsAncient() then
return UF_FAIL_CUSTOM
end
local nResult = UnitFilter( hTarget, DOTA_UNIT_TARGET_TEAM_BOTH, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, self:GetCaster():GetTeamNumber() )
if nResult ~= UF_SUCCESS then
return nResult
end
return UF_SUCCESS
end
function bh_mark:GetCustomCastErrorTarget( hTarget )
if self:GetCaster() == hTarget then
return "#dota_hud_error_cant_cast_on_self"
end
if hTarget:IsAncient() then
return "#dota_hud_error_cant_cast_on_ancient"
end
if hTarget:IsCreep() then
return "#dota_hud_error_cant_cast_on_creep"
end
return ""
end
function bh_mark:OnSpellStart()
local hCaster = self:GetCaster()
local hTarget = self:GetCursorTarget()
local hAbility = self
local duration = self:GetSpecialValueFor("duration")
local durationscepter = self:GetSpecialValueFor("durationscepter")
if hTarget ~= nil then
if hTarget:HasModifier("modifier_markenemy") or hTarget:HasModifier("modifier_markfriend") then
local kek
else
if not hCaster:HasModifier("modifier_stacks") then
if hCaster:HasScepter() then
    hCaster:AddNewModifier(hCaster,hAbility,"modifier_stacks",{duration = durationscepter})
    else
    hCaster:AddNewModifier(hCaster,hAbility,"modifier_stacks",{duration = duration})
    end
end
local current_stack = hCaster:GetModifierStackCount("modifier_stacks", hCaster)
hCaster:SetModifierStackCount("modifier_stacks", hCaster, current_stack + 1)
end
if hTarget:GetTeam() ~= hCaster:GetTeam() then
if hCaster:HasScepter() then
hTarget:AddNewModifier(hCaster,hAbility,"modifier_markenemy",{duration = durationscepter})
else
hTarget:AddNewModifier(hCaster,hAbility,"modifier_markenemy",{duration = duration})
end
else
hTarget:AddNewModifier(hCaster,hAbility,"modifier_markfriend",{duration = duration})
end
end
end

if modifier_markenemy == nil then
modifier_markenemy = class({})
end
function modifier_markenemy:IsHidden()
return false
end
function modifier_markenemy:IsDebuff()
return true
end
function modifier_markenemy:IsPurgable()
return true
end
function modifier_markenemy:GetTexture()
return "bh_mark"
end
function modifier_markenemy:CheckState()
local state = {
[MODIFIER_STATE_PROVIDES_VISION] = true,
}
return state
end
function modifier_markenemy:GetAttributes ()
    return MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE
end
function modifier_markenemy:DeclareFunctions()
local funcs = {
MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE
}
return funcs
end
function modifier_markenemy:GetModifierMoveSpeedBonus_Percentage()
return -5
end

if modifier_markfriend == nil then
modifier_markfriend = class({})
end
function modifier_markfriend:IsHidden()
return false
end
function modifier_markfriend:IsDebuff()
return false
end
function modifier_markfriend:IsPurgable()
return true
end
function modifier_markfriend:GetTexture()
return "bh_mark"
end
function modifier_markfriend:OnCreated( kv )
self.regen = self:GetAbility():GetSpecialValueFor( "regen" )
self.scepterregen = self:GetAbility():GetSpecialValueFor( "scepterregen" )
end
function modifier_markfriend:OnRefresh( kv )
self.regen = self:GetAbility():GetSpecialValueFor( "regen" )
self.scepterregen = self:GetAbility():GetSpecialValueFor( "scepterregen" )
end
function modifier_markfriend:GetAttributes ()
    return MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE
end
function modifier_markfriend:DeclareFunctions()
local funcs = {
MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT
}
return funcs
end
function modifier_markfriend:GetModifierConstantHealthRegen()
if self:GetCaster():HasScepter() then
return self.scepterregen
else
return self.regen
end
end

if modifier_stacks == nil then
modifier_stacks = class({})
end
function modifier_stacks:IsHidden()
return false
end
function modifier_stacks:IsDebuff()
return false
end
function modifier_stacks:IsPurgable()
return false
end
function modifier_stacks:GetAttributes ()
    return MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE
end
В датадрайвенах особо ничего интересного нет, так что это пропустим.
В общем, в чем проблема. Все функции добавляют свои правильные знаечения. Но в консоле пишет, что я не правильно гетовнер использую, хотя и работает все:
Код
[ W VScript              ]: Script Runtime Error: ...ta_addons\arena\scripts\vscripts\heroes\bh\bloodrage.lua:22: attempt to call method 'GetOwner' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]: ...ta_addons\arena\scripts\vscripts\heroes\bh\bloodrage.lua:22: in function <...ta_addons\arena\scripts\vscripts\heroes\bh\bloodrage.lua:21>
Что то я много воды лью... Главное вот что:

Как видите, урон на худе остается прежним, никаких изменений нет, как и в мс и ас. Хотя сам урон, мс, ас изменяются, как видно в консоли при нанесении урона(56 урона это от 2 скилла, не обращайте внимание).
В чем проблема и, если не сложно, почему я гетовнер неправильно использую?

Оффлайн Илья

  • Супермодератор
  • 1892
  • Мощь: 16
Жалуется то не на метод, жалуется на объект, у которого ты пытаешься его вызвать:

self:GetAbility() - у тебя nil. И вообще, что это за строчка, которая у абилки запрашивает абилку? (self - и есть способность)

Оффлайн I_GRIN_I

  • Продвинутый
  • 376
  • Мощь: 6
  • Научиться бы скриптить...
Илья, а это не абилка, это же модификатор. Я у модификатора запрашиваю абилку, которая навесила этот модификатор

Оффлайн I_GRIN_I

  • Продвинутый
  • 376
  • Мощь: 6
  • Научиться бы скриптить...
Илья,да и все работает с этой строчкой, ведь количество стаков получается именно через неё

Оффлайн Илья

  • Супермодератор
  • 1892
  • Мощь: 16
А почему у тебя код умения и код модификатора в одном и том же файле?

Оффлайн Илья

  • Супермодератор
  • 1892
  • Мощь: 16
Кроме того, если я именую файлы скриптов не так же, как сам класс, то у меня, обычно, выдавало ошибку либо краш доты. А у тебя, я смотрю, работает все.

Оффлайн I_GRIN_I

  • Продвинутый
  • 376
  • Мощь: 6
  • Научиться бы скриптить...
Илья, ну просто так компактнее, все, относящееся к самой способности находится в одном файле.

Оффлайн Илья

  • Супермодератор
  • 1892
  • Мощь: 16
Компактнее - это единственный плюс, да. Но ты не понял мой намек: попробуй сделать "прозрачнее", а не "компактнее". Может заработает.

Оффлайн I_GRIN_I

  • Продвинутый
  • 376
  • Мощь: 6
  • Научиться бы скриптить...
Илья, кек, теперь еще больше ошибок, но при этом все так же работает:
Код
[   VScript              ]: 10
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:8: attempt to call method 'GetOwner' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:8: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:7>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:8: attempt to call method 'GetOwner' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:8: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:7>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:36: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:35>
[ W VScript              ]: Message count limit of 10 hit. Subsequent duplicate messages will be squelched.
[   Developer            ]: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[   Developer            ]: stack traceback:
[   Developer            ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[ W VScript              ]: Script Runtime Error: ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: attempt to perform arithmetic on field 'stacks' (a nil value)
[ W VScript              ]: stack traceback:
[ W VScript              ]:    ...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:45: in function <...ena\scripts\vscripts\heroes\bh\modifier_bh_bloodrage.lua:44>
[ W VScript              ]: Message count limit of 10 hit. Subsequent duplicate messages will be squelched.

Кстати, в первой строчке "10" - это количество стаков. Я добавил print(self.stacks) в код модификатора, то есть число то получается нормально.

Код
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():GetOwner()
   self.stacks = self:GetAbility():GetOwner():GetModifierStackCount("modifier_stacks", self.caster)
   self.damage = self:GetAbility():GetSpecialValueFor("damage")
   self.ms = self:GetAbility():GetSpecialValueFor("ms")
   self.as = self:GetAbility():GetSpecialValueFor("as")
   print(self.stacks)
end
function modifier_bh_bloodrage:OnRefresh( kv )
   self.caster = self:GetAbility():GetOwner()
   self.stacks = self:GetAbility():GetOwner():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.stacks * self.as
end
function modifier_bh_bloodrage:GetModifierPreAttack_BonusDamage()
   return 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.stacks * self.ms
end

Оффлайн I_GRIN_I

  • Продвинутый
  • 376
  • Мощь: 6
  • Научиться бы скриптить...
Вот журнал сражения, в котором можно увидеть урон без модификатора блудрейдж и с ним.

Под спойлером абракадабра...
Спойлер
Код
[03:55.12] Bounty Hunter использует способность bh_bloodrage.
[03:55.12] Bounty Hunter получает положительный эффект modifier_bh_bloodrage от Bounty Hunter.
[03:56.82] Bounty Hunter использует способность bh_bloodrage.
[03:57.25] Bounty Hunter использует способность bh_bloodrage.
[03:57.78] Bounty Hunter использует способность bh_bloodrage.
[03:59.05] Bounty Hunter использует способность bh_bloodrage.
[04:06.42] Bounty Hunter нанес Sven 90 СѓСЂРѕРЅР°  (660->570).
[04:10.09] Bounty Hunter применяет способность bh_mark на Sven.
[04:10.09] Bounty Hunter получает положительный эффект modifier_stacks от Bounty Hunter.
[04:10.09] Sven получает положительный эффект modifier_markfriend от Bounty Hunter.
[04:10.45] Bounty Hunter применяет способность bh_mark на Sven.
[04:10.45] Sven получает негативный эффект modifier_markenemy от Bounty Hunter.
[04:10.85] Bounty Hunter применяет способность bh_mark на Sven.
[04:10.85] Sven получает положительный эффект modifier_markfriend от Bounty Hunter.
[04:11.22] Bounty Hunter применяет способность bh_mark на Sven.
[04:11.22] Sven получает положительный эффект modifier_markfriend от Bounty Hunter.
[04:11.62] Bounty Hunter применяет способность bh_mark на Sven.
[04:11.62] Sven получает положительный эффект modifier_markfriend от Bounty Hunter.
[04:12.29] Bounty Hunter применяет способность bh_mark на Sven.
[04:12.29] Sven получает положительный эффект modifier_markfriend от Bounty Hunter.
[04:12.62] Bounty Hunter применяет способность bh_mark на Sven.
[04:12.62] Sven получает положительный эффект modifier_markfriend от Bounty Hunter.
[04:13.25] Bounty Hunter применяет способность bh_mark на Sven.
[04:13.25] Sven получает положительный эффект modifier_markfriend от Bounty Hunter.
[04:14.09] Bounty Hunter применяет способность bh_mark на Sven.
[04:14.09] Sven получает положительный эффект modifier_markfriend от Bounty Hunter.
[04:14.79] Bounty Hunter использует способность bh_bloodrage.
[04:15.59] Bounty Hunter нанес Sven 56 СѓСЂРѕРЅР°  (579->523).
[04:15.59] Sven получает негативный эффект modifier_crush_bush от Bounty Hunter.
[04:15.59] Bounty Hunter нанес Sven 206 СѓСЂРѕРЅР°  (523->317).
[04:15.99] Sven теряет негативный эффект (modifier_crush_bush)
[свернуть]


« Последнее редактирование: 08-07-2016, 11:07:09 от I_GRIN_I »

Оффлайн I_GRIN_I

  • Продвинутый
  • 376
  • Мощь: 6
  • Научиться бы скриптить...
Вот даже видос:
« Последнее редактирование: 08-07-2016, 12:09:24 от I_GRIN_I »

Оффлайн Илья

  • Супермодератор
  • 1892
  • Мощь: 16
По поводу отображения на персонаже новых цифр: эти зелененькие плюсики  на определенных модификаторах пишутся, на других либо не пишется, либо заменяется базовая цифра.

Скинь целиком текущий код абилки и модификатора и текстовик абилки тоже.

И можешь попробовать сделать более простой модификатор и плавно его нагружать функционалом.

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

Оффлайн Илья

  • Супермодератор
  • 1892
  • Мощь: 16
Так же, когда создаешь модификатор, то там в параметрах можно либо передавать абилку, либо нет. В зависимости от этого вот этот вызов:

self:GetAbility() - может как работать так и нет (то есть возвращать пустоту, либо абилку переданную). Проверь этот момент тоже.

Оффлайн I_GRIN_I

  • Продвинутый
  • 376
  • Мощь: 6
  • Научиться бы скриптить...
bloodrage.lua:
Код
if bh_bloodrage == nil then
bh_bloodrage = class({})
end
LinkLuaModifier( "modifier_bh_bloodrage","heroes/bh/modifier_bh_bloodrage",LUA_MODIFIER_MOTION_NONE)
function bh_bloodrage:GetCastAnimation() 
    return ACT_DOTA_CAST_ABILITY_2 
end
function bh_bloodrage:OnSpellStart()
local caster = self:GetCaster()
local level = self:GetLevel() - 1
local duration = self:GetLevelSpecialValueFor("duration",level)
caster:AddNewModifier(caster,self,"modifier_bh_bloodrage",{duration = duration})
end
function bh_bloodrage:IsRefreshable()
return false
end

modifier_bh_bloodrage.lua:
Код
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():GetOwner()
self.stacks = self:GetAbility():GetOwner():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():GetOwner()
self.stacks = self:GetAbility():GetOwner():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.stacks * self.as
end
function modifier_bh_bloodrage:GetModifierPreAttack_BonusDamage()
return 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.stacks * self.ms
end

bh_bloodrage kv:
Код
"bh_bloodrage"
  {
  "BaseClass"              "ability_lua"
  "ScriptFile" "heroes/bh/bloodrage.lua"
  "AbilityTextureName" "bh_bloodrage"
  "MaxLevel" "4"
  "AbilityType" "DOTA_ABILITY_TYPE_ULTIMATE"
  "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_NO_TARGET"
  "AbilityUnitDamageType" "DAMAGE_TYPE_PHYSICAL"
  "AbilityCooldown" "140 130 120 110 100 90 80"
  "AbilityCastPoint" "0"
  "AbilityManaCost" "225 200 175 150"
  "AbilitySpecial"
  {
  "01"
  {
  "var_type" "FIELD_INTEGER"
  "damage" "7 10 13 16"
  }
  "02"
  {
  "var_type" "FIELD_FLOAT"
  "duration" "25 30 35 40"
  }
  "03"
  {
  "var_type" "FIELD_INTEGER"
  "vamp" "1 2 3 4"
  }
  "04"
  {
  "var_type" "FIELD_INTEGER"
  "ms" "1 2 3 4"
  }
  "05"
  {
  "var_type" "FIELD_INTEGER"
  "as" "10 15 20 25"
  }
  }
  }

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

Как передавать абилку я не знаю :(.
Как создать легкий модификатор так же не могу додуматься... Как умножать количество срабатываний функции на количество стаков?
Первая да, с гетовнером.
« Последнее редактирование: 08-07-2016, 16:37:52 от I_GRIN_I »

Оффлайн Илья

  • Супермодератор
  • 1892
  • Мощь: 16
caster:AddNewModifier(caster,self,"modifier_bh_bloodrage",{duration = duration})  - второй параметр это абилка. Тут ты её и передаешь. Так что у модификатора должна на self:GetAbility() возвращаться абилка.