|
|
|
|
Глючный код
|
|
fixbag | Дата: Вторник, 19 Января 2010, 15:17:18 | Сообщение # 1 |
3 уровень
Группа: Пользователи
Сообщений: 54
Награды: 0
Репутация: 4
Блокировки:
| Собственно проблема такая: Взял я за основу спелл Алхимика - Кислотная бомба, и начал с ним химичить. Урон убрал, оставил снижение защиты. Написал код, наносящий урон в зависимости от характеристик героя. Когда герой неподвижно кастует спелл, то всё хорошо. Но если во время полёта снаряда побежать, то урон не наносится, только снижается защита... Ума не приложу какого чёрта так выходит. Вот код: Сейчас немного его объясню. Событие Юнит кастует спелл Условие Спелл = тот, который нужен Действие local integer a = 0 local real b = 0 Ждать (Расстояние от кастера до цели / 1100)секунд //1100 - скорость полёта снаряда Если лвл спелла = 1, то set a = формула дамага Если лвл спелла = 2, то set a = формула дамага Если лвл спелла = 3, то set a = формула дамага set b = интегер то реал(a) Юниту-цели наипошить b урона от Юнита-кастера типа заклинание Quote (Код) function Trig_test2_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'A00B' ) ) then return false endif return true endfunction function Trig_test2_Func004Func001Func002C takes nothing returns boolean if ( not ( GetUnitAbilityLevelSwapped('A00B', GetTriggerUnit()) == 3 ) ) then return false endif return true endfunction function Trig_test2_Func004Func001C takes nothing returns boolean if ( not ( GetUnitAbilityLevelSwapped('A00B', GetTriggerUnit()) == 2 ) ) then return false endif return true endfunction function Trig_test2_Func004C takes nothing returns boolean if ( not ( GetUnitAbilityLevelSwapped('A00B', GetTriggerUnit()) == 1 ) ) then return false endif return true endfunction function Trig_test2_Actions takes nothing returns nothing local integer a = 0 local real b = 0 call TriggerSleepAction( ( DistanceBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetUnitLoc(GetSpellTargetUnit())) / 1100.00 ) ) if ( Trig_test2_Func004C() ) then set a = ( ( GetUnitLevel(GetTriggerUnit()) * 7 ) + ( GetHeroStatBJ(bj_HEROSTAT_INT, GetTriggerUnit(), true) * 3 ) ) else if ( Trig_test2_Func004Func001C() ) then set a = ( ( GetUnitLevel(GetTriggerUnit()) * 8 ) + ( GetHeroStatBJ(bj_HEROSTAT_INT, GetTriggerUnit(), true) * 4 ) ) else if ( Trig_test2_Func004Func001Func002C() ) then set a = ( ( GetUnitLevel(GetTriggerUnit()) * 9 ) + ( GetHeroStatBJ(bj_HEROSTAT_INT, GetTriggerUnit(), true) * 5 ) ) else endif endif endif set b = I2R(a) call UnitDamageTargetBJ( GetTriggerUnit(), GetSpellTargetUnit(), b, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNKNOWN ) endfunction //=========================================================================== function InitTrig_test2 takes nothing returns nothing set gg_trg_test2 = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_test2, EVENT_PLAYER_UNIT_SPELL_CHANNEL ) call TriggerAddCondition( gg_trg_test2, Condition( function Trig_test2_Conditions ) ) call TriggerAddAction( gg_trg_test2, function Trig_test2_Actions ) endfunction Добавлено (19-01-2010, 15:17) --------------------------------------------- Ап. Никто не сталкивался с таким? Или такие спеллы делаются как-то по-другому?
|
|
|
|
H_A_PK | Дата: Вторник, 19 Января 2010, 17:11:07 | Сообщение # 2 |
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
| fixbag, и ты что тока локальными переменными пользуюжся в джаз ? Quote (fixbag) Юнит кастует спелл ахаха, проблема то в событие. попробуй Приводит способность в действие или Заканчивает применять способность и кстати Code function Trig_test2_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'A00B' ) ) then return false endif return true endfunction
function Trig_test2_Func004Func001Func002C takes nothing returns boolean if ( not ( GetUnitAbilityLevelSwapped('A00B', GetTriggerUnit()) == 3 ) ) then return false endif return true endfunction
function Trig_test2_Func004Func001C takes nothing returns boolean if ( not ( GetUnitAbilityLevelSwapped('A00B', GetTriggerUnit()) == 2 ) ) then return false endif return true endfunction
function Trig_test2_Func004C takes nothing returns boolean if ( not ( GetUnitAbilityLevelSwapped('A00B', GetTriggerUnit()) == 1 ) ) then return false endif return true endfunction
function Trig_test2_Actions takes nothing returns nothing local integer a = 0 local real b = 0 call TriggerSleepAction( ( DistanceBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetUnitLoc(GetSpellTargetUnit())) / 1100.00 ) ) if ( Trig_test2_Func004C() ) then set a = ( ( GetUnitLevel(GetTriggerUnit()) * 7 ) + ( GetHeroStatBJ(bj_HEROSTAT_INT, GetTriggerUnit(), true) * 3 ) ) else if ( Trig_test2_Func004Func001C() ) then set a = ( ( GetUnitLevel(GetTriggerUnit()) * 8 ) + ( GetHeroStatBJ(bj_HEROSTAT_INT, GetTriggerUnit(), true) * 4 ) ) else if ( Trig_test2_Func004Func001Func002C() ) then set a = ( ( GetUnitLevel(GetTriggerUnit()) * 9 ) + ( GetHeroStatBJ(bj_HEROSTAT_INT, GetTriggerUnit(), true) * 5 ) ) else endif endif endif set b = I2R(a) call UnitDamageTargetBJ( GetTriggerUnit(), GetSpellTargetUnit(), b, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNKNOWN ) endfunction
//=========================================================================== function InitTrig_test2 takes nothing returns nothing set gg_trg_test2 = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_test2, EVENT_PLAYER_UNIT_SPELL_CHANNEL ) call TriggerAddCondition( gg_trg_test2, Condition( function Trig_test2_Conditions ) ) call TriggerAddAction( gg_trg_test2, function Trig_test2_Actions ) endfunction быдло код о-о
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
Сообщение отредактировал H_A_PK - Вторник, 19 Января 2010, 17:13:36 |
|
|
|
fixbag | Дата: Вторник, 19 Января 2010, 17:43:38 | Сообщение # 3 |
3 уровень
Группа: Пользователи
Сообщений: 54
Награды: 0
Репутация: 4
Блокировки:
| Quote и ты что тока локальными переменными пользуюжся в джаз ? А зачем там глобальные? Quote ахаха, проблема то в событие. попробуй Приводит способность в действие или Заканчивает применять способность Проблема не в нём. Я перепробовал там много чего и остановился на последнем варианте. Почему это? Ну да, я сконвертировал триггер в текст, так как через custom script локальные переменные не объявить... Ну и работать с ними, конечно.
|
|
|
|
H_A_PK | Дата: Вторник, 19 Января 2010, 17:54:37 | Сообщение # 4 |
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
| Quote (fixbag) Почему это? Ну да, я сконвертировал триггер в текст, так как через custom script локальные переменные не объявить... Ну и работать с ними, конечно. 1. ну я и говорю, что ты используеш толька локалки из джазаQuote (fixbag) А зачем там глобальные? 2. читай первое Quote (fixbag) Почему это? зачем тебе 5 функций в триггере, одной мало ? call UnitDamageTargetBJ - вобще угорнул 0--0 да и думаю лутше кастера юнита и юнита цель спела лутше в локалку юзнуть. и в конце все локалки возможные обнулить
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
|
|
|
|
fixbag | Дата: Вторник, 19 Января 2010, 18:06:24 | Сообщение # 5 |
3 уровень
Группа: Пользователи
Сообщений: 54
Награды: 0
Репутация: 4
Блокировки:
| Quote 1. ну я и говорю, что ты используеш толька локалки из джаза Не понял что ты хочешь сказать...
|
|
|
|
H_A_PK | Дата: Вторник, 19 Января 2010, 18:19:33 | Сообщение # 6 |
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
| я иммею ввиду , что в джазе ты пока умееш использоавать тока локальные переменые ? а по сабжу: попробуй поминяй основу спела
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
Сообщение отредактировал H_A_PK - Вторник, 19 Января 2010, 18:20:03 |
|
|
|
fixbag | Дата: Вторник, 19 Января 2010, 18:26:51 | Сообщение # 7 |
3 уровень
Группа: Пользователи
Сообщений: 54
Награды: 0
Репутация: 4
Блокировки:
| Ну... Почти. Джаз я знаю очень плохо... А так я учусь на программера. Щас пытаюсь код сделать нормальным. Как прервать выполнение функции? (если она ничего не возвращает)
|
|
|
|
H_A_PK | Дата: Вторник, 19 Января 2010, 18:38:49 | Сообщение # 8 |
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
| Quote (fixbag) Как прервать выполнение функции? честно не помню функции для прерывания функции. Зачем тебе это ?О_о вот подумал токо-что дал себе массу примеров, что наврядли она нужна. А что функция ВЫключить тригер тебе ничего не даёт ? я конечно понимаю, что придётся твою функу в тригер пихать ну раз тебе это нужно то лутше будет так
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
|
|
|
|
fixbag | Дата: Вторник, 19 Января 2010, 18:52:47 | Сообщение # 9 |
3 уровень
Группа: Пользователи
Сообщений: 54
Награды: 0
Репутация: 4
Блокировки:
| Quote function InitTrig_test2 takes nothing returns boolean call TriggerRegisterAnyUnitEventBJ( gg_trg_test2, EVENT_PLAYER_UNIT_SPELL_CAST ) if ( not ( GetSpellAbilityId() == 'A00B' ) ) then call DisableTrigger( GetTriggeringTrigger() ) endif local integer a = 0 local real b = 0 if ( not ( GetUnitAbilityLevelSwapped('A00B', GetTriggerUnit()) == 1 ) ) then set a = ( ( GetUnitLevel(GetTriggerUnit()) * 7 ) + ( GetHeroStatBJ(bj_HEROSTAT_INT, GetTriggerUnit(), true) * 3 ) ) endif if ( not ( GetUnitAbilityLevelSwapped('A00B', GetTriggerUnit()) == 2 ) ) then set a = ( ( GetUnitLevel(GetTriggerUnit()) * 8 ) + ( GetHeroStatBJ(bj_HEROSTAT_INT, GetTriggerUnit(), true) * 4 ) ) endif if ( not ( GetUnitAbilityLevelSwapped('A00B', GetTriggerUnit()) == 3 ) ) then set a = ( ( GetUnitLevel(GetTriggerUnit()) * 9 ) + ( GetHeroStatBJ(bj_HEROSTAT_INT, GetTriggerUnit(), true) * 5 ) ) endif set b = I2R(a) call TriggerSleepAction( ( DistanceBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetUnitLoc(GetSpellTargetUnit())) / 1100.00 ) ) call UnitDamageTargetBJ( GetTriggerUnit(), GetSpellTargetUnit(), b, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNKNOWN ) endfunction Что-то редактор вылетает... Что тут не так?
|
|
|
|
H_A_PK | Дата: Вторник, 19 Января 2010, 19:03:44 | Сообщение # 10 |
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
| call TriggerRegisterAnyUnitEventBJ( gg_trg_test2, EVENT_PLAYER_UNIT_SPELL_CAST ) скорее всего это, просто не вижу чтоб гдето этот тригер обьевило :-)
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
|
|
|
|
fixbag | Дата: Вторник, 19 Января 2010, 19:07:01 | Сообщение # 11 |
3 уровень
Группа: Пользователи
Сообщений: 54
Награды: 0
Репутация: 4
Блокировки:
| Нашёл почему вылетает редактор - функция возвращает не boolean, а nothing Quote call TriggerRegisterAnyUnitEventBJ( gg_trg_test2, EVENT_PLAYER_UNIT_SPELL_CAST ) скорее всего это, просто не вижу чтоб гдето этот тригер обьевило :-) А... Как тогда нужно сделать?
|
|
|
|
H_A_PK | Дата: Вторник, 19 Января 2010, 19:10:55 | Сообщение # 12 |
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
| Quote (fixbag) function InitTrig_test2 takes nothing returns boolean точно блин Code //=========================================================================== function InitTrig_test2 takes nothing returns nothing set gg_trg_test2 = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_test2, EVENT_PLAYER_UNIT_SPELL_CHANNEL ) call TriggerAddCondition( gg_trg_test2, Condition( function Trig_test2_Conditions ) ) call TriggerAddAction( gg_trg_test2, function Trig_test2_Actions ) endfunction Quote (fixbag) local integer a = 0 local real b = 0 Локалки обьевлять можно тока в начале функции !
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
|
|
|
|
fixbag | Дата: Вторник, 19 Января 2010, 19:28:20 | Сообщение # 13 |
3 уровень
Группа: Пользователи
Сообщений: 54
Награды: 0
Репутация: 4
Блокировки:
| Блин... Так вообще не работает. В общем я сделал так: (Но проблема остаётся открытой, мне не хочется менять спел-основу) Quote function Trig_test2_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'A00B' ) ) then return false endif return true endfunction function Trig_test2_Actions takes nothing returns nothing local integer a = 0 local real b = 0 if ( GetUnitAbilityLevelSwapped('A00B', GetTriggerUnit()) == 1 ) then set a = ( ( GetUnitLevel(GetTriggerUnit()) * 7 ) + ( GetHeroStatBJ(bj_HEROSTAT_INT, GetTriggerUnit(), true) * 3 ) ) endif if ( GetUnitAbilityLevelSwapped('A00B', GetTriggerUnit()) == 2 ) then set a = ( ( GetUnitLevel(GetTriggerUnit()) * 8 ) + ( GetHeroStatBJ(bj_HEROSTAT_INT, GetTriggerUnit(), true) * 4 ) ) endif if ( GetUnitAbilityLevelSwapped('A00B', GetTriggerUnit()) == 3 ) then set a = ( ( GetUnitLevel(GetTriggerUnit()) * 9 ) + ( GetHeroStatBJ(bj_HEROSTAT_INT, GetTriggerUnit(), true) * 5 ) ) endif set b = I2R(a) call TriggerSleepAction( ( DistanceBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetUnitLoc(GetSpellTargetUnit())) / 1100.00 ) ) call UnitDamageTargetBJ( GetTriggerUnit(), GetSpellTargetUnit(), b, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNKNOWN ) endfunction //=========================================================================== function InitTrig_test2 takes nothing returns nothing set gg_trg_test2 = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_test2, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddCondition( gg_trg_test2, Condition( function Trig_test2_Conditions ) ) call TriggerAddAction( gg_trg_test2, function Trig_test2_Actions ) endfunction
|
|
|
|
H_A_PK | Дата: Вторник, 19 Января 2010, 19:39:49 | Сообщение # 14 |
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
| Quote (fixbag) спел-основу хз тогда
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
|
|
|
|
[DUОS] | Дата: Вторник, 19 Января 2010, 19:53:18 | Сообщение # 15 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Ну вы знатоки блин... fixbag, Бери этот код: Code function Trig_test2_Conditions takes nothing returns boolean return GetSpellAbilityId() == 0x41303042 endfunction
function Trig_test2_Actions takes nothing returns nothing local unit u = GetSpellAbilityUnit() local integer a = GetUnitLevel(u) local unit t = GetSpellTargetUnit() local real dx = GetUnitX(t) - GetUnitX(u) local real dy = GetUnitY(t) - GetUnitY(u) local real to = SquareRoot(dx * dx + dy * dy) call TriggerSleepAction(to / 1100) if GetUnitAbilityLevel(u,0x41303042) == 1 then set a = a * 7 + GetHeroInt(u,true) * 3 elseif GetUnitAbilityLevel(u,0x41303042) == 2 then set a = a * 8 + GetHeroInt(u,true) * 4 elseif GetUnitAbilityLevel(u,0x41303042) == 3 then set a = a * 9 + GetHeroInt(u,true) * 5 endif call UnitDamageTarget(u,t,a,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_UNKNOWN,WEAPON_TYPE_WHOKNOWS) set u = null set t = null endfunction
//=========================================================================== function InitTrig_test2 takes nothing returns nothing set gg_trg_test2 = CreateTrigger() call TriggerRegisterAnyUnitEventBJ(gg_trg_test2,EVENT_PLAYER_UNIT_SPELL_CAST) call TriggerAddCondition(gg_trg_test2,Condition(function Trig_test2_Conditions)) call TriggerAddAction(gg_trg_test2,function Trig_test2_Actions) endfunction Он не проглючит, кэп за него ручается
|
|
|
|
H_A_PK | Дата: Вторник, 19 Января 2010, 19:58:27 | Сообщение # 16 |
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
| Quote (H_A_PK) Ну вы знатоки блин... да нет кэп, я к этому коду даж не прикосался просто тыкал на всякие ошибки прикаторых фатал будет выдовать.
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
|
|
|
|
fixbag | Дата: Вторник, 19 Января 2010, 20:11:45 | Сообщение # 17 |
3 уровень
Группа: Пользователи
Сообщений: 54
Награды: 0
Репутация: 4
Блокировки:
| [DUОS], спасибо большое. Тему можно в печь.
|
|
|
|
DragoN | Дата: Вторник, 19 Января 2010, 21:15:11 | Сообщение # 18 |
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
| Quote (fixbag) так как через custom script локальные переменные не объявить... если руки прямые - можно дуос подсел на мою привычку писать числа в хексе? :D
El Psy Congroo
Сообщение отредактировал Dragon93 - Вторник, 19 Января 2010, 21:17:26 |
|
|
|
[DUОS] | Дата: Вторник, 19 Января 2010, 21:59:51 | Сообщение # 19 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| Quote (Dragon93) если руки прямые - можно Абсолютно беспроблемно Quote (Dragon93) дуос подсел на мою привычку писать числа в хексе? Ага, это да)
|
|
|
|
Сорнемус | Дата: Среда, 20 Января 2010, 20:39:25 | Сообщение # 20 |
9 уровень
Группа: Проверенные
Сообщений: 854
Награды: 0
Репутация: 120
Блокировки:
| H_A_PK, тебе явно нужен сеанс КО-терапии =) Quote (H_A_PK) быдло код о-о Это конверт из триггеров =) Quote (H_A_PK) ахаха, проблема то в событие. Та переменная вшитая в карту. Так что её можно использовать. Quote (H_A_PK) зачем тебе 5 функций в триггере, одной мало ? Конверт из триггеров создаёт овер 9000 лишних функций =) Quote (H_A_PK) да нет кэп, я к этому коду даж не прикосался просто тыкал на всякие ошибки прикаторых фатал будет выдовать. При объявлении локалок не в начале будет не фатал, а просто парсер будет срать кирпичами ругаться. Это так, для справки
|
|
|
|
|
|
|
|
|
|
|