Дебафф, создающийся lua-скриптом, запущенным предметом item_datadriven

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
У меня есть lua-модификаторы(дебаффы), которые берут значения из абилитисспешала:
Код:
function modifier_item_sasha_gray_corruption:OnCreated( kv )
  self.cold_as = self:GetAbility():GetSpecialValueFor("cold_attack_speed")
  self.cold_ms = self:GetAbility():GetSpecialValueFor("cold_movement_speed")
  self.minus_arm = self:GetAbility():GetSpecialValueFor("corruption_armor")
end
function modifier_item_sasha_gray_corruption:OnRefresh( kv )
  self.cold_as = self:GetAbility():GetSpecialValueFor("cold_attack_speed")
  self.cold_ms = self:GetAbility():GetSpecialValueFor("cold_movement_speed")
  self.minus_arm = self:GetAbility():GetSpecialValueFor("corruption_armor")
end
Если этот модификатор будет накладываться не через датадрайвен, а через lua-скрипт, который запускается этим предметом, будет ли он всё также получать значения из датадрайвена?
Если нет, то как их получить? Использовать глобальные переменные, которые будут записывать значения этого предмета в его lua-скрипте и затем использовать их в нужном?
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=EnDronist link=topic=1095.msg6265#msg6265 date=1473834039]
У меня есть lua-модификаторы(дебаффы), которые берут значения из абилитисспешала:
Код:
function modifier_item_sasha_gray_corruption:OnCreated( kv )
  self.cold_as = self:GetAbility():GetSpecialValueFor("cold_attack_speed")
  self.cold_ms = self:GetAbility():GetSpecialValueFor("cold_movement_speed")
  self.minus_arm = self:GetAbility():GetSpecialValueFor("corruption_armor")
end
function modifier_item_sasha_gray_corruption:OnRefresh( kv )
  self.cold_as = self:GetAbility():GetSpecialValueFor("cold_attack_speed")
  self.cold_ms = self:GetAbility():GetSpecialValueFor("cold_movement_speed")
  self.minus_arm = self:GetAbility():GetSpecialValueFor("corruption_armor")
end
Если этот модификатор будет накладываться не через датадрайвен, а через lua-скрипт, который запускается этим предметом, будет ли он всё также получать значения из датадрайвена?
Если нет, то как их получить? Использовать глобальные переменные, которые будут записывать значения этого предмета в его lua-скрипте и затем использовать их в нужном?
[/quote]
Будет получать. Он получает не из варианта создания абилки, а прямо из kv файла который загружен в память автоматически доткой.
 
Последнее редактирование модератором:

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Будет получать. Он получает не из варианта создания абилки, а прямо из kv файла который загружен в память автоматически доткой.
А если мне нужно взять абилитисспешал из другого предмета?
 
Последнее редактирование модератором:

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Занеси нужный предмет в переменную, и получай спешил из него.
Как раз-таки таким образом?
0c9f86814d1645028d3261e9493b8bca.png
 
Последнее редактирование модератором:

Faith

Пользователь
8 Сен 2016
18
0
Ну можно и так, а можно и по-другому, чтобы не дублировать строчки в AbilitySpecial.
 

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Но проблема теперь в этом и появилась:
Код:
if modifier_item_skadi_corruption == nil then
  modifier_item_skadi_corruption = class({})
end
function modifier_item_skadi_corruption:IsHidden()
  return true
end
function modifier_item_skadi_corruption:IsDebuff()
  return true
end
function modifier_item_skadi_corruption:IsPurgable()
  return true
end
function modifier_item_skadi_corruption:GetTexture()
  return "desolator_skadi_corruption"
end
function modifier_item_skadi_corruption:GetEffectName()
	return "particles/status_fx/status_effect_frost.vpcf"
