Сейчас 12:14:33 Вторник, 7 мая, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Глючный код
Глючный код
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, и ты что тока локальными переменными пользуюжся в джаз ? mellow
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
ахаха, проблема то в событие.
попробуй
Приводит способность в действие
или
Заканчивает применять способность

Проблема не в нём. Я перепробовал там много чего и остановился на последнем варианте.

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

Он не проглючит, кэп за него ручается :D


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

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)

дуос подсел на мою привычку писать числа в хексе? :D

Ага, это да)


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

СорнемусДата: Среда, 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)
да нет кэп, я к этому коду даж не прикосался просто тыкал на всякие ошибки прикаторых фатал будет выдовать.

При объявлении локалок не в начале будет не фатал, а просто парсер будет срать кирпичами ругаться. Это так, для справки ;)
 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Глючный код
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz