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

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

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

offline
Опыт: 465
Активность:
А в синематик отдельную музыку можно добавить? И никто не знает где можно достать музыку из Диабло-1? Там очень классная атмосфера благодоря именно озвучки. Охота её в карту затолкать.
Старый 22.02.2007, 14:49
DioD

offline
Опыт: 45,134
Активность:
там был кривой формат, вроде как даже миди, к сожалению где можно достать столь древнее творение мне неизвестно.
синематик...
скорее можно включать\запустить некий звук на время синематика.
Старый 22.02.2007, 17:13
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Я всё сделал на ГУИ, потом перевёл в CustomText и подредактировал: вместо глобалок - локалки, подредактировал условие, сделал ремув объектов.
Скажите кто-н, я правильно условие на джаззе сделал?
Старый 22.02.2007, 18:01
DioD

offline
Опыт: 45,134
Активность:
а где код?
Старый 22.02.2007, 18:04
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Код выше. Ну, ладно, напишу ещё раз тут.
» Mix Items
Код:
function Trig_Mix_Conditions takes nothing returns boolean
    if UnitHasItemOfTypeBJ(GetTriggerUnit(), 'texp') == true
    endif
    if UnitHasItemOfTypeBJ(GetTriggerUnit(), 'skrt') == true
    endif
    return true
endfunction

function Trig_Mix_Actions takes nothing returns nothing
    local unit u
    local effect se
    local item array itm
    set u = GetTriggerUnit()
    set itm[1] = GetItemOfTypeFromUnitBJ(u,'texp')
    set itm[2] = GetItemOfTypeFromUnitBJ(u,'skrt')
    call RemoveItem(itm[1])
    call RemoveItem(itm[2])
    call UnitAddItemByIdSwapped('kybl',u)
    call AddSpecialEffectTargetUnitBJ("overhead",u,"Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl")
    set se = GetLastCreatedEffectBJ()
    destroy se
endfunction

//===========================================================================
function InitTrig_Mix takes nothing returns nothing
    set gg_trg_Mix = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Mix, EVENT_PLAYER_UNIT_PICKUP_ITEM )
    call TriggerAddCondition( gg_trg_Mix, Condition( function Trig_Mix_Conditions ) )
    call TriggerAddAction( gg_trg_Mix, function Trig_Mix_Actions )
endfunction
Старый 22.02.2007, 18:07
DioD

offline
Опыт: 45,134
Активность:
дело в том что твой код имеет синтаксические ошибки, это лечиться его переработкой и удалением самодеятельности

Код:
function Trig_Mix_Conditions takes nothing returns boolean
    if UnitHasItemOfTypeBJ(GetTriggerUnit(), 'texp') == true then
    endif
    if UnitHasItemOfTypeBJ(GetTriggerUnit(), 'skrt') == true then
    endif
    return true
endfunction

function Trig_Mix_Actions takes nothing returns nothing
    local unit u
    local effect se
    local item array itm
    set u = GetTriggerUnit()
    set itm[1] = GetItemOfTypeFromUnitBJ(u,'texp')
    set itm[2] = GetItemOfTypeFromUnitBJ(u,'skrt')
    call RemoveItem(itm[1])
    call RemoveItem(itm[2])
    call UnitAddItemByIdSwapped('kybl',u)
    call AddSpecialEffectTargetUnitBJ("overhead",u,"Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl")
    set se = GetLastCreatedEffectBJ()
    destroy se Это вообще что такое?
endfunction

//===========================================================================
function InitTrig_Mix takes nothing returns nothing
    set gg_trg_Mix = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Mix, EVENT_PLAYER_UNIT_PICKUP_ITEM )
    call TriggerAddCondition( gg_trg_Mix, Condition( function Trig_Mix_Conditions ) )
    call TriggerAddAction( gg_trg_Mix, function Trig_Mix_Actions )
endfunction
Старый 22.02.2007, 18:17
dk

offline
Опыт: 60,293
Активность:
Это наверное имелось ввиду уничтожение спецэффекта. Как много бж...
Старый 22.02.2007, 18:26
adic3x

offline
Опыт: 108,439
Активность:
Думаю
Код:
local unit u=GetTriggerUnit()
 if UnitHasItemOfTypeBJ(GetTriggerUnit(),'texp') and UnitHasItemOfTypeBJ(GetTriggerUnit(),'skrt') then
  call RemoveItem(GetItemOfTypeFromUnitBJ(u,'texp'))
  call RemoveItem(GetItemOfTypeFromUnitBJ(u,'sktr'))
  call UnitAddItemByIdSwapped('kybl',u)
  cacc RemoveEffect(AddSpecialEffectTargetUnitBJ("overhead",u,"Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl")
 endif
 set u-null
Старый 22.02.2007, 19:40
NETRAT

offline
Опыт: 83,712
Активность:
Меня всегда мучал вопрос - как выглядит хорошее удаление юнитов после смерти (подчистка хендлей), ведь следует учитывать возможность применения трупов для определенных целей (будь то воскрешение, ревайв или труповозка или каннибализм или еще чего) ?
Старый 24.02.2007, 14:40
DioD

offline
Опыт: 45,134
Активность:
Тебе повезло, я делал такую весчь и сейчас выложу её.

Код:
//                                                                                               //
function CleanUp_Condition takes nothing returns boolean                                         //
    return IsUnitType(GetTriggerUnit(),UNIT_TYPE_HERO) != true                                   //
endfunction                                                                                      //
//                                                                                               //
//                                                                                               //
function CleanUp_Child takes nothing returns nothing                                             //
    local integer Slot_I_1 = ForGetSDA(GetTriggeringTrigger(),2)                                 //
    local string Strt_S_1 = "Abilities\\Spells\\Orc\\MirrorImage\\MirrorImageDeathCaster.mdl"    //
    local real CooX_R_1   = GetUnitX(udg_LH_Units[Slot_I_1])                                     //
    //                                                                                           //
    if udg_LH_Logic[Slot_I_1] == FALSE then                                                      //
        //                                                                                       //
        if GetUnitState(udg_LH_Units[Slot_I_1],UNIT_STATE_MAX_LIFE) == 0 then                    //
            call ForCleanSDA(Slot_I_1)                                                           //
            return                                                                               //
        endif                                                                                    //
        //                                                                                       //
        if GetUnitState(udg_LH_Units[Slot_I_1],UNIT_STATE_LIFE) != 0 then                        //
            call ForCleanSDA(Slot_I_1)                                                           //
            return                                                                               //
        endif                                                                                    //
        //                                                                                       //
        if IsUnitLoaded(udg_LH_Units[Slot_I_1]) == TRUE then                                     //
            return                                                                               //
        endif                                                                                    //
        //                                                                                       //
        set udg_LH_Logic[Slot_I_1] = TRUE                                                        //
        //                                                                                       //
        return                                                                                   //
    endif                                                                                        //
    //                                                                                           //
    if GetUnitState(udg_LH_Units[Slot_I_1],UNIT_STATE_MAX_LIFE) == 0 then                        //
        call ForCleanSDA(Slot_I_1)                                                               //
        return                                                                                   //
    endif                                                                                        //
    //                                                                                           //
    if GetUnitState(udg_LH_Units[Slot_I_1],UNIT_STATE_LIFE) != 0 then                            //
        call ForCleanSDA(Slot_I_1)                                                               //
        return                                                                                   //
    endif                                                                                        //
    //                                                                                           //
    if IsUnitLoaded(udg_LH_Units[Slot_I_1]) == true then                                         //
        return                                                                                   //
    endif                                                                                        //
    //                                                                                           //
    call FX_Timed_Loc(2,Strt_S_1,CooX_R_1,GetUnitY(udg_LH_Units[Slot_I_1]))                      //
    call RemoveUnit(udg_LH_Units[Slot_I_1])                                                      //
    call ForCleanSDA(Slot_I_1)                                                                   //
    set Strt_S_1 = ""                                                                            //
endfunction                                                                                      //
//                                                                                               //
//                                                                                               //
function CleanUp_Action takes nothing returns nothing                                            //
    local integer Slot_I_1 = ForSetSDA(2)                                                        //
    call Register(Slot_I_1,36,function CleanUp_Child)                                            //
    call TriggerRegisterTimerEvent(udg_LH_Events  [Slot_I_1],1,false)                            //
    set udg_LH_Units[Slot_I_1] = GetDyingUnit()                                                  //
endfunction                                                                                      //
//                                                                                               //
//                                                                                               //
function InitTrig_CleanUp takes nothing returns nothing                                          //
    set gg_trg_CleanUp = CreateTrigger(  )                                                       //
    call RegisterUnitEvent  ( gg_trg_CleanUp, EVENT_PLAYER_UNIT_DEATH )                          //
    call TriggerAddCondition( gg_trg_CleanUp, Condition( function CleanUp_Condition ) )          //
    call TriggerAddAction   ( gg_trg_CleanUp, function CleanUp_Action )                          //
endfunction                                                                                      //
//                                                                                               //


Так как переделать это для того что бы работало без лешнего займёт некоторое время, я разъясню алгоритм действия.

1) Событие юнит умер - это понятно
2) Базове условие проверяет не умер ли герой, это важно так как героев удалять не стоит.

Вот действие состоит из двух поддействий, это необходимо для сбережения памяти, если юнит был убит артилерией он более не существует в игре, поэтому первый запуск произойдёт через 1 секунду после смерти.
Второй запуск будет произойдёт через 36 секунд, это уже непосредственно удаление юнита из памяти.

