225 lines
8.2 KiB
VB.net
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 |