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

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

Закрытая тема
 
SkiL

offline
Опыт: 9,321
Активность:
Хэш и таймер
» код

function reatack takes nothing returns nothing
    local timer t=GetExpiredTimer()
    local unit u=LoadUnitHandle(udg_hash, GetHandleId(t),1)
    call DisplayTextToForce( GetPlayersAll(), ( GetPlayerName(GetOwningPlayer((u))) + " Может атаковать!" ) )
    call SaveBooleanBJ( false, 6, GetHandleId((u)), udg_hash )
    call IssueTargetOrderById( (u), OrderId("smart"), LoadUnitHandleBJ(5, GetHandleId((u)), udg_hash) )
endfunction


function Trig_atack_jass_Actions takes nothing returns nothing
             local unit u = GetOrderedUnit()
             local unit u1 = GetOrderTargetUnit()
             local timer t=CreateTimer()
    if GetIssuedOrderIdBJ() == String2OrderIdBJ("smart") then
            call DisplayTextToForce( GetPlayersAll(), ( GetPlayerName(GetOwningPlayer((u))) + " атакует! ") ) 
    if  LoadBooleanBJ(6, GetHandleId (u), udg_hash) == false then
            call IssueImmediateOrder((u), "stop" )
            call SaveBooleanBJ( true, 6, GetHandleId((u)), udg_hash )
            call DisplayTextToForce( GetPlayersAll(), ( GetPlayerName(GetOwningPlayer((u))) + ( " Наносит" + ( R2S(LoadRealBJ(3, GetHandleId(u), udg_hash)) + " единиц урона!" ) ) ) )
            call SaveUnitHandle( udg_hash, (GetHandleId(t)), 1, (u))
            call UnitDamageTargetBJ((u), (u1), ( ( LoadRealBJ(3, GetHandleId((u)), udg_hash) )), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
            call SaveUnitHandleBJ( (u1), 5, GetHandleId((u)), udg_hash )
            call SetUnitAnimation((u), "attack" )
            call TimerStart(t, LoadRealBJ(2,GetHandleId((u)), udg_hash ), false, function reatack)
    else
            call DisplayTextToForce( GetPlayersAll(), "Вы ещё не собрались с силами для удара" )
    endif
    endif
endfunction


function Trig_ini_Func003A takes nothing returns nothing
    call SaveUnitHandleBJ( GetEnumUnit(), 1, GetHandleId(GetEnumUnit()), udg_hash )
    call SaveReal( udg_hash, 2, GetHandleId(GetEnumUnit()), 1.00)
    call SaveReal( udg_hash, 3, GetHandleId(GetEnumUnit()), 15.00)
    call SaveReal( udg_hash, 4, GetHandleId(GetEnumUnit()), 200.00)
    call SaveBooleanBJ( false, 6, GetHandleId(GetEnumUnit()), udg_hash )
    call DisplayTextToForce( GetPlayersAll(), R2S(LoadRealBJ(3, (GetHandleId (GetEnumUnit())), udg_hash)) )
endfunction

function Trig_ini_Actions takes nothing returns nothing
    call InitHashtableBJ(  )
    set udg_hash = GetLastCreatedHashtableBJ()
    call ForGroupBJ( GetUnitsInRectAll(GetPlayableMapRect()), function Trig_ini_Func003A )
    call SetTimeOfDay( 12 )
endfunction

//===========================================================================
function InitTrig_ini takes nothing returns nothing
    set gg_trg_ini = CreateTrigger(  )
    call TriggerRegisterTimerEventSingle( gg_trg_ini, 0.01 )
    call TriggerAddAction( gg_trg_ini, function Trig_ini_Actions )
endfunction


//===========================================================================
function InitTrig_atack_jass takes nothing returns nothing
    set gg_trg_atack_jass = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_atack_jass, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
    call TriggerAddAction( gg_trg_atack_jass, function Trig_atack_jass_Actions )
endfunction

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

Отредактировано SkiL, 23.03.2011 в 17:11.
Старый 19.03.2011, 20:16
Doc

offline
Опыт: 63,163
Активность:
function Trig_ini_Func003A takes nothing returns nothing
    call SetUnitUserData( GetEnumUnit(), udg_i )
    call SaveUnitHandleBJ( GetEnumUnit(), 1, GetUnitUserData(GetEnumUnit()), udg_hash )
    call SaveRealBJ( 1.70, 2, GetUnitUserData(GetEnumUnit()), udg_hash )
    call SaveRealBJ( 15.00, 3, GetUnitUserData(GetEnumUnit()), udg_hash )
    call SaveRealBJ( 200.00, 4, GetUnitUserData(GetEnumUnit()), udg_hash )
    call SaveBooleanBJ( false, 6, GetUnitUserData(GetEnumUnit()), udg_hash )
    set udg_i = ( udg_i + 1 )
endfunction
чозабред, где GetHandleId? И вообще куча бж.
Старый 19.03.2011, 21:03
SkiL

offline
Опыт: 9,321
Активность:
Doc, ну это как бы после 0.01 секунды после начала игры, все юниты пикаются и им забиваются эти значения, где первый ключ - любая цифра, главное чтоб не повторялось, а второй ключ - его кастом валю, который задаётся ему до этого, переменной i, которая плюсуется после каждого пикнутого. куда здесь пристроить GetHandleId?
Старый 19.03.2011, 21:09
Doc

offline
Опыт: 63,163
Активность:
SkiL, вместо GetUnitUserData(что у тебя является типа уникальным ключом юнита) нужно GetHandleId(что является ун. ключом юнита по умолчанию, зачем изобретать велосипед?)
Старый 19.03.2011, 21:49
SkiL

offline
Опыт: 9,321
Активность:
Doc, спасибо, сейчас попробую, но ведь проблема не в этом была, покрайней мере эти записанные данные спокойно выводились на экран, там именно проблема в чём то другом.
Старый 19.03.2011, 21:51
Doc

offline
Опыт: 63,163
Активность:
SkiL, хз, щас должен прийти ханабиши/ктото добрый и поправить тебе код. Я ошибки не вижу, правда и серьезно разбирать лень. Ах да, больше юзай отладочные сообщенияю.
Старый 19.03.2011, 21:54
SkiL

offline
Опыт: 9,321
Активность:
Изменил первый пост, таки дело пошло, но теперь зависает комп. Дико прошу помощи.
Старый 20.03.2011, 18:05
Hanabishi
COOL STATUS
offline
Опыт: отключен
SkiL, код фиговый, лень даже разбирать для чего он
скажи что он должен делать
Старый 20.03.2011, 18:28
SkiL

offline
Опыт: 9,321
Активность:
Hanabishi, если юнит отдаёт смарт на враждебного юнита, если булеан(записан в хэш на каждого юнита, точнее - первый ключ - 6, второй = хэндл юнита)равен нет - булеан становится "да"цели наносится дамаг, опять же записанный в хэш (3, хэндл) приказывающего юнита в хэш, затем запускается таймер, на него вешается приказывающий юнит. на колбеке таймера - функция reatack, где булеан становится "нет", можно кликать правой кнопкой снова, то есть я тут же отдаю триггерно смарт на цель приказа, которая записывается в хэш . что то типа системы боя.

Отредактировано SkiL, 20.03.2011 в 18:41.
Старый 20.03.2011, 18:35
Doc

offline
Опыт: 63,163
Активность:
хеш проинициализировал?
Старый 22.03.2011, 17:13
DioD

offline
Опыт: 45,134
Активность:
код выкладывай, качать карту ради такого фуфла - бред.


по тому коду что написано - еретик, хеш работает как 2х мерный массив


hash(1-250)[MASTER][SLAVE][VALUE]

запись в одни и теже мастер-слейв ВНЕЗАПНО перезаписывают значения что были там раньше.
Старый 22.03.2011, 17:15
SkiL

offline
Опыт: 9,321
Активность:
так, я нуб и опозорился, понял почему не записывались значения в хэш, я тупо забывал присваивать udg_hash последнюю созданную хэш-таблицу, но в коде который выложен в первом посту - вроде бы всё правльно, но если выводить эти записанные значения на экран - выводит нули, почему?
DioD, и мастер и слэйв должны быть разными? я что не могу взять хэндл айди юнита, в качестве первого ключа, а в качестве второго - числа от 1 до 6, как у меня в коде?
Старый 22.03.2011, 17:32
Doc

offline
Опыт: 63,163
Активность:
SkiL, необязательно разными, можешь.
Старый 22.03.2011, 17:35
SkiL

offline
Опыт: 9,321
Активность:
Doc, так в первом же посте в коде они разные ну вот -
   call SaveUnitHandleBJ( GetEnumUnit(), 1, GetHandleId(GetEnumUnit()), udg_hash )
   call SaveReal( udg_hash, 2, GetHandleId(GetEnumUnit()), 1.00)
   call SaveReal( udg_hash, 3, GetHandleId(GetEnumUnit()), 15.00)
   call SaveReal( udg_hash, 4, GetHandleId(GetEnumUnit()), 200.00)
   call SaveBooleanBJ( false, 6, GetHandleId(GetEnumUnit()), udg_hash )
Старый 22.03.2011, 17:38
Nekit1234007

offline
Опыт: 11,916
Активность:
SkiL, xgm.ru/p/wc3/debugging смотри что куда и как пишется в таблицу.
Старый 22.03.2011, 18:18
SkiL

offline
Опыт: 9,321
Активность:
я так понял таймер запускается с периодом 0.00(я пытался выводить записанные эти значения, получались нули), поэтому падает комп, то есть в хэш таблице одни нули, но ёпт я же записываю.
Старый 22.03.2011, 18:24
JimALIEN
вдупляет sc2 editor
offline
Опыт: 7,176
Активность:
ты каждые 0.01 сек создаеш новую хеш таблицу и забиваеш в нее всех юнитов на карте оО Вар должно быть корчица в агонии и просит пощады... Если уж причина и не в этом, то возможно в том, что когда у тебя заканчивается таймер, хеш-таблица под переменной udg_hash уже не будет той таблицей, которая была при запуске таймера, следовательно под адресом хендла таймера будет все пусто.
Старый 23.03.2011, 01:46
JassMan
свободен
offline
Опыт: 4,193
Активность:
хеш таблицу можно инициализировать максимум 255 раз (или 256, поправьте если ошибаюсь)
Старый 23.03.2011, 06:40
SkiL

offline
Опыт: 9,321
Активность:
JimALIEN, там же не каждые 0.01 секунд, а по истечению с начала игры
call TriggerRegisterTimerEventSingle( gg_trg_ini, 0.01 )
SkiL добавил:
а на колбеке таймера висит функция reatack, она в самом верху кода.
Старый 23.03.2011, 08:15
JimALIEN
вдупляет sc2 editor
offline
Опыт: 7,176
Активность:
а, точн, пардон. Ну тогда особых багов не вижу, разве что InitTrig_reatack_jass необязательно инициализировать тригер, это просто отдельная функция, вызываемая по истечению таймера. Хотя врядли проблема в этом
Старый 23.03.2011, 16:42
Закрытая тема

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

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

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

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



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