Добавлен  Svintus 
                            
                            
                            
                            
                            
                            
                        
                        
                    Я пытаюсь интегрировать код кастомного ИИ, не для мили сражения. 
 
//===========================================================================
// Custom Orc AI System (Patch 1.27)
//===========================================================================
globals
    constant integer AI_PLAYER = 8
    boolean isAIInitialized = false
    constant real BUILD_SPACING = 512.0
    integer array buildingSizes
endglobals
//===========================================================================
// Initialization
//===========================================================================
function InitBuildingSizes takes nothing returns nothing
    set buildingSizes['ogre'] = 256
    set buildingSizes['ostr'] = 320
    set buildingSizes['ofrt'] = 384
    set buildingSizes['oalt'] = 192
    set buildingSizes['obar'] = 224
    set buildingSizes['osld'] = 256
    set buildingSizes['obea'] = 224
    set buildingSizes['otrb'] = 192
    set buildingSizes['owtw'] = 160
    set buildingSizes['ofor'] = 160
endfunction
//===========================================================================
// Building System
//===========================================================================
function IsStructureFilter takes nothing returns boolean
    return IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and GetOwningPlayer(GetFilterUnit()) == Player(AI_PLAYER)
endfunction
function CheckBuildArea takes real x, real y, real size returns boolean
    local group g = CreateGroup()
    local boolean result = true
    
    if not IsTerrainBuildable(x, y) then
        set result = false
    endif
    if IsTerrainPathable(x, y, PATHING_TYPE_BUILDABILITY) then
        set result = false
    endif
    
    call GroupEnumUnitsInRange(g, x, y, size + 256.0, Condition(function IsStructureFilter))
    set result = (CountUnitsInGroup(g) == 0)
    
    call DestroyGroup(g)
    set g = null
    return result
endfunction
function FindBuildLocation takes real startX, real startY, integer buildType returns location
    local real angle = 0.0
    local real radius = 0.0
    local integer steps = 0
    local real newX
    local real newY
    
    loop
        exitwhen steps > 30
        set angle = 0.0
        loop
            exitwhen angle >= 360.0
            set newX = startX + radius * Cos(angle * bj_DEGTORAD)
            set newY = startY + radius * Sin(angle * bj_DEGTORAD)
            if CheckBuildArea(newX, newY, buildingSizes[buildType]) then
                return Location(newX, newY)
            endif
            set angle = angle + 45.0
        endloop
        set radius = radius + BUILD_SPACING
        set steps = steps + 1
    endloop
    return null
endfunction
//===========================================================================
// Core AI Logic
//===========================================================================
function BuildMainBase takes nothing returns nothing
    local unit worker = GetFirstUnitOfType('ncpn')
    local location buildLoc
    
    if worker == null then
        return
    endif
    
    set buildLoc = FindBuildLocation(GetUnitX(worker), GetUnitY(worker), 'ogre')
    
    if buildLoc != null then
        call IssueBuildOrder(worker, 'ogre', GetLocationX(buildLoc), GetLocationY(buildLoc))
    endif
    
    call RemoveLocation(buildLoc)
    set buildLoc = null
    set worker = null
endfunction
function CustomAI_Main takes nothing returns nothing
    if isAIInitialized then
        return
    endif
    set isAIInitialized = true
    
    call InitBuildingSizes()
    call DisplayTextToForce(GetPlayersAll(), "AI: Started!")
    
    loop
        call BuildMainBase()
        call Sleep(1.0)
    endloop
endfunction
//===========================================================================
// Trigger Initialization
//===========================================================================
function InitTrig_CustomAI takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterTimerEventSingle(t, 0.50)
    call TriggerAddAction(t, function CustomAI_Main)
    set t = null
endfunctionАктивается через триггер, но до триггера дело не доходит. Редактор выдаёт ошибку компиляции. 
Я вставляю код в триггер, конвертируя предварительно этот триггер в текст.
Я пытался вставить этот код в нестандартный код карты - всё одинаково. Ошибся компиляции в каждой строчки кода. (отсутствует конец строки, отсутствует название переменной)
Я вставляю код в триггер, конвертируя предварительно этот триггер в текст.
Я пытался вставить этот код в нестандартный код карты - всё одинаково. Ошибся компиляции в каждой строчки кода. (отсутствует конец строки, отсутствует название переменной)
    
        
            
                `
            
            
                
        
    
    ОЖИДАНИЕ РЕКЛАМЫ...
            
                    
                        Чтобы оставить комментарий, пожалуйста, войдите на сайт.
                    
                
             
                        
                        
                    
 WC3
                                WC3
                            



Гарантировать я ничего не могу конечно.
Но читал что мили АИ имеет доступ только к функциям common.ai.
Но если кастомный код подгружать в карту для управления игроком-компьютером - то этот код имеет доступ ко всем функциям в карте.
Ред. Svintus
Ну да. Это если я импортирую этот код в виде .j файла, а потом триггере пытаюсь вызвать основную функцию ИИ оттуда - то ошибка, что нет такой функции.
А если импортировать код в карту, в нестандартный код целиком - то сыпятся ошибки для каждой строчки.
Ред. EugeAl
В нестандартном коде они не будут работать, нестандартный код это j файл
Запускать их надо из кода карты (j файл) через функцию StartMeleeAI(номер игрока, путь к ai файлу)
Кажется, это должно быть возможно.
И если я могу ими управлять, то я могу написать скрипт ИИ в обход стандартным функциям написания ИИ
Ред. EugeAl
А если написать управление в нестандартном коде, получится, что один скрипт будет мешать другому. Ведь здесь как раз разные потоки
Ред. Svintus
Хорошо. В таком случае, я ведь могу просто не инициализировать стандартный ИИ, и запустить свой кастомный?
Ред. EugeAl
Ред. Vampir_kolik