27

» WarCraft 3 / Как перенести счётчик объектов на другую карту?

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

» WarCraft 3 / Как перенести счётчик объектов на другую карту?

Вроде все работает норм. Посмотрел, сравнил с другими версиями HandleCounter у нас на сайте (посмотреть, что изменил ты), проверил. Единственное отличие это то, что там глобалка создана через редактор переменных с приставкой udg_ Не понимаю в чем проблема? не работает что-то? должна работать все
При переносе:
-копируешь все код, вставляешь в себе в корневую папку
-не забудь объявить переменную HandleBoard. Скорее всего из-за нее варкрафт критует
-и старт записан в единственном триггере runSeachHandle
Кстати HandleCounter есть у нас на сайте. И не только.
27

» WarCraft 3 / Перемещение юнитов с тем же положением

Roy Mustang, ок, тебя понял. но только сейчас заметил ошибку в моем коде. Сверху вниз или снизу вверх норм поворачивает, а вот слева направо (поворот на 90 градусов), что-то не то получается (не туда спавнится). Пробую исправить как часа 2, что-то не знаю как
Все исправил свою ошибку
вот код

//угол между двумя углами. Взята на сайте в разделе Алгоритмы
function GetAngleDifference takes real a1, real a2 returns real
    local real x
    set a1 = ModuloReal(a1, 360)
    set a2 = ModuloReal(a2, 360)
    if (a1 > a2) then
        set x = a1
        set a1 = a2
        set a2 = x
    endif
    set x = a2 - 360
    if (a2 - a1 > a1 - x) then
        set a2 = x
    endif
    return RAbsBJ(a1 - a2)
endfunction

//функцию GetAngle можно удалить, она была расчитана на то, что значения угла будут от 0 до 360 градусов. Типа может быть так, что значения попадаться будет не те. 7200 градусов - это 20 оборотов, или -7200 градусов - 20 оборотов в другую сторону. Эту функция не пригодилась и была недоделана 
function GetAngle takes real a returns real

local real B = a

if B > 6.28 then //6.28 радиан - 0 градусов или 360 градусов
loop
exitwhen (B <= 6.28)
set B = B - 6.28
endloop
elseif B < 0 then
loop
exitwhen (B >= 0)
set B = B + 6.28
endloop

endif

return B
endfunction

//Функция SinX определяет знаки по чертвертям (1 и 2 четверть положительный знак, а другие две четверти отрицательны). Вычисление проводить в радианах.
function SinX takes real angle returns real
local real s= angle //GetAngle(angle)
if s > 3.14 and s < 6.28 then  //3.14 радиан - число Пи или 180 градусов, 6.28 радиан - число "2 Пи" или 0 (360) градусов
return (-1)
else
return (1)
endif
endfunction

//Функция SinB позволяет убрать нули, точнее когда значение равно нулю. Иначе сбивает всю систему координат. Вычисление проводить в радианах.
function SinB takes real angle returns real
local real s= Sin(angle)
if s == 0 then //Если получается ноль, то ставим 1
return 1
else //Иначе оставляем все без изменений, только знак угла нужно вычислить
return s *SinX(angle)
endif
endfunction

//Функция CosX определяет знаки по чертвертям (2 и 3 четверть положительный знак, а другие две четверти (1 и 4) отрицательны). Вычисление проводить в радианах.
function CosX takes real angle returns real
local real s = angle //= GetAngle(angle)
if s > 1.57 and s < 4.71 then //1.57 радиан = Пи/2 или 90 градусов, 4.71 радиан = 2Пи или 270 градусов 
return 1
else
return (-1.)
endif
endfunction


//Функция CosB позволяет убрать нули, точнее когда значение равно нулю. Иначе сбивает всю систему координат. Вычисление проводить в радианах.
function CosB takes real angle returns real
local real c= Cos(angle)
if c == 0 then //Если получается ноль, то ставим 1
return 1
else  //Иначе оставляем все без изменений, только знак угла нужно вычислить
return c *CosX(angle)
endif
endfunction


function TZX takes nothing returns nothing
local real Ux = GetUnitX(GetEnumUnit()) //координаты юнита
local real Uy = GetUnitY(GetEnumUnit())
local real Tx1 = GetRectCenterX(gg_rct_T3) //координаты первого прямоугольника, точнее координаты центра (x,y)
local real Ty1 = GetRectCenterY(gg_rct_T3)
local real Tx2 = GetRectCenterX(gg_rct_T4) //координаты второго прямоугольника, точнее координаты центра (x,y)
local real Ty2 = GetRectCenterY(gg_rct_T4)
local real A1 = 270. //направление первого прямоугольника вниз 270 градусов, точнее куда нужно смотреть. Мы распологаем на прямоугольную площадку юнитов.
local real A2 = 360. //направление второго прямоугольника вправо 360 градусов, точнее спавн вправо. Это как если вы перевернули прямоугольник.
local real dx = Ux - Tx1 //направление вектора (ось x), из конца вычитаем начало
local real dy = Uy - Ty1 //направление вектора (ось y), из конца вычитаем начало


local real angle = A2-A1//этот angle - угол, на которое требует повернуть (либо вправо +, либо влево -), чтобы получился угол A2. Желательно, минимальный угол.
//значение угла можно определить функцией GetAngleDifference(270,360), так тоже будет правильно. Разницы нет никакой. Только вот в GetAngleDifference определяет минимальный угол, но это может сбить знак угла, вот чего боюсь. Пока отклонений не наблюдал
//поворачиваем вправо на 90 градусов (из отметки 270 градусов поворачиваем к отметке 360 градусам)

local real A = (angle*bj_DEGTORAD)//переводим из градусов в радианы



local real Dx = dx * Cos(A) - dy * Sin(A)//расстояние относительно от центра Tx1 на оси x с учетом поворота на угол А
local real Dy = dx * Sin(A) + dy * Cos(A)//dy* SinB( A )//расстояние относительно от центра Ty1 на оси y с учетом поворота на угол А

local real Sx = Tx2 + Dx //смещение от центра Tx2 на расстояние Dx
local real Sy = Ty2 + Dy//смещение от центра Ty2 на расстояние Dy


//дебаг
call BJDebugMsg("Координата dy: " + R2S(  dy    ))
call BJDebugMsg("Координата X: " + R2S(  Dx    ))
call BJDebugMsg("Координата У: " + R2S(  Dy    ))
call BJDebugMsg("Координата SX: " + R2S(  Sx    ))
call BJDebugMsg("Координата SУ: " + R2S(  Sy    ))

//либо спавним нового юнита

call CreateUnit(GetOwningPlayer(GetEnumUnit()),GetUnitTypeId(GetEnumUnit()), Sx, Sy, GetUnitFacing(GetEnumUnit())+angle)


//либо самого юнита перемещаем (пока эта возможность отключил)

//call SetUnitX(GetEnumUnit(),Sx)
//call SetUnitY(GetEnumUnit(),Sy)
//call SetUnitFacing(GetEnumUnit(),GetUnitFacing(GetEnumUnit())+angle)
endfunction


function TZZ takes nothing returns nothing
local real Ux = GetUnitX(GetEnumUnit()) //координаты юнита
local real Uy = GetUnitY(GetEnumUnit())
local real Tx1 = GetRectCenterX(gg_rct_T1) //координаты первого прямоугольника, точнее координаты центра (x,y)
local real Ty1 = GetRectCenterY(gg_rct_T1)
local real Tx2 = GetRectCenterX(gg_rct_T2) //координаты второго прямоугольника, точнее координаты центра (x,y)
local real Ty2 = GetRectCenterY(gg_rct_T2)
local real A1 = 270. //направление первого прямоугольника вниз 270 градусов, точнее куда нужно смотреть. Мы распологаем на прямоугольную площадку юнитов.
local real A2 = 90. //направление второго прямоугольника вверх 90 градусов, точнее спавн вверх. Это как если вы перевернули прямоугольник.
local real dx = Ux - Tx1 //направление вектора (ось x), из конца вычитаем начало
local real dy = Uy - Ty1 //направление вектора (ось y), из конца вычитаем начало


