Alexey103, можно.Ты хочешь вставить код в триггер? конвентируешь гуишные менюшки в джазовый код и туда вставляешь.
кстати меня смущает работа счетчика. Почему когда нанимаю юнита, строю здание и прочее должно по идее увеличиваться счетчик, но счетчик не увеличивается.
Вроде все работает норм. Посмотрел, сравнил с другими версиями HandleCounter у нас на сайте (посмотреть, что изменил ты), проверил. Единственное отличие это то, что там глобалка создана через редактор переменных с приставкой udg_ Не понимаю в чем проблема? не работает что-то? должна работать все
При переносе:
-копируешь все код, вставляешь в себе в корневую папку
-не забудь объявить переменную HandleBoard. Скорее всего из-за нее варкрафт критует
-и старт записан в единственном триггере runSeachHandle
Кстати HandleCounter есть у нас на сайте. И не только.
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
Вот еще один пример. Область - проще говоря это прямоугольник. А представьте, что, если у каждого прямоугольника, как и у юнита, был угол поворота, то есть туда куда смотрит (вверх - 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
например всякие вычисления и др. Мы сами можем написать свою функцию, она будет возвращать целочисленные, реальные или 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-текстовик карты и хотите добавить какой-нибудь код
можно произвести все что угодно. Для инфы можно статьи почитать
Если не понятно спрашивайте.
Посмотри как делается инком у меня. А вот при захвате (уничтожении здания) либо создаешь на месте уничтоженного новое, которое будет принадлежать киллеру, или после определенного снижения хп здания меняешь владельца. Мне кажется первый вариант рабочий, удобный. Просто потому, что во втором варианте (реализовано на проверке хп: меньше опред. хп) здание можно уничтожить (играл в некоторые подобные карты). Если врубить чит, то от здания ничего не остается.
С - Юнит умирает
У - TriggerUnit является зданием
Д - Создать новое
Авто-применение стрел нельзя прямо отследить, даже приказ не получится отследить (только если сам натравил каст, или включил/выключил авто-применение, но там нам даст другой приказ). Вот например, эксгумацию можно было бы отследить, там создается на карте труп, значит нужно ловить событием - юнит зашел в регион, или попробовать юнит применил способность (насчет второго события с применением каста не помню).
Можно триггерно для стрел
когда стрела попадает в противника, она накидывает дебафф. С помощью дебаффа и проверяйте.
Эхх. Ты неправильно делаешь (конечно все будет по-другому, те команды дадут другой результат. Конвентируй в код и посмотри). думаю объяснить сложнее будет. Сделал на гуи спавн как в холли вар (Holy War). Как встанут, так и будут вспавниться (хоть спиной, хоть боком стань). Правда кривенько. Но надо потом обязательно подучить хорошенько и на джаз тебе переходить потом ps а и группу удалять не забывай. мой косяк. Мог бы на гуи норм сделать, но у меня не скачан jngp. Как мне помнится, еще эта команда "Unit in (Rect) " утечна, локалки в ней не обнуляются вроде и создает заново группу. А можно на джаз с одной группой работать, не создавая новые, просто будет пик в группу.
X = GetUnitX(u) //координаты юнита
Y = GetUnitY(u)
X1 = GetRectCenterX(R1) - X //разница на осях относительно ректа R1, точнее от его центра.
Y1 = GetRectCenterY(R1) - Y
X2 = GetRectCenterX(R2) - X1 //относительность от центра R2, по этим координатам смещаешь
Y2 = GetRectCenterY(R2) - Y1
1.(см. картинку) Это я так понял ячейки инвентаря, но integer означает целое число, я много раз пользовался целочисленными переменными. Как игра понимает что это относится к ячейкам инвентаря если в описании вовсе нет слов про предметы или заряды.
во-первых, есть у нас событие "юнит получает предмет". Есть переменные: Герой манипулирующим итемом, и манипулирующий итем. Не знаю откуда ты взял эту систему, но она очень сложная, я сразу не врубился. Можно в разы проще сделать. И увидел недостатки: типа складывает все итемы к юниту, а не подобранный прибавляется к имеющему. Это так задумывалось? во-вторых, циклы-то понимаешь? Там есть функция "Итем в слоте таком-то", которая вернет итем. То есть когда ты циклом (А) пробегаешь первый шаг, ты сравниваешь итем в первом слоте с итемами, находящих в других ячейках (А+В). Во втором шаге итем во-втором, в третьем в третьем слоте и так далее. Итак 5 шагов
(см. картинку) То же самое непонятное условие с нулём, ведь система как раз складывает предметы с зарядами, а судя по условию не должна этого делать.
В Custom Value - хранит целое число, можно записать через триггеры любое дополнительное целое значение. Это есть у юнитов, и у предметов. Также можно с помощью триггеров узнать значение, сравнить и др. С этим можно делать разные хитрости (например 0 - нет, 1 - да. Пример, как узнать, что предмет кому-то принадлежит.: 0 - никому, 1 - красному, 2 - синему и др. Это как пример. Что означает в твоем примере CV = 0 я не знаю. Это системное что-то. Но Maniac_91 прав изначально равно нулю
Но тут нет ответа на вопрос куда что вставить чтоб ограничить заряды, или типы стакающихся предметов.
сравнением. Вставь внутрь второго цикла. Например, Если (заряды итема 1 + заряды итема 2) < 5, то делать действия, иначе ничего не делать. Но если у тебя много итемов, и у них разные ограничения, то нужна база данных
И почему от 1-до 5 значения если ячеек 6 там на одной из развилок в условиях указывается меньше 6-же и герои имеют 6 слотов.
потому что нумерация идет от 0 до 5. 0 - первый слот, 1 - второй слот, и др Если не ошибаюсь. Если честно ты кажись прав, просто не помню как в гуи должно. надо раскрыть гуи-щные функции и посмотреть. Как я вижу это задумка автора, во втором цикле номера ячеек складываются (А+В)
Andrey33, можно использовать способность сферы, та что без иконки (не помню уже точно). На ее можно насадить эффекты
Сфера 'Asph' - можно использовать в качестве аттача моделей на юнита
А что в статусе отображается - баффы, можно дать какую-нибудь ауру (дай к примеру ауру торнадо. У нее в настройках можно спрятать иконку). Ищи на сайте как спрятать иконку, есть 3-5 способов как спрятать, включая всеми любимый заблоченный спелбук (было много тем, щас лень искать). Согласен с первым постом
Afterdeath, только на красного, это как у тебя на скрине. По-другому придется тогда фильтр ставить или через условие. Когда пикаешь всех в группу, фильтр отсеивает не нужных. Или прямо в for group (цикле) поставь условие через действие
"If/Then/Else".
фильтр - то же самое, что и условие возвращает логическую. Это типа условие, которое отсеивает при добавлении. В условии или фильтре предлагаю добавить условие, что юнит не враг красному
Не та переменная просто. Есть разные циклы. Есть перебор группы юнитов (group , отряд) - picked unit. А есть перебор группы игроков (force player) - picked player. Ты ссылаешься не на того игрока, точнее переменную, его просто нет
Darknessay, Ну вот знаю, что работает такая связка "организмы/механизмы".
вот
В РО в указанных целях можно установить либо "механизмы" (не живое существо) либо "организмы" (живое существо). Больше создано для указывания/установки целей способностей и атаки.
"Механизмы" (в РО, указанные цели). Вообщем-то влияет на цели способностей и атаки.
Конкретно влияет на ремонт. Привел этот пример с ремонтом не случайно. Здания и артиллерия чинятся с помощью спец-способности "ремонт" у рабов (при наличии ресурсов, если ресурсы на нуле, то раб будет стоять). Если у здания во время игры триггерно убрать классификацию "техника", то авторемонта не будет, раб будет стоять
У многих абилок нежити стоит галочка "организм", но почти ни у одной абилки белых людей она не стоит.
мне кажется это очевидно. Так нежить любит всякие заклятия на живых посылать: травить, высасывать жизни и души, а на технику не имеет смысла.
Если нет, то как можно указать нежить как цель, не прописывая всем нежитям "самоубийцу"?
Выше же написано. Что есть три классификации: древо, самоубийцы, механика. И с ними можно нестандартные классы замутить, по-другому никак. Только. если базу данных
Когда применяются иллюзии - их можно отследить двумя событиями: "юнит входит в регион" или "юнит призывает юнита ". Используй дебаг, проверяй как работает (работает или не работает, я так и проверял)
Когда юнит сдох, как описали выше, отследить нельзя. Но можно попробовать, отследить уничтожение иллюзии через событие "юнит покинул регион" (проверь дебагом, работает ли это, по идее должно)
Или сразу засовываете в переменную, а потом каждую секунду проверяете (жива или мертва, пуста ли переменная). Или сразу в группу пихаете юнита, ведь чтобы отследить количество живых иллюзии приходится работать с группой.
avuremybe, предполагаю для того, чтобы не было лагов. Помню, давно были темы с многоуровневыми абилками (более 10 левел и до 100 левел). Можно было делать интересные фишки. Если юниту в первый раз дать эту абилку, то комп подвиснет на несколько секунд, а на более слабых компах и больше времени. А все потому, что абилка загружается в игру, при повторном добавлении лагов не замечается. Поэтому сделали такую фишку, что при инициализации подзагружают способности все многоуровневые способности. Замечали ли вы когда нибудь в некоторых картах подвисания при старте игры? например, в доте. и прочее.
quq_CCCP прав. Можно сделать ветление ифов.
Пример, если количество патронов больше нуля, то запускать снаряд. Иначе ничего не делать.
код
if c > 0 then //если больше нуля
//запустить снаряд
else
//иначе, что-то делаем. Если тут строчка пустует, ничего делать не будет
endif
Но мы так не пишем, не добавляем else. Оптимизирую код
if c > 0 then //если больше нуля
//запустить снаряд
endif
прервать еще можно ретурном return, если есть что возвратить. Это то, что скинул Hate в гуишном варианте немного на джазе объяснил. Если раскрыть гуи, то можно увидеть код
Во-первых, гуишная проверка UnitHasItemOfTypeBJ - цикл, и он утечен (не обнуляется локальная переменная).
во-вторых, эта проверка мб ничего не дать (например, у героя в инвентаре лежит GetManipulatedItem(), а проверка скажет, что такой итем (мб он вот проверил, что есть GetManipulatedItem() ). А как узнать, что есть другой такой же?) нужно сверять циклом, сделай свой цикл. Когда циклом будешь прогонять сравнивай не одинаковы ли типы, и что итем не равен GetManipulatedItem(). Можно переменную целочисленную в качестве счетчика юзать. В условии сравниваешь, что счетчик больше 0
Надо раскрыть и посмотреть что в GetItemOfTypeFromUnitBJ. Там тоже цикл кажись. Мб первый попавшийся выберет итем. А нам нужно, чтобы не выбрали GetManipulatedItem()
Ну и условие например ITEM_TYPE_CHARGED - имеющие заряды, а ты говоришь про усиливающие.
» WarCraft 3 / Как перенести счётчик объектов на другую карту?
Ред. MpW
» WarCraft 3 / Как перенести счётчик объектов на другую карту?
При переносе:
-копируешь все код, вставляешь в себе в корневую папку
-не забудь объявить переменную HandleBoard. Скорее всего из-за нее варкрафт критует
-и старт записан в единственном триггере runSeachHandle
Кстати HandleCounter есть у нас на сайте. И не только.
Ред. MpW
» WarCraft 3 / Перемещение юнитов с тем же положением
Все исправил свою ошибку
Ред. MpW
» WarCraft 3 / Перемещение юнитов с тем же положением
Ред. MpW
» WarCraft 3 / Как выполнить произвольный код во время игры?
Возьмем к примеру xgm.guru/p/wc3/iscoordsincircle
Если не понятно спрашивайте.
Ред. MpW
» WarCraft 3 / Как выполнить произвольный код во время игры?
Ред. MpW
» WarCraft 3 / Инком
Ред. MpW
» WarCraft 3 / Отлов автоматической способности
Ред. MpW
» WarCraft 3 / Перемещение юнитов с тем же положением
ps а и группу удалять не забывай. мой косяк. Мог бы на гуи норм сделать, но у меня не скачан jngp. Как мне помнится, еще эта команда "Unit in (Rect) " утечна, локалки в ней не обнуляются вроде и создает заново группу. А можно на джаз с одной группой работать, не создавая новые, просто будет пик в группу.
Ред. MpW
» WarCraft 3 / Перемещение юнитов с тем же положением
» WarCraft 3 / Перемещение юнитов с тем же положением
Ред. MpW
» WarCraft 3 / Хочу доработать систему сложения зарядов на GUI.
» WarCraft 3 / Как спрятать иконки пасивки
Сфера 'Asph' - можно использовать в качестве аттача моделей на юнита
Ред. MpW
» WarCraft 3 / Как спрятать иконки пасивки
Ред. MpW
» WarCraft 3 / Что не так?
» WarCraft 3 / Что не так?
» WarCraft 3 / Что не так?
Ред. MpW
» WarCraft 3 / Что не так?
Ред. MpW
» WarCraft 3 / Типы целей в Warcraft 3
"Механизмы" (в РО, указанные цели). Вообщем-то влияет на цели способностей и атаки.
Конкретно влияет на ремонт. Привел этот пример с ремонтом не случайно. Здания и артиллерия чинятся с помощью спец-способности "ремонт" у рабов (при наличии ресурсов, если ресурсы на нуле, то раб будет стоять). Если у здания во время игры триггерно убрать классификацию "техника", то авторемонта не будет, раб будет стоять
» WarCraft 3 / Высота Z
Ред. MpW
» WarCraft 3 / Событие с иллюзией.
Ред. MpW
» WarCraft 3 / PreloadAbility( integer )
Ред. MpW
» WarCraft 3 / Триггер
Пример, если количество патронов больше нуля, то запускать снаряд. Иначе ничего не делать.
немного на джазе объяснил. Если раскрыть гуи, то можно увидеть код
Ред. MpW
» WarCraft 3 / Мультипак в одном здании...
Ред. MpW
» WarCraft 3 / Почему мой триггер увеличивает заряд предметов?
во-вторых, эта проверка мб ничего не дать (например, у героя в инвентаре лежит GetManipulatedItem(), а проверка скажет, что такой итем (мб он вот проверил, что есть GetManipulatedItem() ). А как узнать, что есть другой такой же?) нужно сверять циклом, сделай свой цикл. Когда циклом будешь прогонять сравнивай не одинаковы ли типы, и что итем не равен GetManipulatedItem(). Можно переменную целочисленную в качестве счетчика юзать. В условии сравниваешь, что счетчик больше 0
Надо раскрыть и посмотреть что в GetItemOfTypeFromUnitBJ. Там тоже цикл кажись. Мб первый попавшийся выберет итем. А нам нужно, чтобы не выбрали GetManipulatedItem()
Ну и условие например ITEM_TYPE_CHARGED - имеющие заряды, а ты говоришь про усиливающие.