Вопрос от Вдохновленного Нативками Трггерщика
Бывают в жизни такие случаи.
Вчера наконец то до меня дошло, что очень многие bj функции можно заменять нативками, ведь по сути они и отходят от родительских нативок и вся эта куча хлама лишний код ,который еще и виснет?(Верно)
И меня, как вдохновленного триггерщика теперь так и тянет везде где я только смогу это правильно написать заменять bj нативками.
Варику только легче и в мои глазах теперь все места в моей карте отмеченые
"красным клеймом bj" во прямо тянет исправлять
Да, уже заметил, что есть bj, которые нечем заменять и пусть они так и висят, но все таки, мне это ни чем не грозит? То есть варик же bj зачем то делал и не начнет ли он тупить, как обычно?
А то исправлю 90 % красноты от карты и еще что ни будь не так будет?



Views: 183

» Лучшие комментарии


map_maiker #2 - 3 months ago (изм. ) 1
Голосов: +2 / -1
который еще и виснет?(Верно)
Не то чтобы виснет... Утечек много.
но все таки, мне это ни чем не грозит? То есть варик же bj зачем то делал и не начнет ли он тупить, как обычно?
Как я понимаю, BJ для удобства сделаны и для триггеров (навскидку не помню чтобы в триггерах нативки были).
Например, есть нативка CreateUnit(), а действие создания юнитов включает как минимум количество юнитов и, вроде ещё что-то.
Или функции с точками. Точка - тип данных, хранящий координаты x и y, всё. Но во многих BJ эти точки не удаляются и утекают.

Ну то есть можно использовать нативки, все (вроде) BJ к ним и сводятся.
Но и BJ можно использовать. Главное - правильно.
PT153 #3 - 3 months ago (изм. ) 4
Голосов: +4 / -0
Бж нужно заменять в последнюю очередь, когда все утечки исправлены. В первую очередь нужно исправить утечки объектов. Во вторую утечку локальных переменных. У некоторых бж есть такая проблема - смотреть тут.
SсRealm #5 - 3 months ago 0
Голосов: +0 / -0
PT153:
Бж нужно заменять в последнюю очередь, когда все утечки исправлены. В первую очередь нужно исправить утечки объектов. Во вторую утечку локальных переменных. У некоторых бж есть такая проблема - смотреть тут.
Блин! Уже и плай саунд утечна! За что?!
function PlaySound takes string soundName returns nothing
rsfghd #6 - 3 months ago 2
Голосов: +2 / -0
В джнгп есть библиотека для замены бж функций на нативки, называется "cj_antibj_base"
Находится в JNGP -> AdicHelper -> lib -> cj_antibj_base. Можешь посмотреть что она там заменяет. Замена происходит с помощью дефайнов, по коду пробегается компилятор и заменяет такие-то значения на другие
Ну и подключается примерно так

От себя добавлю, что некоторые функции действительно очень странные и не понятно зачем созданы, например GetHandleIdBJ, GetPlayableMapRect и конечно же DoNothing))
Прикрепленные файлы
PT153 #7 - 3 months ago 0
Голосов: +0 / -0
rsfghd, для этого нужно включить cJass, который может делать нехорошие вещи.
rsfghd #8 - 3 months ago 0
Голосов: +0 / -0
PT153, да я не думаю что автор пользуется зинком или вджассом, проблем быть не должно
SсRealm #9 - 3 months ago 0
Голосов: +0 / -0
rsfghd:
PT153, да я не думаю что автор пользуется зинком или вджассом, проблем быть не должно
У автора вообще FNWE и на самом деле я пушистыми наворотами уже совсем не пользуюсь.
Верю я или не верю в затемнение, но карта начата была, когда то в этом редакторе и без этих библиотек естевстенно работать не будет.
v jass по умолчанию включен😒
Прикрепленные файлы
rsfghd #10 - 3 months ago (изм. ) 0
Голосов: +0 / -0
Почитал о редакторе чутка и нашел эту строчку
совместимость с JNGP (т.к. данный редактор является основной надстройки);
Так что можешь возвращаться на джнгп если что, хотя в этом нет необходимости

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

без этих библиотек естевстенно работать не будет
Работать будет, потому что, как и указал PT153, подключаемые библиотеки это cjass, который, судя по всему, уже используется в твоём редакторе)
rsfghd #11 - 3 months ago (изм. ) 0
Голосов: +0 / -0
Лан, я предполагаю автору недостаточно ответов выше, поэтому отвечаю на следующие вопросы

Да, уже заметил, что есть 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 % красноты от карты и еще что ни будь не так будет?
Всё что может пойти не так - твоя криворукость и невнимательность
Прикрепленные файлы