local real angle = A2-A1//этот angle - угол, на которое требует повернуть (либо вправо +, либо влево -), чтобы получился угол A2. Желательно, минимальный угол.
//значение угла можно определить функцией GetAngleDifference(270,90), так тоже будет правильно. Разницы нет никакой. Только вот в GetAngleDifference определяет минимальный угол, но это может сбить знак угла, вот чего боюсь. Пока отклонений не наблюдал
//поворачиваем ввверх на 180 градусов (из отметки 270 градусов поворачиваем к отметке 90 градусам)

local real A = (angle*bj_DEGTORAD)//переводим из градусов в радианы



local real Dx = dx * Cos(A) - dy * Sin(A)//расстояние относительно от центра Tx1 на оси x с учетом поворота на угол А
local real Dy = dx * Sin(A) + dy * Cos(A)//расстояние относительно от центра Ty1 на оси y с учетом поворота на угол А

local real Sx = Tx2 + Dx//смещение от центра Tx2 на расстояние Dx
local real Sy = Ty2 + Dy//смещение от центра Ty2 на расстояние Dy


//дебаг
call BJDebugMsg("Координата DX: " + R2S(  Dx    ))
call BJDebugMsg("Координата DУ: " + R2S(  Dy    ))
call BJDebugMsg("Координата SX: " + R2S(  Sx    ))
call BJDebugMsg("Координата SУ: " + R2S(  Sy    ))

//либо спавним нового юнита

call CreateUnit(GetOwningPlayer(GetEnumUnit()),GetUnitTypeId(GetEnumUnit()), Sx, Sy, GetUnitFacing(GetEnumUnit())+angle)


//либо самого юнита перемещаем (пока эта возможность отключил)

//call SetUnitX(GetEnumUnit(),Sx)
//call SetUnitY(GetEnumUnit(),Sy)
//call SetUnitFacing(GetEnumUnit(),GetUnitFacing(GetEnumUnit())+angle)
endfunction

function TXX takes nothing returns nothing
    call GroupEnumUnitsInRect(bj_lastCreatedGroup,(gg_rct_T1), null)
    call ForGroup( bj_lastCreatedGroup, function TZZ )
    call GroupClear(bj_lastCreatedGroup)
    call GroupEnumUnitsInRect(bj_lastCreatedGroup,(gg_rct_T3), null)
    call ForGroup( bj_lastCreatedGroup, function TZX )
    call GroupClear(bj_lastCreatedGroup)
endfunction

//===========================================================================
function InitTrig_ZZZ takes nothing returns nothing
    set gg_trg_ZZZ = CreateTrigger(  )
    set bj_lastCreatedGroup = CreateGroup()
    call TriggerRegisterTimerEventPeriodic( gg_trg_ZZZ, 10.00 )
    call TriggerAddAction( gg_trg_ZZZ, function TXX )
endfunction
помогла инфа
Загруженные файлы
27

» WarCraft 3 / Перемещение юнитов с тем же положением

Вот еще один пример. Область - проще говоря это прямоугольник. А представьте, что, если у каждого прямоугольника, как и у юнита, был угол поворота, то есть туда куда смотрит (вверх - 90 град, вниз - 270, влево - 180, вправо - 360). Короче говоря прямоугольник можно было перевернуть как шахматную доску на определенный угол. Проблема в том, что у каждой области угол разный (у одного прямоугольника 90 град, значит помещаешь юнитов лицом вверх. А спавнишь лицом вниз, так как у другого прямоугольника 270 град)
код
код получился такой. С тригонометрией проблеммы, мб функция Atan2 быстрее помогла.

