27

» WarCraft 3 / Сокрытие способности

Принятый ответ
Filius Dei, у канал есть пунктик "изображение". Если этот пунктик галочкой снять, то изображение иконки не будет отображаться. Но можно отдавать приказы через триггеры.
Можно сделать двухуровневую способность, в одном уровне иконка скрыта, в другом показана (но не пробовал такое)
27

» WarCraft 3 / Не могу разобраться с оформлением

Принятый ответ
Filius Dei, так что-то не так делаешь. Функцию нельзя внутри функции копировать, функцию закинь повыше.
знаешь такую находил много раз. атака сзади атака в спину и др. ищи на форуме "заклинание на заказ", там в первых наработках есть похожее. Углы сложно подсчитать?
подробности
Я тебе скинул пример, на событие юнит атакован. Но ты должен знать что "юнит атакован" - событие, при котором юнит начинает замахиваться, а потом пускает снаряды (у милишников без этого), и потом происходит урон. Надо делать систему урона от события "юнит получает урон". Так как при событии "юнит атакован" можно промахнуться.
Когда при событии "получает урон" наносишь дополнительный триггерный урон, смотри, чтобы зацикливания не было.
Загруженные файлы
27

» WarCraft 3 / Не могу разобраться с оформлением

вот код
просто ты забыл добавить local. Кто-то не полный код кинул. А из-за этого игра не может объявить локальную переменную. Это можно только на vjass, cjass. Там разрешено не дописывать local, в cjass и vjass сокращают записи для удобства
function IsUnitBack takes unit uF, unit uWhichBack returns boolean
local real r1 = bj_RADTODEG * Atan2(GetUnitY(uWhichBack) - GetUnitY(uF), GetUnitX(uWhichBack) - GetUnitX(uF)) + 360.
local real r2 = GetUnitFacing(uWhichBack) + 360.
if GetUnitY(uWhichBack) < GetUnitY(uF) then
set r1 = r1 + 360.
endif
return (r1<=(r2+45.) and r1>=(r2-45.))
endfunction
27

» WarCraft 3 / Округление реалки до целого

вот замечал что варкрафт, точнее функция R2I округляет в меньшую сторону, отсекает дробную часть
xgm.guru/p/wc3/trigger_basics_7?postid=347793#comment12 поэтому нашел в интернете свое решение как округлить. мало пригодиться мб
27

» WarCraft 3 / Для чего нужны эти строки?

эти поля менять нельзя, даже, если в редакторе изменишь на какой-нибудь другой, то в игре будет старый. Все способности отдают приказ, на основе той, что сделано. Эти все приказы вшиты в движок, у стандартных способностей свои приказы (У одних есть поля, у других могут какие-то строчки отсутствовать). Ну приказы нужно знать, зная приказ мы можем отдать через триггеры. Другой способ изменить - канал, но канал - всего лишь пустышка и нужно триггерами сделать
27

» WarCraft 3 / Блок способностей (немота)

ImbaStyle, не понял что тебе нужно
список способности
Винные пары - самый универсальный способ, может действовать на одну цель, если поставить радиус воздействия (-1.00)
безмолвие
пламя обречённости - не помню есть ли такая способность
туман - точно не помню сало ли это
Печать преисподней - работает не только на скилы, но и на предметы
костыль: в способности можно указать цели (древа, самоубийцы и др., в одной статье написано, что можно бесчисленное кол-во типов целей наделать с 3 классификациями), эти классификации можно во время игры добавить/удалять. Пикаешь всех, добавляешь кому надо классификацию, дамми-кастом накидываешь сало.
27

» WarCraft 3 / Новые типы атаки и защиты

