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

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

Закрытая тема
 
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
проблема с отрядом
Создаю локальную типа отряд:
local group g
затем создаю глобальную переменную Marshal_Rage_otriad ( =юниты в области блаблабла):
set g = (udg_Marshal_Rage_otriad)
set udg_Marshal_Rage_otriad = g
совершаю действия затем:
call DestroyGroup(g)
set g = null
будет ли правильна группа очищаться или же надо как-то подругому?
set udg_Marshal_Rage_otriad = g
нужно ли глобальную также приравнять к локальной?
[+] замечание от Suite: 1.2 (учим русский язык) + 2.2 (название темы не отражает сути вопроса)

Отредактировано Suite, 13.04.2012 в 14:06.
Старый 13.04.2012, 13:09
DaeDR

offline
Опыт: 8,074
Активность:
call GroupClear (g)
call DestroyGroup (g)
set g = null
DaeDR добавил:
Я так всегда делаю
Старый 13.04.2012, 13:12
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
DaeDR, спс большое, слушай я создаю глобальную переменную, пока временно так, пока хеш не освою.
Мне же надо глобальную приравнивать к локальной? тоесть(g)
Старый 13.04.2012, 13:15
MpW

offline
Опыт: 49,801
Активность:
Код:
local group g = CreateGroup() //объявляем локалку, и тут же в эту локалку запоминаем новую группу, которую создали
//твои действия с группой (выделить в группу, потом различные манипуляции с группой)
call GroupClear (g) //очистить группу
call DestroyGroup (g) //удалить
set g = null //обнулить


вроде бы нужно приравнять глобалку, потом ты отдельную функцию ForGroup используешь, то есть есть вероятность что там есть и другие функции. А локалки работают внутри функции, обращение к g вызовет ошибку там, потому что мы пытаемся работать с несуществующей переменной g

Steal nerves добавил:
лучше тебе начать изучать джазз
Старый 13.04.2012, 13:29
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
Steal_nerves, ошибки нету уже проверил все работает как не странно
Cosonic5 добавил:
Steal_nerves, хмм а что делаю?) я и изучаю
Старый 13.04.2012, 13:31
MpW

offline
Опыт: 49,801
Активность:
Cosonic5, ну тут все зависит как это сделал. Может быть другие проблемы... я вообще имею в виду никогда не использовать глобалки. Объявлять и создавать их самому, использовать хэш-таблицы. просто свезло
Старый 13.04.2012, 13:39
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
Steal_nerves, теость чисто локальными, просто видишь баги получаются, когда пытаешься выбрать каждого юнита в таком то отряде. а на гуи я знаю что утечно но я сделаю не муи чтоб память не нагружать.
» code
function Trig_Rage_Gui_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A0A7' ) ) then
        return false
    endif
    return true
endfunction

function Trig_Rage_Gui_Func004002003001 takes nothing returns boolean
    return ( IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetSpellAbilityUnit())) == true )
endfunction

function Trig_Rage_Gui_Func004002003002 takes nothing returns boolean
    return ( IsUnitAliveBJ(GetFilterUnit()) == true )
endfunction

function Trig_Rage_Gui_Func004002003 takes nothing returns boolean
    return GetBooleanAnd( Trig_Rage_Gui_Func004002003001(), Trig_Rage_Gui_Func004002003002() )
endfunction

function Trig_Rage_Gui_Func006002 takes nothing returns nothing
    call IssueTargetOrderBJ( GetEnumUnit(), "attack", GetSpellAbilityUnit() )
endfunction

function Trig_Rage_Gui_Func006Func001C takes nothing returns boolean
    if ( not ( IsUnitEnemy(GetEnumUnit(), GetOwningPlayer(GetSpellAbilityUnit())) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_Rage_Gui_Actions takes nothing returns nothing
    local unit attack
    local group g
    set attack = GetSpellAbilityUnit()
    set udg_Marshal_Rage_otriad = GetUnitsInRangeOfLocMatching(400.00, GetUnitLoc(GetSpellAbilityUnit()), Condition(function Trig_Rage_Gui_Func004002003))
    set g = (udg_Marshal_Rage_otriad)
    call ForGroupBJ( udg_Marshal_Rage_otriad, function Trig_Rage_Gui_Func006002 )
    set udg_Marshal_Rage_otriad = g
    call TriggerSleepAction( 3.00 )
    call GroupClear (g)
    call DestroyGroup(g)
    set attack = null
    set g = null
endfunction

//===========================================================================
function InitTrig_Rage_Gui takes nothing returns nothing
    set gg_trg_Rage_Gui = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Rage_Gui, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Rage_Gui, Condition( function Trig_Rage_Gui_Conditions ) )
    call TriggerAddAction( gg_trg_Rage_Gui, function Trig_Rage_Gui_Actions )
endfunction

Отредактировано Suite, 13.04.2012 в 14:02.
Старый 13.04.2012, 13:43
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,259
Активность:
Cosonic5, госпади), куда тебе столько функций с условиями, и двух хватит? Вейт не нутжен, для очистки группы и её удаления... Так как раньше чем не будут выполнены все действия с группой не будет вызвана эта функция.
» код
((код jass
function Trig_Rage_Gui_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A0A7'
endfunction
function Trig_Rage_Gui_Func004002003 takes nothing returns boolean
return IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetSpellAbilityUnit())) and IsUnitAliveBJ(GetFilterUnit())
endfunction
function Trig_Rage_Gui_Func006002 takes nothing returns nothing
call IssueTargetOrderBJ( GetEnumUnit(), "attack", GetSpellAbilityUnit() )
endfunction
function Trig_Rage_Gui_Func006Func001C takes nothing returns boolean
return IsUnitEnemy(GetEnumUnit(), GetOwningPlayer(GetSpellAbilityUnit()))
endfunction
function Trig_Rage_Gui_Actions takes nothing returns nothing
local unit attack
local group g
set attack = GetSpellAbilityUnit()
set udg_Marshal_Rage_otriad = GetUnitsInRangeOfLocMatching(400.00, GetUnitLoc(GetSpellAbilityUnit()), Condition(function Trig_Rage_Gui_Func004002003))
set g = (udg_Marshal_Rage_otriad)
set bj_wantDestroyGroup = true
call ForGroupBJ( udg_Marshal_Rage_otriad, function Trig_Rage_Gui_Func006002 )
set udg_Marshal_Rage_otriad = g
set attack = null
set g = null
endfunction
===========================================================================
function InitTrig_Rage_Gui takes nothing returns nothing
set gg_trg_Rage_Gui = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Rage_Gui, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Rage_Gui, Condition( function Trig_Rage_Gui_Conditions ) )
call TriggerAddAction( gg_trg_Rage_Gui, function Trig_Rage_Gui_Actions )
endfunction
))
кстати когда юзаеш bj функции, то лутьше возьми jass Helper и посомтри их содержимое, там много хитростей для удаление утечек, к примеру использование стандартных близзардовских констант и много другое, мину что как не крути скорости исполнения кода на bj функция будет меньше скорости на natives функциях...

Отредактировано quq_CCCP, 13.04.2012 в 14:11.
Старый 13.04.2012, 14:03
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
quq_CCCP, точно вайт можно убирать? ну по идеи да
ну да функций много, это наверно из за того, что группу выбираю в один заход, а не через условия.
ну впринципе мне надо сравнить жив ли выбранный юнит, и пренадлежит врагу ну и все.
Cosonic5 добавил:
quq_CCCP, о спс, оказывается можно ставить приставку and, что позволит добавить условие, теперь буду знать ого.
Старый 13.04.2012, 14:11
Suite
┌_____┐
offline
Опыт: 11,222
Активность:
Cosonic5:
Steal_nerves, хмм а что делаю?) я и изучаю
Если ты читал статью nerevar'а то ты сразу должен сделать хотя бы чуточку читабельнее код:
function Trig_Rage_Gui_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A0A7' ) ) then
        return false
    endif
    return true
