Upgrade 1.0.10 to 1.0.11
From VbGORE Visual Basic Online RPG Engine
This guide will lead you through how to upgrade Version 1.0.10 to Version 1.0.11. For help, please refer to the How to upgrade article. It is highly recommended you read it before ever upgrading.
Fix - Large Grh support
Open GameClient.vbp.
Find:
<vb> Dim ScreenX As Byte Dim ScreenY As Byte </vb>
Replace with:
<vb> Dim ScreenX As Long Dim ScreenY As Long </vb>
Add - Small client optimizations
Open GameClient.vbp.
Find:
<vb> Dim ChrID() As Integer </vb>
Before, add:
<vb> Dim LightOffset As Long </vb>
Find:
<vb>
For Layer = 1 To 3
</vb>
After, add:
<vb>
LightOffset = ((Layer - 1) * 4) + 1
</vb>
Find:
<vb>
'Check if we have to draw with a shadow or not (slighty changes because we have to animate on the shadow, not the main render)
If MapData(.TileX, .TileY).Shadow(Layer) = 1 Then
Engine_Render_Grh MapData(.TileX, .TileY).Graphic(Layer), .PixelPosX + PixelOffsetX, .PixelPosY + PixelOffsetY, 0, 1, True, ShadowColor, ShadowColor, ShadowColor, ShadowColor, 1
Engine_Render_Grh MapData(.TileX, .TileY).Graphic(Layer), .PixelPosX + PixelOffsetX, .PixelPosY + PixelOffsetY, 0, 0, True, MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 1), MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 2), MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 3), MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 4)
Else
Engine_Render_Grh MapData(.TileX, .TileY).Graphic(Layer), .PixelPosX + PixelOffsetX, .PixelPosY + PixelOffsetY, 0, 1, True, MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 1), MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 2), MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 3), MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 4)
End If
</vb>
Replace with:
<vb>
'Check if we have to draw with a shadow or not (slighty changes because we have to animate on the shadow, not the main render)
If MapData(.TileX, .TileY).Shadow(Layer) = 1 Then
Engine_Render_Grh MapData(.TileX, .TileY).Graphic(Layer), .PixelPosX + PixelOffsetX, .PixelPosY + PixelOffsetY, 0, 1, True, ShadowColor, ShadowColor, ShadowColor, ShadowColor, 1
Engine_Render_Grh MapData(.TileX, .TileY).Graphic(Layer), .PixelPosX + PixelOffsetX, .PixelPosY + PixelOffsetY, 0, 0, True, MapData(.TileX, .TileY).Light(LightOffset), MapData(.TileX, .TileY).Light(LightOffset + 1), MapData(.TileX, .TileY).Light(LightOffset + 2), MapData(.TileX, .TileY).Light(LightOffset + 3)
Else
Engine_Render_Grh MapData(.TileX, .TileY).Graphic(Layer), .PixelPosX + PixelOffsetX, .PixelPosY + PixelOffsetY, 0, 1, True, MapData(.TileX, .TileY).Light(LightOffset), MapData(.TileX, .TileY).Light(LightOffset + 1), MapData(.TileX, .TileY).Light(LightOffset + 2), MapData(.TileX, .TileY).Light(LightOffset + 3)
End If
</vb>
Find:
<vb>
For Layer = 4 To 6
</vb>
After, add:
<vb>
LightOffset = ((Layer - 1) * 4) + 1
</vb>
Find:
<vb>
If MapData(.TileX, .TileY).Shadow(Layer) = 1 Then
Engine_Render_Grh MapData(.TileX, .TileY).Graphic(Layer), .PixelPosX + PixelOffsetX, .PixelPosY + PixelOffsetY, 0, 1, True, ShadowColor, ShadowColor, ShadowColor, ShadowColor, 1
Engine_Render_Grh MapData(.TileX, .TileY).Graphic(Layer), .PixelPosX + PixelOffsetX, .PixelPosY + PixelOffsetY, 0, 0, True, MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 1), MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 2), MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 3), MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 4)
Else
Engine_Render_Grh MapData(.TileX, .TileY).Graphic(Layer), .PixelPosX + PixelOffsetX, .PixelPosY + PixelOffsetY, 0, 1, True, MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 1), MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 2), MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 3), MapData(.TileX, .TileY).Light(((Layer - 1) * 4) + 4)
End If
</vb>
Replace with:
<vb>
If MapData(.TileX, .TileY).Shadow(Layer) = 1 Then
Engine_Render_Grh MapData(.TileX, .TileY).Graphic(Layer), .PixelPosX + PixelOffsetX, .PixelPosY + PixelOffsetY, 0, 1, True, ShadowColor, ShadowColor, ShadowColor, ShadowColor, 1
Engine_Render_Grh MapData(.TileX, .TileY).Graphic(Layer), .PixelPosX + PixelOffsetX, .PixelPosY + PixelOffsetY, 0, 0, True, MapData(.TileX, .TileY).Light(LightOffset), MapData(.TileX, .TileY).Light(LightOffset + 1), MapData(.TileX, .TileY).Light(LightOffset + 2), MapData(.TileX, .TileY).Light(LightOffset + 3)
Else
Engine_Render_Grh MapData(.TileX, .TileY).Graphic(Layer), .PixelPosX + PixelOffsetX, .PixelPosY + PixelOffsetY, 0, 1, True, MapData(.TileX, .TileY).Light(LightOffset), MapData(.TileX, .TileY).Light(LightOffset + 1), MapData(.TileX, .TileY).Light(LightOffset + 2), MapData(.TileX, .TileY).Light(LightOffset + 3)
End If
</vb>
Find:
<vb> Public TileBufferSize As Integer </vb>
After, add:
<vb> Public TileBufferOffset As Long 'Used to calculate offset value in certain cases </vb>
Find:
<vb>
If TileBufferSize < 2 Then TileBufferSize = 2
</vb>
After, add:
<vb>
'Cache the TileBufferOffset value to prevent always having to calculate it on the fly TileBufferOffset = ((10 - TileBufferSize) * 32)
</vb>
Find every instance of:
<vb>
+ ((10 - TileBufferSize) * 32)
</vb>
Replace with:
<vb>
+ TileBufferOffset
</vb>
Fix - Objects in quests
Open GameServer.vbp.
Find:
<vb>
End If
'*** Quest was completed! ***
</vb>
Before, add:
<vb>
'If we made it through the whole loop without finding a slot (that is, if the slot = MAX_INVENTORY_SLOTS + 1) then
'the object was not found in the user's inventory at all, so give them the missing error and abort
If Slot = MAX_INVENTORY_SLOTS + 1 Then
Quest_SayIncomplete UserIndex, NPCIndex
Exit Sub
End If
</vb>
Fix - Character icon updating
Open GameServer.vbp.
Find:
<vb>
'*** Status icons ***
If UserList(UserIndex).Skills.Bless > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconBlessed
ConBuf.Put_Byte 1
ConBuf.Put_Integer UserList(UserIndex).Char.CharIndex
End If
If UserList(UserIndex).Skills.Protect > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconProtected
ConBuf.Put_Byte 1
ConBuf.Put_Integer UserList(UserIndex).Char.CharIndex
End If
If UserList(UserIndex).Skills.IronSkin > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconIronSkin
ConBuf.Put_Byte 1
ConBuf.Put_Integer UserList(UserIndex).Char.CharIndex
End If
If UserList(UserIndex).Skills.Strengthen > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconStrengthened
ConBuf.Put_Byte 1
ConBuf.Put_Integer UserList(UserIndex).Char.CharIndex
End If
If UserList(UserIndex).Skills.WarCurse > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconWarCursed
ConBuf.Put_Byte 1
ConBuf.Put_Integer UserList(UserIndex).Char.CharIndex
End If
</vb>
Replace with:
<vb>
'*** Status icons ***
With UserList(UserIndex)
If .Skills.Bless > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconBlessed
ConBuf.Put_Byte 1
ConBuf.Put_Integer .Char.CharIndex
End If
If .Skills.Protect > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconProtected
ConBuf.Put_Byte 1
ConBuf.Put_Integer .Char.CharIndex
End If
If .Skills.IronSkin > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconIronSkin
ConBuf.Put_Byte 1
ConBuf.Put_Integer .Char.CharIndex
End If
If .Skills.Strengthen > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconStrengthened
ConBuf.Put_Byte 1
ConBuf.Put_Integer .Char.CharIndex
End If
If .Skills.WarCurse > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconWarCursed
ConBuf.Put_Byte 1
ConBuf.Put_Integer .Char.CharIndex
End If
End With
</vb>
Find:
<vb>
'Send the NPC If SendPacket Then Data_Send sndRoute, sndIndex, ConBuf.Get_Buffer, Map
</vb>
Before, add:
<vb>
'*** Status icons ***
With NPCList(NPCIndex)
If .Skills.Bless > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconBlessed
ConBuf.Put_Byte 1
ConBuf.Put_Integer .Char.CharIndex
End If
If .Skills.Protect > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconProtected
ConBuf.Put_Byte 1
ConBuf.Put_Integer .Char.CharIndex
End If
If .Skills.IronSkin > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconIronSkin
ConBuf.Put_Byte 1
ConBuf.Put_Integer .Char.CharIndex
End If
If .Skills.Strengthen > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconStrengthened
ConBuf.Put_Byte 1
ConBuf.Put_Integer .Char.CharIndex
End If
If .Skills.WarCurse > 0 Then
ConBuf.Allocate 4
ConBuf.Put_Byte DataCode.Server_IconWarCursed
ConBuf.Put_Byte 1
ConBuf.Put_Integer .Char.CharIndex
End If
End With
</vb>
Add - Stat raise packet security
Open GameServer.vbp.
Find:
<vb>
'Raise the stat if possible
</vb>
Before, add:
<vb>
'Check for a valid class to add Select Case StatID
'Invalid stats
Case SID.DEF, SID.ELU, SID.ELV, SID.EXP, SID.Gold, SID.MaxMAN, SID.MaxSTA, SID.MaxHIT, _
SID.MaxHP, SID.MinMAN, SID.MinSTA, SID.MinHIT, SID.MinHP, SID.Points, SID.Speed
Exit Sub
End Select
</vb>
Fix - ToolGrhRawAssistant
Replace your copy of ToolGrhRawAssistant with that from v1.0.11.
Fix - Major rectangle render optimization
Open GameClient.vbp.
Find:
<vb>
If Degrees <> 0 Or Degrees <> 360 Then
</vb>
Replace with:
<vb>
If Degrees <> 0 And Degrees <> 360 Then
</vb>
Repeat the process for EditorMap.vbp.
Fix - NPC kill requirement crashing server loading
Open GameServer.vbp.
Find:
<vb> Public Sub Load_NPC_Names() </vb>
Replace whole sub with:
<vb> Public Sub Load_NPC_Names()
'***************************************************************** 'Loads the names of NPCs (only if they are used in a quest) '***************************************************************** Dim i As Long
'Grab all of the indexes of NPCs used in quests
DB_RS.Open "SELECT finish_req_killnpc FROM quests ORDER BY finish_req_killnpc DESC", DB_Conn, adOpenStatic, adLockOptimistic
If Val(DB_RS(0)) = 0 Then
'No NPCs used for quests, abort because we have no names we need
DB_RS.Close
Exit Sub
End If
'Resize the NPC name array by the highest index used (remember, we're ordered descending, so this is the highest index)
ReDim NPCName(1 To DB_RS(0))
'Loop through all the IDs
Do While Not DB_RS.EOF 'Loop until we reach the end of the recordset
'If the ID is used, mark it with ".", so we can get the real name later
If Val(DB_RS(0)) > 0 Then NPCName(Val(DB_RS(0))) = "."
'Move to the next record
DB_RS.MoveNext
Loop
DB_RS.Close
'Fill in the values
For i = 1 To UBound(NPCName)
'A "." states we need to get the name
If NPCName(i) = "." Then
'Get the name
DB_RS.Open "SELECT name FROM npcs WHERE id=" & i, DB_Conn, adOpenStatic, adLockOptimistic
NPCName(i) = Trim$(DB_RS(0))
DB_RS.Close
End If
Next i
End Sub </vb>
Fix - Removing damage text on map switch
Open GameClient.vbp.
Find:
<vb>
'Erase characters
LastChar = 0
Erase CharList
</vb>
After, add:
<vb>
'Erase damage
LastDamage = 0
Erase DamageList
</vb>
Fix - Quest log scaling down
Open GameClient.vbp.
Find:
<vb>
QuestInfo(Byt1).Name = vbNullString
</vb>
After, add:
<vb>
Lng1 = QuestInfoUBound
Do
If Lng1 = 0 Then Exit Do
If QuestInfo(Lng1).Name <> vbNullString Then Exit Do
Lng1 = Lng1 - 1
Loop
If Lng1 = 0 Then
Erase QuestInfo
QuestInfoUBound = 0
Else
ReDim Preserve QuestInfo(1 To Lng1)
QuestInfoUBound = Lng1
End If
</vb>