ssbbssc, в РО в атаку влепить новый тип атаки не получится, нельзя. Но можно сделать систему урона. Нечто похожее делал я: к примеру, весь урон от заклинаний (способностей) будет триггерный (магический), а остальное от руки. Создал типа новые типы урона (огонь, вода, земля и др.), там у каждого коэффициенты (атаки и защиты). Коэффициент атаки привязан к кастеру и увеличивал урон в %, коэффициент защиты, наоборот, уменьшал урон, привязан к юниту (по идее коэффициент должен быть у каждого, но по стандарту не у всех есть защита (будет равна нулю). защита есть только у тех, кто носит эту защиту). Очень классно будет, если герой подберет посох огня, увеличивающий урон от магии огня. Или какой-нибудь недотепа подберет кольцо огня, поглощающее урон огня.
Это плюс большой делать заклинания полностью триггерными. Можешь узнать, что нанесли магический (способностью) или физический (с руки). При нанесении урона одним триггером логической переменной сразу подаешь сигнал другому триггеру, что урон нанесен триггерно. Правда, были триггерные пассивки, которые наносили обычный урон, то тут сигнал нужно не подавать.
27

» WarCraft 3 / vJass вопрос меньше чем новичок

Принятый ответ
это объявление глобальных переменных, так используются и в обычном редакторе. только, если нужно создать свои, мы заходим в редактор переменных и создаем (хоть мы не видим код, а редактор переменных автоматом тип и название внесет в эту конструкцию, что ты выше написал). А в vjass и cjass мы можем объявлять свои переменные в любом участке кода, все что нужно, так это написать так это тип переменной и название переменной на английском.
пример
globals
тип и название переменной
unit U //пример
endglobals
глобальная переменная в отличии от локальной работает везде: в триггере, коде и др. Для всех игроков вроде общие. Не слышал об этом. Похоже, что, да, придется создавать массивы, чтобы у каждого был свой индекс массива.
чтобы создать массив пишут array
unit array U
для новичков
но нужно понимать, что все эти vjass и cjass - это для удобства, компилятор переведет его в обычный jass: все объявленные переменные в разных кусках перенесет наверх при компиляции, вон та же библиотека добавляет в main (главная функция карты) нужные функции, у структур наблюдаются изменения в имени переменных (добавляются в названии переменных и функции приставки от имени структуры и др) и прочее. Если новичок, бери прочитай мануал, потом что-то не понятно (библиотеки, структуры и др), бери пустую карту, напиши код, сохрани и компилируй код, потом архиватором вытащи j-файл, и в текстовике посмотри, сравни. Единственное что не привычно и сложно - синтаксис, ведь не знаешь, какими правилами и сочетаниями слов использовать, к примеру call можно не писать, вместо if endif скобочки и др.
27

» WarCraft 3 / Обновление таймера

Принятый ответ
вот у нас есть кастер caster, по хэндлу кастера id мы загружаем таймер t, короче значение из хэша записываем в локалку t. И проверяем t. Если переменная t пуста, значит создать заново.
local unit caster = GetSpellAbilityUnit() 
local integer id = GetHandleId(u)
local timer t = LoadTimerHandle(udg_Hash,id,0) //если ничего не сохраняли, то вернет null
if t == null then //переменная t пуста, значит создать новый таймер и запустить
	set t = CreateTimer()
	call LoadTimerHandle(udg_Hash, id, 0, t) //сохранить таймер в хэш по хэндлу кастера
	call TimerStart(t,1.00,true,function Hishenie_timer) //запустить периодический таймер
else
	//иначе если таймер создан, то нужно обнулить счетчики
	//все значения (типа счетчики), которые были ранее сохранены в хэш-таблице, можно обнулить	 
endif
27

» WarCraft 3 / Лимит на выполнение рекурсии с циклом

