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


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Заказ] Оптимизация очень важного кода
FatalBladeДата: Среда, 30 Ноября 2011, 02:07:08 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Code
function Trig_Equip_Apply_Conditions takes nothing returns boolean
      return (( GetUnitTypeId(GetSpellAbilityUnit()) == 'n008' ) or ( GetUnitTypeId(GetSpellAbilityUnit()) == 'n000' ))
endfunction

function Trig_Equip_Apply_Actions takes nothing returns nothing
      local unit HeroPick
      local integer HeroType
      local integer HeroCode
      local integer Ability = GetSpellAbilityId()
      local integer ItemN = LoadInteger(udg_Items,Ability,0)
      local integer ItemP = LoadInteger(udg_Items,Ability,1)
      local integer Gold = LoadInteger(udg_Items,Ability,2)
      local integer Rep = LoadInteger(udg_Items,Ability,3)
      local integer Code = LoadInteger(udg_Items,Ability,4)
      local string Name
      local boolean Check
      local unit u = GetSpellAbilityUnit()
      local player p1 = GetOwningPlayer(u)
      local player p2
      local unit un
      local group g = CreateGroup()
      call GroupEnumUnitsInRange(g, GetWidgetX(u), GetWidgetY(u), 500., null)

      call IssueImmediateOrder( u, "stop" )

       loop
           set un = FirstOfGroup(g)
           exitwhen un == null
           call GroupRemoveUnit(g, un)
           set p2 = GetOwningPlayer(un)
           if ( ( IsUnitType( un, UNIT_TYPE_HERO ) == true ) and ( IsPlayerAlly( p1, p2 ) == true ) ) then
               set HeroPick = un
           endif
       endloop

      call DestroyGroup(g)
      set HeroType = GetUnitTypeId(HeroPick)
      set HeroCode = LoadInteger(udg_Abilities,HeroType,1)
      set Check = GetInventoryIndexOfItemTypeBJ(HeroPick, ItemP) > 0

      if (Code == 1) then   
      set Name = "Melee Weapons"   
      endif
      if (Code == 2) then   
      set Name = "Ranged Weapons"   
      endif
      if (Code == 3) then   
      set Name = "Magic Weapons"   
      endif

      if (ItemP == 'afac') then   
      set Check = true   
      endif
      if ((ItemN == 'I01I') and ((ItemP == 'I01H') or (ItemP == 'I01G'))) then
      set Check = true   
      call RemoveItem(GetItemOfTypeFromUnitBJ(HeroPick, LoadInteger(udg_Items,Ability,5)))
      endif      

      if  (((HeroCode == 1) and (Code == 3)) or (HeroCode == Code) or (Code == 0)) then
            if ( ( GetPlayerState(p1, PLAYER_STATE_RESOURCE_GOLD) >= Gold ) and ( GetPlayerState(p1, PLAYER_STATE_RESOURCE_FOOD_USED) >= Rep ) and ( Check == true ) ) then
                call RemoveItem( GetItemOfTypeFromUnitBJ(HeroPick, ItemP) )
                call DestroyEffect(AddSpecialEffectTarget( "Abilities\\Spells\\Items\\AIem\\AIemTarget.mdl", HeroPick, "origin" ))
                call SetPlayerState( p1, PLAYER_STATE_RESOURCE_GOLD, (GetPlayerState(p1, PLAYER_STATE_RESOURCE_GOLD) + ( Gold * -1 ) ))
                call UnitAddItemById(HeroPick, ItemN)
                call SaveInteger(udg_Items, ItemN, 0, Code)
            else
                call AttachSoundToUnit(gg_snd_Error, u)
                call SetSoundVolume(gg_snd_Error, 127)
                call StartSound(gg_snd_Error)
                call DisplayTimedTextToPlayer( p1, 0, 0, 5.00, "|c00C4B200You do not have enough resources to craft this item.|r" )
            endif
      else
            call AttachSoundToUnit(gg_snd_Error, u)
            call SetSoundVolume(gg_snd_Error, 127)
            call StartSound(gg_snd_Error)
            call DisplayTimedTextToPlayer( p1, 0, 0, 5.00, "|c00C4B200You cannot use|r |c0000B200" + Name + "|r" )
      endif

      set HeroPick = null
      set u = null
      set un = null
      set g = null
      set p1 = null
      set p2 = null
endfunction


Помогите плз насколько это возможно оптимизировать этот код. Тут вообщем крафт предметов. Код получает данные предметов из базы данных (хэш)




Сообщение отредактировал FatalBlade - Среда, 30 Ноября 2011, 02:10:10
 

Ty3uKДата: Среда, 30 Ноября 2011, 07:37:02 | Сообщение # 2
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Скажу честно- не изобретай велосипед- лучше изучи Фикс Дуоса, он того стоит

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

FatalBladeДата: Четверг, 01 Декабря 2011, 13:53:06 | Сообщение # 3
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (Ty3uK)
Скажу честно- не изобретай велосипед- лучше изучи Фикс Дуоса, он того стоит

Я не знаю что там у Дуоса, не знаю по какой системе у него вообще работает крафт, какие ограничения и требования предметов, и тем более не знаю по какому принципу у него вообще созданна база данных предметов. Думаю у него похоже на то что есть в Доте, а это сильно отличается от моей системы. И ещё у меня присутствуют мультипродавцы. Просто помогите мне оптимизировать мой код. Думаю для опытного джассера это не сложно. У меня вполне читабельный и понятный код, просто нужно что бы работал быстрее.

Добавлено (01 Декабрь 2011, 13:53:06)
---------------------------------------------
Оптимизируйте плз или подскажите как это сделать, но мой код. В данном случае мне не подойдёт наработка.


 

HexingДата: Четверг, 01 Декабря 2011, 14:34:36 | Сообщение # 4
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
детский сад
раскрой GetItemOfTypeFromUnitBJ
замени на пробежку циклом в поисках предмета
IssueImmediateOrder
вместо "stop" сделай IssueImmediateOrderById и вместо "stop" - посмотри какое число будет через дебаг - GetOrderId("stop") или тип того
а вообще, ты вроде и сам опытнай раз такое написал... просто повнимательнее пробегись по коду и проверь всели хэндлы ты null-ишь в конце


 

FatalBladeДата: Четверг, 01 Декабря 2011, 16:08:47 | Сообщение # 5
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (Hexing)
просто повнимательнее пробегись по коду и проверь всели хэндлы ты null-ишь в конце

Само собой все <_<

Quote (Hexing)
вместо "stop" сделай IssueImmediateOrderById и вместо "stop" - посмотри какое число будет через дебаг - GetOrderId("stop") или тип того

А это зачем?

Quote (Hexing)
IssueImmediateOrder

Это не утечка и не БЖ и не хэндл.

Quote (Hexing)
GetItemOfTypeFromUnitBJ

Раскрывал. Код переставал работать как надо. В принципе у меня тут есть 2 БЖ:
1) - GetItemOfTypeFromUnitBJ
2) - GetInventoryIndexOfItemTypeBJ

Как только я их раскрываю, код перестаёт работать так как нужно. Он начинает менять существующий предмет на запрашиваемый, не важно что за предмет уже есть в инвентаре. Например если что бы получить предмет А, нужен предмет В, так вот получается что если у меня есть предмет С или D или Е или G, но нету нужного предмета В, я всё равно получу желаемый предмет А. В итоге я могу крафтить что угодно из всего что угодно. Меня это не устраивает.


 

HexingДата: Четверг, 01 Декабря 2011, 16:14:34 | Сообщение # 6
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Quote (FatalBlade)
Раскрывал. Код переставал работать как надо.

дело лишь в кривых руках ;)
Quote (FatalBlade)
А это зачем?

работает быстрее
Quote (FatalBlade)
Как только я их раскрываю, код перестаёт работать так как нужно. Он начинает менять существующий предмет на запрашиваемый, не важно что за предмет уже есть в инвентаре. Например если что бы получить предмет А, нужен предмет В, так вот получается что если у меня есть предмет С или D или Е или G, но нету нужного предмета В, я всё равно получу желаемый предмет А. В итоге я могу крафтить что угодно из всего что угодно. Меня это не устраивает.

ничего не понял, что сложного в раскрытии bj? копируешь содержимое, только обнуляешь что надо


 

FatalBladeДата: Четверг, 01 Декабря 2011, 16:40:15 | Сообщение # 7
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
Quote (Hexing)
ничего не понял, что сложного в раскрытии bj? копируешь содержимое, только обнуляешь что надо

Есть БЖ которые содержат дочерние БЖ, которые в свою очередь содержат ещё БЖ... В итоге что бы их окончательно раскрыть и грамотно вставить в код... ааа мой мозг!!!)))

Добавлено (01 Декабрь 2011, 16:34:21)
---------------------------------------------
И кстати, функция UnitItemInSlot( unit, slot ).
Обозначение slot принимает номер слота, или номер слота -1 ? Например как игроки, где Player 1 в ГУИ = Player(0) в джассе.

Добавлено (01 Декабрь 2011, 16:40:15)
---------------------------------------------

Quote (FatalBlade)
GetOrderId