Код:
if udg_LH_Logic[Slot_I_1] == FALSE then

это определяет первый запуск, что произойдёт через 1 секунду после смерти юнита.

Если макс здоровье юнита равно нулю, значит юнит не существует, очищаем записи массивов.
и прерываем действие.
Тоже самое если юнит жив.
Если юнит в транспорте пропускаем запуск.

Юниты с первого запуска не удаляются, второй и последующие повторяют проверки на существование юнита жив ли юнит и загружен ли он в транспорт.

Событие повторяется каждые 36 секунд, то есть это переодическое событие.
Задействованые функции:

Код:
function ForCleanSDA takes integer Slot_I_1 returns nothing                                      //
    //                                                                                           //
    if udg_LH_Events  [Slot_I_1] != null then                                                    //
        call TriggerRemoveAction(udg_LH_Events[Slot_I_1],udg_LH_Actions[Slot_I_1])               //
        call DestroyTrigger(udg_LH_Events[Slot_I_1])                                             //
        set udg_LH_Events  [Slot_I_1] = null                                                     //
        set udg_LH_Actions [Slot_I_1] = null                                                     //
    endif                                                                                        //
    //                                                                                           //
    if udg_LH_Effects [Slot_I_1] != null then                                                    //
        call DestroyEffect(udg_LH_Effects[Slot_I_1])                                             //
        set udg_LH_Effects [Slot_I_1] = null                                                     //
    endif                                                                                        //
    //                                                                                           //
    set udg_LH_Trees   [Slot_I_1] = null                                                         //
    set udg_LH_Logic   [Slot_I_1] = false                                                        //
    set udg_LH_Units   [Slot_I_1] = null                                                         //
endfunction                                                                                      //
//                                                                                               //
//                                                                                               //
function Register takes integer Slot,real Time,code Func returns nothing                         //
    set udg_LH_Events[Slot] = CreateTrigger()                                                    //                                           //
    set udg_LH_Actions[Slot]= TriggerAddAction(udg_LH_Events [Slot],Func)                        //                         //
    call TriggerRegisterTimerEvent(udg_LH_Events [Slot],Time,true)                               //
    call Text(H2S(udg_LH_Events[Slot]))
    call Text(H2S(udg_LH_Actions[Slot]))
endfunction                                                                                      //
//                                                                                               //


Зачем массивы?
Всё просто удалённые юниты будут терятся если не сохранять их в массив.

Отредактировано DioD, 24.02.2007 в 15:08.
Старый 24.02.2007, 14:46
DioD

offline
Опыт: 45,134
Активность:
всё работает и ревайв и труповозки и остальное, если труп занят он не удалится
Старый 25.02.2007, 17:31
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Цитата:
много обычних перемен или 2-3 массива

Лучше локалки.

Цитата:
Когда я переношу триг...

Может, ты забываешь CustomCode переносить?

Цитата:
В доте они как оптимизировали триг, а то так бистро грузится?

Не понял вопроса. Ты спрашиваешь, как они сделали, что быстро грузится? Для этого есть специальные проги, но не только прогами, а надо ещё и ручками.

Цитата:
Кстати идея создать тему

Это будет паравоз и топег быстро накроеца!
Старый 25.02.2007, 17:53
DioD

offline
Опыт: 45,134
Активность:
display text to player выбирай номер триггеринг игрока и пиши ему...
что сложного то?
Старый 01.03.2007, 18:57
adic3x

offline
Опыт: 108,439
Активность:
matrix, это все есть в редакторе тригеров, смотри внимательней.

ADOLF добавил:
Цитата:
call IssuePointOrder(CreateUnit(p,'Hpal',x,y,f),"s",x,y)


Замени х и у на цифры (координаты) и f (файсинг), "s" - к примеру на "move", р на Player(0)
Старый 02.03.2007, 14:23
adic3x

offline
Опыт: 108,439
Активность:
JassCraft.
Думаю тебе стоит почитать статью Сергея.
Старый 02.03.2007, 14:35
J
expert
offline
Опыт: 48,447
Активность:
я юзаю Jasscraft имхо он на много удобнее...
Старый 02.03.2007, 14:40
p01nTT

offline
Опыт: 11,160
Активность:
Jasscraft рулит, имхо лучше чем просто писать
ГУИ Фтопку!!!
Старый 02.03.2007, 15:03
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
А я юзаю GUI, перевожу в jass, исправляю. +Jasscraft
Старый 02.03.2007, 20:33
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
А я юзаю GUI, перевожу в jass, исправляю

это не тру...
Старый 02.03.2007, 20:40
DioD

offline
Опыт: 45,134
Активность:
тру
Старый 02.03.2007, 23:06
Закрытая тема

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

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

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

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



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