//угол между двумя углами. Взята на сайте в разделе Алгоритмы
function GetAngleDifference takes real a1, real a2 returns real
    local real x
    set a1 = ModuloReal(a1, 360)
    set a2 = ModuloReal(a2, 360)
    if (a1 > a2) then
        set x = a1
        set a1 = a2
        set a2 = x
    endif
    set x = a2 - 360
    if (a2 - a1 > a1 - x) then
        set a2 = x
    endif
    return RAbsBJ(a1 - a2)
endfunction

//функцию GetAngle можно удалить, она была расчитана на то, что значения угла будут от 0 до 360 градусов. Типа может быть так, что значения попадаться будет не те. 7200 градусов - это 20 оборотов, или -7200 градусов - 20 оборотов в другую сторону. Эту функция не пригодилась и была недоделана  Не пригодится так как углы поворота прямоугольникам мы сами задаем, и поэтому не может быть такого
function GetAngle takes real a returns real

local real B = a

if B > 6.28 then //6.28 радиан - 0 градусов или 360 градусов
loop
exitwhen (B <= 6.28)
set B = B - 6.28
endloop
elseif B < 0 then
loop
exitwhen (B >= 0)
set B = B + 6.28
endloop

endif

return B
endfunction

//Функция SinX определяет знаки по чертвертям (1 и 2 четверть положительный знак, а другие две четверти отрицательны). Вычисление проводить в радианах.
function SinX takes real angle returns real
local real s= angle //GetAngle(angle)
if s > 0 and s < 3.14 and s < 6.28 then //3.14 радиан - число Пи или 180 градусов, 6.28 радиан - число "2 Пи" или 0 (360) градусов
return 1
elseif s > 3.14 and s < 6.28 then 
return (-1)
endif
endfunction

//Функция SinB позволяет убрать нули, точнее когда значение равно нулю. Иначе сбивает всю систему координат. Вычисление проводить в радианах.
function SinB takes real angle returns real
local real s= Sin(angle)
if s == 0 then //Если получается ноль, то ставим 1
return 1
else //Иначе оставляем все без изменений, только знак угла нужно вычислить
return s *SinX(angle)
endif
endfunction

//Функция CosX определяет знаки по чертвертям (2 и 3 четверть положительный знак, а другие две четверти (1 и 4) отрицательны). Вычисление проводить в радианах.
function CosX takes real angle returns real
local real s = angle //= GetAngle(angle)
if s > 1.57 and s < 4.71 then //1.57 радиан = Пи/2 или 90 градусов, 4.71 радиан = 2Пи или 270 градусов 
return 1
else
return (-1.)
endif
endfunction


//Функция CosB позволяет убрать нули, точнее когда значение равно нулю. Иначе сбивает всю систему координат. Вычисление проводить в радианах.
function CosB takes real angle returns real
local real c= Cos(angle)
if c == 0 then //Если получается ноль, то ставим 1
return 1
else  //Иначе оставляем все без изменений, только знак угла нужно вычислить
return c *CosX(angle)
endif
endfunction


function TZZ takes nothing returns nothing
local real Ux = GetUnitX(GetEnumUnit()) //координаты юнита
local real Uy = GetUnitY(GetEnumUnit())
local real Tx1 = GetRectCenterX(gg_rct_T1) //координаты первого прямоугольника, точнее координаты центра (x,y)
local real Ty1 = GetRectCenterY(gg_rct_T1)
local real Tx2 = GetRectCenterX(gg_rct_T2) //координаты второго прямоугольника, точнее координаты центра (x,y)
local real Ty2 = GetRectCenterY(gg_rct_T2)
local real A1 = 270. //направление первого прямоугольника вниз 270 градусов, точнее куда нужно смотреть. Мы распологаем на прямоугольную площадку юнитов.
local real A2 = 90. //направление второго прямоугольника вверх 90 градусов, точнее спавн вверх. Это как если вы перевернули прямоугольник.
local real dx = Ux - Tx1 //направление вектора (ось x), из конца вычитаем начало
local real dy = Uy - Ty1 //направление вектора (ось y), из конца вычитаем начало


