WinMPQ должен быть версии 1.66.
Карта не должна быть открыта в WE или выбрана в варе.
Каждый раз при сохранении карты WE перезаписывает .ai, чтобы этого не происходило нужно переименовать или исключить из карты .wai
Алгоритм редактирования:
1 Open (открыть карту)
2 Выбрать файл
3 Extract (извлечь)
4 Отредактировать извлеченный файл
5 Щелкнуть в WinMPQ для редактирования имени файла
6 Скопировать имя
7 Delete (удалить)
8 Add (добавить отредактированный)
9 Переименовать, вставив скопированное имя
Есть много других более удобных прог для mpq, но эта меня еще ни разу не подвела.
В случае с ИИ WinMPQ не нужен, все можно сделать в менеджере импорта WE.
Моя подсказка оказалась не верной. LoadZepWave в версии 1.26 не работает. Не помню, как было раньше.
Вставлять нужно:
if (target != null) then
call CommonSuicideOnPlayer(true,true,0,GetOwningPlayer(target),0,0)
return
endif
Неважно как появился дирижабль. Добавление дирижабля в войско дает лишь то, что он всегда будет рядом, в том числе под огнем противника. Dimari93, в той кампании тоже вызывается LoadZepWave.
А раз слишком сложно, то получай более правильный вариант.
call LoadZepWave(I2R(GetWidgetX(target)),I2R(GetWidgetY(target)))
ssbbssc, Ваш код обычного компа великолепен, я позаимствую из него управление дирижаблем.
В редакторе ИИ никак. Нужно редактировать получившийся файл .ai вручную.
Взгляните в окошко Приоритеты целей из вкладки Атака. Прикиньте для каких целей нужен дирижабль.
Закройте WE. Откройте карту редактором MPQ(WinMPQ). Переименуйте .wai, откройте .ai
Найдите функцию LaunchAttack. В этой функции каждой цели соответствует строчка Target Priority #
Ниже следующего set нужно вставить свою строку call LoadZepWave(GetWidgetX(target),GetWidgetY(target))
Пример:
Первая цель - Обычная цель
Код:
function LaunchAttack takes nothing returns nothing
local unit target = null
local boolean setAlly = true
// Don't launch any attack while town is threatened
if (TownThreatened()) then
call Sleep( 2 )
return
endif
// Target Priority #1
if (target == null) then
set target = GetAllianceTarget()
if (target != null) then
set setAlly = false
call LoadZepWave(GetWidgetX(target),GetWidgetY(target))
endif
endif
LoadZepWave работает со сбоями(вместо цели летит на базу или в центр карты; загружает/высаживает не всех). Альтернатива - триггерно отбирать войска у ИИ, по одному усаживать каждого юнита в дирижабль и так далее. Mrachny, не верно
Упомянутая книга Лафоре мне не понравилась. В каждой теме не написано что-то важное.
И для новичков и для середнячков я рекомендую начать с Эккель философия C++ ;
после нее читать Полный справочник по C++ (Шилдт Г.)
и Дьюхерст C++ священные знания.
Посылать триггерно можно будет после небольшой правки JASS кода ИИ.
Да, только по лвлу. Если достаточно редактора ИИ, то да подбирать лвл его войск и нужно. Или убрать галочку.
Или же растоптать свою гордость и влезть в код ИИ, вставив эти строки:
if GetPlayerState(Player(GetAiPlayer()),PLAYER_STATE_RESOURCE_FOOD_USED)> 79 then
call SetHeroesFlee(false)
call SetIgnoreInjured(false)
call SetUnitsFlee(false)
call SetGroupsFlee(false)
elseif GetPlayerState(Player(GetAiPlayer()),PLAYER_STATE_RESOURCE_FOOD_USED) < 76 then
call SetHeroesFlee(true)
call SetIgnoreInjured(true)
call SetUnitsFlee(true)
call SetGroupsFlee(true)
endif
Где, SetHeroesFlee - разрешает героям уходить из под ассиста. (2 шага назад и снова в бой)
SetIgnoreInjured - убегают домой те и кого здоровья меньше половины.
SetUnitsFlee - разрешает негероям уходить из под ассиста.
SetGroupsFlee - все войска убегают от более сильного врага. Проверяются только уровни.
Физический размер пешего юнита представляет собой диаметр круга (и вовсе не степень двойки). Это одна цифра, а вы указываете две.
У построек и декораций вместо круга нужно указать целую карту, по которой определяется возможность пройти.
Карта - это картинка в формате Targa(.tga) в поле Пути Текстура пути. Каждый пиксель определяет квадрат 64Х64.
Черный цвет(R=0 G=0 B=0) означает, - здесь можно ходить и строить.
Синий (R=0 G=0 B=255),- здесь можно ходить строить нельзя.
Пурпурный (R=255 G=0 B=255), - нельзя ходить, нельзя строить.
Забудьте про дебаг. Это миф. DebugS, DebugFI, DebugUnitID, DisplayText, DisplayTextI, DisplayTextII, DisplayTextIII, DoAiScriptDebug, DebugBreak - все они предназначены для программистов Близзард.
Весь режим отладки в том, что строка, перед которой поставлено КС debug (например debug call DoAnything()) выполняется.
Все это выпилено из релизной версии варкрафт.
StartThread создает новый поток для текущего ИИ, прерывая текущий поток. Есть лимит в 6 потоков на 1 ИИ. Нет лимита на количество операций в потоке.
Sleep - безглючная пауза потока.(TriggerSleepAction в ИИ не работает)
DisplayTextII - ничего не делает. Предназначена для форматированного вывода. Работает только с отладочной версией game.dll, которая не распространяется. Переход в отладочный режим не требуется.
Непосредственно в war3map.j не работают. Но можно вынести в .ai безглючный бесконечный цикл без доступа к триггерам, предметам и декорациям. Пока еще никому это не понадобилось.
Есть несколько нативок из common.ai, которые работают в war3map.j, но только со стандартными юнитами. Возможно .slk тут поможет. Если вы не собираетесь делать ИИ или ставить рекорды по оптимизации кода, то ничего из common.ai вам не пригодится.
Эта проблема не превносится скриптом. Это проблема нативки SetProduce, не проверяющей назначение здания, хотя в РО такое поле есть.
Придется строить карту путей к которой из скрипта нет доступа.
Выход только в CreateUnitByName. Но она выполняется 850 000 процессорных тактов. И, если в квадрате +-1000 места для юнита нет, поставит юнита в указанных координатах.
SetUnitPositionLoc, SetUnitPosition имеют внутреннюю утечку и не работают со склоном (ими можно закинуть здание на пик горы 1Х1).
SetUnitX/SetUnitY Очень быстрая, безутечная, но потому и быстрая, что не работает с путями и зданиями.
Я замостил зданиями стартовую локу при старте карты, записал координаты зданий в массив. На это ушло 930 миллионов тактов. Это 0.3 секунды 100% загрузки проца на 1 АИ. А еще нужен второй такой же проход, чтобы закрыть щели.
» WarCraft 3 / AI редактор и дирижабли
Карта не должна быть открыта в WE или выбрана в варе.
Каждый раз при сохранении карты WE перезаписывает .ai, чтобы этого не происходило нужно переименовать или исключить из карты .wai
Алгоритм редактирования:
1 Open (открыть карту)
2 Выбрать файл
3 Extract (извлечь)
4 Отредактировать извлеченный файл
5 Щелкнуть в WinMPQ для редактирования имени файла
6 Скопировать имя
7 Delete (удалить)
8 Add (добавить отредактированный)
9 Переименовать, вставив скопированное имя
Есть много других более удобных прог для mpq, но эта меня еще ни разу не подвела.
Вставлять нужно:
» WarCraft 3 / AI редактор и дирижабли
Dimari93, в той кампании тоже вызывается LoadZepWave.
А раз слишком сложно, то получай более правильный вариант.
call LoadZepWave(I2R(GetWidgetX(target)),I2R(GetWidgetY(target)))
Ред. Themis
» WarCraft 3 / AI редактор и дирижабли
В редакторе ИИ никак. Нужно редактировать получившийся файл .ai вручную.
Взгляните в окошко Приоритеты целей из вкладки Атака. Прикиньте для каких целей нужен дирижабль.
Закройте WE. Откройте карту редактором MPQ(WinMPQ). Переименуйте .wai, откройте .ai
Найдите функцию LaunchAttack. В этой функции каждой цели соответствует строчка Target Priority #
Ниже следующего set нужно вставить свою строку call LoadZepWave(GetWidgetX(target),GetWidgetY(target))
Пример:
Первая цель - Обычная цель
Код:
Mrachny, не верно
» WarCraft 3 / Редактировать код ИИ
» Программирование / Полезная литература
И для новичков и для середнячков я рекомендую начать с Эккель философия C++ ;
после нее читать Полный справочник по C++ (Шилдт Г.)
и Дьюхерст C++ священные знания.
» WarCraft 3 / Размазывается текстура на модели
Ред. Themis
» WarCraft 3 / Созданный Melee AI часто отступает
Да, только по лвлу. Если достаточно редактора ИИ, то да подбирать лвл его войск и нужно. Или убрать галочку.
Или же растоптать свою гордость и влезть в код ИИ, вставив эти строки:
SetIgnoreInjured - убегают домой те и кого здоровья меньше половины.
SetUnitsFlee - разрешает негероям уходить из под ассиста.
SetGroupsFlee - все войска убегают от более сильного врага. Проверяются только уровни.
» WarCraft 3 / Физ размер Юнита
У построек и декораций вместо круга нужно указать целую карту, по которой определяется возможность пройти.
Карта - это картинка в формате Targa(.tga) в поле Пути Текстура пути. Каждый пиксель определяет квадрат 64Х64.
Черный цвет(R=0 G=0 B=0) означает, - здесь можно ходить и строить.
Синий (R=0 G=0 B=255),- здесь можно ходить строить нельзя.
Пурпурный (R=255 G=0 B=255), - нельзя ходить, нельзя строить.
» WarCraft 3 / Некоторые нативки.
Весь режим отладки в том, что строка, перед которой поставлено КС debug (например debug call DoAnything()) выполняется.
Все это выпилено из релизной версии варкрафт.
» WarCraft 3 / Некоторые нативки.
Sleep - безглючная пауза потока.(TriggerSleepAction в ИИ не работает)
DisplayTextII - ничего не делает. Предназначена для форматированного вывода. Работает только с отладочной версией game.dll, которая не распространяется. Переход в отладочный режим не требуется.
Непосредственно в war3map.j не работают. Но можно вынести в .ai безглючный бесконечный цикл без доступа к триггерам, предметам и декорациям. Пока еще никому это не понадобилось.
Есть несколько нативок из common.ai, которые работают в war3map.j, но только со стандартными юнитами. Возможно .slk тут поможет. Если вы не собираетесь делать ИИ или ставить рекорды по оптимизации кода, то ничего из common.ai вам не пригодится.
» WarCraft 3 / HonestAI
Придется строить карту путей к которой из скрипта нет доступа.
Выход только в CreateUnitByName. Но она выполняется 850 000 процессорных тактов. И, если в квадрате +-1000 места для юнита нет, поставит юнита в указанных координатах.
SetUnitPositionLoc, SetUnitPosition имеют внутреннюю утечку и не работают со склоном (ими можно закинуть здание на пик горы 1Х1).
SetUnitX/SetUnitY Очень быстрая, безутечная, но потому и быстрая, что не работает с путями и зданиями.
Я замостил зданиями стартовую локу при старте карты, записал координаты зданий в массив. На это ушло 930 миллионов тактов. Это 0.3 секунды 100% загрузки проца на 1 АИ. А еще нужен второй такой же проход, чтобы закрыть щели.