И он вообще создается? Это просто первая попытка создать даммика в координатах
Увидеть нельзя - даммик не имеет модели
Самое смешное, что по сути оказалось, что сетка и не очень нужна - все равно юнит прыгнет, куда нужно, сойти с пути не сможет. Так что код уже действует, и не хочу уже снова лезть в этот спелл (там еще балансить пришлось, маета), но хочу просто узнать, почему даммик не кидает сетку и создается ли он вообще
Сетка кидать на союзников настроена, уже кидалась такая с другим равкодом в другом коде на союзника, только там даммик не в координатах создавался
Равкоды даммика и сетки правильные
function RoboJump2 takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
local timer t = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t),2)
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local integer i = LoadInteger(udg_Hash,GetHandleId(t),3)
local real x = LoadReal(udg_Hash,GetHandleId(t),6)
local real y = LoadReal(udg_Hash,GetHandleId(t),7)
local real x2 = LoadReal(udg_Hash,GetHandleId(t),8)
local real y2 = LoadReal(udg_Hash,GetHandleId(t),9)
local real x3 = 0
local real y3 = 0
local real dx = 0
local real dy = 0
set i = i+1
call SaveInteger(udg_Hash,GetHandleId(t),3,i)
ПЕРЕМЕЩЕНИЕ ВВЕРХ-ВНИЗ
if (i>0) and (i<26) then
call SetUnitFlyHeightBJ( u5, ( GetUnitFlyHeight(u5) + 10.00 ), 10000.00 )
else
call SetUnitFlyHeightBJ( u5, ( GetUnitFlyHeight(u5) - 10.00 ), 10000.00 )
endif
ПЕРЕМЕЩЕНИЕ ВВЕРХ-ВНИЗ - ЗАКРЫТО.
ОБСЧЁТ И ПОСТЕПЕННОЕ ДВИЖЕНИЕ (ДИСТАНЦИЮ ДЕЛИЛИ НА 50, Т. К. БУДЕТ 50 СДВИГОВ, ВСЕ ПРАВИЛЬНО, ТАМ СДВИЖЕНИЕ БЫЛО, ТУТ ТОЧКА ПРИКАЗА)
set dx = ((x2 - x) / 50) * I2R(i)
set dy = ((y2 - y) / 50) * I2R(i)
set x3 = x + dx
set y3 = y + dy
Задание координат с проверкой на края карты.
if RectContainsCoords(bj_mapInitialPlayableArea,x3,y3) then
call SetUnitX (u5,x3)
call SetUnitY (u5,y3)
endif
Задание координат c проверкой на края карты - закрыто.
ОБСЧЁТ И ПОСТЕПЕННОЕ ДВИЖЕНИЕ - ЗАКРЫТО.
if (i>49) then
УДАЛЕНИЕ СПЕЛЛБУКОВ
call UnitRemoveAbilityBJ( 'A304', u5 )
call UnitRemoveAbilityBJ( 'A305', u5 )
УДАЛЕНИЕ СПЕЛЛБУКОВ - ЗАКРЫТО.
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
endif
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
set t = null
set u5 = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
function RoboJump takes nothing returns nothing
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
local timer t = CreateTimer()
local unit u5 = GetTriggerUnit()
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
local real x = GetUnitX(u5)
local real y = GetUnitY(u5)
local real x2 = GetOrderPointX()
local real y2 = GetOrderPointY()
local real dx = x - x2
local real dy = y - y2
local real distance = SquareRoot(dx * dx + dy * dy)
local real maxdistance = 300 + 100 * (GetUnitAbilityLevelSwapped('A29V', u5))
local integer i = 0
if (distance <= maxdistance) and (GetUnitAbilityLevelSwapped('A304', u5) == 0) and RectContainsCoords(bj_mapInitialPlayableArea,x,y) then
call IssueImmediateOrderBJ( u5, "holdposition" )
СОЗДАЕМ ДАММИКА В КООРДИНАТАХ И КИДАЕМ АБИЛУ
call CreateUnit(GetOwningPlayer(u5),'n021',x,y, bj_UNIT_FACING)
call UnitApplyTimedLifeBJ( 2.00, 'BTLF', GetLastCreatedUnit() )
call UnitAddAbilityBJ( 'A303', GetLastCreatedUnit() )
call IssueTargetOrderBJ( GetLastCreatedUnit(), "ensnare", u5 )
СОЗДАЕМ ДАММИКА В КООРДИНАТАХ И КИДАЕМ АБИЛУ - ЗАКРЫТО.
ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ
call UnitAddAbility(u5,'A304')
call SetPlayerAbilityAvailableBJ( false, 'A304', GetOwningPlayer(u5) )
call UnitMakeAbilityPermanent(u5,true,'A304')
call UnitMakeAbilityPermanent(u5,true,'A305')
ДОБАВКА И ДИЗЕЙБЛ СПЕЛЛБУКОВ - ЗАКРЫТО.
call SaveUnitHandle(udg_Hash,GetHandleId(t),2,u5)
call SaveInteger(udg_Hash,GetHandleId(t),3,i)
call SaveReal(udg_Hash,GetHandleId(t),4,distance)
call SaveReal(udg_Hash,GetHandleId(t),6,x)
call SaveReal(udg_Hash,GetHandleId(t),7,y)
call SaveReal(udg_Hash,GetHandleId(t),8,x2)
call SaveReal(udg_Hash,GetHandleId(t),9,y2)
call TimerStart(t,0.04,true,function RoboJump2)
else
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
endif
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5
set u5 = null
set t = null
ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction

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

