Способность:
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, ну а ты проверь рабочий он или нет
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
23
Похожие вопросы:

ответ
Хозяин Миров:
Вот. Только совмещение нерабочее получилось, но оставил пока что.
ответ
Когда юнит проучивает пассивку, добавляй в группу юнита, который выучил пассивку. Дальше все просто -
Юнит умирает
Киллинг юнит в нашей группе - да
Дайинг юнит не в команде владельца киллинг юнит.
Игрок - адд проперти - 500 золото (овнер оф киллинг юнит)
ответ
На основе полностью триггерного снаряда, сделанного из работника (если вам так интересно).
Если сало выучит глейвы, то будет получать бонусы интелекта (если мне не изменяет память), сам снаряд тупо юнит которого двигают с сайленсером и проверяют жив ли он.
Могу выложить код сайленсера.
ответ
возможные способности, господи, строчка выше, вы хотяб проверяли все сами а не ждали иисуса с небес
там даже подпись категории - способности
ответ
триггерно пассивки делай
иначе никак

26
В JASS профан, но так часто слышу от его пользователей, что не надо использьвать Wait'ы, что сразу в глаза это бросилось.
3
Когда ты добавляешь эффект, то делаешь слишком много присваиваний, причём сохраняешь эффект и в локальной переменной, и в глобальной:
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 )
Все эти присваивания являются излишними, поэтому твой код можно сократить до такого (также не забывай обнулять локальные переменные):
set SelectEffect = AddSpecialEffectTargetUnitBJ( "overhead", PickUnit , "Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl" )
call PolledWait( 3.00 )
call DestroyEffectBJ( SelectEffect )
set SelectEffect = null
10
Кстати, реализация доп. дамага через событие "Атакован" позволяет игроку спамить приказами "Отставить", после чего герой будет вновь пытаться атаковать. Это приведет к почти безинтервальному вызову триггера, и, соответственно, имбалансному урону. Но это не единственная проблема в контексте задуманного. Крч, тебе нужно отлавливать получение урона.
6
LordDracula:
Кстати, реализация доп. дамага через событие "Атакован" позволяет игроку спамить приказами "Отставить", после чего герой будет вновь пытаться атаковать. Это приведет к почти безинтервальному вызову триггера, и, соответственно, имбалансному урону. Но это не единственная проблема в контексте задуманного. Крч, тебе нужно отлавливать получение урона.
Можно ссылку на наработку нормального отлова урона? Погуглив нашёл очень много наработок, но не знаю какая из них самая оптимизированная. Если не сложно..
8gabriel8:
В JASS профан, но так часто слышу от его пользователей, что не надо использьвать Wait'ы, что сразу в глаза это бросилось.
Мне нужно чтобы эффект бросился на время. p.s. Я только перехожу на Jass.
Sheridan_75:
Когда ты добавляешь эффект, то делаешь слишком много присваиваний, причём сохраняешь эффект и в локальной переменной, и в глобальной:
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 )
Все эти присваивания являются излишними, поэтому твой код можно сократить до такого (также не забывай обнулять локальные переменные):
set SelectEffect = AddSpecialEffectTargetUnitBJ( "overhead", PickUnit , "Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl" )
call PolledWait( 3.00 )
call DestroyEffectBJ( SelectEffect )
set SelectEffect = null
Скоро опробую, спасибо за подсказку, а про обнуление вообще забыл)
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, ну а ты проверь рабочий он или нет
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.