1) - В джассе как я понял можно создавать локальные переменные, которые работают только в том триггере где они созданны. Как их создавать?
2) - Что если у меня есть локальные переменные, но я хочу что бы они работали ещё в пару триггерах, не только в том где они созданны. Но что бы в других триггерах они не работали. Например у меня есть триггер One, триггер Two и триггер Three. В триггере One у меня назначается переменная, например точка. Я хочу что бы эта переменная работала в триггере Two, но не работала в триггере Three. Как это сделать?
3) - Допустим у меня есть 2 совешенно разных триггерных скилла. В одном из них есть переменная Х, значение которой в триггере даётся X = Casting Unit. Во втором триггере, никак не связанным с первым, есть переменная Y. Y = Casting Unit. Проблема в том, что почему то когда эти спеллы используются в одно и то же время, то X и Y путаются значениями. X получает значение Casting Unit, но их другого триггера, другой триггерной абилки. И поэтому если в первом триггере есть функция Order X to Stop, то юнит из второго триггера останавливается. Именно поэтому меня интересуют пункты 1 и 2. У меня довольно часто получается что переменные пересекаются когда используются 2 триггерных скилла. Как этого избежать?
FatalBlade, лол я нуб...На джассе не пишу,но ответ на первое очевиден...local integer blabla.2)Сори за нуб ответ,но я думаю,что можно значение из трига 1 переносить на глобал переменную,а с нее в триг 2...
Nyan Я в Знай наших Уже на форум не захожу, варкрафт перестал интересовать (
Сообщение отредактировал Novice998 - Пятница, 24 Июня 2011, 01:51:10
На джассе не пишу,но ответ на первое очевиден...local integer blabla.
Синтакс то может быть совсем другой. А может даже локальные переменные вообще не так создаются как глобальные.
Quote (Novice998)
из трига 1 переносить на глобал переменную,а с нее в триг 2...
Само собой так можно, но например в языках програмирования как С++ или С#, при вызове функции/процедуры (в данном случае триггера), можно указать какие переменные эта функция получает. Любая переменная созданная внутри функции является локальной, а переменные полученные "снаружи", глобальные.
Например если у меня есть глобальная переменая Х=0, и я не указываю эту переменную при вызове функции, то если внутри функции я например напишу Х=1, то глобальная переменная Х останется без изменений. Однако внутри функции создастся локальная переменная Х, которая будет работать только в пределах функции. Прикол в том, что глобальная переменная Х, и локальная переменная Х, - это две разные переменные, не имеющие друг к другу никакого отношения.
Я знаю 2 способа перенести локальную, самой надежный это хэш ну и 2 это глобалка(не для всех вариантов подходит). По 1 читай статью, а 2: если к примеру 1 триг запишет юнита в глобалку то во 2 создается локалка и сразу присваиваеш значение, вот пример: глобальная точки називается х, local location l=udg_x, но локалки нужно обнулять, в конце трига пишешь set l=null
Я знаю 2 способа перенести локальную, самой надежный это хэш ну и 2 это глобалка(не для всех вариантов подходит). По 1 читай статью, а 2: если к примеру 1 триг запишет юнита в глобалку то во 2 создается локалка и сразу присваиваеш значение, вот пример: глобальная точки називается х, local location l=udg_x, но локалки нужно обнулять, в конце трига пишешь set l=null
ССылку плз на статью если есть. И ещё вопрос: Casting Unit/Entering Unit/Attacking Unit/итд... разве не должно быть само по себе локальным назначением? Если например используются 2 триггерных спелла, и пусть даже я не буду заносить Casting Unit в переменные, а использовать именно это значение, ведь Casting Unit первого триггера не должен никак пересекаться с Casting Unit второго триггера. Не так?
Вот и я о том... Так почему же они пересекаются? У меня есть 2 триггера которые конфликтуют друг с другом.
Crippling Wave Events Unit - A unit Begins channeling an ability Conditions And - All (Conditions) are true Conditions (Ability being cast) Equal to Crippling Wave Monk (Unit-type of (Casting unit)) Equal to Monk Actions Set CWUnit = (Casting unit) Selection - Clear selection for (Owner of CWUnit) Unit - Make CWUnit Invulnerable Cinematic - Disable user control for (Player group((Owner of CWUnit))) Special Effect - Create a special effect attached to the weapon of CWUnit using Abilities\Weapons\PhoenixMissile\Phoenix_Missile_mini.mdl Set Crip_Effect = (Last created special effect) Unit Group - Remove all units from CripGroup Set CripPoint = (Target point of ability being cast) Unit - Make CWUnit face CripPoint over 0.00 seconds Set Crip_Angle = (Angle from (Position of CWUnit) to CripPoint) Set Crip_Index = 15.00 Wait 0.80 seconds If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (CWUnit is alive) Equal to True Then - Actions For each (Integer A) from 1 to 5, do (Actions) Loop - Actions Special Effect - Create a special effect at ((Position of CWUnit) offset by 125.00 towards (Crip_Angle + Crip_Index) degrees) using Abilities\Spells\Other\Volcano\VolcanoDeath.mdl Special Effect - Destroy (Last created special effect) Special Effect - Create a special effect at ((Position of CWUnit) offset by 125.00 towards (Crip_Angle - Crip_Index) degrees) using Abilities\Spells\Other\Volcano\VolcanoDeath.mdl Special Effect - Destroy (Last created special effect) Set Crip_Index = (Crip_Index + 15.00) Sound - Play MirrorImage <gen> at 100.00% volume, attached to CWUnit Sound - Stop MirrorImage <gen> After fading Wait 0.20 seconds Sound - Play MirrorImage <gen> at 100.00% volume, attached to CWUnit Else - Actions Do nothing Wait 0.50 seconds If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions ((Casting unit) is alive) Equal to True Then - Actions Unit - Make CWUnit face (Crip_Angle + 180.00) over 0.00 seconds Set Crip_Angle = (Angle from CripPoint to (Position of CWUnit)) Set Crip_Index = 15.00 Animation - Play CWUnit's ATTACK - 2 animation Wait 0.80 seconds For each (Integer A) from 1 to 5, do (Actions) Loop - Actions Special Effect - Create a special effect at ((Position of CWUnit) offset by 125.00 towards (Crip_Angle + Crip_Index) degrees) using Abilities\Spells\Other\Volcano\VolcanoDeath.mdl Special Effect - Destroy (Last created special effect) Special Effect - Create a special effect at ((Position of CWUnit) offset by 125.00 towards (Crip_Angle - Crip_Index) degrees) using Abilities\Spells\Other\Volcano\VolcanoDeath.mdl Special Effect - Destroy (Last created special effect) Set Crip_Index = (Crip_Index + 15.00) Unit Group - Pick every unit in (Units within 240.00 of (Position of CWUnit)) and do (Actions) Loop - Actions If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (Owner of (Picked unit)) Not equal to (Owner of CWUnit) (Angle from (Position of CWUnit) to (Position of (Picked unit))) Greater than (Crip_Angle - 89.00) (Angle from (Position of CWUnit) to (Position of (Picked unit))) Less than (Crip_Angle + 89.00) Then - Actions Unit Group - Add (Picked unit) to CripGroup Else - Actions Do nothing Custom script: call DestroyGroup(GetLastCreatedGroup()) Unit Group - Pick every unit in CripGroup and do (Actions) Loop - Actions If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (Level of Crippling Wave Monk for CWUnit) Equal to 1 Then - Actions Unit - Cause CWUnit to damage (Picked unit), dealing 40.00 damage of attack type Spells and damage type Force Else - Actions Do nothing If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (Level of Crippling Wave Monk for CWUnit) Equal to 2 Then - Actions Unit - Cause CWUnit to damage (Picked unit), dealing 55.00 damage of attack type Spells and damage type Force Else - Actions Do nothing If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (Level of Crippling Wave Monk for CWUnit) Equal to 3 Then - Actions Unit - Cause CWUnit to damage (Picked unit), dealing 75.00 damage of attack type Spells and damage type Force Else - Actions Do nothing If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (Level of Crippling Wave Monk for CWUnit) Equal to 4 Then - Actions Unit - Cause CWUnit to damage (Picked unit), dealing 100.00 damage of attack type Spells and damage type Force Else - Actions Do nothing If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (Level of Crippling Wave Monk for CWUnit) Equal to 5 Then - Actions Unit - Cause CWUnit to damage (Picked unit), dealing 130.00 damage of attack type Spells and damage type Force Else - Actions Do nothing If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (Level of Crippling Wave Monk for CWUnit) Equal to 6 Then - Actions Unit - Cause CWUnit to damage (Picked unit), dealing 165.00 damage of attack type Spells and damage type Force Else - Actions Do nothing If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (Level of Crippling Wave Monk for CWUnit) Equal to 7 Then - Actions Unit - Cause CWUnit to damage (Picked unit), dealing 205.00 damage of attack type Spells and damage type Force Else - Actions Do nothing If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (Level of Crippling Wave Monk for CWUnit) Equal to 8 Then - Actions Unit - Cause CWUnit to damage (Picked unit), dealing 250.00 damage of attack type Spells and damage type Force Else - Actions Do nothing If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (Level of Crippling Wave Monk for CWUnit) Equal to 9 Then - Actions Unit - Cause CWUnit to damage (Picked unit), dealing 300.00 damage of attack type Spells and damage type Force Else - Actions Do nothing If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions (Level of Crippling Wave Monk for CWUnit) Equal to 10 Then - Actions Unit - Cause CWUnit to damage (Picked unit), dealing 355.00 damage of attack type Spells and damage type Force Else - Actions Do nothing Sound - Play MirrorImage <gen> at 100.00% volume, attached to CWUnit Sound - Stop MirrorImage <gen> After fading Wait 0.20 seconds Sound - Play MirrorImage <gen> at 100.00% volume, attached to CWUnit Wait 0.50 seconds Else - Actions Do nothing Unit Group - Remove all units from CripGroup Special Effect - Destroy Crip_Effect Custom script: call DestroyGroup(udg_CripGroup) Custom script: call RemoveLocation(udg_CripPoint) Cinematic - Enable user control for (Player group((Owner of CWUnit))) Unit - Make CWUnit Vulnerable Selection - Select CWUnit for (Owner of CWUnit) Set CWUnit = No unit Custom script: call RemoveUnit(udg_CWUnit)
Bash Events Unit - A unit Begins casting an ability Conditions And - All (Conditions) are true Conditions (Ability being cast) Equal to Bash Barbarian (Unit-type of (Casting unit)) Equal to Barbarian Actions Set Target[29] = (Target unit of ability being cast) If (All Conditions are True) then do (Then Actions) else do (Else Actions) If - Conditions And - All (Conditions) are true Conditions Target[29] Not equal to BPUnit Target[29] Not equal to BSUnit Target[29] Not equal to ChargeTaker Target[29] Not equal to FSUnit Target[29] Not equal to FatalUnit Target[29] Not equal to FATaker Target[29] Not equal to IceBoltTaker Target[29] Not equal to KnockUnit Target[29] Not equal to LATaker Target[29] Not equal to MAUnit Target[29] Not equal to MMUnit Target[29] Not equal to PWUnit Target[29] Not equal to PickedHero Target[29] Not equal to PlagueTaker Target[29] Not equal to ShackleTaker Target[29] Not equal to ShadowStrikeUnit Target[29] Not equal to StrikeUnit Target[29] Not equal to TKTaker Target[29] Not equal to TigerStrikeUnit Target[29] Not equal to UnleashUnit Target[29] Not equal to WOTMUnit Target[29] Not equal to WOTHFTaker (Target[29] has buff Frozen Ice Blast) Equal to False (Target[29] has buff Burn ) Equal to False Then - Actions Set BashCastUnit = (Casting unit) Unit - Make BashCastUnit Invulnerable Wait 0.35 seconds Set BashUnit = (Target unit of ability being cast) Set BashCaster = (Position of BashCastUnit) Set BashTaker = (Position of BashUnit) Set BashAngle = (Angle from BashCaster to BashTaker) Trigger - Turn on Bash Knock Fast <gen> Wait 0.20 seconds Trigger - Turn off Bash Knock Fast <gen> Unit - Make BashCastUnit Vulnerable Trigger - Turn on Bash Knock Norm <gen> Wait 0.20 seconds Trigger - Turn off Bash Knock Norm <gen> Trigger - Turn on Bash Knock Slow <gen> Wait 0.30 seconds Trigger - Turn off Bash Knock Slow <gen> Special Effect - Create a special effect attached to the origin of BashUnit using Objects\Spawnmodels\Undead\ImpaleTargetDust\ImpaleTargetDust.mdl Special Effect - Destroy (Last created special effect) Set BashUnit = No unit Set BashCastUnit = No unit Custom script: call RemoveUnit(udg_BashUnit) Custom script: call RemoveUnit(udg_BashCastUnit) Custom script: call RemoveLocation(udg_BashCaster) Custom script: call RemoveLocation(udg_BashTaker) Set Target[29] = No unit Custom script: call RemoveUnit(udg_Target[29]) Else - Actions Unit - Order (Casting unit) to Stop Wait 0.10 seconds Unit - Order (Casting unit) to Stop Set Target[29] = No unit Custom script: call RemoveUnit(udg_Target[29])
Когда оба триггера используются одновременно, только первая часть первого триггера срабатывает. Второй триггер по разному. Бывает норм срабатывает, а бывает не срабатывает вообще.
FatalBlade, я с телефона сижу,спойлер не откривается,буду дома подскажу(если другой никто не поможет). Adiga, если это локалка то она все равно не передастся по новой.
FatalBlade, может быть тебе в одном из триггеров в самом начале поставить действие Wait 0.01 seconds? Тем самым у тебя они не перепутаются.
Quote (FatalBlade)
Когда оба триггера используются одновременно, только первая часть первого триггера срабатывает. Второй триггер по разному. Бывает норм срабатывает, а бывает не срабатывает вообще.
Половина триггера срабатывает скорее всего из-за действия Wait 0.35 seconds в середине триггера, может как раз таки из-за твоих переменных.
Минимальный Wait это 0.1 секунд. Всё что меньше будет округлено до 0.1. То есть 0.01 ==>> 0.1
Да и вообще я пробовал этот вариант. Интервалы не приостанавливают триггер, а просто дают задержку перед следующим действием. Так что это ничего не меняет. Да и кроме того Wait вообще сама по себе проблематичная функция.
Quote (BUUNI)
Половина триггера срабатывает скорее всего из-за действия Wait 0.35 seconds в середине триггера, может как раз таки из-за твоих переменных.
Во время этого Wait'a проигрывается анимация. Я не могу его убрать. А то получится сначала эффект а потом анимация юнита.
Или ты имеешь ввиду поменять Wait и назначение переменных местами?
Стоит casting unit, а не переменная. Скинь карту пример с описанием что должно получится
Это совсем другое. Else Unit - Order (Casting unit) to Stop Wait 0.10 seconds Unit - Order (Casting unit) to Stop
Для начала у меня в каждом триггерном спелле, в каждом триггере с событием каста данного скилла, если скилл требует конкретную цель; проверяется отсутствие пересекаемости Target[29], переменная которой даётся значение Target unit of abolity being cast, с другими переменными. Если присутствует пересекаемость, то срабатывает Else.
Почему Casting Unit а не переменная? Потому что у меня проверка пересекаемости происходит до назначения остальных переменных связанных с данным скиллом(триггером). Вернее если проверка пошла, только тогда назначаются переменные, и триггер приходит в действие, а юнит кастует скилл. В противном случае ==>> Unit - Order (Casting unit) to Stop
Сообщение отредактировал FatalBlade - Суббота, 25 Июня 2011, 15:22:21