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

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

Ответ
 
StoneHeartis
Kicked by ScorpioT1002
offline
Опыт: 1,009
Активность:
Группы не сохраняются? О.о
Как бы вот код. Пытался сделать по типу Stomp-спелов(при юзе юнитов отбрасывает в стороны).
Вроде бы все нормально. Но почему группа оказывается как бы пустая? Ничего не происходит. Мб я неправильно сохраняю группу?
globals
hashtable Hash=InitHashtable()
real c=0
endglobals

function Trig_as_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A000'
endfunction

function Trig_as_T takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local unit u=LoadUnitHandle(Hash, GetHandleId(t), 0)
    local group g=LoadGroupHandle(Hash, GetHandleId(t), 1)
    local unit eu
    local real speed= -2.5
    local real dx
    local real dy
    set c=c+1
    if not (HaveSavedHandle(Hash, GetHandleId(t), 0)) then
    call BJDebugMsg("DAMN")
    endif
    if c >= 200 then
    call BJDebugMsg("destroy")
    call FlushChildHashtable(Hash, GetHandleId(t))
    call DestroyTimer(t)
    set c=0
    else
    call BJDebugMsg("work")
        loop //вот отсюда и начинается фигня. т.к. по ходу группа пустая, то цикл заканчивается сразу.
            set eu = FirstOfGroup(g)
            exitwhen eu == null
            if IsPlayerEnemy(GetOwningPlayer(eu), GetOwningPlayer(u)) == true and IsUnitDeadBJ(eu) == false and IsUnitType(eu, UNIT_TYPE_STRUCTURE) == false then
                call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.​mdl",eu,"origin"))
                set dx=GetUnitX(eu)+speed*Cos(GetUnitFacing(eu) * bj_DEGTORAD)
                call BJDebugMsg("dX"+R2S(dx))
                set dy=GetUnitY(eu)+speed*Sin(GetUnitFacing(eu) * bj_DEGTORAD)
                call BJDebugMsg("dY"+R2S(dy))
                call SetUnitX(eu, dx)
                call SetUnitY(eu, dy)
            endif
            call GroupRemoveUnit(g, eu)
        endloop
    endif
	call DestroyGroup(g)
set t=null
set u=null
set eu=null
set g=null
endfunction

function Trig_as_Actions takes nothing returns nothing
    local timer t=CreateTimer()
    local unit u=GetTriggerUnit()
    local group g=CreateGroup()
    local real x=GetUnitX(u)
    local real y=GetUnitY(u)
    local real rd=600.00
    
    call GroupEnumUnitsInRange( g, x, y, rd, null)
    call GroupRemoveUnit(g, u)
    call SaveUnitHandle(Hash, GetHandleId(t), 0, u)
    call SaveGroupHandle(Hash, GetHandleId(t), 1, g)
    call TimerStart(t, 0.01, true, function Trig_as_T)
    set t=null
    set u=null
set g=null
endfunction

//===========================================================================
function InitTrig_as takes nothing returns nothing
    local trigger t=CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( t, Condition( function Trig_as_Conditions ) )
    call TriggerAddAction( t, function Trig_as_Actions )
    set t=null
endfunction

Отредактировано StoneHeartis, 18.04.2010 в 17:14.
Старый 18.04.2010, 16:21
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Код:
globals
trigger trig=CreateTrigger()


Вот поэтому.

Ах да, не забываем обнулять локальные хендлы.
Старый 18.04.2010, 16:26
StoneHeartis
Kicked by ScorpioT1002
offline
Опыт: 1,009
Активность:
FREEZE_ball, в смысле? у меня триггер и локально был, тоже ничего не происходило....
Про чистку оптимайз можно не упоминать. Скинул сырой код. Главное проблема в группе. Где я ни пытался загружать - везде такая ерунда с загрузкой групп. Либо что-то не так делаю.
Старый 18.04.2010, 16:29
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
StoneHeartis, хм, в таком случае попробуй понапихать везде BJDebugMsg("1" *2, 3, 4 итд*), возможно гдето какой-нибудь кусочек кода не выполняется. Это, конечно, при условии, что ты знаешь, что это такое (хотя по коду видно, знаешь).

Код:
hashtable Hash=InitHashtable()

Скорее всего, проблема не в этом, но советую инициализировать хештебль в самой нижней функции.
Старый 18.04.2010, 16:45
StoneHeartis
Kicked by ScorpioT1002
offline
Опыт: 1,009
Активность:
FREEZE_ball, еще раз повторюсь. всё работает. но группа *почему-то* пустая =\ (да-да, юзал дебаг-месседжи. всё работает как часы кроме группы)
Старый 18.04.2010, 16:53
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Аххахахаха, а я нашёл, почему.

Код:
call DestroyGroup(g)

Убери это чудо из функции Trig_as_Actions. Ты сохраняешь хендл группы, которую сразу же удаляешь =)
Старый 18.04.2010, 17:00
StoneHeartis
Kicked by ScorpioT1002
offline
Опыт: 1,009
Активность:
Код апдейт. Ничего не происходит. с хешем опять же все в порядке.
ЗЫ в лупе ифы убирал. нифига не происходит. Теперь уже 99,9% что группа как-то неправильно сохраняется. но что не так? =\
Старый 18.04.2010, 17:07
agentex

offline
Опыт: 34,834
Активность:
возможно firstofgroup глючит, попробуй через ForGroup
StoneHeartis:
Теперь уже 99,9% что группа как-то неправильно сохраняется.
ну тогда проверяй в таймере что она !=null
Старый 18.04.2010, 17:52
krosaf4eg

offline
Опыт: 1,859
Активность:
ничего не глючит
один цикл продвижения работает. потом не работает потому что двинув одного юнита ты исключаешь его из группы:
 call GroupRemoveUnit(g, eu)
поэтому после того как в первом срабатывании таймера ты их двинул на 2.5, в группе не остается юнитов
А потом ты ее вообще удаляешь.
Заметь что когда ты создал локалку ты именно записал в нее группу их хэш-таблицы, а не скопировал ее оттуда, поэтому все что ты проделываешь с переменной g, ты проделываешь и с сохраненной группой потому что это одна и та же группа.
Старый 18.04.2010, 18:22
StoneHeartis
Kicked by ScorpioT1002
offline
Опыт: 1,009
Активность:
Всем спасибо, тему офф.
Старый 18.04.2010, 21:16
Ответ

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

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

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

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



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