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


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Помогите оптимизировать код
Помогите оптимизировать код
demon_nrtДата: Среда, 06 Ноября 2013, 14:43:32 | Сообщение # 1
6 уровень
Группа: Проверенные
Сообщений: 193
Награды: 0
Репутация: 2
Блокировки:
Сделал перемещение Минотавра вперед на указанную дистанцию (800) в конце пути он оглушает всех кто рядом. Так вот скилл работает правильно, но очень частое использование нагружает память, а я вроде как все удалял и обнулял. И у меня еще вопросы по поводу скила. Как можно сделать так чтобы Герой бежал именно туда куда я указал как цель, но максимум дистанция была 800. И второе как активировать анимацию бега у Героя, что бы он как бы бежал. Используя функцию MOVE он все равно просто стоит и перемещается к цели. Вот сам код, если можете то просто посоветуйте как можно сократить или более оптимизировать код.
Код
function Razbeg_Conditions takes nothing returns boolean
      if ( not ( GetSpellAbilityId() == 'A03O' ) ) then
          return false
      endif
      return true
endfunction
globals   
group g1 = CreateGroup()   
endglobals   
function pause takes nothing returns nothing
      local timer Vst = GetExpiredTimer()              
      local integer h = GetHandleId(Vst)
      local unit Vsu = LoadUnitHandle(udg_Hash,h,1)
      local real x = LoadReal(udg_Hash,h,2)
      local real y = LoadReal(udg_Hash,h,3)
      local group g = LoadGroupHandle(udg_Hash, h, 4)   
      local real x1 = GetWidgetX(Vsu)
      local real y1 = GetWidgetY(Vsu)
      local real TargA =  GetUnitFacing(Vsu)
      local player p = GetOwningPlayer(Vsu)
      local real TargX
      local real TargY
      local unit f
      local unit Vsu1
      set TargX = GetUnitX(Vsu)
      set TargY = GetUnitY(Vsu)
      set TargX = TargX + 55.00 * Cos(TargA * 0.0174532)
      set TargY = TargY + 55.00 * Sin(TargA * 0.0174532)
      call SetUnitPosition( Vsu, TargX, TargY)
      call SetUnitPathing( Vsu, false )
      call GroupEnumUnitsInRange(g1,x1, y1, 300.0, null)
      call DestroyEffect(AddSpecialEffectTargetUnitBJ("origin",Vsu,  "Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl"))
loop
set f = FirstOfGroup(g1)   
exitwhen f == null      
      if IsUnitEnemy (f, p) and not IsUnitType(f, UNIT_TYPE_STRUCTURE) and GetWidgetLife(f) > .405 and not IsUnitInGroup(f, g) and GetWidgetLife(Vsu) > .405 then    
          call UnitDamageTargetBJ(Vsu, f, ( ( 50.00 * I2R(GetUnitAbilityLevelSwapped('A03O', Vsu)) ) + I2R(GetHeroStatBJ(bj_HEROSTAT_STR, Vsu, true)) ), ATTACK_TYPE_MELEE, DAMAGE_TYPE_NORMAL )
          call DestroyEffect(AddSpecialEffectTargetUnitBJ("overhead",f, "Abilities\\Spells\\Orc\\MirrorImage\\MirrorImageDeathCaster.mdl"))
          call GroupAddUnit(g, f)   
endif   
call GroupRemoveUnit(g1, f)   
endloop
     if  SquareRoot ((x1-x)*(x1-x)+(y1-y)*(y1-y))>= 800  then
         set Vsu1 = CreateUnit( GetOwningPlayer (Vsu), 'e007',x1,y1,1.)
         call UnitApplyTimedLife(Vsu1, 'BTLF',1.00  )
         call UnitAddAbility( Vsu1, 'A06N' )
         call SetUnitAbilityLevelSwapped( 'A06N',  Vsu1, GetUnitAbilityLevelSwapped('A03O',  Vsu) )
         call IssueImmediateOrder( Vsu1, "stomp")
         call  PauseUnit (Vsu, false)
         call ResetUnitAnimation( Vsu )
         call SetUnitPathing( Vsu, true )
         call UnitRemoveAbility(  Vsu, 'Amim')
         call DestroyEffect(AddSpecialEffect( "Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl", x1,y1))
         call PauseTimer (Vst)
         call DestroyTimer (Vst)
         set Vst = null
         set Vsu = null
         set Vsu1 = null
         set g = null
         set p = null
         set f = null
         call FlushChildHashtable(udg_Hash,h)   
      endif    
endfunction
function Razbeg_Actions takes nothing returns nothing
      local timer Vst = CreateTimer()     
      local integer h = GetHandleId(Vst)   
      local unit Vsu = GetSpellAbilityUnit()
      local real x = GetWidgetX(Vsu)
      local real y = GetWidgetY(Vsu)
      call UnitAddAbility(Vsu, 'Amim' )
      call PauseUnit (Vsu, true)
      call SetUnitAnimation( Vsu, "Stand Ready" )
      call SaveUnitHandle (udg_Hash,h,1,Vsu)
      call SaveReal (udg_Hash,h,2,x)
      call SaveReal (udg_Hash,h,3,y)
      call SaveAgentHandle(udg_Hash, h, 4, CreateGroup())   
      call TimerStart(Vst,0.07,true, function  pause )   
      set Vsu = null
      set Vst = null
     endfunction

//===========================================================================
function InitTrig_Razbeg takes nothing returns nothing
      set gg_trg_Razbeg = CreateTrigger(  )
      call TriggerRegisterAnyUnitEventBJ( gg_trg_Razbeg, EVENT_PLAYER_UNIT_SPELL_EFFECT )
      call TriggerAddCondition( gg_trg_Razbeg, Condition( function Razbeg_Conditions ) )
      call TriggerAddAction( gg_trg_Razbeg, function Razbeg_Actions )
endfunction


Сообщение отредактировал demon_nrt - Среда, 06 Ноября 2013, 14:44:01
 

BorodachДата: Среда, 06 Ноября 2013, 15:06:47 | Сообщение # 2
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
Cпособности деформирующие землю могут вызывать лаги (если настройки по 0 )
Номер анимации можешь изменить... в паладина 12 воспроизводит бег
Код

function Razbeg_Conditions takes nothing returns boolean
       return GetSpellAbilityId() == 'A03O'  
endfunction
globals    
group g1 = CreateGroup()    
endglobals    
function pause takes nothing returns nothing
       local timer Vst = GetExpiredTimer()               
       local integer h = GetHandleId(Vst)
       local unit Vsu = LoadUnitHandle(udg_Hash,h,1)
       local real x = LoadReal(udg_Hash,h,2)
       local real y = LoadReal(udg_Hash,h,3)
       local group g = LoadGroupHandle(udg_Hash, h, 4)    
       local real x1 = GetWidgetX(Vsu)
       local real y1 = GetWidgetY(Vsu)
       local real TargA =  GetUnitFacing(Vsu)
       local player p = GetOwningPlayer(Vsu)
       local real TargX
       local real TargY
       local unit f
       local unit Vsu1
       set TargX = GetUnitX(Vsu)
       set TargY = GetUnitY(Vsu)
       set TargX = TargX + 55.00 * Cos(TargA * 0.0174532)
       set TargY = TargY + 55.00 * Sin(TargA * 0.0174532)
       call SetUnitPosition( Vsu, TargX, TargY)
       call SetUnitPathing( Vsu, false )
       call GroupEnumUnitsInRange(g1,x1, y1, 300.0, null)
       call DestroyEffect(AddSpecialEffectTargetUnitBJ("origin",Vsu,  "Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl"))
loop
set f = FirstOfGroup(g1)    
exitwhen f == null       
       if IsUnitEnemy (f, p) and not IsUnitType(f, UNIT_TYPE_STRUCTURE) and GetWidgetLife(f) > .405 and not IsUnitInGroup(f, g) and GetWidgetLife(Vsu) > .405 then     
           call UnitDamageTargetBJ(Vsu, f, ( ( 50.00 * I2R(GetUnitAbilityLevelSwapped('A03O', Vsu)) ) + I2R(GetHeroStatBJ(bj_HEROSTAT_STR, Vsu, true)) ), ATTACK_TYPE_MELEE, DAMAGE_TYPE_NORMAL )
           call DestroyEffect(AddSpecialEffectTargetUnitBJ("overhead",f, "Abilities\\Spells\\Orc\\MirrorImage\\MirrorImageDeathCaster.mdl"))
           call GroupAddUnit(g, f)    
endif    
call GroupRemoveUnit(g1, f)    
endloop
      if  SquareRoot ((x1-x)*(x1-x)+(y1-y)*(y1-y))>= 744.  then
          set Vsu1 = CreateUnit( GetOwningPlayer (Vsu), 'e007',x1,y1,1.)
          call UnitApplyTimedLife(Vsu1, 'BTLF',1.00  )
          call UnitAddAbility( Vsu1, 'A06N' )
          call SetUnitAbilityLevel(Vsu1 ,  'A06N', GetUnitAbilityLevel(Vsu,  'A03O') )
          call IssueImmediateOrder( Vsu1, "stomp")
          call  PauseUnit (Vsu, false)
          call ResetUnitAnimation( Vsu )
          call SetUnitPathing( Vsu, true )
          call UnitRemoveAbility(  Vsu, 'Amim')
          call DestroyEffect(AddSpecialEffect( "Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl", x1,y1))
          call PauseTimer (Vst)
          call DestroyTimer (Vst)
          set Vst = null
          set Vsu = null
          set Vsu1 = null
          set g = null
          set p = null
          set f = null
          call FlushChildHashtable(udg_Hash,h)    
       endif     
endfunction
function Razbeg_Actions takes nothing returns nothing
       local timer Vst = CreateTimer()      
       local integer h = GetHandleId(Vst)    
       local unit Vsu = GetSpellAbilityUnit()
       local real x = GetWidgetX(Vsu)
       local real y = GetWidgetY(Vsu)
       call UnitAddAbility(Vsu, 'Amim' )
       call PauseUnit (Vsu, true)
       call SetUnitAnimationByIndex( Vsu, 12 )
       call SaveUnitHandle (udg_Hash,h,1,Vsu)
       call SaveReal (udg_Hash,h,2,x)
       call SaveReal (udg_Hash,h,3,y)
       call SaveAgentHandle(udg_Hash, h, 4, CreateGroup())    
       call TimerStart(Vst,0.07,true, function  pause )    
       set Vsu = null
       set Vst = null
      endfunction

//===========================================================================
function InitTrig_Razbeg takes nothing returns nothing
       set gg_trg_Razbeg = CreateTrigger(  )
       call TriggerRegisterAnyUnitEventBJ( gg_trg_Razbeg, EVENT_PLAYER_UNIT_SPELL_EFFECT )
       call TriggerAddCondition( gg_trg_Razbeg, Condition( function Razbeg_Conditions ) )
       call TriggerAddAction( gg_trg_Razbeg, function Razbeg_Actions )
endfunction


Karamba
 

demon_nrtДата: Среда, 06 Ноября 2013, 21:26:57 | Сообщение # 3
6 уровень
Группа: Проверенные
Сообщений: 193
Награды: 0
Репутация: 2
Блокировки:
Бег все равно не вопсроизводится он просто стоит и двигается в точку.
 

nvc123Дата: Среда, 06 Ноября 2013, 21:53:21 | Сообщение # 4
6 уровень
Группа: Проверенные
Сообщений: 229
Награды: 0
Репутация: 24
Блокировки:
demon_nrt, боже
ты используешь таймер неправильно и вешаешь данные на хэндл таймера
если у тебя 100 юнитов будут двигаться под этим скилом то будет 100 таймеров
а это гг
короче кури статью
http://xgm.ru/p/wc3/101422


научите нуба писать на jass
пишу игры под андроид за еду
 

demon_nrtДата: Четверг, 07 Ноября 2013, 13:49:35 | Сообщение # 5
6 уровень
Группа: Проверенные
Сообщений: 193
Награды: 0
Репутация: 2
Блокировки:
Спасибо, за статью, но мне нужно еще заставить его бежать.
 

BorodachДата: Четверг, 07 Ноября 2013, 14:23:19 | Сообщение # 6
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
Цитата Borodach ()
Номер анимации можешь изменить... в паладина 12 воспроизводит бег


Karamba
 

demon_nrtДата: Четверг, 07 Ноября 2013, 20:06:34 | Сообщение # 7
6 уровень
Группа: Проверенные
Сообщений: 193
Награды: 0
Репутация: 2
Блокировки:
Цитата Borodach ()
Номер анимации можешь изменить... в паладина 12 воспроизводит бег

Да, друг я понял но он не бежит)
 

nvc123Дата: Четверг, 07 Ноября 2013, 23:08:47 | Сообщение # 8
6 уровень
Группа: Проверенные
Сообщений: 229
Награды: 0
Репутация: 24
Блокировки:
скорость анимации настроить)

научите нуба писать на jass
пишу игры под андроид за еду
 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Помогите оптимизировать код
  • Страница 1 из 1
  • 1
Поиск:

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