function Trig_Hero_Chosen_Actions takes nothing returns nothing local unit Hero local integer id = GetSpellAbilityId() local integer ex = LoadInteger(udg_Abilities, id, 9) local sound s = LoadSoundHandle(udg_Abilities, id, 10) local unit u = GetTriggerUnit() local player p = GetOwningPlayer(u) local integer a = GetPlayerId(p) + 1 local unit ud local integer i = 1 local real x local real y call RemoveUnit(u) set udg_AbilityCounter[a] = 0
if ((p == Player(1)) or (p == Player(2)) or (p == Player(4)) or (p == Player(6)) or (p == Player(9))) then if ( GetLocalPlayer() == p ) then call PanCameraToTimed( GetLocationX(udg_Good), GetLocationY(udg_Good), 0 ) endif set Hero = CreateUnitAtLoc( p, ex, udg_Good, 0) endif if ((p == Player(0)) or (p == Player(3)) or (p == Player(5)) or (p == Player(7)) or (p == Player(8))) then if ( GetLocalPlayer() == p ) then call PanCameraToTimed( GetLocationX(udg_Bad), GetLocationY(udg_Bad), 0 ) endif set Hero = CreateUnitAtLoc( p, ex, udg_Bad, 0) endif
if (GetUnitTypeId(Hero) == 'H00S') then call TriggerRegisterUnitEvent( gg_trg_SufferTake, Hero, EVENT_UNIT_DAMAGED ) call SaveBoolean(udg_Hash, GetHandleId(Hero), 0, false) endif if (GetUnitTypeId(Hero) == 'H00P') then call TriggerRegisterUnitEvent( gg_trg_Blood_to_Soul_Loop, Hero, EVENT_UNIT_DAMAGED ) endif if (GetUnitTypeId(Hero) == 'H00Q') then call TriggerRegisterUnitEvent( gg_trg_GOTM_Damage, Hero, EVENT_UNIT_DAMAGED ) call SaveBoolean(udg_Hash, GetHandleId(Hero), 0, false) endif if (GetUnitTypeId(Hero) == 'H000') then call SaveBoolean(udg_Hash, GetHandleId(Hero), 0, false) endif if (GetUnitTypeId(Hero) == 'H00X') then call SaveBoolean(udg_Hash, GetHandleId(Hero), 82, false) endif if (GetUnitTypeId(Hero) == 'H008') then call SaveBoolean(udg_Hash, GetHandleId(Hero), 72, false) endif if (GetUnitTypeId(Hero) == 'H00A') then call SaveBoolean(udg_Hash, GetHandleId(Hero), 79, false) endif if (GetUnitTypeId(Hero) == 'H03R') then call SaveBoolean(udg_Hash, GetHandleId(Hero), 89, false) endif
call FlushChildHashtable(udg_Abilities, id) set udg_HeroesPlaying[a] = Hero set Hero = null set s = null set ud = null set u = null set p = null endfunction
Тут присутствуют глобалки. Они все влияют на игру в дальнейшем. udg_Bad и udg_Good - 2 глобальные точки на карте, где воскрешаются герои. udg_HeroesPlaying[a] - Массив героев, которые уже куплены игроками. Можно и хэш сделать, но влом))) Да и не важно, 1 глоб-массив не испортит игру. udg_AA[a] и udg_ClassSkillsGroup[a] - Долго обьяснять для чего они, но они нужны. Мне же нужно оптимизировать сам код, что бы работал быстрее.
Я бы убрал в самом начале функу создания юнита в локе, передвижение камеры через время (PanCameraToTimed) и заменил бы на PanCameraTo, ибо при нуле эффект будет одинаковым
Добавлено (30 Ноябрь 2011, 07:32:39) --------------------------------------------- Ну и лольное обилие скобок, ибо между (p == Player(1)) or (p == Player(3)) и p == Player(1) or p == Player(3) нет никакой разницы в результате, кроме как лишних символов в коде (скобок)
GetTriggerUnit() можно использовать дважды, не занося в локалку. Потери производительности не будет.
Ок.
Quote (SirNikolas)
call SelectUnit(Hero, GetLocalPlayer() == p)
А разве второй аргумент функции SelectUnit предназначен для условия выбора юнита? Помоему там что то другое
Quote (SirNikolas)
Раскрыть.
Я могу написать вот так?
Code
if ( GetLocalPlayer() == p ) then call SetCameraBounds(minX, minY, minX, maxY, maxX, maxY, maxX, minY) endif
Все минимумы и максимумы естественно обозначены заранее
Quote (SirNikolas)
В переменную.
ок
Добавлено (30 Ноябрь 2011, 22:03:51) ---------------------------------------------
Quote (Ty3uK)
Я бы убрал в самом начале функу создания юнита в локе,
Но если есть уже 2 глобальные локи на карте, которые не будут удаляться напротяжение всей игры, то почему бы и создать в локе? Смысл юзать координаты, если есть константная точка?
Сообщение отредактировал FatalBlade - Среда, 30 Ноября 2011, 22:33:03
Смысл юзать координаты, если есть константная точка?
Смысл юзать константные точки, если есть константные координаты, которые оптимизатор подставляет прямо в код?
Quote (FatalBlade)
А разве второй аргумент функции SelectUnit предназначен для условия выбора юнита?
Там логическая, отвечающая за то, следует юнита добавить в выделение или удалить. Однако исхитрившись с GetLocalPlayer(), можно сделать что-то вроде условия.
Quote (FatalBlade)
if ( GetLocalPlayer() == p ) then call SetCameraBounds(minX, minY, minX, maxY, maxX, maxY, maxX, minY) endif
Скорее всего, можешь. P. S. Пиши поменьше скобок - это снижает читабельность кода.
Смысл юзать константные точки, если есть константные координаты, которые оптимизатор подставляет прямо в код?
А как их найти? Просто в самом ВЕ навести машкой на нужную точку, и переписать координаты которые будут высвечиваться в нижнем левом углу? Я думал об этом, но понял что это не так просто. В ВЕ координаты исчисляются по пронципу окна/графа, где точка (0,0) находится точно в середине экрана. То есть на карте есть и отрицательные координаты. А ведь джасс походу считает координаты по другому - там точка (0,0) находится в верхнем левом углу... нет?
udg_Bad и udg_Good - 2 глобальные точки на карте, где воскрешаются герои.
Лучше udg_GoodX, udg_GoodY и с Bad аналогично. Код не поддаётся никаким комментариям просто... Куда катятся джассеры Инфо, в конце концов?
Code
function Trig_Hero_Chosen_Conditions takes nothing returns boolean return GetUnitTypeId(GetTriggerUnit()) == 'n00G' or GetUnitTypeId(GetTriggerUnit()) == 'n009' endfunction
function Trig_Hero_Chosen_Actions takes nothing returns nothing local unit Hero local integer id = GetSpellAbilityId() local integer ex = LoadInteger(udg_Abilities, id, 9) local sound s = LoadSoundHandle(udg_Abilities, id, 10) local unit u = GetTriggerUnit() local player p = GetOwningPlayer(u) local integer a = GetPlayerId(p) + 1 local unit ud local integer i = 1 local real x local real y call RemoveUnit(u) set udg_AbilityCounter[a] = 0
if IsPlayerAlly(p,Player(1)) then if ( GetLocalPlayer() == p ) then call PanCameraToTimed( GetLocationX(udg_Good),GetLocationY(udg_Good),0.) endif set Hero = CreateUnit(p,ex,GetLocationX(udg_Good),GetLocationY(udg_Good),0.) elseif IsPlayerAlly(p,Player(0)) then if ( GetLocalPlayer() == p ) then call PanCameraToTimed(GetLocationX(udg_Bad),GetLocationY(udg_Bad),0.) endif set Hero = CreateUnit(p,ex,GetLocationX(udg_Bad),GetLocationY(udg_Bad),0.) endif
if GetUnitTypeId(Hero) == 'H00S' then call TriggerRegisterUnitEvent(gg_trg_SufferTake, Hero, EVENT_UNIT_DAMAGED) call SaveBoolean(udg_Hash,GetHandleId(Hero), 0, false) elseif GetUnitTypeId(Hero) == 'H00P' then call TriggerRegisterUnitEvent(gg_trg_Blood_to_Soul_Loop,Hero,EVENT_UNIT_DAMAGED) elseif GetUnitTypeId(Hero) == 'H00Q' then call TriggerRegisterUnitEvent(gg_trg_GOTM_Damage,Hero,EVENT_UNIT_DAMAGED) call SaveBoolean(udg_Hash,GetHandleId(Hero),0,false) elseif GetUnitTypeId(Hero) == 'H000' then call SaveBoolean(udg_Hash,GetHandleId(Hero),0,false) elseif GetUnitTypeId(Hero) == 'H00X' then call SaveBoolean(udg_Hash,GetHandleId(Hero),82,false) elseif GetUnitTypeId(Hero) == 'H008' then call SaveBoolean(udg_Hash,GetHandleId(Hero),72,false) elseif GetUnitTypeId(Hero) == 'H00A' then call SaveBoolean(udg_Hash,GetHandleId(Hero),79,false) elseif GetUnitTypeId(Hero) == 'H03R' then call SaveBoolean(udg_Hash,GetHandleId(Hero),89,false) endif
call FlushChildHashtable(udg_Abilities, id) set udg_HeroesPlaying[a] = Hero set Hero = null set s = null set ud = null set u = null set p = null endfunction