XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Переход с функции на функцию
Мучаю Джасс... Вопрос: как правильно переносить уже заданные переменные из одной функции в другую без udg_..., RB, SCV. Листал мануал джассовский но там как-то вокруг да около...
Текст в функциях используется для проверки работоспособности триггера.

Код:
function WSfunc2 takes unit ws_cu, unit ws_tu, location ws_cup, real ws_mtur, integer ws_ci returns nothing

    call DisplayTextToForce( GetPlayersAll(), GetUnitName(ws_tu)) // дебаг запуска
    if ((UnitHasBuffBJ(ws_tu, 'B026') == true) and (ws_ci <= 5)) then
     set ws_ci = ws_ci + 1
     set ws_cup = GetUnitLoc(ws_cu)
     set ws_mtur = ((0.10 * GetUnitStateSwap(UNIT_STATE_MAX_MANA, ws_tu)) * I2R(GetUnitAbilityLevelSwapped('A083', ws_cu)))
     set ws_cu = null
     set ws_tu = null 
     call RemoveLocation(ws_cup)
     set ws_ci = 0
    else
     set ws_cu = null
     set ws_tu = null
     set ws_ci = 0
    endif

    call PolledWait(1.00)
    call WSfunc2(ws_cu, ws_tu, ws_cup, ws_mtur, ws_ci)

endfunction


function WSfunc1 takes nothing returns nothing

    local unit ws_cu       
    local unit ws_tu       
    local location ws_cup  
    local real ws_mtur          
    local integer ws_ci    

    set ws_cu = GetSpellAbilityUnit()
    set ws_tu = GetSpellTargetUnit()
    set ws_ci = 0

    call DisplayTextToForce( GetPlayersAll(), GetUnitName(ws_tu)) // дебаг запуска
    call WSfunc2(ws_cu, ws_tu, ws_cup, ws_mtur, ws_ci)

endfunction


з.ы: еще каким образом можно повторить функцию, скажем WSfunc2. Я видел во многих джасс триггерах есть return (из гуи Skip Remaning Actions)... хз как работает. В примере показан вариант того как циклю я хD научите правильно (тут вроде тоже можно без таймеров, лишних триггеров, RB и SCV)
Старый 11.08.2008, 18:43
J
expert
offline
Опыт: 48,447
Активность:
Зевс скажи чего именно ты хочеш добится...
пободный вариант в корне не верен, и вообще советую избегать рекурсию с ваитами

по поводу смысла кода - непойму, он передает ws_cu и ws_tu только раз, в функции WSfunc2 они обнуляются и дальше рекурсируют null'ы, зачем?

в джазе есть правило - необходимо(!).... э нет... нельзя(!), использовать обьявленые переменые без их инициализации, ты обьявил переменные ws_cup и ws_mtur, но не дал им начального значения, и используеш как параметры, это приводит к крашу вара

совет №1 неиспользуй бж функции, пользуйся програмой JassCraft, она предоставляет удобный интерфейс просмотра бж функций и заменить или понять чтонибудь не составляет труда

совет №2 пока это не вошло в привычку, не используй прификсы к локальным переменых хорактеризующих их область применения, это локальные переменые, и имена у них тоже должны быть локальными (это просто совет, поступай кк хочеш)

совет №3 неиспользуй точки (location), используй напрямую координаты, почти к каждой функции работающей на точках есть аналог которая работает с их координатами

совет №4 задавай эти вопросы в джас разделе

Цитата:
Я видел во многих джасс триггерах есть return (из гуи Skip Remaning Actions)... хз как работает

return - это просто выход из функции, если функция ничего не возвращает то выход делается просто - return, если же чтото возвращает то при выходе надо обязательно чтото вернуть, например если возвращает integer то выход - return 0

Отредактировано Jon, 11.08.2008 в 19:09.
Старый 11.08.2008, 18:57
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Зевс, то, как ты делаешь рекурсию, заставляет меня выглядеть немного глупым ^_^
В коде есть логические ошибки.

