OnCreated/OnRefresh Lua-Modifier

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Где нужно прописывать действия, если в 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
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=EnDronist link=topic=1100.msg6332#msg6332 date=1474095379]
Где нужно прописывать действия, если в 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
[/quote]
Что за ошибка то? И кстати говоря, вынеси таблицу в начало файла, каждый раз создавать ее затратненько.
И кстати говоря, у меня вот OnCreated вызывается всегда без проблем.
 
Последнее редактирование модератором:

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
[quote author=CryDeS link=topic=1100.msg6334#msg6334 date=1474107326]
Что за ошибка то? И кстати говоря, вынеси таблицу в начало файла, каждый раз создавать ее затратненько.
И кстати говоря, у меня вот OnCreated вызывается всегда без проблем.
[/quote]
Дота крашится, пишет, что не найден класс модификатора. | Куда я вынесу таблицу?
759d758c2e094f82bff5f52fa04511b7.png

Ладно, решил не лезть в эти модификаторы, сделал по-другому
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=EnDronist link=topic=1100.msg6337#msg6337 date=1474112352]
Дота крашится, пишет, что не найден класс модификатора. | Куда я вынесу таблицу?
759d758c2e094f82bff5f52fa04511b7.png

Ладно, решил не лезть в эти модификаторы, сделал по-другому
[/quote]
Код:
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
А вот так крашит?
 
Последнее редактирование модератором:

Илья

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

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

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

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Илья, Лучше не буду засорять глобалку
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=EnDronist link=topic=1100.msg6342#msg6342 date=1474128998]
Илья, Лучше не буду засорять глобалку
[/quote]
Сделай таблицу ЛОКАЛЬНОЙ для всего файла. Она не будет считаться глобальной, и будет доступна только в этом файле, и скорость доступа не будет отличаться от скорости доступа если бы она была в самой функции. Зато время затрачиваемое на создание будет огромным.
 

Илья

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

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

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Она будет глобальна только внутри файла, как верно подметил Край.

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

Илья

Друзья CG
25 Сен 2015
2,348
41
Это ты к чему? Был какой-то случай на практике, что на пол секунды была задержка при расчетах? Скинь. Без задействия таймеров я не верю, что такое возможно в наших ситуациях.
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Это ты к чему? Был какой-то случай на практике, что на пол секунды была задержка при расчетах? Скинь. Без задействия таймеров я не верю, что такое возможно в наших ситуациях.
Когда я по глупости в проверке армора(в модификаторе) всунул создание таблицы на 400 строк
 
Последнее редактирование модератором:

Илья

Друзья CG
25 Сен 2015
2,348
41
Именно создавал её, т.е. с insert ? Или описал, как EnDronist?
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Именно создавал её, т.е. с insert ? Или описал, как EnDronist?
Почти как у него, но по другому( ["key"] = { ... } ). Большие таблицы при создании тратят время, которое при загрузке мода практически неразличимо, нежели во время действия.
 
Последнее редактирование модератором:

Илья

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

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Но разницы, создавать таблицу глобально в модификаторе, либо при его навешивании- нет, т.к. с точки зрения кода это оно и то же. Скрипт модификатора запускается при его создании и там без разницы, в каком месте таблицу делать. Разница только в дальнейшей простоте работы проггера.
Есть.
Сделав ее глобально она создается один раз.
Создавая ее локально в функции она будет создаваться КАЖДЫЙ раз при включении функции. Такие дела.
 
Последнее редактирование модератором:

Илья

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

Илья

Друзья CG
25 Сен 2015
2,348
41
Я не поленился и проверил - действительно, ты прав: скрипт модификатора штудируется единожды, а не каждый раз по новой.
 

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Я не поленился и проверил - действительно, ты прав: скрипт модификатора штудируется единожды, а не каждый раз по новой.
Он же грузится ток при linkluamodifier, зачем было бы открывать его каждый раз? Это была бы нелогичная трата ресурсов ввода-вывода ;D
 
Последнее редактирование модератором:
Реклама: