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

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

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

offline
Опыт: 1,162
Активность:
Помогите решить проблему с подлагом в начале каста
при первых трех различных дамми кастах наблюдается подлаг, дальше эта проблема не наблюдается. собственно сам спел :
// Сам спел 'A00E' сделанный на основе канал-мгновенный
// 'A00F' дамми спел первого лвла сделанный на основе Волшебного огня соответствующий баф 'B00B'
// 'A00G' дамми спел второго лвла сделанный на основе Волшебного огня соответствующий баф 'B00C'
// 'A00H' дамми спел третий лвла сделанный на основе Волшебного огня соответствующий баф 'B00D'
// Спел накладывает эффект снижения брони в радиусе 300(суммируется до 3х раз)
//Принцип: кастер кастует и  юниты собираются в группув радиусе 300, через 0.05 юниты делятся по 3м //группам в зависимости от бафов наложеных на них после поочередно со всеми группами производится //нужное действие после чего группы удаляются и таймер удаляется

//проверка на каст нужного спела
function Intimidating_Shout_Conditions takes nothing returns boolean
return( GetSpellAbilityId() == 'A00E' )
endfunction

//набор в стартовую группу юнитов враждебных игроку
function Intimidating_Shout_Filter takes nothing returns boolean
local unit f=GetFilterUnit()
if IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()),GetOwningPlayer(f)) and GetWidgetLife(f)>=0.405 and IsUnitType(f,UNIT_TYPE_STRUCTURE)==false then
    set f=null
    return true
else
    set f=null
    return false
endif
endfunction

//действия с юнитами без бафа
function Intimidating_Shout_g1 takes nothing returns nothing
local timer Timer=GetExpiredTimer()
local unit Caster = LoadUnitHandle(udg_h,GetHandleId(Timer),1)
local unit Dummy = LoadUnitHandle(udg_h,GetHandleId(Timer),3)
local unit f = GetEnumUnit()
call UnitAddAbility( Dummy, 'A00F')
call SetUnitAbilityLevel(  Dummy, 'A00F', GetUnitAbilityLevel(Caster,'A00E'))
call IssueTargetOrder(  Dummy, "faeriefire", f )
call CreateTextTagUnitBJ( "1!", f, 0, 10, 100, 100, 100, 0 )
call SetTextTagColorBJ( GetLastCreatedTextTag(), 0.00, 60.00, 100.00, 0 )
call SetTextTagVelocityBJ( GetLastCreatedTextTag(), 64, 90 )
call SetTextTagPermanentBJ( GetLastCreatedTextTag(), false )
call SetTextTagLifespanBJ( GetLastCreatedTextTag(), 2.00 )
call SetTextTagFadepointBJ( GetLastCreatedTextTag(), 2.50 )
call UnitRemoveAbility( Dummy, 'A00F')
set Caster = null
set f=null
set Dummy = null
set Timer = null
endfunction

//действия с юнитами имеющими баф 1го лвла
function Intimidating_Shout_g2 takes nothing returns nothing
local timer Timer=GetExpiredTimer()
local unit Caster = LoadUnitHandle(udg_h,GetHandleId(Timer),1)
local unit Dummy = LoadUnitHandle(udg_h,GetHandleId(Timer),3)
local unit f = GetEnumUnit()
call UnitAddAbility( Dummy, 'A00G')
call SetUnitAbilityLevel(  Dummy, 'A00G', GetUnitAbilityLevel(Caster,'A00E'))
call IssueTargetOrder(  Dummy, "faeriefire", f )
call CreateTextTagUnitBJ( "2!", f, 0, 10, 100, 100, 100, 0 )
call SetTextTagColorBJ( GetLastCreatedTextTag(), 0.00, 60.00, 100.00, 0 )
call SetTextTagVelocityBJ( GetLastCreatedTextTag(), 64, 90 )
call SetTextTagPermanentBJ( GetLastCreatedTextTag(), false )
call SetTextTagLifespanBJ( GetLastCreatedTextTag(), 2.00 )
call SetTextTagFadepointBJ( GetLastCreatedTextTag(), 2.50 )
call UnitRemoveAbility( Dummy, 'A00G')
set Caster = null
set f=null
set Dummy = null
set Timer = null
endfunction

//действия с юнитами имеющими баф 2го или 3го лвла
function Intimidating_Shout_g3 takes nothing returns nothing
local timer Timer=GetExpiredTimer()
local unit Caster = LoadUnitHandle(udg_h,GetHandleId(Timer),1)
local unit Dummy = LoadUnitHandle(udg_h,GetHandleId(Timer),3)
local unit f = GetEnumUnit()
call UnitAddAbility( Dummy, 'A00H')
call SetUnitAbilityLevel(  Dummy, 'A00H', GetUnitAbilityLevel(Caster,'A00E'))
call IssueTargetOrder(  Dummy, "faeriefire", f )
call CreateTextTagUnitBJ( "3!", f, 0, 10, 100, 100, 100, 0 )
call SetTextTagColorBJ( GetLastCreatedTextTag(), 0.00, 60.00, 100.00, 0 )
call SetTextTagVelocityBJ( GetLastCreatedTextTag(), 64, 90 )
call SetTextTagPermanentBJ( GetLastCreatedTextTag(), false )
call SetTextTagLifespanBJ( GetLastCreatedTextTag(), 2.00 )
call SetTextTagFadepointBJ( GetLastCreatedTextTag(), 2.50 )
call UnitRemoveAbility( Dummy, 'A00H')
set Caster = null
set f=null
set Dummy = null
set Timer = null
endfunction

//переформирование групп старт действий для групп
function Intimidating_Shout_Main takes nothing returns nothing
local timer Timer=GetExpiredTimer()
local unit Caster = LoadUnitHandle(udg_h,GetHandleId(Timer),1)
local group Group=LoadGroupHandle(udg_h,GetHandleId(Timer),2)
local group Group1=CreateGroup()
local group Group2=CreateGroup()
local group Group3=CreateGroup()
local integer Level = GetUnitAbilityLevel(Caster,'A00E')
local unit f = null
call AddSpecialEffectLoc("Abilities\\Spells\\Undead\\RaiseSkeletonWarrior\\RaiseSkeleton.mdl",G​etUnitLoc(Caster))
loop       
    set f = FirstOfGroup(Group)
    exitwhen f == null
    if GetUnitAbilityLevel(f, 'B00B') == 0 and GetUnitAbilityLevel(f, 'B00C') == 0 and GetUnitAbilityLevel(f, 'B00D')==0 then
    call GroupAddUnit(Group1, f)
    else
        if GetUnitAbilityLevel(f, 'B00B') > 0 then
        call GroupAddUnit(Group2, f)
        else
            if  GetUnitAbilityLevel(f, 'B00C') > 0 or GetUnitAbilityLevel(f, 'B00D') > 0 then
            call GroupAddUnit(Group3, f)
            else
            endif
        endif
    endif
    call GroupRemoveUnit(Group, f)
endloop 
call DestroyGroup(Group)
call ForGroup(Group1,function Intimidating_Shout_g1)
call DestroyGroup(Group1)
call ForGroup(Group2,function Intimidating_Shout_g2)
call DestroyGroup(Group2)
call ForGroup(Group3,function Intimidating_Shout_g3)
call DestroyGroup(Group3)
call DestroyTimer(Timer)
set Caster = null
set Level = 0
set f = null
set Group = null
set Group1 = null
set Group2 = null
set Group3 = null
set Timer = null
endfunction

function Intimidating_Shout_Actions takes nothing returns nothing
local timer Timer=CreateTimer()
local unit Caster=GetSpellAbilityUnit()
local group Group=CreateGroup()
local boolexpr b=Condition(function Intimidating_Shout_Filter)
local unit Dummy = CreateUnit(GetOwningPlayer(Caster),'o000',GetUnitX(Caster),GetUnitY(Caster), bj_UNIT_FACING)
call GroupEnumUnitsInRange(Group,GetUnitX(Caster),GetUnitY(Caster),300.,b)
call SaveUnitHandle(udg_h,GetHandleId(Timer),1,Caster)
call SaveGroupHandle(udg_h,GetHandleId(Timer),2,Group)
call SaveUnitHandle(udg_h,GetHandleId(Timer),3,Dummy)
call TimerStart(Timer,0.05,false,function Intimidating_Shout_Main)
set Dummy = null
set b = null
set Caster = null
set Group = null
set Timer = null
endfunction

