ScopteRectuS #1 - 16 часов назад 1

» WarCraft 3 / Область воздействия

Это из-за физического размера выбираемых воинов.
Если хотите сделать способность, которая будет работать также, как и стандартные, то при выборе воинов в качестве радиуса указываете нужный радиус + максимально возможный физический размер воинов на карте.

лучше кодом, чем словами:

// 	Если перебор воинов идёт через цикл:
	call GroupEnumUnitsInRange( group, x, y, SPELL_RADIUS + MAX_COLLIZION_SIZE, boolexpr )
	loop
//		...
		set enumUnit = FirstOfGroup( group )
//		...
		if IsUnitEnemy( enumUnit, player ) and IsUnitInRangeXY( enumUnit, x, y, SPELL_RADIUS ) then
			call DoSomething( )
		endif
//		...
	endloop
Как показано выше, с помощью функции IsUnitInRange( ) мы можем отсеять воинов, которые не попали в радиус действия способности, но были выбраны в группу из-за того, что мы указали в функции GroupEnumUnitsInRange( ) радиус чуть больше нужного нам.
ScopteRectuS #2 - 1 день назад (отредактировано ) 0

» Блог sleep`a / Ваша любимая карта Warcraft 3

  1. DotA. Многие, может быть, и не согласятся (все не согласятся), но я считаю, что именно дота популяризировала варкрафт. Конкретно я познакомился сперва с дотой, а лишь потом с варкрафтом.
  2. Green TD - просто и красиво.
  3. Петро - ...
ScopteRectuS #3 - 1 неделю назад 0

» WarCraft 3 / Полоска здоровья

Не знал что такое DGUI, вроде разобрался. Осталось узнать, где можно взять интерфейс для полоски среди стандартных файлов игры.
Мультибоард и ресурсы не подходят.
ScopteRectuS #4 - 1 неделю назад 0

» WarCraft 3 / Проблема с Dummy-юнитом

ssbbssc, или вообще можно сделать без dummy-юнита.
ScopteRectuS #5 - 2 недели назад 0

» WarCraft 3 / Как сделать способность цель-юнит с обходом имуннитета к магии

quq_CCCP, это первое, что выдал поиск в гугле. Да и там всё вполне разжёвано.
ScopteRectuS #6 - 2 недели назад 1
ScopteRectuS #7 - 2 недели назад 0

» Блог Кета Голосова / Рабочий

Больше похож на охранника, чем на рабочего. :-)
ScopteRectuS #8 - 3 недели назад 0

» WarCraft 3 / Пробемы с ланщафтом

Obelick, это я к тому, что проблема всё же может быть не в игре, а в карте. У меня это происходило из-за неправильного редактирования ландшафта на определённой карте. Хз, может у меня руки растут не оттуда, откуда надо..)
ScopteRectuS #9 - 3 недели назад 0

» WarCraft 3 / Пробемы с ланщафтом

Obelick, это вроде проблема не игры, а именно карты. Сталкивался с подобным, когда редактировал ландшафт на своей карте.
ScopteRectuS #10 - 3 недели назад 0

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

Swini, например криты, как уже предложил quq_CCCP. Также у Сильного удара есть такой параметр.
ScopteRectuS #11 - 3 недели назад 0

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

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

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

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

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

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

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

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

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

8gabriel8, как только появится свободное время, обязательно рассмотрю всё в редакторе и отпишусь.
ScopteRectuS #16 - 4 недели назад 0

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

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

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

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

Также придумал такой вариант реализации: во время каста способности даём воину лечилку без цели, форсим горячую клавишу, а затем удаляем способность. Так как действие произойдёт очень быстро, то иконки не будет видно, да и скрывать иконку не понадобится уже.
ScopteRectuS #18 - 4 недели назад (отредактировано ) 0

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

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

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

ClotPh, тут я согласен. Но способность то не кастанётся, а выдаст ошибку о том, что воин здоров.
ScopteRectuS #20 - 4 недели назад (отредактировано ) 0

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

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

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

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

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

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

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

А создать саму способность на основе лечащей способности не вариант?
ScopteRectuS #24 - 4 недели назад (отредактировано ) 2

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

Автор : Vexorian
	function RAW2S takes integer value returns string
        local string charMap = ".................................!.#$%&'()*+,-./0123456789:;<=>.@ABCDEFGHIJKLMNOPQRS​TUVWXYZ[.]^_`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 
ScopteRectuS #25 - 4 недели назад (отредактировано ) 0

» 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, естественно, при получении не нативного эвента, функция должна понять это и сделать то, что нужно.
ScopteRectuS #26 - 1 месяц назад (отредактировано ) 2

» WarCraft 3 / constant native Convert...

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

» WarCraft 3 / constant native Convert...

quq_CCCP, почему? у меня всё работает.
ScopteRectuS #28 - 1 месяц назад (отредактировано ) 0

» 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), чтобы не произошли конфликты в будущем.
ScopteRectuS #29 - 1 месяц назад 4

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

Вроде была же функция, которая возвращает текущий приказ, если он равен "move", значит он двигается.
ScopteRectuS #30 - 1 месяц назад 0

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

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

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

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

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

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

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

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

здесь данные могут перезаписаться, нужно крепить к таймеру, а не к StringHash("x").

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

зачем нужна эта функция? Ей содержимое можно перенести в Trig_LOCAL_TimerR( ).

function Trig_R_Boom takes unit d, unit c returns nothing

здесь можно убрать Condition(function FilterR), вписав вместо неё null. А внутри цикла проверять через if то, что находится внутри функции FilterR( ). В конце переменную f можно не обнулять, так как она из цикла уже выйдет обнулённой.

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
ScopteRectuS #34 - 1 месяц назад 1
ScopteRectuS #35 - 1 месяц назад (отредактировано ) 1

» WarCraft 3 / Юниты странно себя ведут

Я задавал аналогичный вопрос.
Решил проблему следующим образом:
В точке наибольшего отклонения от траектории пути создаём еще одну область, назовём её С. После этого, воинам, которые наступили на область А отдаем приказ идти не точку В, а в новую точку С. А после точки С в точку В. Повторять нужно до тех пор, пока траектория передвижения не станет максимально близкой к прямой линии.
P.S: нет, на самом деле, я забросил карту, потому что мой внутренний перфекциониизм не смог стерпеть подобного.
ScopteRectuS #36 - 1 месяц назад 0

» WarCraft 3 / как найти айди юнита

GetUnitTypeId( unit )
unit - юнит, unitId (RAW CODE) которого хотите получить.
ScopteRectuS #37 - 1 месяц назад (отредактировано ) 0

» Лаборатория Маньяка / Система захвата зданий

Maniac_91, можно и 0.52, только тогда, наверное, придётся стереть часть пробелов после
call DisplayTimedTextToPlayer( toPlayer, 0.0, 0.0, 1.5, "\n\n\n\n
ScopteRectuS #38 - 1 месяц назад 0
ScopteRectuS #39 - 1 месяц назад 1

» WarCraft 3 / Есть ли функция, которая возвращает стоимость юнита?

native GetUnitGoldCost        takes integer unitid                                            returns integer
native GetUnitWoodCost        takes integer unitid                                            returns integer
ScopteRectuS #40 - 1 месяц назад 4

» Лаборатория Маньяка / Система захвата зданий

Maniac_91, попробуйте эту функцию:
	globals
        sound  INTERFACE_ERROR  =  null
    endglobals

    function InterfaceError takes player toPlayer, string message returns nothing
        if ( INTERFACE_ERROR == null ) then
            set  INTERFACE_ERROR  =  CreateSoundFromLabel("InterfaceError", false, false, false, 10, 10)
        endif

        if ( GetLocalPlayer( ) == toPlayer ) then
            call ClearTextMessages( )
            call DisplayTimedTextToPlayer( toPlayer, 0.0, 0.0, 1.5, "\n\n\n\n                                                          |cffffcc00" + message + "|r\n\n\n\n\n\n\n\n\n\n\n\n" )
            call StartSound( INTERFACE_ERROR )
        endif
    endfunction
ScopteRectuS #41 - 1 месяц назад 0

» WarCraft 3 / Вызов функций из blizzard.j

Ого, красиво! Когда выйдет?
Кто автора минусует?
ScopteRectuS #42 - 1 месяц назад 0
ScopteRectuS #43 - 1 месяц назад 0

» WarCraft 3 / Баффы на мёртвых юнитах

pro100master, так у меня способность не кастуется, у меня аура...))
ScopteRectuS #44 - 1 месяц назад 0