end
function modifier_item_skadi_corruption:OnCreated( kv )
		local nFXIndex = ParticleManager:CreateParticle( "particles/status_fx/status_effect_frost.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() )
		ParticleManager:SetParticleControl( nFXIndex, 1, Vector( self:GetStackCount(), 0, 0 ) ) -- Жалуется здесь
	self.GetCaster():AddNewModifier(self.GetCaster(), nil, "modifier_item_desolator_corruption_for_desolator_skadi", {duration = 15}) -- И здесь
end
function modifier_item_skadi_corruption:OnCreated(keys)
	
end
function modifier_item_skadi_corruption:OnRefresh( kv )
		local nFXIndex = ParticleManager:CreateParticle( "particles/status_fx/status_effect_frost.vpcf", PATTACH_CUSTOMORIGIN, self:GetCaster() )
		ParticleManager:SetParticleControlEnt( nFXIndex, 0, self:GetCaster(), PATTACH_POINT_FOLLOW, "attach_staff_base", self:GetCaster():GetOrigin(), true )
	self.GetCaster():AddNewModifier(self.GetCaster(), nil, "modifier_item_desolator_corruption_for_desolator_skadi", {duration = 15})
end
function modifier_item_skadi_corruption:GetAttributes()
  return MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE
end
function modifier_item_skadi_corruption:DeclareFunctions()
  local funcs = {
   MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT,
   MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE
  }
  return funcs
end

function modifier_item_skadi_corruption:GetModifierMoveSpeedBonus_Percentage()
  return _G.item_skadi_cold_movement_speed
end
function modifier_item_skadi_corruption:GetModifierAttackSpeedBonus_Constant()
  return _G.item_skadi_cold_attack_speed
end
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Не знаю сколько раз я писал о проблемах такого рода, но напишу еше раз.
Код луа модификаторов вызывается на сервере и на клиенте. Вся игровая логика должна осуществляться на сервере, нельзя же ведь чтобы клиент сам решал что происходит в игре. На клиенте этот код вызывается только для нужд интерфейса. Именно поэтому API на клиенте обрезано и ты видишь ошибки в консоли.
Вот та часть кода где ты создаешь объекты, изменяешь их свойства должна выполняться только на сервере. Для этого есть функции IsServer() и IsClient()
 

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
ZLOY, И ещё вот такая проблема:
Код:
LinkLuaModifier( "modifier_item_desolator_corruption", "orb_effects/modifier_item_desolator_corruption", LUA_MODIFIER_MOTION_NONE )
function modifier_item_desolator_orb(keys)
  keys.ability:AddNewModifier(keys.caster, nil, "modifier_item_desolator_corruption", {duration = _G.item_desolator_corruption_duration})
end
Код:
[ W VScript       ]: Script Runtime Error: ...test1\scripts\vscripts\orb_effects\joint_cooperation.lua:72: attempt to call method 'AddNewModifier' (a nil value)
[ W VScript       ]: stack traceback:
[ W VScript       ]: 	...test1\scripts\vscripts\orb_effects\joint_cooperation.lua:72: in function <...test1\scripts\vscripts\orb_effects\joint_cooperation.lua:71>
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=EnDronist link=topic=1095.msg6291#msg6291 date=1473926979]
ZLOY, И ещё вот такая проблема:
Код:
LinkLuaModifier( "modifier_item_desolator_corruption", "orb_effects/modifier_item_desolator_corruption", LUA_MODIFIER_MOTION_NONE )
function modifier_item_desolator_orb(keys)
  keys.ability:AddNewModifier(keys.caster, nil, "modifier_item_desolator_corruption", {duration = _G.item_desolator_corruption_duration})
end
Код:
[ W VScript       ]: Script Runtime Error: ...test1\scripts\vscripts\orb_effects\joint_cooperation.lua:72: attempt to call method 'AddNewModifier' (a nil value)
[ W VScript       ]: stack traceback:
[ W VScript       ]: 	...test1\scripts\vscripts\orb_effects\joint_cooperation.lua:72: in function <...test1\scripts\vscripts\orb_effects\joint_cooperation.lua:71>
[/quote]
Ты не правильно используешь AddNewModifier как минимум. Вот тебе пример использования
Код:
hero:AddNewModifier(hero, ability, STUN_MODIFIER, {duration = 4})
 
Последнее редактирование модератором:

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
CryDeS, Вот пример, который я нашёл с "hero", а мне как его назначать?:
Код:
function OnHeroRespawn(spawned_hero)
 local hero = spawned_hero
 local steam_id = PlayerResource:GetSteamAccountID(hero:GetPlayerOwnerID())
 
 if not steam_id then return end
 if steam_id == 94742628 then
   hero:AddNewModifier(hero, nil, "modifier_yarik", { duration = - 1 })
 end
 if steam_id == 123106753 then
   hero:AddNewModifier(hero, nil, "modifier_grin", { duration = - 1 })
 end
 if steam_id == 73911256 then
   hero:AddNewModifier(hero, nil, "modifier_crydes", { duration = - 1 })
 end
end
 
Последнее редактирование модератором:

CryDeS

Друзья CG
14 Июл 2015
1,210
11
[quote author=EnDronist link=topic=1095.msg6293#msg6293 date=1473927943]
CryDeS, Вот пример, который я нашёл с "hero", а мне как его назначать?:
Код:
function OnHeroRespawn(spawned_hero)
  local hero = spawned_hero
  local steam_id = PlayerResource:GetSteamAccountID(hero:GetPlayerOwnerID())
  
  if not steam_id then return end
  if steam_id == 94742628 then
   hero:AddNewModifier(hero, nil, "modifier_yarik", { duration = - 1 })
  end
  if steam_id == 123106753 then
   hero:AddNewModifier(hero, nil, "modifier_grin", { duration = - 1 })
  end
  if steam_id == 73911256 then
   hero:AddNewModifier(hero, nil, "modifier_crydes", { duration = - 1 })
  end
end
[/quote]
У тебя это keys.caster
И что за жопа кидает мне модификатор?!
 
Последнее редактирование модератором:

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Теперь у меня из одного lua-файла запускается нормально,:
Код:
function modifier_item_desolator_orb(keys)
  if IsServer() then
   keys.target:AddNewModifier(keys.caster, nil --[[Тут ставил и self, и keys.caster, и keys.target]],"modifier_item_desolator_corruption", {duration = _G.item_desolator_corruption_duration})
  end
end
Код:
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( kv )
  self.corruption_armor = _G.item_desolator_corruption_armor
end
function modifier_item_desolator_corruption:OnRefresh( kv )
  self.corruption_armor = _G.item_desolator_corruption_armor
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
Но модификатор не снимает броню:
8be7066ba34f4e9a9a7bcd2a954deedb.png


920406ba62424becb1127002bae096c0.png
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Он снимает, просто клиент не знает об этом
Код:
_G.item_desolator_corruption_armor
Что это за говно? Почему нельзя использовать AbilitySpecial?
 

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
ZLOY, Да не получится через абилитис спешл, потому что мне нужно брать от нескольких предметов параметры в один файл, который будет запускать на _G.время модификатор. А в самом модификаторе (дебаффе) нужно как-то присвоить значения, но сами эти дебаффы даются lua-скриптом, а не KVшкой.
ZLOY написал(а):
Он снимает, просто клиент не знает об этом
И что делать? if not IsServer() ?
Код:
function modifier_item_desolator_corruption:OnCreated()
	self.corruption_armor = _G.item_desolator_corruption_armor
	print (self.corruption_armor)
end
ccf1ad7b6bad43028748d91f182026fe.png
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Покажи код где ты _G.item_desolator_corruption_armor устанавливаешь
 

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Покажи код где ты _G.item_desolator_corruption_armor устанавливаешь
Код:
			//Desolator Orb
			"modifier_item_desolator_orb"
			{
				"IsHidden"			"0"
				"TextureName"			"desolator_orb"
	
				"Orb"
				{
					"Priority"				"DOTA_ORB_PRIORITY_ITEM"
					"ProjectileName"		"particles/items_fx/desolator_projectile.vpcf"
					"CastAttack"			"0"
				}

				"OnOrbImpact"
				{
					"RunScript"
					{
						"ScriptFile"			"orb_effects/joint_cooperation.lua"
						"Function"			"modifier_item_desolator_orb"
					}
					"FireSound"
					{
						"EffectName"		"Item_Desolator.Target"
						"Target"			"TARGET"
					}
				}
			}
Код:
function modifier_item_orb(keys)
_G.item_desolator_corruption_armor = keys.ability:GetSpecialValueFor("corruption_armor")
_G.item_desolator_corruption_duration = keys.ability:GetSpecialValueFor("corruption_duration")
--Дальше всё остальное
end
 
Последнее редактирование модератором:

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
EnDronist, ЦЕЛЬ:AddNewModifier(ЮНИТ_КОТОРЫЙ_ПОВЕСИЛ_ЭТОТ_МОДИФИКАТОР, ТУТ_ПЕРЕДАЕТСЯ_СПОСОБНОСТЬ_К_КОТОРОЙ_ПОТОМ_В_МОДИФИКАТОРЕ_МОЖНО_ОБРАЩАТЬСЯ_ЧЕРЕЗ_self:GetAbility(),"modifier_item_desolator_corruption", {duration = _G.item_desolator_corruption_duration})

Конечно ты гетспешлвалуе не можешь взять, потому что ты абилку модификатору не передаешь.


И так как ты через кв делаешь вызов функции, ты не можешь там использовать никаких self. Тебе нужно абилку через keys.ability передавать.
Вот так:
Код:
keys.target:AddNewModifier(keys.caster, keys.ability,"modifier_item_desolator_corruption", {duration = _G.item_desolator_corruption_duration})
 
Последнее редактирование модератором:

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
[quote author=EnDronist link=topic=1095.msg6297#msg6297 date=1473940527]
Теперь у меня из одного lua-файла запускается нормально,:
Код:
function modifier_item_desolator_orb(keys)
  if IsServer() then
   keys.target:AddNewModifier(keys.caster, nil --[[Тут ставил и self, и keys.caster, и keys.target]],"modifier_item_desolator_corruption", {duration = _G.item_desolator_corruption_duration})
  end
end

[/quote]
IsServer только для луа модификаторов
Код:
handle AddNewModifier(handle caster, handle optionalSourceAbility, string modifierName, handle modifierData)
Вторым аргументом вставляешь способность и ты сможешь юзать абилити спешиалс
PS: тебе не хватает самых простых знаний, почитай пару гайдов чтоли
 
Последнее редактирование модератором:

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
EnDronist, потому что ты вместо абилки модификатору nil передаешь.
 
Реклама: