Вообщем начну как всегда из далека, кто считает что эта инфа не нужна, сразу читайте следующий абзац.
Итак попросил одного грамотного человека в 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, Кондишены у тебя это гуи конверт, у меня тоже кровь чутка пошла
Вот ознакомься, где вкратце то надо узнать мб условие какое-то не работает
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
32
3 года назад
2
David David, Кондишены у тебя это гуи конверт, у меня тоже кровь чутка пошла
Вот ознакомься, где вкратце то надо узнать мб условие какое-то не работает
Принятый ответ
1
3
3 года назад
1
Bergi_Bear:
David David, Кондишены у тебя это гуи конверт, у меня тоже кровь чутка пошла
Вот ознакомься, где вкратце то надо узнать мб условие какое-то не работает
как всегда лучший, спасибо.
1
22
3 года назад
Отредактирован PROSHELDOTU
1
прекол в том, что там всё работает
Сейчас создал на 1.26 карту новую, пихнул туда это
Подставил в значение область и юнитов
И всё чётка

David David, Кондишены у тебя это гуи конверт, у меня тоже кровь чутка пошла
потому что то и есть ГУИ триггер, точнее начинался как ГУИ триггер, но суть не меняется
0
32
3 года назад
0
ну во первых код очень гуи, во вторых у тебя неверное событие если курьер летает и умрет над непроходимой местностью, то в инвентаре уже будет пусто. Желательно событие TriggerRegisterDeathEvent на каждого курьера что вошел на карту, + перемещение его на проходимое место, то летуны багуют. И что мешало по нормальному написать что условие что таймер?
0
22
3 года назад
0
quq_CCCP, ну хз, кильнул летающую куру со шмотками над глубокой водой и создалась новая со шмотками
вар 1.31, на 1.26 идти тестить мне уже не кайф
Всё равно он решил, что сам разберётся
0
29
3 года назад
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 это вобще зло и нужно нормально на таймерах/хэштаблицах делать.
0
32
3 года назад
0
NazarPunk:
Код там правильный, как то не странно, даже не смотря на такой вид и слип, проблема в том что курьер разлагается и больше GetUnitTypeId(d) уже не передаётся, проблема с передачей id уже решилась, а вот с тоже самое с предметами, они удаляются при разложении летуна, поэтому нужно передать также ID предметов, а не сами предметы
0
29
3 года назад
0
Bergi_Bear, Так установить время разложения летуна в 100500 и ручками удалять.

Код там правильный
Зато мой вариант читабельней)
0
32
3 года назад
Отредактирован Берги
0
Так установить время разложения летуна в 100500 и ручками удалять.
Где??? даже смена типа на разлагаемый не помогла, в константах все значения выше 30 сек, кроме разложения плоти, но это полюбому не то
В РО я чёт не помню такого параметра как "разложение юнита"
0
29
3 года назад
0
Где???
Здесь я помню делал разложение в ноль, чтоб сразу исчезали. А так да, проще сохранить предметы и количество зарядов в таблицу и тупо пересоздавать.

Или можно проще, сразу создавать нового курьера, передавать ему вещи и хайдить.
0
32
3 года назад
0
Или можно проще, сразу создавать нового курьера, передавать ему вещи и хайдить.
да тут вариантов решения очень много
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.