18

» WarCraft 3 / ИИ героев

я тоже создал систему ИИ, но я прописываю ее в триггерах, за это отвечает несколько функций которые выполняют определенный порядок действий, и пока что Полет нормальный, если поставить Компьютерного игрока в свободном слоте он появится в игре, также как и герой для него, еще система умеет проверять Ресурсы Уровень Ману Жизнь герои, умеют двигаться, умеют покупать и продавать предметы возвращая Голду за продажу, умеют Ломать Разрушаемые объекты, умеют создавать Юнитов и все это привязано к Уровню Героя ну и большой Плюс что они умеют играть в Мультиплеере
про Редактора ИИ не могу сказать ничего я им не пользуюсь

Не понимаю как грамотно реализовать.
для начала определится что именно они будут делать
а далее создавать Триггеры или Функции в зависимости что больше нравится и начать вешать События для них

а если добавить все События которые присутствуют в игре можно контролировать практически каждый Шаг ИИ
18

» WarCraft 3 / Самый востребованный жанр карт

играю в своем проекте 🙂 Castle Defense ну и в других где есть Волны или что-то Интересное
18

» WarCraft 3 / ItemPool

нашел решение
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
таким образом Работает
18

» WarCraft 3 / ItemPool

если смотреть со стороны
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
которая отслеживает Кто или Что убил, другое дело но ее нету
18

» WarCraft 3 / ItemPool

Borodach, в примере с хайва там Событие
//    set gg_trg_Neutral_Hostile_Drop_Tables = CreateTrigger(  )
//    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Neutral_Hostile_Drop_Tables, Player(PLAYER_NEUTRAL_AGGRESSIVE), EVENT_PLAYER_UNIT_DEATH )
//    call TriggerAddAction( gg_trg_Neutral_Hostile_Drop_Tables, function Trig_Neutral_Hostile_Drop_Tables_Actions )
мне это событие не нужно так как я не собираюсь бить крипов чтобы с них падали шмотки а
GetTriggerDestructable()
18

» WarCraft 3 / ItemPool

local unit u = GetTriggerUnit()
он так не заработает
18

» WarCraft 3 / Оптимизация Выполнения Последовательности Кода

EugeAl, этот вариант тоже не лишен недостатков но и Задумка интересная а плодить 2 цикла внутри функции это еще больше строк кода
18

» WarCraft 3 / Оптимизация Выполнения Последовательности Кода

Makeba, Хм, Задумка интересная,
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'
прописать необходимые предметы в Одну переменную под индексом и одним Изящным циклом вычислять все необходимое
Изящно
Беру на вооружение :)
18

» WarCraft 3 / Оптимизация Выполнения Последовательности Кода

EugeAl, конечно пойдет, этот вариант тоже нормальный но многовато аргументов он принимает, а вычислять его в функции тоже не красиво
18

» WarCraft 3 / Оптимизация Выполнения Последовательности Кода

EugeAl, в курсе, у меня Массив в виде
set Item[1] = 'I001'
globals
integer array Item
endglobals
18

» WarCraft 3 / Оптимизация Выполнения Последовательности Кода

EugeAl, тоже хороший вариант, но слегка можно доработать, Слегка чтобы использовал Массивы а не Конкретные предметы
18

» WarCraft 3 / Оптимизация Выполнения Последовательности Кода

SoulRazor, конечно хороший пример но это я как раз пытаюсь избежать
у меня тоже самое реализовано но я использую Функции, причем несколько, этого и пытаюсь избежать
18

» WarCraft 3 / Проверка команды Камеры из Массива

чтож


оказывается допустил ошибку при высчитывании

Нельзя
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

Centyrion, если удалить комментарии, то у тебя пустое условие.
Спасибо! воспользуюсь ссылкой
18

» WarCraft 3 / Проверка команды Камеры из Массива

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  
18

» WarCraft 3 / Проверка команды Камеры из Массива

да понял что здесь происходит
нет заметил это...думал экземпляр структуры в другом месте

ну вот это и пытаюсь сделать

по какойто причине
SubString неправильно высчитывает значения Индексов Массива
18

» WarCraft 3 / Проверка команды Камеры из Массива

у меня немножко по другому устроено, в одной функции хочу проверить Список всех команд и делать действия, не хочу заморачиваться с Либами
18

» WarCraft 3 / Проверка команды Камеры из Массива

либа принимает только 1 команду
а у меня Список

а вот
    function onInit(){
        msg("Чтобы изменить имя напечатайте |cffffff00-zoom |cff909090" + I2S(R2I(Min)) + "<>" + I2S(R2I(Max)));
        
        CustomChatEvent
            .create("zoom") // ловим -zoom
            .addSynonym("зум") // ловим -зум
            .addSynonym("ящщь") // не забываем тех, кто перепутал раскладку
            .onSuccess(function setZoom) // указываем функцию, которая сработает при удачном отлове
        ;

а если без Либы
Стандартным методом проверки Подстроки?
18

» WarCraft 3 / Проверка команды Камеры из Массива

CommandsListSubstringEnd[3]
Призван задать ограничение чисто для Команды
дальше
будет работать
local real CamA = S2R(SubString(ChatString, 5, StringLength(ChatString)))

Посмотри в этой системе там это в примерах есть.
Хм...это я реализовал
где
requires CustomChatEvent
18

» WarCraft 3 / Проверка команды Камеры из Массива

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
что может быть ровнее этого числа?

положить -1
call TriggerRegisterPlayerChatEvent(trig[4], Player(pi), "-", false)
начнет работать после Пробела
18

» WarCraft 3 / АОЕ Стан абилка для даммиков

молот бурь с макс скоростью
а потом пикать юнитов вокруг точки и станить их группой
  • берем дамика
  • даем ему абилку Оглушение
  • выбираем юнитов на которых будет действовать Стан и Оглушаем их