Добавлен
приветствую, написал простенький ии на джасс, работает хорошо до грейда до т2. После апгрейда т2 раб идет строить ещё один т1, хотя по скрипту должен построить т2 здания, т2 грейды и переходить на т3. После постройки ошибочного т1 строить перестает, в чем ошибка?
Открыть
globals
player user = PlayerEx(1)
constant integer warlock = 'nw2w'
constant integer grunt = 'ogru'
constant integer raider = 'orai'
constant integer hero = 'O000'
constant integer peon = 'o008'
constant integer forge = 'o00F'
constant integer great_hall = 'o00A'
constant integer stronghold = 'o00B'
constant integer fortress = 'o009'
constant integer barrack = 'o00H'
constant integer bestiary = 'o00C'
constant integer altar_dark = 'o007'
constant integer altar = 'o00G'
constant integer burrow = 'o00E'
constant integer watch_tower = 'o00D'
constant integer upg_melee = 'Rome'
constant integer upg_armor = 'Roar'
constant integer upg_spikes = 'Rosp'
constant integer upg_burrow = 'Rorb'
vars
integer c_great_hall = 0
integer c_stronghold = 0
integer c_fortress = 0
integer c_altar = 0
integer c_burrow = 0
integer c_guard = 0
integer c_altar_dark = 0
integer c_forge = 0
integer c_great_hall_done = 0
integer c_stronghold_done = 0
integer c_fortress_done = 0
integer c_altar_done = 0
integer c_burrow_done = 0
integer c_guard_done = 0
integer c_altar_dark_done = 0
integer c_forge_done = 0
integer c_raider = 0
integer c_grunt = 0
integer c_warlock = 0
integer c_hero = 0
integer c_raider_done = 0
integer c_grunt_done = 0
integer c_warlock_done = 0
integer c_hero_done = 0
integer c_food_used = 0
integer c_food_made = 0
endglobals
--------------------------------------------------------------------------------------------------
init_vars
--------------------------------------------------------------------------------------------------
function init_vars takes nothing returns nothing
set building towncount
set c_great_hall = TownCount(great_hall)
set c_stronghold = TownCount(stronghold)
set c_fortress = TownCount(fortress)
set c_altar = TownCount(altar)
set c_burrow = GetUnitCount(burrow)
set c_guard = TownCount(watch_tower)
set c_altar_dark = TownCount(altar_dark)
set bulding done virable
set c_great_hall_done = TownCountDone(great_hall)
set c_stronghold_done = TownCountDone(stronghold)
set c_fortress_done = TownCountDone(fortress)
set c_altar_done = TownCountDone(altar)
set c_burrow_done = GetUnitCountDone(burrow)
set c_forge_done = GetUnitCountDone(forge)
set c_altar_dark_done = GetUnitCountDone(altar_dark)
set units getunitcount
set c_raider = GetUnitCount(raider)
set c_grunt = GetUnitCount(grunt)
set c_warlock = GetUnitCount(warlock)
set c_hero = GetUnitCount(hero)
set units getunitcountDone
set c_raider_done = GetUnitCountDone(raider)
set c_grunt_done = GetUnitCountDone(grunt)
set c_warlock_done = GetUnitCountDone(warlock)
set c_hero_done = GetUnitCountDone(hero)
other
set c_food_used = FoodUsed()
set c_food_made = c_great_hall * GetFoodMade(great_hall) + c_burrow * GetFoodMade(burrow)
********************************************************
**********STOP UNIT VARS
********************************************************
endfunction
********************************************************
*********************SET VARS FUNCTION******************
********************************************************
function set_vars takes nothing returns nothing
loop
call init_vars()
call Sleep(1)
endloop
endfunction
********************************************************
*************************MAIN FUNCTION******************
********************************************************
function main takes nothing returns nothing

call CampaignAI(burrow,null)
call SetReplacements(1,1,1)
call StartThread(function set_vars)
call SetPeonsRepair(true)
call Sleep( 0.1 )

build base
call SetBuildUnit(1, peon)

if c_great_hall_done + c_stronghold_done + c_fortress_done < 1 then
call SetBuildUnit( 1, great_hall )
endif

call SetBuildUnit( 6, peon )
call SetBuildUnit( 1, altar )
call SetBuildUnit( 1, burrow )
call SetBuildUnit( 1, barrack )
call SetBuildUnit( 2, burrow )
call SetBuildUnit( 1, forge )

