Сейчас 01:32:17 Среда, 27 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Оптимизация спелла, где используются группы
FatalBladeДата: Среда, 21 Сентября 2011, 23:33:17 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Например у меня есть спелл который подсчитывает юнитов трупов вокруг героя, с помощью группы юнитов, а затем с помощью цикла, через какое то время взрывает их, нанося урон всем кто стоит возле трупов. Как это сделать не используя глобалки? Не сохранять же каждого пикнутого юнита в хэш? Их может быть хоть 50! А то и больше
Вот спелл:

Code

function Trig_Explode_Corpses_Conditions takes nothing returns boolean
     if ( GetSpellAbilityId() == 'A0QT' ) then
         return true
     endif
     return false
endfunction

function Trig_Explode_Corpses_Func004A takes nothing returns nothing
     if ( IsUnitDeadBJ(GetEnumUnit()) == true ) then
         set udg_ECLocs[udg_ECIndex] = GetUnitLoc(GetEnumUnit())
         call CreateUnitAtLoc( GetOwningPlayer(GetSpellAbilityUnit()), 'h007', udg_ECLocs[udg_ECIndex], 0.00 )
         set udg_DummyEC[udg_ECIndex] = GetLastCreatedUnit()
         set udg_ECIndex = udg_ECIndex + 1
         call RemoveUnit( GetEnumUnit() )
     endif
endfunction

function Trig_Explode_Corpses_Actions takes nothing returns nothing
     local integer l = GetUnitAbilityLevel(GetSpellAbilityUnit(), GetSpellAbilityId())
     set udg_ECIndex = 1
     set udg_ECIndexOverall = 0
     set udg_ECPoint = GetUnitLoc(GetSpellAbilityUnit())
     call ForGroup( GetUnitsInRangeOfLocAll(900.00, udg_ECPoint), function Trig_Explode_Corpses_Func004A )
     call DestroyGroup(GetLastCreatedGroup())
     if ( l == 1 ) then
         set udg_ECDamage = 50.00
     endif
     if ( l == 2 ) then
         set udg_ECDamage = 65.00
     endif
     if ( l == 3 ) then
         set udg_ECDamage = 85.00
     endif
     if ( l == 4 ) then
         set udg_ECDamage = 110.00
     endif
     if ( l == 5 ) then
         set udg_ECDamage = 140.00
     endif
     if ( l == 6 ) then
         set udg_ECDamage = 175.00
     endif
     if ( l == 7 ) then
         set udg_ECDamage = 215.00
     endif
     if ( l == 8 ) then
         set udg_ECDamage = 260.00
     endif
     if ( l == 9 ) then
         set udg_ECDamage = 310.00
     endif
     if ( l == 10 ) then
         set udg_ECDamage = 365.00
     endif
     call StartTimerBJ( udg_TimerEC, false, 0.40 )
endfunction

//===========================================================================
function InitTrig_Explode_Corpses takes nothing returns nothing
     set gg_trg_Explode_Corpses = CreateTrigger(  )
     call TriggerRegisterAnyUnitEventBJ( gg_trg_Explode_Corpses, EVENT_PLAYER_UNIT_SPELL_CAST )
     call TriggerAddCondition( gg_trg_Explode_Corpses, Condition( function Trig_Explode_Corpses_Conditions ) )
     call TriggerAddAction( gg_trg_Explode_Corpses, function Trig_Explode_Corpses_Actions )
endfunction


Code

     Events
         Time - TimerEC expires
     Conditions
     Actions
         Set ECIndexOverall = ECIndex
         Set ECIndex = 1
         For each (Integer A) from 1 to ECIndexOverall, do (Actions)
             Loop - Actions
                 Unit - Cause DummyEC[ECIndex] to damage circular area after 0.00 seconds of radius 180.00 at ECLocs[ECIndex], dealing ECDamage damage of attack type Spells and damage type Force
                 Special Effect - Create a special effect at ECLocs[ECIndex] using Units\Undead\Abomination\AbominationExplosion.mdl
                 Special Effect - Destroy (Last created special effect)
                 Set ECIndex = (ECIndex + 1)
         Sound - Play ImpaleLand <gen> at 100.00% volume, located at ECPoint with Z offset 10.00
         Countdown Timer - Start TimerEC1 as a One-shot timer that will expire in 1.00 seconds


Code

     Events
         Time - TimerEC1 expires
     Conditions
     Actions
         Set ECIndexOverall = ECIndex
         Set ECIndex = 1
         For each (Integer A) from 1 to ECIndexOverall, do (Actions)
             Loop - Actions
                 Custom script:   call RemoveUnit(udg_DummyEC[udg_ECIndex])
                 Set DummyEC[ECIndex] = No unit
                 Custom script:   call RemoveUnit(udg_DummyEC[udg_ECIndex])
                 Custom script:   call RemoveLocation(udg_ECLocs[udg_ECIndex])
                 Set ECIndex = (ECIndex + 1)
         Custom script:   call RemoveLocation(udg_ECPoint)


 

lawsonДата: Среда, 21 Сентября 2011, 23:39:06 | Сообщение # 2
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (FatalBlade)
Как это сделать не используя глобалки? Не сохранять же каждого пикнутого юнита в хэш?

Сделать через локалки что так трудно?
Сохраняй группу в хеш а не каждого юнита.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Среда, 21 Сентября 2011, 23:42:20
 

FatalBladeДата: Четверг, 22 Сентября 2011, 01:48:22 | Сообщение # 3
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (lawson)

Сохраняй группу в хеш а не каждого юнита.

SaveGroupHandle(бла бла бла)? Или как?

Добавлено (22 Сентябрь 2011, 01:48:22)
---------------------------------------------
И если например мне надо сосчитать количество этих пикнутых юнитов? Как это сделать без глобалок? Ведь опять же я не могу сувать в хэш каждый раз насчитанное количество пикнутых юнитов


 

FkoFFДата: Четверг, 22 Сентября 2011, 04:30:19 | Сообщение # 4
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
omfg...

function Trig_Explode_Corpses_Func004A takes nothing returns nothing
if ( IsUnitDeadBJ(GetEnumUnit()) == true ) then
set udg_ECLocs[udg_ECIndex] = GetUnitLoc(GetEnumUnit())
call CreateUnitAtLoc( GetOwningPlayer(GetSpellAbilityUnit()), 'h007', udg_ECLocs[udg_ECIndex], 0.00 )
set udg_DummyEC[udg_ECIndex] = GetLastCreatedUnit()
set udg_ECIndex = udg_ECIndex + 1
call RemoveUnit( GetEnumUnit() )
endif
endfunction

createunitatloc?! :D
GetLastCreatedUnit()

что это за ужас?!

set udg_DummyEC[udg_ECIndex]=CreateUnit(GetSpellAbilityUnit()), 'h007', x,y,.0)

уж лучше хэш и таймеры чем так как ты это делаешь, правда )

Кстати, что то я действий по смещению массива не вижу, право слово - странно.

P.S *Facepalm* --> call TriggerRegisterAnyUnitEventBJ( gg_trg_Explode_Corpses, EVENT_PLAYER_UNIT_SPELL_CAST ) EVEN_PLAYER_UNIT_SPELL_EFFECT, ибо то что ты использовал - совсем не то.


 

Ty3uKДата: Четверг, 22 Сентября 2011, 07:08:42 | Сообщение # 5
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Это называется гуи -> жасс, путем конвертирования в текст :)

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

Mep3aB4uKДата: Четверг, 22 Сентября 2011, 15:32:14 | Сообщение # 6
9 уровень
Группа: Проверенные
Сообщений: 1019
Награды: 0
Репутация: 135
Блокировки:
FatalBlade, уствнови аеременную group (отряд) = отряд в радиусе с условием что здоровье юнита <= 0.
Установить переменную count (целочисленую) = Количество юнитов в групе (CountUnitInGroup) в радиусе с условием что здоровье юнита <= 0.
запустить таймер
---------------------------------------------------------------------------------------------------
таймер истекает
цыкл от 1 до сount
Установить переменную unit (боевая еденица)=1-ый случайный юнит в group
........
пикнуть в радиусе от unit с условием что юнит враг
нанести урон пикнутому юниту
.........
удалить unit из group
Примерно то что ты хотел, надеюсь понятно пояснил


Сообщение отредактировал Mep3aB4uK - Четверг, 22 Сентября 2011, 16:31:59
 

Ty3uKДата: Четверг, 22 Сентября 2011, 16:26:07 | Сообщение # 7
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
А совместить фильтр и ForGroup() в одну функцию? И в ней же удалять юнита из группы? ^_^

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

Mep3aB4uKДата: Четверг, 22 Сентября 2011, 16:34:24 | Сообщение # 8
9 уровень
Группа: Проверенные
Сообщений: 1019
Награды: 0
Репутация: 135
Блокировки:
Ty3uK, если не большой радиус лучше через цыкл (мое мнение), да и так мне удобней.
Через цыкл используется внутри той же функции и не надо все нужные локалки переносить через хэндл, к тому же не создается лишняя функция.


Сообщение отредактировал Mep3aB4uK - Четверг, 22 Сентября 2011, 16:39:18
 

Ty3uKДата: Четверг, 22 Сентября 2011, 16:41:06 | Сообщение # 9
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Ну... Тоже верно, но группу делать в любом случае, это раз, фильтровать- это два. А если цикл будет большим- может повесить слабую машину :)

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

Mep3aB4uKДата: Четверг, 22 Сентября 2011, 16:47:30 | Сообщение # 10
9 уровень
Группа: Проверенные
Сообщений: 1019
Награды: 0
Репутация: 135
Блокировки:
Ty3uK,
Quote (Mep3aB4uK)
если не большой радиус лучше через цыкл

в небольшом радиксе не превысит
 

Ty3uKДата: Четверг, 22 Сентября 2011, 16:48:44 | Сообщение # 11
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Только если там нет кучи дамми ^_^ уболтал, чертяка языкастый :D

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

FkoFFДата: Четверг, 22 Сентября 2011, 17:09:02 | Сообщение # 12
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (Ty3uK)
но группу делать в любом случае, это раз, фильтровать- это два.

2-3 global groups is enough. Создание локальных групп и их разрушение - лишние действия которые не всегда заканчиваются безболезненно для процессора.
Локальные группы актуальны только в том случае, когда требуется выделить каких то юнитов и зарезервировать их на какое-то время. Для мгновенного срабатывания достаточно 2-3 глобалок.

На счет фильтра - лучше конечно через функцию и вбивать в call GroupEnumUnitsInRange(g,x,y,r,here)


 

Ty3uKДата: Четверг, 22 Сентября 2011, 17:16:25 | Сообщение # 13
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Да, я про это и говорил :) и еще отдельно в local filterfunc f = Filter(function фильтр) и call GroupEnumUnitsInRange(группа, координата х, координата у, радиус, f), чтобы потом можно было сделать call DestroyFilter(f) и set f = null ^_^

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

lawsonДата: Четверг, 22 Сентября 2011, 17:23:40 | Сообщение # 14
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (Ty3uK)
call DestroyFilter(

помоему фильтр не создает утечки.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

FkoFFДата: Четверг, 22 Сентября 2011, 17:25:27 | Сообщение # 15
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (Ty3uK)
local filterfunc f = Filter(function фильтр)

Quote (Ty3uK)
call GroupEnumUnitsInRange(группа, координата х, координата у, радиус, f)

Quote (lawson)
помоему фильтр не создает утечки.

в использованном выше варианте создает.

А вообще можно было просто вписать напрямую Condition(function PewPew) - утечки не будет.


 

lawsonДата: Четверг, 22 Сентября 2011, 18:30:08 | Сообщение # 16
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (FkoFF)
А вообще можно было просто вписать напрямую Condition(function PewPew) - утечки не будет.
Хмм а вот дуос говорит что так делают только нубы. Странно как то.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Четверг, 22 Сентября 2011, 18:30:47
 

FkoFFДата: Четверг, 22 Сентября 2011, 19:23:02 | Сообщение # 17
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (lawson)
Хмм а вот дуос говорит что так делают только нубы. Странно как то.

а смысл вбивать в переменную? Все равно толку никакого. Вызов 1 на всю функцию, утечки нет.
Бтв, он сам так делает.


 

lawsonДата: Четверг, 22 Сентября 2011, 20:02:57 | Сообщение # 18
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (FkoFF)
Бтв, он сам так делает.

Сам всегда так делаю. дуос ввел меня в заблуждение.
Ty3uK, так что там 97% процентов нубов? Хмм


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Четверг, 22 Сентября 2011, 20:32:32
 

Ty3uKДата: Четверг, 22 Сентября 2011, 21:32:54 | Сообщение # 19
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Я просто переадресовал слова

Добавлено (22 Сентябрь 2011, 20:48:29)
---------------------------------------------
Хм, а если это спелл? За десять минут у тебя будет висеть порядка десяти объектов лишних, не?

Добавлено (22 Сентябрь 2011, 21:32:54)
---------------------------------------------
type conditionfunc extends boolexpr, type filterfunc extends boolexpr, а type boolexpr extends handle. By Duos


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

lawsonДата: Четверг, 22 Сентября 2011, 21:47:43 | Сообщение # 20
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (Ty3uK)
За десять минут у тебя будет висеть порядка десяти объектов лишних, не?

Каких объектов? У меня ИИ в 450 строк срабатывает каждую секунду для каждого героя отдельно, там я пикаю всех вокруг юнитов в одну группу с condition() определяю юнита по фильтру а потом группу удаляю и заново пикаю уже других юнитов в нее и так я делаю это 8 раз за секунду для каждого игрока. А теперь представь если использовать твой фильтр для каждой группы. мда будет похоже на припадок сумашедшего, поэтому использую цикл для нахождения нужного юнита, все обнуляю все удаляю ни каких утечек кроме как PolarProjection так как было лень его раксрывать, все работает четко - идеально. Так что НЕ!


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Четверг, 22 Сентября 2011, 21:50:01
 

Ty3uKДата: Четверг, 22 Сентября 2011, 22:16:10 | Сообщение # 21
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Да ну? Фильтр и кондишн- это ссылки, которые висят в памяти, если их не уничтожить, разве я не прав?

Добавлено (22 Сентябрь 2011, 22:16:10)
---------------------------------------------
Омг, полярки не раскрыл? О.о ну ты сотона :D


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

lawsonДата: Четверг, 22 Сентября 2011, 22:31:25 | Сообщение # 22
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (Ty3uK)
Да ну? Фильтр и кондишн- это ссылки, которые висят в памяти, если их не уничтожить, разве я не прав?

Все забей. пользуйся на здоровье фильтрами просто было неприятно обзывать меня нубом.

Quote (Ty3uK)
полярки не раскрыл

да было такое. да и сейчас до сих пор не раскрыл. Может както займусь ими.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!
 

Ty3uKДата: Четверг, 22 Сентября 2011, 22:43:06 | Сообщение # 23
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Я не называл, я процитировал Дусю. Тебя-то я нубом ни в жисть не назвал, сорри если ввел в заблуждение. Насчет фильтров- у всех свои вкусы, сойдемся каждый на своем мнении ^_^

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

FatalBladeДата: Четверг, 22 Сентября 2011, 22:49:16 | Сообщение # 24
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (FkoFF)
createunitatloc?! :D
GetLastCreatedUnit()

ээ.. а в чём проблема? Вроде не БЖ. Ну а если проблема в локациях, то чем будут мешать локации, если они удаляются после использования?

Quote (FkoFF)
EVENT_PLAYER_UNIT_SPELL_CAST ) EVEN_PLAYER_UNIT_SPELL_EFFECT, ибо то что ты использовал - совсем не то.

Почему? Событие работает, триггер работает. Да и разве GetSpellAbilityUnit() является обозначением для EVEN_PLAYER_UNIT_SPELL_EFFECT ?


 

lawsonДата: Четверг, 22 Сентября 2011, 22:50:51 | Сообщение # 25
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (FatalBlade)
GetSpellAbilityUnit()

GetTriggerUnit() это будет болле правильней!


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Четверг, 22 Сентября 2011, 22:52:27
 

  • Страница 1 из 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz