Прошу прощения если написал не в тот раздел. Вопрос вот в чём, давненько создал карту... но никак не могу исправить вылеты. Т.е игра идёт нормально если играть скажем 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:
FenikS1991:
Я знаю что это координаты умник.. пустые придирки не прокатят
я не только про координаты, я про всё
короче судя по всему ты пытаешься написать прогу которая бы думала вместо тебя
и это очень пичально
поэтому я просто оставлю это здесь
короче судя по всему ты пытаешься написать прогу которая бы думала вместо тебя
и это очень пичально
поэтому я просто оставлю это здесь
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
короче делай дебаг и кидай логи
Отредактирован FenikS1991
Если ты про BJDebugMsg? то это же будет ужасно. там множество функций и тригерров. Я не же не на 100% уверен что ошибка именно тут. Или может ты как jass(ер) можешь подправить мою вышеуказанную функцию чтоб она она стабильно работала при вызове каждую секунду? был бы оч.благодарен
любой кто хоть немного знает английский и у кого есть здравый смысл посоветует тебе удалить весь этот код нафиг
FenikS1991, также посмотри статьи на сайте(особенно про то как делать лог)
и скинь лог
и ты так и не объяснил зачем ты написал эту строчку
Отредактирован FenikS1991
мб я это сделал не так или вобще не нужно было. но вроде как без этого будет же утечка или не
nvc123:
ливаем посоны
FenikS1991, Location(x2,y2) создаёт точку
RemoveLocation удаляет точку
ты создал точку и тутже её удалил
логики 0
Отредактирован FenikS1991
nvc123:
set y2 = GetUnitY(u)
call RemoveLocation(Location(x2,y2))
Отредактирован nvc123
точка создаётся при вызове метода
вызовешь 100 раз метод - получишь 100 точек
и насколько я помню хэширование точек нигде не юзается
так что это не проблема языка а твоя
FenikS1991, имхо c++ тоже не особо нормальный
FenikS1991, он кастует не по точке x2 y2 а по координатам x2 y2
ты вообще хоть немного понимаешь программирование? (твои ошибки никак не привязаны к языку, так что отговорка "незнаюjass" не прокатит)
FenikS1991, и там нету утечки вроде
Отредактирован FenikS1991
Отредактирован FenikS1991
Господи уже голова не варит.
nvc123: Я знаю что это координаты умник.. пустые придирки не прокатят
FenikS1991:
короче судя по всему ты пытаешься написать прогу которая бы думала вместо тебя
и это очень пичально
поэтому я просто оставлю это здесь