Themis #1 - 3 года назад 1
Голосов: +1 / -0

» WarCraft 3 Reforged / HonestAI

У меня не было нет и не будет акка в соцсетях. Просто кинь карту с расой.

Здесь чем не форум? Взял да спросил. Поддержка бесплатная и пожизненная. И только интернет у меня до конца месяца.
Themis #2 - 3 года назад 3
Голосов: +3 / -0

» WarCraft 3 Reforged / HonestAI

Да.
Конечно можно. Каждый из этих ИИ содержит базу данных всех боевых единиц в игре, потребуются правки. Если на карте нет AMAI, то одинаковые фрагменты можно вынести в один файл. Это я сделаю, а подбирать последовательность строительства не хочу. С тебя минимальное знание jass (править функцию BuildSequencez).
Весь процесс создания прошел в преодолении недостатков нативных функций, до интеллекта так и не дошло.
Я не узнаю, если придет пм. Писать в комменты.
Themis #3 - 4 года назад 0
Голосов: +0 / -0

» Дневник Гильдмастера / Потрошение XGM: Туманные события

Первый годный текст. Теперь бы словарный запас расширить. И я даже ждать буду.
Themis #4 - 4 года назад -1
Голосов: +1 / -2

» WarCraft 3 Reforged / ИИ на Jass'e и неработающая функция SetProduce

Всего скриптов ИИ существует только три = стандартный в war3.mpq, AMAI и мой. Автор статьи к ним отношения не имеет.
Потому что даже один и тот же коммент с кирилицей, после переноса в другую строку, может уже не приводить к вылету.
Themis #5 - 4 года назад 1
Голосов: +1 / -0

» WarCraft 3 Reforged / ИИ на Jass'e и неработающая функция SetProduce

Имя не меняй.
Да, и, кажется, первого слипа на 1 секунду недостаточно, чтобы увидеть "Script started", надо 3 секунды.
А еще, не помню что, но было что-то такое, чего нельзя делать в теле функции main. То есть на будущее сделай так:
function main takes nothing returns nothing
    call Sleep( 1.0 )  // ждать одну секунду
    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script started" )

    call myLoop()

    call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "Script exiting" )
endfunction
Themis #6 - 4 года назад 2
Голосов: +2 / -0

» WarCraft 3 Reforged / ИИ на Jass'e и неработающая функция SetProduce

Дефолтный human.ai находится в архиве war3x.mpq
Мной замечено, что символы за пределами ASCII в скриптах ИИ, но не common.ai, приводят к отключению скрипта и краху. Иногда. Не важно где эти символы: в комментах или нет.
SetProduce работает без глюков. Последний параметр указывает на номер городка ИИ. А вот в нумерации городков глюки есть.
Коммент напротив слипа ошибочен. Интерпретатор всего лишь добавит паузу в 1 секунду по лимиту операций.
В джазе пробелы не важны, А вот в скаримовском папирусе да.
Themis #7 - 4 года назад 2
Голосов: +2 / -0

» WarCraft 3 Reforged / Mdlvis - портит или меняет освещение, как и

mdlVis портит нормали и даже фаталит из-за нормалей. Бывает, приходится обнулять нормали, чтобы mdlvis смог открыть модель.
Способ есть.
  1. В War3ModelEditor сохранить копию модели в текстовом формате mdl.
  2. Отредактировать модель в mdlVis и сохранить в текстовом формате mdl.
  3. Из не редактированной копии перекинуть нормали для каждой поверхности.
  4. Р-ом War3ModelEditor конвертировать в mdx.
Судя по тому, что на скринах нормалей не видно, автору вопроса все таки нужно "Ищи ответ по запросу нормалей вершин."
Themis #8 - 4 года назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / ИИ не защищает союзников

В моем скрипте последовательно выполнялись:
ClearCaptainTargets - отмена задач ИИ;
CaptainGoHome - отправить войска домой;
InitAssault - уволить все войска;
RemoveGuardPosition - игнор ИИ и врагов;
приказ Stop;
приказ Move;
телепорт;
RecycleGuardPosition.
И после всего этого юниты все равно бежали не к ближайшему противнику, а туда, где должны были воевать раньше.

Советы:
Галка напротив Сражение. Она отвечает за защиту союзника.
Галка напротив защита.
Добавить целям условие(кроме обычная цель) лагерь не атакован
Если я правильно помню, то цель враг главный лагерь не правильно названа и может вести к интервенту.
Обычная цель указывает на подсвеченного союзником врага. Это можно делать триггером.
Дальше JASS или выбирать все цели триггерами.
Themis #9 - 4 года назад 7
Голосов: +7 / -0

