P3D-Legacy/P3D/Entites/Other/OwnPlayer.vb

225 lines
8.2 KiB
VB.net

Public Class OwnPlayer
Inherits Entity
Public Texture As Texture2D
Public SkinName As String = "Hilbert"
Dim lastRectangle As New Rectangle(0, 0, 0, 0)
Dim lastTexture As String = ""
Dim AnimationX As Integer = 1
Const AnimationDelayLength As Single = 1.1F
Dim AnimationDelay As Single = AnimationDelayLength
Public DoAnimation As Boolean = True
Public UsingGameJoltTexture As Boolean = False
Public Sub New(ByVal X As Single, ByVal Y As Single, ByVal Z As Single, ByVal Textures() As Texture2D, ByVal TextureID As String, ByVal Rotation As Integer, ByVal ActionValue As Integer, ByVal AdditionalValue As String, ByVal Name As String, ByVal ID As Integer)
MyBase.New(X, Y, Z, "OwnPlayer", Textures, {0, 0}, False, 0, New Vector3(1.0F), BaseModel.BillModel, 0, "", New Vector3(1.0F))
SetTexture(TextureID, True)
Me.NeedsUpdate = True
Me.CreateWorldEveryFrame = True
Me.DropUpdateUnlessDrawn = False
End Sub
Public Sub SetTexture(ByVal TextureID As String, ByVal UseGameJoltID As Boolean)
Me.SkinName = TextureID
Dim texturePath As String = "Textures\NPC\"
If TextureID.StartsWith("[POKEMON|N]") Or TextureID.StartsWith("[Pokémon|N]") Then
TextureID = TextureID.Remove(0, 11)
texturePath = "Pokemon\Overworld\Normal\"
ElseIf TextureID.StartsWith("[POKEMON|S]") Or TextureID.StartsWith("[Pokémon|S]") Then
TextureID = TextureID.Remove(0, 11)
texturePath = "Pokemon\Overworld\Shiny\"
End If
Dim PokemonAddition As String = ""
If StringHelper.IsNumeric(TextureID) And texturePath.StartsWith("Pokemon\Overworld\") Then
PokemonAddition = PokemonForms.GetDefaultOverworldSpriteAddition(CInt(TextureID))
End If
If Core.Player.IsGameJoltSave Then
If texturePath & TextureID & PokemonAddition = "Textures\NPC\" & GameJolt.Emblem.GetPlayerSpriteFile(GameJolt.Emblem.GetPlayerLevel(Core.GameJoltSave.Points), Core.GameJoltSave.GameJoltID, Core.GameJoltSave.Gender) Then
UseGameJoltID = True
End If
End If
If UseGameJoltID And Core.Player.IsGameJoltSave And GameJolt.API.LoggedIn AndAlso Not GameJolt.Emblem.GetOnlineSprite(Core.GameJoltSave.GameJoltID) Is Nothing Then
Logger.Debug("Change player texture to the online sprite.")
Me.Texture = GameJolt.Emblem.GetOnlineSprite(Core.GameJoltSave.GameJoltID)
UsingGameJoltTexture = True
Else
Logger.Debug("Change player texture to [" & texturePath & TextureID & PokemonAddition & "]")
Me.Texture = P3D.TextureManager.GetTexture(texturePath & TextureID & PokemonAddition)
UsingGameJoltTexture = False
End If
End Sub
Protected Overrides Function CalculateCameraDistance(CPosition As Vector3) As Single
Return MyBase.CalculateCameraDistance(CPosition) - 0.2F
End Function
Public Overrides Sub UpdateEntity()
If Not Core.CurrentScreen Is Nothing Then
If Core.CurrentScreen.Identification = Screen.Identifications.OverworldScreen Then
If Screen.Camera.Name = "Overworld" Then
Dim c As OverworldCamera = CType(Screen.Camera, OverworldCamera)
Me.Position = New Vector3(c.Position.X, c.Position.Y - 0.1F, c.Position.Z)
End If
End If
If Me.Rotation.Y <> Screen.Camera.Yaw Then
Me.Rotation.Y = Screen.Camera.Yaw
End If
End If
Move()
ChangeTexture()
MyBase.UpdateEntity()
End Sub
Private Sub Move()
If (Screen.Camera.IsMoving() = True And Me.DoAnimation = True) OrElse (Screen.Level.OwnPlayer IsNot Nothing AndAlso Screen.Level.OwnPlayer.isDancing) Then
Me.AnimationDelay -= 0.13F
If AnimationDelay <= 0.0F Then
AnimationDelay = GetAnimationDelay()
AnimationX += 1
If AnimationX > 4 Then
AnimationX = 1
End If
End If
Else
AnimationX = 1
AnimationDelay = GetAnimationDelay()
ChangeTexture()
End If
End Sub
Public Sub ChangeTexture()
If Me.Texture IsNot Nothing Then
Dim r As New Rectangle(0, 0, 0, 0)
Dim cameraRotation As Integer = 0
Dim spriteIndex As Integer = 0
spriteIndex = 0
If Screen.Camera.Name = "Overworld" Then
spriteIndex = Screen.Camera.GetPlayerFacingDirection() - Screen.Camera.GetFacingDirection()
While spriteIndex > 3
spriteIndex -= 4
End While
While spriteIndex < 0
spriteIndex += 4
End While
End If
Dim frameSize As New Size(CInt(Me.Texture.Width / 3), CInt(Me.Texture.Height / 4))
If Me.Texture.Width = Me.Texture.Height / 2 Then
frameSize.Width = CInt(Me.Texture.Width / 2)
ElseIf Me.Texture.Width = Me.Texture.Height Then
frameSize.Width = CInt(Me.Texture.Width / 4)
Else
frameSize.Width = CInt(Me.Texture.Width / 3)
End If
Dim x As Integer = 0
If Screen.Camera.IsMoving() = True Then
x = GetAnimationX() * frameSize.Width
End If
r = New Rectangle(x, frameSize.Width * spriteIndex, frameSize.Width, frameSize.Height)
If r <> lastRectangle Or lastTexture <> SkinName Then
lastRectangle = r
lastTexture = SkinName
Core.Player.Skin = SkinName
Try
Dim t As Texture2D = TextureManager.GetTexture(Me.Texture, r, 1)
Textures(0) = t
Catch
Logger.Log(Logger.LogTypes.Warning, "OwnPlayer.vb: Error assigning a new texture to the player.")
End Try
End If
End If
End Sub
Private Function GetAnimationX() As Integer
If Me.Texture.Width = Me.Texture.Height / 2 Then
Select Case AnimationX
Case 1
Return 0
Case 2
Return 1
Case 3
Return 0
Case 4
Return 1
End Select
ElseIf Me.Texture.Width = Me.Texture.Height Then
Select Case AnimationX
Case 1
Return 0
Case 2
Return 1
Case 3
Return 2
Case 4
Return 3
End Select
Else
Select Case AnimationX
Case 1
Return 0
Case 2
Return 1
Case 3
Return 0
Case 4
Return 2
End Select
End If
Return 0
End Function
Public Overrides Sub Render()
If InCameraFocus() = True Then
Dim state = GraphicsDevice.DepthStencilState
GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead
Draw(Me.BaseModel, Me.Textures, True)
GraphicsDevice.DepthStencilState = state
End If
End Sub
Friend Function InCameraFocus() As Boolean
If Screen.Camera.Name = "Overworld" Then
Dim c = CType(Screen.Camera, OverworldCamera)
If c.CameraFocusType = OverworldCamera.CameraFocusTypes.Player And c.ThirdPerson = True Or c.CameraFocusType <> OverworldCamera.CameraFocusTypes.Player Then
Return True
End If
End If
Return False
End Function
Public Sub ApplyShaders()
Me.Shaders.Clear()
For Each Shader As Shader In Screen.Level.Shaders
Shader.ApplyShader({Me})
Next
End Sub
Private Function GetAnimationDelay() As Single
If Core.Player.IsRunning() = True Then
Return OwnPlayer.AnimationDelayLength / 1.4F
End If
Return OwnPlayer.AnimationDelayLength
End Function
End Class