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

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Ох, давно я не заходил, надо перевести до конца статью... В общем, по делу. У меня есть код:
Код:
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>
Что то я много воды лью... Главное вот что:
RHJB.png

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

Илья

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

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

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Илья, а это не абилка, это же модификатор. Я у модификатора запрашиваю абилку, которая навесила этот модификатор
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Илья,да и все работает с этой строчкой, ведь количество стаков получается именно через неё
 

Илья

Друзья CG
25 Сен 2015
2,348
41
А почему у тебя код умения и код модификатора в одном и том же файле?
 

Илья

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

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Илья, ну просто так компактнее, все, относящееся к самой способности находится в одном файле.
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Компактнее - это единственный плюс, да. Но ты не понял мой намек: попробуй сделать "прозрачнее", а не "компактнее". Может заработает.
 
Последнее редактирование модератором:

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Илья, кек, теперь еще больше ошибок, но при этом все так же работает:
Код:
[  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

Друзья CG
15 Мар 2016
1,335
105
Вот журнал сражения, в котором можно увидеть урон без модификатора блудрейдж и с ним.

Под спойлером абракадабра...
Код:
[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)

RKR6.png

RKR7.png
 
Последнее редактирование модератором:

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Вот даже видос:
[youtube]https://www.youtube.com/watch?v=9vLzznYVM0w[/youtube]
 

Илья

Друзья CG
25 Сен 2015
2,348
41
По поводу отображения на персонаже новых цифр: эти зелененькие плюсики на определенных модификаторах пишутся, на других либо не пишется, либо заменяется базовая цифра.

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

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

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

Илья

Друзья CG
25 Сен 2015
2,348
41
Так же, когда создаешь модификатор, то там в параметрах можно либо передавать абилку, либо нет. В зависимости от этого вот этот вызов:

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

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
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... Ведь он получает овнера, но пишет при этом, что не получает. Количество стаков учитывается же при работе скилла.

Как передавать абилку я не знаю :(.
Как создать легкий модификатор так же не могу додуматься... Как умножать количество срабатываний функции на количество стаков?
Первая да, с гетовнером.
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
caster:AddNewModifier(caster,self,"modifier_bh_bloodrage",{duration = duration}) - второй параметр это абилка. Тут ты её и передаешь. Так что у модификатора должна на self:GetAbility() возвращаться абилка.
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
Переименуй на всякий так:
Код:
"ScriptFile"					"heroes/bh/bh_bloodrage.lua"

И сам файл скрипта.

Жалуется только на файл модификатора?
 
Последнее редактирование модератором:

Илья

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

Код:
"AbilityCooldown"				"140 130 120 110 100 90 80"


Простой модификатор - я имел в виду, сделать модификатор, что будет что-то одно поднимать, а не как у тебя сейчас: 6 параметров.

Вот эта строчка правильно отрабатывает?

Код:
return self.stacks * self.as

Мы не так давно маялись с тем, что параметры не передаются подобным или другим (не помню уже) образом.
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
Попробуй брать не родителя

Код:
self.caster = self:GetAbility():GetOwner()

а просто кастера

Код:
self.caster = self:GetAbility():GetCaster()
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Илья, ого, замена GetOwner на GetCaster помогла, большое спасибо. А я даже и не додумался, теперь все работает и отображается, как должно. Хотя все равно странно, почему раньше работало и не отображалось.
Да, такая строчка работает, кстати.
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Функции модификатора вызываются на стороне сервера и клиента.
Так вот функция GetOwner() на стороне клиента не реализована.
 
Реклама: