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

OnCreated/OnRefresh Lua-Modifier

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

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
OnCreated/OnRefresh Lua-Modifier
« : 17-09-2016, 06:56:19 »
Где нужно прописывать действия, если в Onreated и OnRefresh он не принимает, а выдаёт ошибку?
Код
if modifier_item_desolator_corruption == nil then
   modifier_item_desolator_corruption = class({})
end
function modifier_item_desolator_corruption:IsHidden()
   return false
end
function modifier_item_desolator_corruption:IsDebuff()
   return true
end
function modifier_item_desolator_corruption:IsPurgable()
   return true
end
function modifier_item_desolator_corruption:GetTexture()
   return "desolator_corruption"
end
function modifier_item_desolator_corruption:OnCreated()
self.corruption_armor = self:GetAbility():GetSpecialValueFor("desolator_corruption_armor")
if IsServer() then
local a = {
--"modifier_item_desolator_corruption",
"modifier_item_skadi_corruption",
"modifier_item_desolator_skadi_corruption",
"modifier_item_desolator_corruption_for_desolator_skadi",
"modifier_item_desolator_maelstrom_corruption",
"modifier_item_skadi_maelstrom_corruption",
"modifier_item_desolator_skadi_maelstrom_corruption",
"modifier_item_desolator_corruption_for_desolator_skadi_maelstrom"
}
for i=1, 7, 1 do
if self:GetCaster():HasModifier(a[i]) then
self:GetCaster():RemoveModifierByName(a[i])
end
end
end
function modifier_item_desolator_corruption:OnRefresh()
self.corruption_armor = self:GetAbility():GetSpecialValueFor("desolator_corruption_armor")
if IsServer() then
local a = {
--"modifier_item_desolator_corruption",
"modifier_item_skadi_corruption",
"modifier_item_desolator_skadi_corruption",
"modifier_item_desolator_corruption_for_desolator_skadi",
"modifier_item_desolator_maelstrom_corruption",
"modifier_item_skadi_maelstrom_corruption",
"modifier_item_desolator_skadi_maelstrom_corruption",
"modifier_item_desolator_corruption_for_desolator_skadi_maelstrom"
}
for i=1, 7, 1 do
if self:GetCaster():HasModifier(a[i]) then
self:GetCaster():RemoveModifierByName(a[i])
end
end
end
function modifier_item_desolator_corruption:DeclareFunctions()
   local funcs = {
      MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS
   }
   return funcs
end
function modifier_item_desolator_corruption:GetModifierPhysicalArmorBonus()
   return self.corruption_armor
end
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Оффлайн CryDeS

  • Друзья CG
  • 1208
  • Мощь: 12
Re: OnCreated/OnRefresh Lua-Modifier
« Ответ #1 : 17-09-2016, 10:15:26 »
Где нужно прописывать действия, если в Onreated и OnRefresh он не принимает, а выдаёт ошибку?
Код
if modifier_item_desolator_corruption == nil then
   modifier_item_desolator_corruption = class({})
end
function modifier_item_desolator_corruption:IsHidden()
   return false
end
function modifier_item_desolator_corruption:IsDebuff()
   return true
end
function modifier_item_desolator_corruption:IsPurgable()
   return true
end
function modifier_item_desolator_corruption:GetTexture()
   return "desolator_corruption"
end
function modifier_item_desolator_corruption:OnCreated()
self.corruption_armor = self:GetAbility():GetSpecialValueFor("desolator_corruption_armor")
if IsServer() then
local a = {
--"modifier_item_desolator_corruption",
"modifier_item_skadi_corruption",
"modifier_item_desolator_skadi_corruption",
"modifier_item_desolator_corruption_for_desolator_skadi",
"modifier_item_desolator_maelstrom_corruption",
"modifier_item_skadi_maelstrom_corruption",
"modifier_item_desolator_skadi_maelstrom_corruption",
"modifier_item_desolator_corruption_for_desolator_skadi_maelstrom"
}
for i=1, 7, 1 do
if self:GetCaster():HasModifier(a[i]) then
self:GetCaster():RemoveModifierByName(a[i])
end
end
end
function modifier_item_desolator_corruption:OnRefresh()
self.corruption_armor = self:GetAbility():GetSpecialValueFor("desolator_corruption_armor")
if IsServer() then
local a = {
--"modifier_item_desolator_corruption",
"modifier_item_skadi_corruption",
"modifier_item_desolator_skadi_corruption",
"modifier_item_desolator_corruption_for_desolator_skadi",
"modifier_item_desolator_maelstrom_corruption",
"modifier_item_skadi_maelstrom_corruption",
"modifier_item_desolator_skadi_maelstrom_corruption",
"modifier_item_desolator_corruption_for_desolator_skadi_maelstrom"
}
for i=1, 7, 1 do
if self:GetCaster():HasModifier(a[i]) then
self:GetCaster():RemoveModifierByName(a[i])
end
end
end
function modifier_item_desolator_corruption:DeclareFunctions()
   local funcs = {
      MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS
   }
   return funcs
