|
|
|
|
[Заказ] Оптимизация очень важного кода
|
|
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
Блокировки:
| Скажу честно- не изобретай велосипед- лучше изучи Фикс Дуоса, он того стоит
|
|
|
|
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
|
|
|
|
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, Всегда пожалуйста
|
|
|
|
|
|
|
|
|
|
|