Public Class BAEntityOscillateMove Inherits BattleAnimation3D Public StartPosition As Vector3 Public ReturnToStart As Vector3 Public TargetEntity As Entity Public HalfDistance As New Vector3(0.0F) Public DestinationDistance As New Vector3(0.0F) Public CurrentDistance As New Vector3(0.0F) Public MoveSpeed As Single Public MoveBothWays As Boolean = True Public MovementCurve As Integer = 0 Public RemoveEntityAfter As Boolean Public Duration As TimeSpan Public ReadyTime As Date Public ReadyAxis As New Vector3(0) Public InterpolationSpeed As Vector3 Public InterpolationDirection As Boolean = True Public Enum Curves As Integer Linear Smooth End Enum Public Sub New(ByRef Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal Distance As Vector3, ByVal Speed As Single, ByVal BothWays As Boolean, ByVal Duration As TimeSpan, ByVal startDelay As Single, ByVal endDelay As Single, Optional MovementCurve As Integer = 0, Optional ReturnToStart As Vector3 = Nothing) MyBase.New(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay) Me.RemoveEntityAfter = RemoveEntityAfter Me.HalfDistance = Distance Me.DestinationDistance = Me.HalfDistance Me.MoveSpeed = Speed Me.MoveBothWays = BothWays Me.Duration = Duration Me.MovementCurve = CType(MovementCurve, Curves) Me.Visible = False Me.TargetEntity = Entity Select Case MovementCurve Case Curves.Linear InterpolationSpeed = New Vector3(MoveSpeed) Case Curves.Smooth InterpolationSpeed = New Vector3(0.0F) End Select If ReturnToStart <> Nothing Then Me.ReturnToStart = ReturnToStart End If Me.AnimationType = AnimationTypes.Move End Sub Public Overrides Sub DoActionActive() Move() End Sub Private Sub Move() If StartPosition = Nothing Then StartPosition = TargetEntity.Position End If If ReadyTime = Nothing Then ReadyTime = Date.Now + Duration End If If MovementCurve = Curves.Smooth Then If InterpolationDirection = True Then If InterpolationSpeed.X < MoveSpeed Then InterpolationSpeed.X += MoveSpeed / 10 Else InterpolationSpeed.X = MoveSpeed End If If InterpolationSpeed.Y < MoveSpeed Then InterpolationSpeed.Y += MoveSpeed / 10 Else InterpolationSpeed.Y = MoveSpeed End If If InterpolationSpeed.Z < MoveSpeed Then InterpolationSpeed.Z += MoveSpeed / 10 Else InterpolationSpeed.Z = MoveSpeed End If Else If Date.Now < ReadyTime Then If InterpolationSpeed.X > 0 Then InterpolationSpeed.X -= MoveSpeed / 10 Else InterpolationSpeed.X = 0 End If If InterpolationSpeed.Y > 0 Then InterpolationSpeed.Y -= MoveSpeed / 10 Else InterpolationSpeed.Y = 0 End If If InterpolationSpeed.Z > 0 Then InterpolationSpeed.Z -= MoveSpeed / 10 Else InterpolationSpeed.Z = 0 End If Else If InterpolationSpeed.X > MoveSpeed / 10 * 3 Then InterpolationSpeed.X -= MoveSpeed / 10 Else InterpolationSpeed.X = MoveSpeed / 10 * 3 End If If InterpolationSpeed.Y > MoveSpeed / 10 * 3 Then InterpolationSpeed.Y -= MoveSpeed / 10 Else InterpolationSpeed.Y = MoveSpeed / 10 * 3 End If If InterpolationSpeed.Z > MoveSpeed / 10 * 3 Then InterpolationSpeed.Z -= MoveSpeed / 10 Else InterpolationSpeed.Z = MoveSpeed / 10 * 3 End If End If End If End If If CurrentDistance.X <> DestinationDistance.X Then If CurrentDistance.X < DestinationDistance.X Then CurrentDistance.X += InterpolationSpeed.X Else CurrentDistance.X -= InterpolationSpeed.X End If If Math.Abs(CurrentDistance.X) / Math.Abs(HalfDistance.X) > 0.75F Then InterpolationDirection = False End If If DestinationDistance.X > 0.0F Then If CurrentDistance.X >= DestinationDistance.X Then CurrentDistance.X = DestinationDistance.X End If ElseIf DestinationDistance.x < 0.0F Then If CurrentDistance.X <= DestinationDistance.X Then CurrentDistance.X = DestinationDistance.X End If Else If CurrentDistance.X > DestinationDistance.X Then If CurrentDistance.X - InterpolationSpeed.X <= DestinationDistance.X Then CurrentDistance.X = DestinationDistance.X End If Else If CurrentDistance.X + InterpolationSpeed.X >= DestinationDistance.X Then CurrentDistance.X = DestinationDistance.X End If End If End If Else If Date.Now < ReadyTime Then If MoveBothWays = True Then If DestinationDistance.X > 0.0F Then DestinationDistance.X = 0.0F - Math.Abs(HalfDistance.X) * 2 Else DestinationDistance.X = 0.0F + Math.Abs(HalfDistance.X) * 2 End If Else If DestinationDistance.X > 0.0F Then DestinationDistance.X = 0.0F Else DestinationDistance.X = HalfDistance.X End If End If InterpolationDirection = True Else If ReturnToStart.X = 0.0F Then ReadyAxis.X = 1.0F Else If DestinationDistance.X <> 0.0F Then DestinationDistance.X = 0.0F InterpolationDirection = True End If If CurrentDistance.X = 0.0F Then ReadyAxis.X = 1.0F End If End If End If End If If CurrentDistance.Y <> DestinationDistance.Y Then If CurrentDistance.Y < DestinationDistance.Y Then CurrentDistance.Y += InterpolationSpeed.Y Else CurrentDistance.Y -= InterpolationSpeed.Y End If If Math.Abs(CurrentDistance.Y) / Math.Abs(HalfDistance.Y) > 0.75F Then InterpolationDirection = False End If If DestinationDistance.Y > 0.0F Then If CurrentDistance.Y >= DestinationDistance.Y Then CurrentDistance.Y = DestinationDistance.Y End If ElseIf DestinationDistance.Y < 0.0F Then If CurrentDistance.Y <= DestinationDistance.Y Then CurrentDistance.Y = DestinationDistance.Y End If Else If CurrentDistance.Y > DestinationDistance.Y Then If CurrentDistance.Y - InterpolationSpeed.Y <= DestinationDistance.Y Then CurrentDistance.Y = DestinationDistance.Y End If Else If CurrentDistance.Y + InterpolationSpeed.Y >= DestinationDistance.Y Then CurrentDistance.Y = DestinationDistance.Y End If End If End If Else If Date.Now < ReadyTime Then If MoveBothWays = True Then If DestinationDistance.Y > 0.0F Then DestinationDistance.Y = 0.0F - Math.Abs(HalfDistance.Y) * 2 Else DestinationDistance.Y = 0.0F + Math.Abs(HalfDistance.Y) * 2 End If Else If DestinationDistance.Y > 0.0F Then DestinationDistance.Y = 0.0F Else DestinationDistance.Y = HalfDistance.Y End If End If InterpolationDirection = True Else If ReturnToStart.Y = 0.0F Then ReadyAxis.Y = 1.0F Else If DestinationDistance.Y <> 0.0F Then DestinationDistance.Y = 0.0F InterpolationDirection = True End If If CurrentDistance.Y = 0.0F Then ReadyAxis.Y = 1.0F End If End If End If End If If CurrentDistance.Z <> DestinationDistance.Z Then If CurrentDistance.Z < DestinationDistance.Z Then CurrentDistance.Z += InterpolationSpeed.Z Else CurrentDistance.Z -= InterpolationSpeed.Z End If If Math.Abs(CurrentDistance.Y) / Math.Abs(HalfDistance.Y) > 0.75F Then InterpolationDirection = False End If If DestinationDistance.Z > 0.0F Then If CurrentDistance.Z >= DestinationDistance.Z Then CurrentDistance.Z = DestinationDistance.Z End If ElseIf DestinationDistance.z < 0.0F Then If CurrentDistance.Z <= DestinationDistance.Z Then CurrentDistance.Z = DestinationDistance.Z End If Else If CurrentDistance.Z > DestinationDistance.Z Then If CurrentDistance.Z - InterpolationSpeed.Z <= DestinationDistance.Z Then CurrentDistance.Z = DestinationDistance.Z End If Else If CurrentDistance.Z + InterpolationSpeed.Z >= DestinationDistance.Z Then CurrentDistance.Z = DestinationDistance.Z End If End If End If Else If Date.Now < ReadyTime Then If MoveBothWays = True Then If DestinationDistance.Z > 0.0F Then DestinationDistance.Z = 0.0F - Math.Abs(HalfDistance.Z) * 2 Else DestinationDistance.Z = 0.0F + Math.Abs(HalfDistance.Z) * 2 End If Else If DestinationDistance.Z > 0.0F Then DestinationDistance.Z = 0.0F Else DestinationDistance.Z = HalfDistance.Z End If End If InterpolationDirection = True Else If ReturnToStart.Z = 0.0F Then ReadyAxis.Z = 1.0F Else If DestinationDistance.Z <> 0.0F Then DestinationDistance.Z = 0.0F InterpolationDirection = True End If If CurrentDistance.Z = 0.0F Then ReadyAxis.Z = 1.0F End If End If End If End If If HalfDistance.X <> 0.0F Then TargetEntity.Position.X = StartPosition.X + Me.CurrentDistance.X Else ReadyAxis.X = 1.0F End If If HalfDistance.Y <> 0.0F Then TargetEntity.Position.Y = StartPosition.Y + Me.CurrentDistance.Y Else ReadyAxis.Y = 1.0F End If If HalfDistance.Z <> 0.0F Then TargetEntity.Position.Z = StartPosition.Z + Me.CurrentDistance.Z Else ReadyAxis.Z = 1.0F End If If Date.Now > ReadyTime AndAlso ReadyAxis.X = 1.0F AndAlso ReadyAxis.Y = 1.0F AndAlso ReadyAxis.Z = 1.0F Then Me.Ready = True End If End Sub Public Overrides Sub DoRemoveEntity() If Me.RemoveEntityAfter = True Then TargetEntity.CanBeRemoved = True End If End Sub End Class