Уменьшение атрибутов в процентах

mrlikelot

Продвинутый
24 Июл 2015
168
1
Я написал код
Код:
function wonder( keys )
	local caster = keys.caster
	local ability = keys.ability
	local ability_level = ability:GetLevel() - 1
	local mod_modifier = keys.mod_effect
	local atr_modifier1 = keys.atr_modifier1
	local atr_modifier2 = keys.atr_modifier2
	local atr_modifier3 = keys.atr_modifier3
	if not caster:FindModifierByName(atr_modifier1) then
		ability:ApplyDataDrivenModifier(caster, caster, atr_modifier1, {})
	end
	if not caster:FindModifierByName(atr_modifier2) then
		ability:ApplyDataDrivenModifier(caster, caster, atr_modifier2, {})
	end
	if not caster:FindModifierByName(atr_modifier3) then
		ability:ApplyDataDrivenModifier(caster, caster, atr_modifier3, {})
	end

	local agility = caster:GetAgility() + caster:GetModifierStackCount(atr_modifier1, caster)
	local strength = caster:GetStrength() + caster:GetModifierStackCount(atr_modifier2, caster)
	local intellect = caster:GetIntellect() + caster:GetModifierStackCount(atr_modifier3, caster)

	local percent = ability:GetLevelSpecialValueFor("attribute_percent", ability_level) 
	local attrib_contr_agi = math.ceil(agility * percent / 100)
	local attrib_contr_str = math.ceil(strength * percent / 100)
	local attrib_contr_int = math.ceil(intellect * percent / 100)
	caster:SetModifierStackCount(atr_modifier1, caster, attrib_contr_str-1)
	caster:SetModifierStackCount(atr_modifier2, caster, attrib_contr_agi-1)
	caster:SetModifierStackCount(atr_modifier3, caster, attrib_contr_int-1)
end
Но тут баг, что кол-во стаков скачет на +-1, как сделать правильно? Может есть вариант лучше?
 
Последнее редактирование модератором:

mrlikelot

Продвинутый
24 Июл 2015
168
1
Код:
_G.agi = 0
_G.str = 0
_G.int = 0
_G.tim = 0
function wonder( keys )
	local caster = keys.caster
	local ability = keys.ability
	local ability_level = ability:GetLevel() - 1
	local mod_modifier = keys.mod_effect

	if tim > 0 then
		caster:ModifyAgility(agi)
		caster:ModifyStrength(str)
		caster:ModifyIntellect(int)
		print(agi.." "..str.." "..int)
	else
		tim=tim+1
	end

	local agility = caster:GetAgility()
	local strength = caster:GetStrength()
	local intellect = caster:GetIntellect()
	print(agility.." "..strength.." "..intellect)
	local percent = ability:GetLevelSpecialValueFor("attribute_percent", ability_level) 
	agi = math.ceil(agility * percent / 100)
	str = math.ceil(strength * percent / 100)
	int = math.ceil(intellect * percent / 100)
	print(agi.." "..str.." "..int)
	caster:ModifyAgility(-agi)
	caster:ModifyStrength(-str)
	caster:ModifyIntellect(-int)
end

Сделал пока так, но там минус появляется в базовой агилити, вместо дополнительной
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Сделал пока так, но там минус появляется в базовой агилити, вместо дополнительной
Твой код из 2 поста пойдет по одному всем известному месту когда в игре появяться два героя, а не один.
А +- улетает из-за math.ceil.
 
Последнее редактирование модератором:

mrlikelot

Продвинутый
24 Июл 2015
168
1
[quote author=CryDeS link=topic=1422.msg9111#msg9111 date=1492258045]
Твой код из 2 поста пойдет по одному всем известному месту когда в игре появяться два героя, а не один.
А +- улетает из-за math.ceil.
[/quote]
Два одинаковых героя имеешь в виду? Просто если так, то да, а разные герои норм работают, в принципе 2 одинаковых не предусмотрено)
 

mrlikelot