call CampaignDefenderEx( 2,2,3, grunt )
call CampaignDefenderEx( 1,1,1, hero )

call SetBuildUpgr( 1, upg_melee )
call SetBuildUpgr( 1, upg_armor )
call SetBuildUpgr( 1, upg_spikes )
call SetBuildUnit( 5, burrow )

if c_stronghold_done + c_fortress_done < 1 then
call SetBuildUnit( 1, stronghold )
endif

call SetBuildUpgr( 2, upg_spikes )
call SetBuildUpgr( 2, upg_armor )
call SetBuildUnit( 7, burrow )
call SetBuildUpgr( 2, upg_melee )
call SetBuildUpgr( 1, upg_burrow )
call SetBuildUnit( 1, altar_dark )
call SetBuildUnit( 1, bestiary )

call CampaignDefenderEx( 2,2,3, grunt )
call CampaignDefenderEx( 2,2,3, warlock )
call CampaignDefenderEx( 2,2,3, raider )

endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
Steal nerves:
Art35372, Brutal_bbk, извините, просто информации мало. Откуда можно знать в чем проблема, если не показываете карты, пускай кто-нибудь другой здешний посмотрит и проверит карту. Мб это у вас что-то. Либо скрины триггеров, или код, но лучше карту.
конкретно у парня выше обычный редактор, а пытается запустить карты с cJass. я ему пытался объяснить, видимо не дошло
ответ
Ваша ошибка
call TimerStart( LocTimer1, .01, true, function Timer_for_ability ) //Вы запускаете таймер
call DestroyTimer( LocTimer1 ) //И тутже его уничтожаете, т.е. останавливаете
Используйте DestroyTimer когда он вам больше не будет нужен, т.е. когда он истёк, и действия совершились (Тогда же и чистите ХТ)
Также не оч понимаю для чего эта строка:
call SaveBoolean( GameHashTable, GetHandleId( GetTriggerUnit( ) ), StringHash( "Timer_for_ability" ), true )
Но в целом этот кусок кода должен работать
Сек, сделаю пример на коленке
ответ
native IsTerrainPathable takes real x, real y, pathingtype t returns boolean
Это именно оно, но нужно проверять не текущую точку где уже юнит есть, а где она будет при следующем тике таймера, иначе юнит застрянет в текстуре и закончит движение в итоге ни туда ни сюда
ответ
Мы не знаем что такое бабл, возможно какая-то способность.
В общем есть способности на регенерацию, примеры способностей находятся в предметах, например в камне жизни или кольцах на реген, берешь за основу эту способность и делаешь своё +20 регена. Когда время прошло - удаляешь способность. Манипулировать регеном напрямую можно только в мемхаке, на рефордже нет. Если универсально, то нужна громозкая система кастомного лечения и регенерации, чтобы отказаться от регена варкрафта вообще, но это не для новичков
ответ
Попробуй эти файлы позапускать

Этот комментарий удален
1
пока остановился на полной проверке редактора объектов, видимо что-то напутал
1
полностью переработал расу в редакторе, вопрос остался открытым. Возможно после грейда на условный т2, ии думает что здания нет и строит т1.
27
Не в курсе как должен работать AI скрипт в варкрафте, но по идее main вызывается только один раз при инициализации.
if c_great_hall_done + c_stronghold_done + c_fortress_done < 1 then
call SetBuildUnit( 1, great_hall )
endif
// ...
if c_stronghold_done + c_fortress_done < 1 then
call SetBuildUnit( 1, stronghold )
endif
И я сомневаюсь, что эти проверки, впихнутые прямо туда, оказывают какое-то влияние на очередь строительства
13
Makeba, в ИИ скриптах не работают многие функции которые можно запихнуть в главный код, так же и в главном коде не работают некоторые функции которые работают в ИИ скриптах. Так что не сравнивай их. Эта два отдельных острова. Где свои законы.
27
Vampir_kolik, всё ещё сомневаюсь, что функция с названием main может вызываться игрой чаще одного раза
13
Makeba, да так оно и есть скрипт human.ai имеет тоже функцию main, которая вызывается первая для этого скрипта. А main в карте должен содержать инициализацию ai скриптов не помню точную функцию. Помню что AI в конце. Вроде бы, вот эта функция MeleeStartingAI.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.