Пытаюсь сделать заклинание. Суть в том, чтобы на группу противников накладывалось заклинание, в результате которого у них случалось "смятение" и они начинали атаковать друг друга в области применения.
Суть. Кидаю заклинание пустышку на область. Выделяю каждого юнита в области, добавляю в группу. А дальше, как правильно сделать?
Выделить каждого из группы и заставить атаковать кого? Выделенного из группы? Так это не работает

В общем, пока работает на половину. Боевые единицы начинают рандомно атаковать одного юнита, но не дерутся каждый между собой
`
ОЖИДАНИЕ РЕКЛАМЫ...
22
Почему не работает? Удали просто из группы уже выбранного юнита, а дальше заставь атаковать FirstOfGroup. Только будет прикол в том, что человек которому принадлежат юниты, легко сможет парировать твою способность
Ответы (1)
21
Таренас, Способность будет действовать против толпы крипов. Я хотел, чтобы они начали рандомно драться между собой
21
В общем, пока работает на половину. Боевые единицы начинают рандомно атаковать одного юнита, но не дерутся каждый между собой
Принятый ответ
Ответы (6)
30
SсRealm, выдели под эту способность отдельного игрока и сделай его врагом самому себе. При касте спела просто передавай юнитов этому игроку.
28
nazarpunk, можно игрока сделать враждебным самому себе? ппес приколы, мне даже в голову никогда не приходило затестировать подобное
30
rsfghd, а почему нельзя? При выборе целей движок будет сверяться со списком враждебных игорьков. А раз там сам игрок, значит его юниты враждебны его же юнитам.
28
nazarpunk, а ты уже пробовал? потому что я затестил и ничего не работает
22
nazarpunk, а ты уже пробовал? потому что я затестил и ничего не работает
я пробовал вот так у меня работает, через гуи не работает
call SetPlayerAlliance(sourcePlayer, sourcePlayer, ALLIANCE_PASSIVE,       false)
Ответы (1)
16
function GroupPickRandomUnit takes group whichGroup returns unit
Так это тоже никаких гарантий не дает, что это будет не один и тот же юнит. И это разве нативка?
Еще нужно учитывать, что в карте может быть отключена атака по своим. Ну и приказ на атаку легко отменить, поэтому нужен таймер периодический с приказом.
7
Базовый функционал абилки: крипы разбиваются на пары и дубасят друг друга некоторое время, потом останавливаются. Все очень примитивно. Остальной обвес добавляй сам. ("vjass", patch 2.0)
Открыть
globals 

real Madness_AoE = 500.
real Madness_Duration = 5.
integer Madness_AbilityCode = 'A000'

hashtable hash   // нам нужен хеш 
endglobals

function Trig_Madness_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == Madness_AbilityCode
endfunction
function MadnessFilter takes nothing returns boolean
    return ( GetOwningPlayer(GetFilterUnit()) == Player(PLAYER_NEUTRAL_AGGRESSIVE) )
endfunction
function MadnessStop takes nothing returns nothing
	call IssueImmediateOrder(GetEnumUnit(),"stop")
endfunction
function MadnessTimer takes nothing returns nothing
	local timer tt=GetExpiredTimer()
	local group gr=LoadGroupHandle(hash,GetHandleId(tt),1)
	call ForGroup(gr, function MadnessStop)
	call DestroyGroup(gr)
	call FlushChildHashtable(hash,GetHandleId(tt))
	call DestroyTimer(tt)
endfunction
function Trig_Madness_Actions takes nothing returns nothing
	local real x=GetSpellTargetX()
	local real y=GetSpellTargetY()
	local group gr=CreateGroup()
	local group gr2 = CreateGroup()
	local unit t
	local unit t2
	local unit last=null
	local timer tt
	call GroupEnumUnitsInRange(gr,x,y, Madness_AoE, Filter(function MadnessFilter))
	loop
		set t=FirstOfGroup(gr)
		exitwhen t==null
		call GroupRemoveUnit(gr,t)
		set t2=FirstOfGroup(gr)
		if t2!=null then
			call IssueTargetOrder(t,"attack",t2)
			call IssueTargetOrder(t2,"attack",t)
			call GroupRemoveUnit(gr,t2)
			call GroupAddUnit(gr2,t)
			call GroupAddUnit(gr2,t2)
		elseif last!=null then
			call IssueTargetOrder(t,"attack",last)
			call GroupAddUnit(gr2,t)
		endif
		set last=t
		
	endloop
	call DestroyGroup(gr)
	if BlzGroupGetSize(gr2) >0 then
		set tt=CreateTimer()
		call SaveGroupHandle(hash,GetHandleId(tt),1,gr2)
		call TimerStart(tt,Madness_Duration,false,function MadnessTimer)
		return
	endif
	call DestroyGroup(gr2)
	
endfunction

//===========================================================================
function InitTrig_Madness takes nothing returns nothing
	set hash=InitHashtable()  // инициализация хеша
    set gg_trg_Madness = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Madness, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Madness, Condition( function Trig_Madness_Conditions ) )
    call TriggerAddAction( gg_trg_Madness, function Trig_Madness_Actions )
endfunction

Загруженные файлы
21
Zeix: не открывается. Сведения о карте отсутствуют или неверны. Это точно 1.26?
Ответы (3)
28
SсRealm, он тебе код приложил, пчел.. приставки Blz у функций не смущают?
21
SсRealm, он тебе код приложил, пчел.. приставки Blz у функций не смущают?
Как то сразу не заметил
7
SсRealm, я подписал , что это для актуального патча 2.0. Замени BlzGroupGetSize на старую функцию CountUnitsInGroup и по идее код будет работать на 1.26.
26
Я как-то давно делал абилку, на подобии "смятения", только более пассивную - она временно меняла контроллера для всех вражеских юнитов в указанной области на нейтрально-враждебного (так же им добавлялся "бродячий", "дизарм", и замедление движения. В итоге толпа юнитов теряла контроль и беспорядочно бродила в течении 5-6 секунд, при этом их владельцу не получалось подлечить, бафнуть или как-либо засейвить своих юнитов под этим эффектом. А любой урон который мог влетать по зоне поражения - получали и жертвы заклинания (т.е. опасно было применять массовые заклинания, т.к. они наносили бы урон и твоим собственным юнитам).
Реализация максимально простая была.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.