Такой функции нету(


 

Ty3uKДата: Четверг, 01 Декабря 2011, 17:13:18 | Сообщение # 8
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Есть функция OrderId(). Через ид надо потому, что так функция быстрее обрабатывает результат. А еще лучше, скачай программу ConvOrder

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

lawsonДата: Четверг, 01 Декабря 2011, 17:21:59 | Сообщение # 9
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (FatalBlade)
Обозначение slot принимает номер слота, или номер слота -1 ?

от 0 - 5 == 6 слотов


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

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

Короче первый слот в джассе это 0, второй это 1, третий это 2 итд... ?


 

[DUОS]Дата: Четверг, 01 Декабря 2011, 20:09:20 | Сообщение # 11
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Fail.
Братцы, это и впрямь детский сад. В общем, вот оптимизация кода:

Code
function Trig_Equip_Apply_Conditions takes nothing returns boolean
     return GetUnitTypeId(GetTriggerUnit()) == 'n008' or GetUnitTypeId(GetTriggerUnit()) == 'n000'
endfunction

function GetInvItemIndex takes unit whichUnit, integer itemId returns integer
     local integer i = 0
     local item it
     loop
         exitwhen i > 5
         set it = UnitItemInSlot(whichUnit,index)
         if GetItemTypeId(it) == itemId then
             return i
         endif
         set i = i + 1
     endloop
     return -1
endfunction

function GetItemOfTypeFromUnit takes unit whichUnit, integer itemId returns item
     local integer index = GetInvItemIndex(whichUnit,itemId)
     if index != -1 then
         return UnitItemInSlot(whichUnit,index)
     endif     
     return null
endfunction

function Trig_Equip_Apply_Actions takes nothing returns nothing
       local unit HeroPick
       local integer HeroType
       local integer HeroCode
       local integer Ability = GetSpellAbilityId()
       local integer ItemN = LoadInteger(udg_Items,Ability,0)
       local integer ItemP = LoadInteger(udg_Items,Ability,1)
       local integer Gold = LoadInteger(udg_Items,Ability,2)
       local integer Rep = LoadInteger(udg_Items,Ability,3)
       local integer Code = LoadInteger(udg_Items,Ability,4)
       local string Name
       local boolean Check
       local unit u = GetSpellAbilityUnit()
       local player p1 = GetOwningPlayer(u)
       local unit un
       local group g = CreateGroup()
       call GroupEnumUnitsInRange(g, GetWidgetX(u), GetWidgetY(u), 500., null)

       call IssueImmediateOrderById(u,851972)

        loop
            set un = FirstOfGroup(g)
            exitwhen un == null
            call GroupRemoveUnit(g, un)
            if IsUnitType(un,UNIT_TYPE_HERO) and IsUnitAlly(un,p1) then
                set HeroPick = un
            endif
        endloop

       call DestroyGroup(g)
       set HeroType = GetUnitTypeId(HeroPick)
       set HeroCode = LoadInteger(udg_Abilities,HeroType,1)
       set Check = GetInvItemIndex(HeroPick,ItemP) > -1

       if Code == 1 then    
         set Name = "Melee Weapons"    
       elseif Code == 2 then    
         set Name = "Ranged Weapons"    
       elseif Code == 3 then    
         set Name = "Magic Weapons"    
       endif

       if ItemP == 'afac' then    
         set Check = true    
       endif
       if ItemN == 'I01I' and (ItemP == 'I01H' or ItemP == 'I01G') then
         set Check = true    
         call RemoveItem(GetItemOfTypeFromUnit(HeroPick,LoadInteger(udg_Items,Ability,5)))
       endif       

       if (HeroCode == 1 and Code == 3) or HeroCode == Code or Code == 0 then
             if GetPlayerState(p1,PLAYER_STATE_RESOURCE_GOLD) >= Gold and GetPlayerState(p1,PLAYER_STATE_RESOURCE_FOOD_USED) >= Rep and Check then
                 call RemoveItem(GetItemOfTypeFromUnit(HeroPick,ItemP))
                 call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Items\\AIem\\AIemTarget.mdl",HeroPick,"origin" ))
                 call SetPlayerState(p1,PLAYER_STATE_RESOURCE_GOLD,GetPlayerState(p1,PLAYER_STATE_RESOURCE_GOLD + Gold * -1))
                 call UnitAddItemById(HeroPick,ItemN)
                 call SaveInteger(udg_Items,ItemN,0,Code)
             else
                 call AttachSoundToUnit(gg_snd_Error,u)
                 call SetSoundVolume(gg_snd_Error,127)
                 call StartSound(gg_snd_Error)
                 call DisplayTimedTextToPlayer(p1,0,0,5.,"|c00C4B200You do not have enough resources to craft this item.|r")
             endif
       else
             call AttachSoundToUnit(gg_snd_Error,u)
             call SetSoundVolume(gg_snd_Error,127)
             call StartSound(gg_snd_Error)
             call DisplayTimedTextToPlayer(p1,0,0,5.,"|c00C4B200You cannot use|r |c0000B200" + Name + "|r")
       endif

       set HeroPick = null
       set u = null
       set un = null
       set g = null
       set p1 = null
endfunction


От моего FICS тут система отличается. Не возбраняется :)


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

FatalBladeДата: Четверг, 01 Декабря 2011, 20:49:32 | Сообщение # 12
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
[DUОS], спс большое работает на ура! И главное быстрее чем до этого

 

[DUОS]Дата: Четверг, 01 Декабря 2011, 21:07:19 | Сообщение # 13
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
FatalBlade,
Всегда пожалуйста ;)


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

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

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