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

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

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

offline
Опыт: 5,084
Активность:
Оптимизация триггера
Помогите оптимизировать функцию.
Код:
function Trig_StopMan_Conditions takes nothing returns boolean
    return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true 
endfunction

function Trig_StopMan_Actions takes nothing returns nothing
    local effect se = AddSpecialEffectLoc("Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl", GetUnitLoc(gg_unit_nbel_0254))
    local integer i = 0
    local trigger t = bj_cineSceneBeingSkipped
    local quest q = bj_lastCreatedQuest
    call ForceCinematicSubtitles( true )
    if (t == null) then
        set t = CreateTrigger()
        loop
            call TriggerRegisterPlayerEvent(t, Player(i), EVENT_PLAYER_END_CINEMATIC)
            set i = i + 1
            exitwhen i == 8
        endloop
        call TriggerAddAction(t, function CancelCineSceneBJ)
    endif
    if (IsPlayerInForce(GetLocalPlayer(), GetForceOfPlayer(GetOwningPlayer(GetTriggerUnit())))) then
        call SetCinematicScene (GetUnitTypeId(gg_unit_nbel_0254), GetPlayerColor(GetOwningPlayer(gg_unit_nbel_0254)), "TRIGSTR_125", "TRIGSTR_126", 6.50, 5.00)
        if ( not (IsUnitHidden(gg_unit_nbel_0254))) then
            call UnitAddIndicator(gg_unit_nbel_0254, 255, 255, 255, 255)
        endif
    endif
    call TriggerWaitForSound(null,0)
    call TriggerSleepAction(5.00)
    //call TransmissionFromUnitWithNameBJ( GetForceOfPlayer(GetOwningPlayer(GetTriggerUnit())), gg_unit_nbel_0254, "TRIGSTR_125", null, "TRIGSTR_126", bj_TIMETYPE_ADD, 5.00, true )
    call TriggerSleepAction( 5.00 )
    call QuestSetTitle(q, "TRIGSTR_186")
    call QuestSetDescription(q, "TRIGSTR_241")
    call QuestSetIconPath(q, "ReplaceableTextures\\CommandButtons\\BTNDefend.blp")
    call QuestSetDiscovered(q, true)
    call QuestSetRequired(q, false)
    call QuestSetCompleted(q, false)
    //call CreateQuestBJ( bj_QUESTTYPE_OPT_DISCOVERED, "TRIGSTR_186", "TRIGSTR_241", "ReplaceableTextures\\CommandButtons\\BTNDefend.blp" )
    set udg_Quest[16] = q
    if (IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS)) then
        call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 20, " ")
        call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 20, "TRIGSTR_290")
        call StartSound(null)
        call FlashQuestDialogButton()
    endif
    //call QuestMessageBJ( GetPlayersAll(), bj_QUESTMESSAGE_DISCOVERED, "TRIGSTR_290" )
    call EnableTrigger( gg_trg_Died_Ghnol )
    if (IsUnitType(gg_unit_ngnv_0289, UNIT_TYPE_HERO) and (GetUnitState(gg_unit_ngnv_0289, UNIT_STATE_LIFE) <= 0)) then
        return
    endif
    call ShowUnit(gg_unit_ngnv_0289, true)
    set se = null
    set t = null
    set q = null
endfunction

//===========================================================================
function InitTrig_StopMan takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterEnterRectSimple(t, gg_rct________________255)
    call TriggerAddCondition( gg_trg_StopMan, Condition( function Trig_StopMan_Conditions ) )
    call TriggerAddAction( gg_trg_StopMan, function Trig_StopMan_Actions )
    set t = null
endfunction

Отредактировано Daemonik, 02.07.2009 в 19:59.
Старый 01.07.2009, 18:30
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Код:
function Trig_StopMan_Conditions takes nothing returns boolean
    if ( not ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true ) ) then
        return false
    endif
    return true
endfunction
в это
Код:
function Trig_StopMan_Conditions takes nothing returns boolean
return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true
endfunction
Старый 02.07.2009, 19:33
Daemonik

offline
Опыт: 5,084
Активность:
Ну это уже сделал. Просто забыл сюда запихнуть.
А что насчет самого кода. Это все??
Старый 02.07.2009, 19:34
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Daemonik нет, это точно не все... у меня просто нет щяс времени. НО это точно не все! У тебя много BJ функций... это прочитай а потом это
Старый 02.07.2009, 19:37
Чебурашка

offline
Опыт: 5,460
Активность:
Цитата:
Сообщение от Bee
Код:
function Trig_StopMan_Conditions takes nothing returns boolean
    if ( not ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true ) ) then
        return false
    endif
    return true
endfunction
в это
Код:
function Trig_StopMan_Conditions takes nothing returns boolean
return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true
endfunction

точнее в
Код:
function Trig_StopMan_Conditions takes nothing returns boolean
return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) 
endfunction
Старый 02.07.2009, 19:54
Daemonik

offline
Опыт: 5,084
Активность:
Ну BJ у меня только 3, но я понятия не имею как от них избавиться((

GetForceOfPlayer
TriggerRegisterEnterRectSimple
CancelCineSceneBJ

Daemonik добавил:
Цитата:
Код:
function Trig_StopMan_Conditions takes nothing returns boolean
return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) 
endfunction

А разве условие не должно проверить. Тру это или фолс?
Старый 02.07.2009, 19:59
JimALIEN
вдупляет sc2 editor
offline
Опыт: 6,976
Активность:
Эта функция ничего не проверяет, она сразу возвращает тру или фалс

Код:
local effect se = AddSpecialEffectLoc("Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl", GetUnitLoc(gg_unit_nbel_0254))
утечка - локация, делаем так:
Код:
local location loc = GetUnitLoc(gg_unit_nbel_0254)
local effect se = AddSpecialEffectLoc("Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl", loc)

ну и в конце функции ставим
Код:
call RemoveLocation(loc)
call DestroyEffect(se)
set loc = null
set se = null

а так вроде бы даж нормально, хз...
Старый 02.07.2009, 20:19
Daemonik

offline
Опыт: 5,084
Активность:
У меня тут вообще уже другое стоит)
Я ошибся там надо было создать над юнитом.
Кстати я тут покопался в common.j
Стоит ли константы конвертировать в интеджер, совать в локалку и потом обнулять?
Старый 02.07.2009, 20:30
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Daemonik Какие константы? какой интежер? интежеры не надо обнулять
Старый 02.07.2009, 20:37
Daemonik

offline
Опыт: 5,084
Активность:
Ну к примеру вот такие константы.
EVENT_PLAYER_END_CINEMATIC = ConvertPlayerEvent(17)

Daemonik добавил:
Признаю свою ошибку..
Это наоборот из интежер в ивент
Тогда вот так
Код:
local playerevent e = ConvertPlayerEvent(17)
...
call TriggerRegisterPlayerEvent(t, Player(i), e)
...
set e = null


Daemonik добавил:
Ну в общем сделал вот так
Код:
function Trig_StopMan_Conditions takes nothing returns boolean
    return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO)
endfunction

function Trig_StopMan_Actions takes nothing returns nothing
    local effect se = AddSpecialEffectTarget("Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl", gg_unit_nbel_0254, "overhead")
    local integer i = 0
    local trigger t = bj_cineSceneBeingSkipped
    local quest q = bj_lastCreatedQuest
    local playerevent e = ConvertPlayerEvent(17)
    call ForceCinematicSubtitles( true )
    if (t == null) then
        set t = CreateTrigger()
        loop
            call TriggerRegisterPlayerEvent(t, Player(i), e)
            set i = i + 1
            exitwhen i == 8
        endloop
        call TriggerAddAction(t, function CancelCineSceneBJ)
    endif
    if (IsPlayerInForce(GetLocalPlayer(), GetForceOfPlayer(GetOwningPlayer(GetTriggerUnit())))) then
        call SetCinematicScene (GetUnitTypeId(gg_unit_nbel_0254), GetPlayerColor(GetOwningPlayer(gg_unit_nbel_0254)), "Охранник ворот", "Стой! Ты неможешь войти в империю! Но если ты докажешь свою преданность нам, убив гнола-надзирателя и спася имперскую волшебницу я впущу тебя!", 6.50, 5.00)
        if ( not (IsUnitHidden(gg_unit_nbel_0254))) then
            call UnitAddIndicator(gg_unit_nbel_0254, 255, 255, 255, 255)
        endif
    endif
    call TriggerWaitForSound(null,0)
    call TriggerSleepAction(5.00)
    //call TransmissionFromUnitWithNameBJ( GetForceOfPlayer(GetOwningPlayer(GetTriggerUnit())), gg_unit_nbel_0254, "TRIGSTR_125", null, "TRIGSTR_126", bj_TIMETYPE_ADD, 5.00, true )
    call TriggerSleepAction( 5.00 )
    call QuestSetTitle(q, "Ворота!")
    call QuestSetDescription(q, "Ваша задача: Убить гнола-надзирателя, тем самым спася имперскую волшебницу. Местонахождение: Побережье реки стикс.")
    call QuestSetIconPath(q, "ReplaceableTextures\\CommandButtons\\BTNDefend.blp")
    call QuestSetDiscovered(q, true)
    call QuestSetRequired(q, false)
    call QuestSetCompleted(q, false)
    //call CreateQuestBJ( bj_QUESTTYPE_OPT_DISCOVERED, "TRIGSTR_186", "TRIGSTR_241", "ReplaceableTextures\\CommandButtons\\BTNDefend.blp" )
    set udg_Quest[16] = q
    if (IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS)) then
        call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 20, " ")
        call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 20, "Задание получено")
        call StartSound(null)
        call FlashQuestDialogButton()
    endif
    //call QuestMessageBJ( GetPlayersAll(), bj_QUESTMESSAGE_DISCOVERED, "TRIGSTR_290" )
    call EnableTrigger( gg_trg_Died_Ghnol )
    if (IsUnitType(gg_unit_ngnv_0289, UNIT_TYPE_HERO) and (GetUnitState(gg_unit_ngnv_0289, UNIT_STATE_LIFE) <= 0)) then
        return
    endif
    call ShowUnit(gg_unit_ngnv_0289, true)
    call DestroyEffect(se)
    call DisableTrigger(GetTriggeringTrigger())
    set se = null
    set i = 0
    set t = null
    set q = null
    set e = null
endfunction

//===========================================================================
function InitTrig_StopMan takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterEnterRectSimple(t, gg_rct________________255)
    call TriggerAddCondition( t, Condition( function Trig_StopMan_Conditions ) )
    call TriggerAddAction( t, function Trig_StopMan_Actions )
    set t = null
endfunction

И все же как мне от этого избавиться
CancelCineSceneBJ
GetForceOfPlayer
TriggerRegisterEnterRectSimple
Старый 02.07.2009, 20:46
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Daemonik У тя JNGP стоит? Если да то нажми кнопку сверху окна, где пишутся тригеры, и найди там эти функции, там показывается что находится внутри етой функции и соответсвенно уже пиши вместо BJ, ту функцию которая находится внутри BJ
Старый 02.07.2009, 21:00
Daemonik

offline
Опыт: 5,084
Активность:
Я смотрел. Проблема в том что они в коде так стоят что у меня не получается их изменить.
Код:
function TriggerRegisterEnterRectSimple takes trigger trig, rect r returns event
    local region rectRegion = CreateRegion()
    call RegionAddRect(rectRegion, r)
    return TriggerRegisterEnterRegion(trig, rectRegion, null)
endfunction

И если я ее заменю то получится
Код:
function InitTrig_StopMan_Comple takes nothing returns nothing
    local trigger t = CreateTrigger()
    local region rectRegion = CreateRegion()
    call RegionAddRect(r, gg_rct________________255)
    return TriggerRegisterEnterRegion(t, r, null)
    call TriggerAddCondition( t, Condition( function Trig_StopMan_Comple_Conditions ) )
    call TriggerAddAction( t, function Trig_StopMan_Comple_Actions )
    set t = null
endfunction


И из-за ретурна не работает.
Остальные находятся внутри другой функции(
А вообще без JNGP мне в джассе делать нечего))

Daemonik добавил:
Кстати хотел спросить из меня толк может выйти?)))
Сорри за оффтоп.
Старый 02.07.2009, 21:12
J
expert
offline
Опыт: 48,747
Активность:
Код:
function InitTrig_StopMan_Comple takes nothing returns nothing
    local trigger t = CreateTrigger()
    local region rectRegion = CreateRegion()
    call RegionAddRect(r, gg_rct________________255)
    call TriggerRegisterEnterRegion(t, r, null)
    call TriggerAddCondition( t, Condition( function Trig_StopMan_Comple_Conditions ) )
    call TriggerAddAction( t, function Trig_StopMan_Comple_Actions )
    set t = null
    set rectRegion = null
endfunction
Старый 02.07.2009, 21:13
Daemonik

offline
Опыт: 5,084
Активность:
Ясно, спасибо а что с этим тогда делать?
Код:
call TriggerAddAction(t, function CancelCineSceneBJ)

if (IsPlayerInForce(GetLocalPlayer(), GetForceOfPlayer(GetOwningPlayer(GetTriggerUnit())))) then
Старый 02.07.2009, 21:26
J
expert
offline
Опыт: 48,747
Активность:
Код:
if (IsPlayerInForce(GetLocalPlayer(), GetForceOfPlayer(GetOwningPlayer(GetTriggerUnit())))) then
равносильна этому
Код:
if GetOwningPlayer(GetTriggerUnit()) == GetLocalPlayer() then
Старый 02.07.2009, 21:30
Daemonik

offline
Опыт: 5,084
Активность:
А с первой ничего нельзя сделать?
Старый 02.07.2009, 22:20
J
expert
offline
Опыт: 48,747
Активность:
я бы некоторые функции не раскрывал, предел нужно знать, чтобы в функции не было всякого мусора для этой функции не предназначенного, это уже регулируется интуицией
Старый 02.07.2009, 22:52
Daemonik

offline
Опыт: 5,084
Активность:
В общем для этого нужна практика.
Ну через полгода придет))
Старый 02.07.2009, 23:26
Закрытая тема

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

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

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

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



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