Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Lua
Тип:
Способность
Версия Warcraft:
Reforged
» 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
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
27
5 лет назад
0
Почему без MUI?
4
17
5 лет назад
4
Почему случайная?
0
29
5 лет назад
Отредактирован nazarpunk
0
Почему без MUI?
BlzSetAbilityIcon() меняет иконку для всех юнитов, если это игнорировать, то оно MUI.
GetLocalPlayer:
Почему случайная?
Потому что простая слишком просто)
0
27
5 лет назад
Отредактирован Феникс
0
BlzSetAbilityIcon() меняет иконку для всех юнитов, если это игнорировать, то оно MUI.
Так ведь оно меняет конкретную абилку у применяемого юнита
constant abilitystringfield ABILITY_SF_ICON_ACTIVATED = ConvertAbilityStringField('auar')
native BlzSetAbilityStringField takes ability whichAbility, abilitystringfield whichField, string value returns boolean
0
29
5 лет назад
0
Так ведь оно меняет конкретную абилку у применяемого юнита
BlzSetAbilityIcon(abilCode, iconPath) она принимает равкод способности и меняет иконку для всех юнитов.
0
27
5 лет назад
0
NazarPunk, Исправил, новая нативка же есть
0
29
5 лет назад
Отредактирован nazarpunk
0
новая нативка же есть
Что-то вообще ничего не меняет
BlzSetAbilityStringField(GetSpellAbility(), ABILITY_SF_ICON_ACTIVATED, 'ReplaceableTextures\\CommandButtons\\BTNPolymorph.blp')
Хотя исправно возвращает true
0
24
5 лет назад
Отредактирован prog
0
NazarPunk, меняет, просто смысла в этих изменениях нет т.к. эти данные в основном не используются оттуда где применяются эти изменения - не хватает возможности обновить интерфейс на основе новых данных. Возможно близы это починят в будущем, чтобы у локальной версии данных по абилке был приоритет перед глобальными.
0
29
5 лет назад
0
prog, как допилят возможность, сделаю способность MUI))
0
19
5 лет назад
0
Так, а у меня на синтаксис ругается, версия 1.31
1
27
5 лет назад
1
KaneThaumaturge, На lua пакеты переключился?
0
19
5 лет назад
0
Ага, надо было JassHelper отключить
0
5
5 лет назад
0
Объясните для чайников, что значит "Создать локальный аналог переменной"
2
29
5 лет назад
2
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
0
26
5 лет назад
0
Capitan Alex, нужно было контекст представить.
По идее имеются ввиду локальные и глобальные переменные, когда для глобальной переменной, которая будет переписываться с каждым срабатыванием триггера, создают локальную, которая будет сохранять значение переменной до конца выполнения триггера, что требуется, когда выполнение растянуто по времени. Но в другом контексте может быть что угодно.

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