Unfortunately, I would do this myself but I lost my warcraft II CD so I don't have the installer. I was hoping somebody knew what the statstring would look like or maybe a refrence?
1 Unknown
2 Unknown
3 Game Speed
0x00: Slowest
0x01: Slower
0x02: Slow
0x03: Normal
0x04: Fast
0x05: Faster
0x06: Fastest
4 Approval
0x00: Not Approved
0x01: Blizzard Approved
0x02: Ladder Approved
0x03: PGL Approved
0x04: KBK Approved
0x05: CompUSA Approved
5 Game Type
0x02: Melee
0x03: FFA
0x04: 1v1
0x09: Ladder
0x0A: UMS
0x0F: TvB
0x10: Iron man ladder
6 Parameter; The value of this parameter depends on the game type.
7 Checksum; This is a checksum of the map file.
8 Starting Resources
9 Creator/Map name
These two values are separated by a 0x0D byte
edit;
I'm trying to create a ladder game but it has been nothing but an epic fail.
Thanks.
I have an idea of what it would be but not 100% sure, I don't think it would be like sc's but I could be wrong. If you dont have the game client to packet log try getting EUB Micro, or EUB Multiloader, one of those has war2 winbotting capabilities which you can packetlog.
First off: Documentation (http://www.bnetdocs.org/?op=packet&pid=265)
0000 FF 1C 5A 00 00 00 00 00 00 00 00 00 0F 00 04 00 ..Z.............
0010 1F 00 00 00 00 00 00 00 54 45 53 54 00 00 2C 2C ........TEST..,,
0020 2C 38 2C 31 2C 66 2C 34 2C 32 34 63 61 62 31 35 ,8,1,f,4,24cab15
0030 38 2C 32 30 30 2C 52 65 61 6C 69 74 79 52 69 70 8,200,RealityRip
0040 70 6C 65 0D 41 6C 6C 20 59 6F 75 20 4E 65 65 64 ple.All You Need
0050 20 42 4E 45 2E 70 75 64 0D 00 BNE.pud..
Game name: TEST
Game Pass: nothing
Game Map: All You Need BNE.pud
Game Type: Top vs Bottom (4v4)
Game Speed: Fastest
Resources: Default
Tileset: Default
One Peon: Yes
Fixed Order: No
Packet Log Explained:
State: 00 00 00 00
Time: 00 00 00 00
Type: 0F 00
Param: 04 00
Unknown: 1F 00 00 00
Ladder: 00 00 00 00
Name: 54 45 53 54 00 (TEST)
Pass: 00 (None)
Statstring: ,,,8,1,f,4,24cab158,200,RealityRipple.All You Need BNE.pud
Unknown: Blank
Unknown: Blank
Speed: 8 (Fastest)
Approval: 1 (Blizzard Approved)
Type: 0x0F (Top vs Bottom)
Param: 4
Checksum: 24cab158
Resources: 200
Creator: RealityRipple
Map: All You Need BNE.pud
Looks like the redux is wrong. According to bnetdocs, 0x06 is fastest but it seems 0x08 is fastest.
I fixed it. It didn't have all the possible values for speed.
This is the code I use to generate warcraft 3 stat strings.
''' <summary>Encodes game parameters, properties, etc.</summary>
''' <returns>The encoded string</returns>
''' <remarks>
''' 0 BYTE #slots-1 (text-hex)
''' 1 BYTE[8] host counter (text-hex)
''' encoded:
''' 2 DWORD settings
''' 3 BYTE[5] map size and other?
''' 4 DWORD hex key
''' 5 STRING map name
''' 6 STRING user name
''' 7 STRING unknown("")
''' </remarks>
Public Function generateStatString(ByVal hostCount As Integer) As Byte()
'free slots in text-hex
Dim bbSlots(0 To 0) As Byte
bbSlots(0) = CByte(Asc(Hex(slots.Count - 1).ToLower()))
'host counter in text-hex
Dim bbCount(0 To 7) As Byte
For i As Integer = 0 To 7
bbCount(i) = CByte(Asc(Hex(hostCount Mod 16).ToLower()))
hostCount \= 16
Next i
'settings
Dim b As Byte
Dim bbSettings(0 To 3) As Byte
b = 0
If False Then b = b Or CByte(&H80) 'unknown
If False Then b = b Or CByte(&H40) 'unknown
If False Then b = b Or CByte(&H20) 'unknown (set for the melee map "divide and conquer")
If False Then b = b Or CByte(&H10) 'unknown
If False Then b = b Or CByte(&H8) 'unknown
If False Then b = b Or CByte(&H4) 'unknown
If speed = SPD.FAST Then b = b Or CByte(&H2)
If speed = SPD.MEDIUM Then b = b Or CByte(&H1) '[other speed indicated by no fast or medium flags]
bbSettings(0) = b
b = 0
If False Then b = b Or CByte(&H80) 'unknown
If teamsTogether Then b = b Or CByte(&H40)
If observers = OBS.FULL_OBSERVERS Or observers = OBS.OBSERVERS_ON_DEFEAT Then b = b Or CByte(&H20)
If observers = OBS.FULL_OBSERVERS Then b = b Or CByte(&H10)
If visibility = VIS.MAP_DEFAULT Then b = b Or CByte(&H8)
If visibility = VIS.ALWAYS_VISIBLE Then b = b Or CByte(&H4)
If visibility = VIS.EXPLORED Then b = b Or CByte(&H2)
If visibility = VIS.HIDE_TERRAIN Then b = b Or CByte(&H1)
bbSettings(1) = b
b = 0
If False Then b = b Or CByte(&H80) 'unknown
If False Then b = b Or CByte(&H40) 'unknown
If False Then b = b Or CByte(&H20) 'unknown
If False Then b = b Or CByte(&H10) 'unknown
If False Then b = b Or CByte(&H8) 'unknown
If lockTeams Then b = b Or CByte(&H4)
If lockTeams Then b = b Or CByte(&H2) 'why lock teams again?
If False Then b = b Or CByte(&H1) 'unknown
bbSettings(2) = b
b = 0
If False Then b = b Or CByte(&H80) 'unknown
If observers = OBS.REFEREES Then b = b Or CByte(&H40)
If False Then b = b Or CByte(&H20) 'unknown
If False Then b = b Or CByte(&H10) 'unknown
If False Then b = b Or CByte(&H8) 'unknown
If randomHero Then b = b Or CByte(&H4)
If randomRace Then b = b Or CByte(&H2)
If allowFullSharedControl Then b = b Or CByte(&H1)
bbSettings(3) = b
'size
Dim bbSize(0 To 4) As Byte
bbSize(0) = 0 'unknown
bbSize(1) = playableWidth
bbSize(2) = 0 'unknown
bbSize(3) = playableHeight
bbSize(4) = 0 'unknown
'encode
Dim bb() As Byte = BnetCrypt.encodePreMaskedByteArray( _
concat( _
bbSettings, _
bbSize, _
hexKey, _
packString(My.Settings.relMapPath + name, True), _
packString(My.Settings.username, True), _
packString("", True) _
))
Return concat(bbSlots, bbCount, bb, array(Of Byte)(0))
End Function
Public Shared Function encodePreMaskedByteArray(ByVal bbDecoded() As Byte) As Byte()
Dim n As Integer = bbDecoded.Length
Dim numBlocks As Integer = CInt(Math.Ceiling(n / 7))
Dim bbCoded(0 To n + numBlocks - 1) As Byte
'For each chunk
For i As Integer = 0 To numBlocks - 1
Dim d As Integer = i * 7 'position in decoded array
Dim c As Integer = i * 8 + 1 'position in coded array
Dim header As Byte = 1 'placed before the chunk in destination
Dim p As Byte = &H2 'bit mask
'Process chunk
For j As Integer = 0 To 6
If d + j >= n Then Exit For
bbCoded(c + j) = bbDecoded(d + j) Or CByte(&H1) 'place in coded array with first bit forced to 1
If (bbDecoded(d + j) And &H1) = 1 Then header = header Or p 'place first bit in header
p <<= 1 'next bit
Next j
'place header in destination array
bbCoded(c - 1) = header
Next i
Return bbCoded
End Function
what's with all the 'If False Then' ?
When I originally wrote it I was finding out what a new bit meant relatively often, so I just preplaced all the bit lines and put 'False' on the ones I didn't know the function of yet.
Quote from: Strilanc on August 30, 2008, 06:20 PM
When I originally wrote it I was finding out what a new bit meant relatively often, so I just preplaced all the bit lines and put 'False' on the ones I didn't know the function of yet.
But the block of code after the if then will never occur since it is always False. Wouldn't it be more sensible to just comment out the line?
Quote from: Yegg on August 30, 2008, 10:53 PM
Quote from: Strilanc on August 30, 2008, 06:20 PM
When I originally wrote it I was finding out what a new bit meant relatively often, so I just preplaced all the bit lines and put 'False' on the ones I didn't know the function of yet.
But the block of code after the if then will never occur since it is always False. Wouldn't it be more sensible to just comment out the line?
What's the difference? Just comment them out yourself if you don't like them. The compiler probably removes them anyways.
Quote from: Strilanc on September 01, 2008, 08:55 PM
Quote from: Yegg on August 30, 2008, 10:53 PM
Quote from: Strilanc on August 30, 2008, 06:20 PM
When I originally wrote it I was finding out what a new bit meant relatively often, so I just preplaced all the bit lines and put 'False' on the ones I didn't know the function of yet.
But the block of code after the if then will never occur since it is always False. Wouldn't it be more sensible to just comment out the line?
What's the difference? Just comment them out yourself if you don't like them. The compiler probably removes them anyways.
Because it makes for bag/ugly coding in general. And in the end, it's stupid.
What do warcraft 3 statstrings have to do with anything?