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

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

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

Оффлайн KEKMAN

  • 168
  • Мощь: 2
  • Dota forever <3
Я написал код
Код
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, как сделать правильно? Может есть вариант лучше?

Оффлайн KEKMAN

  • 168
  • Мощь: 2
  • Dota forever <3
Re: Уменьшение атрибутов в процентах
« Ответ #1 : 15-04-2017, 11:46:47 »
Код
_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
  • 1208
  • Мощь: 12
Re: Уменьшение атрибутов в процентах
« Ответ #2 : 15-04-2017, 12:07:25 »
Сделал пока так, но там минус появляется в базовой агилити, вместо дополнительной
Твой код из 2 поста пойдет по одному всем известному месту когда в игре появяться два героя, а не один.
А +- улетает из-за math.ceil.

Оффлайн KEKMAN

  • 168
  • Мощь: 2
  • Dota forever <3
Re: Уменьшение атрибутов в процентах
« Ответ #3 : 15-04-2017, 12:16:07 »
Твой код из 2 поста пойдет по одному всем известному месту когда в игре появяться два героя, а не один.
А +- улетает из-за math.ceil.
Два одинаковых героя имеешь в виду? Просто если так, то да, а разные герои норм работают, в принципе 2 одинаковых не предусмотрено)

Оффлайн KEKMAN

  • 168
  • Мощь: 2
  • Dota forever <3
Re: Уменьшение атрибутов в процентах
« Ответ #4 : 15-04-2017, 12:23:53 »
Твой код из 2 поста пойдет по одному всем известному месту когда в игре появяться два героя, а не один.
А +- улетает из-за math.ceil.
Без округления работает нормально, спасибо.
Код, если кому надо будет:
Спойлер
Код
"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
  • 1208
  • Мощь: 12
Re: Уменьшение атрибутов в процентах
« Ответ #5 : 15-04-2017, 14:20:52 »
Два одинаковых героя имеешь в виду? Просто если так, то да, а разные герои норм работают, в принципе 2 одинаковых не предусмотрено)
Код
_G.agi = 0
_G.str = 0
_G.int = 0
_G.tim = 0
Ты записываешь все в G. У тебя, как я понимаю, все на серваке, по этому для всех героев будет одинаковые параметры _G.agi, и будут друг друга переписывать.
Записывай в идеале в абилку, или в кастера, если уж совсем туго. Что бы лезть в глобалки нужно совсем уж сильный повод, тем более для таких абилок.

Оффлайн KEKMAN

  • 168
  • Мощь: 2
  • Dota forever <3
Re: Уменьшение атрибутов в процентах
« Ответ #6 : 15-04-2017, 15:01:10 »
Код
_G.agi = 0
_G.str = 0
_G.int = 0
_G.tim = 0
Ты записываешь все в G. У тебя, как я понимаю, все на серваке, по этому для всех героев будет одинаковые параметры _G.agi, и будут друг друга переписывать.
Записывай в идеале в абилку, или в кастера, если уж совсем туго. Что бы лезть в глобалки нужно совсем уж сильный повод, тем более для таких абилок.
Хорошо, мне это надо было для обмена данными между скриптами, взял первый попавшийся способ