Jass возрождение курьера! Хелпаните друзья!
Вообщем начну как всегда из далека, кто считает что эта инфа не нужна, сразу читайте следующий абзац.
Итак попросил одного грамотного человека в Jass, помочь с кодом и написать возрождение курьера с сохранением всех шмоток в нем, писалось на 1.31 и переносилось на 1.26 и короче по итогу, работает все но самого курьера не создает.
Я короче не могу найти проблему, пишу тоже самое на ГУЕ и все работает и создается, вообщем проблем нет. А на джасе не создается.
Вообщем скидываю код, надеюсь тут есть JassБоги, которые одним взглядом найдут ошибку.
function Trig_CourierRespawn_Func022C takes nothing returns boolean
    if ( ( GetUnitTypeId(GetDyingUnit()) == udg_GAME_COURIER_TYPE[1] ) ) then
        return true
    endif
    if ( ( GetUnitTypeId(GetDyingUnit()) == udg_GAME_COURIER_TYPE[2] ) ) then
        return true
    endif
    if ( ( GetUnitTypeId(GetDyingUnit()) == udg_GAME_COURIER_TYPE[3] ) ) then
        return true
    endif
    return false
endfunction

function Trig_CourierRespawn_Conditions takes nothing returns boolean
    if ( not Trig_CourierRespawn_Func022C() ) then
        return false
    endif
    return true
endfunction

function Trig_CourierRespawn_Actions takes nothing returns nothing
    local unit d = GetDyingUnit()
    local player p = GetOwningPlayer(d)
    local integer i
    local item array ITEM
    local timer t = CreateTimer()
    local timerdialog td = CreateTimerDialog(t)
    local integer HNDL = GetHandleId(t)
    set i = 0
    loop
    exitwhen i > 5
    set ITEM[i] = UnitItemInSlot(d, i)
    set i = i + 1
    endloop
    call TimerStart(t, 30.00, false, null)
    call TimerDialogSetTitle(td, "Курьер: ")
    if (GetLocalPlayer() == p) then
        call TimerDialogDisplay(td, true)
    endif
    call TriggerSleepAction( 30.00 )
    set bj_lastCreatedUnit = CreateUnit(p, GetUnitTypeId(d), GetRectCenterX(udg_GAME_RECT_BACKCOUR), GetRectCenterY(udg_GAME_RECT_BACKCOUR), 270.00)
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ReviveHuman\\ReviveHuman.mdl", GetRectCenterX(udg_GAME_RECT_BACKCOUR), GetRectCenterY(udg_GAME_RECT_BACKCOUR)))
    set i = 0
    loop
    exitwhen i > 5
    call UnitAddItemByIdSwapped( GetItemTypeId(ITEM[i]), GetLastCreatedUnit() )
    set i = i + 1
    endloop
    call DestroyTimer(t)
    call DestroyTimerDialog(td)
endfunction

//===========================================================================
function InitTrig_CourierRespawn takes nothing returns nothing
    set gg_trg_CourierRespawn = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_CourierRespawn, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition( gg_trg_CourierRespawn, Condition( function Trig_CourierRespawn_Conditions ) )
    call TriggerAddAction( gg_trg_CourierRespawn, function Trig_CourierRespawn_Actions )
endfunction
function Trig_InitCourier_Actions takes nothing returns nothing
    set udg_GAME_BASE_RECT = gg_rct_Baza
    set udg_GAME_RECT_BACKCOUR = gg_rct_KURA
    set udg_GAME_COURIER_UP_COST[1] = 100
    set udg_GAME_COURIER_UP_COST[2] = 500
    set udg_GAME_BUYER_TYPE = 'H017'
    // --------------------------------------------------
    set udg_GAME_COURIER_TYPE[1] = 'u000'
    set udg_GAME_COURIER_TYPE[2] = 'u00J'
    set udg_GAME_COURIER_TYPE[3] = 'u00A'
    // --------------------------------------------------
    set udg_GAME_COURIER_SPELLS[1] = 'A0EA'
    set udg_GAME_COURIER_SPELLS[2] = 'A0E9'
    set udg_GAME_COURIER_SPELLS[3] = 'S001'
    set udg_GAME_COURIER_SPELLS[4] = 'S002'
endfunction

//===========================================================================
function InitTrig_InitCourier takes nothing returns nothing
    set gg_trg_InitCourier = CreateTrigger(  )
    call TriggerAddAction( gg_trg_InitCourier, function Trig_InitCourier_Actions )
endfunction
Спасибо всем, кто уделит время моему вопросу.

Лучший ответ:
David David, Кондишены у тебя это гуи конверт, у меня тоже кровь чутка пошла
Вот ознакомься, где вкратце то надо узнать мб условие какое-то не работает


Views: 143

» Лучшие комментарии


quq_CCCP #1 - 2 months ago (изм. ) 2
Голосов: +3 / -1
Блин, мои глаза....
warning от : 1.1 (ненормативная лексика)
sLIL MID #3 - 2 months ago (изм. ) 0
Голосов: +0 / -0
quq_CCCP:
..., мои глаза....
что с ними? или это Что с моими глазами? / Почему твоя сука так смотрит? (с) Элджей
Bergi_Bear #5 - 2 months ago 2
Голосов: +2 / -0

David David, Кондишены у тебя это гуи конверт, у меня тоже кровь чутка пошла
Вот ознакомься, где вкратце то надо узнать мб условие какое-то не работает
sLIL MID #6 - 2 months ago 1
Голосов: +1 / -0
Bergi_Bear:
David David, Кондишены у тебя это гуи конверт, у меня тоже кровь чутка пошла
Вот ознакомься, где вкратце то надо узнать мб условие какое-то не работает
как всегда лучший, спасибо.
Proshel_Doty #7 - 2 months ago (изм. ) 1
Голосов: +1 / -0
прекол в том, что там всё работает
Сейчас создал на 1.26 карту новую, пихнул туда это
Подставил в значение область и юнитов
И всё чётка

David David, Кондишены у тебя это гуи конверт, у меня тоже кровь чутка пошла
потому что то и есть ГУИ триггер, точнее начинался как ГУИ триггер, но суть не меняется
quq_CCCP #8 - 2 months ago 0
Голосов: +0 / -0
ну во первых код очень гуи, во вторых у тебя неверное событие если курьер летает и умрет над непроходимой местностью, то в инвентаре уже будет пусто. Желательно событие TriggerRegisterDeathEvent на каждого курьера что вошел на карту, + перемещение его на проходимое место, то летуны багуют. И что мешало по нормальному написать что условие что таймер?
Proshel_Doty #9 - 2 months ago 0
Голосов: +0 / -0
quq_CCCP, ну хз, кильнул летающую куру со шмотками над глубокой водой и создалась новая со шмотками
вар 1.31, на 1.26 идти тестить мне уже не кайф
Всё равно он решил, что сам разберётся
NazarPunk #10 - 2 months ago 0
Голосов: +0 / -0
Итак попросил одного грамотного человека в Jass
Что то я сомневаюсь в его грамотности, скорее всего это гуишник. Грамотный человек бы использовал zinc.
//! zinc
library Courier {
    function onInit() {
        udg_GAME_BASE_RECT = gg_rct_Baza;
        udg_GAME_RECT_BACKCOUR = gg_rct_KURA;
        udg_GAME_COURIER_UP_COST[1] = 100;
        udg_GAME_COURIER_UP_COST[2] = 500;
        udg_GAME_BUYER_TYPE = 'H017';
    
        udg_GAME_COURIER_TYPE[1] = 'u000';
        udg_GAME_COURIER_TYPE[2] = 'u00J';
        udg_GAME_COURIER_TYPE[3] = 'u00A';
    
        udg_GAME_COURIER_SPELLS[1] = 'A0EA';
        udg_GAME_COURIER_SPELLS[2] = 'A0E9';
        udg_GAME_COURIER_SPELLS[3] = 'S001';
        udg_GAME_COURIER_SPELLS[4] = 'S002';

        trigger t = CreateTrigger();

        for (0 <= i < bj_MAX_PLAYER_SLOTS){
            TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_DEATH, null);
        }

        TriggerAddCondition(t, Filter(function() -> boolean {
            return GetUnitTypeId(GetDyingUnit()) == udg_GAME_COURIER_TYPE[1] 
                    || 
                    GetUnitTypeId(GetDyingUnit()) == udg_GAME_COURIER_TYPE[2] 
                    || 
                    GetUnitTypeId(GetDyingUnit()) == udg_GAME_COURIER_TYPE[3];
        }));

        TriggerAddAction( t, function() {
            unit d = GetDyingUnit();
            player p = GetOwningPlayer(d);
            item ITEM[];
            timer t = CreateTimer();
            timerdialog td = CreateTimerDialog(t);
            integer i, HNDL = GetHandleId(t);
            for (0 <= i < 6){
                ITEM[i] = UnitItemInSlot(d, i);
            }
            TimerStart(t, 30.00, false, null);
            TimerDialogSetTitle(td, "Курьер: ");
            if (GetLocalPlayer() == p){
                TimerDialogDisplay(td, true)
            }
            TriggerSleepAction( 30.00 );
            
            unit cu = CreateUnit(p, GetUnitTypeId(d), GetRectCenterX(udg_GAME_RECT_BACKCOUR), GetRectCenterY(udg_GAME_RECT_BACKCOUR), 270.00);
            DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ReviveHuman\\ReviveHuman.mdl", GetRectCenterX(udg_GAME_RECT_BACKCOUR), GetRectCenterY(udg_GAME_RECT_BACKCOUR)));
            
            for (0 <= i < 6){
                UnitAddItemByIdSwapped( GetItemTypeId(ITEM[i]), cu);
            }
            cu = null;
            d = null;
            DestroyTimer(t);
            t = null;
            DestroyTimerDialog(td);
            td = null;
        });

        t = null;    
    }
}
//! endzinc
TriggerSleepAction это вобще зло и нужно нормально на таймерах/хэштаблицах делать.
Bergi_Bear #11 - 2 months ago 0
Голосов: +0 / -0
NazarPunk:
Код там правильный, как то не странно, даже не смотря на такой вид и слип, проблема в том что курьер разлагается и больше GetUnitTypeId(d) уже не передаётся, проблема с передачей id уже решилась, а вот с тоже самое с предметами, они удаляются при разложении летуна, поэтому нужно передать также ID предметов, а не сами предметы
NazarPunk #12 - 2 months ago 0
Голосов: +0 / -0
Bergi_Bear, Так установить время разложения летуна в 100500 и ручками удалять.

Код там правильный
Зато мой вариант читабельней)
Bergi_Bear #13 - 2 months ago (изм. ) 0
Голосов: +0 / -0
Так установить время разложения летуна в 100500 и ручками удалять.
Где??? даже смена типа на разлагаемый не помогла, в константах все значения выше 30 сек, кроме разложения плоти, но это полюбому не то
В РО я чёт не помню такого параметра как "разложение юнита"
NazarPunk #14 - 2 months ago 0
Голосов: +0 / -0
Где???
Здесь я помню делал разложение в ноль, чтоб сразу исчезали. А так да, проще сохранить предметы и количество зарядов в таблицу и тупо пересоздавать.

Или можно проще, сразу создавать нового курьера, передавать ему вещи и хайдить.
Bergi_Bear #15 - 2 months ago 0
Голосов: +0 / -0
Или можно проще, сразу создавать нового курьера, передавать ему вещи и хайдить.
да тут вариантов решения очень много
Proshel_Doty #16 - 2 months ago (изм. ) 0
Голосов: +0 / -0
проблема в том что курьер разлагается
мм так вот в чём дело
ор однако, потому что стандартно разложение идёт 90 сек, а изначальное возрождение куры было заявлено за 10 сек, потом решено увеличить до 30 сек, что то что то вписывается в рамки и естественно всё было норм
Или можно проще, сразу создавать нового курьера, передавать ему вещи и хайдить.
или можно просто юзать этот вариант
но кто ж знал, что в той мапе разложение стоит в нулину, если даже сам автор ничё толком не знает про свою мапу
quq_CCCP #17 - 2 months ago 0
Голосов: +0 / -0
Proshel_Doty, бага то из за разложения что ничего нет известна давно, в доте до сих пор =). Стоит курьеру сдохнуть над непроходимым местом (именно рельефом, а не деструктаблами, склон или еще чего ).
Proshel_Doty #18 - 2 months ago 0
Голосов: +0 / -0
quq_CCCP, при чём тут разложение и непроходимый рельеф?
quq_CCCP #19 - 2 months ago 0
Голосов: +0 / -0
Proshel_Doty, ну попробуй курьеру вручить перерождение и умереть над рельефом, оно не сработает. Вещи выпадут или пропадут. И посрать какое там у тебя время разложения, .юнита нет и все!
NazarPunk #20 - 2 months ago 0
Голосов: +0 / -0
Стоит курьеру сдохнуть над непроходимым местом (именно рельефом, а не деструктаблами, склон или еще чего ).
А если ему перерождение выдать?
Proshel_Doty #21 - 2 months ago (изм. ) 0
Голосов: +0 / -0
quq_CCCP, лол тут система вообще не про способность Перерождение здрасте

Мне бы даже в голову не пришло курьеру пихать перерождение
Онли код

А если ему перерождение выдать?
а надо ли вообще юзать стандартные абилки, если заменяется кодом и без геморроя?
Тем более что "перерождение" не героя ваще
quq_CCCP #22 - 2 months ago 0
Голосов: +0 / -0
NazarPunk, оно не срабатывает. Поэтому если у вас курьер летающий или как то может залезть в непроходимое место (SetUnitPathing(u, false) то следует ловить ивент падения хп до нуля и тпшить юнита в проходимое место, тогда все будет.
Proshel_Doty #23 - 2 months ago (изм. ) -1
Голосов: +0 / -1
quq_CCCP, мб просто не юзать перерождение для курьера?)
quq_CCCP #24 - 2 months ago 0
Голосов: +0 / -0
Proshel_Doty, я привел пример что даже оно не пашет, по событию - юниту умерает, он может уже и предметов то не иметь.

Proshel_Doty, хоть бы читал внимательно, от начала до конца
Proshel_Doty #25 - 2 months ago -2
Голосов: +0 / -2
у меня на 1.31 всё пашет