21

» WarCraft 3 / Как сделать True attack (MKB)

Swini, например криты, как уже предложил quq_CCCP. Также у Сильного удара есть такой параметр.
21

» WarCraft 3 / Как сделать True attack (MKB)

У некоторых пассивных способностей есть параметр Можно промахнуться, это и есть True Strike. Главное поставть шанс срабатывания на 100% и не забывать , что это orb effect.
21

» Блог им. ScopteRectuS / Треугольник Серпинского

BrEd Pitt, типа такого что ли? Я пока что планировал сделать квадрат Серпинского.
Вернее не квадрат, а чтобы можно можно было устанавливать кол-во вершин.
21

» WarCraft 3 / Можно ли триггерно вызвать элемент интерфейса?

8gabriel8, ну так Вы уже сделали, оказывается, сами то, о чём я говорил. А насчёт анимации хз, может баг какой-то.
А применение зелья тоже сбивает текущий приказ.
21

» WarCraft 3 / Пассивный щит маны

Sergarr, думаю всё так просто сделать не получится. Так как Магический щит поглощает урон еще до резистов, нужно высчитать начальный урон (без учёта резистов), чтобы вычесть нужное кол-во маны.
21

» WarCraft 3 / Можно ли триггерно вызвать элемент интерфейса?

8gabriel8, как только появится свободное время, обязательно рассмотрю всё в редакторе и отпишусь.
21

» WarCraft 3 / как убрать ГРУППЕ юнитов "является здание"?

Возможно, у автора вопроса подвисает редактор, когда он что-то меняет... Перейдите в Окно и уберите галочку со Списка кистей, тогда редактор не будет подвисать каждый раз и можно будет поменять всё вручную.
21

» WarCraft 3 / Можно ли триггерно вызвать элемент интерфейса?

ScopteRectuS, работает вариант, пока ещё не пробовал скрыть иконку, пытаюсь сделать Самолечение красиво. Дело в том, что оно не должно вообще срабатывать, если здоровье полное, пока получается сбивать заклинание только приказом Стоп, не сбивают ни удаление, ни блокировка способности, ни обнуление маны с возвращением оных через 0,01 секунду по таймеру. А это не особо хорошо выглядит, если герой бежит, атакует, да и просто стоит, ведь текущий приказ тоже сбивается. Может можно как-то сделать, чтобы во время атаки или бега герой не останавливался? По идее там что-то можно попробовать с флагом Непрерываемый, но я с ним не работал раньше.
Если честно, то я не понял, что здесь написано... Насчёт несбивания текущего приказа: это вроде нельзя сделать, ведь в варике нету способностей, не имеющих целей с авто-кастом и не сбивающих текущий приказ (могу ошибаться).

Также придумал такой вариант реализации: во время каста способности даём воину лечилку без цели, форсим горячую клавишу, а затем удаляем способность. Так как действие произойдёт очень быстро, то иконки не будет видно, да и скрывать иконку не понадобится уже.
21

» WarCraft 3 / как убрать ГРУППЕ юнитов "является здание"?

quq_CCCP, возможно, ТС имел ввиду не группу (тип переменной), а совокупность чего-либо, некоторое кол-во объектов в редакторе войск.
21

» WarCraft 3 / Можно ли триггерно вызвать элемент интерфейса?

ClotPh, тут я согласен. Но способность то не кастанётся, а выдаст ошибку о том, что воин здоров.
21

» WarCraft 3 / Можно ли триггерно вызвать элемент интерфейса?

Так может лучше добавить герою способность Зелья лечения и форсить её горячей клавишей при полном здоровье?
Разве я не то же самое сказал? ))
8gabriel8:
P. S. А как прятать иконки через импортированный .txt?
Здесь Тимур довольно подробно всё описал, а Maniac_91 как импортировать.
21

» WarCraft 3 / Можно ли триггерно вызвать элемент интерфейса?

ClotPh:
ScopteRectuS, по второму: а вдруг у него там хоткеи изменены программой или еще что? Просто дать приказ кастовать оригинальную и все
и даже так это будет считаться, что скастованы юнитом 2 абилы, а не одна, придется везде это учитывать
Приказ кастовать способность через триггерный приказ не выводит ошибку на экран в случае неудачи. Не понимаю, что плохого в том, что воин скастует 2 способности вместо одной.
21

» WarCraft 3 / Можно ли триггерно вызвать элемент интерфейса?

Если поменять разрешенные цели направленным способностям на Сам воин, то способность будет работать только на обладателя способности, а так как способность имеет авто-каст, то вряд ли кто-то будет кликать по ней левой кнопкой мыши.
Ну или можно дать войну оригинальную способность лечения без цели, а когда игрок нажимает на способность форсить ему нажатие горячей клавиши оригинальной способности. Иконку оригинальной способности нужно спрятать, естественно, через импортированный файл .txt
21

» WarCraft 3 / как вписать номер предмета из редактора в текст

Автор : Vexorian
	function RAW2S takes integer value returns string
        local string charMap = ".................................!.#$%&'()*+,-./0123456789:;<=>.@ABCDEFGHIJKLMNOPQRSTUVWXYZ[.]^_`abcdefghijklmnopqrstuvwxyz{|}~................................................................................................................................."
        local string result = ""
        local integer remainingValue = value
        local integer charValue
        local integer byteno = 0

        loop
            set charValue = ModuloInteger(remainingValue, 256)
            set remainingValue = remainingValue / 256
            set result = SubString(charMap, charValue, charValue + 1) + result
     
            set byteno = byteno + 1
            exitwhen ( byteno == 4 )
        endloop

        return result
    endfunction 
21

» WarCraft 3 / constant native Convert...

Sergarr, я хотел написать одну функцию RegisterPlayerUnitEvent( player whichPlayer, playerunitevent whichEvent, code actionFunc ). Если я хочу, чтобы триггер срабатывал при EVENT_PLAYER_UNIT_ATTACKED или EVENT_PLAYER_UNIT_DEATH, то я так и напишу. Но также эту функцию можно будет кормить своими кастомными эвентами, например, EVENT_PLAYER_UNIT_DAMAGED, естественно, при получении не нативного эвента, функция должна понять это и сделать то, что нужно.
21

» WarCraft 3 / constant native Convert...

quq_CCCP, нет, вы неправильно поняли. Я имел ввиду, что если предать функции Convert...( ) разные параметры, то можно получить переменные данного типа, которые можно использовать в своих кастомных функциях, а не в нативных.
21

» WarCraft 3 / constant native Convert...

Скормить триггерам можно любой номер, опять же, но в каждом, куда я заходил, стояли проверки на входе на скормленное число, поэтому пользоваться этим бесполезно. Плюс все триггеры вызываются вследствие того, что их вызывает игра по событию. Те события, к которым невозможно сейчас привязать триггер. всё равно не будут вызывать привязанный каким-либо хак-способом триггер.
Я бы хотел это использовать в своих кастомных функциях, а не в нативных, например так:
globals
	constant  playerunitevent  EVENT_PLAYER_UNIT_DAMAGED  =  ConvertPlayerUnitEvent( 3000 )
endglobals

function RegisterPlayerUnitEvent takes player whichPlayer, playerunitevent whichPlayerUnitEvent, code actionFunc returns nothing
endfunction
А уже внутри функции смотреть, что за playerunitevent функции передали и исходя из этого совершать некие действия. Не произойдут ли какие-нибудь конфликты из-за этого?

Так как в 1.29 поменяли некоторые цифры для enum-ераторов, я собираюсь использовать большие числа (как 3000), чтобы не произошли конфликты в будущем.
21

» WarCraft 3 / Звуки при передвижении.

Вроде была же функция, которая возвращает текущий приказ, если он равен "move", значит он двигается.
21

» WarCraft 3 / Оптимизация

Да вроде нет разницы какой-то существенной.. Разве что, через фильтр это официальный способ, который нам предоставили BLIZZARD.

Предположим, если я юзаю спелл, он через таймер нанесёт урон через 1 секунду с помощью глобалки Кастера, но а если в этот момент, точнее где-то в 0.5 после моего юза, юзает кто-то еще, тогда глобалка запишет последнего кастера и урон в результате двух юзов сочтется для последнего кастера. Я так могу от своего же скилла подохнуть.
В глобалки данные нужно записать прямо перед тем, как будет вызвана функция фильтра. И нужно уследить за тем, чтобы в функции фильтра не было функций, которые создают новые потоки, а если создают, то нужно смотреть, чтобы в новом потоке не использовалась это глобалка. Новые потоки могут вызываться при использовании следующих функции: TimerStart( ), ExecuteFunc( ), TriggerEvaluate( ), TriggerExecute( ), ForGroup( ) и другие, а также новые потоки могут создаваться при совершении события какого-либо триггера (например, приказ кастануть способность запустит новый поток, если имеется триггер на отлов каста способностей). Новые потоки имееют приоритет над уже работающими, поэтому сперва исполнится код в новом потоке, а после этого возобновится поток, который остановился из-за запуска нового потока.
21

» WarCraft 3 / Оптимизация

WoLLFeR, ну фильтр тоже перебирает ВСЕХ юнитов, но добавляет в группу лишь тех, кто прошёл проверку. А в цикле мы уже перебираем юнитов, которые записались в группу.
21

» WarCraft 3 / Оптимизация

WoLLFeR, Ваш фильтр перебирал каждого воина в группе, это означает, что функция фильтр будет вызвана столько раз, сколько воинов в группе. Если там будет 100 воинов, то функция будет вызвана 100 раз и создаст те самые локалки тоже 100 раз, и всё это произойдет за один кадр. Поэтому, quq_CCCP, порекомендовал Вам использовать глобалки, так как они не будут создаваться при каждом запуске. Разумеется, их нужно правильно использовать, чтобы они не перезаписывались.
21

» WarCraft 3 / Оптимизация

call SaveInteger(udg_Hash,StringHash("x"),1,GetPlayerId(GetOwningPlayer(Caster)))

function Trig_R_Boom takes unit d, unit c returns nothing

call GroupEnumUnitsInRange(g, x, y,500,Condition(function FilterR))
loop
	set f = FirstOfGroup(g)
    exitwhen f == null
    call UnitDamageTarget(c,f,400, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
    call GroupRemoveUnit(g,f)
endloop

В конце функции Trig_R_Actions( )не обнулена переменная типа timer.
- Короче, вот:
function Trig_LOCAL_TimerR takes nothing returns nothing
    local  timer   timerer =  GetExpiredTimer( )
    local  integer i       =  GetHandleId( timerer )
    local  unit    Caster  =  LoadUnitHandle( udg_Hash, i, 4 )
    local  unit    Dummy   =  LoadUnitHandle( udg_Hash, i, 3 )
    local  real    xd      =  GetUnitX( Dummy )
    local  real    yd      =  GetUnitY( Dummy )
    local  group   g       =  null
    local  unit    f       =  null

    if ( GetWidgetLife( Dummy ) < 0.405 ) then

        set  g  =  CreateGroup( )

        call GroupEnumUnitsInRange( g, xd, yd, 500.0, null )
        loop
            set  f  =  FirstOfGroup( g )
            exitwhen ( f == null )
            call GroupRemoveUnit( g, f )

            if IsUnitEnemy( f, GetOwningPlayer( Caster ) ) and ( GetWidgetLife( f ) > 0.405 ) and ( not IsUnitType( f, UNIT_TYPE_STRUCTURE ) ) and ( not IsUnitType( f, UNIT_TYPE_FLYING ) ) then
                call UnitDamageTarget( Caster, f, 400.0, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null )
            endif

        endloop

        call DestroyGroup( g )
        set  g  =  null

        call FlushChildHashtable( udg_Hash, i )
        call DestroyTimer( timerer )
        set  Dummy  =  CreateUnit( GetOwningPlayer( Caster ), 'u001', xd, yd, 0.0 )
        call UnitApplyTimedLife( Dummy, 'BTLF', 2.0 )

    else
        set  xd = GetUnitX( Dummy ) + 10.0 * Cos( GetUnitFacing( Dummy ) * bj_DEGTORAD )
        set  yd = GetUnitY( Dummy ) + 10.0 * Sin( GetUnitFacing( Dummy ) * bj_DEGTORAD )
        call SetUnitPosition( Dummy, xd, yd )
    endif

    set  timerer  =  null
    set  Caster   =  null
    set  Dummy    =  null
endfunction


function Trig_R_Actions takes nothing returns nothing
    local  unit     Caster   =  GetTriggerUnit( )
    local  real     xt       =  GetSpellTargetX( )
    local  real     yt       =  GetSpellTargetY( )
    local  real     xc       =  GetUnitX( Caster )
    local  real     yc       =  GetUnitY( Caster )
    local  unit     Dummy    =  CreateUnit( GetOwningPlayer( Caster ), 'u000', xc, yc, bj_RADTODEG * Atan2( yt - yc, xt - xc ) )
    local  timer    timerer  =  CreateTimer( )
    local  integer  i        =  GetHandleId( timerer )

    call SetUnitAnimation( Dummy, "Birth" )
    call UnitApplyTimedLife( Dummy, 'BTLF', 1.0 )
    call SaveUnitHandle( udg_Hash, i, 3, Dummy )
    call SaveUnitHandle( udg_Hash, i, 4, Caster )
    call TimerStart( timerer, 0.01, true, function Trig_LOCAL_TimerR )

    set  Caster   =  null
    set  Dummy    =  null
    set  timerer  =  null
endfunction