18

» WarCraft 3 / I2H как сконвертировать

Это делается только при помощи RB, тем более такое давно не актуально (после версии 1.24 невозможно (почти)).
Т.к хештаблица и хендлы имеют лучшую эффективность
18

» WarCraft 3 / Пара вопросов.

Примитивный прыжок в любую точку, чем дальше - тем выше прыгает.
Мини библиотека
library Jump

    globals
        private hashtable h    = InitHashtable()
        private real jumpSpeed = 400.00
    endglobals
    
    
    private function JumpMove takes nothing returns nothing
    
        local timer t         = GetExpiredTimer()
        local unit u          = LoadUnitHandle(  h, GetHandleId( t ), StringHash("unit")  )
        local location uLoc   = LoadLocationHandle(  h, GetHandleId( t ), StringHash("point")  )
        local real length     = LoadReal(  h, GetHandleId( t ), StringHash("length")  )
        local real angle      = LoadReal(  h, GetHandleId( t ), StringHash("angle")  )
        local location finish = LoadLocationHandle(  h, GetHandleId( t ), StringHash("finish")  )
        local real newX       = GetLocationX(uLoc) + jumpSpeed*0.03 * Cos(angle * bj_DEGTORAD)
        local real newY       = GetLocationY(uLoc) + jumpSpeed*0.03 * Sin(angle * bj_DEGTORAD)
        local real dx         = GetLocationX(finish) - GetLocationX(uLoc)
        local real dy         = GetLocationY(finish) - GetLocationY(uLoc)
        local real distance   = SquareRoot(dx * dx + dy * dy)
        local real time       = LoadReal(  h, GetHandleId( t ), StringHash("time")  )
        
        set time = time - 0.03
        call SaveReal(  h, GetHandleId( t ), StringHash("time"), time  )
        call MoveLocation(  uLoc, newX, newY  )
        call SetUnitPositionLoc(  u, uLoc  )
        call SetUnitFacing(  u, angle  )
        if(  length - distance <= length/2  ) then
            call SetUnitFlyHeight(  u, length - distance, 0.00  )
        else
            call SetUnitFlyHeight(  u, distance, 0.00  )
        endif
        if(  time <= 0.00  ) then
            call DestroyEffect( AddSpecialEffectLoc("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", uLoc) )
            call SetUnitFlyHeight(  u, 0.00, 0.00  )
            call UnitRemoveAbility(  u, 'Amrf'  )
            call SetUnitInvulnerable(  u, false  )
            call PauseUnit(  u, false  )
            call FlushChildHashtable(  h, GetHandleId( t )  )
            call DestroyTimer( t )
            call RemoveLocation( uLoc )
            call RemoveLocation( finish )
        endif
        
        set t        = null
        set u        = null
        set uLoc     = null
        set length   = 0
        set angle    = 0
        set finish   = null
        set newX     = 0
        set newY     = 0
        set dx       = 0
        set dy       = 0
        set distance = 0
        set time     = 0
        
    endfunction
    
    function Jump takes unit ForUnit, location loc returns nothing
    
        local timer t    = CreateTimer()
        local location p = GetUnitLoc( ForUnit )
        local real dx    = GetLocationX( loc ) - GetLocationX( p )
        local real dy    = GetLocationY( loc ) - GetLocationY( p )
        
        call IssueImmediateOrder(  ForUnit, "stop"  )
        call UnitAddAbility(  ForUnit, 'Amrf'  )
        call SaveLocationHandle(  h, GetHandleId( t ), StringHash("finish"), loc  )
        call SaveLocationHandle(  h, GetHandleId( t ), StringHash("point"), p  )
        call SaveReal(  h, GetHandleId( t ), StringHash("length"), SquareRoot( dx * dx + dy * dy )  )
        call SaveReal(  h, GetHandleId( t ), StringHash("angle"), bj_RADTODEG * Atan2(GetLocationY(loc) - GetLocationY(p), GetLocationX(loc) - GetLocationX(p))  )
        call SaveReal(  h, GetHandleId( t ), StringHash("time"), LoadReal( h, GetHandleId( t ), StringHash("length") )/jumpSpeed  )
        call SaveUnitHandle(  h, GetHandleId( t ), StringHash("unit"), ForUnit  )
        call SetUnitInvulnerable(  ForUnit, true  )
        call PauseUnit(  ForUnit, true  )
        
        call TimerStart(  t, 0.03, true, function JumpMove  )
        
        set t  = null
        set p  = null
        set dx = 0
        set dy = 0
        
    endfunction
    
    
endlibrary
Ну и карта пример с прыгающим мк
Если пошаманить, то можно настроить даже под пинок, там просто надо в функцию передать юнита и точку куда он полетит
Загруженные файлы
18

» WarCraft 3 / Фича

Последний аргумент это время затухания интерфейса (портрета юнита, хз), т.е interfaceFadeTime
18

» WarCraft 3 / Очередные вопросы по оптимизации

Ты в function speech5 не удалил таймер
Вставь туда это:
call DestroyTimer( GetExpiredTimer() )
18

» WarCraft 3 / Пара вопросов.

Такое только на Jass делается.
+ для работы с такими вещами лучше качай улучшенный редактор JassNewGenPack (JNGP)
18

» WarCraft 3 / Требование маны у пассивн способности

Переименовывать способность никак, зато можно сделать две абилки с разным описанием/названием и т.д.
Менять их (удалять/добавлять юниту)
Для этого и GUI сгодится
18

» WarCraft 3 / вызов функций

function Vrag takes nothing returns boolean
     return ( IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(udg_TrigerUnitMass[Index])) == true )
endfunction

//Действие
//Это boolexpr, поэтому надо через "function название функции" без скобок
//+ не забудь потом очистить и удалить группу перед тем как снова вызовешь GetUnitsInRangeOfLocMatching
set udg_Otrat = GetUnitsInRangeOfLocMatching(r, udg_Move1, function Vrag)
18

» WarCraft 3 / вызов функций

Если что то возвращает - значит это функция. Если не возвращает - процедура.
И функцию и процедуру можно вызвать через call название функции (аргументы)
Ну или через ExecuteFunc в качестве аргумента у ExecuteFunc идёт название функции в виде строки
Там где скобки - это аргументы которые идут через запятую, если их нету то просто ()
Возвращаемое функцией можно использовать примерно так:
function compare takes integer first, integer second returns boolean
     //Здесь будут сравниваться целочисленные first и second
     //Вернет true если first будет больше second
     //Вернет false если first будет меньше second
     return (first > second)
endfunction

function my_fync takes nothing returns nothing
     local boolean b = compare(1, 2)
     if( b == true ) then
          call BJDebugMsg("true")
     else
          call BJDebugMsg("false")
     endif
endfunction
18

» WarCraft 3 / ИИ

w3o это информация о игровых обьектах (юниты, абилки, предметы и т.д). Для импорта ai нужно зайти в редактор ИИ (F8)
18

» WarCraft 3 / Execut

prog
всё равно там глобальная точка, если уж это начать переделывать, то и всю наработку тогда переделывать
18

» WarCraft 3 / Execut

prog
в системах перемещения лучше юзать точки, аккуратно юзать. Благодаря точкам юнит если что не улетит за пределы карты
18

» WarCraft 3 / Execut

prog
давай тогда уже всю наработку будем переделывать)
18

» WarCraft 3 / Execut

MATRITSA
вот это кинь в кастом код карты и вызывай через call Stan3()
function Stan3 takes nothing returns nothing
     local unit u = CreateUnitAtLoc( GetOwningPlayer(udg_TrigerUnit), 'h019', udg_Move1, 0.00 )
     call UnitAddAbilityBJ( 'A00J', u )
     call IssueImmediateOrder( u, "stomp" )
     call UnitApplyTimedLifeBJ( 0.01, 'BTLF', u )
     call RemoveLocation(udg_Move1)
     set u =null
endfunction
18

» WarCraft 3 / Execut

MATRITSA
и че это за фигня, ты специально для вызова одной функции сделал триггер без ивентов?
До
function Trig_Stan3_Actions takes nothing returns nothing
local unit u = CreateUnitAtLoc( GetOwningPlayer(udg_TrigerUnit), 'h019', udg_Move1, 0.00 )
call UnitAddAbilityBJ( 'A00J', u )
call IssueImmediateOrder( u, "stomp" )
call UnitApplyTimedLifeBJ( 0.01, 'BTLF', u )
call RemoveLocation(udg_Move1)
set u =null
endfunction
===========================================================================
function InitTrig_Stan3 takes nothing returns nothing
set gg_trg_Stan3 = CreateTrigger( )
call TriggerAddAction( gg_trg_Stan3, function Trig_Stan3_Actions )
endfunction **
Оптимизировать можно запросто
После
function Stan3 takes nothing returns nothing
     local unit u = CreateUnitAtLoc( GetOwningPlayer(udg_TrigerUnit), 'h019', udg_Move1, 0.00 )
     call UnitAddAbilityBJ( 'A00J', u )
     call IssueImmediateOrder( u, "stomp" )
     call UnitApplyTimedLifeBJ( 0.01, 'BTLF', u )
     call RemoveLocation(udg_Move1)
     set u =null
endfunction
И вызывать через call Stan3()
18

» WarCraft 3 / Execut

MATRITSA
если не ошибаюсь, TriggerExecute запускает новый поток. А это здесь не нужно, лучше прямо вызвать функцию действий триггера
MATRITSA
блин, TriggerExecute это зло, для таких целей как у тебя лучше напрямую вызвать функцию действий триггера.
18

» WarCraft 3 / Execut

MATRITSA
попробуй поменять это
До
call TriggerExecute(gg_trg_Stan3)
на это
После
call Trig_Stan3_Actions()
18

» WarCraft 3 / Прыжок на гуи

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