Как переносить без вышеуказанного - никак, так или инчае придется использовать либо глобальные переменные, либо РБ, либо и то, и другое.
Как вариант, можно аттачить структуру на таймер и делать дела.
Старый 11.08.2008, 18:59
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Ну вот по мануалу переносят.
Код:
function Bar takes unit u returns nothing
     call PauseUnit(u, true)
     // the unit u is paused, but u and y refer to the same
     // data structure so y is also paused
endfunction

...
     local unit y = GetTriggeringUnit()

     call Bar(y)
     // the unit y is paused

2Jon: по поводу смысла кода... суть не в том... мне главное было перенести, а там не важно. Для этого я и втыкал дисплей текст, чтобы поглядеть какой я криворукий(
Старый 11.08.2008, 19:14
J
expert
offline
Опыт: 48,447
Активность:
Зевс ну все правельно, ты обьявил функцию Bar которая принимает пораметр типа unit
ну и гдето из другой части кода (ниже) при вызове этой функции передаеш этот пораметр
в чем проблема?
Старый 11.08.2008, 19:18
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Пошел метод тыка... текст отображается но походу переменные не приравнялись ^^
Код:
function Xd_ws_cu takes nothing returns unit
    return GetSpellAbilityUnit() 
endfunction
function Xd_ws_tu takes nothing returns unit
    return GetSpellTargetUnit() 
endfunction
function Xd_ws_mtur takes nothing returns real
    return 0.00 
endfunction
function Xd_ws_ci takes nothing returns integer
    return 0 
endfunction

function Performance takes unit ws_cu, unit ws_tu, real ws_mtur, integer ws_ci returns nothing

    if ((UnitHasBuffBJ(ws_tu, 'B026') == true) and (ws_ci <= 5)) then
     set ws_ci = ws_ci + 1
    else
     set ws_cu = null
     set ws_tu = null
     set ws_ci = 0
    endif
    
    call DisplayTextToForce( GetPlayersAll(), GetUnitName(udg_Temple_Boss_A))
    call PolledWait(1.00)

    if ((IsUnitAliveBJ(ws_tu) == false) and (ws_ci <= 5)) then
     set ws_mtur = ((0.10 * GetUnitStateSwap(UNIT_STATE_MAX_MANA, ws_tu)) * I2R(GetUnitAbilityLevelSwapped('A083', ws_cu)))
     call SetUnitManaBJ(ws_cu, (GetUnitStateSwap(UNIT_STATE_MANA, ws_cu) + ws_mtur))
     set ws_cu = null
     set ws_tu = null 
     set ws_ci = 0
    else
     call Performance(Xd_ws_cu(), Xd_ws_tu(), Xd_ws_mtur(), Xd_ws_ci())
    endif        

endfunction


function Actions takes nothing returns nothing

    local unit ws_cu      
    local unit ws_tu       
    local real ws_mtur        
    local integer ws_ci    

    call Performance(Xd_ws_cu(), Xd_ws_tu(), Xd_ws_mtur(), Xd_ws_ci())

endfunction
Старый 11.08.2008, 19:51
J
expert
offline
Опыт: 48,447
Активность:
чет фигня какаято, короче если я правельно понял смысл всего этого, и если _допустить_ что я поддержываю идею о рекурсии с ваитами, то лучше так:
Код:
function Performance takes unit ws_cu, unit ws_tu, real ws_mtur, integer ws_ci returns nothing
    call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, GetUnitName(udg_Temple_Boss_A))    
    if (GetUnitAbilityLevel(ws_tu, 'B026') > 0) and (GetUnitState(ws_tu, UNIT_STATE_LIFE) > 0) and (ws_ci <= 5)) then
        set ws_mtur = 0.1 * GetUnitState(ws_tu, UNIT_STATE_MAX_MANA) * GetUnitAbilityLevel(ws_cu, 'A083')
        call SetUnitState(ws_cu, UNIT_STATE_MANA, GetUnitState(ws_cu, UNIT_STATE_MANA) + ws_mtur) 
        call TriggerSleepAction(1) 
        call Performance(ws_cu, ws_tu, ws_mtur, ws_ci + 1)
    endif
endfunction