Продвинутый
24 Июл 2015
168
1
[quote author=CryDeS link=topic=1422.msg9111#msg9111 date=1492258045]
Твой код из 2 поста пойдет по одному всем известному месту когда в игре появяться два героя, а не один.
А +- улетает из-за math.ceil.
[/quote]
Без округления работает нормально, спасибо.
Код, если кому надо будет:
Код:
"self_sacrifise"
  {
   "BaseClass"         "ability_datadriven"
   "AbilityTextureName"   "rattletrap_power_cogs"
   "MaxLevel"      "7"

   "AbilityBehavior"    "DOTA_ABILITY_BEHAVIOR_PASSIVE"

   "AbilitySpecial"
   {
    "01"
    {
     "var_type"   "FIELD_FLOAT"
     "attribute_percent"   "15 20 25 30 35 40 50"
    }
   }


   "Modifiers"
   {
    "modifier_effect"
    {
     "Passive"      "1"
     "IsHidden"     "0"
     "IsDebuff"     "0"
     "ThinkInterval" "0.25"
     "OnIntervalThink"
     {
      "RunScript"
      {
       "ScriptFile" "heroes/self_sacr.lua"
       "Function"  "wonder"
       "mod_effect" "modifier_effect"
       "atr_modifier1" "modifier_attributes_a"
       "atr_modifier2" "modifier_attributes_b"
       "atr_modifier3" "modifier_attributes_c"
      }
     }
    }
    "modifier_attributes_a"
    {
     "IsPurgable"   "0"
     "IsHidden"    "0"

     "Properties"
     {
      "MODIFIER_PROPERTY_STATS_STRENGTH_BONUS" "-1"
     }
    }
    "modifier_attributes_b"
    {
     "IsPurgable"   "0"
     "IsHidden"    "0"

     "Properties"
     {
      "MODIFIER_PROPERTY_STATS_AGILITY_BONUS" "-1"
     }
    }
    "modifier_attributes_c"
    {
     "IsPurgable"   "0"
     "IsHidden"    "0"

     "Properties"
     {
      "MODIFIER_PROPERTY_STATS_INTELLECT_BONUS" "-1"
     }
    }
   }
  }
Код:
function wonder( keys )
	local caster = keys.caster
	local ability = keys.ability
	local ability_level = ability:GetLevel() - 1
	local mod_modifier = keys.mod_effect
	local atr_modifier1 = keys.atr_modifier1
	local atr_modifier2 = keys.atr_modifier2
	local atr_modifier3 = keys.atr_modifier3
	if not caster:FindModifierByName(atr_modifier1) then
		ability:ApplyDataDrivenModifier(caster, caster, atr_modifier1, {})
	end
	if not caster:FindModifierByName(atr_modifier2) then
		ability:ApplyDataDrivenModifier(caster, caster, atr_modifier2, {})
	end
	if not caster:FindModifierByName(atr_modifier3) then
		ability:ApplyDataDrivenModifier(caster, caster, atr_modifier3, {})
	end

	local agility = caster:GetAgility() + caster:GetModifierStackCount(atr_modifier2, caster)
	local strength = caster:GetStrength() + caster:GetModifierStackCount(atr_modifier1, caster)
	local intellect = caster:GetIntellect() + caster:GetModifierStackCount(atr_modifier3, caster)

	local percent = ability:GetLevelSpecialValueFor("attribute_percent", ability_level) 
	local attrib_contr_agi = agility * percent / 100
	local attrib_contr_str = strength * percent / 100
	local attrib_contr_int = intellect * percent / 100
	caster:SetModifierStackCount(atr_modifier1, caster, attrib_contr_str)
	caster:SetModifierStackCount(atr_modifier2, caster, attrib_contr_agi)
	caster:SetModifierStackCount(atr_modifier3, caster, attrib_contr_int)
end
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Два одинаковых героя имеешь в виду? Просто если так, то да, а разные герои норм работают, в принципе 2 одинаковых не предусмотрено)
Код:
_G.agi = 0
_G.str = 0
_G.int = 0
_G.tim = 0
Ты записываешь все в G. У тебя, как я понимаю, все на серваке, по этому для всех героев будет одинаковые параметры _G.agi, и будут друг друга переписывать.
Записывай в идеале в абилку, или в кастера, если уж совсем туго. Что бы лезть в глобалки нужно совсем уж сильный повод, тем более для таких абилок.
 
Последнее редактирование модератором:

mrlikelot

Продвинутый
24 Июл 2015
168
1
[quote author=CryDeS link=topic=1422.msg9114#msg9114 date=1492266052]
Код:
_G.agi = 0
_G.str = 0
_G.int = 0
_G.tim = 0
Ты записываешь все в G. У тебя, как я понимаю, все на серваке, по этому для всех героев будет одинаковые параметры _G.agi, и будут друг друга переписывать.
Записывай в идеале в абилку, или в кастера, если уж совсем туго. Что бы лезть в глобалки нужно совсем уж сильный повод, тем более для таких абилок.
[/quote]
Хорошо, мне это надо было для обмена данными между скриптами, взял первый попавшийся способ
 
Реклама: