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

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

Закрытая тема
 
Velociraptor
В пространстве и времени
offline
Опыт: 14,801
Активность:
PolledWait
Если в GUI-триггерах функции типа Wait X game-time seconds заменить на CustomScript: call PolledWait ( X ) - просто увидел такой текст в опендоте - станет ли карта работать лучше, в частности в сетевой игре? Или разницы никакой?
Проверил - сам по себе-то такой кастом скрипт работает, интересно с точки зрения оптимальности кода.
Старый 07.12.2010, 05:11
Pray_AD
stay in c++
offline
Опыт: 7,145
Активность:
Polled Wait

function PolledWait takes real duration returns nothing
    local timer t
    local real  timeRemaining

    if (duration > 0) then
        set t = CreateTimer()
        call TimerStart(t, duration, false, null)
        loop
            set timeRemaining = TimerGetRemaining(t)
            exitwhen timeRemaining <= 0

            // If we have a bit of time left, skip past 10% of the remaining
            // duration instead of checking every interval, to minimize the
            // polling on long waits.
            if (timeRemaining > bj_POLLED_WAIT_SKIP_THRESHOLD) then
                call TriggerSleepAction(0.1 * timeRemaining)
            else
                call TriggerSleepAction(bj_POLLED_WAIT_INTERVAL)
            endif
        endloop
        call DestroyTimer(t)
    endif
endfunction

Старый 07.12.2010, 06:57
Arty3ooo
...
offline
Опыт: 3,125
Активность:
Velociraptor:
Если в GUI-триггерах функции типа Wait X game-time seconds заменить на CustomScript: call PolledWait ( X ) - просто увидел такой текст в опендоте - станет ли карта работать лучше, в частности в сетевой игре? Или разницы никакой?
Проверил - сам по себе-то такой кастом скрипт работает, интересно с точки зрения оптимальности кода.
Frog lil noob... карта не станет работать лучше. Вейты для ленивых школо-кидов... В мультиплеере гарантирую калоработу твоих спелов, ивентов и т.д. при использовании этой гадости. Мир спасут только таймеры.
Если только у тебя сингл.. хотя и там рекомендую забыть про вейты в любом их исполнении.
Старый 07.12.2010, 08:43
Velociraptor
В пространстве и времени
offline
Опыт: 14,801
Активность:
Пример бы тогда плз, как с помощью только GUI и Custom Script переписать спелл типа
Событие - unit применяет закл
Условие - закл равняется Добавить Реген
Действия:
Custom script: local unit u
set unit = target unit of ability being cast
add Реген to unit
Custom script: set u = udg_unit
!!! Wait X game-time seconds !!!
Custom script: set udg_unit = u
Remove Реген from unit
Custom script: set u = null
В идеале хотелось бы только выделенное заменить подходящим кастом скриптом, при необходимости можно, конечно, через кастом скрипты же добавить и обнулить локалки. Плз, можно прямо пример кода???
попросту: спелл должен добавлять абилу на какое-то время юниту, потом её с него убирать, утечек, понятное дело, не надлежит быть, мультиинстантность обязательна. Реализовать бы хотелось с помощью ГУИ и кастом скриптов only. Или плз, карту-образец (именно карту, сделать 5 мин. же ) с подобной абилой на JASS, в которой можно будет только менять равкоды абил (добавляемой и кастуемой) и время добавления. Уж с равкодами-то как-нибудь разберусь, а так, боюсь, не слажу...
Старый 07.12.2010, 09:51
JassMan
свободен
offline
Опыт: 4,193
Активность:
Как видно, из того, что привел Pray_AD, ПолледВаит — это кривое использование таймера и sleep'а.
Лучше заменить всё полностью на одни лишь таймеры, и всего-то делов . . .
Старый 07.12.2010, 12:42
Velociraptor
В пространстве и времени
offline
Опыт: 14,801
Активность:
Velociraptor:
Плз, можно прямо пример кода???
Старый 07.12.2010, 20:29
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
на
function Trig_Stil_Franzy_Cast_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A05Y'
endfunction

function StillFrenzyEffect takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u=LoadUnitHandle(udg_AssassinHash,GetHandleId(t),0)
local effect e=LoadEffectHandle(udg_AssassinHash,GetHandleId(t),1)
call UnitRemoveAbility(u,'A0C3')
call UnitRemoveAbility(u,'A0C2')
call DestroyEffect(e)
call FlushChildHashtable(udg_AssassinHash,GetHandleId(t))
call DestroyTimer(t)
set t=null
set u=null
set e=null
endfunction

function Trig_Stil_Franzy_Cast_Actions takes nothing returns nothing
local unit u = GetSpellAbilityUnit()
local effect e = AddSpecialEffectTarget("Abilities\\Spells\\Other\\Incinerate\\IncinerateBuff.mdl", u , "weapon")
local timer t = CreateTimer()
call UnitAddAbility( u, 'A0C2' )
call UnitAddAbility( u, 'A0C3' )
call SaveUnitHandle(udg_AssassinHash,GetHandleId(t),0,u)
call SaveEffectHandle(udg_AssassinHash,GetHandleId(t),1,e)
call TimerStart(t,7,false,function StillFrenzyEffect)
set e = null
set u = null
endfunction

//===========================================================================
function InitTrig_Stil_Franzy_Cast takes nothing returns nothing
    set gg_trg_Stil_Franzy_Cast = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Stil_Franzy_Cast, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Stil_Franzy_Cast, Condition( function Trig_Stil_Franzy_Cast_Conditions ) )
    call TriggerAddAction( gg_trg_Stil_Franzy_Cast, function Trig_Stil_Franzy_Cast_Actions )
endfunction
Старый 07.12.2010, 20:39
MaHBe

offline
Опыт: 5,910
Активность:
16GB:
local timer t = CreateTimer()
не обнулил
Старый 07.12.2010, 21:18
ARHUI

offline
Опыт: 3,341
Активность:
Я что то не понял, разве TriggerSleepAction() не является единственным доступным способом "подождать" ? Если нет, то что делать с таймерами, они идут независимо от выполнения функции так что единственный способ с таймером это проверять в цикле закончился он или нет, чтобы не зависло всё надо разгружать систему останавливая функцию на время, а как это сделать без TriggerSleepAction()? Просто сам не в восторге от TriggerSleepAction(), исходя из названия тормозит триггер, если в теле триггера поставить цикл обращающийся к другой функции в которой написано TriggerSleepAction() то получаются весёлые результаты)))
Старый 08.12.2010, 01:00
ScorpioT1000
Работаем
offline
Опыт: отключен
там утечка, юзайте вейт, в целом это почти ничего не меняет -.-
Старый 08.12.2010, 01:03
ARHUI

offline
Опыт: 3,341
Активность:
ScorpioT1000, всмысле PolledWait()?
Старый 08.12.2010, 01:06
ScorpioT1000
Работаем
offline
Опыт: отключен
Старый 08.12.2010, 01:09
MyRtZ

offline
Опыт: 6,530
Активность:
ARHUI:
ScorpioT1000, всмысле PolledWait()?
call TriggerSleepAction(real)
всмысле простой wait x seconds
ScorpioT1000, cJass для автора актуален)
Старый 08.12.2010, 01:10
ScorpioT1000
Работаем
offline
Опыт: отключен
в PolledWait не обнуляется хендл таймера
Старый 08.12.2010, 01:11
ARHUI

offline
Опыт: 3,341
Активность:
call TriggerSleepAction(real) у меня в коде проблема или не я первый замечаю что функция не однозначна ибо работает с рандомными результатами?
Старый 08.12.2010, 01:21
ScorpioT1000
Работаем
offline
Опыт: отключен
записывай сначала всё в локальные переменные, а потом уже работай с вейтом, потому что всякие GetTrigger... после вейта могут давать косяки.
Старый 08.12.2010, 01:24
ARHUI

offline
Опыт: 3,341
Активность:
((код jass
function xxx takes xxx returns xxx
...
local group g = GetUnitsOfPlayerMatching(Player(11), Condition(function is_graves))

loop
exitwhen b > 0
set g = GetUnitsOfPlayerMatching(Player(11), Condition(function is_graves))
if ( CountLivingPlayerUnitsOfTypeId('h00Q', Player(11)) > 0 ) then
call ForGroup( g, function create_mega_zombie )
else
if ( CountLivingPlayerUnitsOfTypeId('u00F', Player(11)) == 0 ) then
set b = 1
endif
endif
call TriggerSleepAction( 12 / ( udg_Difficulty + 1 ) )
endloop
...
endfunction
))
функция xxx это тело триггера далее:
((код jass
function create_mega_zombie takes nothing returns nothing
local integer a = 0
local unit cu
loop
exitwhen a == ( udg_Difficulty + 1 )
set cu = CreateUnitAtLoc(Player(11), 'u00F', PolarProjectionBJ(GetUnitLoc(GetEnumUnit()), 100.00, GetRandomDirectionDeg()), GetRandomDirectionDeg())
call PauseUnitBJ( true, cu )
call SetUnitAnimation( cu, "birth" )
call AddSpecialEffectLocBJ( GetUnitLoc(cu), "Objects\\Spawnmodels\\NightElf\\EntBirthTarget\\EntBirthTarget.mdl" )
call PauseUnitBJ( false, cu )
call IssuePointOrderLocBJ( cu, "patrol", GetRectCenter(GetPlayableMapRect()) )
set a = a + 1
endloop
set cu = null
set a = 0
endfunction
))
функция создания зомбаков) находится выше xxx
однако если в create_mega_zombie появляется TriggerSleepAction() внутри цикла, то все что после не выполняется, хотя сам цикл работает до конца...
ARHUI добавил:
Почему? Я анимацию хотел вставить блин а тут вот так получается...
для кода используем спец. теги © swdn

Отредактировано ShadoW DaemoN, 09.12.2010 в 12:18.
Старый 08.12.2010, 01:43
Velociraptor
В пространстве и времени
offline
Опыт: 14,801
Активность:
По коду 16Gb: ну кран я, кран, просил же на коленях, если на JASS, а не на GUI сразу, тест-карту, чтобы сам мог тупо копипастить и менять время и равкоды...
вот попытался вставить, триг не включается - охота, чтобы срабатывал на абилу целителя
(удалено)

Отредактировано Velociraptor, 09.12.2010 в 10:46.
Старый 08.12.2010, 02:21
JassMan
свободен
offline
Опыт: 4,193
Активность:
Значит так:
1 ) Сначала читаем это.
2 ) Затем идём сюда и знакомимся по подробнее (прочесть, желательно, темы полностью).
3 ) Ну и, наконец, для закрепления материала, еще один пост для развития.
Прочитаешь всё это, и поймешь, что Sleep вообще не нужен, ибо есть таймеры, как говорится, на все случаи жизни.
Старый 08.12.2010, 03:03
ScorpioT1000
Работаем
offline
Опыт: отключен
запускай каждую итерацию цикла в новом потоке и там уже начинай с локалок+вейта
ScorpioT1000 добавил:
это, кстати, в некоторых (очень тонких) случаях даже лучше, чем пускать таймер с той же длительностью (и крепить ничего не надо - передаем через глобалки моментально)
Старый 08.12.2010, 06:08
Закрытая тема

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

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

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

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



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