Laikon
Жаркие времена..
offline
Опыт:
16,643Активность: |
Обьясните дураку
В общем я совсем нуб в джассе и вот решил сделать способность. Используются только локалки, простой скилл типа Исцеляющий Газ после поздния снарядов происходит 3 взрыва (модельки самодельные) и наносится урон врагам. На гуи все нормально, но когда я переношу на джасс и делаю локальные переменные вообще нечего не работает, в чем проблема не могу понять. Код креплю снизу так как с телефона пишу и подругому не получается. |
29.03.2012, 03:24 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,203Активность: |
Постараюсь помоч
» вот твой код:
((код jass
function Trig_PoisonBomb_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A016' ) ) then return false endif return true endfunction function Trig_PoisonBomb_Func010Func001C takes nothing returns boolean
if ( not ( GetOwningPlayer(GetEnumUnit()) == Player(PLAYER_NEUTRAL_AGGRESSIVE) ) ) then return false endif return true endfunction function Trig_PoisonBomb_Func010A takes unit H returns nothing
if ( Trig_PoisonBomb_Func010Func001C() ) then call UnitDamageTargetBJ( H, GetEnumUnit(), ( 99.00 + 1.00 ), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL ) else endif endfunction function Trig_PoisonBomb_Actions takes nothing returns nothing
local unit H = GetSpellAbilityUnit() local location T = GetSpellTargetLoc() call TriggerSleepAction( ( DistanceBetweenPoints(GetUnitLoc(H), T) / 700.00 ) ) call AddSpecialEffectLocBJ( GetRandomLocInRect(RectFromCenterSizeBJ(T, 100.00, 100.00)), "PoisonBomb Effect.mdx" ) call DestroyEffectBJ( GetLastCreatedEffectBJ() ) call AddSpecialEffectLocBJ( GetRandomLocInRect(RectFromCenterSizeBJ(T, 100.00, 100.00)), "PoisonBomb Effect.mdx" ) call DestroyEffectBJ( GetLastCreatedEffectBJ() ) call AddSpecialEffectLocBJ( GetRandomLocInRect(RectFromCenterSizeBJ(T, 100.00, 100.00)), "PoisonBomb Effect.mdx" ) call DestroyEffectBJ( GetLastCreatedEffectBJ() ) call AddSpecialEffectTargetUnitBJ( "overhead", H, "Abilities\\Spells\\Undead\\VampiricAura\\VampiricAuraTarget.mdl" ) call DestroyEffectBJ( GetLastCreatedEffectBJ() ) call ForGroupBJ( GetUnitsInRangeOfLocAll(150.00, T), function Trig_PoisonBomb_Func010A ) set H = null set T = null endfunction ===========================================================================
function InitTrig_PoisonBomb takes nothing returns nothing set gg_trg_PoisonBomb = CreateTrigger( ) call DisableTrigger( gg_trg_PoisonBomb ) call TriggerRegisterAnyUnitEventBJ( gg_trg_PoisonBomb, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddCondition( gg_trg_PoisonBomb, Condition( function Trig_PoisonBomb_Conditions ) ) call TriggerAddAction( gg_trg_PoisonBomb, function Trig_PoisonBomb_Actions ) endfunction )) вот это:
((код jass
function Trig_PoisonBomb_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A016' ) ) then return false endif return true endfunction )) лучше заменить на это: ((код jass
function Trig_PoisonBomb_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A016' endfunction )) И лутьше всегда переписывай условия после конверта в гуи, так хоть читаемость повышается ну и чуть чуть быстродействие... Далее:
((код Jass
function Trig_PoisonBomb_Func010Func001C takes nothing returns boolean
if ( not ( GetOwningPlayer(GetEnumUnit()) == Player(PLAYER_NEUTRAL_AGGRESSIVE) ) ) then return false endif return true endfunction )) Эта функция нам нафиг не нужна, поэтому делаем так:
((код Jass
function Trig_PoisonBomb_Func010A takes nothing returns nothing
if ( GetOwningPlayer(GetEnumUnit()) == Player(PLAYER_NEUTRAL_AGGRESSIVE ) then call UnitDamageTargetBJ( bj_groupRandomCurrentPick, GetEnumUnit(), 100.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL ) endif endfunction )) И как ты можеш давать аргумент функции которая вызывается функцией ForGroupBJ? Все функции которые вызываются функциями в которых есть аргумент Code(***) не могут не брать не возвращать аргументы, те они процедуры, просто что то делают... Далее: ((код Jass
function Trig_PoisonBomb_Actions takes nothing returns nothing
local unit uTemp = GetSpellAbilityUnit() local location TempLoc = GetSpellTargetLoc() call TriggerSleepAction( ( DistanceBetweenPoints(GetUnitLoc(uTemp), TempLoc) / 700.00 ) ) call DestroyEffect(AddSpecialEffectLocBJ( GetRandomLocInRect(RectFromCenterSizeBJ(TempLoc, 100.00, 100.00)), "PoisonBomb Effect.mdx" )) call DestroyEffect(AddSpecialEffectLocBJ( GetRandomLocInRect(RectFromCenterSizeBJ(TempLoc, 100.00, 100.00)), "PoisonBomb Effect.mdx" )) call DestroyEffect(AddSpecialEffectLocBJ( GetRandomLocInRect(RectFromCenterSizeBJ(TempLoc, 100.00, 100.00)), "PoisonBomb Effect.mdx" )) call DestroyEffect(AddSpecialEffectTarget( "Abilities\\Spells\\Undead\\VampiricAura\\VampiricAuraTarget.mdl", uTemp, "overhead" )) set bj_wantDestroyGroup = true чтобы небыло утечки группы... set bj_groupRandomCurrentPick = uTemp call ForGroupBJ( GetUnitsInRangeOfLocAll(150.00, TempLoc), function Trig_PoisonBomb_Func010A ) call RemoveLocation(TempLoc) set uTemp = null set TempLoc = null endfunction )) вроде бы всё,
Все location (точка) нужно удалять функцией RemoveLocation(ссылка на точку) Но увы эту функцию нельзя вызвать в гуи, ну если только через CustomScript... Тоже самое с триггерами группами и аналогичными хендлами, их нужно удалять после использования... Если интересно как сделать не по корявому то учи jass) есть вопросы по коду задавай, что тебе не понятно? Отредактировано quq_CCCP, 29.03.2012 в 06:43. |
29.03.2012, 04:32 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Rampage
Бицепс
offline
Опыт:
9,722Активность: |
|
29.03.2012, 06:18 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,203Активность: |
Rampage, я нестал делать идеально оптимальный код лишь затем чтобы человек разобрался, он только гуи юзает... Щяс напиши ему всё как надо, он будет смотреть на это как коза в афишу) |
29.03.2012, 06:29 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Laikon
Жаркие времена..
offline
Опыт:
16,643Активность: |
Я все исправил вроде бы, но нечего опять таки не работает. Вообще никак не реагирует, будто и нет никакого триггера. Смена скилла тоже не помогает. И если можете скиньте код с исправлениями так же текстом, а то мне с телефона только часть кода видно. |
29.03.2012, 15:47 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
это называется callback или handler, если что |
29.03.2012, 15:51 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Laikon
Жаркие времена..
offline
Опыт:
16,643Активность: |
Я дико извиняюсь, но мне кто нибудь может помочь с проблемой и обьяснить где я допустил ошибку? |
30.03.2012, 01:57 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DaeDR
offline
Опыт:
8,074Активность: |
Laikon, У тебя триггер просто не включен(вернее при создании он выключается):
|
30.03.2012, 05:16 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DaeDR
offline
Опыт:
8,074Активность: |
Laikon, Как бы сделал я: (хотя удаление эффектов лучше сделать через отдельную функцию, через таймеры)
» PoisonBomb
DaeDR добавил:
Там есть такая функция, как
в нее лучше записать побольше условий. Сейчас урон наносится всем враждебным в области (даже мертвым и невидимым).
Поэтому лучше записать туда вот это: (я создал триггер и вписал нужные условия, а потом конвертировал в текст, часть которого можно забить в фильтр) Можно все это записать в одну строчку, но тогда понижается читабельность
DaeDR добавил:
Вот как бы я записал:
и еще ( зачем наносить урон только нейтральным? ). Вместо
можно поставить
тогда урон будет наноситься всем видимым, живым и не зданиям враждебным юнитам в области |
30.03.2012, 06:07 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|