» WarCraft 3 / Баффы на мёртвых юнитах

pro100master, можно кодом, а то словами не понятно, что вы написали.
Каждого юнита с бафов отловить и повесить на него таймер, который через определенное время проверит с баффом воин или нет?
ScopteRectuS #45 - 1 месяц назад 0

» WarCraft 3 / Баффы на мёртвых юнитах

quq_CCCP, цифру я из воздуха взял. Но такая реализация мне не очень подходит, я уже сделал так, как предложил ClotPh.
ScopteRectuS #46 - 1 месяц назад 2

» WarCraft 3 / Как создать точку в случайном месте в радиусе от юнита?

х = GetUnitX( ... ) + GetRandomReal( -radius, radius )
y = GetUnitY( ... ) + GetRandomReal( -radius, radius )
Правда, если выпадет макс. или мин. значения, то расстояние получится больше указанного радиуса.
Но это бывает редко, да и глазу незаметно.
ScopteRectuS #47 - 1 месяц назад (отредактировано ) 0

» WarCraft 3 / Баффы на мёртвых юнитах

quq_CCCP:
Все стандартные баффы удаляются перед смертью, это механика игры такая.
Просто заносите всех с баффом в группу, а при смерти смотрите есть ли он в группе и делайте что нужно.
Maniac_91:
ScopteRectuS, я имею в виду костыльный способ: если у юнита висит бафф, то давать ему способность-пустышку.
Ну или как quq_CCCP написал, через группу.
Это придётся каждые 0.001 сек. выбирать всех воинов на карте и проверять у них наличие баффа, и, если бафф имеется, то добавлять их в группу / добавлять им способность? Мне кажется это ресурсозатратно.

ClotPh:
проверяй что враг умирает рядом с носителем ауры в области ее действия
Думаю, это самый лучший вариант.
по идее в такой ситуации НЕ быть баффа до смерти на нем почти никогда не может
А этого я не понял. Я же буду отлавливать момент смерти, когда уже не будет баффа и проверять через функцию IsUnitInRange( dyingUnit, caster, auraRadius ).
ScopteRectuS #48 - 1 месяц назад 0

» WarCraft 3 / Баффы на мёртвых юнитах

Используйте способность-пустышку. Способности триггер видит.
Нужен именно бафф. Ведь у врагов будет именно бафф, а способность будет у обладателя этой ауры.
А если в целях способности, которая вешает бафф, поставить галочку, где "Мёртвый"?
Так аура вообще перестаёт действовать на кого-либо.
ScopteRectuS #49 - 1 месяц назад (отредактировано ) 0

» WarCraft 3 / E.O.T.A e.x.o.d.u.s

PS - Кто введёт читы, то негодяй.
и не поспоришь...))
ScopteRectuS #50 - 2 месяца назад (отредактировано ) 4

» Лаборатория Маньяка / Система захвата зданий

Интерфейс приближен к стандартному: сообщения об ошибках (использована наработка эмуляции ошибки), а также при захвате и потере появляются метки на миникарте.
Возможно, это дело вкуса, но я считаю, что если делать вещи похожими на стандартные, то нужно делать их, как не странно, похожими на стандартные...))
Здание захвачено и Здание потеряно должно быть написано цветом FFFFCC00 и опущено вниз.
Например, |cFFFFCC00Выполнено: Захват здания|r (точка не ставится) или |cFFFFCC00Здание захвачено.|r (точка ставится)