я тоже создал систему ИИ, но я прописываю ее в триггерах, за это отвечает несколько функций которые выполняют определенный порядок действий, и пока что Полет нормальный, если поставить Компьютерного игрока в свободном слоте он появится в игре, также как и герой для него, еще система умеет проверять Ресурсы Уровень Ману Жизнь герои, умеют двигаться, умеют покупать и продавать предметы возвращая Голду за продажу, умеют Ломать Разрушаемые объекты, умеют создавать Юнитов и все это привязано к Уровню Героя ну и большой Плюс что они умеют играть в Мультиплеере
про Редактора ИИ не могу сказать ничего я им не пользуюсь
Не понимаю как грамотно реализовать.
для начала определится что именно они будут делать
а далее создавать Триггеры или Функции в зависимости что больше нравится и начать вешать События для них
а если добавить все События которые присутствуют в игре можно контролировать практически каждый Шаг ИИ
function Trig_d_Actions takes nothing returns nothing
set udg_H = InitHashtable()
set udg_Dest[1] = gg_dest_LTcr_0000
call TriggerRegisterDeathEvent( gg_trg_t, udg_Dest[1] )
endfunction
//===========================================================================
function InitTrig_d takes nothing returns nothing
set gg_trg_d = CreateTrigger( )
call TriggerAddAction( gg_trg_d, function Trig_d_Actions )
//Map Initialization
endfunction
function T takes nothing returns nothing
local widget w = GetTriggerDestructable()
local real x = GetWidgetX(w)
local real y = GetWidgetY(w)
local itempool ItemPool = CreateItemPool()
local item i
local unit u = LoadUnitHandle(udg_H, StringHash("System"), StringHash("UNIT"))
call ItemPoolAddItemType(ItemPool, 'phea', 60)
call ItemPoolAddItemType(ItemPool, 'pman', 40)
set i = PlaceRandomItem(ItemPool, x, y)
call DestroyItemPool(ItemPool)
call UnitAddItem(u, i)
set ItemPool = null
set i = null
set u = null
endfunction
//===========================================================================
function InitTrig_t takes nothing returns nothing
set gg_trg_t = CreateTrigger( )
call TriggerAddAction( gg_trg_t, function T )
endfunction
function Trig_vsd_Actions takes nothing returns nothing
call SaveUnitHandle(udg_H, StringHash("System"), StringHash("UNIT"), GetOrderedUnit())
endfunction
//===========================================================================
function InitTrig_vsd takes nothing returns nothing
set gg_trg_vsd = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_vsd, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
call TriggerAddAction( gg_trg_vsd, function Trig_vsd_Actions )
endfunction
function Doodad006712_DropItems takes nothing returns nothing
local widget trigWidget=null
local unit trigUnit=null
local integer itemID=0
local boolean canDrop=true
set trigWidget=bj_lastDyingWidget
if(trigWidget==null)then
set trigUnit=GetTriggerUnit()
endif
if(trigUnit!=null)then
set canDrop=not IsUnitHidden(trigUnit)
if(canDrop and GetChangingUnit()!=null)then
set canDrop=(GetChangingUnitPrevOwner()==Player(PLAYER_NEUTRAL_AGGRESSIVE))
endif
endif
if(canDrop)then
call RandomDistReset()
call RandomDistAddItem('I020',60)
call RandomDistAddItem('I01Y',40)
set itemID=RandomDistChoose()
if(trigUnit!=null)then
call UnitDropItem(trigUnit,itemID)
else
call WidgetDropItem(trigWidget,itemID)
endif
endif
set bj_lastDyingWidget=null
call DestroyTrigger(GetTriggeringTrigger())
endfunction
если бы было чтото на подобие
bj_lastKillingWidget
которая отслеживает Кто или Что убил, другое дело но ее нету
RequiredItems //можно и массив, переменная у меня под массив но Интересно
где-то я это уже видел и чем-то напоминает наработку
set giRequireScroll[6]='I007'
set Item_Slot1[6]='penr'
set Item_Slot2[6]='prvt'
set Item_Slot3[6]='rde3'
set giRequireScrollp[6]=3
set Created_Item[6]='blba'
прописать необходимые предметы в Одну переменную под индексом и одним Изящным циклом вычислять все необходимое
Изящно
SoulRazor, конечно хороший пример но это я как раз пытаюсь избежать
у меня тоже самое реализовано но я использую Функции, причем несколько, этого и пытаюсь избежать
if SubString(ChatString, 0, CommandsListSubstringEnd[CommandsListMaxCounter]) == CommandsList[CommandsListMaxCounter] then //-cam, -Cam
// высчитывать Значение Цикла CommandsListMaxCounter внутри переменной CommandsListSubstringEnd
endif
он подберет Индекс CommandsListMaxCounter и будет проверять CommandsListSubstringEnd на наличие Меньшего Значения начиная с 1 до
CommandsListMax
его сразу надо высчитывать чтобы значения цикла не высчитывались
if SubString(ChatString, 0, CommandsListSubstringEnd[CommandsListMax]) == CommandsList[CommandsListMaxCounter] then
так должно выглядеть
отработает 1 раз для CommandsList с привязкой к СommandsListSubstringEnd
if CommandsListMax != 0 then
set CommandsListMaxCounter = 1
loop
exitwhen CommandsListMaxCounter > CommandsListMax // от 1 до 20 команд
//проверить в массиве список Групп Комманд
//set CommandsListGroupCounter = CommandsListGroupStart[1]
//loop
//exitwhen CommandsListGroupCounter > CommandsListGroupEnd[CommandsListMax] //от 1 до 20 Групп
//проверить в Группе команд Список Команд
set CommandsListCounter = 1
loop
exitwhen CommandsListCounter > CommandsListGroupCounter
//проверить список внутри группы комманд
//if CommandsList[CommandsListCounter] == CommandsList[CommandsListMax] then
//set CommandsListSubstringEnd[CommandsListGroupCounter] = CommandsListGroupCounter
if SubString(ChatString, 0, CommandsListSubstringEnd[CommandsListCounter]) == CommandsList[CommandsListCounter] then //-cam, -Cam
endif
//endif
set CommandsListCounter = CommandsListCounter + 1
endloop
//set CommandsListGroupCounter = CommandsListGroupCounter + 1
//endloop
set CommandsListMaxCounter = CommandsListMaxCounter + 1
endloop
endif
CommandsListSubstringEnd[3] = 5
CommandsListSubstringEnd[1] = 4 // длина строки Первой команды
local real CamA = S2R(SubString(ChatString, 5, StringLength(ChatString)))
if SubString(ChatString, 0, CommandsListSubstringEnd[3]) == CommandsList[1] then
думает что это одно и тоже
четко занес в переменную Длину строки...Подстрока когда дойдет до CommandsListSubstringEnd остановится
дальше
local real CamA = S2R(SubString(ChatString, 5, StringLength(ChatString)))
CommandsList[1] = "-cam"
так и
CommandsList[3] = "-camm"
//===========================================================================
// The parameters for the API Substring function are unintuitive, so this
// merely performs a translation for the starting index.
//
function SubStringBJ takes string source, integer start, integer end returns string
return SubString(source, start-1, end)
endfunction
function SubStringBJ takes string source, integer start, integer end returns string
return SubString(source, start-1, end)
endfunction
start-1 = 0
//===========================================================================
// The parameters for the API Substring function are unintuitive, so this
// merely performs a translation for the starting index.
//
function SubStringBJ takes string source, integer start, integer end returns string
return SubString(source, start-1, end)
endfunction
это упрощенный вариант
этот полный
if CommandsListMax != 0 then
set CommandsListMaxCounter = 1
loop
exitwhen CommandsListMaxCounter > CommandsListMax // от 1 до 20 команд
//проверить в массиве список Групп Комманд
//set CommandsListGroupCounter = CommandsListGroupStart[1]
//loop
//exitwhen CommandsListGroupCounter > CommandsListGroupEnd[CommandsListMax] //от 1 до 20 Групп
//проверить в Группе команд Список Команд
set CommandsListCounter = 1
loop
exitwhen CommandsListCounter > CommandsListGroupCounter
//проверить список внутри группы комманд
//if CommandsList[CommandsListCounter] == CommandsList[CommandsListMax] then
//set CommandsListSubstringEnd[CommandsListGroupCounter] = CommandsListGroupCounter
if SubString(ChatString, 0, CommandsListSubstringEnd[CommandsListCounter]) == CommandsList[CommandsListCounter] then //-cam, -Cam
endif
//endif
set CommandsListCounter = CommandsListCounter + 1
endloop
//set CommandsListGroupCounter = CommandsListGroupCounter + 1
//endloop
set CommandsListMaxCounter = CommandsListMaxCounter + 1
endloop
endif
и тоже самое выводит
выводит как
CommandsList[1] = "-cam"
так и
CommandsList[3] = "-camm"
простым языком что пытаюсь сделать
Занести в некий...Глобальный Массив Список команд
и одной проверкой SubString указать то что должно происходить в определенных блоках
проверяя Группу Команд Внутри этого массива и проверки Списка команд Определенной Группы Команд
Плодить Одинаковые Блоки кода которые будут делать Одно и тоже Нет Никакого Желания
заметил что Обращение по индексу Массива работает нормально
if SubString(ChatString, 0, CommandsListSubstringEnd[CommandsListMaxCounter]) == CommandsList[CommandsListMaxCounter] then //-cam, -Cam
//повторяется 2 раза
if SubString(ChatString, 0, CommandsListSubstringEnd[CommandsListMaxCounter]) == CommandsList[3] then //-cam, -Cam
срабатывает только 1 раз и нормально
set CommandsListMax = 20
if CommandsListMax != 0 then
set CommandsListMaxCounter = 1
loop
exitwhen CommandsListMaxCounter > CommandsListMax // от 1 до 20 команд
цикл запущен
выяснил
if SubString(ChatString, 0, CommandsListSubstringEnd[3]) == CommandsList[1] then
он выводит 2 раза
но это невозможно
CommandsListSubstringEnd[3] = 5
CommandsListSubstringEnd[1] = 4 // длина строки Первой команды
local real CamA = S2R(SubString(ChatString, 5, StringLength(ChatString)))
нужно как-то...добавить == но переменная и так
= 4
что может быть ровнее этого числа?
Ред. Centyrion
» WarCraft 3 / ИИ героев
про Редактора ИИ не могу сказать ничего я им не пользуюсь
Ред. Centyrion
» WarCraft 3 / Самый востребованный жанр карт
» WarCraft 3 / ItemPool
Ред. Centyrion
» WarCraft 3 / ItemPool
» WarCraft 3 / ItemPool
Ред. Centyrion
» WarCraft 3 / ItemPool
» WarCraft 3 / ItemPool
» WarCraft 3 / Оптимизация Выполнения Последовательности Кода
» WarCraft 3 / Оптимизация Выполнения Последовательности Кода
Ред. Centyrion
» WarCraft 3 / Оптимизация Выполнения Последовательности Кода
Изящно
» WarCraft 3 / Оптимизация Выполнения Последовательности Кода
» WarCraft 3 / Оптимизация Выполнения Последовательности Кода
» WarCraft 3 / Оптимизация Выполнения Последовательности Кода
» WarCraft 3 / Оптимизация Выполнения Последовательности Кода
» WarCraft 3 / Оптимизация Выполнения Последовательности Кода
» WarCraft 3 / Оптимизация Выполнения Последовательности Кода
у меня тоже самое реализовано но я использую Функции, причем несколько, этого и пытаюсь избежать
» WarCraft 3 / Ограничение для предметов
Ред. Centyrion
» WarCraft 3 / Проверка команды Камеры из Массива
» WarCraft 3 / Проверка команды Камеры из Массива
дальше
» WarCraft 3 / Проверка команды Камеры из Массива
нет заметил это...думал экземпляр структуры в другом месте
SubString неправильно высчитывает значения Индексов Массива
» WarCraft 3 / Проверка команды Камеры из Массива
Ред. Centyrion
» WarCraft 3 / Проверка команды Камеры из Массива
а у меня Список
Стандартным методом проверки Подстроки?
Ред. Centyrion
» WarCraft 3 / Проверка команды Камеры из Массива
Призван задать ограничение чисто для Команды
дальше
будет работать
где
Ред. Centyrion
» WarCraft 3 / Проверка команды Камеры из Массива
выводит как
Занести в некий...Глобальный Массив Список команд
и одной проверкой SubString указать то что должно происходить в определенных блоках
проверяя Группу Команд Внутри этого массива и проверки Списка команд Определенной Группы Команд
но это невозможно
= 4
что может быть ровнее этого числа?
» WarCraft 3 / АОЕ Стан абилка для даммиков