Lua <> DataDrivenAura

EnDronist

Продвинутый
28 Апр 2016
231
0
Проект
Защитники Изобилия | Defenders of Abundance
Как узнать другого героя в скрипте, запущенном от DataDriven-модификатора-ауры?
print(keys.caster) Выдаёт только владельца ауры, а не владельца модификатора от создаваемого ей
Код:
			"modifier_item_thasdorah_speed_aura"
			{
				"Passive"				"1"
				"IsHidden"				"0"//1
				"IsDebuff"				"0"

				"OnCreated"
				{
					"RunScript"
					{
						"ScriptFile"		"items/item_thasdorah.lua"
						"Function"		"modifier_item_thasdorah_aura"
					}
				}
			}
Код:
function modifier_item_thasdorah_aura(keys)
	print(keys.caster)
	if not keys.caster:HasModifier("modifier_item_thasdorah_speed") then
		keys.caster:AddNewModifier(keys.caster, keys.ability, "modifier_item_thasdorah_speed", {duration = -1})
	end
end
 
Последнее редактирование модератором:
Как сделать так, чтоб модификатор удалил сам себя, если предмет, который запустил ауру, которая запустила скрипт, которая добавила модификатор уже отсутствует в инвентаре? (Т.е. нет доступа к keys.caster, потому что нет предмета, откуда брались бы keys'ы)
 
А сделать ауру аурой?
 
ZLOY,
Код:
     "modifier_item_thasdorah"
     {
      "Passive"      "1"
      "IsHidden"      "0"//1
      "IsDebuff"      "0"
      
      "Attributes"     "MODIFIER_ATTRIBUTE_MULTIPLE"
      "Aura"       "modifier_item_thasdorah_speed_aura"
      "Aura_Radius"     "%aura_radius"
      "Aura_Teams"     "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
      "Aura_Types"     "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
      "Aura_Flags"     "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
      "Aura_ApplyToCaster"    "1"
      "Aura"       "modifier_item_thasdorah_aura"
      "Aura_Radius"     "%aura_radius"
      "Aura_Teams"     "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
      "Aura_Types"     "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
      "Aura_Flags"     "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
      "Aura_ApplyToCaster"    "1"
      "ThinkInterval"    ".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"
        }
      }
      "OnDestroy"
      {
        "RunScript"
        {
         "ScriptFile"   "items/item_thasdorah.lua"
         "Function"   "modifier_item_thasdorah_on_destroy"
        }
      }
      "Properties"
      {
        "MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE"   "%bonus_damage"
        "MODIFIER_PROPERTY_STATS_STRENGTH_BONUS"   "%bonus_strength"
        "MODIFIER_PROPERTY_STATS_AGILITY_BONUS"     "%bonus_agility"
        "MODIFIER_PROPERTY_STATS_INTELLECT_BONUS"   "%bonus_intellect"
        "MODIFIER_PROPERTY_STATS_STRENGTH_BONUS"   "%bonus_strength"
        "MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT"   "%bonus_attack_speed"
      }
     }
     "modifier_item_thasdorah_speed_aura"
     {
      "Passive"      "1"
      "IsHidden"      "0"//1
      "IsDebuff"      "0"
      "OnCreated"
      {
        "RunScript"
        {
         "ScriptFile"   "items/item_thasdorah.lua"
         "Function"   "modifier_item_thasdorah_aura"
        }
      }
     }
[quote author=EnDronist link=topic=1262.msg7613#msg7613 date=1484753185]
Код:
function modifier_item_thasdorah_aura(keys)
	print(keys.caster)
	if not keys.caster:HasModifier("modifier_item_thasdorah_speed") then
		keys.caster:AddNewModifier(keys.caster, keys.ability, "modifier_item_thasdorah_speed", {duration = -1})
	end
end
[/quote]
 
Последнее редактирование модератором:
Зачем тебе делать ауру, которая вешает другой модификатор? Делай тот самый модификатор аурой и никаких проблем.
 
Илья, Нужно, чтоб эффект оставался какое-то время после выхода из ауры
 
EnDronist, ну вешай эффект на пару секунд, а каждую секунду таймером проявляй наличие модификатора ауры
 
Тогда лучше делать не ауру, а простой пассивный модификатор вещи с thinker, который будет запускать скрипт, который будет вешать в радиусе кастера твой временный луа модификатор. Так у тебя и при выкладывании вещи будет пропадать псевдо-аура-источник и твой модификатор будет висеть именно какое-то время.
 
Илья,
Я сделал с помощью отключения в самом модификаторе синкера self:StartIntervalThink(-1) и активации функции self:SetDuration(0.03)
А у ауры в OnCreated() если нет этого модификатора, то добавляется, а если есть, то запускается таймер на 0.06 секунды и потом ещё раз проверяет наличие у юнита модификатора и, если его нет, даёт.
Теперь сам модификатор накапливает стаки при атаке того, на ком он висит в функции OnAttackLanded(). Как увеличивать стаки только у того героя, который атаковал? Использовать if params.attacker == self:GetParent()?
 
То есть если модификатор весит на двух героях и один из них атакует, то стаки даются обоим?
 
Илья, Да, но сейчас сif params.attacker == self:GetParent() стали отдельно даваться каждому.
 
Что не так с моей lua-аурой? Она не даётся союзному Аксу (ошибок в консоли нет)
Код:
LinkLuaModifier("modifier_item_thasdorah_speed", "modifiers/modifier_item_thasdorah_speed", LUA_MODIFIER_MOTION_NONE)
if modifier_item_thasdorah_speed_aura == nil then modifier_item_thasdorah_speed_aura = class({}) end
function modifier_item_thasdorah_speed_aura:IsPassive() 			return false end
function modifier_item_thasdorah_speed_aura:IsHidden() 				return false end
function modifier_item_thasdorah_speed_aura:IsDebuff()				return false end
function modifier_item_thasdorah_speed_aura:RemoveOnDeath()			return true end
function modifier_item_thasdorah_speed_aura:IsAura() 				return true end
function modifier_item_thasdorah_speed_aura:IsAuraActiveOnDeath()	return false end
function modifier_item_thasdorah_speed_aura:GetAuraRadius()			return self.radius end
function modifier_item_thasdorah_speed_aura:GetAuraSearchTeam()		return {DOTA_UNIT_TARGET_TEAM_FRIENDLY} end
function modifier_item_thasdorah_speed_aura:GetAuraSearchType()		return {DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC} end
function modifier_item_thasdorah_speed_aura:GetAuraSearchFlags()	return {DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES} end
function modifier_item_thasdorah_speed_aura:OnCreated(params)
	self.radius = self:GetAbility():GetSpecialValueFor("aura_radius")
	self:OnIntervalThink()
	self:StartIntervalThink(0.03)
end
function modifier_item_thasdorah_speed_aura:OnIntervalThink(params)
	if IsServer() then
		if not self:GetParent():HasModifier("modifier_item_thasdorah_speed") then
			self:GetParent():AddNewModifier(self:GetParent(),self:GetAbility(),"modifier_item_thasdorah_speed",{duration = -1})
		else
			Timers:CreateTimer(0.06,function()
				self:GetParent():AddNewModifier(self:GetParent(),self:GetAbility(),"modifier_item_thasdorah_speed",{duration = -1})
			end)
		end
	end
end
 
Последнее редактирование модератором:
Код:
function modifier_item_thasdorah_speed_aura:GetAuraSearchTeam()		return {DOTA_UNIT_TARGET_TEAM_FRIENDLY} end
Тут и в подобных таблица не нужна
 
Код:
if modifier_item_thasdorah_speed_aura == nil then modifier_item_thasdorah_speed_aura = class({}) end
Юзлесс проверка
 
[quote author=ZLOY link=topic=1262.msg7664#msg7664 date=1484835161]
Код:
if modifier_item_thasdorah_speed_aura == nil then modifier_item_thasdorah_speed_aura = class({}) end
Юзлесс проверка
[/quote]
Знаю, зато красиво выглядит)
 
[quote author=ZLOY link=topic=1262.msg7663#msg7663 date=1484835034]
Код:
function modifier_item_thasdorah_speed_aura:GetAuraSearchTeam()		return {DOTA_UNIT_TARGET_TEAM_FRIENDLY} end
Тут и в подобных таблица не нужна
[/quote]
И ничего не изменилось на деле.
 
ZLOY, Ставил туда в return название в " " этой же ауры
 
Последнее редактирование модератором:
Реклама: