Добавлен SNART
Используется система от MF_Andreich (та, что - plain jass). Проблема в том, что скорость анимации юнита не изменяется от замедляющих/ускоряющих баффов, пока зажата стрелка передвижения.
Код
//--------------------------------------------- Control System by MF v1.12 ---------------------------------------
// User-adjucted area
//
// This function takes a unit and returns boolean
// if it can move now. You can add your own conditions
// here to customize thу system.
function SCS_ConditionToMove takes unit u returns boolean
return (GetUnitState(u, UNIT_STATE_LIFE)>=0.45)and(GetUnitAbilityLevel(u, 'BSTN')==0)and(GetUnitAbilityLevel(u,'BPSE')==0)and(GetUnitAbilityLevel(u,'BUsl')==0)and(GetUnitAbilityLevel(u,'BUst')==0)and(GetUnitAbilityLevel(u,'BUim')==0)and(GetUnitAbilityLevel(u,'Bwea')==0)and(GetUnitAbilityLevel(u,'Bweb')==0)and(GetUnitAbilityLevel(u,'Bmlt')==0)
endfunction
// End of user-adjucted area
function SCS_UpUp_Func takes integer i returns nothing
set udg_SCS_Up[i] = false
if GetUnitState(udg_SCS_Units[i],UNIT_STATE_LIFE)>=0.45 then
call SetUnitTimeScale(udg_SCS_Units[i], 1)
call SetUnitAnimation(udg_SCS_Units[i], "stand")
endif
if(udg_SCS_Down[i])and(udg_SCS_Arround[i])then
set udg_SCS_FlagArround[i] = true
call SetUnitFacingTimed( udg_SCS_Units[i], (GetUnitFacing(udg_SCS_Units[i])+180), 0.01 )
endif
if udg_SCS_ResetFlag[i] then
set udg_SCS_ResetFlag[i] = false
if GetUnitState(udg_SCS_Units[i],UNIT_STATE_LIFE)>=0.45 and udg_SCS_ApplyControl[i] and udg_SCS_Anims[i]!=-1 then
call SetUnitAnimationByIndex(udg_SCS_Units[i],udg_SCS_Anims[i])
endif
if(not udg_SCS_Up[i])and(udg_SCS_Arround[i])then
call SetUnitTimeScale(udg_SCS_Units[i], GetUnitMoveSpeed(udg_SCS_Units[i])/GetUnitDefaultMoveSpeed(udg_SCS_Units[i]))
set udg_SCS_FlagArround[i] = true
call SetUnitFacingTimed( udg_SCS_Units[i], (GetUnitFacing(udg_SCS_Units[i])+180), 0 )
else
call SetUnitTimeScale(udg_SCS_Units[i], -GetUnitMoveSpeed(udg_SCS_Units[i])/GetUnitDefaultMoveSpeed(udg_SCS_Units[i]))
endif
endif
endfunction
function SCS_DownUp_Func takes integer i returns nothing
set udg_SCS_Down[i] = false
if GetUnitState(udg_SCS_Units[i],UNIT_STATE_LIFE)>=0.45 then
call SetUnitTimeScale(udg_SCS_Units[i], 1)
call SetUnitAnimation(udg_SCS_Units[i], "stand")
endif
if udg_SCS_FlagArround[i] then
set udg_SCS_FlagArround[i] = false
call SetUnitFacingTimed( udg_SCS_Units[i], (GetUnitFacing(udg_SCS_Units[i])+180), 0 )
endif
if udg_SCS_ResetFlag[i] then
set udg_SCS_ResetFlag[i] = false
if GetUnitState(udg_SCS_Units[i],UNIT_STATE_LIFE)>=0.45 and udg_SCS_ApplyControl[i] then
if(udg_SCS_Anims[i]!=-1)then
call SetUnitAnimationByIndex(udg_SCS_Units[i],udg_SCS_Anims[i])
endif
call SetUnitTimeScale(udg_SCS_Units[i], GetUnitMoveSpeed(udg_SCS_Units[i])/GetUnitDefaultMoveSpeed(udg_SCS_Units[i]))
endif
endif
endfunction
function SCS_LeftUp_Func takes integer i returns nothing
set udg_SCS_Left[i] = false
if (not udg_SCS_Up[i])and(not udg_SCS_Down[i]) then
call IssueImmediateOrder( udg_SCS_Units[i], "stop" )
endif
endfunction
function SCS_RightUp_Func takes integer i returns nothing
set udg_SCS_Right[i] = false
if (not udg_SCS_Up[i])and(not udg_SCS_Down[i]) then
call IssueImmediateOrder( udg_SCS_Units[i], "stop" )
endif
endfunction
function SCS_GetUnit takes player p returns unit
return udg_SCS_Units[GetPlayerId(p)]
endfunction
function SCS_RemoveAssociate takes player p returns nothing
set udg_SCS_Units[GetPlayerId(p)] = null
endfunction
function SCS_Associate takes unit u, player p, integer a, boolean b returns nothing
if(udg_SCS_Units[GetPlayerId(p)]!=null)then
call SetUnitTimeScale(udg_SCS_Units[GetPlayerId(p)],1)
call SetUnitAnimation(udg_SCS_Units[GetPlayerId(p)], "stand")
endif
set udg_SCS_Units[GetPlayerId(p)] = u
set udg_SCS_Anims[GetPlayerId(p)] = a
set udg_SCS_Arround[GetPlayerId(p)] = b
set udg_SCS_FlagArround[GetPlayerId(p)] = false
endfunction
function SCS_RemoveControlUnit takes player p returns nothing
call RemoveUnit(udg_SCS_Units[GetPlayerId(p)])
set udg_SCS_Units[GetPlayerId(p)] = null
endfunction
function SCS_SetControl takes player p, boolean b returns nothing
local integer i = GetPlayerId(p)
set udg_SCS_ApplyControl[i] = b
if not b then
call SCS_UpUp_Func(i)
call SCS_DownUp_Func(i)
call SCS_RightUp_Func(i)
call SCS_LeftUp_Func(i)
endif
endfunction
function SCS_SetCamera takes player p, boolean b returns nothing
set udg_SCS_ApplyCam[GetPlayerId(p)] = b
if(GetLocalPlayer()==p)then
if not b then
call ResetToGameCamera(0)
call CameraSetSmoothingFactor(0)
else
call SetCameraTargetController(udg_SCS_Units[GetPlayerId(p)],0,0,false)
call CameraSetSmoothingFactor(1)
endif
endif
endfunction
function SCS_GetControl takes player p returns boolean
return udg_SCS_ApplyControl[GetPlayerId(p)]
endfunction
function SCS_GetCamera takes player p returns boolean
return udg_SCS_ApplyCam[GetPlayerId(p)]
endfunction
function SCS_UpUp_Actions takes nothing returns nothing
local integer i = GetPlayerId(GetTriggerPlayer())
call SCS_UpUp_Func(i)
endfunction
function SCS_UpDown_Actions takes nothing returns nothing
local integer i = GetPlayerId(GetTriggerPlayer())
set udg_SCS_Up[i] = true
if GetUnitState(udg_SCS_Units[i],UNIT_STATE_LIFE)>=0.45 and udg_SCS_ApplyControl[i] then
if(udg_SCS_Anims[i]!=-1)then
call SetUnitAnimationByIndex(udg_SCS_Units[i],udg_SCS_Anims[i])
endif
call SetUnitTimeScale(udg_SCS_Units[i], GetUnitMoveSpeed(udg_SCS_Units[i])/GetUnitDefaultMoveSpeed(udg_SCS_Units[i]))
endif
endfunction
function SCS_DownUp_Actions takes nothing returns nothing
local integer i = GetPlayerId(GetTriggerPlayer())
call SCS_DownUp_Func(i)
endfunction
function SCS_DownDown_Actions takes nothing returns nothing
local integer i = GetPlayerId(GetTriggerPlayer())
set udg_SCS_Down[i] = true
if GetUnitState(udg_SCS_Units[i],UNIT_STATE_LIFE)>=0.45 and udg_SCS_ApplyControl[i] and udg_SCS_Anims[i]!=-1 then
call SetUnitAnimationByIndex(udg_SCS_Units[i],udg_SCS_Anims[i])
endif
if(not udg_SCS_Up[i])and(udg_SCS_Arround[i])then
call SetUnitTimeScale(udg_SCS_Units[i], GetUnitMoveSpeed(udg_SCS_Units[i])/GetUnitDefaultMoveSpeed(udg_SCS_Units[i]))
set udg_SCS_FlagArround[i] = true
call SetUnitFacingTimed( udg_SCS_Units[i], (GetUnitFacing(udg_SCS_Units[i])+180), 0 )
else
call SetUnitTimeScale(udg_SCS_Units[i], -GetUnitMoveSpeed(udg_SCS_Units[i])/GetUnitDefaultMoveSpeed(udg_SCS_Units[i]))
endif
endfunction
function SCS_RightUp_Actions takes nothing returns nothing
local integer i = GetPlayerId(GetTriggerPlayer())
call SCS_RightUp_Func(i)
endfunction
function SCS_RightDown_Actions takes nothing returns nothing
local integer i = GetPlayerId(GetTriggerPlayer())
set udg_SCS_Right[i] = true
endfunction
function SCS_LeftUp_Actions takes nothing returns nothing
local integer i = GetPlayerId(GetTriggerPlayer())
call SCS_LeftUp_Func(i)
endfunction
function SCS_LeftDown_Actions takes nothing returns nothing
local integer i = GetPlayerId(GetTriggerPlayer())
set udg_SCS_Left[i] = true
endfunction
function SCS_Move_Actions takes nothing returns nothing
local real X
local real Y
local real Xh
local real Yh
local boolean bx
local boolean by
local real Angle
local integer i = 0
local integer iflag = 0
local boolean bflag = false
loop
exitwhen i >= udg_SCS_COUNT_OF_PLAYERS
if (udg_SCS_Units[i] != null)and(udg_SCS_ApplyControl[i]) then
if udg_SCS_Up[i] and (not udg_SCS_Down[i]) and SCS_ConditionToMove(udg_SCS_Units[i]) then
set bflag = true
set iflag = 1
elseif (not udg_SCS_Up[i]) and udg_SCS_Down[i] and SCS_ConditionToMove(udg_SCS_Units[i]) then
set bflag = true
if(udg_SCS_FlagArround[i])then
set iflag = 1
else
set iflag = -1
endif
else
set bflag = false
endif
if bflag then
set Angle = GetUnitFacing(udg_SCS_Units[i])
set X = GetUnitX(udg_SCS_Units[i])+iflag*(GetUnitMoveSpeed(udg_SCS_Units[i])/100)*Cos(Angle*bj_DEGTORAD)
set Y = GetUnitY(udg_SCS_Units[i])+iflag*(GetUnitMoveSpeed(udg_SCS_Units[i])/100)*Sin(Angle*bj_DEGTORAD)
set Xh = GetUnitX(udg_SCS_Units[i])
set Yh = GetUnitY(udg_SCS_Units[i])
call SetUnitPosition(udg_SCS_Units[i],X,Y)
call ClearTextMessages()
if(RAbsBJ(GetUnitX(udg_SCS_Units[i])-X)>0.5)or(RAbsBJ(GetUnitY(udg_SCS_Units[i])-Y)>0.5)then
call SetUnitPosition(udg_SCS_Units[i],X,Yh)
set bx = RAbsBJ(GetUnitX(udg_SCS_Units[i])-X)<=0.5
call SetUnitPosition(udg_SCS_Units[i],Xh,Y)
set by = RAbsBJ(GetUnitY(udg_SCS_Units[i])-Y)<=0.5
if bx then
call SetUnitPosition(udg_SCS_Units[i],X,Yh)
elseif by then
call SetUnitPosition(udg_SCS_Units[i],Xh,Y)
else
call SetUnitPosition(udg_SCS_Units[i],Xh,Yh)
endif
endif
endif
if udg_SCS_Right[i] and (not udg_SCS_Left[i]) and SCS_ConditionToMove(udg_SCS_Units[i]) then
set bflag = true
set iflag = 1
elseif (not udg_SCS_Right[i]) and udg_SCS_Left[i] and SCS_ConditionToMove(udg_SCS_Units[i]) then
set bflag = true
set iflag = -1
else
set bflag = false
endif
if bflag then
if udg_SCS_Down[i] then
call SetUnitFacingTimed( udg_SCS_Units[i], (GetUnitFacing(udg_SCS_Units[i])+iflag*udg_SCS_INVERSE*(8.00)), 0.01 )
else
call SetUnitFacingTimed( udg_SCS_Units[i], (GetUnitFacing(udg_SCS_Units[i])-iflag*(8.00)), 0.01 )
endif
endif
endif
set i = i + 1
endloop
endfunction
function SCS_Animation_Actions takes nothing returns nothing
local integer i = 0
loop
exitwhen i >= udg_SCS_COUNT_OF_PLAYERS
if udg_SCS_Up[i] and udg_SCS_Down[i] and not udg_SCS_ResetFlag[i] then
set udg_SCS_ResetFlag[i] = true
call SetUnitAnimation(udg_SCS_Units[i],"stand")
endif
if not udg_SCS_ResetFlag[i] then
if (udg_SCS_Up[i] or udg_SCS_Down[i]) and SCS_ConditionToMove(udg_SCS_Units[i]) and udg_SCS_Anims[i]!=-1 then
call SetUnitAnimationByIndex(udg_SCS_Units[i],udg_SCS_Anims[i])
endif
endif
set i = i + 1
endloop
endfunction
function SCS_Camera_Actions takes nothing returns nothing
local integer i = 0
local real Z1
local real Z2
local real Angle1
local real offset
local real Angle2
loop
exitwhen i >= udg_SCS_COUNT_OF_PLAYERS
if (udg_SCS_Units[i] != null) and (udg_SCS_ApplyCam[i]) then
call MoveLocation(udg_SCS_l,GetUnitX(udg_SCS_Units[i]),GetUnitY(udg_SCS_Units[i]))
set Z1 = GetLocationZ(udg_SCS_l)
call MoveLocation(udg_SCS_l,GetUnitX(udg_SCS_Units[i])-400*Cos(GetUnitFacing(udg_SCS_Units[i])*bj_DEGTORAD),GetUnitY(udg_SCS_Units[i])-400*Sin(GetUnitFacing(udg_SCS_Units[i])*bj_DEGTORAD))
set Z2 = GetLocationZ(udg_SCS_l)
if(Z1+100>=Z2)then
set offset=GetCameraField(CAMERA_FIELD_ZOFFSET)+GetUnitFlyHeight(udg_SCS_Units[i])+300+Z1-GetCameraEyePositionZ()
set Angle1 = -15
else
set offset=R2I(GetCameraField(CAMERA_FIELD_ZOFFSET))+300+GetUnitFlyHeight(udg_SCS_Units[i])+Z2-R2I(GetCameraEyePositionZ())
set Angle1 = -50
endif
set Angle2 = GetUnitFacing(udg_SCS_Units[i])
if (udg_SCS_Down[i])and(not udg_SCS_Up[i])and(udg_SCS_Arround[i])then
set Angle2 = Angle2 + 180
endif
if(GetLocalPlayer()==Player(i))then
call SetCameraField(CAMERA_FIELD_ZOFFSET,offset,0.25)
call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE,450,0.25)
call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK,Angle1,0.25)
call SetCameraField(CAMERA_FIELD_FIELD_OF_VIEW,100,0.1)
call SetCameraField(CAMERA_FIELD_FARZ,bj_CAMERA_DEFAULT_FARZ,0.25)
call SetCameraField(CAMERA_FIELD_ROTATION,Angle2,0.25)
endif
endif
set i = i + 1
endloop
endfunction
function InitTrig_SCS_plain_jass takes nothing returns nothing
local integer Count = 0
//create triggers
local trigger UpDown = CreateTrigger( )
local trigger UpUp = CreateTrigger( )
local trigger DownDown = CreateTrigger( )
local trigger DownUp = CreateTrigger( )
local trigger RightDown = CreateTrigger( )
local trigger RightUp = CreateTrigger( )
local trigger LeftDown = CreateTrigger( )
local trigger LeftUp = CreateTrigger( )
set udg_SCS_l = Location(0,0)
//create events
loop
exitwhen Count>=udg_SCS_COUNT_OF_PLAYERS
call TriggerRegisterPlayerEvent(UpDown, Player(Count), EVENT_PLAYER_ARROW_UP_DOWN)
call TriggerRegisterPlayerEvent(UpUp, Player(Count), EVENT_PLAYER_ARROW_UP_UP)
call TriggerRegisterPlayerEvent(DownDown, Player(Count), EVENT_PLAYER_ARROW_DOWN_DOWN)
call TriggerRegisterPlayerEvent(DownUp, Player(Count), EVENT_PLAYER_ARROW_DOWN_UP)
call TriggerRegisterPlayerEvent(LeftDown, Player(Count), EVENT_PLAYER_ARROW_LEFT_DOWN)
call TriggerRegisterPlayerEvent(LeftUp, Player(Count), EVENT_PLAYER_ARROW_LEFT_UP)
call TriggerRegisterPlayerEvent(RightDown, Player(Count), EVENT_PLAYER_ARROW_RIGHT_DOWN)
call TriggerRegisterPlayerEvent(RightUp, Player(Count), EVENT_PLAYER_ARROW_RIGHT_UP)
set Count = Count + 1
endloop
//create actions
call TriggerAddAction( UpDown, function SCS_UpDown_Actions )
call TriggerAddAction( UpUp, function SCS_UpUp_Actions )
call TriggerAddAction( DownDown, function SCS_DownDown_Actions )
call TriggerAddAction( DownUp, function SCS_DownUp_Actions )
call TriggerAddAction( RightDown, function SCS_RightDown_Actions )
call TriggerAddAction( RightUp, function SCS_RightUp_Actions )
call TriggerAddAction( LeftDown, function SCS_LeftDown_Actions )
call TriggerAddAction( LeftUp, function SCS_LeftUp_Actions )
call TimerStart(CreateTimer(),0.01,true,function SCS_Move_Actions)
call TimerStart(CreateTimer(),0.2,true,function SCS_Animation_Actions)
call TimerStart(CreateTimer(),0.01,true,function SCS_Camera_Actions)
endfunction
//--------------------------------------------- End of Control System by MF v1.12 ---------------------------------------
Принятый ответ
Надо же. Не обладая знаниями Jass, в течении 3-х дней пыток, удалось разобраться.
Теперь скорость анимации может изменяется во время движения юнита.
+ независимые передняя и задняя скорости.
+ внешний контроль скоростей анимации, движения и поворота.
+ независимые передняя и задняя скорости.
+ внешний контроль скоростей анимации, движения и поворота.
Нехитрое дело, изменений не более ~0,5%.
раскрыть
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
вот оно ускорение шевеления юнита от его скорости, всё "нормально"
Отредактирован SNART
Отредактирован SNART
+ независимые передняя и задняя скорости.
+ внешний контроль скоростей анимации, движения и поворота.