Параметры | DataDriven => Lua-File => Lua-Modifier

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Хочу передать параметры в модификатор, но не знаю, как передать их через AddNewModifier, либо не знаю, как вывести их в самом модификаторе:
npc_items_custom.txt
Код:
				"ThinkInterval" 		"0.03"
				"OnIntervalThink"
				{
					"RunScript"
					{
						"ScriptFile"		"items/item_thasdorah.lua"
						"Function"		"modifier_item_thasdorah_on_interval_think"
						"per_time"		"%bonus_attack_range_per_time"
						"need_time"		"%bonus_attack_range_time"
					}
				}
item_thasdorah.lua
Код:
LinkLuaModifier( "modifier_item_thasdorah_attack_range", "modifiers/modifier_item_thasdorah_attack_range", LUA_MODIFIER_MOTION_NONE )
function modifier_item_thasdorah_on_destroy(keys)
	keys.caster:RemoveModifierByName("modifier_item_thasdorah_attack_range")
end
function modifier_item_thasdorah_on_interval_think(keys)
	if not keys.caster:IsRangedAttacker() then
		if keys.caster:HasModifier("modifier_item_thasdorah_attack_range") then
			keys.caster:RemoveModifierByName("modifier_item_thasdorah_attack_range")
		end
	else
		if not keys.caster:HasModifier("modifier_item_thasdorah_attack_range") then
			keys.caster:AddNewModifier(keys.caster, self, "modifier_item_thasdorah_attack_range", {duration = -1, need_time = keys.need_time, per_time = keys.per_time})
		end
	end
end
modifier_item_thasdorah_attack_range.lua
Код:
LinkLuaModifier( "modifier_item_thasdorah_on_interval_think", "items/modifier_item_thasdorah_on_interval_think", LUA_MODIFIER_MOTION_NONE )
if modifier_item_thasdorah_attack_range == nil then
	modifier_item_thasdorah_attack_range = class({})
end
function modifier_item_thasdorah_attack_range:IsPassive()
	return false
end

function modifier_item_thasdorah_attack_range:IsHidden()
	return false
end
function modifier_item_thasdorah_attack_range:DeclareFunctions()
	local funcs = {
		MODIFIER_PROPERTY_ATTACK_RANGE_BONUS
	}
	return funcs
end
function modifier_item_thasdorah_attack_range:GetAttributes()
  return MODIFIER_ATTRIBUTE_MULTIPLE
end

function modifier_item_thasdorah_attack_range:OnCreated(params)
	if IsServer() then
		self:OnIntervalThink()
		self:StartIntervalThink(1.0)
		--[[self.per_time = per_time]]
		print(self.per_time)
	end
end
function modifier_item_thasdorah_attack_range:OnIntervalThink(params)
	if IsServer() then
		self.bonus_attack_range = self.per_time*math.ceil(GameRules:GetGameTime()/self.need_time)
		print(self.bonus_attack_range)
	end
end

function modifier_item_thasdorah_attack_range:GetModifierAttackRangeBonus()
	return self.bonus_attack_range
end
Код:
[ W VScript ]: Script Runtime Error: ...ripts\modifiers\modifier_item_thasdorah_attack_range.lua:32: attempt to perform arithmetic on field 'need_time' (a nil value)
[ W VScript ]: stack traceback:
[ W VScript ]: 	...ripts\modifiers\modifier_item_thasdorah_attack_range.lua:32: in function 'OnIntervalThink'
[ W VScript ]: 	...ripts\modifiers\modifier_item_thasdorah_attack_range.lua:24: in function <...ripts\modifiers\modifier_item_thasdorah_attack_range.lua:22>
[ W VScript ]: 	[C]: in function 'AddNewModifier'
[ W VScript ]: 	...a_addons\test1\scripts\vscripts\items\item_thasdorah.lua:12: in function <...a_addons\test1\scripts\vscripts\items\item_thasdorah.lua:5>
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
Хочу передать параметры в модификатор, но не знаю, как передать их через AddNewModifier, либо не знаю, как вывести их в самом модификаторе:
Код:
local net_table = CustomNetTables:GetTableValue( "heroes", "modifier_gun_joe_explosive")
Код:
CustomNetTables:SetTableValue( "heroes", "modifier_gun_joe_explosive", {radius = 450} )
И естественно прописать в нет тейблы таблицу соответсвующую.
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Странная мешанина из datadtiven и lua
Почему просто не использовать
Код:
self:GetAbility():GetSpecialValueFor("bonus_attack_range_per_time")
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Все что ты передаешь в последнем аргументе AddNewModifier попадает в params функции OnCreated, но никак в таблицу модификатора.
А неттейбл тут вообще не нужен, ну никак.
 

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Все что ты передаешь в последнем аргументе AddNewModifier попадает в params функции OnCreated, но никак в таблицу модификатора.
А неттейбл тут вообще не нужен, ну никак.
И как достать их оттуда? params.per_time (В OnCreated)?
 
