Это делается только при помощи RB, тем более такое давно не актуально (после версии 1.24 невозможно (почти)).
Т.к хештаблица и хендлы имеют лучшую эффективность
Примитивный прыжок в любую точку, чем дальше - тем выше прыгает.
Мини библиотека
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
Переименовывать способность никак, зато можно сделать две абилки с разным описанием/названием и т.д.
Менять их (удалять/добавлять юниту) Для этого и GUI сгодится
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)
Если что то возвращает - значит это функция. Если не возвращает - процедура.
И функцию и процедуру можно вызвать через 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
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
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
MATRITSA
если не ошибаюсь, TriggerExecute запускает новый поток. А это здесь не нужно, лучше прямо вызвать функцию действий триггера MATRITSA
блин, TriggerExecute это зло, для таких целей как у тебя лучше напрямую вызвать функцию действий триггера.
quq_CCCP
Ой ну зачем такой геморрой лишний, аккуратно на точках сделать и всё будет шикарно.
Тем более не такая уж и сложная наработка у него, поэтому тут тупо судить о производительности.
» WarCraft 3 / I2H как сконвертировать
Он хочет получить указатель на юнита юзая хендл в виде integer
Ред. Hodor
» WarCraft 3 / I2H как сконвертировать
Т.к хештаблица и хендлы имеют лучшую эффективность
» WarCraft 3 / Пара вопросов.
» WarCraft 3 / Фича
» WarCraft 3 / Очередные вопросы по оптимизации
Вставь туда это:
» WarCraft 3 / Очередные вопросы по оптимизации
Ред. Hodor
» WarCraft 3 / Требование маны у пассивн способности
Триггерно отловить событие и убить героя/юнита
Ред. Hodor
» WarCraft 3 / Пара вопросов.
+ для работы с такими вещами лучше качай улучшенный редактор JassNewGenPack (JNGP)
Ред. Hodor
» WarCraft 3 / Требование маны у пассивн способности
Менять их (удалять/добавлять юниту)
Для этого и GUI сгодится
Ред. Hodor
» WarCraft 3 / вызов функций
» WarCraft 3 / вызов функций
это как? В аргументе boolean, а возвращает что?
Ред. Hodor
» WarCraft 3 / вызов функций
И функцию и процедуру можно вызвать через call название функции (аргументы)
Ну или через ExecuteFunc в качестве аргумента у ExecuteFunc идёт название функции в виде строки
Там где скобки - это аргументы которые идут через запятую, если их нету то просто ()
Возвращаемое функцией можно использовать примерно так:
Ред. Hodor
» WarCraft 3 / ИИ
» WarCraft 3 / Execut
всё равно там глобальная точка, если уж это начать переделывать, то и всю наработку тогда переделывать
» WarCraft 3 / Execut
в системах перемещения лучше юзать точки, аккуратно юзать. Благодаря точкам юнит если что не улетит за пределы карты
Ред. Hodor
» WarCraft 3 / Execut
давай тогда уже всю наработку будем переделывать)
» WarCraft 3 / Execut
вот сюда нажимаешь
» WarCraft 3 / Execut
в кастом код карты кинул эту функцию?
Ред. Hodor
» WarCraft 3 / Execut
вот это кинь в кастом код карты и вызывай через call Stan3()
Ред. Hodor
» WarCraft 3 / Execut
и че это за фигня, ты специально для вызова одной функции сделал триггер без ивентов?
» WarCraft 3 / Execut
если не ошибаюсь, TriggerExecute запускает новый поток. А это здесь не нужно, лучше прямо вызвать функцию действий триггера
MATRITSA
блин, TriggerExecute это зло, для таких целей как у тебя лучше напрямую вызвать функцию действий триггера.
» WarCraft 3 / Execut
попробуй поменять это
» WarCraft 3 / Execut
сбивает значение какой глобальной?
» WarCraft 3 / Execut
Ред. Hodor
» WarCraft 3 / Прыжок на гуи
Ой ну зачем такой геморрой лишний, аккуратно на точках сделать и всё будет шикарно.
Тем более не такая уж и сложная наработка у него, поэтому тут тупо судить о производительности.