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 АИ. А еще нужен второй такой же проход, чтобы закрыть щели.
Загруженные файлы