|
|
|
|
Помогите оптимизировать код
|
|
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 пишу игры под андроид за еду
|
|
|
|
|
|
|
|
|
|
|