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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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, ну а ты проверь рабочий он или нет
Принятый ответ
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, ну а что ты хочешь от кода написанного прямо тут в комментах
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.