Сейчас 15:08:04 Пятница, 29 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Оптимизация
DreiiДата: Воскресенье, 26 Декабря 2010, 19:51:51 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
Code
function Trig_cast_Timer takes nothing returns nothing
local timer ta = GetExpiredTimer()  
local integer i = GetHandleId(ta)  
local unit t = LoadUnitHandle(udg_Hash, i, 1)
local unit u = LoadUnitHandle(udg_Hash, i, 0)   
local location p = LoadLocationHandle(udg_Hash, i, 2)  
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\Bolt\\BoltImpact.mdl", t, "chest"))
call UnitDamageTarget(u, t, 300., true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
call SetUnitPositionLoc(t, p)
call DestroyTimer(ta)  
call RemoveLocation(p)
call FlushChildHashtable(udg_Hash, i)
set t=null
set u=null
endfunction

function Trig_cast_Actions takes nothing returns nothing
local timer ta
local integer i
set ta = CreateTimer()  
set i = GetHandleId(ta)
if GetSpellAbilityId() == 'A000' then
call SaveUnitHandle(udg_Hash, i, 0, GetTriggerUnit())  
call SaveUnitHandle(udg_Hash, i, 1, GetSpellTargetUnit())     
call SaveLocationHandle(udg_Hash, i, 2, GetUnitLoc(GetSpellTargetUnit()))
call TimerStart(ta, 5., true, function Trig_cast_Timer)
set ta = null
endif
endfunction

//===========================================================================
function InitTrig_cast takes nothing returns nothing
     local trigger trig=CreateTrigger(  )
     local integer index=0
     loop
         call TriggerRegisterPlayerUnitEvent(trig, Player(index), EVENT_PLAYER_UNIT_SPELL_CAST , null)
         set index = index + 1
         exitwhen index == bj_MAX_PLAYER_SLOTS
     endloop
     call TriggerAddAction( trig, function Trig_cast_Actions )
     set trig=null
endfunction

Как оптимизировать?
З.Ы моя вторая работа с хэшом


 

SirNikolasДата: Воскресенье, 26 Декабря 2010, 20:09:30 | Сообщение # 2
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Во-первых, нужно писать не EVENT_PLAYER_UNIT_SPELL_CAST (Начинает применять способность), а EVENT_PLAYER_UNIT_SPELL_EFFECT (Приводит способность в действие). Во-вторых, в функции Trig_cast_Actions ты сначала создаешь таймер, а потом проверяешь способность, а нужно наоборот. В-третьих, лучше работать не с точками, а с координатами.

 

DreiiДата: Воскресенье, 26 Декабря 2010, 20:10:42 | Сообщение # 3
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
SirNikolas, учту,
Quote (SirNikolas)
а с координатами.

X,Y?


 

RoBoT1Дата: Воскресенье, 26 Декабря 2010, 20:16:52 | Сообщение # 4
10 уровень
Группа: Проверенные
Сообщений: 1454
Награды: 2
Репутация: 240
Блокировки:
Quote (Dreii)
X,Y?

Да!
Точки вызывают утечки!
 

DreiiДата: Воскресенье, 26 Декабря 2010, 20:37:19 | Сообщение # 5
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
RoBoT1, SirNikolas, точка rect или locarion???

Добавлено (26-12-2010, 20:37)
---------------------------------------------
Вот, с х и у. Что еще оптимизировать?

Code
function Trig_cast_Timer takes nothing returns nothing
local timer ta = GetExpiredTimer()  
local integer i = GetHandleId(ta)  
local unit t = LoadUnitHandle(udg_Hash, i, 1)
local unit u = LoadUnitHandle(udg_Hash, i, 0)   
local real x = LoadReal(udg_Hash, i, 2)
local real y = LoadReal(udg_Hash, i, 3)   
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\Bolt\\BoltImpact.mdl", t, "chest"))
call UnitDamageTarget(u, t, 300., true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
call SetUnitPosition(t,x,y)
call PauseTimer(ta)
call DestroyTimer(ta)  
call FlushChildHashtable(udg_Hash, i)
set t=null
set u=null
endfunction

function Trig_cast_Actions takes nothing returns nothing
local timer ta
local integer i
if GetSpellAbilityId() == 'A000' then
set ta = CreateTimer()
set i = GetHandleId(ta)  
call SaveUnitHandle(udg_Hash, i, 0, GetTriggerUnit())  
call SaveUnitHandle(udg_Hash, i, 1, GetSpellTargetUnit())     
call SaveReal(udg_Hash, i, 2, GetWidgetX(GetSpellTargetUnit()))
call SaveReal(udg_Hash, i, 3, GetWidgetY(GetSpellTargetUnit()))
call TimerStart(ta, 5., true, function Trig_cast_Timer)
set ta = null
endif
endfunction

//===========================================================================
function InitTrig_cast takes nothing returns nothing
     local trigger trig=CreateTrigger(  )
     local integer index=0
     loop
         call TriggerRegisterPlayerUnitEvent(trig, Player(index), EVENT_PLAYER_UNIT_SPELL_EFFECT , null)
         set index = index + 1
         exitwhen index == bj_MAX_PLAYER_SLOTS
     endloop
     call TriggerAddAction( trig, function Trig_cast_Actions )
     set trig=null
endfunction




Сообщение отредактировал Dreii - Воскресенье, 26 Декабря 2010, 20:38:45
 

FkoFFДата: Воскресенье, 26 Декабря 2010, 21:30:50 | Сообщение # 6
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Твой код = ошибки:

function Trig_cast_Timer takes nothing returns nothing
local timer ta = GetExpiredTimer()
local integer i = GetHandleId(ta)
local unit t = LoadUnitHandle(udg_Hash, i, 1)
local unit u = LoadUnitHandle(udg_Hash, i, 0)
local real x = LoadReal(udg_Hash, i, 2) используется 1 раз в коде - незачем подргружать в переменную
local real y = LoadReal(udg_Hash, i, 3) аналогично с предыдущим действием
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\Bolt\\BoltImpact.mdl", t, "chest"))
call UnitDamageTarget(u, t, 300., true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
call SetUnitPosition(t,x,y)
call PauseTimer(ta) ненужное действие
call DestroyTimer(ta)
call FlushChildHashtable(udg_Hash, i)
set t=null
set u=null
А таймер и не обнулил - утечка
endfunction

function Trig_cast_Actions takes nothing returns nothing
local timer ta здесь должно быть создание таймера, смотри мой вариант.
local integer i устанавливай значение переменных при инициализации
if GetSpellAbilityId() == 'A000' then вообще это должно быть условием триггера а не кода. Ибо поток и память выделяются. собсна - бред
set ta = CreateTimer() ненужное действие
set i = GetHandleId(ta) ненужное действие
call SaveUnitHandle(udg_Hash, i, 0, GetTriggerUnit())
call SaveUnitHandle(udg_Hash, i, 1, GetSpellTargetUnit()) этот юнит должен быть впеременной
call SaveReal(udg_Hash, i, 2, GetWidgetX(GetSpellTargetUnit()))
call SaveReal(udg_Hash, i, 3, GetWidgetY(GetSpellTargetUnit()))
call TimerStart(ta, 5., true, function Trig_cast_Timer) true здесь точно не нужен
set ta = null при твоей конструкции - конечно можно, однако по нормальному при присвоении переменной в ините - обнуление переменной тоже должно быть в ините
endif
endfunction





Сообщение отредактировал FkoFF - Воскресенье, 26 Декабря 2010, 21:37:34
 

DreiiДата: Воскресенье, 26 Декабря 2010, 21:36:39 | Сообщение # 7
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
FkoFF, Жестоко) Учту, попробую сейчас сам исправить, не смотяр в твой код)

 

  • Страница 1 из 1
  • 1
Поиск:

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