Upgrade 1.0.11 to 1.0.12
From VbGORE Visual Basic Online RPG Engine
Contents |
This guide will lead you through how to upgrade Version 1.0.11 to Version 1.0.12. For help, please refer to the How to upgrade article. It is highly recommended you read it before ever upgrading.
Fix - GrhRawAssistant
Copy the GrhRawAssistant code from Version 1.0.12.
Fix - Group sending packets
Open GameServer.vbp.
Find both cases of:
<vb>
If tIndex <> LoopC Then
</vb>
Replace both with:
<vb>
If tIndex <> sndIndex Then
</vb>
Add - Better multiple fonts support
Open GameClient.vbp.
Find:
<vb> Public Sub Engine_Render_Text(ByVal Text As String, ByVal X As Long, ByVal Y As Long, ByVal Color As Long) </vb>
Replace whole sub with:
<vb> Public Sub Engine_Render_Text(ByRef UseFont As CustomFont, ByVal Text As String, ByVal X As Long, ByVal Y As Long, ByVal Color As Long) '***************************************************************** 'Render text with a custom font 'More info: http://www.vbgore.com/GameClient.TileEngine.Engine_Render_Text '***************************************************************** Dim TempVA(0 To 3) As TLVERTEX Dim TempStr() As String Dim Count As Integer Dim Ascii() As Byte Dim Row As Integer Dim u As Single Dim v As Single Dim i As Long Dim j As Long Dim KeyPhrase As Byte Dim TempColor As Long Dim ResetColor As Byte Dim SrcRect As RECT Dim v2 As D3DVECTOR2 Dim v3 As D3DVECTOR2 Dim YOffset As Single
'Check if we have the device If D3DDevice.TestCooperativeLevel <> D3D_OK Then Exit Sub
'Check for valid text to render If LenB(Text) = 0 Then Exit Sub 'Assign the alternate rendering value AlternateRender = AlternateRenderText
'Get the text into arrays (split by vbCrLf) TempStr = Split(Text, vbCrLf) 'Set the temp color (or else the first character has no color) TempColor = Color 'Check for alternate rendering If AlternateRender Then
'End the old sprite we had going
If SpriteBegun = 1 Then
Sprite.End
Sprite.Begin
End If
Else
'Set the texture
D3DDevice.SetTexture 0, UseFont.Texture
End If
'Clear the LastTexture, letting the rest of the engine know that the texture needs to be changed for next rect render
LastTexture = -(Rnd * 10000)
'Loop through each line if there are line breaks (vbCrLf)
For i = 0 To UBound(TempStr)
If Len(TempStr(i)) > 0 Then
YOffset = i * UseFont.CharHeight
Count = 0
'Convert the characters to the ascii value
Ascii() = StrConv(TempStr(i), vbFromUnicode)
'Loop through the characters
For j = 1 To Len(TempStr(i))
'Check for a key phrase
If Ascii(j - 1) = 124 Then 'If Ascii = "|"
KeyPhrase = (Not KeyPhrase) 'TempColor = ARGB 255/255/0/0
If KeyPhrase Then TempColor = -65536 Else ResetColor = 1
Else
'Render with triangles
If AlternateRender = 0 Then
'Copy from the cached vertex array to the temp vertex array
CopyMemory TempVA(0), UseFont.HeaderInfo.CharVA(Ascii(j - 1)).Vertex(0), FVF_Size * 4
'Set up the verticies
TempVA(0).X = X + Count
TempVA(0).Y = Y + YOffset
TempVA(1).X = TempVA(1).X + X + Count
TempVA(1).Y = TempVA(0).Y
TempVA(2).X = TempVA(0).X
TempVA(2).Y = TempVA(2).Y + TempVA(0).Y
TempVA(3).X = TempVA(1).X
TempVA(3).Y = TempVA(2).Y
'Set the colors
TempVA(0).Color = TempColor
TempVA(1).Color = TempColor
TempVA(2).Color = TempColor
TempVA(3).Color = TempColor
'Draw the verticies
D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, TempVA(0), FVF_Size
'Render with D3DXSprite
Else
'tU and tV value (basically tU = BitmapXPosition / BitmapWidth, and height for tV)
Row = (Ascii(j - 1) - UseFont.HeaderInfo.BaseCharOffset) \ UseFont.RowPitch
u = ((Ascii(j - 1) - UseFont.HeaderInfo.BaseCharOffset) - (Row * UseFont.RowPitch)) * UseFont.ColFactor
v = Row * UseFont.RowFactor
'Create the source rectangle
With SrcRect
.Left = u * UseFont.TextureSize.X
.Top = v * UseFont.TextureSize.Y
.Right = .Left + (UseFont.ColFactor * UseFont.TextureSize.X)
.bottom = .Top + (UseFont.RowFactor * UseFont.TextureSize.Y)
End With
'Set the translation (location on the screen)
v3.X = X + Count
v3.Y = Y + (UseFont.CharHeight * i)
'Draw the sprite
Sprite.Draw UseFont.Texture, SrcRect, SpriteScaleVector, v2, 0, v3, Color
End If
'Shift over the the position to render the next character
Count = Count + UseFont.HeaderInfo.CharWidth(Ascii(j - 1))
End If
'Check to reset the color
If ResetColor Then
ResetColor = 0
TempColor = Color
End If
Next j
End If
Next i
'Retreive the default alternate render value
AlternateRender = AlternateRenderDefault
End Sub </vb>
Find every call to sub Engine_Render_Text, and add as the first parameter Font_Default. For example:
<vb>
Engine_Render_Text CharList(CharIndex).Name, PixelOffsetX + 16 - CharList(CharIndex).NameOffset, PixelOffsetY - 40, RenderColor(1)
</vb>
Becomes:
<vb>
Engine_Render_Text Font_Default, CharList(CharIndex).Name, PixelOffsetX + 16 - CharList(CharIndex).NameOffset, PixelOffsetY - 40, RenderColor(1)
</vb>
Find:
<vb> Public Function Engine_GetTextWidth(ByVal Text As String) As Integer </vb>
Replace whole sub with:
<vb> Public Function Engine_GetTextWidth(ByRef UseFont As CustomFont, ByVal Text As String) As Integer '*************************************************** 'Returns the width of text 'More info: http://www.vbgore.com/GameClient.TileEngine.Engine_GetTextWidth '*************************************************** Dim i As Integer
'Make sure we have text
If LenB(Text) = 0 Then Exit Function
'Loop through the text
For i = 1 To Len(Text)
'Add up the stored character widths
Engine_GetTextWidth = Engine_GetTextWidth + UseFont.HeaderInfo.CharWidth(Asc(Mid$(Text, i, 1)))
Next i
End Function </vb>
Find every call to sub function Engine_GetTextWidth, and set the first parameter as Font_Default, just like above.
Fix - Engine_Projectile_Erase
Open GameClient.vbp.
Find:
<vb> Public Sub Engine_Projectile_Erase(ByVal ProjectileIndex As Integer) </vb>
Replace the whole sub with:
<vb> Public Sub Engine_Projectile_Erase(ByVal ProjectileIndex As Integer) '***************************************************************** 'Erase a projectile by the projectile index 'More info: http://www.vbgore.com/GameClient.TileEngine.Engine_Projectile_Erase '*****************************************************************
'Clear the selected index ProjectileList(ProjectileIndex).Grh.FrameCounter = 0 ProjectileList(ProjectileIndex).Grh.GrhIndex = 0 ProjectileList(ProjectileIndex).X = 0 ProjectileList(ProjectileIndex).Y = 0 ProjectileList(ProjectileIndex).tX = 0 ProjectileList(ProjectileIndex).tY = 0 ProjectileList(ProjectileIndex).Rotate = 0 ProjectileList(ProjectileIndex).RotateSpeed = 0
'Update LastProjectile
If ProjectileIndex = LastProjectile Then
Do Until ProjectileList(ProjectileIndex).Grh.GrhIndex > 1
'Move down one projectile
LastProjectile = LastProjectile - 1
If LastProjectile = 0 Then Exit Do
Loop
If ProjectileIndex <> LastProjectile Then
'We still have projectiles, resize the array to end at the last used slot
If LastProjectile > 0 Then
ReDim Preserve ProjectileList(1 To LastProjectile)
Else
Erase ProjectileList
End If
End If
End If
End Sub </vb>
Fix - Textureless rendering
Open GameClient.vbp.
Find:
<vb>
'Set the texture
If TextureNum <= 0 Then
D3DDevice.SetTexture 0, Nothing
Else
</vb>
Replace with:
<vb>
'Set the texture
If TextureNum <= 0 Then
D3DDevice.SetTexture 0, Nothing
LastTexture = 0
Else
</vb>
Fix - Mailing to offline users
Open GameServer.vbp.
Find:
<vb>
DB_RS.Open "SELECT mail,server FROM users WHERE `name`='" & ReceiverName & "'", DB_Conn, adOpenStatic, adLockOptimistic
</vb>
Replace with:
<vb>
DB_RS.Open "SELECT name,mail,server FROM users WHERE `name`='" & ReceiverName & "'", DB_Conn, adOpenStatic, adLockOptimistic
</vb>
Add - Better method descriptions
This can not be upgraded to, unless you manually copy the header comments of every method. Don't worry, you're not missing out on a whole lot.
Fix - Load_NPC
Open GameServer.vbp.
Find:
<vb>
'Make sure the NPC exists
If Not Server_FileExist(ServerTempPath & "n" & NPCNumber & ".temp", vbNormal) Then
If Thralled = 0 Then 'Don't give the error from an invalid thrall
Log "Load_NPC: Error loading NPC " & NPCIndex & " with NPCNumber " & NPCNumber & " - no NPC by the number found!", CriticalError '//\\LOGLINE//\\
End If
Log "Rtrn Load_NPC = " & Load_NPC, CodeTracker '//\\LOGLINE//\\
Exit Function
End If
</vb>
Delete the code, and move it a few lines up after:
<vb>
'Check for valid NPCNumber
If NPCNumber <= 0 Then
Log "Rtrn Load_NPC = " & Load_NPC, CodeTracker '//\\LOGLINE//\\
Exit Function
End If
Log "Load_NPC: Acquiring NPC index", CodeTracker '//\\LOGLINE//\\
</vb>
Fix - Login Bug
Open GameClient.vbp.
Find:
<vb> Sub InitSocket() </vb>
Replace the whole sub with:
<vb> Sub InitSocket()
'***************************************************************** 'Init the sox socket '*****************************************************************
'Save the game ini
Call Var_Write(DataPath & "Game.ini", "INIT", "Name", UserName)
If Not SavePass Then 'If the password wont be saved, clear it out
Call Var_Write(DataPath & "Game.ini", "INIT", "Password", "")
Else
Call Var_Write(DataPath & "Game.ini", "INIT", "Password", UserPassword)
End If
'Set SoxID to 0 to prevent errors
SoxID = 0
'Clean out the socket so we can make a fresh new connection
If frmMain.GOREsock.ShutDown <> soxERROR Then
'Set up the socket
'Leave the GetIPFromHost() wrapper there, this will convert a host name to IP if needed, or leave it as an IP if you pass an IP
SoxID = frmMain.GOREsock.Connect(GetIPFromHost("127.0.0.1"), 10200)
'If the SoxID = -1, then the connection failed, elsewise, we're good to go! W00t! ^_^
If SoxID = -1 Then
MsgBox "Unable to connect to the game server!" & vbCrLf & "Either the server is down or you are not connected to the internet.", vbOKOnly
Else
frmMain.GOREsock.SetOption SoxID, soxSO_TCP_NODELAY, True
End If
End If
End Sub</vb> Don't forget to change your IP!