Алгоритмы, Наработки и Способности
Способ реализации:
Lua
Тип:
Наработка
Версия Warcraft:
1.31+
Набор предметов для проекта Последняя Надежда.

Предметы

Молот Стражника Света: При использовании любой способности с целью, есть шанс 10% исцелить союзную цель на 100 ед или нанести 50 ед урона враждебной нежити. Каждый предмет в инвентаре увеличивает шанс, объём исцеления или урона.
Код: Hammer of Light Guardian
do
	local InitGlobalsOrigin = InitGlobals
	function InitGlobals()
		InitGlobalsOrigin()
		
		local ITEM               = FourCC('IHLG') -- равкод предмета
		local CHANCE             = 10 -- шанс срабатывания
		local HEAL               = 100 -- количество излеченного здоровья
		local DAMAGE             = HEAL / 2 -- количество нанесённого урона
		local EFFECT             = { 'Abilities/Spells/Human/HolyBolt/HolyBoltSpecialArt.mdl', 'origin' } -- эффект
		
		local SpellEffectTrigger = CreateTrigger()
		for i = 0, bj_MAX_PLAYER_SLOTS - 1 do
			TriggerRegisterPlayerUnitEvent(SpellEffectTrigger, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT)
		end
		TriggerAddAction(SpellEffectTrigger, function()
			local caster      = GetTriggerUnit()
			local casterOwner = GetOwningPlayer(caster)
			local target      = GetSpellTargetUnit()
			
			if not IsUnitType(caster, UNIT_TYPE_HERO) or target == nil then return end
			local count = 0
			for i = 0, bj_MAX_INVENTORY do
				local item = UnitItemInSlot(caster, i)
				if GetItemTypeId(item) == ITEM then
					count = count + 1
				end
			end
			if count == 0 or math.random(0, 100) > CHANCE * count then return end
			
			if IsUnitEnemy(target, casterOwner) and IsUnitType(target, UNIT_TYPE_UNDEAD) then
				DestroyEffect(AddSpecialEffectTarget(EFFECT[1], target, EFFECT[2]))
				UnitDamageTarget(caster, target, DAMAGE * count, false, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
			end
			
			if IsUnitAlly(target, casterOwner) and not IsUnitType(target, UNIT_TYPE_UNDEAD) then
				DestroyEffect(AddSpecialEffectTarget(EFFECT[1], target, EFFECT[2]))
				SetWidgetLife(target, GetWidgetLife(target) + HEAL * count)
			end
		end)
	end
end
Браслет Мага: Наносит урон юнитам в области в размере интеллект * количество предметов. Если юнит при этом умирает, то восстанавливает ману герою в размере нанесённого урона.
Код: Brace of Mage
do
	local InitGlobalsOrigin = InitGlobals
	function InitGlobals()
		InitGlobalsOrigin()
		
		local ITEM               = FourCC('IBoM') -- равкод предмета
		local ABILITY            = FourCC('ABoM') -- равкод способности предмета
		local MISSILE            = 'Effect/Spell/BraceOfMage/Missile.mdx' -- модель снаряда hiveworkshop.com/threads/blizzard.315713
		local EXPLOSIVE          = 'Effect/Spell/BraceOfMage/Explosive.mdx' -- модель взрыва hiveworkshop.com/threads/pillar-of-flame.315281
		local EXPLOSIVE_DELAY    = 0.7 -- задержка перед взрывом
		local EFFECT_DAMAGE      = { 'Abilities/Weapons/SpiritOfVengeanceMissile/SpiritOfVengeanceMissile.mdl', 'chest' } -- эффект урона
		local EFFECT_MANA        = { 'Abilities/Spells/Items/AIma/AImaTarget.mdl', 'chest' } -- эффект восстановления маны
		
		local GROUP              = CreateGroup()
		local SpellEffectTrigger = CreateTrigger()
		for i = 0, bj_MAX_PLAYER_SLOTS - 1 do
			TriggerRegisterPlayerUnitEvent(SpellEffectTrigger, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT)
		end
		TriggerAddAction(SpellEffectTrigger, function()
			if GetSpellAbilityId(GetSpellAbility()) ~= ABILITY then return end
			local caster      = GetTriggerUnit()
			local casterOwner = GetOwningPlayer(caster)
			
			local count       = 0
			for i = 0, bj_MAX_INVENTORY do
				local item = UnitItemInSlot(caster, i)
				if GetItemTypeId(item) == ITEM then
					count = count + 1
				end
			end
			if count == 0 then return end
			
			local damage  = GetHeroInt(caster, true) * count
			local x, y    = GetSpellTargetX(), GetSpellTargetY()
			
			local ability = BlzGetUnitAbility(caster, ABILITY)
			local range   = BlzGetAbilityRealLevelField(ability, ABILITY_RLF_AREA_OF_EFFECT, 0)
			
			AddSpecialEffect(MISSILE, x, y)
			TimerStart(CreateTimer(), EXPLOSIVE_DELAY, false, function()
				AddSpecialEffect(EXPLOSIVE, x, y)
				GroupEnumUnitsInRange(GROUP, x, y, range + 256)
				local mana = 0
				
				for index = 1, BlzGroupGetSize(GROUP) do
					local target = BlzGroupUnitAt(GROUP, index - 1)
					
					if UnitAlive(target)
							and IsUnitInRangeXY(target, x, y, range)
							and IsUnitEnemy(target, casterOwner)
							and not IsUnitType(target, UNIT_TYPE_FLYING)
							and not IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE)
					then
						DestroyEffect(AddSpecialEffectTarget(EFFECT_DAMAGE[1], target, EFFECT_DAMAGE[2]))
						local life = GetWidgetLife(target)
						UnitDamageTarget(caster, target, damage, false, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
						if not UnitAlive(target) then
							mana = mana + life
						end
					end
				end
				GroupClear(GROUP)
				
				if mana > 0 then
					DestroyEffect(AddSpecialEffectTarget(EFFECT_MANA[1], caster, EFFECT_MANA[2]))
					SetUnitState(caster, UNIT_STATE_MANA, GetUnitState(caster, UNIT_STATE_MANA) + mana)
				end
				
				return DestroyTimer(GetExpiredTimer())
			end)
		end)
	end
end
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
32
5 лет назад
Отредактирован Берги
0
Как бы изначальным концепт был через даммикаст при физической атаке, ну да ладно, так тоже норм, лучше, чем дефолт, посмотрел код, норм, но тогда надо описание поменять ибо из него можно подумать что только урон нежити растёт с количеством предметов, а не шанс и лечение
раскрыть
Молот Стражника Света:
При использовании любой способности с целью, есть шанс 10% исцелить союзную цель на 100 ед или нанести 50 ед урона враждебной нежити.
Каждый предмет в инвентаре увеличивает шанс, объём исцеления и урона
0
13
5 лет назад
0
Шикарно).
0
29
5 лет назад
Отредактирован nazarpunk
0
даммикаст при физической атаке
Нужно по возможности избегать даммикаста, да и событие при атаке довольно заезжено.
надо описание поменять
С описанием предметов/заклинаний и прочего я не особо дружу, поэтому просто буду копировать предложенное из комментариев))
Шикарно).
Как видите, код там простой и на lua намного проще делать заклинания, чем на GUI.
0
13
5 лет назад
Отредактирован BladeInDoom
0
NazarPunk:
BladeInDoom:
Шикарно).
Как видите, код там простой и на lua намного проще делать заклинания, чем на GUI.
Это да). Меня эти переменые мозок ломают.
2
29
5 лет назад
2
Меня эти переменые мозок ломают.
Что в переменных такого сложного, чтоб они мозг ломали?
0
13
5 лет назад
Отредактирован BladeInDoom
0
BladeInDoom:
NazarPunk:
Меня эти переменые мозок ломают.
Что в переменных такого сложного, чтоб они мозг ломали?
Они лишь меня так бесят.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.