ClotPh, потому что рак мозга...
call CreateUnit(GetOwningPlayer(u5),'n021',x,y, bj_UNIT_FACING)
call UnitApplyTimedLifeBJ( 2.00, 'BTLF', GetLastCreatedUnit() )
call UnitAddAbilityBJ( 'A303', GetLastCreatedUnit() )
call IssueTargetOrderBJ( GetLastCreatedUnit(), "ensnare", u5 )
Вот это равносильно, взять продукты выспать на землю после покупки в магазине и принести домой пустой пакет, пытатся найти продукты в пакете...
set bj_lastCreatedUnit =  CreateUnit(GetOwningPlayer(u5),'n021',x,y, bj_UNIT_FACING)
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
call UnitAddAbility( bj_lastCreatedUnit, 'A303' )\
call UnitShareVision( u, GetOwningPlayer(bj_lastCreatedUnit), true )
if  not IssueTargetOrder(bj_lastCreatedUnit, "ensnare", u5 )  then
call BJDebugMsg("Ошибка - юнит не может применить ensnare")
endif
call UnitShareVision( u, GetOwningPlayer(bj_lastCreatedUnit), false )
Всегда давай вижен дамми юниту или создавай за игрока который гарантированно будет видеть цель, у цели может быть инвиз, цель может быть в тумане войны (только что созданный юнит, если его корды не равны корды цели увидит цель лиш спустя 0.4 сек.)
Проверяй может ли дамми выполнить приказ, могут быть ошибки в настройки способности, в фильтре допустимых для спелла целей...
Вот пример того как я создаю дамми юнита для каста некой абилки:
   set TempAX = GetUnitX( st.attacked )
    set TempAY = GetUnitY( st.attacked )
    
    set bj_lastCreatedUnit = CreateUnit( st.pl, 'hdum', TempAX, TempAY, GetUnitFacing( st.attacked ) )
    call SetUnitPathing( bj_lastCreatedUnit, false )
    call SetUnitX( bj_lastCreatedUnit, TempAX )
    call SetUnitY( bj_lastCreatedUnit, TempAY )
    call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 1.50 )
    call UnitAddAbility( bj_lastCreatedUnit, 'A051' )
    
    if not IssueTargetOrderById( bj_lastCreatedUnit, 852132, st.attacked ) then
        call BJDebugMsg( DEBUG + I2Sx( 'A05M', 3 ) )
        call BJDebugMsg( INFO )
        call TriggerExecute( st.trg )
    endif

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
21
7 лет назад
0
Извиняюсь, почему-то не могу загнать код под кат, если не трудно, отфиксите.
9
32
7 лет назад
Отредактирован quq_CCCP
9
ClotPh, потому что рак мозга...
call CreateUnit(GetOwningPlayer(u5),'n021',x,y, bj_UNIT_FACING)
call UnitApplyTimedLifeBJ( 2.00, 'BTLF', GetLastCreatedUnit() )
call UnitAddAbilityBJ( 'A303', GetLastCreatedUnit() )
call IssueTargetOrderBJ( GetLastCreatedUnit(), "ensnare", u5 )
Вот это равносильно, взять продукты выспать на землю после покупки в магазине и принести домой пустой пакет, пытатся найти продукты в пакете...
set bj_lastCreatedUnit =  CreateUnit(GetOwningPlayer(u5),'n021',x,y, bj_UNIT_FACING)
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
call UnitAddAbility( bj_lastCreatedUnit, 'A303' )\
call UnitShareVision( u, GetOwningPlayer(bj_lastCreatedUnit), true )
if  not IssueTargetOrder(bj_lastCreatedUnit, "ensnare", u5 )  then
call BJDebugMsg("Ошибка - юнит не может применить ensnare")
endif
call UnitShareVision( u, GetOwningPlayer(bj_lastCreatedUnit), false )
Всегда давай вижен дамми юниту или создавай за игрока который гарантированно будет видеть цель, у цели может быть инвиз, цель может быть в тумане войны (только что созданный юнит, если его корды не равны корды цели увидит цель лиш спустя 0.4 сек.)
Проверяй может ли дамми выполнить приказ, могут быть ошибки в настройки способности, в фильтре допустимых для спелла целей...
Вот пример того как я создаю дамми юнита для каста некой абилки:
   set TempAX = GetUnitX( st.attacked )
    set TempAY = GetUnitY( st.attacked )
    
    set bj_lastCreatedUnit = CreateUnit( st.pl, 'hdum', TempAX, TempAY, GetUnitFacing( st.attacked ) )
    call SetUnitPathing( bj_lastCreatedUnit, false )
    call SetUnitX( bj_lastCreatedUnit, TempAX )
    call SetUnitY( bj_lastCreatedUnit, TempAY )
    call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 1.50 )
    call UnitAddAbility( bj_lastCreatedUnit, 'A051' )
    
    if not IssueTargetOrderById( bj_lastCreatedUnit, 852132, st.attacked ) then
        call BJDebugMsg( DEBUG + I2Sx( 'A05M', 3 ) )
        call BJDebugMsg( INFO )
        call TriggerExecute( st.trg )
    endif
