call BlzSetSpecialEffectZ(sEff, GetRandomInt(150,600))
call BlzSetSpecialEffectX(sEff,GetUnitX(sCaster))
call BlzSetSpecialEffectY(sEff,GetUnitY(sCaster))
call BlzSetSpecialEffectX(sEff,GetUnitX(sCaster))
call BlzSetSpecialEffectY(sEff,GetUnitY(sCaster))
Почему то высота не меняется, если убрать строчки
call BlzSetSpecialEffectX(sEff,GetUnitX(sCaster))
call BlzSetSpecialEffectY(sEff,GetUnitY(sCaster))
call BlzSetSpecialEffectX(sEff,GetUnitX(sCaster))
call BlzSetSpecialEffectY(sEff,GetUnitY(sCaster))
то всё работает...что за фигня, почему это конфликтует? или как это понимать
В кратце что б понимать что происходит, абилка на основе иммолейта, активируешь если двигаешься высераются огненные лепёшки под героем, эффект огненной ловушки боковой крепиться должен по высоте и xy героя в периодике с нужным поворотом что б сзади горело ))). Повторюсь, если убрать xy высота работает (для примера в коде я тестировал просто random высоту после того как понял что проблемы)
scope RocketBoots
/* ---------------------- ABILITY ------------------------------------------ */
/* -------------------------------------------------------------------------- */
globals
private constant integer MOVE_SPEED_BONUS = 'A0FF'
private constant integer ABILITY = 'A014'
endglobals
/* -------------------------------------------------------------------------- */
/* System */
/* -------------------------------------------------------------------------- */
private struct RocketBoots
timer sTimer = null
unit sCaster = null
effect sEff = null
real curX = 0
real curY = 0
real prevX = 0
real prevY = 0
real spam = 0
real sManaDrainPeriod = 0
private static method onPeriod takes nothing returns nothing
local thistype this = GetTimerData(GetExpiredTimer())
local real damage
local unit u
local real bonus = GetHeroInt(sCaster, true)* (0.50+( 0.25*GetUnitAbilityLevel(sCaster,ABILITY) ))
if GetUnitAbilityLevel(sCaster, 'B002') > 0 and UnitAlive(sCaster) then
set sManaDrainPeriod = sManaDrainPeriod + 0.01
if sManaDrainPeriod >= 0.25 then
call AddUnitMana(sCaster, -1*(GetUnitState(sCaster,UNIT_STATE_MAX_MANA)/100*2.) )
set sManaDrainPeriod = 0
endif
//---------------------
set prevX = curX
set prevY = curY
set curX = GetUnitX(sCaster)
set curY = GetUnitY(sCaster)
if prevX != curX or prevY != curY then
set spam = spam + DistanceBetweenCoordinates(prevX,prevY,curX,curY)
endif
if spam >= 40 then
set u = CreateUnit(GetOwningPlayer(sCaster),'h011',curX,curY, 0 )
call UnitApplyTimedLife(u,'BTLF',10)
call SetUnitPathing(u,false)
call BlzSetAbilityRealFieldBJ( BlzGetUnitAbility(u, 'A015'), ABILITY_RF_ARF_MISSILE_ARC, (BlzGetAbilityRealField(BlzGetUnitAbility(u, 'A015'), ABILITY_RF_ARF_MISSILE_ARC) + bonus ) )
set spam = 0
endif
//------------
call BlzSetSpecialEffectYaw(sEff, (GetUnitFacing(sCaster)+90)*bj_DEGTORAD)
call BlzSetSpecialEffectZ(sEff, GetRandomInt(150,600))
call BlzSetSpecialEffectX(sEff,GetUnitX(sCaster)) <-----убираем и работает
call BlzSetSpecialEffectY(sEff,GetUnitY(sCaster)) <-----убираем и работает
else
call BlzStartUnitAbilityCooldown( sCaster, ABILITY, 30 )
call DisarmUnit(sCaster,false)
call UnitRemoveAbility(sCaster, MOVE_SPEED_BONUS)
call DestroyEffect(sEff)
set sEff = null
call ReleaseTimer(sTimer)
call deallocate()
set sTimer = null
set sCaster = null
endif
set u = null
endmethod
private static method onOrder takes nothing returns nothing
local unit caster = GetOrderedUnit()
local thistype this
if GetIssuedOrderId() == 852177 then
set this = thistype.allocate()
set sTimer = NewTimerEx(this)
set sCaster = caster
set curX = GetUnitX(sCaster)
set curY = GetUnitY(sCaster)
set sEff = AddSpecialEffectEx("Doodads\\Cinematic\\FireTrapSide\\FireTrapSide", curX , curY, 0, 1.2)
call BlzSetSpecialEffectYaw(sEff, (GetUnitFacing(caster)+90)*bj_DEGTORAD)
call BlzSetSpecialEffectTimeScale(sEff,5)
call BlzSetSpecialEffectScale(sEff,0.75)
call DisarmUnit(caster,true)
call UnitAddAbilityP( caster,MOVE_SPEED_BONUS)
call TimerStart(sTimer, 0.01, true, function thistype.onPeriod)
endif
set caster = null
endmethod
static method onInit takes nothing returns nothing
call RegisterPlayerUnitEvent(EVENT_PLAYER_UNIT_ISSUED_ORDER, function thistype.onOrder)
endmethod
endstruct
endscope
Принятый ответ
Нууу с виду всё норм, смотри тут как не странно важен порядок
Сначала делаешь XY
Потом делаешь Z
Потом делаешь специализированные операции типа scale/pitch/yaw
По крайне и в любом случае операции XY копеечные, вы ничего не потеряете, если буде их делать
AddSpecialEffectEx, самодельная?
Сначала делаешь XY
Потом делаешь Z
Потом делаешь специализированные операции типа scale/pitch/yaw
По крайне и в любом случае операции XY копеечные, вы ничего не потеряете, если буде их делать
AddSpecialEffectEx, самодельная?
Вообще эффект XY сбивают 90% scale/pitch/yaw, попробуйте разобраться с порядком
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Сначала делаешь XY
Потом делаешь Z
Потом делаешь специализированные операции типа scale/pitch/yaw
По крайне и в любом случае операции XY копеечные, вы ничего не потеряете, если буде их делать
AddSpecialEffectEx, самодельная?
Отредактирован EviLInside
Если что я пробовал со стандартной AddSpecialEffect, она не влияет никак на проблемы с высотой , это так к слову
Щас затестирую с порядком, отпишу что и как