local real angle = A2-A1//этот angle - угол, на которое требует повернуть (либо вправо, по часовой стрелки "+", либо влево, против часовой стрелки "-"), чтобы получился угол A2. Желательно, минимальный угол.
//значение угла можно определить функцией GetAngleDifference(270,90), так тоже будет правильно. Разницы нет никакой. Только вот в GetAngleDifference определяет минимальный угол, но это может сбить знак угла, вот чего боюсь. Пока отклонений не наблюдал
//поворачиваем ввверх на 180 градусов (из отметки 270 градусов поворачиваем к отметке 90 градусам)

local real A = (angle*bj_DEGTORAD)//переводим из градусов в радианы



local real Dx = dx* CosB( A )//расстояние относительно от центра Tx1 на оси x с учетом поворота на угол А
local real Dy = dy* SinB( A )//расстояние относительно от центра Ty1 на оси y с учетом поворота на угол А

local real Sx = Tx2 - Dx//смещение от центра Tx2 на расстояние Dx
local real Sy = Ty2 - Dy//смещение от центра Ty2 на расстояние Dy


//дебаг
call BJDebugMsg("Координата X: " + R2S(  Dx    ))
call BJDebugMsg("Координата У: " + R2S(  Dy    ))
call BJDebugMsg("Координата SX: " + R2S(  Sx    ))
call BJDebugMsg("Координата SУ: " + R2S(  Sy    ))

//либо спавним нового юнита

call CreateUnit(GetOwningPlayer(GetEnumUnit()),GetUnitTypeId(GetEnumUnit()), Sx, Sy, GetUnitFacing(GetEnumUnit())+angle)


//либо самого юнита перемещаем (пока эта возможность отключил)

//call SetUnitX(GetEnumUnit(),Sx)
//call SetUnitY(GetEnumUnit(),Sy)
//call SetUnitFacing(GetEnumUnit(),GetUnitFacing(GetEnumUnit())+angle)
endfunction

function TXX takes nothing returns nothing
    call GroupEnumUnitsInRect(bj_lastCreatedGroup,(gg_rct_T1), null)
    call ForGroup( bj_lastCreatedGroup, function TZZ )
    call GroupClear(bj_lastCreatedGroup)
endfunction

//===========================================================================
function InitTrig_ZZZ takes nothing returns nothing
    set gg_trg_ZZZ = CreateTrigger(  )
    set bj_lastCreatedGroup = CreateGroup()
    call TriggerRegisterTimerEventPeriodic( gg_trg_ZZZ, 10.00 )
    call TriggerAddAction( gg_trg_ZZZ, function TXX )
endfunction
Загруженные файлы
27

» WarCraft 3 / Как выполнить произвольный код во время игры?

как вызвать код?
вставить кусок кода в шапку карты
например всякие вычисления и др. Мы сами можем написать свою функцию, она будет возвращать целочисленные, реальные или boolean и др. Или просто сделает нужные действия.
Возьмем к примеру xgm.guru/p/wc3/iscoordsincircle
function IsCoordsInCircle takes real x,real y,real rad,real cx,real cy returns boolean
   return (SquareRoot((cx-x)*(cy-y)) < rad)
endfunction
этот код вставляем в шапку карты см. рисунок ниже. Кликаем на название карты
Вам должно быть открыться окно. В окошко вставляем код. как должно получится так см. ниже
весь код в шапке здесь перемещает выше в карте в j-текстовике. Дальше, нам нужно вызвать эту функцию, можно вызвать через действие CustomScript (CS)
в jass
Как видим в примере ниже, в функции B вызываем функцию А. Почему поставил функцию A выше? дело в том, что в варкрафте код читает снизу вверх. Короче если функция А была бы расположена ниже, то произошла бы ошибка.
function A takes nothing returns nothing
  ///// что-то делаем
endfunction

function B takes nothing returns nothing
  call A() //вызывает функцию А
