27

» WarCraft 3 / Не убирается общий обзор

Принятый ответ
что вы такого сделали что у вас не убирается? есть станд. способности абилы раздел разведка
Есть близзардские нативки:
IsUnitVisible - проверка: юнит видим ли игроком
IsUnitInvisible - проверка: невидим ли юнит для игрока
IsUnitDetected - проверка: юнит обнаружен игроком
IsLocationVisibleToPlayer или IsVisibleToPlayer - проверка: видима ли точка игроком
UnitShareVision - поделиться обзором юнита с другим игроком. Короче другой игрок видит, что делает чужой юнит. Вам нужна именно эта нативка это наверное в гуи в разделе "юнит"
если имеете в виду общий обзор между игроками. то это в разделе союза между игроками (в гуи раздел игрок). но это распространяется на всех юнитов
есть еще в мем хаке
27

» XGM Team / XGM — Премия 2018 года

Komkozavr, можешь претендовать на титул "самый активный пользователь" или "человек-открытие 2018 года"
27

» WarCraft 3 / Отследить момент применения Сферы молний

Если бы это было простое применение (кликнул, гг кастанул), то сработало. Здесь же чисто атака. Здесь всякие атакующие пассивки предметов заставляют нацеплять бафф или применять каст. Ну выходит, что пассивные эффекты от Orb или Orb+Buff Placer нельзя отследить событием "юнит приводит способность в действие" или чем-то похожим (это проверил). Наверное поможет система урона. При получении урона проверяем весит ли бафф. Только, при событии "юнит получает урон" мб бафф появится не сразу (через 0 сек таймером) - такое бывает у некоторых
27

» WarCraft 3 / Система спавна по ID юнита (Пример ID:hfoo(Пехотинец)

Принятый ответ
Slashur, вы даете
call CreateUnitAtLoc(GetTriggerPlayer(), udg_ItemID, udg_temp_point, 0)
изменяете на
call CreateUnitAtLoc(GetTriggerPlayer(), udg_ItemID, udg_temp_point, 270)
всего 1 строчку. всего 1 аргумент. с нуля на 270 поменял и все. стандартное ориентация зданий = 270 град, записана в переменную.
хотел чтобы вы сами помучались. пробуй брать гуи,конвентировать в код. сравнивали. пример
статьи читали бы.
27

» WarCraft 3 / Система спавна по ID юнита (Пример ID:hfoo(Пехотинец)

Slashur, ээхх. все норм работает. там надо выключенный триггер "add unit" включить (спец выключил, написано при старте игры). Если вы не можете сами приспособить готовенькое, то уж извините.
вот переделал под твои потребности
Загруженные файлы
27

» WarCraft 3 / Система спавна по ID юнита (Пример ID:hfoo(Пехотинец)

Slashur, сделал пример выше. вот суть в том, что проверяем выделен ли хоть один юнит. Это можно запоминать, например группой тема И от этого пляшем. Выбираем первого юнита в группе, и около него создаем. По-другому никак. Варкрафте не выдает. Если только мем хаком.
код драколича
//конвентирует адрес юнита в юнита
//# +nosemanticerror
function I2Unit takes integer i returns unit
call setInt2Unit(ConvertUnitAddressToHandleIDNative(i))
return l__Int2Unit
endfunction
    //Выдает адрес выделенного юнита, панель интерфейса, которая отображена на экране у локального игрока
    //допустим выделив рамкой 2 юнитов: героя и раба, у вас будет отображаться в окне посерединке 2 иконки выделенных юнитов. Но сбоку меню будет переключено на героя (механика вара)
    //если взять нажать Tab, можно переключать меню на другого юнита, так с героя на раба
    function GetActiveUnitInSelection takes nothing returns integer
        return RMem(pGameUICurrentSelection+0x238)
    endfunction
просто думал мб какое-нибудь условие: выделен рабочий и так далее. я думаю тебе бессмысленно объяснять и делать. т.к. тебе надо самому научиться. все показано/разжевано. что еще надо? мем хак рано вам, и не факт что норм работать будет
27

» WarCraft 3 / Система спавна по ID юнита (Пример ID:hfoo(Пехотинец)

Вообще, есть функция CreateUnitByName.
Но разве там не на английском. Ввожу "Пехотинец", не создается. Ввожу "footman", создается. Даже нестандартные английские названия не принимает. Там какая база, где-то хранится, иначе наделаю 5 юнитов с одинаковым именем, как определяет? походу только с станд. равкодами юнитов
Slashur,
мне нужен спавн рядом с юнитом которого я выделил!
какой хитрый. Могу сделать. Но скажи мне, а если игрок выделил несколько юнитов, у какого юнита спавнить? мне нужно выбрать юнита. Выбрал первого попавшегося.
Загруженные файлы
27

» WarCraft 3 / Система спавна по ID юнита (Пример ID:hfoo(Пехотинец)

а выше скинул ссылку на карту с равкодом ID
карта с равкодом ID вводишь например "-hfoo" и спавнится пехотинец. Вводишь "-Hpal" создается герой паладин. Тут не только равкод можно юнита, но и итема, декора. Только надо брать соответствующую функцию, типа CreateItem для предмета или CreateUnit для юнита. Немного ту карту редакт с пояснениями, а то там может быть непонятно.
пример со строками вводишь в чат название юнита. Например: "-spawn Пехотинец", и вам спавнится пехотинец.
Загруженные файлы
27

» WarCraft 3 / Как сделать иконку спелла прозрачной?

вот тема не знаю поможет. Но текстуры земли делает прозрачными только таким способом.
27

» WarCraft 3 / Система спавна по ID юнита (Пример ID:hfoo(Пехотинец)

смотри тему кто-то похожее несколько месяцев назад задавал
вот ссылка на карту чтоб не читать тему, а сразу скачать готовенькое
можно просто бд сделать. Сделать два массива: имена юнитов и равкоды. Перебегаешь циклом, и сравниваешь введенное имя с именем, сохраненное в данном индексе массива. Если имена совпали выдаешь равкод. Главное из цикла просто индекс массива нужный вытащить.
Откуда обычный игрок будет знать равкоды. Если не предоставив ему в описании и не пойми где еще.
27

» WarCraft 3 / Скорость дамми юнита

Принятый ответ
держи
код
function Trig_P takes nothing returns nothing

    local integer i = 0
    local real f
    
    local real h = 360/udg_speed //кол-во вращении или промежутков
    local real v = 1/h //частота (короче общее время)
    set udg_speed = 360 * v * udg_C //угловая скорость
    
    //у нас могут изменяться 3 коэффициента: скорость, время, и коэффициент-множитель. К сожалению, время не смог вставить, т.к. нужно тогда изменять время таймера.
    
    set udg_A = ModuloReal(udg_A + udg_speed, 360) //угол вращения круга.
    
    if (GetLocalPlayer()==Player(0)) then
        // Use only local code (no net traffic) within this block to avoid desyncs.
        call ClearTextMessages()
    endif
    call BJDebugMsg("угол вращения круга: " + R2S(udg_A))
    call BJDebugMsg("угловая скорость speed: " + R2S(udg_speed) )
    call BJDebugMsg("условное время t: " + R2S(v) + "; время таймера T: " + R2S(udg_T))
    call BJDebugMsg("множитель speed: " + R2S(udg_C))
    

    loop
        exitwhen i >= udg_K
            
            set f = udg_A + udg_B*i
            
            call SetUnitX(udg_U[i],GetUnitX(udg_Hero)+  400*CosBJ(f))
            call SetUnitY(udg_U[i],GetUnitY(udg_Hero)+  400*SinBJ(f))
        set i = i + 1
    endloop

    
endfunction

function Trig_Init_Actions takes nothing returns nothing
    
    set udg_R = 400 //радиус
    set udg_A = 30.00 //запоминалка. текущий угол круга. когда круг вращается, изменяется только этот угол. при создании даймиков запоминаем угол
    set udg_speed = 15.00 //назовем это угловой скоростью. каждый тик таймера прибавляем 15 градусов. короче круг вместе с юнитами поворачивается на 15 град каждый тик
    
    set udg_C = 1.00 //это множитель ускорения (100%). будет домножать на скорость
    
    set udg_K = 3 //кол-во юнитов
    set udg_B = ( 360.00 / udg_K ) //угловое расстояние между юнитами
    set udg_TIMER = CreateTimer() //таймер
    set udg_T = 0.03 //время таймера
    set udg_Hero = gg_unit_Hpal_0000
    
    set udg_U[0] = CreateUnit(Player(0),'hpea',GetUnitX(udg_Hero),GetUnitY(udg_Hero), 0)
    set udg_U[1] = CreateUnit(Player(0),'hpea',GetUnitX(udg_Hero),GetUnitY(udg_Hero), 0)
    set udg_U[2] = CreateUnit(Player(0),'hpea',GetUnitX(udg_Hero),GetUnitY(udg_Hero), 0)
    
    call SetUnitX(udg_U[0],GetUnitX(udg_Hero)+udg_R*Cos(30*bj_DEGTORAD))
    call SetUnitY(udg_U[0],GetUnitY(udg_Hero)+udg_R*Sin(30*bj_DEGTORAD))
    
    call SetUnitX(udg_U[1],GetUnitX(udg_Hero)+udg_R*Cos(150*bj_DEGTORAD))
    call SetUnitY(udg_U[1],GetUnitY(udg_Hero)+udg_R*Sin(150*bj_DEGTORAD))
    
    call SetUnitX(udg_U[2],GetUnitX(udg_Hero)+udg_R*Cos(270*bj_DEGTORAD))
    call SetUnitY(udg_U[2],GetUnitY(udg_Hero)+udg_R*Sin(270*bj_DEGTORAD))
    
    call TimerStart(udg_TIMER, udg_T, true, function Trig_P)
    
endfunction

//===========================================================================
function InitTrig_Init takes nothing returns nothing
    set gg_trg_Init = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Init, function Trig_Init_Actions )
endfunction
Загруженные файлы
27

» WarCraft 3 / Скорость дамми юнита

добавь переменную-множитель R
R = 1.00 (изначально)
R = 2.00 (если ты хочешь изменить динамично в 2 раза скорость, изменяешь переменную R)
GetUnitX(hero)+ (rad*R)*Cos(a[i])
GetUnitY(hero)+ (rad*R)*Sin(a[i])
все изменения происходят относительно точки GetUnitX, GetUnitY
Или время задаешь с малой периодичностью и с нужными rad.
27

» WarCraft 3 / Вернуть кликабельность юниту после москитов

мб у модели отсутствует коллизион формы тема? как бы после москитов она не возвращается на место. как бы близзард не предусмотрели то, что кто-то будет удалять, и поэтому она не возвращает в норм при удалении.
27

» XGM Team / Обновление 2018 - Stage 4

а жаль нельзя ли добавить индивидуальный чат в личную переписку. неудобство в общении с юзером кучу сообщении, и их приходится еще листать. бывает по 5 раз смотришь что написал 5 сообщениями ранее. И допустим сейчас. Выискивать то сообщение с пользователем, где прислал код или картинку, чтоб быстро сравнить. типа написал и у тебя образовался чатик с юзером сверху вниз. удобно же.
27

» WarCraft 3 / Триггеры

Принятый ответ
ну это совсем. такие вопросы. вам надо изучить триггеры.
ну с другими характеристиками, вам тогда нужно пересоздать юнита.
событие - юнит умирает <=найдете
условие - твой тип (триггер юнит) равно "укажите свой" <= сравнение тип юнита type of unit
действие - создать юнита (игроку-владельцу (триггер юнит)), тип, позиция умирающего <= раздел боевая единица, самое первое действие CreateUnit
есть способности сумонов пауков, гидры (см. тема)
27

» WarCraft 3 / Ограничение зарядов

примеры тебе скинул.
мне второй вариант не понятен. смотри у тебя есть два типа разных. осколок 1 и осколок 2. просто не понятно какому типу зачислять чарды, если будут несколько. И поэтому зачисляю первому имеющему итему (и не важно, будь это тип 1 или тип 2).
Загруженные файлы
27

» WarCraft 3 / Исследование порчи (Blight)

8gabriel8, да не за что.
вот еще рисунки. то что не досказал ранее
этот опыт на рисунке выше можно использовать для распространения свой порчи. Дело в том, что триггерная лучше. Т.к. нативки тупят.
Действительно, как и автор сказал. Используя наведение порчи через рект, у меня происходит смещение порчи влево-вниз на 32 размера (скрин ниже). А через точку с кругом для меня странно работает, в частности размеры непонятные (скорее всего SetBlight задается диаметр, а не радиус, путает), но такой ромб можно попробовать свой сделать.
Исправить как у терраина не получится, дело в нативке по всей видимости. Используйте SetPathingRect. Функция SetPathingRect позволяет вам свободно редактировать как хотите. Единственное, что неизвестно как будет на деревья, реген порчи распространяться это?
кому надо код SetPathingRect (короче описал всю работу с ректами)
function SetPathingRect takes rect re, pathingtype pt, boolean pathable returns nothing
    //probably this trigger won't work if you don't snap the regions to the grid

    //available pathing types
//PATHING_TYPE_ANY                 //if this is false you can't walk/build/fly on it
//PATHING_TYPE_WALKABILITY         //if this is false you can't walk on it
//PATHING_TYPE_FLYABILITY          //if this is false you can't fly on it
//PATHING_TYPE_BUILDABILITY        //if this is false you can't build on it
//PATHING_TYPE_PEONHARVESTPATHING  //don't know
//PATHING_TYPE_BLIGHTPATHING       //if this is false you can't build ziggs on it
//PATHING_TYPE_FLOATABILITY        //don't know
//PATHING_TYPE_AMPHIBIOUSPATHING   //don't know

    local real r = 32  //size of pathing blocks
    local real x = GetRectMinX(re)
    local real y
    local real x2 = GetRectMaxX(re)
    local real y2 = GetRectMaxY(re)

    loop
        exitwhen x == x2
        set y = GetRectMinY(re)
        loop
            exitwhen y == y2
            call SetTerrainPathable(x, y, pt, pathable)
            set y = y + r
        endloop
        set x = x + r
    endloop
    call RemoveRect(re)
    set re = null
    set pt = null
endfunction
тема вот код GetPathingRect, если нужно проверить свободен ли рект и прочее.
тема ректы можно двигать, и прочее. Еще можно добавлять в регионы, очищать из региона. Регионы можно использовать в качестве проверки. Можно использовать похожий метод в GetPathingRect, только проверяем не тип терраина, а лежит ли точка в регионе. Мне было очень необходима проверка особого типа терраина.
Есть еще такая информация
local real x = -1824
local real y = -1824
local real r = 32
local boolean b = false
local integer i =0
loop
    exitwhen i > 14
    call SetTerrainPathable(x, y, PATHING_TYPE_BLIGHTPATHING, b)
    set i = i + 1
    set y = y + r
endloop
с кругом поможет такая тема хотя если говорить про круг. Там проблема с текстурами, так как изображение занимает клетку 128х128. Ты никак не сможешь сделать изображение клетки меньше чем 128. Поэтому придется занять все 12 клеток. Или сосчитать максимальное количество точек, которые попали в радиус.
Надо как=то придумать с кругом.
Загруженные файлы
27

» WarCraft 3 / Ограничение зарядов

Принятый ответ
Вы так не понятно разъясняете свои мысли. Сделать можно по-разному.
ограничить складывание зарядов от двух итемов в один слот. Пример максимум зарядов до 5.
зелье 1 заряд + зелье 1 заряд = зелье 2 заряда
если у зелья больше 5 зарядов, не складывать. Будет складываться в новый слот инвентаря. Есть и этот слот забьет, то складывать в новый.
> ??Событие:??
> -Боевая единица - A unit Получает предмет 
> ??Условие:??
> -(Item-type of (Item being manipulated))) == "Предмет1")
> ??Действие:??
> -Set "переменная Целочисленная 1" = 0 //кол-во итемов одного типа в инвентаре
> -Set "переменная Целочисленная 2" = 0 //кол-во общих зарядов
> -Set "переменная Целочисленная 3" = 0 //номер массива
> -For each (Integer A) from 1 to 6, fo (Actions)
> --Цикл - действия:
> ---If\Then\Else, multiple function
> ----Если - условие:
> -----(Item type of (Item carried by(Hero manipulating item) in slot (Integer A))) равно "Предмет1")
> -----(Charges remaining in (Item carried by(Hero manipulating item) in slot (Integer A))) меньше 5)
> ----То - Действие:
> -----Set "переменная Целочисленная 1" = (Set "переменная Целочисленная 1" + 1)
> -----Set "переменная Целочисленная 2" = (Set "переменная Целочисленная 2" + Charges remaining in(Item carried by(Hero manipulating item) in slot (Integer A)))
> -----Set "переменная Целочисленная 3" = Integer A
> - If\Then\Else, multiple function
> -- Если - условие:
> --- ("переменная Целочисленная 1" больше 1)
> --То - Действие:
> --- If\Then\Else, multiple function
> ---- Если - условие:
> ----- ("переменная Целочисленная 2" больше 5)
> ----То - Действие:
> ------ Предмет - Set Charges remaining in (Item carried by(Hero manipulating item) in slot ("переменная Целочисленная 3") to (5) //первому перекидываем 5 зарядов
> ------ Предмет - Set Charges remaining in (Item being manipulated) to ("переменная Целочисленная 2"- 5) //оставшиеся заряды перебрасываем второму "подобранному" итему
> ---- Иначе - Действие:
> -----Предмет - Set Charges remaining in (Item carried by(Hero manipulating item) in slot ("переменная Целочисленная 3") to ("переменная Целочисленная 2") //все заряды отдаем первому
> -----Предмет - Remove (Item being manipulated) //а подобранный итем удаляем, словно его и не было
хочу сделать чтобы заряды увеличивались от другого предмета
Два предмета складываются в один. Например "шар 1" и "шар 2" = "шар 1" с 2 зарядами.
Вам достаточно добавить блок-схему условие-1 ИЛИ условие-2
можешь подобрать гриб-1, так можно подобрать гриб-2, главное чтобы один из них сработал.
> ??Событие:??
> -Боевая единица - A unit Получает предмет 
> ??Условие:??
> -(Multiple Conditions Or - Any (Conditions) are true //позволяет вставить проверку нескольких условии. Или первый тип или второй тип. 
> --(Item-type of (Item being manipulated))) == "Предмет1")
> --(Item-type of (Item being manipulated))) == "Предмет2")
> ??Действие:??
> -Set "переменная Целочисленная 1" = 0 //кол-во итемов одного типа в инвентаре
> -Set "переменная Целочисленная 2" = 0 //кол-во общих зарядов
> -Set "переменная Целочисленная 3" = 0 //номер массива
> -For each (Integer A) from 1 to 6, fo (Actions)
> --Цикл - действия:
> ---If\Then\Else, multiple function
> ----Если - условие:
> -----(Multiple Conditions Or - Any (Conditions) are true
> ------(Item type of (Item carried by(Hero manipulating item) in slot (Integer A))) равно "Предмет1")
> ------(Item type of (Item carried by(Hero manipulating item) in slot (Integer A))) равно "Предмет2")
> -----(Charges remaining in (Item carried by(Hero manipulating item) in slot (Integer A))) меньше 5)
> ----То - Действие:
> -----Set "переменная Целочисленная 1" = (Set "переменная Целочисленная 1" + 1)
> -----Set "переменная Целочисленная 2" = (Set "переменная Целочисленная 2" + Charges remaining in(Item carried by(Hero manipulating item) in slot (Integer A)))
> -----Set "переменная Целочисленная 3" = Integer A
> - If\Then\Else, multiple function
> -- Если - условие:
> --- ("переменная Целочисленная 1" больше 1)
> --То - Действие:
> --- If\Then\Else, multiple function
> ---- Если - условие:
> ----- ("переменная Целочисленная 2" больше 5)
> ----То - Действие:
> ------ Предмет - Set Charges remaining in (Item carried by(Hero manipulating item) in slot ("переменная Целочисленная 3") to (5) //первому перекидываем 5 зарядов
> ------ Предмет - Set Charges remaining in (Item being manipulated) to ("переменная Целочисленная 2"- 5) //оставшиеся заряды перебрасываем второму "подобранному" итему
> ---- Иначе - Действие:
> -----Предмет - Set Charges remaining in (Item carried by(Hero manipulating item) in slot ("переменная Целочисленная 3") to ("переменная Целочисленная 2") //все заряды отдаем первому
> -----Предмет - Remove (Item being manipulated) //а подобранный итем удаляем, словно его и не было
27

» WarCraft 3 / CS: set bj_wantDestroyGroup = true

Вы знаете джаз? надо знать где эта переменная используется. И используется не везде. Никогда такую штуку не использовал. Быстрая ли она или нет, вот этого я не знаю.
ForGroupBJ
function ForGroupBJ takes group whichGroup, code callback returns nothing
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    call ForGroup(whichGroup, callback)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(whichGroup)
    endif
endfunction
CountUnitsInGroup
function CountUnitsInGroup takes group g returns integer
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    set bj_groupCountUnits = 0
    call ForGroup(g, function CountUnitsInGroupEnum)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(g)
    endif
    return bj_groupCountUnits
endfunction
GroupAddGroup
function GroupAddGroup takes group sourceGroup, group destGroup returns nothing
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    set bj_groupAddGroupDest = destGroup
    call ForGroup(sourceGroup, function GroupAddGroupEnum)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(sourceGroup)
    endif
endfunction
GroupPickRandomUnit
function GroupPickRandomUnit takes group whichGroup returns unit
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    set bj_groupRandomConsidered = 0
    set bj_groupRandomCurrentPick = null
    call ForGroup(whichGroup, function GroupPickRandomUnitEnum)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(whichGroup)
    endif
    return bj_groupRandomCurrentPick
endfunction
GroupRemoveGroup
function GroupRemoveGroup takes group sourceGroup, group destGroup returns nothing
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    set bj_groupRemoveGroupDest = destGroup
    call ForGroup(sourceGroup, function GroupRemoveGroupEnum)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(sourceGroup)
    endif
endfunction
IsUnitGroupDeadBJ
function IsUnitGroupDeadBJ takes group g returns boolean
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    set bj_isUnitGroupDeadResult = true
    call ForGroup(g, function IsUnitGroupDeadBJEnum)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(g)
    endif
    return bj_isUnitGroupDeadResult
endfunction
IsUnitGroupEmptyBJ
function IsUnitGroupEmptyBJ takes group g returns boolean
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    set bj_isUnitGroupEmptyResult = true
    call ForGroup(g, function IsUnitGroupEmptyBJEnum)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(g)
    endif
    return bj_isUnitGroupEmptyResult
endfunction
аргументы функции хоть и являются локалками, но эти аргументы обнуляются. Так что все тут нормально. Утечек нет. Все норм. Насколько это удобно для вас.
Jack-of-shadow:
Для мгновенных действий одной глобалки хватает, тоже самое с точками юнитами эффектами и прочим. Завёл по одной переменной каждого типа. И юзай на здоровье вместо локалок.
согласен проще темповую глобалку на все. так как варкрафт потоки выполняет последовательно. Параллельно не может играть обрабатывать их. Поэтому вряд ли перезапишут эту глобалку