Тут согласен, если не понимать, какой джас будет после обёртки и как этот джас будет работать, то будет печально. А с другой стороны бросать новичка в омут чистого джаса, если есть более удобные интсрументы тоже не хочется.
Со строительством это работает, но с юнитама к сожалению нет. Я создаю юнитов и по триггеру они должны патрулировать область, но вместо этого они идут к исходной позиции.
Это не в ИИ дело. Юниты всегда идут к исходной позиции, если не отдавать им нужных приказов. Чтоб ответить более точно, подробней опишите что вам нужно, желательно с картой.
Вместо создания точки Location из Position of Unit в JNGP удобно координаты юнита указать.
В коде я только с координатами и работаю, а вот на GUI сильно не забалуешь. Благо в JNGP добавили RemoveLocation, чтоб гуишников Custom Code не пугать.
NazarPunk, смысл в том, что с простреленным коленом не особо-то бегают)
А про нанесение урона указал.
Тогда берём system-physical-damage-detection, создаём пустышку вместо яда, и при получении урона, проверяем уровень/наличие пустышки. При срабатывании умножаем урон и кидаем бесконечное замедление даммиком.
можешь сделать Простреленное колено через наложение даммиком Замедления
При наложении замедления урон от юнита ненаносится, человеку ещё придётся систему отлова урона делать/ставить.
Хотя эта система позволяет делать кучу полезного, а урон можно и не наносить.
на эту переменную завязать диалог, то при уничтожении диалога от него отвязывается событие
По логике в переменной лежит только ссылка на диалог, и при уничтожении диалога логично уничтожаются его события, а в переменной остаётся null, у уоторого событий в принципе быть не может. может и не null остаться, а ссылка намертво повиснуть в памяти
"ForceLine*" есть 2 варианта развития, один это сделать поиск необходимого региона по которому он будет выбирать как реагировать на то или иное событие, либо сделать 6 триггеров, каждый из которых отдельно вызывается. Конечно, если бы я понимал, что у меня возможно будет какое-то изменение в будущем в плане количество спаунов, то лучше было бы сделать один триггер обрабатывающий все, тут согласен.
"Line*" однозначно нужно разделить на 3 части, поскольку нужно передавать массив, либо писать дикий костыль на определение массивов, что я не люблю делать. Если писать, то сразу основательно. Там логика может отличаться. Поэтому нужно сохранить 3 линии для удобства изменения условий для каждой линии.
Держите, убрал лишние триггеры, чтоб не мешались, и прикрутил нормальную наработку для путей. Притом без всяких динамических триггеров, костылей и на одномерных массивах.
"OrderBackToLine*" желательно передавать структуру, чтобы он нормально все обрабатывал, что тут невозможно сделать.
Зачем так сложно, можно просто использовать двумерные массивы. Вот вам библиотека Spawn, которая совместима с вашим кодом и не создаёт Location. По необходимости методов можно добавить
zinc
//! zinc
library Spawn {
rect SpawnRect[2][10];
public {
function IsUnitAlive(unit u) -> boolean {
return GetUnitState(u, UNIT_STATE_LIFE) > 0.45; // именно при этом значении наступает смерть
}
function OrderBackToLine(unit u, integer diff) {
integer data = GetUnitUserData(u);
integer data10 = data / 10;
integer modulus = data - (data / 10) * 10;
rect rct;
if (IsUnitAlive(u)){
if (data10 >=1 && data10 <= 3){
rct = SpawnRect[data10+diff][modulus];
} else {
if (udg_isTurnedOnDebug){
rct = SpawnRect[data10+diff][2];
// MakeTextTagAboveUnit нужно объявить до библиотеки Spawn
//MakeTextTagAboveUnit( u, "|c000000FFBack to Home!|r", 1.0, 1.0, 2.0, 0.5, 255, 255, 255, 255);
BJDebugMsg("Юнит побежал домой!");
}
}
IssuePointOrder(u, "attack", GetRectCenterX(rct), GetRectCenterY(rct));
}
rct = null;
}
function OrderBackToLineB(unit u) { OrderBackToLine(u, 0); }
function OrderBackToLineR(unit u) { OrderBackToLine(u, 3); }
}
function onInit(){
//B - Линия 1
SpawnRect[0][1] = gg_rct_WayP_1x1;
SpawnRect[0][2] = gg_rct_WayP_1x2;
SpawnRect[0][3] = gg_rct_WayP_1x3;
SpawnRect[0][4] = gg_rct_WayP_1x4;
SpawnRect[0][5] = gg_rct_WayP_1x5;
SpawnRect[0][6] = gg_rct_WayP_1x6;
SpawnRect[0][7] = gg_rct_RedMainBase;
//B - Линия 2
SpawnRect[1][1] = gg_rct_WayP_2x1;
SpawnRect[1][2] = gg_rct_WayP_2x2;
SpawnRect[1][3] = gg_rct_WayP_2x3;
SpawnRect[1][4] = gg_rct_WayP_2x4;
SpawnRect[1][5] = gg_rct_RedMainBase;
//B - Линия 3
SpawnRect[2][1] = gg_rct_WayP_3x1;
SpawnRect[2][2] = gg_rct_WayP_3x2;
SpawnRect[2][3] = gg_rct_WayP_3x3;
SpawnRect[2][4] = gg_rct_WayP_3x4;
SpawnRect[2][5] = gg_rct_WayP_3x5;
SpawnRect[2][6] = gg_rct_WayP_3x6;
SpawnRect[2][7] = gg_rct_RedMainBase;
//R - Линия 1
SpawnRect[3][1] = gg_rct_WayP_1x6;
SpawnRect[3][2] = gg_rct_WayP_1x5;
SpawnRect[3][3] = gg_rct_WayP_1x4;
SpawnRect[3][4] = gg_rct_WayP_1x3;
SpawnRect[3][5] = gg_rct_WayP_1x2;
SpawnRect[3][6] = gg_rct_WayP_1x1;
SpawnRect[3][7] = gg_rct_BlueMainBase;
//R - Линия 2
SpawnRect[4][1] = gg_rct_WayP_2x4;
SpawnRect[4][2] = gg_rct_WayP_2x3;
SpawnRect[4][3] = gg_rct_WayP_2x2;
SpawnRect[4][4] = gg_rct_WayP_2x1;
SpawnRect[4][5] = gg_rct_BlueMainBase;
//R - Линия 3
SpawnRect[5][1] = gg_rct_WayP_3x6;
SpawnRect[5][2] = gg_rct_WayP_3x5;
SpawnRect[5][3] = gg_rct_WayP_3x4;
SpawnRect[5][4] = gg_rct_WayP_3x3;
SpawnRect[5][5] = gg_rct_WayP_3x2;
SpawnRect[5][6] = gg_rct_WayP_3x1;
SpawnRect[5][7] = gg_rct_BlueMainBase;
}
}
//! endzinc
Та же дота написана на JASS и у нее каждая способность создает временный триггер. Попробую во всяком случае.
JASS автоматически не делает весь код хорошим, а популярность карты не залог оптимального решения.
Порылся я в вашем коде и это ужасно. Копирование триггера, чтобы сделать теже действия, но с другими параметрами повеселило.
Лучше переделать всё пока не позно, а то потом в этой каше ничего не разберёте.
» WarCraft 3 / [Триггеры] Посчитать триггеру конкретные Разр. Объекты
» WarCraft 3 / От GUI к препроцессорам.
» WarCraft 3 / От GUI к препроцессорам.
» WarCraft 3 / Вопрос по инициализации
» WarCraft 3 / От GUI к препроцессорам.
» WarCraft 3 / Реализация огня условной башни
» WarCraft 3 / Вопрос по инициализации
» WarCraft 3 / Вопрос по инициализации
» WarCraft 3 / Яд и рассеять чары
Ред. nazarpunk
» WarCraft 3 / Яд и рассеять чары
Хотя эта система позволяет делать кучу полезного, а урон можно и не наносить.
» WarCraft 3 / Яд и рассеять чары
Ред. nazarpunk
» WarCraft 3 / Баг через 6000 сек
может и не null остаться, а ссылка намертво повиснуть в памяти
Ред. nazarpunk
» WarCraft 3 / Баг через 6000 сек
» WarCraft 3 / Баг через 6000 сек
Ред. nazarpunk
» WarCraft 3 / Баг через 6000 сек
Ред. nazarpunk
» WarCraft 3 / Баг через 6000 сек
local are only supported at the top function
» WarCraft 3 / Инвентарь персонажа
» WarCraft 3 / Инвентарь персонажа
» WarCraft 3 / Триггерное увеличение запаса маны.
» WarCraft 3 / Баг через 6000 сек
Лучше переделать всё пока не позно, а то потом в этой каше ничего не разберёте.
» WarCraft 3 / Баг через 6000 сек
» WarCraft 3 / Баг через 6000 сек
» WarCraft 3 / Баг через 6000 сек
» WarCraft 3 / Три коридора v1.2
» WarCraft 3 / Heavensfall