endfunction
function Trig_Rage_Gui_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A0A7'
endfunction
Старый 13.04.2012, 14:13
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,259
Активность:
Cosonic5, знаеш что такое bj_wanrDestroyGroup ? это константана булевского типа, ставится перед функцией ForGroupBJ чтобы удалить в последствии группу, ставится в гуи через Сustom Script ...
Ну можно использовать вместо локалок еще кучу констант, но увы не всегда...
кстати а нафиг тебе локальный юнит Attack? используй переменную если хотябы в 2 или 3 местах в функции используется её значение, иначе всё бессмысленно... Тока действии больше...
Старый 13.04.2012, 14:13
DaeDR

offline
Опыт: 8,074
Активность:
Cosonic5, вот как должен выглядеть твой код:
» Код
function Trig_Rage_Gui_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A0A7'
endfunction

function Trig_Rage_Gui_Func004002003 takes nothing returns boolean
    return (IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetSpellAbilityUnit())))and( GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0.0)
endfunction

function Trig_Rage_Gui_Func006002 takes nothing returns nothing
    call IssueTargetOrder( GetEnumUnit(), "attack", GetSpellAbilityUnit() )
endfunction

function Trig_Rage_Gui_Actions takes nothing returns nothing
    local unit attack = GetSpellAbilityUnit()
    local group g = CreateGroup ()
    local boolexpr f = Condition (function Trig_Rage_Gui_Func004002003)
    call GroupEnumUnitsInRange(g, 400.00, GetUnitX(attack), GetUnitY(attack), f)
    call DestroyBoolExpr (f)
    call ForGroup( udg_Marshal_Rage_otriad, function Trig_Rage_Gui_Func006002 )
    call GroupClear (g)
    call DestroyGroup(g)
    set f = null
    set attack = null
    set g = null
endfunction

//===========================================================================
function InitTrig_Rage_Gui takes nothing returns nothing
    set gg_trg_Rage_Gui = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Rage_Gui, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Rage_Gui, Condition( function Trig_Rage_Gui_Conditions ) )
    call TriggerAddAction( gg_trg_Rage_Gui, function Trig_Rage_Gui_Actions )
endfunction
Поправил
DaeDR добавил:
Хм. опередили
Старый 13.04.2012, 14:14
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
quq_CCCP, set bj_wantDestroyGroup = true
это что-то типо этого?
call DestroyGroup(g)
Suite Спасибо что исправил!
Suite да да читал, дело в том что после такого сокращения
появилась ошибка совсем ненужная. (откуда была сам не знаю все делал правильно)
Старый 13.04.2012, 14:15
DaeDR

offline
Опыт: 8,074
Активность:
Cosonic5, А у тебя используется эта переменная еще где?
udg_Marshal_Rage_otriad
Зачем ее по 10 раз переприсваивать?
DaeDR добавил:
если можно обойтись только локалкой
Старый 13.04.2012, 14:17
ScorpioT1000
Работаем
offline
Опыт: отключен
set bj_wantDestroyGroup = true
это что-то типо этого?
call DestroyGroup(g)
да, поищи эти функции в blizzard.j а в jngp и jasscraft есть список функций с их реализацией
Старый 13.04.2012, 14:17
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
DaeDR, вот ты не поверишь до этого пробовал локалку неполучалось спс!
call ForGroup( udg_Marshal_Rage_otriad, function Trig_Rage_Gui_Func006002 )
вот тут переменная глобальная это нормально? вообщем не где не испольуется,да то что
перезаписывается согласен, она мне по сути вообще не нужна=) (я от них стараюсь избавлятся)
Старый 13.04.2012, 14:20
DaeDR

offline
Опыт: 8,074
Активность:
Cosonic5, Недосмотрел)
» Код
function Trig_Rage_Gui_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A0A7'
endfunction

function Trig_Rage_Gui_Func004002003 takes nothing returns boolean
    return (IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetSpellAbilityUnit())))and( GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0.0)
endfunction

function Trig_Rage_Gui_Func006002 takes nothing returns nothing
    call IssueTargetOrder( GetEnumUnit(), "attack", GetSpellAbilityUnit() )
endfunction

function Trig_Rage_Gui_Actions takes nothing returns nothing
    local unit attack = GetSpellAbilityUnit()
    local group g = CreateGroup ()
    local boolexpr f = Condition (function Trig_Rage_Gui_Func004002003)
    call GroupEnumUnitsInRange(g, 400.00, GetUnitX(attack), GetUnitY(attack), f)
    call DestroyBoolExpr (f)
    call ForGroup( g, function Trig_Rage_Gui_Func006002 )
    call GroupClear (g)
    call DestroyGroup(g)
    set f = null
    set attack = null
    set g = null
endfunction

//===========================================================================
function InitTrig_Rage_Gui takes nothing returns nothing
    set gg_trg_Rage_Gui = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Rage_Gui, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Rage_Gui, Condition( function Trig_Rage_Gui_Conditions ) )
    call TriggerAddAction( gg_trg_Rage_Gui, function Trig_Rage_Gui_Actions )
endfunction
DaeDR добавил:
И IsUnitAliveBJ лучше не использовать. Эта функция вызывает еще 2 внутри себя последовательно.
Лучше сразу проверять на здоровье: GetUnitState(u, UNIT_STATE_LIFE)>0.0
Старый 13.04.2012, 14:23
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,259
Активность:
Cosonic5:
quq_CCCP, set bj_wantDestroyGroup = true
это что-то типо этого?
call DestroyGroup(g)
ну просто это буливская глобальная переменная (ну грубо говоря), которая либо равна да, либо равна нет.
((код jass
function ForGroupBJ takes group whichGroup, code callback returns nothing
Если пользователь хочет уничтожить группу, то запомните это
флаг, использованный при этом не сохранится.
local boolean wantDestroy = bj_wantDestroyGroup
set bj_wantDestroyGroup = false
call ForGroup(whichGroup, callback)
Если пользователь хочет уничтожить гурппу, то это делается сейчас.
if (wantDestroy) then
call DestroyGroup(whichGroup)
endif
endfunction
))
Старый 13.04.2012, 14:25
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
Всем спасибо!
Cosonic5 добавил:
почему то способность не работает почему сложно сказать(
» code
function Trig_Rage_Gui_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A0A7'
endfunction

function Trig_Rage_Gui_Func004002003 takes nothing returns boolean
    return IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetSpellAbilityUnit())) and GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0.0
endfunction

function Trig_Rage_Gui_Func006002 takes nothing returns nothing
    call IssueTargetOrder( GetEnumUnit(), "attack", GetSpellAbilityUnit() )
endfunction

function Trig_Rage_Gui_Actions takes nothing returns nothing
    local unit attack = GetSpellAbilityUnit()
    local group g = CreateGroup ()
    local boolexpr f = Condition (function Trig_Rage_Gui_Func004002003)
    call GroupEnumUnitsInRange(g, 400.00, GetUnitX(attack), GetUnitY(attack), f)
    call DestroyBoolExpr (f)
    call ForGroup( g, function Trig_Rage_Gui_Func006002 )
    call GroupClear (g)
    call DestroyGroup(g)
    set f = null
    set attack = null
    set g = null
endfunction

//===========================================================================
function InitTrig_Rage_Jass takes nothing returns nothing
    set gg_trg_Rage_Jass = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Rage_Jass, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Rage_Jass, Condition( function Trig_Rage_Gui_Conditions ) )
    call TriggerAddAction( gg_trg_Rage_Jass, function Trig_Rage_Gui_Actions )
endfunction
Cosonic5 добавил:
boolexpr дайте определение возможно из за этого неработает(

Отредактировано Suite, 13.04.2012 в 14:54.
Старый 13.04.2012, 15:11
adic3x

offline
Опыт: 108,439
Активность:
// cJass

// библиотеки
#include "lib\\cj_types.j"
#include "lib\\cj_order.j"

// Код способности
callback onUnitSpellEffect ('A0A7') {
    unit caster = GetSpellAbilityUnit ()
    for (unit u; UnitsInRange (GetUnitX(caster), GetUnitY(caster), 400.)) {
        if (IsUnitEnemy(caster, GetOwningPlayer(u)) && GetWidgetLife(u) > .405) {
            IssueTargetOrderById (u, order_attack, caster)
        }
    }
}
Все работает ;) я еще помню как это все пишется...

Отредактировано ADOLF, 13.04.2012 в 15:27.
Старый 13.04.2012, 15:13
Закрытая тема

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

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

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

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



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