Последнее редактирование модератором:

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
ZLOY, Мне удобней пока что писать предметы на Датадрайвене, а туда вставлять уже ссылки на скрипты. Проверку на дальника делать в Датадрайвене нельзя, вот и использовал Lua-File
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Зачем тебе вообще что-то передавать. GetSpecialValueFor есть же
 

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Зачем тебе вообще что-то передавать. GetSpecialValueFor есть же
Т.е. GetSpecialValueFor вытянет для меня нужные константы в модификаторе (в Datadriven-Modifier), который создал не Datadriven-Modifier, а Lua-File?
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=EnDronist link=topic=1257.msg7555#msg7555 date=1484661071]
Т.е. GetSpecialValueFor вытянет для меня нужные константы в модификаторе (в Datadriven-Modifier), который создал не Datadriven-Modifier, а Lua-File?
[/quote]
Код:
self:GetAbility():GetSpecialValueFor("blah");
Неттейблы нужны если ты хочешь таланты делать, нельзя на стороне клиента получить другую абилку, которая например сократит кулдаун/параметр модификатора
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Код:
					"RunScript"
					{
						"ScriptFile"		"items/item_thasdorah.lua"
						"Function"		"modifier_item_thasdorah_on_interval_think"
						"per_time"		"%bonus_attack_range_per_time"
						"need_time"		"%bonus_attack_range_time"
					}

keys.caster:AddNewModifier(keys.caster, keys.ability, "modifier_item_thasdorah_attack_range", {duration = -1, need_time = keys.need_time, per_time = keys.per_time})
У тебя тут передаются abilitySpecial просто, если тебе нужно использовать их без изменений, то GetSpecialValueFor подходит.
 
