3

» WarCraft 3 / AI редактор и дирижабли

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
3

» WarCraft 3 / AI редактор и дирижабли

Неважно как появился дирижабль. Добавление дирижабля в войско дает лишь то, что он всегда будет рядом, в том числе под огнем противника.
Dimari93, в той кампании тоже вызывается LoadZepWave.
А раз слишком сложно, то получай более правильный вариант.
call LoadZepWave(I2R(GetWidgetX(target)),I2R(GetWidgetY(target)))
3

» WarCraft 3 / AI редактор и дирижабли

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, не верно
3

» WarCraft 3 / Редактировать код ИИ

Последние две строки должны быть такие:
    call PlayGame()
endfunction
Замени их на:
    call StartBuildLoop()
    loop
        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
        call Sleep(2.0)
    endloop
endfunction
Эти строки предполагалось вставлять в любой из бесконечных циклов
3

» Программирование / Полезная литература

Упомянутая книга Лафоре мне не понравилась. В каждой теме не написано что-то важное.
И для новичков и для середнячков я рекомендую начать с Эккель философия C++ ;
после нее читать Полный справочник по C++ (Шилдт Г.)
и Дьюхерст C++ священные знания.
3

» WarCraft 3 / Размазывается текстура на модели

Попробуй перекодировать не через bmp. У меня blplab неправильно работала с bmp и blp2 при размерах изображения не равных степени двойки.
3

» WarCraft 3 / Созданный Melee AI часто отступает

Посылать триггерно можно будет после небольшой правки 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 - все войска убегают от более сильного врага. Проверяются только уровни.
3

» WarCraft 3 / Физ размер Юнита

Физический размер пешего юнита представляет собой диаметр круга (и вовсе не степень двойки). Это одна цифра, а вы указываете две.
У построек и декораций вместо круга нужно указать целую карту, по которой определяется возможность пройти.
Карта - это картинка в формате Targa(.tga) в поле Пути Текстура пути. Каждый пиксель определяет квадрат 64Х64.
Черный цвет(R=0 G=0 B=0) означает, - здесь можно ходить и строить.
Синий (R=0 G=0 B=255),- здесь можно ходить строить нельзя.
Пурпурный (R=255 G=0 B=255), - нельзя ходить, нельзя строить.
3

» WarCraft 3 / Некоторые нативки.

Забудьте про дебаг. Это миф. DebugS, DebugFI, DebugUnitID, DisplayText, DisplayTextI, DisplayTextII, DisplayTextIII, DoAiScriptDebug, DebugBreak - все они предназначены для программистов Близзард.
Весь режим отладки в том, что строка, перед которой поставлено КС debug (например debug call DoAnything()) выполняется.
Все это выпилено из релизной версии варкрафт.
3

» WarCraft 3 / Некоторые нативки.

StartThread создает новый поток для текущего ИИ, прерывая текущий поток. Есть лимит в 6 потоков на 1 ИИ. Нет лимита на количество операций в потоке.
Sleep - безглючная пауза потока.(TriggerSleepAction в ИИ не работает)
DisplayTextII - ничего не делает. Предназначена для форматированного вывода. Работает только с отладочной версией game.dll, которая не распространяется. Переход в отладочный режим не требуется.
Непосредственно в war3map.j не работают. Но можно вынести в .ai безглючный бесконечный цикл без доступа к триггерам, предметам и декорациям. Пока еще никому это не понадобилось.
Есть несколько нативок из common.ai, которые работают в war3map.j, но только со стандартными юнитами. Возможно .slk тут поможет. Если вы не собираетесь делать ИИ или ставить рекорды по оптимизации кода, то ничего из common.ai вам не пригодится.
3

» WarCraft 3 / HonestAI

Эта проблема не превносится скриптом. Это проблема нативки SetProduce, не проверяющей назначение здания, хотя в РО такое поле есть.
Придется строить карту путей к которой из скрипта нет доступа.
Выход только в CreateUnitByName. Но она выполняется 850 000 процессорных тактов. И, если в квадрате +-1000 места для юнита нет, поставит юнита в указанных координатах.
SetUnitPositionLoc, SetUnitPosition имеют внутреннюю утечку и не работают со склоном (ими можно закинуть здание на пик горы 1Х1).
SetUnitX/SetUnitY Очень быстрая, безутечная, но потому и быстрая, что не работает с путями и зданиями.
Я замостил зданиями стартовую локу при старте карты, записал координаты зданий в массив. На это ушло 930 миллионов тактов. Это 0.3 секунды 100% загрузки проца на 1 АИ. А еще нужен второй такой же проход, чтобы закрыть щели.
Загруженные файлы