Imports System.Runtime.InteropServices Public Class GlobalMembers Public Shared Function BM16toString(ByVal val As UInt32) As String Dim str(16) As String For i As Integer = 0 To 15 If val And (1 << (15 - i)) Then str(i) = "1"c Else str(i) = "0"c End If Next i str(16) = &H0 Return str.ToString End Function Public Shared Function BM32toString(ByVal val As UInt32) As String Dim str(32) As String For i As Integer = 0 To 31 If val And (1 << (31 - i)) Then str(i) = "1"c Else str(i) = "0"c End If Next i str(32) = &H0 Return str.ToString End Function End Class Public Class wdbheader_t Public signature As Byte() Public ver As UInt32 Public lang As Byte() Public fields As UInt32 Public unknown2 As UInt32 End Class _ Public Structure wdbfield_t _ Public uival As UInt32 _ Public sival As UInt32 _ Public fval As Single _ Public pchar As String End Structure Public Enum wdbfieldtypes t_undefined = 1 << 0 t_uint = 1 << 1 t_sint = 1 << 2 t_float = 1 << 3 t_bitmask16 = 1 << 4 t_bitmask32 = 1 << 5 t_str = 1 << 6 t_special2byte = 1 << 7 End Enum ' defines #Const MAXFIELDS = True #Const DELIMETER = True Friend NotInheritable Class DefineConstants Public Const MAXFIELDS As Integer = 256 Public Const DELIMETER As String = "," End Class Public Class CWDBDef Private m_fieldtypes As UInt16() = New UInt16(DefineConstants.MAXFIELDS - 1) {} Private m_fields As UInt32 Private m_index As UInt16 Private isReadable As Boolean Private signature(4) As Char Private m_fieldnames As String() = New String(DefineConstants.MAXFIELDS - 1) {} Private m_wdbname As String Public Function getSignature() As String Return signature(0) End Function Public Function getFieldName(ByVal index As UInt32) As String If index > m_fields Then Return 0 End If If (Not m_fieldnames(index - 1).ToString()) Then Return "" End If Return CType(m_fieldnames(index - 1).ToString(), SByte) End Function Public Function getWDBName() As String Return CType(m_wdbname.ToString(), SByte) End Function Public Function getFieldType(ByVal index As UInt32) As UInt16 Return m_fieldtypes(index - 1) End Function Public Function getNumFields() As UInt32 Return m_fields End Function Public Sub addField(ByVal fieldtype As Integer, ByRef name As String) m_fieldtypes(m_index) = fieldtype m_fieldnames(m_index) = name m_index += 1 m_fields += 1 End Sub Public Sub setNumFields(ByVal nfields As UInt32) m_fields = nfields End Sub Public Sub setFieldType(ByVal index As UInt32, ByVal fieldtype As Integer) m_fieldtypes(index - 1) = fieldtype End Sub Public Sub setFieldName(ByVal index As UInt32, ByRef name As String) m_fieldnames(index - 1) = name End Sub Public Sub setWDBName(ByRef name As String) m_wdbname = name End Sub Public Sub setSignature(ByRef sig As String) signature(0) = sig m_index = 0 m_fields = 0 End Sub Public Sub New(ByVal fields As UInt32, ByRef name As String) m_fields = fields m_wdbname = name End Sub Public Sub New() m_fields = 0 m_index = 0 End Sub Protected Overrides Sub Finalize() End Sub End Class Public Class CWDBRecord Private m_fields As wdbfield_t() = New wdbfield_t(DefineConstants.MAXFIELDS - 1) {} Public Function getField(ByVal index As Integer) As wdbfield_t Return m_fields(index - 1) End Function Public Sub addField(ByVal field As wdbfield_t, ByVal index As Integer) m_fields(index - 1) = field End Sub End Class Public Class CWDB Private m_def As CWDBDef Private m_data As String Private m_datasize As UInt32 ' Private m_records As vector(Of CWDBRecord) Private isLoaded As Boolean Private m_header As wdbheader_t ' Boolean loadWDB(SByte* file) Public Function getField(ByVal recindex As UInt32, ByVal fieldindex As UInt32) As wdbfield_t Return m_records.at(recindex).getField(fieldindex) End Function Public Function toCSV(ByRef file As String) As Boolean Dim file2 As String '= New String(file.Length + 5 - 1) {} Dim buff As String file2 = file file2 = file2 & ".csv" Dim pFile As FileIO.FileSystem = fopen(file2, "w") If (Not pFile) Then Return False End If ' write headers For i As UInt32 = 1 To m_def.getNumFields() If (Not String.Compare(m_def.getFieldName(i), Constants.vbNullChar)) Then fprintf(pFile, "Column %i", i) Else fputs(m_def.getFieldName(i), pFile) End If fputs(DefineConstants.DELIMETER, pFile) Next i fprintf(pFile, Constants.vbLf) ' write data For r As UInt32 = 0 To m_records.size() - 1 For f As UInt32 = 1 To m_def.getNumFields() If m_def.getFieldType(f) And wdbfieldtypes.t_uint Then fprintf(pFile, "%u", getField(r, f).uival) ElseIf m_def.getFieldType(f) And wdbfieldtypes.t_sint Then fprintf(pFile, "%i", getField(r, f).sival) ElseIf m_def.getFieldType(f) And t_float Then fprintf(pFile, "%f", getField(r, f).fval) ElseIf m_def.getFieldType(f) And wdbfieldtypes.t_str Then ' Add quotes around strings to support line breaks and commas sprintf(buff, ChrW(&H22).ToString() & "%s" & ChrW(&H22).ToString(), getField(r, f).pchar) fprintf(pFile, "%s", buff) ElseIf m_def.getFieldType(f) And t_bitmask16 Then fprintf(pFile, "%s", GlobalMembers.BM16toString(getField(r, f).uival)) ElseIf m_def.getFieldType(f) And t_bitmask32 Then fprintf(pFile, "%s", GlobalMembers.BM32toString(getField(r, f).uival)) ' undefined Else fprintf(pFile, "%u", getField(r, f).uival) End If fputs(DefineConstants.DELIMETER, pFile) Next f fprintf(pFile, Constants.vbLf) Next r fclose(pFile) Return True End Function Private Sub parseWDB() Dim tRec As CWDBRecord Dim tField As wdbfield_t Dim recID As wdbfield_t Dim recSize As wdbfield_t Dim pm_data As wdbfield_t = CType(m_data, wdbfield_t) Dim pcm_data As SByte Dim psm_data As UInt16 Dim sLen As UInt32 Dim i As Integer i = 0 Do While i < &HFFFF recID = pm_data pm_data = pm_data + 1 If CType(CType(pm_data, SByte) - m_data, UInt32) >= m_datasize Then Exit Do End If ' break if invalid ID If recID.uival < 1 Then Exit Do End If tField.uival = recID.uival tRec.addField(tField, 1) recSize = pm_data ' pm_data += 1 tField.uival = recSize.uival ' break if the size of the record is less then 4 bytes If recSize.uival < 4 Then Exit Do End If tRec.addField(tField, 2) For j As UInt32 = 3 To m_def.getNumFields() ' if the field is a string, the wdbfield will simply contain a pointer to the string ' in the m_data block If m_def.getFieldType(j) And wdbfieldtypes.t_str Then sLen = Convert.ToString(CType(pm_data.pchar, SByte)).Length tField.pchar = CType(pm_data.fval, SByte) pcm_data = CType(pm_data.pchar, SByte) pcm_data += sLen + 1 pm_data = CType(pcm_data, wdbfield_t) ' special case that occurs in creaturecache.wdb ElseIf m_def.getFieldType(j) And wdbfieldtypes.t_special2byte Then Dim sField As UInt16 psm_data = CType(pm_data.fval, UInt16) sField = psm_data tField.uival = CType(sField, UInt32) psm_data += 1 pm_data = CType(psm_data, wdbfield_t) Else tField = pm_data pm_data += 1 End If tRec.addField(tField, j) Next j m_records.push_back(tRec) i += 1 Loop Console.Write("{0:D} records loaded." & Constants.vbLf, i) End Sub Private Sub setDef(ByRef def As CWDBDef) m_def = def End Sub Private Function getDef() As CWDBDef Return m_def End Function Private Function getHeader() As wdbheader_t Return m_header End Function ' globals Private gDefList As CWDBDef Private Function loadWDB(ByRef file As String) As Boolean Dim wdb As New wdbheader_t Dim fin As New System.IO.FileStream(file, IO.FileMode.OpenOrCreate) Dim isMatch As Boolean = False If (Not fin.CanRead) Then Return False End If redim wdb.lang(4) as byte Dim tlength As UInt32 Dim buffer(fin.Length) As Byte fin.Read(buffer, 0, fin.Length) ' sometimes the number of fields can be deceiving! Did I mention I hate WDB files? If m_header.fields < ((DefineConstants.MAXFIELDS - 2) * 4) Then m_header.fields /= 4 m_header.fields += 2 End If ' Set definition based on signature For i As UInt32 = 0 To gDefList.getSignature - 1 If (Not StrComp(m_header.signature, gDefList.getSignature(i), 4)) Then isMatch = True Console.Write("Signature matches {0}" & Constants.vbLf, gDefList.at(i).getWDBName()) m_def = gDefList.at(i) ' if fieldsize is incorrect, adjust accordingly If m_header.fields < ((DefineConstants.MAXFIELDS - 2) * 4) Then If m_def.getNumFields() <> m_header.fields Then Console.Write("WARNING: Number of fields does not match definition," & Constants.vbLf) Console.Write(" Temporarily adjusting fieldsize, this may be an older/newer version." & Constants.vbLf + Constants.vbLf) Console.Write("NEW FIELD INFO:" & Constants.vbLf + Constants.vbTab & "New fields: {0:D}" & Constants.vbLf + Constants.vbLf, m_header.fields - m_def.getNumFields()) ' adjust fieldsize m_def.setNumFields(m_header.fields) End If End If End If Next i If (Not isMatch) Then Console.Write("Header does not match any known WDB file." & Constants.vbLf) Return False End If fin.Seek(0, IO.SeekOrigin.End) tlength = fin.Length tlength -= sizeof(wdbheader_t) m_data = New SByte(tlength - 1) {} m_datasize = tlength fin.seekg(sizeof(wdbheader_t)) fin.Read(m_data, 0, tlength) fin.Close() Return True End Function Private Sub LoadDefinitions() Dim def As CWDBDef ' creaturecache.wdb (BOMW) def.setWDBName("creaturecache.wdb") def.setSignature("BOMW") ' 15 fields def.addField(wdbfieldtypes.t_uint, "CreatureID") def.addField(wdbfieldtypes.t_uint, "Entry Size") def.addField(wdbfieldtypes.t_str, "Name 1") def.addField(wdbfieldtypes.t_str, "Name 2") def.addField(wdbfieldtypes.t_str, "Name 3") def.addField(wdbfieldtypes.t_str, "Name 4") def.addField(wdbfieldtypes.t_str, "Description") def.addField(wdbfieldtypes.t_uint, "") ' unknown def.addField(wdbfieldtypes.t_uint, "TypeID") def.addField(wdbfieldtypes.t_uint, "FamilyID") def.addField(wdbfieldtypes.t_uint, "FlagID") def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_uint, "SpellDataID") def.addField(wdbfieldtypes.t_uint, "IconID") #If _BC Then def.addField(wdbfieldtypes.t_uint,"") def.addField(wdbfieldtypes.t_uint,"") #End If def.addField(wdbfieldtypes.t_special2byte Or wdbfieldtypes.t_uint, "") ' stupid 2byte field! gDefList.push_back(def) ' gameobjectcache.wdb (BOGW) def.setWDBName("gameobjectcache.wdb") def.setSignature("BOGW") ' 33 fields def.addField(wdbfieldtypes.t_uint, "ObjectID") def.addField(wdbfieldtypes.t_uint, "Entry Size") def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_str, "Name 1") def.addField(wdbfieldtypes.t_str, "Name 2") def.addField(wdbfieldtypes.t_str, "Name 3") def.addField(wdbfieldtypes.t_str, "Name 4") def.addField(wdbfieldtypes.t_str, "Str?") #If _BC Then def.addField(wdbfieldtypes.t_str,"Str?") def.addField(wdbfieldtypes.t_str,"Str?") #End If def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown def.addField(wdbfieldtypes.t_undefined, "") ' unknown gDefList.push_back(def) ' itemcache.wdb (BDIW) def.setWDBName("itemcache.wdb") def.setSignature("BDIW") #If _BC Then ' 131 fields #Else ' 130 fields #End If def.addField(wdbfieldtypes.t_uint, "ItemID") def.addField(wdbfieldtypes.t_uint, "Entry Size") def.addField(wdbfieldtypes.t_uint, "ItemClassID") def.addField(wdbfieldtypes.t_uint, "ItemSubClassID") #If _BC Then def.addField(wdbfieldtypes.t_sint,"Unknown") #End If def.addField(wdbfieldtypes.t_str, "Name 1") def.addField(wdbfieldtypes.t_str, "Name 2") def.addField(wdbfieldtypes.t_str, "Name 3") def.addField(wdbfieldtypes.t_str, "Name 4") def.addField(wdbfieldtypes.t_uint, "ItemDisplayID") def.addField(wdbfieldtypes.t_uint, "Quality") def.addField(wdbfieldtypes.t_uint, "Type Flags") def.addField(wdbfieldtypes.t_uint, "Buy Price") def.addField(wdbfieldtypes.t_uint, "Sell Price") def.addField(wdbfieldtypes.t_uint, "Inventory Slot") def.addField(wdbfieldtypes.t_uint, "Class Flags") def.addField(wdbfieldtypes.t_uint, "Race Flags") def.addField(wdbfieldtypes.t_uint, "Item Level") def.addField(wdbfieldtypes.t_uint, "Req Level") def.addField(wdbfieldtypes.t_uint, "Req Skill") def.addField(wdbfieldtypes.t_uint, "Req Skill Level") def.addField(wdbfieldtypes.t_uint, "Req Spell") def.addField(wdbfieldtypes.t_uint, "Req Rank") def.addField(wdbfieldtypes.t_uint, "Req Rank2") def.addField(wdbfieldtypes.t_uint, "Req Faction") def.addField(wdbfieldtypes.t_uint, "Req Faction LvL") def.addField(wdbfieldtypes.t_uint, "isUnique") def.addField(wdbfieldtypes.t_uint, "Stack Amount") def.addField(wdbfieldtypes.t_uint, "Container Slots") def.addField(wdbfieldtypes.t_sint, "Stat1") def.addField(wdbfieldtypes.t_uint, "Stat1 Val") def.addField(wdbfieldtypes.t_sint, "Stat2") def.addField(wdbfieldtypes.t_uint, "Stat2 Val") def.addField(wdbfieldtypes.t_sint, "Stat3") def.addField(wdbfieldtypes.t_uint, "Stat3 Val") def.addField(wdbfieldtypes.t_sint, "Stat4") def.addField(wdbfieldtypes.t_uint, "Stat4 Val") def.addField(wdbfieldtypes.t_sint, "Stat5") def.addField(wdbfieldtypes.t_uint, "Stat5 Val") def.addField(wdbfieldtypes.t_sint, "Stat6") def.addField(wdbfieldtypes.t_uint, "Stat6 Val") def.addField(wdbfieldtypes.t_sint, "Stat7") def.addField(wdbfieldtypes.t_uint, "Stat7 Val") def.addField(wdbfieldtypes.t_sint, "Stat8") def.addField(wdbfieldtypes.t_uint, "Stat8 Val") def.addField(wdbfieldtypes.t_sint, "Stat9") def.addField(wdbfieldtypes.t_uint, "Stat9 Val") def.addField(wdbfieldtypes.t_sint, "Stat10") def.addField(wdbfieldtypes.t_uint, "Stat10 Val") def.addField(wdbfieldtypes.t_float, "Damage1 Min") def.addField(wdbfieldtypes.t_float, "Damage1 Max") def.addField(wdbfieldtypes.t_uint, "Damage1 Type") def.addField(wdbfieldtypes.t_float, "Damage2 Min") def.addField(wdbfieldtypes.t_float, "Damage2 Max") def.addField(wdbfieldtypes.t_uint, "Damage2 Type") def.addField(wdbfieldtypes.t_float, "Damage3 Min") def.addField(wdbfieldtypes.t_float, "Damage3 Max") def.addField(wdbfieldtypes.t_uint, "Damage3 Type") def.addField(wdbfieldtypes.t_float, "Damage4 Min") def.addField(wdbfieldtypes.t_float, "Damage4 Max") def.addField(wdbfieldtypes.t_uint, "Damage4 Type") def.addField(wdbfieldtypes.t_float, "Damage5 Min") def.addField(wdbfieldtypes.t_float, "Damage5 Max") def.addField(wdbfieldtypes.t_uint, "Damage5 Type") def.addField(wdbfieldtypes.t_uint, "Physical Resist") def.addField(wdbfieldtypes.t_uint, "Holy Resist") def.addField(wdbfieldtypes.t_uint, "Fire Resist") def.addField(wdbfieldtypes.t_uint, "Nature Resist") def.addField(wdbfieldtypes.t_uint, "Frost Resist") def.addField(wdbfieldtypes.t_uint, "Shadow Resist") def.addField(wdbfieldtypes.t_uint, "Arcane Resist") def.addField(wdbfieldtypes.t_uint, "Weapon Delay") def.addField(wdbfieldtypes.t_uint, "Ammo Type") def.addField(wdbfieldtypes.t_float, "Range Mod") def.addField(wdbfieldtypes.t_uint, "Spell1 ID") def.addField(wdbfieldtypes.t_uint, "Spell1 Trigger") def.addField(wdbfieldtypes.t_uint, "Spell1 Charges") def.addField(wdbfieldtypes.t_sint, "Spell1 Cooldown") def.addField(wdbfieldtypes.t_uint, "Spell1 Category") def.addField(wdbfieldtypes.t_sint, "Spell1 Category Cooldown") def.addField(wdbfieldtypes.t_uint, "Spell2 ID") def.addField(wdbfieldtypes.t_uint, "Spell2 Trigger") def.addField(wdbfieldtypes.t_uint, "Spell2 Charges") def.addField(wdbfieldtypes.t_sint, "Spell2 Cooldown") def.addField(wdbfieldtypes.t_uint, "Spell2 Category") def.addField(wdbfieldtypes.t_sint, "Spell2 Category Cooldown") def.addField(wdbfieldtypes.t_uint, "Spell3 ID") def.addField(wdbfieldtypes.t_uint, "Spell3 Trigger") def.addField(wdbfieldtypes.t_uint, "Spell3 Charges") def.addField(wdbfieldtypes.t_sint, "Spell3 Cooldown") def.addField(wdbfieldtypes.t_uint, "Spell3 Category") def.addField(wdbfieldtypes.t_sint, "Spell3 Category Cooldown") def.addField(wdbfieldtypes.t_uint, "Spell4 ID") def.addField(wdbfieldtypes.t_uint, "Spell4 Trigger") def.addField(wdbfieldtypes.t_uint, "Spell4 Charges") def.addField(wdbfieldtypes.t_sint, "Spell4 Cooldown") def.addField(wdbfieldtypes.t_uint, "Spell4 Category") def.addField(wdbfieldtypes.t_sint, "Spell4 Category Cooldown") def.addField(wdbfieldtypes.t_uint, "Spell5 ID") def.addField(wdbfieldtypes.t_uint, "Spell5 Trigger") def.addField(wdbfieldtypes.t_uint, "Spell5 Charges") def.addField(wdbfieldtypes.t_sint, "Spell5 Cooldown") def.addField(wdbfieldtypes.t_uint, "Spell5 Category") def.addField(wdbfieldtypes.t_sint, "Spell5 Category Cooldown") def.addField(wdbfieldtypes.t_uint, "BondID") def.addField(wdbfieldtypes.t_str, "Description") def.addField(wdbfieldtypes.t_uint, "BookTextID") def.addField(wdbfieldtypes.t_uint, "Book Pages") def.addField(wdbfieldtypes.t_uint, "BookStationaryID") def.addField(wdbfieldtypes.t_uint, "BeginQuestID") def.addField(wdbfieldtypes.t_uint, "reqLockPickSkill") def.addField(wdbfieldtypes.t_sint, "Material") def.addField(wdbfieldtypes.t_uint, "SheathID") def.addField(wdbfieldtypes.t_uint, "RandomPropertyID") #If _BC Then def.addField(wdbfieldtypes.t_uint,"Unknown") #End If def.addField(wdbfieldtypes.t_uint, "Block Value") def.addField(wdbfieldtypes.t_uint, "ItemSetID") def.addField(wdbfieldtypes.t_uint, "Durability") def.addField(wdbfieldtypes.t_uint, "ItemAreaID") def.addField(wdbfieldtypes.t_uint, "ItemMapID") def.addField(wdbfieldtypes.t_uint, "Bag Family") def.addField(wdbfieldtypes.t_uint, "Totem Category") def.addField(wdbfieldtypes.t_uint, "Socket Color 1") def.addField(wdbfieldtypes.t_uint, "Unknown") def.addField(wdbfieldtypes.t_uint, "Socket Color 2") def.addField(wdbfieldtypes.t_uint, "Unknown") def.addField(wdbfieldtypes.t_uint, "Socket Color 3") def.addField(wdbfieldtypes.t_uint, "Unknown") def.addField(wdbfieldtypes.t_uint, "SpellItemEnchantment") def.addField(wdbfieldtypes.t_uint, "Gem Properties") def.addField(wdbfieldtypes.t_uint, "Honor cost") def.addField(wdbfieldtypes.t_uint, "Unknown") gDefList.push_back(def) ' itemnamecache.wdb (BDNW) def.setWDBName("itemnamecache.wdb") def.setSignature("BDNW") ' 3 fields def.addField(wdbfieldtypes.t_uint, "ItemID") def.addField(wdbfieldtypes.t_uint, "Entry Size") def.addField(wdbfieldtypes.t_str, "Item Name") gDefList.push_back(def) ' itemtextcache.wdb (XTIW) def.setWDBName("itemnamecache.wdb") def.setSignature("XTIW") ' 3 fields def.addField(wdbfieldtypes.t_uint, "EntryID") def.addField(wdbfieldtypes.t_uint, "Entry Size") def.addField(wdbfieldtypes.t_str, "Text") gDefList.push_back(def) ' npccache.wdb (CPNW) def.setWDBName("npccache.wdb") def.setSignature("CPNW") ' 82 fields def.addField(wdbfieldtypes.t_uint, "EntryID") def.addField(wdbfieldtypes.t_uint, "Entry Size") For i As Integer = 3 To 73 Step 10 def.addField(wdbfieldtypes.t_float, "") def.addField(wdbfieldtypes.t_str, "") def.addField(wdbfieldtypes.t_str, "") def.addField(wdbfieldtypes.t_uint, "") def.addField(wdbfieldtypes.t_uint, "") def.addField(wdbfieldtypes.t_uint, "") def.addField(wdbfieldtypes.t_uint, "") def.addField(wdbfieldtypes.t_uint, "") def.addField(wdbfieldtypes.t_uint, "") def.addField(wdbfieldtypes.t_uint, "") Next i ' unknowns gDefList.push_back(def) ' pagetextcache.wdb (XTPW) def.setWDBName("pagetextcache.wdb") def.setSignature("XTPW") ' 4 fields def.addField(wdbfieldtypes.t_uint, "ItemID") def.addField(wdbfieldtypes.t_uint, "Entry Size") def.addField(wdbfieldtypes.t_str, "Page Text") def.addField(wdbfieldtypes.t_uint, "NextPageID") gDefList.push_back(def) ' questcache.wdb (TSQW) def.setWDBName("questcache.wdb") def.setSignature("TSQW") ' 66 fields ' 67 BC fields def.addField(wdbfieldtypes.t_uint, "QuestID") def.addField(wdbfieldtypes.t_uint, "Entry Size") def.addField(wdbfieldtypes.t_uint, "QuestID2") def.addField(wdbfieldtypes.t_uint, "") def.addField(wdbfieldtypes.t_uint, "Level") def.addField(wdbfieldtypes.t_uint, "AreaID") def.addField(wdbfieldtypes.t_uint, "InfoID") def.addField(wdbfieldtypes.t_undefined, "") def.addField(wdbfieldtypes.t_undefined, "") def.addField(wdbfieldtypes.t_undefined, "") def.addField(wdbfieldtypes.t_undefined, "") #If _BC Then def.addField(t_undefined,"") #End If def.addField(wdbfieldtypes.t_uint, "NextQuestID") def.addField(wdbfieldtypes.t_sint, "CoinReward") def.addField(wdbfieldtypes.t_uint, "CoinRewardOnExp") def.addField(wdbfieldtypes.t_uint, "SpellReward") def.addField(wdbfieldtypes.t_undefined, "") def.addField(wdbfieldtypes.t_uint, "StartItemID") def.addField(wdbfieldtypes.t_uint, "QuestFlags") def.addField(wdbfieldtypes.t_uint, "ItemReward1") def.addField(wdbfieldtypes.t_uint, "ItemAmount1") def.addField(wdbfieldtypes.t_uint, "ItemReward2") def.addField(wdbfieldtypes.t_uint, "ItemAmount2") def.addField(wdbfieldtypes.t_uint, "ItemReward3") def.addField(wdbfieldtypes.t_uint, "ItemAmount3") def.addField(wdbfieldtypes.t_uint, "ItemReward4") def.addField(wdbfieldtypes.t_uint, "ItemAmount4") def.addField(wdbfieldtypes.t_uint, "ItemChoice1") def.addField(wdbfieldtypes.t_uint, "ItemChoiceAmount1") def.addField(wdbfieldtypes.t_uint, "ItemChoice2") def.addField(wdbfieldtypes.t_uint, "ItemChoiceAmount2") def.addField(wdbfieldtypes.t_uint, "ItemChoice3") def.addField(wdbfieldtypes.t_uint, "ItemChoiceAmount3") def.addField(wdbfieldtypes.t_uint, "ItemChoice4") def.addField(wdbfieldtypes.t_uint, "ItemChoiceAmount4") def.addField(wdbfieldtypes.t_uint, "ItemChoice5") def.addField(wdbfieldtypes.t_uint, "ItemChoiceAmount5") def.addField(wdbfieldtypes.t_uint, "ItemChoice6") def.addField(wdbfieldtypes.t_uint, "ItemChoiceAmount6") def.addField(wdbfieldtypes.t_undefined, "") def.addField(wdbfieldtypes.t_undefined, "") def.addField(wdbfieldtypes.t_undefined, "") def.addField(wdbfieldtypes.t_undefined, "") def.addField(wdbfieldtypes.t_str, "Name") def.addField(wdbfieldtypes.t_str, "Description") def.addField(wdbfieldtypes.t_str, "Details") def.addField(wdbfieldtypes.t_str, "Subdescription") def.addField(wdbfieldtypes.t_uint, "KillCreature1") def.addField(wdbfieldtypes.t_uint, "KillCreature1Amount") def.addField(wdbfieldtypes.t_uint, "CollectItem1") def.addField(wdbfieldtypes.t_uint, "CollectItem1Amount") def.addField(wdbfieldtypes.t_uint, "KillCreature2") def.addField(wdbfieldtypes.t_uint, "KillCreature2Amount") def.addField(wdbfieldtypes.t_uint, "CollectItem2") def.addField(wdbfieldtypes.t_uint, "CollectItem2Amount") def.addField(wdbfieldtypes.t_uint, "KillCreature3") def.addField(wdbfieldtypes.t_uint, "KillCreature3Amount") def.addField(wdbfieldtypes.t_uint, "CollectItem3") def.addField(wdbfieldtypes.t_uint, "CollectItem3Amount") def.addField(wdbfieldtypes.t_uint, "KillCreature4") def.addField(wdbfieldtypes.t_uint, "KillCreature4Amount") def.addField(wdbfieldtypes.t_uint, "CollectItem4") def.addField(wdbfieldtypes.t_uint, "CollectItem4Amount") def.addField(wdbfieldtypes.t_str, "Objective1") def.addField(wdbfieldtypes.t_str, "Objective2") def.addField(wdbfieldtypes.t_str, "Objective3") def.addField(wdbfieldtypes.t_str, "Objective4") gDefList.push_back(def) ' wowcache.wdb (NDRW) def.setWDBName("wowcache.wdb") def.setSignature("NDRW") ' 4 fields def.addField(wdbfieldtypes.t_undefined, "") def.addField(wdbfieldtypes.t_undefined, "") def.addField(wdbfieldtypes.t_undefined, "") def.addField(wdbfieldtypes.t_undefined, "") gDefList.push_back(def) End Sub Private Sub doexit() gDefList.empty() 'printf("\nPress any key to exit."); 'char trash = getch(); End Sub Friend Function main(ByVal argc As Integer, ByRef argv As String()) As Integer Console.Write("** WDB to CSV**" & Constants.vbLf & "by: Jb55" & Constants.vbLf & "Website: http://www.jb55.com" & Constants.vbLf & "Contact: jackbox55@gmail.com" & Constants.vbLf + Constants.vbLf) If argc < 2 Then Console.Write("usage: wdbtocsv.exe (drag the wdb onto this file)" & Constants.vbLf) doexit() Return 0 End If LoadDefinitions() #If _SPEED Then Dim starttime As _timeb Dim endtime As _timeb Dim diff As UShort _ftime(starttime) #End If If (Not loadWDB(argv(1))) Then doexit() Console.Write("There was an error loading the WDB." & Constants.vbLf) Return 0 End If parseWDB() If (Not toCSV(argv(1))) Then doexit() Console.Write("There was an error creating the CSV file." & Constants.vbLf) Return 0 End If #If _SPEED Then _ftime(endtime) diff = endtime.millitm - starttime.millitm Console.Write("Time elapsed parsing and building csv (milliseconds): {0:D}" & Constants.vbLf,diff) #End If doexit() Return 0 End Function End Class