» WarCraft 3 Reforged / Умножение типов real

Практически одинаково.
Мои тесты дали следующие значения в единицах процессорных тактов.
Объявление локальной переменной любого типа (при каждом вызове функции): 2700
Присваивание литерала локальной переменной любого типа: 700
Присваивание литерала глобальной переменной любого типа: 6700
Присваивание литерала элементу массива: 7500
Обращение к локальной переменной любого типа или константам true, false, null: 300
Обращение к глобальной переменной: 1300
Обращение к элементу массива: 400
Обращение к формальному параметру функции: 1000
Когда в вещественном литерале забыли поставить точку: 300
Целочисленные операции +, -, *: 600
Вещественные операции +, -: 800
Вещественная операция *: 1000
Целочисленное деление: 800
Вещественное деление: 1400
Унарный минус: 3500
Операции <, >: 1300
Операции <=, >=: 1100
Операции ==, !=: 700
Операция not: 100
Вызов пустой функции и возврат по return: 8500
Вызов пустой функции и возврат по endfunction: 9200
Передача первого значения функции: 3800
Передача каждого следующего значения функции: 1700
Возврат значения из функции: 900
loop 2 000
endloop 1 600
exitwhen true 3 300
if true then endif 2 800
if false then else endif 2 800
if not false then endif 2 900
Themis #10 - 5 лет назад 0
Голосов: +0 / -0

» Дневник Гильдмастера / Что мешает дуосу выполнять свои обещания?

Я слухи не сею, мне правды хватает. 4 года назад Алиса посоветовала герою статьи пойти в менеджеры, тогда у него получалось. С тех пор Дуос ладит с людьми все хуже и хуже. Чего бы ему посоветовать? Может сменить логин и не признаваться, а начать заного?
Themis #11 - 5 лет назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / BLP плагин

А теперь есть и бета MP 64 рус.
Themis #12 - 5 лет назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / BLP плагин

Я отправлю в пм. Это екзешник с только английской локалью.
Themis #13 - 5 лет назад 1
Голосов: +1 / -0

» WarCraft 3 Reforged / Альфа-канал: прозрачность и цвет игрока

В режиме Transparent значения альфа-канала от 0 до 197 плавно повышают прозрачность с 0% до 25%, а значения с 198 до 255 означают полную прозрачность.
Themis #14 - 5 лет назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Вопрос про снижение лагов

На глаз: последние 3 строки левого скрина отнимут 130 000 тактов, правого - 40 000 тактов.
SetUnitX совершенно не работает с путями. Она предназначена для дамми.
SetUnitPositionLoc не имеет полноценной альтернативы.
Не эти строчки будут вызывать лаги, а те, где создаются/ воскрешаются/ получают предметы/ получают приказы юниты, эффекты и тп.
Themis #15 - 5 лет назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Проблема с ИИ

Как возможные версии: два рудника рядом; остановка выполнения ИИ из-за ошибки; ИИ не видит лес. Я дико сомневаюсь, что для ИИ включен туман войны, но если лес виден, он все равно должен быть в радиусе 2000.0 от раба.
Themis #16 - 5 лет назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Отследить добычу ресурсов

У разных способов добычи разные наборы возможных приказов. Ставь сниффер на добытчика.
autoharvestgold = 852021 autoharvestlumber = 852022 (не ловятся, но мало ли)
harvest = 852018 resumeharvesting=852017 returnresources=852020
smart = 851971 move=851986(пока у пеона такой приказ, невозможно определить, что он делает)
AImove=851988(бывает, когда пеон в числе атакующих, как вурдалак)
Если у пеона бывает 851971 и 851986, то придется потратиться на массив юнитов и событие с периодом. 852018, 852017, 852020 - занести в массив. Не 852018, 852017, 852020, 852021, 852022, 851971, 851986, 851988, - вычеркнуть.
Themis #17 - 5 лет назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Вариации декораций

Или удалять/создавать или (лучше, сложнее) сделать анимации.
Themis #18 - 5 лет назад 1
Голосов: +1 / -0

» WarCraft 3 Reforged / Опять же интерфейс

Ятд что не хватило мипмапов.
Прикрепленные файлы
Themis #19 - 5 лет назад (изм. ) 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Атака на дирижабле для ИИ

Обязательно указывать хотя бы одну границу области либо номер волны. А тем, кто посылает в атаку рабочих, напоминаю, что в настройках добычи ресов нужно указывать не фиксированное количество, а все, кроме атакующих.
Themis #20 - 5 лет назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Атака на дирижабле для ИИ

Области настраивал? Если да, то давай свой код.
Themis #21 - 5 лет назад 4
Голосов: +4 / -0

» WarCraft 3 Reforged / ИИ не атакует некоторое время

В блок globals вставить:
integer timerVarz=0
call LaunchAttack( ) заменить на
    if timerVarz>=1200 and timerVarz<=1500 then
    else
        call LaunchAttack(  )
    endif
Перед функцией main поставить:
function timerz takes nothing returns nothing
    loop
        set timerVar=timerVar+1
        call Sleep(1.0)
    endloop
endfunction
Перед call PlayGame( ) вставить call StartThread( function timerz )
Themis #22 - 5 лет назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / Проблема с моделью ( не работает в редакторе карт) / mdlvis и тд

По скринам видно, что все редакторы, включая WE смогли открыть файл модели и отобразить ее. Только нет скрина с отображением модели в WE. У меня модель открылась и отобразилась во всех перечисленных редакторах и в игре.
(?)
Themis #23 - 5 лет назад 0
Голосов: +0 / -0

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

Если сработала CommonSuicideOnPlayer, то все юниты сразу лезут в дирижабль. Определить, по какой цели началась атака поможет такая строка
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,20, +"attack 1")
Пишет текст на экране.
Themis #24 - 5 лет назад (изм. ) 2
Голосов: +2 / -0

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

Общепринято дописывать в конце .bak, - это значит: "больше не нужно, но на всякий случай оставим".
.wai обратно переименовывал напрасно. Это нужно будет сделать перед редактированием в редакторе ИИ. Но у тебя же окончательный вариант?
Конкретно .ai файлы можно не удалять/вновь импортировать, а заменять в 1 действие через контекстное меню.
Ниже под #1 "Обычная атака" атаковать юнита, отмеченного союзником. #2 - "Новый лагерь" - ближайший рудник на котором крипы или враги.
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
        endif
        
    endif

    // Target Priority #2
    if (target == null) then
        set target = GetExpansionFoe()
        
        if (target != null) then
            set take_exp = false
            call CommonSuicideOnPlayer(true,true,1,Player(0),0,0)
            return
        endif
    endif
    
    // Target Priority #3
Еще раз по комменту #12: Да; да; да; нет; нет. А в менеджере все то же самое, но доступны только некоторые файлы, зато есть команда "заменить", позволяющая не следить за правильными именем и путем файла.
Themis #25 - 5 лет назад 0
Голосов: +0 / -0

» WarCraft 3 Reforged / как в MPQ открыть фаил wai для редактирования?

wai можно редактировать только в редакторе ИИ WE. В MPQ Editor его можно извлечь, добавить, переименовать. Открыть нельзя.
Themis #26 - 5 лет назад 1
Голосов: +1 / -0

» WarCraft 3 Reforged / 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
Themis #27 - 5 лет назад 4
Голосов: +4 / -0

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

Неважно как появился дирижабль. Добавление дирижабля в войско дает лишь то, что он всегда будет рядом, в том числе под огнем противника.
Dimari93, в той кампании тоже вызывается LoadZepWave.
А раз слишком сложно, то получай более правильный вариант.
call LoadZepWave(I2R(GetWidgetX(target)),I2R(GetWidgetY(target)))
Themis #28 - 5 лет назад (изм. ) 4
Голосов: +4 / -0

» WarCraft 3 Reforged / 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, не верно
Themis #29 - 5 лет назад 2
Голосов: +2 / -0

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

Последние две строки должны быть такие:
    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
Эти строки предполагалось вставлять в любой из бесконечных циклов
Themis #30 - 5 лет назад 0
Голосов: +0 / -0

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

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

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

Попробуй перекодировать не через bmp. У меня blplab неправильно работала с bmp и blp2 при размерах изображения не равных степени двойки.
Themis #32 - 5 лет назад (изм. ) 4
Голосов: +4 / -0

» WarCraft 3 Reforged / Созданный 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 - все войска убегают от более сильного врага. Проверяются только уровни.
Themis #33 - 5 лет назад 0
Голосов: +0 / -0

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

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

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

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

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

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

» WarCraft 3 Reforged / HonestAI

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