28

» WarCraft 3 / Области и перемещение между ними

Desgul, сейчас пытаюсь с помощью джасса и команды IsPointInRegion(R,x,y) реализовать

Ору, не понимал почему игра крашилась, оказывается инициализировать глобалку региона и сразу же присваивать ей значение нельзя)
код
globals
    region TR
    rect lastRect = null
endglobals
function Trig_ddd_Conditions takes nothing returns boolean
    return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO)
endfunction

function IsPointInRect takes rect a, real x, real y returns boolean
    call RegionClearRect(TR,lastRect)
    call RegionAddRect(TR,a)
    set lastRect = a
    return IsPointInRegion(TR,x,y)
endfunction

function Trig_ddd_Actions takes nothing returns nothing
    local real x = GetUnitX(GetTriggerUnit())
    local real y = GetUnitY(GetTriggerUnit())
    call DisableTrigger(GetTriggeringTrigger())
    if IsPointInRect(gg_rct_rect_000,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_002)
    elseif IsPointInRect(gg_rct_rect_001,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_003)
    elseif IsPointInRect(gg_rct_rect_002,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_000)
    elseif IsPointInRect(gg_rct_rect_003,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_001)
    endif
    call SetUnitPositionLoc( GetTriggerUnit(), udg_Point[0] )
    call RemoveLocation(udg_Point[0])
    set udg_Point[0] = null
    call TriggerSleepAction(0.)
    call EnableTrigger(GetTriggeringTrigger())
endfunction

//===========================================================================
function InitTrig_ddd takes nothing returns nothing
    set gg_trg_ddd = CreateTrigger(  )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_000 )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_001 )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_002 )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_003 )
    call TriggerAddCondition( gg_trg_ddd, Condition( function Trig_ddd_Conditions ) )
    call TriggerAddAction( gg_trg_ddd, function Trig_ddd_Actions )
    set TR = CreateRegion()
endfunction

Бтв, Region Comprasion не помог бы

Единственное, что из-за микрозадержки могут быть случаи, когда некоторых юнитов не телепотирует и им ещё раз в область зайти нужно. Задержка нужна чтобы не вызвать бесконечный цикл, к сожалению, таймером в 0.00 сек тоже нельзя воспользоваться, он слишком быстрый для вара

хотя я вижу в твоём триггере, что юнит не может вернуться обратно через ту же область, поэтому тебе даже задержка не нужна
Загруженные файлы
28

» WarCraft 3 / Области и перемещение между ними

Desgul, ну так понятное дело не будет телепортировать, у тебя же события нет для верхних областей, только для нижних

+ там нужно большее кол-во областей чтобы не зациклить триггер, либо отключить триггер на время с определенной задержкой перед включением
28

» WarCraft 3 / Области и перемещение между ними

Закидываешь все нужные области в событие, в условия закидываешь что входящий юнит это герой, а через если тогда иначе проверяешь в какую именно область юнит зашёл

По поводу локальной группы, перед ней нужно поставить set bj_wantDestroyGroup = true
28

» WarCraft 3 / Отмена приказа

Нужен таймер. Первым способом это каждые 0.01 сек проверять координаты юнита, а вторым, это все те же твои действия, но перед ними ещё таймер в 0.00 сек


Загруженные файлы
28

» WarCraft 3 / Нашел баг! (или утечку)

SсRealm, скинь не видео а карту, где я могу заюзать этот баг

у юнита которого нельзя выбрать
Что? Может это и вызвало ошибку?
28

» WarCraft 3 / Нашел баг! (или утечку)

Больше похоже на криворукость, а не баг, попробуй это

Сколько не кликал по юниту (даже F1 подключал) ничего не вылетело, можешь в принципе сам затестить

Тем более утечки быть не может при выборе юнита, юзай счётчик хэндлов в конце концов .-.
Загруженные файлы
28

» WarCraft 3 / Панель приказов

У игры они не деваются, но горячими клавишами ты не сможешь воспользоваться

