Добавлен FenikS1991
Всем привет знаю что это "говнокод" но всё же я в jass неопытен и поэтому прошу помощи так как сам уже устал биться. Вообщем сделал карту, добавил ботов и нижеприведённый код заставляет ботов кастовать заклинания на вражеских героев, примерно в 50% случаев игра вылетает без всяких ошибок и прочего, судя по логу из war3dbg.log ошибка в ниже приведённой функции.
Собственно вот часть лога:
000AFEAB UNIT_TYPE_HERO
000AFEAC IsUnitType
000AFEAD g
000AFEAE FirstOfGroup
000AFEAF u
000AFEB0 AI
000AFEB1 GetOwningPlayer
000AFEB2 IsUnitEnemy
000AFEB3 AI
000AFEB4 IsUnitAliveBJ
000AFEB5 whichUnit
000AFEB6 IsUnitDeadBJ
000AFEB7 whichUnit
000AFEB8 UNIT_STATE_LIFE
000AFEB9 GetUnitState
000AFEBA u
000AFEBB AI
000AFEBC GetOwningPlayer
000AFEBD IsUnitVisible
000AFEBE u
000AFEBF GetUnitX
000AFEC0 u
000AFEC1 GetUnitY
000AFEC2 AI
000AFEC3 u
000AFEC4 IssueTargetOrder
А вот сама функция:
function filtgAI takes nothing returns boolean
return GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0 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 GetUnitState(udg_hero[A], UNIT_STATE_LIFE) > 0 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 GetUnitState(AI, UNIT_STATE_LIFE) > 0 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.
set y = 0.
set x2 = 0.
set y2 = 0.
set A = 0
set B = 0
endfunction
Извиняюсь если написал не в тот раздел. Прошу помощи в поиске ошибке и её устранения.
Принятый ответ
FenikS1991, убери стоимость в 15 маны.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Начни с пустого цикла по группе юнитов без приказов, выводи имя юнита на экран. Поймешь где проблема.
set u=FirstOfGroup(g)
если да то сам сможешь ответить на свой вопрос
зачем эта строка
Doc, и судя по тому что у него 2 вложенных цикла + простыня кода там может наступать лимит потока
+ лог какой то левый
имхо то что фатал вызван следующим кодом это бред
Doc:
nvc123:
VB.NET.)) Самому смешно.
nvc123:
Строчки разкоментировал и продолжил тестить. Теперь при вылетах лог обрывается всё чаще и чаще на строчках curCol и numCols. А эти строчки - переменные, функции MultiboardSetItemValueBJ()
Тут я начал грешить на свой мультиборд. Но пока ни к чему не пришёл, да и кто знает, может программа которая пишет лог сама как то некорректно работает. А может быть ошибка не одна а парочка.
Вообщем улыбнулась мне удача и как раз перед вылетом я случайно сохранил игру. Потом много раз загружал игру и тестил, искал причину.
Вообщем имеется босс (нейтрально враждебный, его способности баш, мана выжигалка пассивная, и криты.)
Вылет происходил во время битвы с боссом одного из ботов (точнее одно из типов героев,ботов), отправлял их по одному к нему и все норм а именно этот даёт вылет.
босс бьёт по герою и за несколько ударов выжигает ему всю ману, критует и станит. Как только у героя заканчивается мана игра вылетает, с другими всё нормально видимо потому что они не собирают прелмет пополняющий ману, а этот герой собирает этот предмет.
вот вам типичный пример "
Создал тестовую карту на неё поместил 2 стандартных героя. дал им абилку выжигающюю ману "Магический огонь" (выжигает всю ману сразу.) создал 1 предмет (пополняющий ману за 15 маны) дал предмет герою врага. Обсолютно никаких тригерров нет.
Отредактирован Sozidar
и ещё 1 вопросик. ещё один глюк нашёлся странный. имеется герой, для него есть улучшение, каждый уровень улучшения добавляет 5 маны 5 hp и 3 атаки для героев. 100 уровней улучшений. Для всех героев работает нормально. Для одного героя вот такая проблема:
PS это уже третий необъяснимый глюк найденный в Warcraft (
В принципе фиг с этим, снизил улучшения до 30 уровней и всё норм. тему можно закрывать все спасибо за помощь.