Всем здравствуйте, у меня проблема , у меня есть башня с способностю цепная молния , вот сделал его автоматическим с помощью триггеров , когда враги идут этот башня наносит с расстояния атаки башни , радиус способности 1000 а моя башня атакует с дальностю 500 , как сделать чтобы способность применялся с расстояния 1000?

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

Super cool, Jass это встроенный язык программирования варкрафта, т.е код что на GUI - пользовательский интерфейс, только в виде кода. GUI ограничен, на нем могут вылезти утечки. Из-за чего могут быть лаги в картах.
подробнее про Jass Тут
Ну и конечно нужен JNGP, если на 1.26 патче или рефорджет. Скачать можно тут
Создаем триггер и конвертируем его в текст. Затем копируем и вставляем код.
Конвертируем в текст
udg_Tower - твоя башня, триггер рассчитан на 1 башню если нужно на несколько, используй другой код и заноси каждую башню в группу
Тогда нужно создать группу для башен, т.е GroupTowers.
Создаем GUI переменную
Код для 1 башни
scope LightningAutoCast

globals
   private unit filterUnit //Юнит для перебора
   private group GroupEnumG = CreateGroup() //Группа для перебора юнитов
   //udg_Tower = Башня
endglobals

native UnitAlive takes unit id returns boolean //Нативка на жив ли юнит

function DistanceBetweenXY takes real x1, real y1, real x2, real y2 returns real //Дистанция между координатами
   return SquareRoot((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 
endfunction

function AOE_Lightning_Filter takes nothing returns boolean //Фильтр функция
        local real x = GetUnitX(udg_Tower) //Координата Х башни
        local real y = GetUnitY(udg_Tower) //Координата Y башни
        local real x1
        local real y1
        
        set filterUnit = GetFilterUnit()
        
        set x1 = GetUnitX(filterUnit) //Координата X фильтр юнита
        set y1 = GetUnitY(filterUnit) //Координата Y фильтр юнита
        
        return IsUnitEnemy(filterUnit, GetOwningPlayer(udg_Tower)) and filterUnit != udg_Tower and not IsUnitType(filterUnit, UNIT_TYPE_STRUCTURE) and DistanceBetweenXY( x, y, x1, y1) > 500
        //Условия: Юнит враг Игроку Башни и Юнит не равен самой Башни и Юнит не является зданием и Дистанция между координатами юнита и башни > 500
endfunction

function AOE_Lightning_Actions takes nothing returns nothing
        local real radius = 1000 // Радиус
        local real x = GetUnitX(udg_Tower) //Координата Х башни
        local real y = GetUnitY(udg_Tower) //Координата Y башни
        local unit uf // Юнит для перебора в цикле
        
        call GroupEnumUnitsInRange(GroupEnumG, x, y, radius, function AOE_Lightning_Filter) // Пикаем юнитов в радиусе от координат башни и перебираем в функции фильтре
        loop
            set uf = FirstOfGroup(GroupEnumG) // GroupPickRandomUnit(GroupEnumG) -- Если нужен случайный юнит в радиусе, удаляем FirstOfGroup(GroupEnumG) и ставим эту функцию
            exitwhen uf == null
            if UnitAlive(uf) then 
                call IssueTargetOrder(udg_Tower, "chainlightning", uf) //Кастуем молнию на юнита
            endif
            call GroupRemoveUnit( GroupEnumG, uf) //Удаляем юнита из группы
            set uf = null //Обнуляем переменную
        endloop
        call GroupClear(GroupEnumG) //Очищаем группу
        
endfunction

function InitTrig_LightningAutoCast takes nothing returns nothing
call TimerStart( CreateTimer(), 0.03, true, function AOE_Lightning_Actions) //Создаем периодический таймер
endfunction

endscope
Код для несколько башень
scope LightningAutoCastGroup

globals
   private unit filterUnit //Юнит для перебора
   private group GroupEnumG = CreateGroup() //Группа для перебора юнитов
   //udg_Tower = Башня
endglobals

native UnitAlive takes unit id returns boolean //Нативка на жив ли юнит

function DistanceBetweenXY takes real x1, real y1, real x2, real y2 returns real //Дистанция между координатами
   return SquareRoot((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 
endfunction

function AOE_Lightning_Filter takes nothing returns boolean //Фильтр функция
        local real x = GetUnitX(GetEnumUnit()) //Координата Х башни
        local real y = GetUnitY(GetEnumUnit()) //Координата Y башни
        local real x1
        local real y1
        
        set filterUnit = GetFilterUnit()
        
        set x1 = GetUnitX(filterUnit) //Координата X фильтр юнита
        set y1 = GetUnitY(filterUnit) //Координата Y фильтр юнита
        
        return IsUnitEnemy(filterUnit, GetOwningPlayer(GetEnumUnit())) and filterUnit != GetEnumUnit() and not IsUnitType(filterUnit, UNIT_TYPE_STRUCTURE) and DistanceBetweenXY( x, y, x1, y1) > 500
        //Условия: Юнит враг Игроку Башни и Юнит не равен самой Башни и Юнит не является зданием и Дистанция между координатами юнита и башни > 500
endfunction

function AOE_Lightning_Actions takes nothing returns nothing
        local real radius = 1000 // Радиус
        local real x = GetUnitX(GetEnumUnit()) //Координата Х башни
        local real y = GetUnitY(GetEnumUnit()) //Координата Y башни
        local unit uf // Юнит для перебора в цикле
        
        call GroupEnumUnitsInRange(GroupEnumG, x, y, radius, function AOE_Lightning_Filter) // Пикаем юнитов в радиусе от координат башни и перебираем в функции фильтре
        loop
            set uf = GroupPickRandomUnit(GroupEnumG) // GroupPickRandomUnit(GroupEnumG) -- Если нужен случайный юнит в радиусе, удаляем FirstOfGroup(GroupEnumG) и ставим эту функцию
            exitwhen uf == null
            if UnitAlive(uf) then 
                call IssueTargetOrder(GetEnumUnit(), "chainlightning", uf) //Кастуем молнию на юнита
            endif
            call GroupRemoveUnit( GroupEnumG, uf) //Удаляем юнита из группы
            set uf = null //Обнуляем переменную
        endloop
        call GroupClear(GroupEnumG) //Очищаем группу
        
endfunction

function AOE_Lightning_Actions_GroupTower takes nothing returns nothing
    call ForGroup( udg_GroupTowers, function AOE_Lightning_Actions)
endfunction


function InitTrig_LightningAutoCastGroup takes nothing returns nothing
call TimerStart( CreateTimer(), 0.03, true, function AOE_Lightning_Actions_GroupTower) //Создаем периодический таймер
endfunction

endscope
Результат для 1 башни
Результат для группы башен
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
13
3 месяца назад
0
Увеличить дальность атаки башни до 1000(В Редакторе Объектов рядом с уроном Атаки) либо уменьшить радиус способности до 500 в триггерах
0
2
3 месяца назад
0
SoulRazor, нет я хочу чтобы башня стрелял 500 а способность использовался на расстоянии 1000
2
13
3 месяца назад
2
Super cool, тогда перебирай юнитов в радиусе 1000 и сравнивай дистанцию, поставь условие если расстояние между точками выбранного юнита и самой башни > 500, использовать цепную молнию.
но это лучше делать на Jass-е.
0
2
3 месяца назад
0
SoulRazor, а через РТ можете показать , а то так я не понимаю , и что такое Jass?
4
13
3 месяца назад
Отредактирован SoulRazor
4
Super cool, Jass это встроенный язык программирования варкрафта, т.е код что на GUI - пользовательский интерфейс, только в виде кода. GUI ограничен, на нем могут вылезти утечки. Из-за чего могут быть лаги в картах.
подробнее про Jass Тут
Ну и конечно нужен JNGP, если на 1.26 патче или рефорджет. Скачать можно тут
Создаем триггер и конвертируем его в текст. Затем копируем и вставляем код.
Конвертируем в текст
udg_Tower - твоя башня, триггер рассчитан на 1 башню если нужно на несколько, используй другой код и заноси каждую башню в группу
Тогда нужно создать группу для башен, т.е GroupTowers.
Создаем GUI переменную
Код для 1 башни
scope LightningAutoCast

globals
   private unit filterUnit //Юнит для перебора
   private group GroupEnumG = CreateGroup() //Группа для перебора юнитов
   //udg_Tower = Башня
endglobals

native UnitAlive takes unit id returns boolean //Нативка на жив ли юнит

function DistanceBetweenXY takes real x1, real y1, real x2, real y2 returns real //Дистанция между координатами
   return SquareRoot((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 
endfunction

function AOE_Lightning_Filter takes nothing returns boolean //Фильтр функция
        local real x = GetUnitX(udg_Tower) //Координата Х башни
        local real y = GetUnitY(udg_Tower) //Координата Y башни
        local real x1
        local real y1
        
        set filterUnit = GetFilterUnit()
        
        set x1 = GetUnitX(filterUnit) //Координата X фильтр юнита
        set y1 = GetUnitY(filterUnit) //Координата Y фильтр юнита
        
        return IsUnitEnemy(filterUnit, GetOwningPlayer(udg_Tower)) and filterUnit != udg_Tower and not IsUnitType(filterUnit, UNIT_TYPE_STRUCTURE) and DistanceBetweenXY( x, y, x1, y1) > 500
        //Условия: Юнит враг Игроку Башни и Юнит не равен самой Башни и Юнит не является зданием и Дистанция между координатами юнита и башни > 500
endfunction

function AOE_Lightning_Actions takes nothing returns nothing
        local real radius = 1000 // Радиус
        local real x = GetUnitX(udg_Tower) //Координата Х башни
        local real y = GetUnitY(udg_Tower) //Координата Y башни
        local unit uf // Юнит для перебора в цикле
        
        call GroupEnumUnitsInRange(GroupEnumG, x, y, radius, function AOE_Lightning_Filter) // Пикаем юнитов в радиусе от координат башни и перебираем в функции фильтре
        loop
            set uf = FirstOfGroup(GroupEnumG) // GroupPickRandomUnit(GroupEnumG) -- Если нужен случайный юнит в радиусе, удаляем FirstOfGroup(GroupEnumG) и ставим эту функцию
            exitwhen uf == null
            if UnitAlive(uf) then 
                call IssueTargetOrder(udg_Tower, "chainlightning", uf) //Кастуем молнию на юнита
            endif
            call GroupRemoveUnit( GroupEnumG, uf) //Удаляем юнита из группы
            set uf = null //Обнуляем переменную
        endloop
        call GroupClear(GroupEnumG) //Очищаем группу
        
endfunction

function InitTrig_LightningAutoCast takes nothing returns nothing
call TimerStart( CreateTimer(), 0.03, true, function AOE_Lightning_Actions) //Создаем периодический таймер
endfunction

endscope
Код для несколько башень
scope LightningAutoCastGroup

globals
   private unit filterUnit //Юнит для перебора
   private group GroupEnumG = CreateGroup() //Группа для перебора юнитов
   //udg_Tower = Башня
endglobals

native UnitAlive takes unit id returns boolean //Нативка на жив ли юнит

function DistanceBetweenXY takes real x1, real y1, real x2, real y2 returns real //Дистанция между координатами
   return SquareRoot((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 
endfunction

function AOE_Lightning_Filter takes nothing returns boolean //Фильтр функция
        local real x = GetUnitX(GetEnumUnit()) //Координата Х башни
        local real y = GetUnitY(GetEnumUnit()) //Координата Y башни
        local real x1
        local real y1
        
        set filterUnit = GetFilterUnit()
        
        set x1 = GetUnitX(filterUnit) //Координата X фильтр юнита
        set y1 = GetUnitY(filterUnit) //Координата Y фильтр юнита
        
        return IsUnitEnemy(filterUnit, GetOwningPlayer(GetEnumUnit())) and filterUnit != GetEnumUnit() and not IsUnitType(filterUnit, UNIT_TYPE_STRUCTURE) and DistanceBetweenXY( x, y, x1, y1) > 500
        //Условия: Юнит враг Игроку Башни и Юнит не равен самой Башни и Юнит не является зданием и Дистанция между координатами юнита и башни > 500
endfunction

function AOE_Lightning_Actions takes nothing returns nothing
        local real radius = 1000 // Радиус
        local real x = GetUnitX(GetEnumUnit()) //Координата Х башни
        local real y = GetUnitY(GetEnumUnit()) //Координата Y башни
        local unit uf // Юнит для перебора в цикле
        
        call GroupEnumUnitsInRange(GroupEnumG, x, y, radius, function AOE_Lightning_Filter) // Пикаем юнитов в радиусе от координат башни и перебираем в функции фильтре
        loop
            set uf = GroupPickRandomUnit(GroupEnumG) // GroupPickRandomUnit(GroupEnumG) -- Если нужен случайный юнит в радиусе, удаляем FirstOfGroup(GroupEnumG) и ставим эту функцию
            exitwhen uf == null
            if UnitAlive(uf) then 
                call IssueTargetOrder(GetEnumUnit(), "chainlightning", uf) //Кастуем молнию на юнита
            endif
            call GroupRemoveUnit( GroupEnumG, uf) //Удаляем юнита из группы
            set uf = null //Обнуляем переменную
        endloop
        call GroupClear(GroupEnumG) //Очищаем группу
        
endfunction

function AOE_Lightning_Actions_GroupTower takes nothing returns nothing
    call ForGroup( udg_GroupTowers, function AOE_Lightning_Actions)
endfunction


function InitTrig_LightningAutoCastGroup takes nothing returns nothing
call TimerStart( CreateTimer(), 0.03, true, function AOE_Lightning_Actions_GroupTower) //Создаем периодический таймер
endfunction

endscope
Результат для 1 башни
Результат для группы башен
Принятый ответ
4
27
3 месяца назад
4
SoulRazor, ты забыл добавить DoNothing( )

""
scope LightningAutoCastGroup
globals
   private constant group GroupEnumG = CreateGroup() //Группа для перебора юнитов
   //udg_Tower = Башня
endglobals

native UnitAlive takes unit id returns boolean //Нативка на жив ли юнит

function AOE_Lightning_Actions takes nothing returns nothing
    local unit u = GetEnumUnit( )
    local real radius = 1000 // Радиус
    local real x = GetUnitX(u) //Координата Х башни
    local real y = GetUnitY(u) //Координата Y башни
    
    set bj_groupEnumOwningPlayer = GetOwningPlayer(u)
    call GroupEnumUnitsInRange(GroupEnumG, x, y, radius, null) // Пикаем юнитов в радиусе от координат башни и перебираем в функции фильтре
    
    loop
        set bj_groupRandomConsidered = 0
        set bj_groupRandomCurrentPick = null
        call ForGroup(GroupEnumG, function GroupPickRandomUnitEnum)
        exitwhen bj_groupRandomCurrentPick == null
        call GroupRemoveUnit(GroupEnumG, bj_groupRandomCurrentPick) //Удаляем юнита из группы
        
        if UnitAlive(bj_groupRandomCurrentPick) and IsUnitEnemy(bj_groupRandomCurrentPick, bj_groupEnumOwningPlayer) and not IsUnitType(bj_groupRandomCurrentPick, UNIT_TYPE_STRUCTURE) then
            set x1 = GetUnitX(bj_groupRandomCurrentPick)
            set y1 = GetUnitY(bj_groupRandomCurrentPick)
            
            if SquareRoot((x-x1)*(x-x1)+(y-y1)*(y-y1)) > 500.00 then
                call IssueTargetOrder(u, "chainlightning", bj_groupRandomCurrentPick) //Кастуем молнию на юнита
                call GroupClear(GroupEnumG)
            endif
        endif
    endloop
    
    set u = null
endfunction

function AOE_Lightning_Actions_GroupTower takes nothing returns nothing
    call ForGroup( udg_GroupTowers, function AOE_Lightning_Actions)
endfunction

function InitTrig_LightningAutoCastGroup takes nothing returns nothing
call TimerStart( CreateTimer(), 0.03, true, function AOE_Lightning_Actions_GroupTower) //Создаем периодический таймер
endfunction
endscope


""
0
2
3 месяца назад
0
rsfghd, Ничего себе а нету по типу GUI? С первого взгляда очень просто но это довольно очень сложно
0
2
3 месяца назад
0
SoulRazor, Привет, а можете скинуть карту который показан на примере?
2
13
3 месяца назад
Отредактирован SoulRazor
2
Super cool, Добавил с правками на случайного юнита, спасибо rsfghd
В коде есть комментарии для обучения Jass-у, как все устроено.
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.