ScorpioT1000, да научить бы лаунчер симулировать локалку. Ладно тут два пути, мне кажется, либо все в карту пихнуть но вес карты будет большой. Либо действительно будущее за UjAPI.
Совет. Установи AMAI интегратор. Сделай карту с AMAI посмотри код файлов .ai. Поймёшь, что ты уже проходишь, этап создания ИИ в мили картах, но только в самом начале. И поймёшь, что поиск пути тебе не даст покоя. В будущем.
Svintus, некоторые функции работающие в файле .j могут не работать в файле .ai. common.ai - это общие функции всех расс, а, например, human.ai только для людей.
Нужен сервер, который принимает запросы и от варкрафта без лаунчера и с лаунчером. А Новые модельки надо подгружать в карту. И иконки. Кто напишет такой сервер? Вообщем я бы поразбирался бы в этом, если бы дали исходники сервера. Да но вопрос в картах. ( Только сервак может создавать карты. Получается. Или бред? Всем нужен лаунчер всё равно. Из-за Ангел Скрипта.
Патруль - это когда ходит юнит туда сюда и атакует всех вражеских на пути.
Объявляешь таймер local timer vTimer, создаёшь таймер set vTimer = CreateTimer(), уничтожаешь потом таймер call DestroyTimer(vTimer), запускаешь таймер call TimerStart(vTimer,1,function fMyFunction). В войдоской функции fMyFunction пишешь цикл по всем игрокам и их героям. Если юнита создавал через jass, то должны сохраниться id юнитов set vHero1 = CreateUnit(Player(10),ID_HERO_1,0,0,0), объявлять юнита следующим образом local unit vHero1. Если через редактор вставлял юнитов, то они как не странно будут в jass, но id юнитов не сохраняться, если сам не подправишь код. Если хочешь искать юнитов то тебе нужен перебиратор юнитов в группе.
Вот пример:
function fGetUnit takes integer vId, player vPlayer returns unit
local group g=CreateGroup()
local unit u;
call GroupEnumUnitsOfPlayer(g,vPlayer,0);
loop
set u=FirstOfGroup(g)
if (GetUnitTypeId(u)==vId) then
call DestroyGroup(g)
return u
endif
call GroupRemoveUnit(g,u)
endloop
call DestroyGroup(g)
return 0
endfunction
Углы искать между юнитами тебе нужно поучить тригонометрию, а в особенности sin и cos что будет расстояние между двумя точками x1, y1, x2, y2. А тебе нужен противоположенный угол и радиус на сколько убегать. Вообще интересно увидеть всё это в деле.
Если нужно перебирать в радиусе то вот вот функция GroupEnumUnitsInRange(group,x,y,radius,function filter можно 0) для перебирания.
Если вражеский бос id и rect совпадают то бос определён.
Цикл по игрокам компьютерам можешь имя сравнить local string vStr, set vPlayer = Player(0..11), set vStr = GetPlayerName(vPlayer). Может есть другой способ определить ИИ, я не знаю.
Приказ кастануть спелл на цель set vBool = IssueTargetOrderById(u,ID_ORDER,u2), просто нажать кнопку set vBool = IssueImmediateOrderById(u,ID_ORDER), в точку set vBool = IssuePointOrderById(u,ID_ORDER,x,y)
Юнитов лучше сохранять в хеш таблице, и брать данные из хеш-таблицы set vHT = InitHashtable()
call SaveInteger(vHT, parentKey, childKey, value)
set vInt = LoadInteger(vHT, parentKey, childKey)
set parentKey = GetExpiredTimer()
childKey = CONST_HERO_1
p.s. И если ты хочешь сделать сложного бота без дебагера, на jass, то это вряд ли у тебя получится. Так как тыкаться в jass коде без знания параметров каждой переменной это издевательство над собой. Да ещё и с таким опытом, который описан выше. Мапхак тебе в помощь. А если простой бот, так потренироваться по написанию jass кода, ну можно. Только это не серьезно.
Наверное, как и любая база данных требует шардирования при большом количестве записей в таблице для оптимизации поиска. Но при условии, что ты знаешь номер id. Первые сто тысяч(по id) пишешь в одну таблицу вторую сотню тысяч(по id) в другую. Но по номеру. И производительность возрастает. Если записей мало то одной хеш-таблицы за глаза.
EugeAl, вот есть статейка Как подключиться в процессу Warcraft'a 3, через Visual Studio., и ещё старая статья где обсуждалось, какой тип функций лучше с освобождение памяти после выхода из игры или нет, но подтирать приходится переменные вручную Своя нативка на С. Там если знаешь язык С, то разобраться не сложно в коде. А если интересно, как внедряется dll в карту то посмотри jass код карты чистой из этой статьи Сценарий на любом языке.
EugeAl, можешь попробовать мапхак. Всё грузится даже на 7 ке, 10 ке. Подхватывается бедагом, компилируется прямо во время игры. Вот пример: Пятиминутка в вампов. А если сможешь подключить и библиотеки msvcp100.dll и msvcr100.dll в карту, то я тебе спасибо скажу.
Ev3nt, нежели разбирать сотни новых нативок, я лучше ботов поделаю в разных картах, используя старые нативки, всё равно этим интерфейсом мне сейчас без бота денег не сделать. А вот как по мне так мне интересней играть с ботами нежели с людьми. И выжимать по полной переигрывая снова и снова. У меня ещё слауер дефенс припасён в рукаве.)
» WarRaft / JASS-ANTLR-Kotlin-VSCode
» WarCraft 3 / Как создать свою систему локаций? - [Jass]
» WarCraft 3 / Вывод сообщения на экран о количестве юнитов (I2S не работает в ИИ)
Ред. Vampir_kolik
» WarCraft 3 / Использование кастомного кода
» WarCraft 3 / Помогите (ошибка)
» WarRaft / JASS-ANTLR-Kotlin-VSCode
Ред. Vampir_kolik
» WarRaft / JASS-ANTLR-Kotlin-VSCode
» Таверна Хаоса: Марш Хаоса (HD for 1.26a!) / Warcraft III: DFates Classic Forge Mod
» Таверна Хаоса: Марш Хаоса (HD for 1.26a!) / Warcraft III: DFates Classic Forge Mod
» WarCraft 3 / AI помогите
Объявляешь таймер local timer vTimer, создаёшь таймер set vTimer = CreateTimer(), уничтожаешь потом таймер call DestroyTimer(vTimer), запускаешь таймер call TimerStart(vTimer,1,function fMyFunction). В войдоской функции fMyFunction пишешь цикл по всем игрокам и их героям. Если юнита создавал через jass, то должны сохраниться id юнитов set vHero1 = CreateUnit(Player(10),ID_HERO_1,0,0,0), объявлять юнита следующим образом local unit vHero1. Если через редактор вставлял юнитов, то они как не странно будут в jass, но id юнитов не сохраняться, если сам не подправишь код. Если хочешь искать юнитов то тебе нужен перебиратор юнитов в группе.
Вот пример:
Если нужно перебирать в радиусе то вот вот функция GroupEnumUnitsInRange(group,x,y,radius,function filter можно 0) для перебирания.
Если вражеский бос id и rect совпадают то бос определён.
Цикл по игрокам компьютерам можешь имя сравнить local string vStr, set vPlayer = Player(0..11), set vStr = GetPlayerName(vPlayer). Может есть другой способ определить ИИ, я не знаю.
Приказ кастануть спелл на цель set vBool = IssueTargetOrderById(u,ID_ORDER,u2), просто нажать кнопку set vBool = IssueImmediateOrderById(u,ID_ORDER), в точку set vBool = IssuePointOrderById(u,ID_ORDER,x,y)
Юнитов лучше сохранять в хеш таблице, и брать данные из хеш-таблицы set vHT = InitHashtable()
call SaveInteger(vHT, parentKey, childKey, value)
set vInt = LoadInteger(vHT, parentKey, childKey)
set parentKey = GetExpiredTimer()
childKey = CONST_HERO_1
» WarCraft 3 / Небольшой вопрос касательно хэш-таблиц
» WarCraft 3 / Открытая виртуальная машина
» WarCraft 3 / Открытая виртуальная машина
» WarCraft 3 / Пятиминутка в вампов
» WarCraft 3 / Пятиминутка в вампов
» WarCraft 3 / [UjAPI] ODE Physics API
» WarCraft 3 / [UjAPI] ODE Physics API
» WarCraft 3 / [UjAPI] ODE Physics API
» WarCraft 3 / Поймай вампира
» WarCraft 3 / Поймай вампира
» WarCraft 3 / Поймай вампира
» WarCraft 3 / Поймай вампира
» WarCraft 3 / Поймай вампира
» Unryze Jass API / [UjAPI] Конкурс Наработок 2024
» Unryze Jass API / [UjAPI] Конкурс Наработок 2024