Патруль - это когда ходит юнит туда сюда и атакует всех вражеских на пути.
Объявляешь таймер 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, нежели разбирать сотни новых нативок, я лучше ботов поделаю в разных картах, используя старые нативки, всё равно этим интерфейсом мне сейчас без бота денег не сделать. А вот как по мне так мне интересней играть с ботами нежели с людьми. И выжимать по полной переигрывая снова и снова. У меня ещё слауер дефенс припасён в рукаве.)
IceFog, В общем надо дорабатывать проект. Остановился пока на файле hook.hpp там большая ассемблерная вставка. Там нужен результат. И весь проект надо проверять. Если добьёшь выкладывай новый. Я пока не буду его дорабатывать.
Такая же ошибка на Фрозен Троне. Если ты файл редактора не изменяешь в архиве карты. А внедряешь в него только новый jass код. А потом сразу лезешь запускать карту в игре, после сохранения архива. То вар может зависнуть, что даже диспетчер задач не поможет. Лучше скопируй джасс куски кода в блокнот. И открой редактор карт. Открой карту. Вставь из блокнота куски кода. Или тебе придётся удалять файл редактора из архива. Как это делают на протекте карт. Но потом карту не открыть пока не найдёшь этот файл и не вставишь его обратно в архив карты. Можно из других карт его брать. Пробуй.)
А бывает, что и сам редактор вылетает при сохранении, но оставляет папку темп в виде архива. Если открыть фар менеджер. То можно зайти в папку и увидеть твои файлы проекта. Это связано вроде бы с ошибками в jass коде. Или в самом редакторе близардовском.
Какой вопрос и всё деньги платишь. Неужели мемхак тебе прибыль сделает. Посмотри ресурс Пятиминутка в вампов там есть способ через мемхак загрузить библиотеку. Модельки должны быть загружены или сразу в карте или через библиотеку для открытия mpq архивов. Но этот мемхак это доступ к твоему компьютеру. Так что кто этим будет пользоваться?
Создай массив из координат, где должны стоять юниты. А в другом массиве умер юнит или нет. И при смерти спавни снова. С помощью функции создать юнита. И ещё при смерти юнита создать триггер и вызывать функцию РемовеЮнит(ТриггерЮнит()). А то вроде бы память засоряется, как с поднятием монеток в некоторых картах, но может я ошибаюсь.
» 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
» WarCraft 3 / Строительство зданий в редакторе
» WarCraft 3 / constant real wv=500.*.1
» WarCraft 3 / Открытая виртуальная машина
» WarCraft 3 / Открытая виртуальная машина
» WarCraft 3 / Вылет редактора при сохранении
» WarCraft 3 / Вылет редактора при сохранении
» WarCraft 3 / Ищу программиста кто шарит за оффсеты и C
» WarCraft 3 / Отслеживание юнитов
» WarCraft 3 / Городские жители