699 lines
28 KiB
VB.net
699 lines
28 KiB
VB.net
Imports System.IO
|
|
Imports System.Net.Sockets
|
|
Imports System.Net
|
|
|
|
Public Class JoinServerScreen
|
|
|
|
Inherits Screen
|
|
|
|
Friend Shared BarAnimationState As Integer = 0
|
|
|
|
Dim mainTexture As Texture2D
|
|
|
|
Dim ServerList As New List(Of Server)
|
|
|
|
Dim selectIndex As Integer = 0
|
|
Dim scrollIndex As Integer = 0
|
|
Dim buttonIndex As Integer = 0
|
|
|
|
Dim LoadOnlineServers As Boolean = True
|
|
|
|
Public Shared SelectedServer As Server = Nothing
|
|
Public Shared Online As Boolean = False
|
|
|
|
Public Shared ClearThreadList As New List(Of Threading.Thread)
|
|
|
|
Public Sub New(ByVal currentScreeen As Screen)
|
|
mainTexture = TextureManager.GetTexture("GUI\Menus\Menu")
|
|
|
|
Me.PreScreen = currentScreeen
|
|
Me.Identification = Identifications.JoinServerScreen
|
|
Me.MouseVisible = True
|
|
Me.CanBePaused = False
|
|
Me.CanChat = False
|
|
End Sub
|
|
|
|
Private Sub LoadServers()
|
|
Me.ServerList.Clear()
|
|
|
|
Dim localServer As New Server("Local", "127.0.0.1")
|
|
localServer.IsLocal = True
|
|
|
|
Me.ServerList.Add(localServer)
|
|
|
|
If System.IO.File.Exists(GameController.GamePath & "\Save\server_list.dat") = False Then
|
|
System.IO.File.WriteAllText(GameController.GamePath & "\Save\server_list.dat", "Official Pokémon3D Server,karp.pokemon3d.net:15124")
|
|
End If
|
|
|
|
If LoadOnlineServers = True Then
|
|
Dim data() As String = System.IO.File.ReadAllLines(GameController.GamePath & "\Save\server_list.dat")
|
|
If data.Length > 0 Then
|
|
For Each line As String In data
|
|
If line.CountSeperators(",") = 1 Then
|
|
Dim Name As String = line.Split(CChar(","))(0)
|
|
Dim address As String = line.Split(CChar(","))(1)
|
|
Me.ServerList.Add(New Server(Name, address))
|
|
End If
|
|
Next
|
|
End If
|
|
End If
|
|
|
|
For Each s As Server In Me.ServerList
|
|
s.Ping()
|
|
Next
|
|
End Sub
|
|
|
|
Public Overrides Sub Draw()
|
|
Dim Tx As Integer = CInt(World.CurrentSeason)
|
|
Dim Ty As Integer = 0
|
|
If Tx > 1 Then
|
|
Tx -= 2
|
|
Ty += 1
|
|
End If
|
|
|
|
Dim ServersToDisplay As Integer = GetServersToDisplay()
|
|
|
|
Dim pattern As Texture2D = TextureManager.GetTexture("GUI\Menus\Menu", New Rectangle(160 + Tx * 16, Ty * 16, 16, 16), "")
|
|
For Dx = 0 To Core.ScreenSize.Width Step 128
|
|
For Dy = 0 To Core.ScreenSize.Height Step 128
|
|
Dim c As Color = Color.White
|
|
|
|
Core.SpriteBatch.DrawInterface(pattern, New Rectangle(Dx, Dy, 128, 128), c)
|
|
Next
|
|
Next
|
|
|
|
Canvas.DrawRectangle(New Rectangle(0, 75, Core.ScreenSize.Width, Core.ScreenSize.Height - 240), New Color(0, 0, 0, 128), True)
|
|
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.MainFont, "Join a server", New Vector2(CSng(Core.ScreenSize.Width / 2 - FontManager.MainFont.MeasureString("Join a server").X), 14), Color.White, 0.0F, New Vector2(0), 2.0F, SpriteEffects.None, 0.0F)
|
|
|
|
Dim endX As Integer = ServerList.Count - 1
|
|
endX = CInt(MathHelper.Clamp(endX, 0, ServersToDisplay - 1))
|
|
|
|
If ServerList.Count > ServersToDisplay Then
|
|
Canvas.DrawScrollBar(New Vector2(CSng(Core.ScreenSize.Width / 2 + 266), 100), Me.ServerList.Count, 1, selectIndex, New Size(8, Core.ScreenSize.Height - 300), False, Color.Black, Color.Gray, True)
|
|
End If
|
|
|
|
' Draw default first:
|
|
For i = 0 To endX
|
|
Dim index As Integer = i + scrollIndex
|
|
|
|
If ServerList.Count - 1 >= index Then
|
|
ServerList(index).Draw(New Vector2(0, i * 100 + 100), index = selectIndex)
|
|
End If
|
|
Next
|
|
|
|
Dim CanvasTexture As Texture2D
|
|
CanvasTexture = TextureManager.GetTexture("GUI\Menus\Menu", New Rectangle(0, 0, 48, 48), "")
|
|
|
|
For i = 0 To 5
|
|
If i = Me.buttonIndex Then
|
|
CanvasTexture = TextureManager.GetTexture("GUI\Menus\Menu", New Rectangle(0, 48, 48, 48), "")
|
|
Else
|
|
CanvasTexture = TextureManager.GetTexture("GUI\Menus\Menu", New Rectangle(0, 0, 48, 48), "")
|
|
End If
|
|
|
|
Dim Text As String = ""
|
|
Select Case i
|
|
Case 0
|
|
Text = "Join"
|
|
Dim s As Server = ServerList(selectIndex)
|
|
|
|
If s.IsLocal = True Then
|
|
Text = "Play"
|
|
Else
|
|
If s.CanJoin() = False Then
|
|
CanvasTexture = TextureManager.GetTexture("GUI\Menus\Menu", New Rectangle(48, 0, 48, 48), "")
|
|
End If
|
|
End If
|
|
Case 1
|
|
Text = "Refresh"
|
|
Case 2
|
|
Text = "Add"
|
|
Case 3
|
|
Text = "Edit"
|
|
Dim s As Server = ServerList(selectIndex)
|
|
|
|
If s.IsLocal = True Then
|
|
CanvasTexture = TextureManager.GetTexture("GUI\Menus\Menu", New Rectangle(48, 0, 48, 48), "")
|
|
End If
|
|
Case 4
|
|
Text = "Remove"
|
|
Dim s As Server = ServerList(selectIndex)
|
|
|
|
If s.IsLocal = True Then
|
|
CanvasTexture = TextureManager.GetTexture("GUI\Menus\Menu", New Rectangle(48, 0, 48, 48), "")
|
|
End If
|
|
Case 5
|
|
Text = "Back"
|
|
End Select
|
|
|
|
Canvas.DrawImageBorder(CanvasTexture, 2, New Rectangle(CInt(Core.ScreenSize.Width / 2) - 560 + i * 192, Core.ScreenSize.Height - 136, 128, 64), True)
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, Text, New Vector2(CInt(Core.ScreenSize.Width / 2) - 542 + i * 192, Core.ScreenSize.Height - 106), Color.Black)
|
|
Next
|
|
|
|
Dim vS As String = "Protocol version: " & Servers.ServersManager.PROTOCOLVERSION
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.MiniFont, vS, New Vector2(Core.ScreenSize.Width - FontManager.MiniFont.MeasureString(vS).X - 4, Core.ScreenSize.Height - FontManager.MiniFont.MeasureString(vS).Y - 1), Color.White)
|
|
|
|
' Draw player list tooltip after everything else:
|
|
For i = 0 To endX
|
|
Dim index As Integer = i + scrollIndex
|
|
|
|
If ServerList.Count - 1 >= index Then
|
|
ServerList(index).DrawPlayerListToolTip(New Vector2(0, i * 100 + 100))
|
|
End If
|
|
Next
|
|
End Sub
|
|
|
|
Public Overrides Sub Update()
|
|
If LoadOnlineServers = False Then
|
|
JoinButton()
|
|
End If
|
|
|
|
Dim ServersToDisplay As Integer = GetServersToDisplay()
|
|
|
|
If Controls.Up(True, True, True) = True Then
|
|
selectIndex -= 1
|
|
If selectIndex - scrollIndex < 0 Then
|
|
scrollIndex -= 1
|
|
End If
|
|
End If
|
|
If Controls.Down(True, True, True) = True Then
|
|
selectIndex += 1
|
|
If selectIndex + scrollIndex > ServersToDisplay - 1 Then
|
|
scrollIndex += 1
|
|
End If
|
|
End If
|
|
|
|
If Core.GameInstance.IsMouseVisible = True Then
|
|
For i = 0 To 5
|
|
If Core.ScaleScreenRec(New Rectangle(CInt(Core.ScreenSize.Width / 2) - 560 + i * 192, Core.ScreenSize.Height - 138, 128 + 32, 64 + 32)).Contains(MouseHandler.MousePosition) = True Then
|
|
Me.buttonIndex = i
|
|
|
|
If MouseHandler.ButtonPressed(MouseHandler.MouseButtons.LeftButton) = True AndAlso MouseHandler.ButtonPressed(MouseHandler.MouseButtons.RightButton) = False Then
|
|
Select Case Me.buttonIndex
|
|
Case 0
|
|
JoinButton()
|
|
Case 1
|
|
RefreshButton()
|
|
Case 2
|
|
AddServerButton()
|
|
Case 3
|
|
EditServerButton()
|
|
Case 4
|
|
RemoveServerButton()
|
|
Case 5
|
|
CancelButton()
|
|
End Select
|
|
End If
|
|
End If
|
|
Next
|
|
End If
|
|
|
|
For i = 0 To ServersToDisplay - 1
|
|
If Core.ScaleScreenRec(New Rectangle(CInt(Core.ScreenSize.Width / 2) - 354, i * 100 + 100, 500, 80)).Contains(MouseHandler.MousePosition) = True Then
|
|
If MouseHandler.ButtonPressed(MouseHandler.MouseButtons.LeftButton) = True Then
|
|
Me.selectIndex = i + scrollIndex
|
|
End If
|
|
End If
|
|
Next
|
|
|
|
If Controls.Right(True, True, False) = True Then
|
|
Me.buttonIndex += 1
|
|
End If
|
|
If Controls.Left(True, True, False) = True Then
|
|
Me.buttonIndex -= 1
|
|
End If
|
|
|
|
Me.buttonIndex = CInt(MathHelper.Clamp(Me.buttonIndex, 0, 5))
|
|
|
|
If Controls.Accept(False, True) = True Then
|
|
Select Case Me.buttonIndex
|
|
Case 0
|
|
JoinButton()
|
|
Case 1
|
|
RefreshButton()
|
|
Case 2
|
|
AddServerButton()
|
|
Case 3
|
|
EditServerButton()
|
|
Case 4
|
|
RemoveServerButton()
|
|
Case 5
|
|
CancelButton()
|
|
End Select
|
|
End If
|
|
|
|
If Controls.Dismiss() = True Then
|
|
''CType(Me.PreScreen, NewMainMenuScreen)._menuIndex = 0
|
|
Core.Player.Unload()
|
|
Core.SetScreen(Me.PreScreen)
|
|
End If
|
|
|
|
BarAnimationState += 1
|
|
If BarAnimationState > 49 Then
|
|
BarAnimationState = 0
|
|
End If
|
|
|
|
selectIndex = CInt(MathHelper.Clamp(selectIndex, 0, ServerList.Count - 1))
|
|
scrollIndex = CInt(MathHelper.Clamp(scrollIndex, 0, ServerList.Count - ServersToDisplay))
|
|
End Sub
|
|
|
|
#Region "Buttons"
|
|
|
|
Private Sub JoinButton()
|
|
If Me.selectIndex = 0 Then
|
|
Online = False
|
|
SelectedServer = Nothing
|
|
Core.SetScreen(New OverworldScreen())
|
|
Else
|
|
If ServerList(selectIndex).CanJoin() = True Then
|
|
SelectedServer = Me.ServerList(selectIndex)
|
|
ServerList.Move(selectIndex, 1)
|
|
SaveServerlist()
|
|
Core.SetScreen(New ConnectScreen(ConnectScreen.Modes.Connect, "Connecting to server", "Please wait...", Core.CurrentScreen))
|
|
End If
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub AddServerButton()
|
|
Core.SetScreen(New AddServerScreen(Me, Me.ServerList, True, Nothing))
|
|
End Sub
|
|
|
|
Private Sub EditServerButton()
|
|
Dim s As Server = ServerList(selectIndex)
|
|
|
|
If s.IsLocal = False Then
|
|
ServerList.RemoveAt(selectIndex)
|
|
SaveServerlist()
|
|
Core.SetScreen(New AddServerScreen(Me, Me.ServerList, False, s))
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub RemoveServerButton()
|
|
Dim s As Server = ServerList(selectIndex)
|
|
|
|
If s.IsLocal = False Then
|
|
ServerList.RemoveAt(selectIndex)
|
|
SaveServerlist()
|
|
LoadServers()
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub CancelButton()
|
|
Core.SetScreen(Me.PreScreen)
|
|
End Sub
|
|
|
|
Private Sub RefreshButton()
|
|
For Each Server As Server In ServerList
|
|
Server.Refresh()
|
|
Next
|
|
End Sub
|
|
|
|
#End Region
|
|
|
|
Private Function GetServersToDisplay() As Integer
|
|
Dim contentHeight As Integer = Core.ScreenSize.Height - 300
|
|
Dim serverHeight As Integer = 80
|
|
Dim serverCount As Integer = 1
|
|
|
|
While contentHeight > serverHeight + 80
|
|
serverHeight += 100
|
|
serverCount += 1
|
|
End While
|
|
|
|
Return serverCount
|
|
End Function
|
|
|
|
Public Overrides Sub ChangeTo()
|
|
If Controls.ShiftDown() = True Then
|
|
LoadOnlineServers = False
|
|
Else
|
|
LoadOnlineServers = True
|
|
End If
|
|
LoadServers()
|
|
End Sub
|
|
|
|
Class Server
|
|
|
|
Inherits Servers.Server
|
|
|
|
Public IsLocal As Boolean = False
|
|
Public IdentifierName As String = ""
|
|
Private Name As String = ""
|
|
Public PingResult As Integer = 0
|
|
Public Pinged As Boolean = False
|
|
Public StartedPing As Boolean = False
|
|
Public ServerMessage As String = ""
|
|
Public PlayerList As New List(Of String)
|
|
Public CurrentPlayersOnline As Integer = 0
|
|
Public MaxPlayersOnline As Integer = 0
|
|
Public ServerProtocolVersion As String = ""
|
|
|
|
Dim ReceivedError As Boolean = False
|
|
|
|
Public Sub Refresh()
|
|
Me.Name = IdentifierName
|
|
Me.Pinged = False
|
|
Me.StartedPing = False
|
|
Me.ReceivedError = False
|
|
Me.CurrentPlayersOnline = 0
|
|
Me.MaxPlayersOnline = 0
|
|
Me.ServerProtocolVersion = ""
|
|
Me.ServerMessage = ""
|
|
|
|
Me.Ping()
|
|
End Sub
|
|
|
|
Public Function GetName() As String
|
|
If Name = "" Then
|
|
Return IdentifierName
|
|
End If
|
|
Return Name
|
|
End Function
|
|
|
|
Public Sub New(ByVal name As String, ByVal Address As String)
|
|
MyBase.New(Address)
|
|
|
|
Me.IdentifierName = name
|
|
|
|
Me.Pinged = False
|
|
Me.StartedPing = False
|
|
End Sub
|
|
|
|
Public Sub Ping()
|
|
If IsLocal = True Then
|
|
Me.Name = "Local"
|
|
Me.PingResult = 0
|
|
Me.StartedPing = True
|
|
Me.Pinged = True
|
|
Me.CurrentPlayersOnline = 0
|
|
Me.MaxPlayersOnline = 1
|
|
Me.IP = "127.0.0.1"
|
|
Me.Port = "15124"
|
|
Me.ServerMessage = "Play on your local computer."
|
|
Me.ServerProtocolVersion = Servers.ServersManager.PROTOCOLVERSION
|
|
Else
|
|
Dim t As New Threading.Thread(AddressOf StartPing)
|
|
t.IsBackground = True
|
|
t.Start()
|
|
JoinServerScreen.ClearThreadList.Add(t)
|
|
Me.StartedPing = True
|
|
Dim cT As New Threading.Thread(AddressOf CheckServerConnectTimeout)
|
|
cT.IsBackground = True
|
|
cT.Start(t)
|
|
JoinServerScreen.ClearThreadList.Add(cT)
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub CheckServerConnectTimeout(ByVal t As Object)
|
|
Dim sw As New Stopwatch()
|
|
sw.Start()
|
|
|
|
' TTL: 10000 ticks, usually at 60 Hz => 10000/60 seconds
|
|
While sw.ElapsedMilliseconds < 10000 And Me.Pinged = False
|
|
'Wait for server connection in the main thread.
|
|
Threading.Thread.Sleep(1)
|
|
End While
|
|
|
|
sw.Stop()
|
|
|
|
If Me.Pinged = False Then
|
|
Try
|
|
CType(t, Threading.Thread).Abort()
|
|
Catch : End Try
|
|
Me.Pinged = True
|
|
Me.ReceivedError = True
|
|
End If
|
|
End Sub
|
|
|
|
Public Function CanJoin() As Boolean
|
|
If IsLocal = True Then
|
|
Return True
|
|
End If
|
|
If StartedPing = True And Pinged = True Then
|
|
If Me.ServerProtocolVersion = Servers.ServersManager.PROTOCOLVERSION Then
|
|
If CurrentPlayersOnline < MaxPlayersOnline Then
|
|
Return True
|
|
End If
|
|
End If
|
|
End If
|
|
Return False
|
|
End Function
|
|
|
|
Private Sub StartPing()
|
|
Dim sw As New Stopwatch()
|
|
|
|
Try
|
|
Dim client As New TcpClient()
|
|
|
|
Dim connectIP As IPAddress = Nothing
|
|
|
|
For Each ipaddress In System.Net.Dns.GetHostEntry(Me.IP).AddressList
|
|
If ipaddress.AddressFamily = AddressFamily.InterNetwork Then
|
|
connectIP = ipaddress
|
|
Exit For
|
|
End If
|
|
Next
|
|
|
|
sw.Start()
|
|
client.Connect(connectIP, CInt(Me.Port))
|
|
|
|
If client.Connected = True Then
|
|
Dim Stream As NetworkStream = client.GetStream()
|
|
|
|
Dim streamr As StreamReader = New StreamReader(Stream)
|
|
Dim streamw As StreamWriterLock = New StreamWriterLock(Stream)
|
|
|
|
streamw.WriteLine(New Servers.Package(Servers.Package.PackageTypes.ServerDataRequest, -1, Servers.Package.ProtocolTypes.TCP, "r").ToString())
|
|
streamw.Flush()
|
|
|
|
Dim p As New Servers.Package(streamr.ReadLine())
|
|
If p.IsValid = True Then
|
|
If p.PackageType = Servers.Package.PackageTypes.ServerInfoData Then
|
|
sw.Stop()
|
|
|
|
CurrentPlayersOnline = CInt(p.DataItems(0))
|
|
MaxPlayersOnline = CInt(p.DataItems(1))
|
|
Name = p.DataItems(2)
|
|
ServerMessage = p.DataItems(3)
|
|
|
|
Me.PlayerList.Clear()
|
|
If p.DataItems.Count > 4 Then
|
|
For i = 4 To p.DataItems.Count - 1
|
|
Me.PlayerList.Add(p.DataItems(i))
|
|
Next
|
|
End If
|
|
|
|
Me.PlayerList = (From playerName As String In PlayerList Order By playerName Ascending).ToList()
|
|
|
|
ServerProtocolVersion = p.ProtocolVersion
|
|
Logger.Debug("Received server data.")
|
|
Else
|
|
ReceivedError = True
|
|
End If
|
|
Else
|
|
ReceivedError = True
|
|
End If
|
|
Else
|
|
ReceivedError = True
|
|
End If
|
|
Catch ex As Exception
|
|
ReceivedError = True
|
|
|
|
Logger.Debug("JoinServerScreen.vb: Exception trying to ping server: " & ex.Message)
|
|
End Try
|
|
Me.Pinged = True
|
|
|
|
Me.PingResult = CInt(sw.ElapsedMilliseconds)
|
|
End Sub
|
|
|
|
Public Function GetPingTime() As Integer
|
|
If Me.Pinged = True And Me.StartedPing = True Then
|
|
If ReceivedError = True Then
|
|
Return 0
|
|
Else
|
|
Return Me.PingResult
|
|
End If
|
|
Else
|
|
Return 0
|
|
End If
|
|
End Function
|
|
|
|
Public Function GetServerStatus() As String
|
|
If ReceivedError = True Then
|
|
Return "Cannot reach server."
|
|
End If
|
|
If Me.Pinged = True Then
|
|
Return "Server online"
|
|
Else
|
|
Return "Polling" & LoadingDots.Dots
|
|
End If
|
|
End Function
|
|
|
|
Public Sub Draw(ByVal startPos As Vector2, ByVal selected As Boolean)
|
|
Dim width As Integer = 500
|
|
startPos.X = CInt(Core.ScreenSize.Width / 2 - width / 2)
|
|
If selected = True Then
|
|
Canvas.DrawRectangle(New Rectangle(CInt(startPos.X), CInt(startPos.Y), width, 80), New Color(0, 0, 0, 200), True)
|
|
Canvas.DrawBorder(2, New Rectangle(CInt(startPos.X), CInt(startPos.Y), width, 80), Color.LightGray, True)
|
|
End If
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.MiniFont, Me.GetName(), New Vector2(CInt(startPos.X) + 4, CInt(startPos.Y) + 3), Color.White, 0.0F, Vector2.Zero, 1.4F, SpriteEffects.None, 0.0F)
|
|
|
|
If ReceivedError = True Then
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.MiniFont, GetServerStatus(), New Vector2(CInt(startPos.X) + 4, CInt(startPos.Y) + 30), New Color(190, 0, 0, 255), 0.0F, Vector2.Zero, 1.0F, SpriteEffects.None, 0.0F)
|
|
Core.SpriteBatch.DrawInterface(TextureManager.GetTexture("GUI\Menus\Menu", New Rectangle(150, 224, 14, 14), ""), New Rectangle(CInt(startPos.X) + width - 32, CInt(startPos.Y) + 3, 28, 28), Color.White)
|
|
|
|
If New Rectangle(CInt(startPos.X) + width - 32, CInt(startPos.Y) + 3, 28, 28).Contains(MouseHandler.MousePosition) = True Then
|
|
Canvas.DrawRectangle(New Rectangle(MouseHandler.MousePosition.X + 10, MouseHandler.MousePosition.Y + 10, 160, 32), Color.Black)
|
|
Canvas.DrawBorder(3, New Rectangle(MouseHandler.MousePosition.X + 10, MouseHandler.MousePosition.Y + 10, 160, 32), Color.Gray)
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.MiniFont, "(no connection)", New Vector2(MouseHandler.MousePosition.X + 14, MouseHandler.MousePosition.Y + 16), Color.White)
|
|
End If
|
|
Else
|
|
If Pinged = True Then
|
|
Dim message As String = Me.ServerMessage
|
|
Dim color As Color = New Color(180, 180, 180, 255)
|
|
|
|
If CanJoin() = False Then
|
|
If CurrentPlayersOnline >= MaxPlayersOnline Then
|
|
message = "The server is full."
|
|
End If
|
|
If ServerProtocolVersion <> Servers.ServersManager.PROTOCOLVERSION Then
|
|
message = "Version doesn't match the server's version."
|
|
End If
|
|
|
|
color = New Color(190, 0, 0, 255)
|
|
End If
|
|
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.MiniFont, message, New Vector2(CInt(startPos.X) + 4, CInt(startPos.Y) + 30), color, 0.0F, Vector2.Zero, 1.0F, SpriteEffects.None, 0.0F)
|
|
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.MiniFont, Me.CurrentPlayersOnline & "/" & Me.MaxPlayersOnline, New Vector2(CInt(startPos.X) + width - 36 - FontManager.MiniFont.MeasureString(Me.CurrentPlayersOnline & "/" & Me.MaxPlayersOnline).X, CInt(startPos.Y) + 7), Color.LightGray)
|
|
Core.SpriteBatch.DrawInterface(TextureManager.GetTexture("GUI\Menus\Menu", New Rectangle(80 + 14 * (4 - GetPingLevel()), 238, 14, 14), ""), New Rectangle(CInt(startPos.X) + width - 32, CInt(startPos.Y) + 3, 28, 28), Color.White)
|
|
|
|
' Ping result tool tip:
|
|
If New Rectangle(CInt(startPos.X) + width - 32, CInt(startPos.Y) + 3, 28, 28).Contains(MouseHandler.MousePosition) = True Then
|
|
Canvas.DrawRectangle(New Rectangle(MouseHandler.MousePosition.X + 10, MouseHandler.MousePosition.Y + 10, 160, 32), Color.Black)
|
|
Canvas.DrawBorder(3, New Rectangle(MouseHandler.MousePosition.X + 10, MouseHandler.MousePosition.Y + 10, 160, 32), Color.Gray)
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.MiniFont, "Ping: " & PingResult & " ms", New Vector2(MouseHandler.MousePosition.X + 14, MouseHandler.MousePosition.Y + 16), Color.White)
|
|
End If
|
|
Else
|
|
Core.SpriteBatch.DrawInterface(TextureManager.GetTexture("GUI\Menus\Menu", New Rectangle(80 + 14 * CInt(Math.Floor(JoinServerScreen.BarAnimationState / 10)), 224, 14, 14), ""), New Rectangle(CInt(startPos.X) + width - 32, CInt(startPos.Y) + 3, 28, 28), Color.White)
|
|
If New Rectangle(CInt(startPos.X) + width - 32, CInt(startPos.Y) + 3, 28, 28).Contains(MouseHandler.MousePosition) = True Then
|
|
Canvas.DrawRectangle(New Rectangle(MouseHandler.MousePosition.X + 10, MouseHandler.MousePosition.Y + 10, 160, 32), Color.Black)
|
|
Canvas.DrawBorder(3, New Rectangle(MouseHandler.MousePosition.X + 10, MouseHandler.MousePosition.Y + 10, 160, 32), Color.Gray)
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.MiniFont, "Polling" & LoadingDots.Dots, New Vector2(MouseHandler.MousePosition.X + 14, MouseHandler.MousePosition.Y + 16), Color.White)
|
|
End If
|
|
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.MiniFont, "Polling" & LoadingDots.Dots, New Vector2(CInt(startPos.X) + 4, CInt(startPos.Y) + 30), New Color(180, 180, 180, 255), 0.0F, Vector2.Zero, 1.0F, SpriteEffects.None, 0.0F)
|
|
End If
|
|
End If
|
|
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.MiniFont, GetAddressString(), New Vector2(CInt(startPos.X) + 4, CInt(startPos.Y) + 53), New Color(180, 180, 180, 255), 0.0F, Vector2.Zero, 1.0F, SpriteEffects.None, 0.0F)
|
|
End Sub
|
|
|
|
Public Sub DrawPlayerListToolTip(ByVal startPos As Vector2)
|
|
If ReceivedError = False And Pinged = True And IsLocal = False Then
|
|
Dim width As Integer = 500
|
|
startPos.X = CInt(Core.ScreenSize.Width / 2 - width / 2)
|
|
|
|
If Core.ScaleScreenRec(New Rectangle(CInt(startPos.X) + width - 36 - FontManager.MiniFont.MeasureString(Me.CurrentPlayersOnline & "/" & Me.MaxPlayersOnline).X.ToInteger(), CInt(startPos.Y) + 3, FontManager.MiniFont.MeasureString(Me.CurrentPlayersOnline & "/" & Me.MaxPlayersOnline).X.ToInteger(), 28)).Contains(MouseHandler.MousePosition) = True Then
|
|
Dim tooltipText As String = "No players on the server."
|
|
|
|
If PlayerList.Count > 0 Then
|
|
tooltipText = PlayerList.ToArray().ArrayToString(True)
|
|
End If
|
|
|
|
Dim v = FontManager.MiniFont.MeasureString("Player list:" & Environment.NewLine & tooltipText)
|
|
|
|
Dim drawY As Integer = MouseHandler.MousePosition.Y + 10
|
|
If drawY + v.Y + 12 > Core.windowSize.Height Then
|
|
drawY = CInt(Core.windowSize.Height - v.Y - 22)
|
|
End If
|
|
If drawY < 0 Then
|
|
drawY = 0
|
|
End If
|
|
|
|
Canvas.DrawRectangle(New Rectangle(MouseHandler.MousePosition.X + 10, drawY, CInt(v.X + 10), CInt(v.Y + 22)), Color.Black, True)
|
|
Canvas.DrawBorder(3, New Rectangle(MouseHandler.MousePosition.X + 10, drawY, CInt(v.X + 10), CInt(v.Y + 22)), Color.Gray, True)
|
|
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.MiniFont, "Player list:", New Vector2(MouseHandler.MousePosition.X + 14, drawY + 6), Color.LightBlue)
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.MiniFont, tooltipText, New Vector2(MouseHandler.MousePosition.X + 14, drawY + 6 + 34), Color.White)
|
|
End If
|
|
End If
|
|
End Sub
|
|
|
|
Public Function GetAddressString() As String
|
|
If IsLocal = True Then
|
|
Return ""
|
|
Else
|
|
Return Me.IP & ":" & Me.Port
|
|
End If
|
|
End Function
|
|
|
|
Private Function GetPingLevel() As Integer
|
|
If Me.PingResult < 500 Then
|
|
Return 0
|
|
ElseIf PingResult >= 500 And PingResult < 1000 Then
|
|
Return 1
|
|
ElseIf PingResult >= 1000 And PingResult < 2000 Then
|
|
Return 2
|
|
ElseIf PingResult >= 2000 And PingResult < 5000 Then
|
|
Return 3
|
|
Else
|
|
Return 4
|
|
End If
|
|
End Function
|
|
|
|
Public Overrides Function ToString() As String
|
|
Return Me.IdentifierName & "," & Me.GetAddressString()
|
|
End Function
|
|
|
|
End Class
|
|
|
|
Public Shared Sub AddServerMessage(ByVal m As String, ByVal server_name As String)
|
|
If System.IO.File.Exists(GameController.GamePath & "\Save\server_list.dat") = False Then
|
|
System.IO.File.WriteAllText(GameController.GamePath & "\Save\server_list.dat", "")
|
|
End If
|
|
|
|
Dim newData As String = ""
|
|
|
|
Dim data() As String = System.IO.File.ReadAllLines(GameController.GamePath & "\Save\server_list.dat")
|
|
For Each line As String In data
|
|
If newData <> "" Then
|
|
newData &= Environment.NewLine
|
|
End If
|
|
If line.StartsWith(server_name & ",") = True Then
|
|
Dim lineData() As String = line.Split(CChar(","))
|
|
newData &= lineData(0) & "," & lineData(1) & "," & m
|
|
Else
|
|
newData &= line
|
|
End If
|
|
Next
|
|
|
|
System.IO.File.WriteAllText(GameController.GamePath & "\Save\server_list.dat", newData)
|
|
End Sub
|
|
|
|
Public Overrides Sub ChangeFrom()
|
|
For Each t As Threading.Thread In ClearThreadList
|
|
Try
|
|
If t.IsAlive = True Then
|
|
t.Abort()
|
|
End If
|
|
Catch : End Try
|
|
Next
|
|
ClearThreadList.Clear()
|
|
End Sub
|
|
|
|
Private Sub SaveServerlist()
|
|
Dim data As String = ""
|
|
For Each s As Server In Me.ServerList
|
|
If s.IsLocal = False Then
|
|
If data <> "" Then
|
|
data &= Environment.NewLine
|
|
End If
|
|
data &= s.ToString()
|
|
End If
|
|
Next
|
|
System.IO.File.WriteAllText(GameController.GamePath & "\Save\server_list.dat", data)
|
|
End Sub
|
|
|
|
End Class |