Принятый ответ
в чем разница между ExecuteFunc и просто call
PT153, ну call просто вызываешь потоком (он не создает поток), например у тебя в ряд выставлены сверху вниз названия функции со скобочками (и внутри скобок аргументы, а если не берет никаких аргументов, то внутри скобок пусто) и через call вызывает одну за другой последовательно сверху вниз.
call название функции (аргументы)
Допустим первую верхнюю функцию вызвали, и ее обработали, потом поток берет вторую внизу функцию и обрабатывает и т.д. Но у потока есть ограничения в операциях, как только выполнится определенное количество операций, варкрафт экстренно завершает поток и даже не сообщает об этом.
call функция 1()
call функция 2()
......
call функция 999()
Тут хочу обратить внимание и на то, насколько длинный код в этой вызываемой функции. И сколько вызываемой работы потребует: всякие вычисления, бесконечные циклы и другое. Если длинный код у тебя, и кучу циклов, и сами циклы большую работу совершают, то следует разбить на участки или как-то переделать что ли, уменьшить работу цикла и др.
Можно разбить на функции и ...
  1. вызывать через call, но так делать не стоит. Поток вызывает эти функции последовательно.
  2. Нужно делать задержку (через вэйт), например в ИИ-скриптах варкрафта делают задержку, чтобы не было нагрузки. Вместо вэйта можно таймер.
  3. через ExecuteFunc, ExecuteFunc создает отдельный новый поток. информацию про ExecuteFunc скидывал выше.
27

» WarCraft 3 / Лимит на выполнение рекурсии с циклом

можно дебагом проверять. просто что-то сказать сложно без карты.
xgm.guru/p/wc3/184889 был у меня похожий вопрос, правда там про строительство ИИ. циклами проверял каждую точку и расстояния. у меня похуже было. из циклов мог вообще не выйти. мог поток нафиг убиться, и в некоторых случаях может критануть из-за не правильного кода. мне помог ExecuteFunc и правильный код.
но вопрос интересный.
27

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

Принятый ответ
случайная точка в области
local rect R = //твоя область
local real x = GetRandomReal(GetRectMinX(R), GetRectMaxX(R))
local real y = GetRandomReal(GetRectMinY(R), GetRectMaxY(R))
  1. узнали случайную точку
  2. взял спецэффект взрыва (например), и создал триггером спецэффект.
  3. и потом наносим урон: либо дамажим всех (и декор в том числе), то может подойти выше вариант. либо конкретных (союзников не трогаем, только врагов. здесь нужно пикать всех группой и дамажить и все. будет тебе как артиллерия)
или отдавать приказ юниту стрелять в эту точку
27

» WarCraft 3 / "Случайно задание". (Активация случайного триггера из списка)

Принятый ответ
Pingrom, берете и создаете целочисленную переменную. В ней устанавливаете рандом от 1 до max.
set R = Random Integer(1,15) //к примеру 15 - макс. число. название функции мб не точным, но найти не трудно будет
дальше два варианта:
  1. делаете базу данных при инициализации, кучу массивов забиваете, например 15 триггеров. и когда сработает триггер, то получаешь рандом из 15 чисел, и по индексу массива достаешь нужный триггер.
пример
триггер при инициализации (база данных короче)
Событие - инициализация
Tp - переменная типа триггер с массивом
Tp[1] = триггер 1 //вместо триггер 1 мб другое название триггера, это как пример
Tp[2] = триггер 2
Tp[3] = триггер 3
.......
Tp[14] = триггер 14
Tp[15] = триггер 15

триггер активации
событие - юнит входит в зону (это к примеру)
set R = Random Integer(1,15) //рандом от 1 до 15
запустить триггер Tp[R]
  1. или строите кучу конструкции с условиями. при активации триггера пробегаете по всем условиям
пример
set R = Random Integer(1,15) //рандом от 1 до 15
if R == 1 then //если целочисленная равна 1
  запустить триггер 1 
elseif R == 2 then //иначе если целочисленная равна 2
  запустить триггер 2
........
endif //конец блока
27

» WarCraft 3 / Триггер для водоворота

еще ищите на тему черная дыра (black hole) и притяжение
Загруженные файлы
27

» WarCraft 3 / Триггер для водоворота

Принятый ответ
Ну так юзай полярки (полярные координаты), на гуи смещение относительно двух точек, меняешь каждую n-секунд три вещи:
  1. угол, и движется по спирали
  2. расстояние-радиус, ну то есть смещаешь ближе к кастеру (водовороту)
  3. ну и высоту, типа засасывает вниз или торнадо поднимает вверх
и дамажить не забывай
кстати на эту тему что трудно найти наработки? ищи водоворот, торнадо, спираль. зайди на хайв и введи аналог на английском whirlpool. Кстати гугл и яндекс даже синонимы находят
Загруженные файлы
27

» WarCraft 3 / Максимальное количество скилов

Clamp, вау. еще один способ, а то раньше записывали.-2147483648, -2147483648. Правда кто-то сказал что в новых патчах не работает это =(
Можешь порекомендовать в статье xgm.guru/p/wc3/27713
27

» WarCraft 3 / Не могу присвоить значение переменной

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

» WarCraft 3 / зомби от ядовитого облака

я еще вспомнил, что можно проверить чуму классификацией xgm.guru/p/wc3/181514 Не знаю, может поможет вам.
27

» WarCraft 3 / Формула параболы

вот
вопрос
Кстати почему по второму варианту (ниже код) получилось 6.11, а не 4.12: Тут 6.11 превышает максимума h (h = 5)
  function ParabolaZ2 takes real y0, real y1, real h, real d, real x returns real
    return ((4 * h / d) * (d - x) + y1 - y0) * (x / d) + y0
  endfunction
проверял несколько примеров, на компасе и в тетради, и варкрафте вторую функцию. Получается ли что автор хотел вот такую схему прикрутить как на рисунке ниже. Значения получались не точными, но приблизительными. Бред какой-то. Взять надо 5 примеров придумать и проверить, да лень
27

» WarCraft 3 / Формула параболы

xgm.guru/p/wc3/188880?postid=346155#comment62 пример первой функции ParabolaZ, там и пример. В примере я рассчитывал расстояние, и доставал нужную мне высоту
мб y0 - текущая (начальная) высота юнита, y1 - конечная высота. Юнит же может изначально не на одной же высоте с конечной находится же. В конечной точке может быть возвышенность какая-нибудь, или глубокая впадина, а это наверное тоже надо учитывать.
Вот пример:
Объясню так чтоб было понятно:
d - общее расстояние до цели можно представить как длину дуги
h - максимальная высота в прыжке на середине расстояния (x = d / 2) представим как высота дуги
y0 - начальная высота высота одного края дуги
y1 - конечная высота высота другого края дуги
значения h, d, y0, y1 - лучше пермаментными (не меняющимися) делать в течении прыжка
x - расстояние от исходной цели до точки, где следует взять высоту по параболе. здесь меняется только x. Если двигаешь каждые 0.3 сек. на 5 единиц, то значение x изменяется на эти 5 единиц (юнит становится ближе к цели). Потом в формуле подсчитываешь и достаешь из нее нужную высоту в параболе (в линии параболы), и двигаешь по оси Z (у юнитов FlyHeight). Если не знаете какое расстояние, его можно подсчитать между точками
27

» WarCraft 3 / Если юнит стоит на месте, то ему отдается приказ.

Принятый ответ
Окей, эта строчка сработала. Слушай может ты знаешь как сделать так, чтобы если юнит стоит на месте, то ему отдается приказ? Я переделал вопрос на всякий, чтобы второй подряд не создавать.
Поищи на сайте, и на форуме, вопрос не раз задавался (в моей памяти 2-4 темы такие были). периодически проверять не сместился ли он с предыдущей позиции.
xgm.guru/p/wc3/auto в наработке нашлось применению этому. Но там на jass
27

» WarCraft 3 / Если юнит стоит на месте, то ему отдается приказ.

Если отдать приказ "атаковать" цель, то юнит будет идти и игнорировать всех, пока в поле зрения не окажется цель, и потом будет бить ее. Если отдать приказ "атаковать" в точку, то будет идти в эту точку, и одновременно с этим, те кто попадется, будет атаковать. Вам нужно отдать приказ атаковать в точку
27

» WarCraft 3 / Способность "Атака пауков" 'Aspa'

Действительно, влияет на анимацию стрельбы: у эльфийской лучницы стрела теперь не летает, а скользит по земле, на цели оставляет на 1 секунду анимацию вертящих пауков (больше на шаров похоже, никогда бы не подумал, что это пауки), и потом заставляет обратно лететь. А вот строчка в способности: "Данные : грузоподъемность паука", что делает? Это число менял, так и не заметил ничего такого.