Спелл, который будет временно удваивать любое постепенное движение юнита (обычную ходьбу, толчки чем-то типа форстаффа и т. п. будут двигать его вдвое дальше).
Будет таймер с малым периодом.
Будет запоминать X и Y юнита и возвращать их определенный период.
Будут такие переменные:
u5 - юнит, доставаться из хэндла
x2 - возвращенная СТАРАЯ координата юнита X из хэндла
y2 - возвращенная СТАРАЯ координата юнита Y из хэндла
local real x = GetUnitX(u5)
local real y = GetUnitY(u5)
local real x3
local real y3
УДВОЕНИЕ ПОСТЕПЕННОГО СДВИЖЕНИЯ
...
УДВОЕНИЕ ПОСТЕПЕННОГО СДВИЖЕНИЯ - закрыто.
Вместо ... нужен код, который бы подсчитывал дистанцию между старыми координатами юнита и новыми и, если она больше 0, но меньше 200, определял вдвое дальше от дистанции в направлении сдвига новые координаты x3 и y3 сдвигал юнита на вдвое дальше в том же направлении. x3 и y3 для этих новых координат и нужны, на них юнит и должен попасть.
Потом в любом случае текущие координаты X и Y юнита, было сдвижение или нет, будут записываться в хэндл обратно и возвращаться как x2 и y2, и все по новой до завершения действия спелла. Все остальное я там самостоятельно сделаю.
Прошу помочь с написанием кода вместо ..., все необходимые переменные приведены выше, т. к. трудности, с точками не так давно работаю.

Принятый ответ

Это как без корня?
dx = x - x2
dy = y - y2
d2 = dx * dx + dy * dy
if (d2 < 40000) {
    x3 = x + dx
    y3 = y + dy
}

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
30
7 лет назад
Отредактирован Clamp
0
код, который бы подсчитывал дистанцию между старыми координатами юнита и новыми
Немного поизображаю DioD'а:
Теорема_Пифагора.

открыть после прочтения
Вообще, теорема Пифагора очень полезная штука, можно в любой мерности находить расстояния.
    float M_Distance(float x1, float y1, float z1, float x2, float y2, float z2) {
        float deltaX = x1 - x2
        float deltaY = y1 - y2
        float deltaZ = z1 - z2
        return SquareRoot(Pow(deltaX, 2) + Pow(deltaY, 2) + Pow(deltaZ, 2))
    }
Ещё советую почитать: Теорема_синусов.
Этот комментарий удален
0
14
7 лет назад
0
Если вы у мамы оптимизаторы можно обойтись без sqrt.
Ето как без корня?
2
30
7 лет назад
Отредактирован Clamp
2
Это как без корня?
dx = x - x2
dy = y - y2
d2 = dx * dx + dy * dy
if (d2 < 40000) {
    x3 = x + dx
    y3 = y + dy
}
Принятый ответ
0
14
7 лет назад
0
Так ты ниже должен использовать значение корня, а не только в условии
0
18
7 лет назад
0
Clamp, а разве он не войдет в рекурсию?
0
29
7 лет назад
0
В первом варианте кода d2 нигде не используется ниже.
0
30
7 лет назад
0
а разве он не войдет в рекурсию?
Ни одного цикла или вызова функции, каким образом там рекурсия закрутится?
0
18
7 лет назад
Отредактирован mishanka122
0
Clamp,
все по новой до завершения действия спелла.
т.е. по сути постоянная запись через таймерр в хендл
0
30
7 лет назад
0
0
21
7 лет назад
Отредактирован Кет
0
Ну всем спс, вот код, вроде все нормально (про флуш помню, но это сейчас шаблон, это если исправлять, то все потом вместе)
раскрыть
function SeizureFate2 takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, u7, p, enemies
local timer t = GetExpiredTimer()
local unit u5=LoadUnitHandle(udg_Hash,GetHandleId(t),2)
local unit u6=LoadUnitHandle(udg_Hash,GetHandleId(t),1)
local unit u7
local location p
local group enemies = CreateGroup()
local real damage = (GetUnitBaseDamage(u5) + GetUnitGreenBonusDamage(u5)) * 0.5 * (GetUnitAbilityLevelSwapped ('A282', u6))
local real x2 = LoadReal(udg_Hash,GetHandleId(t),4)
local real y2 = LoadReal(udg_Hash,GetHandleId(t),5)
local integer i = LoadInteger(udg_Hash,GetHandleId(t),3)
local real x = GetUnitX(u5)
local real y = GetUnitY(u5)
local real x3 = 0
local real y3 = 0
local real dx = 0
local real dy = 0
local real d = 0
local real d2 = 0
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО

set i = i+1
call SaveInteger(udg_Hash,GetHandleId(t),3,i)

//ОБСЧЁТ И ПРИ НАДОБНОСТИ УДВОЕНИЕ ПОСТЕПЕННОГО ДВИЖЕНИЯ. ТУТ U5 ДВИЖЕТСЯ И ОТ ЕГО АТАКИ УРОН, А U6 КАСТЕР И ИСТОЧНИК УРОНА И С НЕГО ЛВЛ АБИЛЫ!
set dx = x - x2
set dy = y - y2
set d2 = dx * dx + dy * dy
if (d < 200) then
set x3 = x + dx
set y3 = y + dy
//Задание координат с проверкой на края карты.
if RectContainsCoords(bj_mapInitialPlayableArea,x3,y3) then
call SetUnitX (u5,x3)
call SetUnitY (u5,y3)
endif
//Задание координат c проверкой на края карты - закрыто.
endif
//ОБСЧЁТ И ПРИ НАДОБНОСТИ УДВОЕНИЕ ПОСТЕПЕННОГО ДВИЖЕНИЯ - ЗАКРЫТО.
call SaveReal(udg_Hash,GetHandleId(t),4,x3)
call SaveReal(udg_Hash,GetHandleId(t),5,y3)

if (i>74) then


//ЦВЕТОТЕГ РАЗМЕРА 14, ОКРАС СМ. ПЕЙНТ
call CreateTextTagUnitBJ( I2S(R2I(damage)), u5, 0, 14.00, 100.00, 70.00, 4.00, 0 )
call ConditionalTriggerExecute( gg_trg_floatingtext )
//ЦВЕТОТЕГ РАЗМЕРА 14 - ЗАКРЫТО.


//ГРУППА И ДЕЙСТВИЯ С НЕЙ

set p = GetUnitLoc(u5)
set enemies = GetUnitsInRangeOfLocAll(230.00,p)

loop
set u7=FirstOfGroup(enemies)
exitwhen u7==null
call GroupRemoveUnit(enemies,u7)
if ( ( IsUnitType((u7), UNIT_TYPE_ANCIENT) != true ) and ( IsUnitType((u7), UNIT_TYPE_STRUCTURE) != true ) and ( GetUnitAbilityLevelSwapped('Avul', u7) != 1 ) and (IsUnitAliveBJ(u7) == true )) and (IsUnitEnemy(u7,GetOwningPlayer(u6)) == true) then
call UnitDamageTargetBJ(u6,u7,damage,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_MAGIC)
endif    
endloop

//ГРУППА И ДЕЙСТВИЯ С НЕЙ - ЗАКРЫТО.

call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
call RemoveLocation (p)
endif

call DestroyGroup (enemies)


//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6, u7, p, enemies
set t = null
set u5 = null
set u6 = null
set u7 = null
set p = null
set enemies = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction



function SeizureFate takes nothing returns nothing
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
local timer t = CreateTimer()
local unit u6=GetTriggerUnit()
local unit u5=GetSpellTargetUnit()
local real x = GetUnitX(u5)
local real y = GetUnitY(u5)
local integer i = 0
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО

if  ( GetSpellAbilityId() == 'A282' )  then

    call AddSpecialEffectTargetUnitBJ( "chest", u5, "Vain1.mdl" )
   call ConditionalTriggerExecute( gg_trg_destroyspeceffect )
    call AddSpecialEffectTargetUnitBJ( "origin", u5, "Vain1.mdl" )
   call ConditionalTriggerExecute( gg_trg_destroyspeceffect )

call SaveUnitHandle(udg_Hash,GetHandleId(t),1,u6)
call SaveUnitHandle(udg_Hash,GetHandleId(t),2,u5)
call SaveInteger(udg_Hash,GetHandleId(t),3,i)
call SaveReal(udg_Hash,GetHandleId(t),4,x)
call SaveReal(udg_Hash,GetHandleId(t),5,y)
call TimerStart(t,0.04,true,function SeizureFate2)

else
call PauseTimer (t)
call DestroyTimer (t)
call FlushChildHashtable(udg_Hash,GetHandleId(t))
endif


//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ: t, u5, u6
set u5 = null
set u6 = null
set t = null
//ВНИМАНИЕ!!! ОБНУЛЯЕМЫЕ ПЕРЕМЕННЫЕ ЗДЕСЬ СПИСКОМ - НОВЫЙ ШАБЛОН СОВЕРШЕНСТВА, ВСЕ ТЕСТКАРТЫ БЕЗ ОНОГО БУДУТ УДАЛЕНЫ - ЗАКРЫТО
endfunction
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.