function Actions takes nothing returns nothing
    call Performance(GetSpellAbilityUnit(), GetSpellTargetUnit(), 0, 0)    
endfunction
Старый 11.08.2008, 20:04
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Спасибо, Jon заработало хD
Старый 11.08.2008, 20:54
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
совет №1 неиспользуй бж функции, пользуйся програмой JassCraft, она предоставляет удобный интерфейс просмотра бж функций и заменить или понять чтонибудь не составляет труда


сабж, в последних ген паках с подсветкой оно сразу подсвечивает бж красным, натив таким приятно гламурным фиалетавым, так что сраху бж нехочеться юзить)

Цитата:
пока это не вошло в привычку, не используй прификсы к локальным переменых хорактеризующих их область применения

я бы не был так катигоричен (хотя и поступил бы также, т.е. минималистические имена рулят) но опять же главное в именах меток - что бы они были понятны и удобны тому, кто работает с кодом

Цитата:
совет №3 неиспользуй точки (location), используй напрямую координаты, почти к каждой функции работающей на точках есть аналог которая работает с их координатами


нету только аналогов GetSpellTargetLoc & GetLocationZ(location)

Цитата:
что я поддержываю идею о рекурсии с ваитами


мне сама такая идея противна (ну насчет рекурсии и вейтов)
имхо даже цикл с вейтом бмл бм не таким уродливым (а поскольку циклы с вейтами вселенское зло то описываемый код ммм, даже слов нету какое зло)

почему не юзать нормально таймер?!
Старый 12.08.2008, 11:40
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
"почему не юзать нормально таймер?!" будет много лишних букав...))
Правда хз баг возник...
Код:
if ((IsUnitDeadBJ(ws_tu) == true) and (ws_ci <= 5)) then блабла
//если цель - герой, то ничего не происходит... если обычный юнит - то все нормально...
Старый 12.08.2008, 19:20
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
будет много лишних букав...
извени конешн но так говорят обычно ламеры
ктомуже, много бкф не будет, там несколько строк добавятся и все...

проверка на негероя (not IsUnitType(ws_tu, UNIT_TYPE_HERO))
IsUnitDeadBJ(ws_tu) - бж о чем реч шла выше, заменить на GetUnitState(ws_tu, UNIT_STATE_LIFE) <= 0
Старый 12.08.2008, 20:01
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Цитата:
извени конешн но так говорят обычно ламеры
ктомуже, много бкф не будет, там несколько строк добавятся и все...

дык а я то кто сейчас... джасс я только начал учить... ;)

про героя... мне нужно чтобы оно выполнялось и с героями и не с героями... при этом если я кастую первый раз на героя, то все выполняется нормально, но если второй раз - то всесбрасывается, хотя при этом я могу кастовать на обычных юнитов и все будет происходить как надо.((

GetUnitState(ws_tu, UNIT_STATE_LIFE) <= 0 ставил... даже ставил GetUnitState(ws_tu, UNIT_STATE_LIFE) <= 0.50 ....... не работает((((((

Зевс добавил:
Проверил текстом... у убитого Героя меньше 20 хп не бывает О_О
Старый 12.08.2008, 20:49
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Зевс, а ты когда дебаг вывод делал? При событии смерти юнита? Тогда понятно... Оно происходит немного раньше, чем отнимаются жизни.
В соседней теме я советовал использовать такую проверку мертовго/живого:
Код:
IsUnitType(ws_tu, UNIT_TYPE_DEAD) or GetUnitTypeId(ws_tu)<1
Старый 13.08.2008, 19:13
Зевс
Адская Зверюга
offline
Опыт: 152,154
Активность:
Цитата:
Сообщение от ShadoW DaemoN
Зевс, а ты когда дебаг вывод делал? При событии смерти юнита? Тогда понятно... Оно происходит немного раньше, чем отнимаются жизни.
В соседней теме я советовал использовать такую проверку мертовго/живого:
Код:
IsUnitType(ws_tu, UNIT_TYPE_DEAD) or GetUnitTypeId(ws_tu)<1

спс... то что нужно
Старый 13.08.2008, 21:40
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 14:06.