end
function modifier_item_desolator_corruption:GetModifierPhysicalArmorBonus()
   return self.corruption_armor
end
Что за ошибка то? И кстати говоря, вынеси таблицу в начало файла, каждый раз создавать ее затратненько.
И кстати говоря, у меня вот OnCreated вызывается всегда без проблем.

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
Re: OnCreated/OnRefresh Lua-Modifier
« Ответ #2 : 17-09-2016, 11:39:12 »
Что за ошибка то? И кстати говоря, вынеси таблицу в начало файла, каждый раз создавать ее затратненько.
И кстати говоря, у меня вот OnCreated вызывается всегда без проблем.
Дота крашится, пишет, что не найден класс модификатора. | Куда я вынесу таблицу?

Ладно, решил не лезть в эти модификаторы, сделал по-другому
« Последнее редактирование: 17-09-2016, 13:33:58 от EnDronist »
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Оффлайн CryDeS

  • Друзья CG
  • 1208
  • Мощь: 12
Re: OnCreated/OnRefresh Lua-Modifier
« Ответ #3 : 17-09-2016, 14:22:55 »
Дота крашится, пишет, что не найден класс модификатора. | Куда я вынесу таблицу?

Ладно, решил не лезть в эти модификаторы, сделал по-другому
Код
modifier_item_desolator_corruption = modifier_item_desolator_corruption or class({})


local a = {
--"modifier_item_desolator_corruption",
"modifier_item_skadi_corruption",
"modifier_item_desolator_skadi_corruption",
"modifier_item_desolator_corruption_for_desolator_skadi",
"modifier_item_desolator_maelstrom_corruption",
"modifier_item_skadi_maelstrom_corruption",
"modifier_item_desolator_skadi_maelstrom_corruption",
"modifier_item_desolator_corruption_for_desolator_skadi_maelstrom"
}

function modifier_item_desolator_corruption:IsHidden()
   return false
end
function modifier_item_desolator_corruption:IsDebuff()
   return true
end
function modifier_item_desolator_corruption:IsPurgable()
   return true
end
function modifier_item_desolator_corruption:GetTexture()
   return "desolator_corruption"
end
function modifier_item_desolator_corruption:OnCreated()
self.corruption_armor = self:GetAbility():GetSpecialValueFor("desolator_corruption_armor")
if IsServer() then

for i=1, 7, 1 do
if self:GetCaster():HasModifier(a[i]) then
self:GetCaster():RemoveModifierByName(a[i])
end
end
end
function modifier_item_desolator_corruption:OnRefresh()
self.corruption_armor = self:GetAbility():GetSpecialValueFor("desolator_corruption_armor")
if IsServer() then
local a = {
--"modifier_item_desolator_corruption",
"modifier_item_skadi_corruption",
"modifier_item_desolator_skadi_corruption",
"modifier_item_desolator_corruption_for_desolator_skadi",
"modifier_item_desolator_maelstrom_corruption",
"modifier_item_skadi_maelstrom_corruption",
"modifier_item_desolator_skadi_maelstrom_corruption",
"modifier_item_desolator_corruption_for_desolator_skadi_maelstrom"
}
for i=1, 7, 1 do
if self:GetCaster():HasModifier(a[i]) then
self:GetCaster():RemoveModifierByName(a[i])
end
end
end
function modifier_item_desolator_corruption:DeclareFunctions()
   local funcs = {
      MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS
   }
   return funcs
end
function modifier_item_desolator_corruption:GetModifierPhysicalArmorBonus()
   --return self.corruption_armor
   return 5
end
А вот так крашит?

Онлайн Илья

  • Супермодератор
  • 2031
  • Мощь: 19
Re: OnCreated/OnRefresh Lua-Modifier
« Ответ #4 : 17-09-2016, 14:51:49 »
Крашится, обычно, если класс не определил, т.к. модификатор, как и самодельная абилка и любые другие подобные вещи реализуются через такой объект программирования, как "класс".

Край тебе скинул, как надо.

А таблицу можешь вынести как глобалку у модификатора (да, тут тоже можно делать глобалки).

Оффлайн EnDronist

  • 222
  • Мощь: 1
  • Перфекционист-максималист
