5

» WarCraft 3 / Способность исчезает при использовании

Возможно есть ещё один триггер с этим событием и с этим условием (способностью)?
5

» WarCraft 3 / Разрушение деревьев

Jass
    function TreeDestroyerSystemFilter takes nothing returns boolean
        local destructable d=GetFilterDestructable()
        local real x=GetDestructableX(d)-udg_TreeDestr_X
        local real y=GetDestructableY(d)-udg_TreeDestr_Y
        local real r=SquareRoot(x*x+y*y)
        if(GetWidgetLife(d)>.405 and r<=udg_TreeDestr_R and IssueTargetOrderById(udg_TreeDestr_DUMMY,852018,d) and IssueImmediateOrderById(udg_TreeDestr_DUMMY, 851972))then//852018=="harvest"     851972=="stop"
            call KillDestructable(d)
            set udg_TreeDestr_N=udg_TreeDestr_N+1
        endif
        set d=null
        return false
    endfunction

    function TreeDestroyerSystem takes real x,real y,real r returns integer
        local rect rt=Rect(x-r,y-r,x+r,y+r)
        local boolexpr b=Filter(function TreeDestroyerSystemFilter)
        set udg_TreeDestr_R=r
        set udg_TreeDestr_X=x
        set udg_TreeDestr_Y=y
        set udg_TreeDestr_N=0
        call EnumDestructablesInRect(rt,b,null)
        call DestroyBoolExpr(b)
        call RemoveRect(rt)
        set b=null
        set rt=null
        return udg_TreeDestr_N
    endfunction
    
    function InitTrig_TreeDestrSystem takes nothing returns nothing
        //set gg_trg_TreeDestrSystem=CreateTrigger(  )
        //call TriggerAddAction( gg_trg_TreeDestrSystem, function Trig_TreeDestrSystem_Actions)
        set udg_TreeDestr_DUMMY=CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),'uloc',.0,.0,.0)
        call UnitAddAbility(udg_TreeDestr_DUMMY,'Ahar')
        call ShowUnit(udg_TreeDestr_DUMMY,false)
    endfunction
Загруженные файлы
5

» WarCraft 3 / Разрушение деревьев

vJass
library TreeDestroyerSystem initializer Init
    globals
        private constant integer DummyID='dumy'
        private constant integer AbilityID='Ahar'
        private constant integer OrderID=852018

        private unit Dummy=null
        private real AoE=.0
        private real X=.0
        private real Y=.0
    endglobals

    private function Filtering takes nothing returns boolean
        local destructable d=GetFilterDestructable()
        local real x=GetDestructableX(d)-X
        local real y=GetDestructableY(d)-Y
        local real r=SquareRoot(x*x+y*y)
        if(GetWidgetLife(d)>.405 and r<=AoE and IssueTargetOrderById(Dummy,OrderID,d) and IssueImmediateOrderById(Dummy, 851972))then// and GetUnitCurrentOrder(Dummy)==OrderID
            call KillDestructable(d)
        endif
        set d=null
        return false
    endfunction

    function TreeDestroyerSystem takes real x,real y,real a returns boolean
        local rect r=Rect(x-a,y-a,x+a,y+a)
        local boolexpr b=Filter(function Filtering)
        set AoE=a
        set X=x
        set Y=y
        call EnumDestructablesInRect(r,b,null)
        call DestroyBoolExpr(b)
        call RemoveRect(r)
        set b=null
        set r=null
        set AoE=.0
        set X=.0
        set Y=.0
        return false
    endfunction

    private function Init takes nothing returns nothing
        set Dummy=CreateUnit(Player(15),DummyID,.0,.0,.0)
        call UnitAddAbility(Dummy,'Aloc')
        call UnitAddAbility(Dummy,AbilityID)
        call ShowUnit(Dummy,false)
    endfunction
endlibrary
5

» WarCraft 3 / Связанные юниты

Делаем триггер на него вешаем бойцов и смерть бойцов по хэндлу триггера.
Один из них умер - убиваем второго (или двоих). Ну, и не забываем очищать всё. Дабы утечек небыло.
Профит
5

» WarCraft 3 / Как отделить деревья от разрушаемого?

Типа спавнить дамика...
Правильно, но один раз на всю игру и скрыть. Можно его дать нейтралам (открыта карта). Нам самое главное отслеживать им приказ. Я бы создал москита ('uloc') для нейтрала, добавил способность добычи и скрыл. Место создания не нужно(X=.0, Y=.0). Передвигать к месту проверки так же не нужно.
...приказ не срабатывает то продолжать перебор?
Не совсем... Допустим приказ сработал, то этот даммик будет пытаться добывать дерево. Следовательно нужно его будет как-то остановить.
Но в целом правильно.
5

» WarCraft 3 / Добавление способности юниту тригерно

Установить способности 2 уровня. На первом уровне - все значения в 0. На втором - необходимые значения.
Сделать по аналогии с "Мастерство скелетов (Skeletal Mastery)" улучшение. То бишь улучшение должно увеличить уровень выбранной способности (Ability Level Bonus).
При данном способе:
нет нужды в триггерах (+);
способность всегда видна (как и эффект атаки в данном случае) и нет указания о необходимости улучшения (-).
5

» WarCraft 3 / Суммирующиеся ауры


7.11.2021 Upd: спасибо за помощь. Всё таки добрался до своего старенького ноутбука Asus f5rl под Windows XP...
Разгадка оказалось очень проста - удалить статус (Buff) со способности ауры ('A000'). Правда есть пару нюансов:
  1. Всё же высвечивается статус (Buff) на рядом стоящих. Мой ноутбук не вывозит большое количество эффектов и пришлось удалить с Buff все эффекты
  2. Получаемый бонус удваивается. То бишь прописано в способности +1 к броне, но в игре даёт +2 к броне.
  3. Скачут показатели бонуса.
И все эти радости без Jass, vJass, cJass кодов.
Всё можно испробовать на приложенной карте и посмотреть на скриншотах.

5

» WarCraft 3 / Суммирующиеся ауры

rsfghd, спасибо, но подобная система перебора уже имеется.
Разные суммируются, однако я подразумевал(аю) только от одной ауры и одного и того же типа боевой единицы.
Если не затруднит могли бы попробовать играться с Buff или с самой способностью(ями)? На данный момент не имею доступа к редактору в ближайшую неделю.
5

» WarCraft 3 / Способности и алгоритмы на заказ

NilasAran_39, ledoed, для боевых единиц (не героев) не составит труда реализовать через GUI, ибо 30 прибавок это еще мало, однако для героев - это дикая проблема.
Первый момент, который придётся учесть - это изначальное* кол-во: здоровья, брони, урона, регенерации маны и здоровья (далее характеристик) героя. Исходя из значений последних добавлять некий процент.
Второй момент - броню основную (белую) не выйдет добавлять, а только дополнительную (зелёную). Предметов, что добавляют основную броню - нет, исходя из той информации, которой обладаю.
Регенерацию можно реализовать через таймер и увеличивать её до предела переменной real.
Если здоровье является основным параметром, что нужно добавить, а остальные не важны и возможно их убрать из наработки, то реализация данной способности проста. Используем работу GF RaiseD. Смотрим тут.
*Примечание: под изначальным принимается значение характеристик героя исключая добавленное с помощью наработки. В ином случае герой будет непобедимым безумцем, с каждым убитым, увеличивая не только процент характеристик, но и самого процента.
5

» WarCraft 3 / Смертельный удар игнорирует броню?

исходящий урон
200% даю, что работает. По поводу полученного урона - не особо ручаюсь, ибо не тестировал.
5

» WarCraft 3 / Смертельный удар игнорирует броню?

Alexey103
А так-же можно ли убрать эту цифру и какой урон наносит смертельный удар.
Можно попробовать использовать способность "Укрыться за щитом". На сколько мне известно подобная способность позволяет помножить как входящий, так и исходящий урон, но необходимо задействовать способность. Так же позволительно и обратное - уменьшать.
Alexey103
Можно ли использовать его как аналог способности бронебойность?
Насколько мне известно - нет. Только кодом наносить урон или установкой здоровья.
5

» WarCraft 3 / В чём ошибка с локальными переменными?

Впервой вижу, чтоб так издевались над плавающем текстом...
Как пишет г-н Maniac_91, нет нужды в сохранении texttag, ибо при строчке
call SetTextTagLifespanBJ( GetLastCreatedTextTag(), 0.50 )
или (вариант получше)
call SetTextTagLifespan(GetLastCreatedTextTag(), 0.50)
Ваш texttag, как умненький мальчик, сам уберется, когда он сделал своё дело ;)
Правда есть один нюанс... Если Вы добавили строчку
call SetTextTagPermanent(GetLastCreatedTextTag(),true)
то этот мальчик будет стоять подле Вас до конца сабантуя и ждать команды на уничтожение ;)
5

» WarCraft 3 / Fervor, Critical, Evade (способности)

Добрый день. Благодарю за комментарий.
quq_CCCP:
будет баговать с абилками типа "Жар приесподней"
Дополню - баги сто пудов будут с орб эффектами и любыми способностями (эффектами) с ежесекундным уроном. Поэтому любой урон приходится делать кодом. Мне подобная "фича" известна.
За упоминание отдельное спасибо. В самой карте никак не проинформировал. Мой косяк...
ну и для дальнего боя приказы не применимы, в среднем 0.25-0.40 сек. задержка между замахом и вылетом снаряда.
Никогда не любил дальний бой за его успешное извивание от отлова урона ;)
Очень муторно искать решение проблемы и я не утруждал себя поиском решений. Думаю, в ближайшее время этим не буду заниматься.
Есть готовое решение отлова урона, которое обладает GUI помощью от автора Bribe. Он "ошивается" на сайте, да простят меня модераторы, hiveworkshop. Как раз у него отлов срабатывает через способность рунных браслетов. Признаться честно, я использовал его работу уже в своих работах давно, но, что не своё, то не радует глаз, поэтому решился и на свои наработки.
Сия карту можно использовать как для начала кодирования на vJass и Jass в целом... Хоть подобных ресурсов море, но лишним не будет подобная информация.
5

» WarCraft 3 / Мгновенный стан

Вот тебе моя системка на JASS для пользования нужен JNGP. Не нравится - ищи, иначе - пользуйся.
Stun System - JASS
// Stun System v2.0

globals
constant integer StunSystem_DummyID='u000'		//боевая единица пустышка
constant integer StunSystem_DummyAbility='A000'	//способность на основе Громовой поступи
constant integer StunSystem_Buff='BSTN'		//смотрим какой бафф добавили способности и суда вписываем
constant integer StunSystem_OrderID=852127	//OrderId("stomp")
constant real StunSystem_X=-3035.0		//координата Х безопасной точки для использования Громовой поступи
constant real StunSystem_Y=2762.		//координата Y безопасной точки для использования Громовой поступи
unit StunSystem_Dummy=null

real StunSystem_TIME=.0
unit StunSystem_TARGET=null
endglobals

function StunSystem takes nothing returns boolean
local real x=GetUnitX(StunSystem_TARGET)
local real y=GetUnitY(StunSystem_TARGET)
if GetUnitAbilityLevel(StunSystem_TARGET, StunSystem_Buff)==0 then
    if GetUnitX(StunSystem_Dummy)!=StunSystem_X and GetUnitY(StunSystem_Dummy)!=StunSystem_Y then
        call SetUnitPosition(StunSystem_Dummy,StunSystem_X,StunSystem_Y)
    endif
    call SetUnitX(StunSystem_TARGET,StunSystem_X)
    call SetUnitY(StunSystem_TARGET,StunSystem_Y)
    call IssueImmediateOrderById(StunSystem_Dummy, StunSystem_OrderID)
    call SetUnitX(StunSystem_TARGET,x)
    call SetUnitY(StunSystem_TARGET,y)
endif
set BuffSystem_TARGET=StunSystem_TARGET
set BuffSystem_ID_Buff=StunSystem_Buff
set BuffSystem_TIME=StunSystem_TIME
call TriggerEvaluate(gg_trg_BuffSystem)		//вызов бафф системы
set StunSystem_TIME=.0
set StunSystem_TARGET=null
return true
endfunction

function StunSystem_Func_Init takes nothing returns nothing
set gg_trg_StunSystem=CreateTrigger()
set StunSystem_Dummy=CreateUnit(Player(15),StunSystem_DummyID,StunSystem_X,StunSystem_Y,0)
call UnitAddAbility(StunSystem_Dummy,StunSystem_DummyAbility)
call UnitAddAbility(StunSystem_Dummy,'Aloc')
call ShowUnit(StunSystem_Dummy,false)
call TriggerAddCondition(gg_trg_StunSystem, Condition(function StunSystem))
endfunction
BuffSystem - JASS
// Bufff System v1.1

globals
constant real BuffSystem_Interval=.03125

timer BuffSystem_Timer=CreateTimer()
integer BuffSystem_MAX=0
unit array BuffSystem_Unit
integer array BuffSystem_AbilId
integer array BuffSystem_BuffId
real array BuffSystem_Time

unit BuffSystem_TARGET=null
real BuffSystem_TIME=.0
integer BuffSystem_ID_Ability=0
integer BuffSystem_ID_Buff=0
endglobals

function BuffSystem_Periodic takes nothing returns nothing
local integer i = 0
    loop
        exitwhen i == BuffSystem_MAX
        if BuffSystem_Time[i]>0.0 and BuffSystem_Unit[i]!=null and (not IsUnitType(BuffSystem_Unit[i],UNIT_TYPE_DEAD)) then
            set BuffSystem_Time[i]=BuffSystem_Time[i]-BuffSystem_Interval
        else
            if BuffSystem_AbilId[i]!=0 then
                call UnitMakeAbilityPermanent(BuffSystem_Unit[i],false,BuffSystem_AbilId[i])
                call UnitRemoveAbility(BuffSystem_Unit[i],BuffSystem_AbilId[i])
            endif
            call UnitRemoveAbility(BuffSystem_Unit[i],BuffSystem_BuffId[i])
            
            set BuffSystem_MAX=BuffSystem_MAX-1
            set BuffSystem_Unit[i]=BuffSystem_Unit[BuffSystem_MAX]
            set BuffSystem_Time[i]=BuffSystem_Time[BuffSystem_MAX]
            set BuffSystem_AbilId[i]=BuffSystem_AbilId[BuffSystem_MAX]
            set BuffSystem_BuffId[i]=BuffSystem_BuffId[BuffSystem_MAX]
            
            set BuffSystem_Unit[BuffSystem_MAX]=null
            set BuffSystem_Time[BuffSystem_MAX]=0.
            set BuffSystem_AbilId[BuffSystem_MAX]=0
            set BuffSystem_BuffId[BuffSystem_MAX]=0
            
            set i = i - 1
            if (0 == BuffSystem_MAX) then
                call PauseTimer(BuffSystem_Timer)
            endif
        endif
        set i = i + 1
    endloop
endfunction

function BuffSystem_Checker takes nothing returns boolean
local integer i=0
loop
    exitwhen i==BuffSystem_MAX
    if BuffSystem_TARGET==BuffSystem_Unit[i] and BuffSystem_ID_Ability==BuffSystem_AbilId[i] and BuffSystem_ID_Buff==BuffSystem_BuffId[i] then
        if BuffSystem_TIME>BuffSystem_Time[i] then
            set BuffSystem_Time[i]=BuffSystem_TIME
        endif
        return false
    endif
    set i=i+1
endloop
return true
endfunction

function BuffSystem takes nothing returns boolean
if BuffSystem_Checker() then
    if BuffSystem_MAX==0 then
        call TimerStart(BuffSystem_Timer,BuffSystem_Interval, true, function BuffSystem_Periodic)
    endif
    if BuffSystem_ID_Ability!=0 then
        call UnitAddAbility(BuffSystem_TARGET, BuffSystem_ID_Ability)
        call UnitMakeAbilityPermanent(BuffSystem_TARGET,true,BuffSystem_ID_Ability)
    endif
    set BuffSystem_Unit[BuffSystem_MAX]=BuffSystem_TARGET
    set BuffSystem_Time[BuffSystem_MAX]=BuffSystem_TIME
    set BuffSystem_AbilId[BuffSystem_MAX]=BuffSystem_ID_Ability
    set BuffSystem_BuffId[BuffSystem_MAX]=BuffSystem_ID_Buff
    set BuffSystem_MAX=BuffSystem_MAX+1
endif

set BuffSystem_TARGET=null
set BuffSystem_TIME=.0
set BuffSystem_ID_Ability=0
set BuffSystem_ID_Buff=0
return false
endfunction

function BuffSystem_Func_Init takes nothing returns nothing
set gg_trg_BuffSystem=CreateTrigger()
call TriggerAddCondition(gg_trg_BuffSystem, Condition(function BuffSystem))
endfunction
5

» WarCraft 3 / Какой триггер нагружает карту глобальный или локальный?

достаточно 1 триггера на карту для отлова всех триггерных кастов а потом просто через экзекьют нужные функции вызываем(имя функции берём из хэша/массива по равкоду спела)
тоже верно, ибо за каждое использование сразу варчик пытается запустить N-ое количество триггеров с сия отловом. От чего происходят лаги на старых машинах или\и какой триггер может не запуститься.
nvc123, я лично делаю только тестовые карты способностей, поэтому разницы не вижу. Однако играл как-то раз в карту The Blood Way, использовав любую способность на основе "Громовая поступь" у меня происходили лаги (от 0.5 до 4 сек.) на моей старой машинке 2001 года. А на основе сия способности очень много других способностей, в силу этого я очень долго плакал, когда какой Маг или Паладин использует такие способности.
К чему это я... у меня нет желания прям до 0 оптимизировать способности, ибо скачавшие мною воплощенную идею должны что-нибудь додумывать сами, те же дебаги. Иначе когда же они научаться хоть чему-то?
5

» WarCraft 3 / Рациональный триггер

Я скорее всего обобщу ранее описанное...
naxim:
Типы юнитов, которым необходимо "Ограничить подготовку", занести в массив
что бы занести типы юнитов необходим же отдельный триггер:
а1 = товер1
а2 = товер2
и т.д.
Да, так и есть. Так потом легче будет удалять\добавлять ограничения боевых единиц у игроков.
В твоем триггере игрокам (1-9) устанавливаются ограничения как 0, ибо ты ставишь значение переменной после действий. Нужно поменять порядок. О чем толково пояснил товарищ SomeFire и снова повторил ранее написанное. как минимум уже двое за такой способ.
ssbbssc:
занести группу игроков в переменную и работать с ней
В дальнейшем, может быть, пригодится, если это группа будет использоваться помимо сия триггера.
В данном триггере (если порядок поменять) в массиве целочисленной не вижу смысла, ибо всем игрокам (1-9) дается ограничение одно и тоже равное четырем. Можно было просто вместо массива целочисленной вписать 4 и радоваться оптимизации. Тоже самое касается целочисленной i_Towers, в ней тоже мы не нуждаемся, ибо можно было вместо
Игрок(i_Towers+1)
Игрок(Число В)
Тот же результат (даже более правильный и оптимизированный). Так еще ты берешь игрока (i_Towers+1) то есть 1+1=2
Игрок(2) = синий игрок, а ты явно хотел красного игрока. В мною предложенном способе такой оплошности нет.
Тебе нужно сделать триггер инициализацию где содержится:
  1. массив типов юнитов - боевая единица которую хотим ограничить игрокам
  2. массив целочисленной - кол-во этой боевой единицы
  3. целочисленная - порядковый номер
Далее здесь же добавляем цикл.
Цикл начинаем с 0 до порядкового номера.
Сюда добавляем действия с группой игроков.
Ограничить подготовку (Массив Типа Юнита[Число B]) до (Массив Количества[Число В]) для (GetEnumPlayer())
GetEnumPlayer() - Взятый Игрок из группы игроков. Ибо не знаю как наши товарищи русские перевели сия функцию пишу ее на английском.
И усё.
5

» WarCraft 3 / Разные снаряды при атаки!

Да, кстати в Доте у Троля через морф меняется атака с дальней на ближнюю и у медведя (Не помню как он называется) так же.
Способность ночных эльфов - "Превращение в медведя". Так же выполнен морф и у Xin.
5

» WarCraft 3 / Какой триггер нагружает карту глобальный или локальный?

Zeuz:
DazzleFirst, возможно ли как то создать локальный триггер при применении способности и уничтожить обратно?
ведь обычно локальные триггеры как правило при применении способности создаются в инициализации карты...
нет нужды выделять еще один триггер (помимо отлова) на заклинание, если оно не слишком громоздкое в плане исполнения.
Как сообщает товарищ nvc123:
Zeuz, лучше не использовать много триггеров
вообще нету такой ситуации в которой надо много триггеров
стоит обратить на это внимание.
Везде и всюду есть свои нюансы которые нужно учитывать. Если не выполнить задуманное с помощью одного триггера, то делаем два.
5

» WarCraft 3 / Какой триггер нагружает карту глобальный или локальный?

Локальные триггеры хороши тем, что их можно будет бескорыстия и совести удалить, а потом если нужно создать по новой. Тем самым уменьшить нагрузку на варчик в определенных условиях.
5

» WarCraft 3 / Способности и алгоритмы на заказ

Icebow, способ исполнения нужно писать, а так же MUI да\нет. И узнать бы более подробно про выключение. Сделать наподобие "Жар Преисподней" или давать способность отключения давая возможность удерживать более одного портала на одного мага (при условии что MUI имеется).