//===========================================================================
function InitTrig_Intimidating_Shout takes nothing returns nothing
    local trigger trg=CreateTrigger()
    set udg_h=InitHashtable()
    call TriggerRegisterAnyUnitEventBJ( trg, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( trg, Condition( function Intimidating_Shout_Conditions ) )
    call TriggerAddAction( trg, function Intimidating_Shout_Actions )
    set trg=null
endfunction
Старый 01.04.2011, 00:49
Elf_Stratigo

offline
Опыт: 4,599
Активность:
  1. условие можно поместить в действие или наоборот
  2. лаг скорее всего происходит из-за создания спецэффекта - создавай сразу после загрузки один экземпляр
  3. код утечен
  4. откажись от хеша
  5. откажись от BJ функций
  6. пик-группу можно иметь одну для всех заклинаний и не создавать и удалять для каждого каста
это что бросилось в глаза...
Старый 01.04.2011, 09:27
Dartesk

offline
Опыт: 1,162
Активность:
условие можно поместить в действие или наоборот
не это вызовит утечки другого плана ибо спелов такого типа около 40 а лаг только в этом
лаг скорее всего происходит из-за создания спецэффекта - создавай сразу после загрузки один экземпляр
тоже мало вероятно ибо был и прелоад и спец в действиях и вообще отключал его-лаг есть все равно
код утечен
тут по подробнее ибо все вроде остановлено и обнулено
откажись от хеша
не реально
откажись от BJ функций
ну бж тут ток всплывающий текст он по идее много проблем не создает хотя хз
пик-группу можно иметь одну для всех заклинаний и не создавать и удалять для каждого каста
если одна пик группа тогда надо спелам давать разные стартовые команды и давать все три спела в принципе не пробовал но помоему это тоже не должно сильно повлиять плюс проблема только в первые три каста -дальше проблема исчезает
Старый 01.04.2011, 18:32
Elf_Stratigo

offline
Опыт: 4,599
Активность:
около 40
ну и представь: при касте - сразу 40 триггеров идут проверять свои условия... нужен диспетчер
тут по подробнее
AddSpecialEffectLoc("Abilities\\Spells\\Undead\\RaiseSkeletonWarrior\\RaiseSkeleton.mdl",G​​etUnitLoc(Caster))
1 эффект и 1 точка - не удаляются
не реально
ассоциативный массив и всё хорошо
у тебя очень много обращений к хешу + поиск хендлов (GetExpiredTimer()), хотя достаточно одного раза
всплывающий текст
GetLastCreatedTextTag() => bj_lastCreatedTextTag
вместо вызова функции будет прямое обращение к переменной
разные стартовые команды
сделай их 3, в общем чтобы не было создания групп - они же некуда вроде не передаются (я про Group1-Group3), а сразу используются, значит волнует не сама группа, а её содержимое
вообще, создалось мнение, что эти группы не нужны - вместе заполнения групп, вызывай нужные функции для текущего юнита
Старый 01.04.2011, 20:31
Dartesk

offline
Опыт: 1,162
Активность:
вообщем от 3х групп я избавился хотя это и не помогло. А подлаг как я выяснил связан с первым добавлением способностей даммику. Если эти способности добавить даммику при старте игры то во время кастов подлагов нет
Старый 01.04.2011, 22:00
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
а можно поподробнее что делает спелл ? может еще чем поможем ?
ой пардон не увидел комментарий к коду, сразу стал смотреть код.
как-то ты странно сделал спелл. Сверление зубов дракона через ...
Старый 01.04.2011, 23:06
Dartesk

offline
Опыт: 1,162
Активность:
как-то ты странно сделал спелл. Сверление зубов дракона через ...
ну других способов пока не знаю
Старый 01.04.2011, 23:51
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
а работает ли спелл Кольца защиты если давать его тригерно ?
Zanozus добавил:
да работает только-что проверил
делай на нем только с отрицательным приростом брони.
Старый 01.04.2011, 23:59
Dartesk

offline
Опыт: 1,162
Активность:
так мне нужны разные бафы в зависимости от стаков на юните, ибо в другом спеле в зависимости от типа бафа идет урон
Старый 02.04.2011, 00:27
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
просто повышай уровень "повышения" брони а когда нужно наносить урон проверяй ее уровень и наноси урон
так же проще
Старый 02.04.2011, 13:26
Dartesk

offline
Опыт: 1,162
Активность:
так у меня спел многоуровневый по умолчанию уже
Старый 02.04.2011, 13:35
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
Dartesk, (*.*) причем тут это ?
p.s через пару часов приду домой и выложу пример
Старый 02.04.2011, 13:39
Master_chan
Полуночный командир
offline
Опыт: 15,660
Активность:
Elf_Stratigo:
лаг скорее всего происходит из-за создания спецэффекта - создавай сразу после загрузки один экземпляр
Вся суть темы, т.е. то что автор от вас хотел узнать. Когда у него начнет лагать из-за утечности он создаст новую тему.
Старый 02.04.2011, 18:10
Zanozus
Уехал учиться
offline
Опыт: 8,512
Активность:
вот, что-то вроде этого:
3 уровня, суммируются друг с другом + броня восстанавливается на 1 каждую секунду
1 уровень -5 брони
2 уровень -10 брони
3 уровень -15 брони
Прикрепленные файлы
Тип файла: w3x Armor.w3x (19.3 Кбайт, 12 просмотров )
Старый 02.04.2011, 18:20
Doc

offline
Опыт: 63,163
Активность:
дак давай даммику свои даммиспеллы в начале игры и потом удаляй даммика.
Старый 02.04.2011, 21:47
Dartesk

offline
Опыт: 1,162
Активность:
Doc:
дак давай даммику свои даммиспеллы в начале игры и потом удаляй даммика.
да так уже и сделал...
Старый 03.04.2011, 00:49
Закрытая тема

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

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

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

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



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