Re: OnCreated/OnRefresh Lua-Modifier
« Ответ #5 : 17-09-2016, 16:16:38 »
Илья, Лучше не буду засорять глобалку
Ням
Мой аддон: steamcommunity.com/...ils/?id=671144274
[свернуть]

Оффлайн CryDeS

  • Друзья CG
  • 1208
  • Мощь: 12
Re: OnCreated/OnRefresh Lua-Modifier
« Ответ #6 : 17-09-2016, 17:05:03 »
Илья, Лучше не буду засорять глобалку
Сделай таблицу ЛОКАЛЬНОЙ для всего файла. Она не будет считаться глобальной, и будет доступна только в этом файле, и скорость доступа не будет отличаться от скорости доступа если бы она была в самой функции. Зато время затрачиваемое на создание будет огромным.

Онлайн Илья

  • Супермодератор
  • 2031
  • Мощь: 19
Re: OnCreated/OnRefresh Lua-Modifier
« Ответ #7 : 17-09-2016, 21:51:13 »
Она будет глобальна только внутри файла, как верно подметил Край.

А вообще, насчет производительности - только олдскульные проггеры о ней парятся в наших ситуациях, потмоу что их так учили в свое время. Потому что учили работать на низкоуровневых языках, вроде ассемблера, где каждый битик важен. Потому что в иных ситуациях это всего лишь фетиш. Потому что современные процессора позволяют обрабатывать столько операций в наносекунду, сколько тебе не снилось и то место, которое займет твоя переменная стремится к нулю по сравнению со всеми возможностями современных карт памяти.

Оффлайн CryDeS

  • Друзья CG
  • 1208
  • Мощь: 12
Re: OnCreated/OnRefresh Lua-Modifier
« Ответ #8 : 18-09-2016, 07:29:37 »
Она будет глобальна только внутри файла, как верно подметил Край.

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

Онлайн Илья

  • Супермодератор
  • 2031
  • Мощь: 19
Re: OnCreated/OnRefresh Lua-Modifier
« Ответ #9 : 18-09-2016, 12:10:46 »
Это ты к чему? Был какой-то случай на практике, что на пол секунды была задержка при расчетах? Скинь. Без задействия таймеров я не верю, что такое возможно в наших ситуациях.

Оффлайн CryDeS

  • Друзья CG
  • 1208
  • Мощь: 12
Re: OnCreated/OnRefresh Lua-Modifier
« Ответ #10 : 18-09-2016, 14:21:36 »
Это ты к чему? Был какой-то случай на практике, что на пол секунды была задержка при расчетах? Скинь. Без задействия таймеров я не верю, что такое возможно в наших ситуациях.
Когда я по глупости в проверке армора(в модификаторе) всунул создание таблицы на 400 строк

Онлайн Илья

  • Супермодератор
  • 2031
  • Мощь: 19
Re: OnCreated/OnRefresh Lua-Modifier
« Ответ #11 : 18-09-2016, 14:37:54 »
Именно создавал её, т.е. с insert ? Или описал, как EnDronist?

Оффлайн CryDeS

  • Друзья CG
  • 1208
  • Мощь: 12
Re: OnCreated/OnRefresh Lua-Modifier
« Ответ #12 : 18-09-2016, 15:15:53 »
Именно создавал её, т.е. с insert ? Или описал, как EnDronist?
Почти как у него, но по другому( ["key"] = { ... } ). Большие таблицы при создании тратят время, которое при загрузке мода практически неразличимо, нежели во время действия.

Онлайн Илья

  • Супермодератор
  • 2031
  • Мощь: 19
Re: OnCreated/OnRefresh Lua-Modifier
« Ответ #13 : 18-09-2016, 19:09:17 »
Но разницы, создавать таблицу глобально в модификаторе, либо при его навешивании- нет, т.к. с точки зрения кода это оно и то же. Скрипт модификатора запускается при его создании и там без разницы, в каком месте таблицу делать. Разница только в дальнейшей простоте работы проггера.

Оффлайн CryDeS

  • Друзья CG
  • 1208
  • Мощь: 12
Re: OnCreated/OnRefresh Lua-Modifier
« Ответ #14 : 18-09-2016, 19:41:24 »
Но разницы, создавать таблицу глобально в модификаторе, либо при его навешивании- нет, т.к. с точки зрения кода это оно и то же. Скрипт модификатора запускается при его создании и там без разницы, в каком месте таблицу делать. Разница только в дальнейшей простоте работы проггера.
Есть.
Сделав ее глобально она создается один раз.
Создавая ее локально в функции она будет создаваться КАЖДЫЙ раз при включении функции. Такие дела.