Способность:
function Trig_HeroTakeDamage_IfUnitTeam takes nothing returns boolean
    return ( GetOwningPlayer(GetAttacker()) == Player(11) )
endfunction

function Trig_HeroTakeDamage_SetUnitFunction takes nothing returns nothing
    call DisplayTextToForce( GetPlayersAll(), "debug damage" )
    
    local unit PickUnit
    local effect SelectEffect
    
    set PickUnit = GetEnumUnit()
    
    call SetUnitLifeBJ( PickUnit , ( GetUnitStateSwap(UNIT_STATE_LIFE, PickUnit ) - ( I2R(GetUnitAbilityLevelSwapped('A00G', GetAttackedUnitBJ())) * ( I2R(GetHeroStatBJ(bj_HEROSTAT_STR, GetAttackedUnitBJ(), true)) * 0.50 ) ) ) )
    
    call AddSpecialEffectTargetUnitBJ( "overhead", PickUnit , "Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl" )
    set udg_SetEffect = GetLastCreatedEffectBJ()
    set SelectEffect = udg_SetEffect
    call PolledWait( 3.00 )
    set udg_SetEffect = SelectEffect
    call DestroyEffectBJ( udg_SetEffect )
endfunction

function Trig_HeroTakeDamage_RealyInRandom takes nothing returns boolean
    if ( not ( udg_random_num <= 5 ) ) then
        return false
    endif
    return true
endfunction

function Trig_HeroTakeDamage_RealyInSpell takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A00G', GetAttackedUnitBJ()) > 0 ) ) then
        return false
    endif
    return true
endfunction

function Trig_HeroTakeDamage_Actions takes nothing returns nothing
    if ( Trig_HeroTakeDamage_RealyInSpell() ) then
        set udg_random_num = GetRandomInt(1, 10)
        if ( Trig_HeroTakeDamage_RealyInRandom() ) then
            call DisplayTextToForce( GetPlayersAll(), "debug random" )
            call ForGroupBJ( GetUnitsInRangeOfLocMatching(500.00, GetUnitLoc(GetAttackedUnitBJ()), Condition(function Trig_HeroTakeDamage_IfUnitTeam)), function Trig_HeroTakeDamage_SetUnitFunction )
        else
        endif
    else
    endif
endfunction

//===========================================================================
function InitTrig_HeroTakeDamage takes nothing returns nothing
    set gg_trg_HeroTakeDamage = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_HeroTakeDamage, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddAction( gg_trg_HeroTakeDamage, function Trig_HeroTakeDamage_Actions )
endfunction
Но спецэффект не пропадает, как его правильно убирать если эта способность активировалась много раз и у разных игроков. Не не нужно меня отправлять учить статьи и тд, я просто не пойму как тут массив распределить.

самым оптимальным вариантом будут параллельные массивы+перебор таймером
вот тебе готовая система на v/cjass:
library auto_deleted_effect initializer init{

		private effect myEffects[];
		private int times[];
		private int count=0;
		
		int createAutoDeletedEffect(effect newEffect, int time){
			int index=count;
			count++;
			myEffects[index]=newEffect;
			times[index]=time;
			return index;
		}
		
		bool removeAutoDeletedEffect(int index){
			DestroyEffect(myEffects[index]);
			count--;
			if(index<count){
				myEffects[index]=myEffects[count];
				times[index]=times[count];
				return false;
			}
			return true;
		}
		
		private void update(){
			int index=0;
			loop{
			exitwhen index==count;
				times[index]--;
				if(times[index]<=0){
					if(removeAutoDeletedEffect(index)){
						index++;
					}
				}
			}
		}
	
	private void init(){
		timer t=CreateTimer();
		TimerStart(t, 1, true, function update);
	} 

}
вставь её в шапку карты
вызывать вот так:
createAutoDeletedEffect(AddSpecialEffectTargetUnitBJ( "overhead", PickUnit , "Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl" ), 3) // создаёт эффект который будет удалён через 3 секунды
требует подключения cj_types.j без вайлов
qzGoon, ну а ты проверь рабочий он или нет
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
28
qzGoon, в статьях в которые ты просил тебя не посылать написано что вейты не работают в функциях вызываемых из ForGroup
т.е. весь код который идёт после вейта не будет выполнятся
а если ещё прочесть статьи про джасс то можно узнать что они нигде не работают кроме действий триггеров и потоков дочерних от них
самый лучший способ - переделать на таймеры
самый быстрый способ - порождать дочерний поток через экзекут
6
nvc123:
qzGoon, в статьях в которые ты просил тебя не посылать написано что вейты не работают в функциях вызываемых из ForGroup
т.е. весь код который идёт после вейта не будет выполнятся
а если ещё прочесть статьи про джасс то можно узнать что они нигде не работают кроме действий триггеров и потоков дочерних от них
самый лучший способ - переделать на таймеры
самый быстрый способ - порождать дочерний поток через экзекут
Тоесть код написанный выше твоего комментария не рабочий?
28
самым оптимальным вариантом будут параллельные массивы+перебор таймером
вот тебе готовая система на v/cjass:
library auto_deleted_effect initializer init{

		private effect myEffects[];
		private int times[];
		private int count=0;
		
		int createAutoDeletedEffect(effect newEffect, int time){
			int index=count;
			count++;
			myEffects[index]=newEffect;
			times[index]=time;
			return index;
		}
		
		bool removeAutoDeletedEffect(int index){
			DestroyEffect(myEffects[index]);
			count--;
			if(index<count){
				myEffects[index]=myEffects[count];
				times[index]=times[count];
				return false;
			}
			return true;
		}
		
		private void update(){
			int index=0;
			loop{
			exitwhen index==count;
				times[index]--;
				if(times[index]<=0){
					if(removeAutoDeletedEffect(index)){
						index++;
					}
				}
			}
		}
	
	private void init(){
		timer t=CreateTimer();
		TimerStart(t, 1, true, function update);
	} 

}
вставь её в шапку карты
вызывать вот так:
createAutoDeletedEffect(AddSpecialEffectTargetUnitBJ( "overhead", PickUnit , "Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl" ), 3) // создаёт эффект который будет удалён через 3 секунды
требует подключения cj_types.j без вайлов
qzGoon, ну а ты проверь рабочий он или нет
Принятый ответ
3
nvc123, по поводу твоего решения у меня возник вопрос на счёт этого участка кода:
private void update(){
			int index=0;
			loop{
			exitwhen index==count;
				times[index]--;
				if(times[index]<=0){
					if(removeAutoDeletedEffect(index)){
						index++;
					}
				}
				index++;
			}
		}
Здесь дважды в цикле написано index{{++;}}, но мне кажется, что последний index{{++;}} не нужен, т.к. если функция removeAutoDeletedEffect вернёт false, то не нужно увеличивать текущий индекс. И ещё у тебя после функции update есть одна лишняя фигурная скобка, если я правильно их проверил.
28
Sheridan_75, угу, исправил
Clamp, ну а что ты хочешь от кода написанного прямо тут в комментах
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.