Принятый ответ
2
21
7 лет назад
2
Понятно, то есть созданного через CreateUnit функция GetLastCreatedUnit() не видит
и т. е. это вообще там баг, ласткриэйтед может быть другой совсем не даммик даже и получить таймер
ну ладно, ща просто этот блок кода с сеткой потру, т. к. см. выше - сетка не оч нужна, на будущее спс, тут будет образец
насчет вижна и прочего проблем не должно быть, даммик-то от того же игрока и это вообще весь блок кода скопирован из другого своего же места, только заменен равкод дамми-сетки (но он правильный, проверялось) и вместо создания юнита в точке первый раз попробовались координаты
6
7
7 лет назад
Отредактирован Ige
6
ClotPh, GetLastCreatedUnit - это не native-функция, а BJ
function GetLastCreatedUnit takes nothing returns unit
    return bj_lastCreatedUnit
endfunction
bj_lastCreatedUnit - это глобалка, а значение, на которое она ссылается, указывается вручную. Например, как в BJ-функции
function CreateUnitAtLocSaveLast takes player id, integer unitid, location loc, real face returns unit
    if (unitid == 'ugol') then
        set bj_lastCreatedUnit = CreateBlightedGoldmine(id, GetLocationX(loc), GetLocationY(loc), face)
    else
        set bj_lastCreatedUnit = CreateUnitAtLoc(id, unitid, loc, face)
    endif

    return bj_lastCreatedUnit
endfunction

function CreateNUnitsAtLoc takes integer count, integer unitId, player whichPlayer, location loc, real face returns group
    call GroupClear(bj_lastCreatedGroup)
    loop
        set count = count - 1
        exitwhen count < 0
        call CreateUnitAtLocSaveLast(whichPlayer, unitId, loc, face)
        call GroupAddUnit(bj_lastCreatedGroup, bj_lastCreatedUnit)
    endloop
    return bj_lastCreatedGroup
endfunction
0
21
7 лет назад
0
Ige, так вот эта функция раньше и использовалась. В этом всё и дело. Вообще и в мыслях не было, что "последний созданный юнит может не быть последним созданным".
Всё понятно.
0
18
7 лет назад
Отредактирован Maniac_91
0
Хм. А как тогда отлавливать юнита, созданного по координатам?
Может, сразу записывать в переменную, вроде "set U = CreateUnit(1,'hfoo',x,y, bj_UNIT_FACING)"?
0
21
7 лет назад
0
Maniac_91, ну можно и так, а вообще рысь вон же уже написала, как отлавливать
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.