endfunction
Ошибки могут происходить из-за отсутствии переменных, функции. Неправильно объявлены переменные и много чего др. Поэтому не знаю, что у вас за код и чего вы хотите. Также возможно у вас не GUI, а открыли j-текстовик карты и хотите добавить какой-нибудь код
можно произвести все что угодно. Для инфы можно статьи почитать
Если не понятно спрашивайте.
Загруженные файлы
27

» WarCraft 3 / Как выполнить произвольный код во время игры?

Но здесь пользователи не знают какой код и как его вы используете. Нет самого кода, и нет примера как вы делали. И код от чего?
27

» WarCraft 3 / Инком

Принятый ответ
Посмотри как делается инком у меня. А вот при захвате (уничтожении здания) либо создаешь на месте уничтоженного новое, которое будет принадлежать киллеру, или после определенного снижения хп здания меняешь владельца. Мне кажется первый вариант рабочий, удобный. Просто потому, что во втором варианте (реализовано на проверке хп: меньше опред. хп) здание можно уничтожить (играл в некоторые подобные карты). Если врубить чит, то от здания ничего не остается.
С - Юнит умирает
У - TriggerUnit является зданием
Д - Создать новое
27

» WarCraft 3 / Отлов автоматической способности

Принятый ответ
Авто-применение стрел нельзя прямо отследить, даже приказ не получится отследить (только если сам натравил каст, или включил/выключил авто-применение, но там нам даст другой приказ). Вот например, эксгумацию можно было бы отследить, там создается на карте труп, значит нужно ловить событием - юнит зашел в регион, или попробовать юнит применил способность (насчет второго события с применением каста не помню).
Можно триггерно для стрел
когда стрела попадает в противника, она накидывает дебафф. С помощью дебаффа и проверяйте.
С- "юнит получает урон"
У - бафф на триггер-юнит
Загруженные файлы
27

» WarCraft 3 / Перемещение юнитов с тем же положением

Принятый ответ
Эхх. Ты неправильно делаешь (конечно все будет по-другому, те команды дадут другой результат. Конвентируй в код и посмотри). думаю объяснить сложнее будет. Сделал на гуи спавн как в холли вар (Holy War). Как встанут, так и будут вспавниться (хоть спиной, хоть боком стань). Правда кривенько. Но надо потом обязательно подучить хорошенько и на джаз тебе переходить потом
ps а и группу удалять не забывай. мой косяк. Мог бы на гуи норм сделать, но у меня не скачан jngp. Как мне помнится, еще эта команда "Unit in (Rect) " утечна, локалки в ней не обнуляются вроде и создает заново группу. А можно на джаз с одной группой работать, не создавая новые, просто будет пик в группу.
Загруженные файлы
27

» WarCraft 3 / Перемещение юнитов с тем же положением

GetRectMinX(R)
GetRectMaxX(R)
GetRectMinY(R)
GetRectMaxY(R)
вот пример
тфу перепроверил дважды
X = GetUnitX(u) //координаты юнита
Y = GetUnitY(u)
X1 = GetRectCenterX(R1) - X //разница на осях относительно ректа R1, точнее от его центра. 
Y1 = GetRectCenterY(R1) - Y
X2 = GetRectCenterX(R2) - X1 //относительность от центра R2, по этим координатам смещаешь
Y2 = GetRectCenterY(R2) - Y1
так делаешь с каждым юнитом
27

» WarCraft 3 / Хочу доработать систему сложения зарядов на GUI.

Принятый ответ
ответы
1.(см. картинку) Это я так понял ячейки инвентаря, но integer означает целое число, я много раз пользовался целочисленными переменными. Как игра понимает что это относится к ячейкам инвентаря если в описании вовсе нет слов про предметы или заряды.
во-первых, есть у нас событие "юнит получает предмет". Есть переменные: Герой манипулирующим итемом, и манипулирующий итем. Не знаю откуда ты взял эту систему, но она очень сложная, я сразу не врубился. Можно в разы проще сделать. И увидел недостатки: типа складывает все итемы к юниту, а не подобранный прибавляется к имеющему. Это так задумывалось? во-вторых, циклы-то понимаешь? Там есть функция "Итем в слоте таком-то", которая вернет итем. То есть когда ты циклом (А) пробегаешь первый шаг, ты сравниваешь итем в первом слоте с итемами, находящих в других ячейках (А+В). Во втором шаге итем во-втором, в третьем в третьем слоте и так далее. Итак 5 шагов
  1. (см. картинку) То же самое непонятное условие с нулём, ведь система как раз складывает предметы с зарядами, а судя по условию не должна этого делать.