Через текстовый файлик я уже убрал патруль, скрыл атаку через настройку.
Если уже скрыл, то можешь самостоятельно ответить на следующий вопрос
и триггерно то можно по прежнему приказать и стоять патрулировать?
28

» Блог им. rsfghd / HandleCounter

library HC initializer init
    private leaderboard HB
    private function HCU takes nothing returns nothing
        local integer i = 0
        local integer id
        local location array P
        local real result = 0
        loop
            exitwhen i >= 50
            set i = i+1
            set P[i] = Location(0,0)
            set id = GetHandleId(P[i])
            set result = result+(id-0x100000)
        endloop
        set result = result/i-i/2
        loop
            call RemoveLocation(P[i])
            set P[i] = null
            exitwhen i <= 1
            set i = i-1
        endloop
        call LeaderboardSetItemValue(HB,0,R2I(result))
    endfunction

    private function HCA takes nothing returns nothing
        set HB = CreateLeaderboard()
        call LeaderboardSetLabel(HB,"Handle Counter")
        call PlayerSetLeaderboard(GetLocalPlayer(),HB)
        call LeaderboardDisplay(HB,true)
        call LeaderboardAddItem(HB,"Handles",0,Player(0))
        call LeaderboardSetSizeByItemCount(HB,1)
        call HCU()
        call TimerStart(GetExpiredTimer(),.05,true,function HCU)
    endfunction

    private function init takes nothing returns nothing
        call TimerStart(CreateTimer(),0,false,function HCA)
    endfunction
endlibrary
Да-да, я лох, атстань)
28

» WarCraft 3 / Переход к анимации движения

Если я не ошибаюсь, вот эта строчка влияет на плавность перехода анимаций
Загруженные файлы
28

» WarCraft 3 / Вопрос от Вдохновленного Нативками Трггерщика

Лан, я предполагаю автору недостаточно ответов выше, поэтому отвечаю на следующие вопросы

Да, уже заметил, что есть bj, которые нечем заменять и пусть они так и висят
Вот список того, что ты можешь заменить

но все таки, мне это ни чем не грозит?
Нет, тебе это вообще ничем не грозит и ты лишь облегчишь работу варика, чутка ускорив его, оптимизация проще говоря

То есть варик же bj зачем то делал и не начнет ли он тупить, как обычно?
Близзарды создавали бж для удобства использования другими людьми
Та же гуишная функция с созданием юнитов позволяет человеку в последующем обращаться к юниту/группе как последний созданный/последняя группа (хотя для создания одного юнита действительно дочерта написано)
Другой пример это:
bj_RADTODEG / bj_DEGTORAD (radians to degrees / degrees to radians)
согласись, куда удобнее писать эти слова, нежели искать/запоминать эти цифры 57.2958 / .0174532
Ну а так же, если заменять некоторые бж функции можно знатно раздуть свой код, например
ReplaceUnitBJ
function ReplaceUnitBJ takes unit whichUnit, integer newUnitId, integer unitStateMethod returns unit
    local unit    oldUnit = whichUnit
    local unit    newUnit
    local boolean wasHidden
    local integer index
    local item    indexItem
    local real    oldRatio

    // If we have bogus data, don't attempt the replace.
    if (oldUnit == null) then
        set bj_lastReplacedUnit = oldUnit
        return oldUnit
    endif

    // Hide the original unit.
    set wasHidden = IsUnitHidden(oldUnit)
    call ShowUnit(oldUnit, false)

    // Create the replacement unit.
    if (newUnitId == 'ugol') then
        set newUnit = CreateBlightedGoldmine(GetOwningPlayer(oldUnit), GetUnitX(oldUnit), GetUnitY(oldUnit), GetUnitFacing(oldUnit))
    else
        set newUnit = CreateUnit(GetOwningPlayer(oldUnit), newUnitId, GetUnitX(oldUnit), GetUnitY(oldUnit), GetUnitFacing(oldUnit))
    endif

    // Set the unit's life and mana according to the requested method.
    if (unitStateMethod == bj_UNIT_STATE_METHOD_RELATIVE) then
        // Set the replacement's current/max life ratio to that of the old unit.
        // If both units have mana, do the same for mana.
        if (GetUnitState(oldUnit, UNIT_STATE_MAX_LIFE) > 0) then
            set oldRatio = GetUnitState(oldUnit, UNIT_STATE_LIFE) / GetUnitState(oldUnit, UNIT_STATE_MAX_LIFE)
            call SetUnitState(newUnit, UNIT_STATE_LIFE, oldRatio * GetUnitState(newUnit, UNIT_STATE_MAX_LIFE))
        endif

        if (GetUnitState(oldUnit, UNIT_STATE_MAX_MANA) > 0) and (GetUnitState(newUnit, UNIT_STATE_MAX_MANA) > 0) then
            set oldRatio = GetUnitState(oldUnit, UNIT_STATE_MANA) / GetUnitState(oldUnit, UNIT_STATE_MAX_MANA)
            call SetUnitState(newUnit, UNIT_STATE_MANA, oldRatio * GetUnitState(newUnit, UNIT_STATE_MAX_MANA))
        endif
    elseif (unitStateMethod == bj_UNIT_STATE_METHOD_ABSOLUTE) then
        // Set the replacement's current life to that of the old unit.
        // If the new unit has mana, do the same for mana.
        call SetUnitState(newUnit, UNIT_STATE_LIFE, GetUnitState(oldUnit, UNIT_STATE_LIFE))
        if (GetUnitState(newUnit, UNIT_STATE_MAX_MANA) > 0) then
            call SetUnitState(newUnit, UNIT_STATE_MANA, GetUnitState(oldUnit, UNIT_STATE_MANA))
        endif
    elseif (unitStateMethod == bj_UNIT_STATE_METHOD_DEFAULTS) then
        // The newly created unit should already have default life and mana.
    elseif (unitStateMethod == bj_UNIT_STATE_METHOD_MAXIMUM) then
        // Use max life and mana.
        call SetUnitState(newUnit, UNIT_STATE_LIFE, GetUnitState(newUnit, UNIT_STATE_MAX_LIFE))
        call SetUnitState(newUnit, UNIT_STATE_MANA, GetUnitState(newUnit, UNIT_STATE_MAX_MANA))
    else
        // Unrecognized unit state method - ignore the request.
    endif

    // Mirror properties of the old unit onto the new unit.
    //call PauseUnit(newUnit, IsUnitPaused(oldUnit))
    call SetResourceAmount(newUnit, GetResourceAmount(oldUnit))

    // If both the old and new units are heroes, handle their hero info.
    if (IsUnitType(oldUnit, UNIT_TYPE_HERO) and IsUnitType(newUnit, UNIT_TYPE_HERO)) then
        call SetHeroXP(newUnit, GetHeroXP(oldUnit), false)

        set index = 0
        loop
            set indexItem = UnitItemInSlot(oldUnit, index)
            if (indexItem != null) then
                call UnitRemoveItem(oldUnit, indexItem)
                call UnitAddItem(newUnit, indexItem)
            endif

            set index = index + 1
            exitwhen index >= bj_MAX_INVENTORY
        endloop
    endif

    // Remove or kill the original unit.  It is sometimes unsafe to remove
    // hidden units, so kill the original unit if it was previously hidden.
    if wasHidden then
        call KillUnit(oldUnit)
        call RemoveUnit(oldUnit)
    else
        call RemoveUnit(oldUnit)
    endif

    set bj_lastReplacedUnit = newUnit
    return newUnit
endfunction
Ну и отдельный тип бж функций, которые просто бесполезны, вроде DoNothing, ChooseRandomCreepBJ, ChooseRandomItemBJ, CopySaveGameBJ и т.д., где тупо добавили BJ в конце

А то исправлю 90 % красноты от карты и еще что ни будь не так будет?
Всё что может пойти не так - твоя криворукость и невнимательность
Загруженные файлы
28

» WarCraft 3 / Утечка function PlaySound takes string soundName returns nothing

Если звук у тебя позиционный, то можно юзать какую-то там абилку со звуком через даммикаст, оно вроде не утечно

