Уже полтора дня борюсь с тем, что юниты что-то не строят, но суть не в этом. Расследования привели меня к тому, что функция попросту не доходит к концу (о чем свидетельствует отчет "Вхожу в билд" и отсутствие "Выхожу из билда". Что самое интересное, на старте игры пару раз функция таки доходит до конца, но лишь пару раз. Гляньте свежим взглядом, может допустил что на ровном месте.
Если что, Reforged.
По центру код прям ооочень одноорбразный, так что на кол-во не пугайтесь, там просто первым случай с "Ратуша" проверить можно.
Подозрения вызывают лоады их хеш таблицы - могут они как-то мешать? А если они пусты, в значении которое загружаю?
UPD: пораспихал отчеты по функции, перестает их присылать после пары иф с лоадами ( где-то от 3 Казарма )
function TryBuild takes nothing returns nothing
    local real x
    local real y
    local integer w = 0
    local integer b = 0
    local location l = null
    local location p = null
    local rect r 
    local unit u = TryBuild_u
    local integer HaveOrder = 0
    local integer pi = GetPlayerId(GetOwningPlayer(u))
    
    local integer i = 1
    local integer array a //Колво выбоорки в 0 и шанс случая в остальном
    call DisplayTimedTextFromPlayer(Player(0),0,0,4, "Вхожу в билд")
    

    call GroupAddUnit( udg_Ai_buildersT[pi], u )
    call GroupRemoveUnit( udg_Ai_builders[pi], u )
    call GroupRemoveUnit( udg_Ai_harvest[pi], u )
    
    
    
    //Что строить
    set b = 1
    
    set p = GetUnitLoc(u)
    
    //Если в воде для ферфи - то строй верфь c 75%)
    if IsTerrainPathableBJ(p,PATHING_TYPE_WALKABILITY ) == false and IsTerrainPathableBJ(p,PATHING_TYPE_FLOATABILITY  ) == false then
        set i = GetRandomInt(1,4)
        set b = 0
        if i <= 3 then
            set HaveOrder = 1
            loop
                exitwhen  b== 5
                set b = b+1
                
                
                set r = RectFromCenterSizeBJ(p,200*b,200*b)
                set l = GetRandomLocInRect(r)
                
                call RemoveRect(r)
                if IsTerrainPathableBJ(l,PATHING_TYPE_WALKABILITY ) == false and IsTerrainPathableBJ(l,PATHING_TYPE_FLOATABILITY  ) == false then
                    call IssueBuildOrderByIdLocBJ(u,'h011',l)
                    set b = 5
                endif
                
                call RemoveLocation(l)
            endloop
        endif
    endif
    
    call RemoveLocation(l) 


    //Попытка что-то строить

  
    set p = GetUnitLoc(u)
    set r = RectFromCenterSizeBJ(p, 3500, 3500)
    set l = GetRandomLocInRect(r)
    
    call RemoveLocation(p)
    call RemoveRect(r)
    
    set x = GetLocationX(l)
    set y = GetLocationY(l)
    call RemoveLocation(l)
    
    
    
    
    
    
    
    
    set a[0] = 1 //Кол-во вариантов со старта
    
    
    set a[1] = 'h05Y' // 1 Ферма

    // Доп варианыт при условиях

    // 2 Ратуша 
    if LoadInteger(AiData,pi,'h05U') < 4 then
        set i = 2 //мошь выбора
        set b = 1
        loop
            set a[0]= a[0]+1
            set a[ a[0] ] = 'h05U'
            set b=b+1
            exitwhen b==i
            
        endloop
    endif
    
    // 3 Казарма
    if LoadInteger(AiData,pi,'h05Z') < 10 then
        set i = 5 //мошь выбора
        set b = 1
        loop
            set a[0]= a[0]+1
            set a[ a[0] ] = 'h05Z'
            set b=b+1
            exitwhen b==i
        endloop
    endif
    
    // 4 Башня
    if LoadInteger(AiData,pi,'h063')*2 < LoadInteger(AiData,pi,'h05Y') then
        set i = 1 //мошь выбора
        set b = 1
        loop
            set a[0]= a[0]+1
            set a[ a[0] ] = 'h063'
            set b=b+1
            exitwhen b==i
        endloop
    endif
    
    // 5 Лесопилка
    if LoadInteger(AiData,pi,'h062') < 5 then
        set i = 2 //мошь выбора
        set b = 1
        loop
            set a[0]= a[0]+1
            set a[ a[0] ] = 'h062'
            set b=b+1
            exitwhen b==i
        endloop
    endif
    
    // 6 Кузница
    if LoadInteger(AiData,pi,'h060') < 6  then
        set i = 2 //мошь выбора
        set b = 1
        loop
            set a[0]= a[0]+1
            set a[ a[0] ] = 'h060'
            set b=b+1
            exitwhen b==i
        endloop
    endif
    
    // 7 Алтарь
    if LoadInteger(AiData,pi,'h05X') < 3  then
        set i = 2 //мошь выбора
        set b = 1
        loop
            set a[0]= a[0]+1
            set a[ a[0] ] = 'h05X'
            set b=b+1
            exitwhen b==i
        endloop
    endif
 
    if (LoadInteger(AiData,pi,'h05V') > 1 or LoadInteger(AiData,pi,'h05W') > 1) and LoadInteger(AiData,pi,'h064') < 10  then
        set i = 5 //мошь выбора
        set b = 1
        loop
            set a[0]= a[0]+1
            set a[ a[0] ] = 'h064'
            set b=b+1
            exitwhen b==i
        endloop
    endif
    
    // 9 Храм
    if (LoadInteger(AiData,pi,'h05V') > 1 or LoadInteger(AiData,pi,'h05W') > 1) and LoadInteger(AiData,pi,'h061') < 15 then
        set i = 4 //мошь выбора
        set b = 1
        loop
            set a[0]= a[0]+1
            set a[ a[0] ] = 'h061'
            set b=b+1
            exitwhen b==i
        endloop
    endif
  
    // 10 Церковь
    if LoadInteger(AiData,pi,'h05W') > 1 and LoadInteger(AiData,pi,'h068') < 15  then
        set i = 6 //мошь выбора
        set b = 1
        loop
            set a[0]= a[0]+1
            set a[ a[0] ] = 'h068'
            set b=b+1
            exitwhen b==i
        endloop
    endif
  
    
    
    
    set i = GetRandomInt(1,a[0])
    call IssueBuildOrderById( u, a[i], x, y )

    
    
    
    

    call RemoveRect(r)
    set r = null
    call RemoveLocation(p) 
    set p = null
    call RemoveLocation(l) 
    set l = null
    call RemoveLocation(udg_LocalPoint)   
    call DisplayTimedTextFromPlayer(Player(0),0,0,4, "Выхожу из Билда")
    return
endfunction

Принятый ответ

Так, причина найдена
4 Башня
if LoadInteger( AiData, pi, 'h063' ) * 2 < LoadInteger( AiData, pi, 'h05Y' ) then
set i = 1 мошь выбора
set b = 1
Так как подобных вариантов много, пришел к выводу, что виновато умножение. Как и почему, сказать, к сожалению, не могу, но без него функция работает и доходит до конца.

UPD, ошибка оказалась банальная, теперь уже точно - цикл зацикливается, так как только тут единичка на и, а b перемахивает условие выхода. Вывод - внимательность наше все.
if LoadInteger(AiData,pi,'h063')*2 < LoadInteger(AiData,pi,'h05Y') then
set i = 1 мощь выбора
set b = 1
loop
set a[0]= a[0]+1
set a[ a[0] ] = 'h063'
set b=b+1
exitwhen b==i
endloop
endif
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
27
2 года назад
1
попробуй это
раскрыть
function TryBuild takes nothing returns nothing
    local unit u = TryBuild_u
    local real x
    local real y
    local real x1
    local real y1
    local integer w = 0
    local integer b = 0
    local integer HaveOrder = 0
    local integer pi = GetPlayerId( GetOwningPlayer( u ) )
    local integer i = 1
    local integer array a //Колво выбоорки в 0 и шанс случая в остальном
    //local location l = null
    //local location p = null
    //local rect r
    
    call DisplayTimedTextFromPlayer( Player( 0x00 ), 0, 0, 4, "Вхожу в билд" )
    
    /*call GroupAddUnit( udg_Ai_buildersT[pi], u )
    call GroupRemoveUnit( udg_Ai_builders[pi], u )
    call GroupRemoveUnit( udg_Ai_harvest[pi], u )
    */
    //Что строить
    set b = 1
    
    //set p = GetUnitLoc( u )
    
    set x = GetUnitX( u )
    set y = GetUnitY( u )
    
    //Если в воде для верфи - то строй верфь c 75%)
    if not IsTerrainPathable( x, y, PATHING_TYPE_WALKABILITY ) and not IsTerrainPathable( x, y, PATHING_TYPE_FLOATABILITY ) then
        set i = GetRandomInt( 1, 4 )
        set b = 0
        
        if i <= 3 then
            set HaveOrder = 1
            
            loop
                exitwhen b == 5
                set b = b + 1
                
                set x1 = x + 200.00 * Cos( GetRandomReal( 0.00, 360.00 ) * bj_DEGTORAD )
                set y1 = y + 200.00 * Sin( GetRandomReal( 0.00, 360.00 ) * bj_DEGTORAD )
                /*set r = RectFromCenterSizeBJ(p,200*b,200*b) 
                set l = GetRandomLocInRect(r)
                
                call RemoveRect(r)*/
                if not IsTerrainPathable( x1, y1, PATHING_TYPE_WALKABILITY ) and not IsTerrainPathable( x1, y1, PATHING_TYPE_FLOATABILITY ) then
                    call IssueBuildOrderById( u, 'h011', x1, y1 )
                    set b = 5
                endif
                //call RemoveLocation(l)
            endloop
        endif
    endif
    
    //call RemoveLocation(l) 


    //Попытка что-то строить
    /*set p = GetUnitLoc(u)
    set r = RectFromCenterSizeBJ(p, 3500, 3500)
    set l = GetRandomLocInRect(r)
    
    call RemoveLocation(p)
    call RemoveRect(r)
    
    set x = GetLocationX(l)
    set y = GetLocationY(l)
    call RemoveLocation(l)*/
    set x = x + 3500.00 * Cos( GetRandomReal( 0.00, 360.00 ) * bj_DEGTORAD )
    set y = y + 3500.00 * Sin( GetRandomReal( 0.00, 360.00 ) * bj_DEGTORAD )
    
    set a[0] = 1 //Кол-во вариантов со старта
    
    set a[1] = 'h05Y' // 1 Ферма

    // Доп. варианты при условиях

    // 2 Ратуша 
    if LoadInteger( AiData, pi, 'h05U' ) < 4 then
        set i = 2 //мошь выбора
        set b = 1
        
        loop
            set a[0] = a[0] + 1
            set a[ a[0] ] = 'h05U'
            
            set b = b + 1
            exitwhen b == i
        endloop
    endif
    
    // 3 Казарма
    if LoadInteger( AiData, pi, 'h05Z' ) < 10 then
        set i = 5 //мошь выбора
        set b = 1
        
        loop
            set a[0] = a[0] + 1
            set a[ a[0] ] = 'h05Z'
            set b = b + 1
            exitwhen b == i
        endloop
    endif
    
    // 4 Башня
    if LoadInteger( AiData, pi, 'h063' ) * 2 < LoadInteger( AiData, pi, 'h05Y' ) then
        set i = 1 //мошь выбора
        set b = 1
        
        loop
            set a[0] = a[0] + 1
            set a[ a[0] ] = 'h063'
            set b = b + 1
            exitwhen b == i
        endloop
    endif
    
    // 5 Лесопилка
    if LoadInteger( AiData, pi, 'h062' ) < 5 then
        set i = 2 //мошь выбора
        set b = 1
        
        loop
            set a[0] = a[0] + 1
            set a[ a[0] ] = 'h062'
            set b = b + 1
            exitwhen b == i
        endloop
    endif
    
    // 6 Кузница
    if LoadInteger( AiData, pi, 'h060' ) < 6  then
        set i = 2 //мошь выбора
        set b = 1
        
        loop
            set a[0] = a[0] + 1
            set a[ a[0] ] = 'h060'
            set b = b + 1
            exitwhen b == i
        endloop
    endif
    
    // 7 Алтарь
    if LoadInteger( AiData, pi, 'h05X' ) < 3  then
        set i = 2 //мошь выбора
        set b = 1
        loop
            set a[0] = a[0] + 1
            set a[ a[0] ] = 'h05X'
            set b = b + 1
            exitwhen b == i
        endloop
    endif
 
    if ( LoadInteger( AiData, pi, 'h05V' ) > 1 or LoadInteger( AiData, pi, 'h05W' ) > 1 ) and LoadInteger( AiData, pi, 'h064' ) < 10 then
        set i = 5 //мошь выбора
        set b = 1
        
        loop
            set a[0] = a[0] + 1
            set a[ a[0] ] = 'h064'
            set b = b + 1
            exitwhen b == i
        endloop
    endif
    
    // 9 Храм
    if (LoadInteger( AiData, pi, 'h05V' ) > 1 or LoadInteger( AiData, pi, 'h05W' ) > 1 ) and LoadInteger( AiData, pi, 'h061' ) < 15 then
        set i = 4 //мошь выбора
        set b = 1
        
        loop
            set a[0 ]= a[0] + 1
            set a[ a[0] ] = 'h061'
            set b = b + 1
            exitwhen b == i
        endloop
    endif
  
    // 10 Церковь
    if LoadInteger( AiData, pi, 'h05W' ) > 1 and LoadInteger( AiData, pi, 'h068' ) < 15 then
        set i = 6 //мошь выбора
        set b = 1
        
        loop
            set a[0] = a[0] + 1
            set a[ a[0] ] = 'h068'
            set b = b + 1
            exitwhen b == i
        endloop
    endif
  
    set i = GetRandomInt( 1, a[0] )
    call IssueBuildOrderById( u, a[i], x, y )

    /*call RemoveRect(r)
    set r = null
    call RemoveLocation(p) 
    set p = null
    call RemoveLocation(l) 
    set l = null
    call RemoveLocation(udg_LocalPoint)*/
    call DisplayTimedTextFromPlayer(Player(0),0,0,4, "Выхожу из Билда")
    //return ???
endfunction
я ничего не менял, просто точки на координаты перенёс и убрал бж функции, ну и закомментил то что мешало проверке либо не нужно было
2
14
2 года назад
2
Так, причина найдена
4 Башня
if LoadInteger( AiData, pi, 'h063' ) * 2 < LoadInteger( AiData, pi, 'h05Y' ) then
set i = 1 мошь выбора
set b = 1
Так как подобных вариантов много, пришел к выводу, что виновато умножение. Как и почему, сказать, к сожалению, не могу, но без него функция работает и доходит до конца.

UPD, ошибка оказалась банальная, теперь уже точно - цикл зацикливается, так как только тут единичка на и, а b перемахивает условие выхода. Вывод - внимательность наше все.
if LoadInteger(AiData,pi,'h063')*2 < LoadInteger(AiData,pi,'h05Y') then
set i = 1 мощь выбора
set b = 1
loop
set a[0]= a[0]+1
set a[ a[0] ] = 'h063'
set b=b+1
exitwhen b==i
endloop
endif
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.