В Custom Value - хранит целое число, можно записать через триггеры любое дополнительное целое значение. Это есть у юнитов, и у предметов. Также можно с помощью триггеров узнать значение, сравнить и др. С этим можно делать разные хитрости (например 0 - нет, 1 - да. Пример, как узнать, что предмет кому-то принадлежит.: 0 - никому, 1 - красному, 2 - синему и др. Это как пример. Что означает в твоем примере CV = 0 я не знаю. Это системное что-то. Но Maniac_91 прав изначально равно нулю
Но тут нет ответа на вопрос куда что вставить чтоб ограничить заряды, или типы стакающихся предметов.
сравнением. Вставь внутрь второго цикла. Например, Если (заряды итема 1 + заряды итема 2) < 5, то делать действия, иначе ничего не делать. Но если у тебя много итемов, и у них разные ограничения, то нужна база данных
И почему от 1-до 5 значения если ячеек 6 там на одной из развилок в условиях указывается меньше 6-же и герои имеют 6 слотов.
потому что нумерация идет от 0 до 5. 0 - первый слот, 1 - второй слот, и др Если не ошибаюсь. Если честно ты кажись прав, просто не помню как в гуи должно. надо раскрыть гуи-щные функции и посмотреть. Как я вижу это задумка автора, во втором цикле номера ячеек складываются (А+В)
27

» WarCraft 3 / Как спрятать иконки пасивки

Andrey33, можно использовать способность сферы, та что без иконки (не помню уже точно). На ее можно насадить эффекты
Сфера 'Asph' - можно использовать в качестве аттача моделей на юнита
27

» WarCraft 3 / Как спрятать иконки пасивки

А что в статусе отображается - баффы, можно дать какую-нибудь ауру (дай к примеру ауру торнадо. У нее в настройках можно спрятать иконку). Ищи на сайте как спрятать иконку, есть 3-5 способов как спрятать, включая всеми любимый заблоченный спелбук (было много тем, щас лень искать). Согласен с первым постом
27

» WarCraft 3 / Что не так?

И тогда триггер сработает и для других игроков?
Afterdeath, только на красного, это как у тебя на скрине. По-другому придется тогда фильтр ставить или через условие. Когда пикаешь всех в группу, фильтр отсеивает не нужных. Или прямо в for group (цикле) поставь условие через действие
"If/Then/Else".
фильтр - то же самое, что и условие возвращает логическую. Это типа условие, которое отсеивает при добавлении. В условии или фильтре предлагаю добавить условие, что юнит не враг красному
27

» WarCraft 3 / Что не так?

То есть это в корне неправильно? А можешь тогда посоветовать что-то?
не используй picked player, задай вместо него красного игрока.
27

» WarCraft 3 / Что не так?

Не та переменная просто. Есть разные циклы. Есть перебор группы юнитов (group , отряд) - picked unit. А есть перебор группы игроков (force player) - picked player. Ты ссылаешься не на того игрока, точнее переменную, его просто нет
27

» WarCraft 3 / Типы целей в Warcraft 3

Darknessay, Ну вот знаю, что работает такая связка "организмы/механизмы".
вот
В РО в указанных целях можно установить либо "механизмы" (не живое существо) либо "организмы" (живое существо). Больше создано для указывания/установки целей способностей и атаки.
"Механизмы" (в РО, указанные цели). Вообщем-то влияет на цели способностей и атаки.
Конкретно влияет на ремонт. Привел этот пример с ремонтом не случайно. Здания и артиллерия чинятся с помощью спец-способности "ремонт" у рабов (при наличии ресурсов, если ресурсы на нуле, то раб будет стоять). Если у здания во время игры триггерно убрать классификацию "техника", то авторемонта не будет, раб будет стоять
У многих абилок нежити стоит галочка "организм", но почти ни у одной абилки белых людей она не стоит.
мне кажется это очевидно. Так нежить любит всякие заклятия на живых посылать: травить, высасывать жизни и души, а на технику не имеет смысла.
Если нет, то как можно указать нежить как цель, не прописывая всем нежитям "самоубийцу"?
Выше же написано. Что есть три классификации: древо, самоубийцы, механика. И с ними можно нестандартные классы замутить, по-другому никак. Только. если базу данных
27

» WarCraft 3 / Событие с иллюзией.

Принятый ответ
Когда применяются иллюзии - их можно отследить двумя событиями: "юнит входит в регион" или "юнит призывает юнита ". Используй дебаг, проверяй как работает (работает или не работает, я так и проверял)
Когда юнит сдох, как описали выше, отследить нельзя. Но можно попробовать, отследить уничтожение иллюзии через событие "юнит покинул регион" (проверь дебагом, работает ли это, по идее должно)
Или сразу засовываете в переменную, а потом каждую секунду проверяете (жива или мертва, пуста ли переменная). Или сразу в группу пихаете юнита, ведь чтобы отследить количество живых иллюзии приходится работать с группой.
27

» WarCraft 3 / PreloadAbility( integer )

avuremybe, предполагаю для того, чтобы не было лагов. Помню, давно были темы с многоуровневыми абилками (более 10 левел и до 100 левел). Можно было делать интересные фишки. Если юниту в первый раз дать эту абилку, то комп подвиснет на несколько секунд, а на более слабых компах и больше времени. А все потому, что абилка загружается в игру, при повторном добавлении лагов не замечается. Поэтому сделали такую фишку, что при инициализации подзагружают способности все многоуровневые способности. Замечали ли вы когда нибудь в некоторых картах подвисания при старте игры? например, в доте. и прочее.
27

» WarCraft 3 / Триггер

quq_CCCP прав. Можно сделать ветление ифов.
Пример, если количество патронов больше нуля, то запускать снаряд. Иначе ничего не делать.
код
if c > 0 then //если больше нуля
  //запустить снаряд
else
  //иначе, что-то делаем. Если тут строчка пустует, ничего делать не будет
endif
Но мы так не пишем, не добавляем else. Оптимизирую код
if c > 0 then //если больше нуля
  //запустить снаряд
endif
прервать еще можно ретурном return, если есть что возвратить. Это то, что скинул Hate в гуишном варианте
немного на джазе объяснил. Если раскрыть гуи, то можно увидеть код
27

» WarCraft 3 / Мультипак в одном здании...

quq_CCCP, лучше написать и вариантов побольше накидать. Туда новичков посылать будем
27

» WarCraft 3 / Почему мой триггер увеличивает заряд предметов?

Altf40160, лучше циклом прогонять.
раскрыть
Во-первых, гуишная проверка UnitHasItemOfTypeBJ - цикл, и он утечен (не обнуляется локальная переменная).
во-вторых, эта проверка мб ничего не дать (например, у героя в инвентаре лежит GetManipulatedItem(), а проверка скажет, что такой итем (мб он вот проверил, что есть GetManipulatedItem() ). А как узнать, что есть другой такой же?) нужно сверять циклом, сделай свой цикл. Когда циклом будешь прогонять сравнивай не одинаковы ли типы, и что итем не равен GetManipulatedItem(). Можно переменную целочисленную в качестве счетчика юзать. В условии сравниваешь, что счетчик больше 0
Надо раскрыть и посмотреть что в GetItemOfTypeFromUnitBJ. Там тоже цикл кажись. Мб первый попавшийся выберет итем. А нам нужно, чтобы не выбрали GetManipulatedItem()
Ну и условие например ITEM_TYPE_CHARGED - имеющие заряды, а ты говоришь про усиливающие.
Дебагом выводи