28

» WarCraft 3 / Утечка function PlaySound takes string soundName returns nothing

Я посмотрел, у меня тоже утекает это, что бы я не делал, хотя утекает до определённого момента, но наверное это уже баг счётчика
Попробуй этот вариант

PT153, из-за local sound
раскрыть
function PlaySound takes string soundName returns nothing
    local sound soundHandle = CreateSound(soundName, false, false, true, 12700, 12700, "")
    call StartSound(soundHandle)
    call KillSoundWhenDone(soundHandle)
endfunction

private void AddSound(string s, real x, real y, real z, int vol, real cutoff){
        sound snd = CreateSound(s, false, true, true, 10, 10, "SpellsEAX")
        SetSoundChannel(snd, 5)
        SetSoundVolume(snd, vol)
        SetSoundPitch(snd, 1)
        SetSoundDistances(snd, 600., 10000.)
        SetSoundDistanceCutoff(snd, cutoff)
        SetSoundConeAngles(snd, 0.0, 0.0, 127)
        SetSoundConeOrientation(snd, 0.0, 0.0, 0.0)
        SetSoundPosition(snd, x, y, z)
        SetSoundPlayPosition(snd, 1000)
        StartSound(snd)
        KillSoundWhenDone(snd)
        snd = null
    }
28

» WarCraft 3 / Чем заменить CreateNUnitsAtLoc

Координаты не утечны в отличии от точек и предположительно быстрее
28

» WarCraft 3 / Утечка function PlaySound takes string soundName returns nothing

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

» WarCraft 3 / Чем заменить CreateNUnitsAtLoc

как правильно написать, чтобы в указанной точке появился юнит?
На примере с позицией юнита
local unit u = GetTriggerUnit()
local real x = GetUnitX(u)
local real y = GetUnitY(u)
set bj_lastCreatedUnit = CreateUnit(GetOwningPlayer(u),'u000',x,y,GetUnitFacing(u))
Создаст какого-то там юнита в позиции юнита триггера
28

» WarCraft 3 / Чем заменить CreateNUnitsAtLoc

Если тебе под зарез нужно через точку создать юнита, то используй
native CreateUnitAtLoc takes player id, integer unitid, location whichLocation, real face returns unit
но пора бы и на координаты перейти)
28

» WarCraft 3 / Утечка function PlaySound takes string soundName returns nothing

SсRealm, смешно наверное самому придумывать названия нативных функций?)
Посмотри Function List используя ключевые слова, например Sound

К тому же
local sound u
call PlaySoundBJ( gg_snd_AltarOfKingsWhat1 )
set u = bj_lastPlayedSound
call : destroy u
Зачем создавать локалку, если можно сразу уничтожать bj_lastPlayedSound. В таких действиях нет смысла

А, и в ошибке вроде указывается проблема, там минимальные знания английского, например, что такой функции не существует
28

» WarCraft 3 / Вопрос от Вдохновленного Нативками Трггерщика

Почитал о редакторе чутка и нашел эту строчку
совместимость с JNGP (т.к. данный редактор является основной надстройки);
Так что можешь возвращаться на джнгп если что, хотя в этом нет необходимости

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

без этих библиотек естевстенно работать не будет
Работать будет, потому что, как и указал PT153, подключаемые библиотеки это cjass, который, судя по всему, уже используется в твоём редакторе)
28

» WarCraft 3 / WarCraft 3 Как создать предмет без цели наведения

po1son, какая-то ерунда))
Ему не спецэффект нужен, а чтобы при нажатии на предмет не нужно было выбирать цель, чтобы повесить бафф, чтобы целью сразу становится кастующий. Другое, у тебя уже есть утечка, ты повешал эффект, а удалять его кто будет? + триггер низя выключать, предмет же вряд ли один раз заюзается в игре

Вот пример, у предмета способность-пустышка (канал), при касте которой вызывается дамми юнит и накладывает духовное пламя на кастера

перезарядка может быть любая и предмет может заканчиваться, ничего крашиться не должно и утечек нет)
Загруженные файлы