Добавлен , опубликован
Способ реализации:
Lua
Версия Warcraft:
» MUI: нет
» Импорт: иконка, эффекты
» Утечки: нет
» Требования: нет
» Благодарности: KaneThaumaturge за реколор иконки.
Герой открывает портал в небо и призывает оттуда молнию, которая наносит урон наземным юнитам в размере : Базовый урон героя * уровень способности.

Скриншот

Технические подробности

Перенос в свою карту
Триггеры
  • RandomLightning
Способности
  • 'SRaL'
Импорт
  • Effect\Spell\RandomLightningBlue.mdx
  • Effect\Spell\RandomLightningNature.mdx
  • Effect\Spell\RandomLightningOrange.mdx
  • Effect\Spell\RandomLightningRed.mdx
  • Effect\Spell\RandomLightningVoid.mdx
  • ReplaceableTextures\CommandButtons\BTNSpellRandomLightningBlue.blp
  • ReplaceableTextures\CommandButtons\BTNSpellRandomLightningNature.blp
  • ReplaceableTextures\CommandButtons\BTNSpellRandomLightningOrange.blp
  • ReplaceableTextures\CommandButtons\BTNSpellRandomLightningRed.blp
  • ReplaceableTextures\CommandButtons\BTNSpellRandomLightningVoid.blp
  • ReplaceableTextures\CommandButtonsDisabled\DISBTNSpellRandomLightningBlue.blp
  • ReplaceableTextures\CommandButtonsDisabled\DISBTNSpellRandomLightningNature.blp
  • ReplaceableTextures\CommandButtonsDisabled\DISBTNSpellRandomLightningOrange.blp
  • ReplaceableTextures\CommandButtonsDisabled\DISBTNSpellRandomLightningRed.blp
  • ReplaceableTextures\CommandButtonsDisabled\DISBTNSpellRandomLightningVoid.blp
Настройка
local ABILITY_ID = AbilityId('SRaL')
local RANGE = 200
local DELAY = 1
local COLOR = {'Blue','Nature','Orange','Red','Void'}
Код
---@author https://xgm.guru/p/wc3/random-lightning
do
	local InitGlobalOrigin = InitGlobals
	function InitGlobals()
		InitGlobalOrigin()
		
		-- Настройки
		local ABILITY_ID      = FourCC('SRaL')
		local RANGE           = 200
		local DELAY           = 1
		local COLOR           = { 'Blue', 'Nature', 'Orange', 'Red', 'Void' }
		local ICON_PATH       = 'ReplaceableTextures/CommandButtons/BTNSpellRandomLightning'
		
		-- Заклинание
		local GROUP_ENUM_ONCE = CreateGroup()
		local COLOR_CURRENT   = COLOR[math.random(1, #COLOR)]
		BlzSetAbilityIcon(ABILITY_ID, ICON_PATH .. COLOR_CURRENT .. '.blp')
		
		local trigger = CreateTrigger()
		for i = 0, bj_MAX_PLAYER_SLOTS - 1 do
			TriggerRegisterPlayerUnitEvent(trigger, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT)
		end
		TriggerAddAction(trigger, function()
			if GetSpellAbilityId() ~= ABILITY_ID then return end
			
			local caster = GetTriggerUnit()
			local damage = BlzGetUnitBaseDamage(caster, 1) * GetUnitAbilityLevel(caster, ABILITY_ID)
			local x, y   = GetSpellTargetX(), GetSpellTargetY()
			local effect = AddSpecialEffect('Abilities/Spells/Human/MassTeleport/MassTeleportCaster.mdl', x, y)
			
			TimerStart(CreateTimer(), DELAY, false, function()
				DestroyEffect(effect)
				DestroyEffect(AddSpecialEffect('Effect/Spell/RandomLightning' .. COLOR_CURRENT .. '.mdx', x, y))
				
				GroupEnumUnitsInRange(GROUP_ENUM_ONCE, x, y, RANGE)
				while true do
					local target = FirstOfGroup(GROUP_ENUM_ONCE)
					if target == nil then break end
					
					if UnitAlive(target) and
							IsPlayerEnemy(GetOwningPlayer(caster), GetOwningPlayer(target)) and
							not IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) and
							not IsUnitType(target, UNIT_TYPE_FLYING)
					then
						UnitDamageTarget(caster, target, damage, false, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
					end
					
					GroupRemoveUnit(GROUP_ENUM_ONCE, target)
				end
				
				COLOR_CURRENT = COLOR[math.random(1, #COLOR)]
				BlzSetAbilityIcon(ABILITY_ID, ICON_PATH .. COLOR_CURRENT .. '.blp')
				DestroyTimer(GetExpiredTimer())
			end)
		end)
	end
end
`
ОЖИДАНИЕ РЕКЛАМЫ...
30
Почему без MUI?
BlzSetAbilityIcon() меняет иконку для всех юнитов, если это игнорировать, то оно MUI.
Почему случайная?
Потому что простая слишком просто)
29
BlzSetAbilityIcon() меняет иконку для всех юнитов, если это игнорировать, то оно MUI.
Так ведь оно меняет конкретную абилку у применяемого юнита
constant abilitystringfield ABILITY_SF_ICON_ACTIVATED = ConvertAbilityStringField('auar')
native BlzSetAbilityStringField takes ability whichAbility, abilitystringfield whichField, string value returns boolean
30
Так ведь оно меняет конкретную абилку у применяемого юнита
BlzSetAbilityIcon(abilCode, iconPath) она принимает равкод способности и меняет иконку для всех юнитов.
30
новая нативка же есть
Что-то вообще ничего не меняет
BlzSetAbilityStringField(GetSpellAbility(), ABILITY_SF_ICON_ACTIVATED, 'ReplaceableTextures\\CommandButtons\\BTNPolymorph.blp')
Хотя исправно возвращает true
24
NazarPunk, меняет, просто смысла в этих изменениях нет т.к. эти данные в основном не используются оттуда где применяются эти изменения - не хватает возможности обновить интерфейс на основе новых данных. Возможно близы это починят в будущем, чтобы у локальной версии данных по абилке был приоритет перед глобальными.
30
prog, как допилят возможность, сделаю способность MUI))
20
Так, а у меня на синтаксис ругается, версия 1.31
5
Объясните для чайников, что значит "Создать локальный аналог переменной"
30
Capitan Alex:
Объясните для чайников, что значит "Создать локальный аналог переменной"
Это заклинание писалось как только lua появился на PTR и функции, которая превращает равкод в число близы не завезли. Поэтому в локальной области видимости была создана функция AbilityId. На момент последнего патча уже завезли функцию FourCC.
Обновлённый код заклинания
---@author https://xgm.guru/p/wc3/random-lightning
do
	local InitGlobalOrigin = InitGlobals
	function InitGlobals()
		InitGlobalOrigin()
		
		-- Настройки
		local ABILITY_ID      = FourCC('SRaL')
		local RANGE           = 200
		local DELAY           = 1
		local COLOR           = { 'Blue', 'Nature', 'Orange', 'Red', 'Void' }
		local ICON_PATH       = 'ReplaceableTextures/CommandButtons/BTNSpellRandomLightning'
		
		-- Заклинание
		local GROUP_ENUM_ONCE = CreateGroup()
		local COLOR_CURRENT   = COLOR[math.random(1, #COLOR)]
		BlzSetAbilityIcon(ABILITY_ID, ICON_PATH .. COLOR_CURRENT .. '.blp')
		
		local trigger = CreateTrigger()
		for i = 0, bj_MAX_PLAYER_SLOTS - 1 do
			TriggerRegisterPlayerUnitEvent(trigger, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT)
		end
		TriggerAddAction(trigger, function()
			if GetSpellAbilityId() ~= ABILITY_ID then return end
			
			local caster = GetTriggerUnit()
			local damage = BlzGetUnitBaseDamage(caster, 1) * GetUnitAbilityLevel(caster, ABILITY_ID)
			local x, y   = GetSpellTargetX(), GetSpellTargetY()
			local effect = AddSpecialEffect('Abilities/Spells/Human/MassTeleport/MassTeleportCaster.mdl', x, y)
			
			TimerStart(CreateTimer(), DELAY, false, function()
				DestroyEffect(effect)
				DestroyEffect(AddSpecialEffect('Effect/Spell/RandomLightning' .. COLOR_CURRENT .. '.mdx', x, y))
				
				GroupEnumUnitsInRange(GROUP_ENUM_ONCE, x, y, RANGE)
				while true do
					local target = FirstOfGroup(GROUP_ENUM_ONCE)
					if target == nil then break end
					
					if UnitAlive(target) and
							IsPlayerEnemy(GetOwningPlayer(caster), GetOwningPlayer(target)) and
							not IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE) and
							not IsUnitType(target, UNIT_TYPE_FLYING)
					then
						UnitDamageTarget(caster, target, damage, false, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
					end
					
					GroupRemoveUnit(GROUP_ENUM_ONCE, target)
				end
				
				COLOR_CURRENT = COLOR[math.random(1, #COLOR)]
				BlzSetAbilityIcon(ABILITY_ID, ICON_PATH .. COLOR_CURRENT .. '.blp')
				DestroyTimer(GetExpiredTimer())
			end)
		end)
	end
end
26
Capitan Alex, нужно было контекст представить.
По идее имеются ввиду локальные и глобальные переменные, когда для глобальной переменной, которая будет переписываться с каждым срабатыванием триггера, создают локальную, которая будет сохранять значение переменной до конца выполнения триггера, что требуется, когда выполнение растянуто по времени. Но в другом контексте может быть что угодно.

Чуть опоздал, выше нормально ответили. А то подумал, что человека игнорируют, раз 7 часов назад спрашивал.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.