Последнее редактирование модератором:

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
[quote author=ZLOY link=topic=1257.msg7557#msg7557 date=1484661458]
Код:
					"RunScript"
					{
						"ScriptFile"		"items/item_thasdorah.lua"
						"Function"		"modifier_item_thasdorah_on_interval_think"
						"per_time"		"%bonus_attack_range_per_time"
						"need_time"		"%bonus_attack_range_time"
					}

keys.caster:AddNewModifier(keys.caster, keys.ability, "modifier_item_thasdorah_attack_range", {duration = -1, need_time = keys.need_time, per_time = keys.per_time})
У тебя тут передаются abilitySpecial просто, если тебе нужно использовать их без изменений, то GetSpecialValueFor подходит.
[/quote]
Код:
function modifier_item_thasdorah_attack_range:OnCreated(params)
	if IsServer() then
		self:OnIntervalThink()
		self:StartIntervalThink(1.0)
		--[[Ни так,]]
		self.per_time = self:GetAbility():GetSpecialValueFor("bonus_attack_range_per_time")
		self.need_time = self:GetAbility():GetSpecialValueFor("bonus_attack_range_time")
		--[[ни так не работает]]
		self.per_time = self:GetAbility():GetSpecialValueFor("per_time")
		self.need_time = self:GetAbility():GetSpecialValueFor("need_time")
		print(self.per_time)
	end
end
function modifier_item_thasdorah_attack_range:OnIntervalThink(params)
	if IsServer() then
		self.bonus_attack_range = self.per_time*math.ceil(GameRules:GetGameTime()/self.need_time)
		print(self.bonus_attack_range)
	end
end
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
У тебя при создании модификатора не указана способность
Код:
keys.caster:AddNewModifier(keys.caster, self, "modifier_item_thasdorah_attack_range", {duration = -1, need_time = keys.need_time, per_time = keys.per_time})
А должно быть
Код:
keys.caster:AddNewModifier(keys.caster, keys.ability, "modifier_item_thasdorah_attack_range", {duration = -1, need_time = keys.need_time, per_time = keys.per_time})
 
Последнее редактирование модератором:

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
ZLOY,
ZLOY написал(а):
У тебя при создании модификатора не указана способность
Код: [Выделить]keys.caster:AddNewModifier(keys.caster, self, "modifier_item_thasdorah_attack_range", {duration = -1, need_time = keys.need_time, per_time = keys.per_time})А должно быть
Код: [Выделить]keys.caster:AddNewModifier(keys.caster, keys.ability, "modifier_item_thasdorah_attack_range", {duration = -1, need_time = keys.need_time, per_time = keys.per_time})
В консоль self.bonus_attack_range выписывает, но герою параметр не даётся.
Код:
LinkLuaModifier( "modifier_item_thasdorah_on_interval_think", "items/modifier_item_thasdorah_on_interval_think", LUA_MODIFIER_MOTION_NONE )
if modifier_item_thasdorah_attack_range == nil then
  modifier_item_thasdorah_attack_range = class({})
end
function modifier_item_thasdorah_attack_range:IsPassive()
  return false
end
function modifier_item_thasdorah_attack_range:IsHidden()
  return false
end
function modifier_item_thasdorah_attack_range:DeclareFunctions()
  local funcs = {
   MODIFIER_PROPERTY_ATTACK_RANGE_BONUS
  }
  return funcs
end
--function modifier_item_thasdorah_attack_range:GetAttributes()
--  return MODIFIER_ATTRIBUTE_MULTIPLE
--end
function modifier_item_thasdorah_attack_range:OnCreated(params)
  if IsServer() then
   self.per_time = self:GetAbility():GetSpecialValueFor("bonus_attack_range_per_time")
   self.need_time = self:GetAbility():GetSpecialValueFor("bonus_attack_range_time")
   self:OnIntervalThink()
   self:StartIntervalThink(1.0)
  end
end
function modifier_item_thasdorah_attack_range:OnIntervalThink(params)
  if IsServer() then
   self.bonus_attack_range = self.per_time*math.ceil(GameRules:GetGameTime()/self.need_time)
   print(self.bonus_attack_range)
  end
end
function modifier_item_thasdorah_attack_range:GetModifierAttackRangeBonus()
  return self.bonus_attack_range
end
 
Последнее редактирование модератором:

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Спасибо. А IsServer() используется только, когда нужно найти информацию об игроке?
79e738f21d0146f39e872ab05cbc94d6.png
 
Последнее редактирование модератором:

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
EnDronist, как это проверки на дальника нет, если она есть?
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
EnDronist, иссервер используется только когда функции определенной нет на клиенте, а на сервере она есть
 

Илья

Друзья CG
25 Сен 2015
2,348
41
И на будущее поясню:

Код:
					"RunScript"
					{
						"ScriptFile"		"items/item_thasdorah.lua"
						"Function"		"modifier_item_thasdorah_on_interval_think"
						"per_time"		"%bonus_attack_range_per_time"
						"need_time"		"%bonus_attack_range_time"
					}

Так ты передаешь именно строку. То есть переменная need_time будет содержать значение из bonus_attack_range_time, но оно будет иметь тип string - строка.

Можешь точно так же передавать (хотя я согласен со ZLOY, что правильнее будет через GetSpecialValue), но при этом в коде принимая строку, менять её на число:

Код:
local need_time = tonumber(key.need_time)

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

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=EnDronist link=topic=1257.msg7563#msg7563 date=1484665021]
Спасибо. А IsServer() используется только, когда нужно найти информацию об игроке?
[/quote]
IsServer() нужна для обработки игровой логики. Например для нанесение урона, вызова ордеров и прочих вещей. На клиенте хранится только информация выводимая пользователю(кулдауны способностей, их АОЕ, скорость атаки, base attack time, и прочие статы).
По этому все свои вычисления и работу переносит в IsServer(), а все что нужно клиенту нужно переносить на клиентскую часть.
Это сделано не только что бы не грузить компы пользователей повторными вычислениями которые им нахер не сдались, но и для того что бы подмена клиентских файлов не могла рушить работу всего сервера.
 
Реклама: