Прошу прощения если написал не в тот раздел. Вопрос вот в чём, давненько создал карту... но никак не могу исправить вылеты. Т.е игра идёт нормально если играть скажем 2 на 2 или даже 3 на 3 но при игре 6 на 6 (с ботами) игра вроде не тормозит, но с примерно в 50% случаев заканчивается банальным вылетом без ошибок. Большая часть кода написана на jass (использую jngp). Я не силён в jass, поэтому может что-то не так в коде. Очень хотелось бы понять ошибку и исправить. Грешу на функцию (смысл её в том чтобы боты кастовали заклинания на ближайших вражеских героев в радиусе 1000 ед.) так как вылеты происходят во время боя между героями (как я замечал). Вот код функции которую использую с промежутком в 1 секунду.
function filtgAI takes nothing returns boolean
return IsUnitAliveBJ(GetFilterUnit())==true and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE)==false and GetUnitAbilityLevel(GetFilterUnit(),'Aloc')==0 and IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO)==true
endfunction

function NewAI2_system takes real distance returns nothing
local group g=CreateGroup()
local unit u=null
local unit AI=null
local real x = 0.
local real y = 0.
local real x2 = 0.
local real y2 = 0.
local integer A = 1
local integer B = 12
loop
 exitwhen A>B
  if IsUnitAliveBJ(udg_hero[A])==true and GetPlayerController(GetOwningPlayer(udg_hero[A]))==MAP_CONTROL_COMPUTER then
  set AI = udg_hero[A]
  set x = GetUnitX(AI)
  set y = GetUnitY(AI)
  call GroupEnumUnitsInRange(g,x,y,distance,Condition(function filtgAI))
  set u=FirstOfGroup(g)
  
    loop
     exitwhen u==null
      if IsUnitEnemy(u,GetOwningPlayer(AI)) == true and IsUnitAliveBJ(AI)==true and IsUnitVisible(u,GetOwningPlayer(AI)) then
        set x2 = GetUnitX(u)
        set y2 = GetUnitY(u)
        call IssueTargetOrder(AI,"thunderbolt",u)
        call IssueTargetOrder(AI,"creepthunderbolt",u)
        call IssueTargetOrder(AI,"banish",u)
        call IssueTargetOrder(AI,"frostnova",u)
        call IssueTargetOrder(AI,"sleep", u)
        call IssueTargetOrder(AI,"shadowstrike",u)
        call IssueTargetOrder(AI,"chainlightning",u)
        call IssueTargetOrder(AI,"drunkenhaze",u)
        call IssueTargetOrder(AI,"acidbomb",u)
        call IssueTargetOrder(AI,"soulburn",u)
        call IssueTargetOrder(AI,"hex",u)
        call IssueTargetOrder(AI,"manaburn",u)
        call IssueTargetOrder(AI,"slow",u)
        call IssueTargetOrder(AI,"cripple",u)
        call IssueTargetOrder(AI,"forkedlighting",u)
        call IssueTargetOrder(AI,"antimagicshell",u)
        call IssueTargetOrder(AI,"entanglingroots",u)
        call IssueTargetOrder(AI,"purge",u)
        call IssueTargetOrder(AI,"ensnare",u)
        // --------C указанием точки--------
        call IssuePointOrder(AI,"flamestrike",x2,y2)
        call IssuePointOrder(AI,"inferno",x2,y2)
        call IssuePointOrder(AI,"shockwave",x2,y2)
        call IssuePointOrder(AI,"clusterrockets",x2,y2)
        call IssuePointOrder(AI,"impale",x2,y2)
        call IssuePointOrder(AI,"rainoffire",x2,y2)
        call IssuePointOrder(AI,"blink",x2,y2)
        call IssuePointOrder(AI,"silence",x2,y2)
        call IssuePointOrder(AI,"breathoffire",x2,y2)
        call IssuePointOrder(AI,"stasistrap",x2,y2)
        call IssuePointOrder(AI,"blizzard",x2,y2)
        // --------Без цели--------
        call IssueImmediateOrder(AI,"waterelemental" )
        call IssueImmediateOrder(AI,"windwalk" )
        call IssueImmediateOrder(AI,"thunderclap" )
        call IssueImmediateOrder(AI,"creepthunderclap" )
        call IssueImmediateOrder(AI,"spiritwolf" )
        call IssueImmediateOrder(AI,"Locustswarm" )
        call IssueImmediateOrder(AI,"Summongrizzly" )
        call IssueImmediateOrder(AI,"stomp" )
        call IssueImmediateOrder(AI,"Serpentward" )
        call IssueImmediateOrder(AI,"metamorphosis" )
        call IssueImmediateOrder(AI,"whirlwind" )
        call IssueImmediateOrder(AI,"fanofknives" )
        call IssueImmediateOrder(AI,"immolation" )
        call IssueImmediateOrder(AI,"berserk" )
        call IssueImmediateOrder(AI,"roar" )
        call IssueImmediateOrder(AI,"manashield" )
        call IssueImmediateOrder(AI,"robogoblin" )
        call IssueImmediateOrder(AI,"battleroar" )
        call RemoveLocation(Location(x2,y2))
        set x2 = 0.
        set y2 = 0.
      call GroupRemoveUnit(g,u)
      set u=FirstOfGroup(g)
      else
      call GroupRemoveUnit(g,u)
      set u=FirstOfGroup(g)
      endif
    endloop
    
   endif
   set A = A +1
 endloop
call DestroyGroup(g)
set g=null
set u=null
set AI=null
set x = 0.0
set y = 0.0
set x2 = 0.0
set y2 = 0.0
set A = 0
set B = 0
endfunction
Может быть проблема в нём? Так-же выкладываю открытую карту. (если кому интересно посмотреть код детальнее)

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

низнаю какой спел у героя перезаряжается, на какой хватает маны, какие спелы у героя вообще есть, и в прочем на основе каких спелов они сделаны
да здравствует бд
FenikS1991:
Я знаю что это координаты умник.. пустые придирки не прокатят
я не только про координаты, я про всё
короче судя по всему ты пытаешься написать прогу которая бы думала вместо тебя
и это очень пичально
поэтому я просто оставлю это здесь
5
28
9 лет назад
5
быдлокод полный
call RemoveLocation(Location(x2,y2))
эта строчка похоже сделана для уничтожения здравого смысла
короче делай дебаг и кидай логи
0
2
9 лет назад
Отредактирован FenikS1991
0
короче делай дебаг и кидай логи
как в jass это вообще возможно.. я в jass не оч
Если ты про BJDebugMsg? то это же будет ужасно. там множество функций и тригерров. Я не же не на 100% уверен что ошибка именно тут. Или может ты как jass(ер) можешь подправить мою вышеуказанную функцию чтоб она она стабильно работала при вызове каждую секунду? был бы оч.благодарен
0
28
9 лет назад
0
FenikS1991, там не функция а полное дерьмо
любой кто хоть немного знает английский и у кого есть здравый смысл посоветует тебе удалить весь этот код нафиг
FenikS1991, также посмотри статьи на сайте(особенно про то как делать лог)
и скинь лог
и ты так и не объяснил зачем ты написал эту строчку
call RemoveLocation(Location(x2,y2))
0
2
9 лет назад
Отредактирован FenikS1991
0
nvc123:
FenikS1991, там не функция а полное дерьмо
любой кто хоть немного знает английский и у кого есть здравый смысл посоветует тебе удалить весь этот код нафиг
FenikS1991, также посмотри статьи на сайте(особенно про то как делать лог)
и скинь лог
и ты так и не объяснил зачем ты написал эту строчку
call RemoveLocation(Location(x2,y2))
чтобы удалять точку позиции юнита на которого кастуется заклинание.
мб я это сделал не так или вобще не нужно было. но вроде как без этого будет же утечка или не
Сейчас играл 3 партии по 40+ минут по сети 6 на 6. Вылетов, лагов небыло даже на слабом компе. Но вот в чём проблема вылетов небыло на карте которую я НЕ стал оптимизировать с помощью wc3 Map Optimizer. Может ли быть в этом проблема?
nvc123:
FenikS1991, там не функция а полное дерьмо
любой кто хоть немного знает английский и у кого есть здравый смысл посоветует тебе удалить весь этот код нафиг
Напомню в Jass я мало что знаю я изучал нормальный язык VB.net 2012 а этот "недо язык" я не понимаю. Если код говно, (в этом я тут не спорю, т.к не знаю) то может тогда напишешь нормальную функцию?
0
28
9 лет назад
0
FenikS1991, бэйсик нормальный?
ливаем посоны
FenikS1991, Location(x2,y2) создаёт точку
RemoveLocation удаляет точку
ты создал точку и тутже её удалил
логики 0
0
2
9 лет назад
Отредактирован FenikS1991
0
nvc123:
FenikS1991, бэйсик нормальный?
Ну если ты не вкурсе то 2012 в отличии от 5-6 нормальный. И прибегать к сишкам уже требуется очень редко.
nvc123:
ты создал точку и тутже её удалил
Ну вроде бы точка была создана, использована (для направления каста) и только затем удалена. На сколько я понимаю, если бы я точку удалил так:
set x2 = GetUnitX(u)
set y2 = GetUnitY(u)
call RemoveLocation(Location(x2,y2))
то юнит AI не получил бы приказ кастовать по точке x2,y2. А если бы получил то значит точка вовсе не была удалена. Или тут я ошибаюсь?
0
28
9 лет назад
Отредактирован nvc123
0
FenikS1991, нет
точка создаётся при вызове метода
вызовешь 100 раз метод - получишь 100 точек
и насколько я помню хэширование точек нигде не юзается
так что это не проблема языка а твоя
FenikS1991, имхо c++ тоже не особо нормальный
FenikS1991, он кастует не по точке x2 y2 а по координатам x2 y2
ты вообще хоть немного понимаешь программирование? (твои ошибки никак не привязаны к языку, так что отговорка "незнаюjass" не прокатит)
0
2
9 лет назад
0
nvc123:
FenikS1991, нет
точка создаётся при вызове метода
вызовешь 100 раз метод - получишь 100 точек
и насколько я помню хэширование точек нигде не юзается
так что это не проблема языка а твоя
FenikS1991, имхо c++ тоже не особо нормальный
Хорошо, спорить не буду, не проверял. Тогда посоветуй, как правильно? Приведи рабочий пример без утечек и багов
0
28
9 лет назад
0
FenikS1991, ну во первых ты отдаёшь юниту целую кучу приказов
FenikS1991, и там нету утечки вроде
0
2
9 лет назад
Отредактирован FenikS1991
0
nvc123:
FenikS1991, ну во первых ты отдаёшь юниту целую кучу приказов
FenikS1991, и там нету утечки вроде
Как тогда иначе узнать какие спелы имеет герой и приказать кастовать поочерёдно? До этого я так и недодумался, написал так, проверил, работает. (на этом и остановился)
Утечки мб и нету. но вылеты во время боя, а во время боя часто только эта функция срабатывает. Хотя повторюсь что без оптимизации вылетов не заметил. (хотя мб, просто повезло)
0
30
9 лет назад
0
FenikS1991, имхо c++ тоже не особо нормальный
Такс-такс-такс, что тут у нас, магистр руби, питона и эрланга! Ну поучите же нас!

FenikS1991, зачем ты кастуешь сразу ВСЕ спелы?
0
2
9 лет назад
Отредактирован FenikS1991
0
FenikS1991, имхо c++ тоже не особо нормальный
На вкус и цвет товарища нет. А что по поводу "Все спелы" так это потому что я низнаю какой спел у героя перезаряжается, на какой хватает маны, какие спелы у героя вообще есть, и в прочем на основе каких спелов они сделаны
Господи уже голова не варит.
nvc123:
FenikS1991, нет
точка создаётся при вызове метода
вызовешь 100 раз метод - получишь 100 точек
и насколько я помню хэширование точек нигде не юзается
так что это не проблема языка а твоя
FenikS1991, имхо c++ тоже не особо нормальный
FenikS1991, он кастует не по точке x2 y2 а по координатам x2 y2
ты вообще хоть немного понимаешь программирование? (твои ошибки никак не привязаны к языку, так что отговорка "незнаюjass" не прокатит)
Я знаю что это координаты умник.. пустые придирки не прокатят
0
28
9 лет назад
0
низнаю какой спел у героя перезаряжается, на какой хватает маны, какие спелы у героя вообще есть, и в прочем на основе каких спелов они сделаны
да здравствует бд
FenikS1991:
Я знаю что это координаты умник.. пустые придирки не прокатят
я не только про координаты, я про всё
короче судя по всему ты пытаешься написать прогу которая бы думала вместо тебя
и это очень пичально
поэтому я просто оставлю это здесь
Принятый ответ
0
2
9 лет назад
0
Ну вообщем больше помощь не требуется. решение по поиску ошибки нашёл сам (и безо всяких логов кстати) Осталось ждать вылета. Всем спасибо.
0
27
9 лет назад
0
отладочные сообщения добавьте и попробуйте еще раз.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.