Advertisement
Guest User

Untitled

a guest
Jun 5th, 2017
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 66.63 KB | None | 0 0
  1. Script("Name") = "Nexus"
  2. Script("Major") = 1
  3. Script("Minor") = 0
  4. Script("Revision") = 124
  5. Script("Author") = "Neco"
  6.  
  7. ' PLEASE NOTE THAT A LOT OF CONTENT WAS MODIFIED FROM RIBOSE's "NUKE SCRIPT"
  8. ' HE DESERVES PARTIAL, IF NOT FULL, CREDITS IN THIS PROJECT
  9. ' OH AND ALSO A BIG THANKS TO TUCK FOR ASSISTING WITH PACKET DATA!
  10. ' ANOTHER BIG THANKS TO TUCK FOR MAKING THE COMMAND HANDLING!!
  11.  
  12. '---- EDITABLE SETTINGS ----
  13.  
  14. Public Const DebugInfo = False '// Displays packet information in the bot console
  15. Public Const Detail = True
  16. Public BotName : BotName = BotVars.Username '// Allows you to name spoof
  17. Public Const Failsafe = False
  18. Public CheckCommand : CheckCommand = False
  19. Public Download : Download = False
  20. Public DOWNLOADSPOOF : DOWNLOADSPOOF = 0
  21. Public DOWNLOADINCREMENT : DOWNLOADINCREMENT = 0
  22.  
  23. '---- DO NOT EDIT FROM HERE ON IN ----
  24. Private GameList : Set GameList = CreateObject("Scripting.Dictionary")
  25. Private Game : Set Game = Nothing
  26. Private ListAction : ListAction = 0
  27. Private PlayerList : Set PlayerList = CreateObject("Scripting.Dictionary")
  28. Private LastClicked : LastClicked = vbNullString
  29. Private Connected : Connected = False
  30. Const FormWidth = 14150
  31. Const FormHeight = 9825
  32. Private FormAction : FormAction = 0
  33. Public JoinSlot : JoinSlot = - 1
  34.  
  35. CreateObj "Timer", "FormEffects"
  36. FormEffects.Interval = 1
  37. FormEffects.Enabled = False
  38.  
  39. CreateObj "Timer", "TestTimer"
  40. TestTimer.Enabled = False
  41.  
  42. CreateObj "LongTimer", "GameInfoUpdater"
  43. GameInfoUpdater.Interval = 0
  44. GameInfoUpdater.Enabled = False
  45.  
  46. CreateObj "Timer", "LastClickedTimer"
  47. LastClickedTimer.Enabled = False
  48.  
  49. CreateObj "LongTimer", "GameTimeoutTimer"
  50. GameTimeoutTimer.Interval = 5
  51. GameTimeoutTimer.Enabled = False
  52.  
  53.  
  54. Sub Event_Command(Command)
  55. If Command.WasWhispered Then Exit Sub
  56. If LenB(Channel.GetUser(Command.Username).Name) <= 0 Then
  57. Dim Blah : Blah = Command.GetResponse(1)
  58. Game.SendMessage Blah
  59. Command.GetResponse.Remove 1
  60. End If
  61.  
  62. End Sub
  63.  
  64.  
  65.  
  66. Public Function AddGChat(Message)
  67. Dim String
  68. String = "[" & Split(Now)(1) & " " & Split(Now)(2) & "] " & Message
  69. String = Replace(String, vbNewLine, vbNullString)
  70. With GameUIForm.GetObjByName("TxtConsole")
  71. .Text = .Text & String & vbNewLine
  72. .SelStart = Len(.Text)
  73. End With
  74. End Function
  75.  
  76. Sub TestTimer_Timer()
  77. If JoinSlot = 20 Then
  78. JoinSlot = 0
  79. Else
  80. JoinSlot = JoinSlot + 1
  81. End If
  82. Dim GameName
  83. With GameUIForm.GetObjByName("txtGame")
  84. GameName = .Text
  85. End With
  86. Call Send_SID_GETADVLISTEX_Join(GameName, vbNullString)
  87. TestTimer.Enabled = False
  88. TestTimer.Interval = 0
  89. End Sub
  90.  
  91. Sub Event_Load()
  92. CreateUI
  93. ObserveScript(SSC.InternalScript)
  94. Dim ScriptCol
  95. Set ScriptCol = Scripts()
  96. For i = 1 to ScriptCol.Count
  97. ObserveScript(ScriptCol(i).Script("Name"))
  98. Next
  99. End Sub
  100.  
  101. Sub GameUIMenu_Click()
  102. If IsOnline Then
  103. GameUIForm.Show
  104. Else
  105. AddChat vbBlue, "You are not online. To prevent errors, the UI has been disabled."
  106. End If
  107. End Sub
  108.  
  109. '--------------------------------FORM STUFFS (UI)------------------------------------
  110. Sub UpdateList()
  111. Dim Items, I, GameItem, Item, J
  112. With GameUIForm.GetObjByName("LVGameList")
  113. Items = GameList.Items()
  114. For I = 0 To GameList.Count - 1
  115. Set GameItem = Items(I)
  116. Set Item = Nothing
  117. For J = 1 To .ListItems.Count
  118. If LCase(.ListItems(J).Text) = LCase(GameItem.Name) Then
  119. Set Item = .ListItems(J)
  120. End If
  121. Next
  122. If Item Is Nothing Then
  123. Set Item = .ListItems.Add()
  124.  
  125. End If
  126. With Item
  127. .Text = GameItem.Name
  128. .TooltipText = ":)"
  129. End With
  130. Next
  131. .ListItems(.ListItems.Count).EnsureVisible
  132. End With
  133. End Sub
  134.  
  135. Sub GameUIForm_LVGameList_ItemClick(ListItem)
  136. Dim Text, Name
  137. With GameUIForm.GetObjByName("txtGame")
  138. .Text = ListItem.Text
  139. End With
  140. With GameList(ListItem.Text)
  141. Text = .ParsedInfo
  142. Name = .Name
  143. End With
  144. GameUIForm.GetObjByName("lblGameInfo").Caption = Text
  145.  
  146. If LastClicked = ListItem.Text Then
  147. LastClickedTimer.Enabled = False
  148. LastClickedTimer.Interval = 0
  149. Dim GameName
  150. With GameUIForm.GetObjByName("txtGame")
  151. GameName = .Text
  152. End With
  153. LastClicked = vbNullString
  154. Call Send_SID_GETADVLISTEX_Join(GameName, vbNullString)
  155. Elseif LastClickedTimer.Enabled = False Then
  156. LastClicked = ListItem.Text
  157. LastClickedTimer.Enabled = True
  158. LastClickedTimer.Interval = 1000
  159. End If
  160. End Sub
  161.  
  162. Sub LastClickedTimer_Timer()
  163. With LastClickedTimer
  164. .Enabled = False
  165. .Interval = 0
  166. LastClicked = vbNullString
  167. End With
  168. End Sub
  169.  
  170. Sub CreateUI()
  171. CreateObj "Form", "GameUIForm"
  172.  
  173. CreateObj "Menu", "GameUIMenu"
  174. GameUIMenu.Caption = "Open Game User Interface"
  175.  
  176. With GameUIForm
  177. .CreateObj "ListView", "LVGameList"
  178. .CreateObj "ListView", "LVUserPanel"
  179. .CreateObj "Button", "BTGameRefresh"
  180. .CreateObj "Button", "BTDisconnect"
  181. .CreateObj "Button", "BTConnect"
  182. .CreateObj "RichTextBox", "txtConsole"
  183. .CreateObj "TextBox", "txtChatBar"
  184. .CreateObj "TextBox", "txtGame"
  185. .CreateObj "CheckBox", "cbxAutoRefresh"
  186. .CreateObj "Label", "lblAutoRefresh"
  187. .CreateObj "Button", "BTAutoRefresh0"
  188. .CreateObj "Button", "BTAutoRefresh1"
  189. .CreateObj "Button", "BTAutoRefresh2"
  190. .CreateObj "Button", "BTAutoRefresh3"
  191. .CreateObj "Button", "BTAutoRefresh4"
  192. .CreateObj "Button", "BTOpenGameList"
  193. .CreateObj "Button", "BTCloseGameList"
  194. .CreateObj "Label", "lblGameInfo"
  195.  
  196. .BorderStyle = 3
  197. .Caption = "Game User Interface"
  198.  
  199. With .GetObjByName("lblGameInfo")
  200. .Top = 5050
  201. .Left = 8000
  202. .Width = 3000
  203. .Height = 4650
  204. .Caption = "No game selected."
  205. End With
  206.  
  207. With .GetObjByName("BTAutoRefresh0")
  208. .Top = 0
  209. .Left = 12100
  210. .Width = 350
  211. .Height = 250
  212. .Caption = "2"
  213. .Enabled = False
  214. End With
  215.  
  216. With .GetObjByName("BTAutoRefresh1")
  217. .Top = 0
  218. .Left = 12500
  219. .Width = 350
  220. .Height = 250
  221. .Caption = "5"
  222. .Enabled = False
  223. End With
  224.  
  225. With .GetObjByName("BTAutoRefresh2")
  226. .Top = 0
  227. .Left = 12900
  228. .Width = 350
  229. .Height = 250
  230. .Caption = "10"
  231. .Enabled = False
  232. End With
  233.  
  234. With .GetObjByName("BTAutoRefresh3")
  235. .Top = 0
  236. .Left = 13300
  237. .Width = 350
  238. .Height = 250
  239. .Caption = "15"
  240. .Enabled = False
  241. End With
  242.  
  243. With .GetObjByName("BTAutoRefresh4")
  244. .Top = 0
  245. .Left = 13700
  246. .Width = 350
  247. .Height = 250
  248. .Caption = "20"
  249. .Enabled = False
  250. End With
  251.  
  252. With .GetObjByName("lblAutoRefresh")
  253. .Top = 20
  254. .Left = 11350
  255. .Width = 1000
  256. .Height = 250
  257. .BackColor = vbBlack
  258. .ForeColor = vbWhite
  259. .Caption = "Auto"
  260. End With
  261.  
  262. With .GetObjByName("cbxAutoRefresh")
  263. .Top = 0
  264. .Left = 11050
  265. .Width = 250
  266. .Height = 250
  267. .BackColor = vbBlack
  268. End With
  269.  
  270. With .GetObjByName("LVUserPanel")
  271. .Top = 0
  272. .Left = 8000
  273. .Width = 3000
  274. .Height = 5000
  275. .BackColor = vbWhite
  276. .ForeColor = vbBlack
  277. .FullRowSelect = True
  278.  
  279. .ColumnHeaders.Add , , "Name", 1200
  280. .ColumnHeaders.Add , , "Position", 650
  281. End With
  282.  
  283. With .GetObjByName("txtConsole")
  284. .Top = 0
  285. .Left = 0
  286. .Width = 7950
  287. .Height = 9100
  288. .Text = "[" & Split(Now)(1) & " " & Split(Now)(2) & "] "
  289. .Text = .Text & "Welcome to " & Script("Name") & " "
  290. .Text = .Text & "v" & Script("Major") & "." & Script("Minor") & Script("Revision") & " "
  291. .Text = .Text & ". Author: " & Script("Author")
  292. .Text = .Text & " with help from Ribose."
  293. .Text = .Text & vbNewLine
  294. .Locked = True
  295. End With
  296. With .GetObjByName("txtChatBar")
  297. .Top = 9100
  298. .Left = 0
  299. .Width = 7950
  300. .Height = 200
  301. .Text = vbNullString
  302.  
  303. End With
  304. With .GetObjByName("BtOpenGameList")
  305. .Top = 9150
  306. .Left = 8000
  307. .Width = 3000
  308. .Height = 250
  309. .Caption = "Open Games List"
  310. .Visible = False
  311. End With
  312. With .GetObjByName("BtCloseGameList")
  313. .Top = 9150
  314. .Left = 8000
  315. .Width = 3000
  316. .Height = 250
  317. .Caption = "Close Games List"
  318. .Visible = True
  319. End With
  320. With .GetObjByName("BtConnect")
  321. .Top = 8850
  322. .Left = 11050
  323. .Width = 3000
  324. .Height = 250
  325. .Caption = "Connect"
  326. End With
  327. With .GetObjByName("txtGame")
  328. .Top = 8500
  329. .Left = 11050
  330. .Width = 3000
  331. .Height = 250
  332. End With
  333. With .GetObjByName("BTDisconnect")
  334. .Top = 9150
  335. .Left = 11050
  336. .Width = 3000
  337. .Height = 250
  338. .Caption = "Disconnect"
  339. End With
  340.  
  341. With .GetObjByName("BTGameRefresh")
  342. .Top = 300
  343. .Left = 11050
  344. .Width = 3000
  345. .Height = 250
  346. .Caption = "Refresh List"
  347. End With
  348. With .GetObjByName("LVGameList")
  349.  
  350. .Top = 600
  351. .Left = 11050
  352. .Width = 3000
  353. .Height = 7900
  354. .BackColor = vbBlack
  355. .ForeColor = vbWhite
  356. .FullRowSelect = True
  357.  
  358. .ColumnHeaders.Add , , "Name", 2650
  359. End With
  360. .BackColor = vbBlack
  361. .ForeColor = vbWhite
  362. .Height = FormHeight
  363. .Width = FormWidth
  364. End With
  365. End Sub
  366.  
  367. Sub GameUIForm_BTAutoRefresh0_Click()
  368. With GameInfoUpdater
  369. .Interval = 2
  370. .Enabled = True
  371. End With
  372. End Sub
  373.  
  374. Sub GameUIForm_BTAutoRefresh1_Click()
  375. With GameInfoUpdater
  376. .Interval = 5
  377. .Enabled = True
  378. End With
  379. End Sub
  380.  
  381. Sub GameUIForm_BTAutoRefresh2_Click()
  382. With GameInfoUpdater
  383. .Interval = 10
  384. .Enabled = True
  385. End With
  386. End Sub
  387.  
  388. Sub GameUIForm_BTAutoRefresh3_Click()
  389. With GameInfoUpdater
  390. .Interval = 15
  391. .Enabled = True
  392. End With
  393. End Sub
  394.  
  395. Sub GameUIForm_BTAutoRefresh4_Click()
  396. With GameInfoUpdater
  397. .Interval = 20
  398. .Enabled = True
  399. End With
  400. End Sub
  401.  
  402. Sub GameUIForm_BTCloseGameList_Click()
  403. FormAction = 1
  404. With FormEffects
  405. .Enabled = True
  406. End With
  407. End Sub
  408.  
  409. Sub GameUIForm_BTOpenGameList_Click()
  410. FormAction = 2
  411. With FormEffects
  412. .Enabled = True
  413. End With
  414. End Sub
  415.  
  416. Sub FormEffects_Timer()
  417. If FormAction = 1 Then
  418. If GameUIForm.Width > (FormWidth - 3050) Then
  419. GameUIForm.GetObjByName("BTCloseGameList").Enabled = False
  420. GameUIForm.Width = (GameUIForm.Width - 100)
  421. Else
  422. GameUIForm.GetObjByName("BTCloseGameList").Visible = False
  423. GameUIForm.GetObjByName("BTOpenGameList").Visible = True
  424. GameUIForm.GetObjByName("BTOpenGameList").Enabled = True
  425. FormEffects.Enabled = False
  426. FormAction = 0
  427. End If
  428. Elseif FormAction = 2 Then
  429. If GameUIForm.Width < (FormWidth) Then
  430. GameUIForm.Width = (GameUIForm.Width + 100)
  431. GameUIForm.GetObjByName("BTOpenGameList").Enabled = False
  432. Else
  433. GameUIForm.GetObjByName("BTCloseGameList").Visible = True
  434. GameUIForm.GetObjByName("BTCloseGameList").Enabled = True
  435. GameUIForm.GetObjByName("BTOpenGameList").Visible = False
  436. FormEffects.Enabled = False
  437. FormAction = 0
  438. End If
  439. End If
  440. End Sub
  441.  
  442. Sub GameUIForm_cbxAutoRefresh_Click()
  443. With GameUIForm.GetObjByName("cbxAutoRefresh")
  444. If .Value = 1 Then
  445. For i = 0 to 4
  446. GameUIForm.GetObjByName("BTAutoRefresh" & i).Enabled = True
  447. Next
  448. Else
  449. For i = 0 to 4
  450. GameUIForm.GetObjByName("BTAutoRefresh" & i).Enabled = False
  451. Next
  452. GameInfoUpdater.Enabled = False
  453. GameInfoUpdater.Interval = 0
  454. End If
  455. End With
  456. End Sub
  457.  
  458. Sub UpdatePanel()
  459. With GameUIForm.GetObjByName("LVUserPanel").ListItems
  460. .Clear
  461. Dim Users, i, tmp, PIDS
  462. Users = PlayerList.Items
  463. PIDS = PlayerList.Keys
  464. For i = 0 to UBound(Users)
  465. .Add ,, Users(i)
  466. .Item(GameUIForm.GetObjByName("LVUserPanel").ListItems.Count).ListSubItems.Add , , PIDS(i)
  467. Next
  468. End With
  469. End Sub
  470.  
  471. Sub GameUIForm_txtChatBar_KeyPress(KeyAscii)
  472. If not KeyAscii = 13 Then Exit Sub
  473.  
  474. Dim Message, ConsoleCommand, ConsoleConnected
  475.  
  476. With GameUIForm.GetObjByName("TxtChatBar")
  477. Message = .Text
  478. .Text = vbNullString
  479. End With
  480. Message = Replace(Message, vbNewLine, vbNullString)
  481.  
  482. If Left(Message, 1) = "/" Then
  483. ConsoleCommand = True
  484. End If
  485. If Connected Then
  486. ConsoleConnected = True
  487. End If
  488. Call Event_ConsoleMessage(Message, ConsoleCommand, ConsoleConnected)
  489. End Sub
  490.  
  491. Sub Event_ConsoleMessage(Message, CCommand, Online)
  492. If Online = False And CCommand = False Then
  493. AddGChat "You are not connected to a game. Message has been rerouted to the chat channel."
  494. AddQ "Rerouted from Nexus: " & Message
  495. Elseif CCommand = True Then
  496. If Split(Message)(0) = "/priv" And Online = True Then
  497. If UBound(Split(Message)) > 1 Then
  498.  
  499. msgArray = Split(Message, " ", 3)
  500.  
  501. Dim PID, String, Name
  502. Name = msgArray(1)
  503. PID = GetUserPID(Name)
  504.  
  505. If PID > 0 Then
  506. If PlayerList.Exists(PID) Then
  507. String = Trim(msgArray(2))
  508. Call Game.SendMessageToPlayer(String, PID)
  509. Else
  510. AddGChat "Player does not exist."
  511. End If
  512. Else
  513. AddGChat "Player does not exist."
  514. End If
  515. Else
  516. AddGChat """" & Message & """ is not valid!"
  517. End If
  518. Else
  519. Select Case LCase(Message)
  520. Case "/cls" : Call ClearConsole()
  521. Case Else : Command BotVars.Username, Message, True
  522. End Select
  523. End If
  524. Elseif Online = True And CCommand = False Then
  525. Call Game.SendMessage(Message)
  526. End If
  527. End Sub
  528.  
  529. Function GetUserPID(Name)
  530. Dim PIDs, Usernames, Key, More
  531. More = 0
  532. PIDs = PlayerList.Keys()
  533. Usernames = PlayerList.Items()
  534. For i = 0 to UBound(Usernames)
  535. If LCase(Usernames(i)) = LCase(Name) Then
  536. If More = 0 Then Key = i
  537. More = More + 1
  538. End If
  539. Next
  540. If More = 1 Then
  541. GetUserPID = PIDs(Key)
  542. Else
  543. GetUserPID = 0
  544. End If
  545. End Function
  546.  
  547. Sub ClearConsole()
  548. With GameUIForm.GetObjByName("TxtConsole")
  549. .Text = vbNullString
  550. AddGChat "Console window cleared."
  551. End With
  552. End Sub
  553.  
  554. Sub GameUIForm_txtGame_KeyPress(KeyAscii)
  555. If not KeyAscii = 13 Then Exit Sub
  556.  
  557. Dim GameName
  558. With GameUIForm.GetObjByName("txtGame")
  559. GameName = .Text
  560. GameName = Replace(GameName, vbCrLf, vbNullString)
  561. Call Send_SID_GETADVLISTEX_Join(GameName, vbNullString)
  562. .Text = vbNullString
  563. End With
  564. End Sub
  565.  
  566. Sub GameUIForm_BTConnect_Click()
  567. Dim GameName
  568. With GameUIForm.GetObjByName("txtGame")
  569. GameName = .Text
  570. End With
  571. Call Send_SID_GETADVLISTEX_Join(GameName, vbNullString)
  572. End Sub
  573.  
  574.  
  575. Sub GameUIForm_BTDisconnect_Click()
  576. Game.CloseAll
  577. End Sub
  578.  
  579. Sub GameUIForm_BTGameRefresh_Click()
  580. GameList.RemoveAll
  581. GameUIForm.GetObjByName("LVGameList").ListItems.Clear
  582. Send_SID_GETADVLISTEX
  583. End Sub
  584.  
  585. Sub GameInfoUpdater_Timer()
  586. Send_SID_GETADVLISTEX
  587. End Sub
  588.  
  589.  
  590. '-------------------------------Gamelist Ect-----------------------------------------
  591.  
  592. Sub Event_LoggedOn(Username, Product)
  593. Select Case Product
  594. Case "PX3W" : Set Game = New clsW3GameClient
  595. Case "3RAW" : Set Game = New clsW3GameClient
  596. Case Else
  597. AddChat vbBlue, "[NEXUS] This script only supports WC3."
  598. End Select
  599. End Sub
  600.  
  601. Sub Event_LoggedOff()
  602. Set Game = Nothing
  603. GameUIForm.Hide
  604. End Sub
  605.  
  606. Sub Event_PacketReceived(Protocol, ID, Length, Data)
  607. If Protocol = "BNCS" Then
  608. Select Case ID
  609. Case &H09 : Recv_SID_GETADVLISTEX Mid(Data, 5)
  610. End Select
  611. End If
  612. End sub
  613.  
  614. Sub Send_SID_GETADVLISTEX() ' SID_GETADVLISTEX
  615. ListAction = 1
  616. With DataBufferEx()
  617. .InsertWORD &H0a ' (WORD) Product-specific condition 1
  618. .InsertWORD 0 ' (WORD) Product-specific condition 2
  619. .InsertDWORD 0 ' (DWORD) Product-specific condition 3
  620. .InsertDWORD 0 ' (DWORD) Product-specific condition 4
  621. .InsertDWORD &H19 ' (DWORD) List count
  622. .InsertBYTE 0 ' (STRING) Game name
  623. .InsertBYTE 0 ' (STRING) Game password
  624. .InsertBYTE 0 ' (STRING) Game stats
  625. .SendPacket &H09 ' SID_GETADVLISTEX
  626. End With
  627. End Sub
  628.  
  629. Sub Send_SID_GETADVLISTEX_Join(Name, Pass)
  630. ListAction = 2
  631. With DataBufferEx()
  632. .InsertWORD 0 ' (WORD) Product-specific condition 1
  633. .InsertWORD 0 ' (WORD) Product-specific condition 2
  634. .InsertDWORD 0 ' (DWORD) Product-specific condition 3
  635. .InsertDWORD 0 ' (DWORD) Product-specific condition 4
  636. .InsertDWORD &H01 ' (DWORD) List count
  637. .InsertNTString CStr(Name) ' (STRING) Game name
  638. .InsertNTString CStr(Pass) ' (STRING) Game password
  639. .InsertBYTE 0 ' (STRING) Game stats
  640. .SendPacket &H09 ' SID_GETADVLISTEX
  641. End With
  642. End Sub
  643.  
  644. Sub Recv_SID_GETADVLISTEX(Data) ' SID_GETADVLISTEX
  645. Dim Packet, Count, Status, I, GType, GPara, GLang, GHostAF, GHostPort, GHostIP, GState, GElapse, GName, GPass, GStatstring
  646. With DataBufferEx()
  647. .Data = Data
  648. Count = .GetDWORD()
  649. If Count = 0 Then
  650. Status = .GetDWORD()
  651. Select Case Status
  652. Case &H01
  653. AddGChat "Game does not exist."
  654. Case &H02
  655. AddGChat "Incorrect password."
  656. Case &H03
  657. AddGChat "Game full."
  658. Case &H04
  659. AddGChat "Game already started."
  660. Case &H06
  661. AddGChat "Too many server requests."
  662. End Select
  663. Else
  664. For I = 0 To Count - 1
  665. GType = .GetWORD() ' (WORD) Game Type,
  666. GPara = .GetWord ' (WORD) Parameter
  667. GLang = .GetDWORD() ' (DWORD) Language ID
  668. GHostAF = .GetWORD() ' (WORD) Address Family (Always AF_INET (2))
  669. GHostPort = .GetWORD() ' (WORD) Port
  670. GHostIP = .GetDWORD() ' (DWORD) Host's IP
  671. .GetDWORD ' (DWORD) 0
  672. .GetDWORD ' (DWORD) 0
  673. GState = .GetDWORD() ' (DWORD) Game Status
  674. GElapse = .GetDWORD() ' (DWORD) Elapsed time (in seconds)
  675. GName = .GetString() ' (STRING) Game name
  676. GPass = .GetString() ' (STRING) Game password
  677. GStatstring = .GetString() ' (STRING) Game statstring
  678. Set GameList(GName) = New clsGameListItem
  679. GameList(GName).Init GType, GPara, GLang, GHostAF, GHostPort, GHostIP, GState, GElapse, GName, GPass, GStatstring
  680. If ListAction = 2 And Count = 1 Then
  681. 'AddGChat "Game found. Will now attempt to join..."
  682. GameList(GName).Connect
  683. GameTimeoutTimer.Enabled = True
  684. GameInfoUpdater.Enabled = False
  685. GameUIForm.GetObjByName("lblGameInfo").Caption = GameList(GName).ParsedInfo
  686. End If
  687. Next
  688. Call UpdateList
  689. End If
  690. End With
  691. ListAction = 0
  692. End Sub
  693.  
  694. Sub GameTimeoutTimer_Timer()
  695. If Game.Starting Then
  696. AddGChat "Game join failed. Connection to the host timed out."
  697. Game.CloseAll
  698. End If
  699. GameTimeoutTimer.Enabled = False
  700. End Sub
  701.  
  702. '--------------------------------Parsing Functions----------------------------------
  703.  
  704. Private Function GetNumericSettingsEntry(SettingName, DefaultValue)
  705. Dim Value
  706. Value = GetSettingsEntry(SettingName)
  707. If IsNumeric(Value) Then
  708. GetNumericSettingsEntry = CLng(Value)
  709. Else
  710. GetNumericSettingsEntry = DefaultValue
  711. End If
  712. End Function
  713.  
  714. Public Function FormatPacket(FirstLine, ByVal Data)
  715. Dim Lines, DataLen, HexPart, TextPart, Line, C, HexChar, HexLine, Dump
  716. DataLen = Len(Data)
  717. If DataLen = 0 Then
  718. FormatPacket = FirstLine & vbCrLf & "(no data)"
  719. Exit Function
  720. End If
  721. Lines = Fix(DataLen / &H10)
  722. If DataLen Mod &H10 Then Lines = Lines + 1
  723. Dump = FirstLine
  724. For Line = 1 To Lines
  725. HexPart = vbNullString
  726. TextPart = vbNullString
  727. For C = ((Line - 1) * &H10) + 1 To Line * &H10
  728. If C <= DataLen Then
  729. HexChar = Hex(Asc(Mid(Data, C, 1)))
  730. HexChar = Right("00", 2 - Len(HexChar)) & HexChar
  731. HexPart = HexPart & HexChar & " "
  732. If Asc(Mid(Data, C, 1)) < &H20 Then
  733. TextPart = TextPart & "."
  734. Else
  735. TextPart = TextPart & Mid(Data, C, 1)
  736. End If
  737. Else
  738. HexPart = HexPart & " "
  739. End If
  740. If (C Mod &H08) = 0 Then
  741. HexPart = HexPart & " "
  742. TextPart = TextPart & " "
  743. End If
  744. Next
  745. HexLine = Hex(Line - 1)
  746. HexLine = Right("0000000", 7 - Len(HexLine)) & HexLine & "0"
  747. Dump = Dump & vbCrLf & HexLine & ": " & HexPart & " " & TextPart
  748. Next
  749. FormatPacket = Dump
  750. End Function
  751.  
  752. Public Sub DisplayPacket(Direction, Protocol, ID, Length, Data, Unhandled)
  753. Dim HexID, FirstLine, PacketVerb
  754. HexID = Hex(ID)
  755. HexID = "0x" & Right("00", 2 - Len(HexID)) & HexID
  756. PacketVerb = GetNumericSettingsEntry("PacketVisibility", 3)
  757. FirstLine = Protocol & " " & Direction & " PACKET " & HexID & " (" & Length & " BYTES)"
  758. If PacketVerb >= 1 And PacketVerb <= 3 And Unhandled Then
  759. AddChat "Courier New", vbRed, FormatPacket("UNHANDLED " & FirstLine & ":", Data)
  760. ElseIf PacketVerb = 2 Then
  761. AddChat "Courier New", 13408512, FirstLine
  762. ElseIf PacketVerb = 3 Then
  763. AddChat "Courier New", 13408512, FormatPacket(FirstLine & ":", Data)
  764. End If
  765. End Sub
  766.  
  767. Public Function FlipPort(Po)
  768. FlipPort = Right("0000", 4 - Len(Hex(Po))) & Hex(Po)
  769. FlipPort = Eval("&H" & Mid(FlipPort, 3, 2) & Mid(FlipPort, 1, 2))
  770. End Function
  771.  
  772. Class clsEndPoint
  773. Private AF, IP, Po
  774.  
  775. Public Property Get AddressFamily()
  776. AddressFamily = AF
  777. End Property
  778.  
  779. Public Property Get IPAddress()
  780. IPAddress = Right("00000000", 8 - Len(Hex(IP))) & Hex(IP)
  781. IPAddress = _
  782. Eval("&H" & Mid(IPAddress, 7, 2)) & "." & _
  783. Eval("&H" & Mid(IPAddress, 5, 2)) & "." & _
  784. Eval("&H" & Mid(IPAddress, 3, 2)) & "." & _
  785. Eval("&H" & Mid(IPAddress, 1, 2))
  786. End Property
  787.  
  788. Public Property Get Port()
  789. Port = Po
  790. If Port < 0 Then Port = &H10000 - Abs(Po)
  791. End Property
  792.  
  793. Public Sub Init(AddressFamily, IPAddress, Port)
  794. AF = AddressFamily
  795. IP = IPAddress
  796. Po = FlipPort(Port)
  797. End Sub
  798.  
  799. Public Function ToString()
  800. ToString = IPAddress & ":" & Port
  801. End Function
  802. End Class
  803.  
  804. '----------------------------------Gamelist data------------------------------------
  805.  
  806. Class clsGameListItem
  807. Private Flags_, Language_, HostData_, State_, ElapsedSeconds_
  808. Private Name_, Password_, Stats_, Latency_
  809. Private RetrievalTime, Parameter_
  810.  
  811. Public Property Get Name()
  812. Name = Name_
  813. End Property
  814.  
  815. Public Property Get Host()
  816. Set Host = HostData_
  817. End Property
  818.  
  819. Public Property Get Stats()
  820. Set Stats = Stats_
  821. End Property
  822.  
  823. Public Property Get Parameter()
  824. Parameter = Parameter_
  825. End Property
  826.  
  827. Public Property Get Language()
  828. Language = Language_
  829. End Property
  830.  
  831. Public Property Get LanguageName()
  832. Select Case Language
  833. Case 1025: LanguageName = "Arabic (Saudi Arabia)"
  834. Case 1026: LanguageName = "Bulgarian"
  835. Case 1027: LanguageName = "Catalan"
  836. Case 1028: LanguageName = "Chinese (Taiwan)"
  837. Case 1029: LanguageName = "Czech"
  838. Case 1030: LanguageName = "Danish"
  839. Case 1031: LanguageName = "German (Germany)"
  840. Case 1032: LanguageName = "Greek"
  841. Case 1033: LanguageName = "English (United States)"
  842. Case 1034: LanguageName = "Spanish (Traditional Sort)"
  843. Case 1035: LanguageName = "Finnish"
  844. Case 1036: LanguageName = "French (France)"
  845. Case 1037: LanguageName = "Hebrew"
  846. Case 1038: LanguageName = "Hungarian"
  847. Case 1039: LanguageName = "Icelandic"
  848. Case 1040: LanguageName = "Italian (Italy)"
  849. Case 1041: LanguageName = "Japanese"
  850. Case 1042: LanguageName = "Korean"
  851. Case 1043: LanguageName = "Dutch (Netherlands)"
  852. Case 1044: LanguageName = "Norwegian (Bokmal)"
  853. Case 1045: LanguageName = "Polish"
  854. Case 1046: LanguageName = "Portuguese (Brazil)"
  855. Case 1047: LanguageName = "Rhaeto-Romanic"
  856. Case 1048: LanguageName = "Romanian"
  857. Case 1049: LanguageName = "Russian"
  858. Case 1050: LanguageName = "Croatian"
  859. Case 1051: LanguageName = "Slovak"
  860. Case 1052: LanguageName = "Albanian"
  861. Case 1053: LanguageName = "Swedish"
  862. Case 1054: LanguageName = "Thai"
  863. Case 1055: LanguageName = "Turkish"
  864. Case 1056: LanguageName = "Urdu"
  865. Case 1057: LanguageName = "Indonesian"
  866. Case 1058: LanguageName = "Ukrainian"
  867. Case 1059: LanguageName = "Belarusian"
  868. Case 1060: LanguageName = "Slovenian"
  869. Case 1061: LanguageName = "Estonian"
  870. Case 1062: LanguageName = "Latvian"
  871. Case 1063: LanguageName = "Lithuanian"
  872. Case 1064: LanguageName = "Tajik"
  873. Case 1065: LanguageName = "Farsi"
  874. Case 1066: LanguageName = "Vietnamese"
  875. Case 1067: LanguageName = "Armenian"
  876. Case 1068: LanguageName = "Azeri (Latin)"
  877. Case 1069: LanguageName = "Basque"
  878. Case 1070: LanguageName = "Sorbian"
  879. Case 1071: LanguageName = "FYRO Macedonian"
  880. Case 1072: LanguageName = "Sutu"
  881. Case 1072: LanguageName = "Sesotho"
  882. Case 1073: LanguageName = "Tsonga"
  883. Case 1074: LanguageName = "Tswana"
  884. Case 1075: LanguageName = "Venda"
  885. Case 1076: LanguageName = "Xhosa"
  886. Case 1077: LanguageName = "Zulu"
  887. Case 1078: LanguageName = "Afrikaans"
  888. Case 1079: LanguageName = "Georgian"
  889. Case 1080: LanguageName = "Faroese"
  890. Case 1081: LanguageName = "Hindi"
  891. Case 1082: LanguageName = "Maltese"
  892. Case 1083: LanguageName = "Sami Lappish"
  893. Case 1084: LanguageName = "Gaelic Scotland"
  894. Case 1085: LanguageName = "Yiddish"
  895. Case 1086: LanguageName = "Malay (Malaysia)"
  896. Case 1087: LanguageName = "Kazakh"
  897. Case 1088: LanguageName = "Kyrgyz (Cyrillic)"
  898. Case 1089: LanguageName = "Swahili"
  899. Case 1090: LanguageName = "Turkmen"
  900. Case 1091: LanguageName = "Uzbek (Latin)"
  901. Case 1092: LanguageName = "Tatar"
  902. Case 1093: LanguageName = "Bengali (India)"
  903. Case 1094: LanguageName = "Punjabi"
  904. Case 1095: LanguageName = "Gujarati"
  905. Case 1096: LanguageName = "Oriya"
  906. Case 1097: LanguageName = "Tamil"
  907. Case 1098: LanguageName = "Telugu"
  908. Case 1099: LanguageName = "Kannada"
  909. Case 1100: LanguageName = "Malayalam"
  910. Case 1101: LanguageName = "Assamese"
  911. Case 1102: LanguageName = "Marathi"
  912. Case 1103: LanguageName = "Sanskrit"
  913. Case 1104: LanguageName = "Mongolian (Cyrillic)"
  914. Case 1105: LanguageName = "Tibetan"
  915. Case 1106: LanguageName = "Welsh"
  916. Case 1107: LanguageName = "Khmer"
  917. Case 1108: LanguageName = "Lao"
  918. Case 1109: LanguageName = "Burmese"
  919. Case 1110: LanguageName = "Galician"
  920. Case 1111: LanguageName = "Konkani"
  921. Case 1112: LanguageName = "Manipuri"
  922. Case 1113: LanguageName = "Sindhi"
  923. Case 1114: LanguageName = "Syriac"
  924. Case 1115: LanguageName = "Sinhalese (Sri Lanka)"
  925. Case 1118: LanguageName = "Amharic (Ethiopia)"
  926. Case 1120: LanguageName = "Kashmiri"
  927. Case 1121: LanguageName = "Nepali"
  928. Case 1122: LanguageName = "Frisian (Netherlands)"
  929. Case 1124: LanguageName = "Filipino"
  930. Case 1125: LanguageName = "Divehi"
  931. Case 1126: LanguageName = "Edo"
  932. Case 1136: LanguageName = "Igbo (Nigeria)"
  933. Case 1140: LanguageName = "Guarani (Paraguay)"
  934. Case 1142: LanguageName = "Latin"
  935. Case 1143: LanguageName = "Somali"
  936. Case 1153: LanguageName = "Maori (New Zealand)"
  937. Case 1279: LanguageName = "HID (Human Interface Device)"
  938. Case 2049: LanguageName = "Arabic (Iraq)"
  939. Case 2052: LanguageName = "Chinese (PRC)"
  940. Case 2055: LanguageName = "German (Switzerland)"
  941. Case 2057: LanguageName = "English (United Kingdom)"
  942. Case 2058: LanguageName = "Spanish (Mexico)"
  943. Case 2060: LanguageName = "French (Belgium)"
  944. Case 2064: LanguageName = "Italian (Switzerland)"
  945. Case 2067: LanguageName = "Dutch (Belgium)"
  946. Case 2068: LanguageName = "Norwegian (Nynorsk)"
  947. Case 2070: LanguageName = "Portuguese (Portugal)"
  948. Case 2072: LanguageName = "Romanian (Moldova)"
  949. Case 2073: LanguageName = "Russian (Moldova)"
  950. Case 2074: LanguageName = "Serbian (Latin)"
  951. Case 2077: LanguageName = "Swedish (Finland)"
  952. Case 2092: LanguageName = "Azeri (Cyrillic)"
  953. Case 2108: LanguageName = "Gaelic Ireland"
  954. Case 2110: LanguageName = "Malay (Brunei Darussalam)"
  955. Case 2115: LanguageName = "Uzbek (Cyrillic)"
  956. Case 2117: LanguageName = "Bengali (Bangladesh)"
  957. Case 2128: LanguageName = "Mongolian (Mongolia)"
  958. Case 3073: LanguageName = "Arabic (Egypt)"
  959. Case 3076: LanguageName = "Chinese (Hong Kong S.A.R.)"
  960. Case 3079: LanguageName = "German (Austria)"
  961. Case 3081: LanguageName = "English (Australia)"
  962. Case 3082: LanguageName = "Spanish (International Sort)"
  963. Case 3084: LanguageName = "French (Canada)"
  964. Case 3098: LanguageName = "Serbian (Cyrillic)"
  965. Case 4097: LanguageName = "Arabic (Libya)"
  966. Case 4100: LanguageName = "Chinese (Singapore)"
  967. Case 4103: LanguageName = "German (Luxembourg)"
  968. Case 4105: LanguageName = "English (Canada)"
  969. Case 4106: LanguageName = "Spanish (Guatemala)"
  970. Case 4108: LanguageName = "French (Switzerland)"
  971. Case 4122: LanguageName = "Croatian (Bosnia/Herzegovina)"
  972. Case 5121: LanguageName = "Arabic (Algeria)"
  973. Case 5124: LanguageName = "Chinese (Macau S.A.R.)"
  974. Case 5127: LanguageName = "German (Liechtenstein)"
  975. Case 5129: LanguageName = "English (New Zealand)"
  976. Case 5130: LanguageName = "Spanish (Costa Rica)"
  977. Case 5132: LanguageName = "French (Luxembourg)"
  978. Case 5146: LanguageName = "Bosnian (Bosnia/Herzegovina)"
  979. Case 6145: LanguageName = "Arabic (Morocco)"
  980. Case 6153: LanguageName = "English (Ireland)"
  981. Case 6154: LanguageName = "Spanish (Panama)"
  982. Case 6156: LanguageName = "French (Monaco)"
  983. Case 7169: LanguageName = "Arabic (Tunisia)"
  984. Case 7177: LanguageName = "English (South Africa)"
  985. Case 7178: LanguageName = "Spanish (Dominican Republic)"
  986. Case 7180: LanguageName = "French (West Indies)"
  987. Case 8193: LanguageName = "Arabic (Oman)"
  988. Case 8201: LanguageName = "English (Jamaica)"
  989. Case 8202: LanguageName = "Spanish (Venezuela)"
  990. Case 9217: LanguageName = "Arabic (Yemen)"
  991. Case 9225: LanguageName = "English (Caribbean)"
  992. Case 9226: LanguageName = "Spanish (Colombia)"
  993. Case 9228: LanguageName = "French (Congo, DRC)"
  994. Case 10241: LanguageName = "Arabic (Syria)"
  995. Case 10249: LanguageName = "English (Belize)"
  996. Case 10250: LanguageName = "Spanish (Peru)"
  997. Case 10252: LanguageName = "French (Senegal)"
  998. Case 11265: LanguageName = "Arabic (Jordan)"
  999. Case 11273: LanguageName = "English (Trinidad)"
  1000. Case 11274: LanguageName = "Spanish (Argentina)"
  1001. Case 11276: LanguageName = "French (Cameroon)"
  1002. Case 12289: LanguageName = "Arabic (Lebanon)"
  1003. Case 12297: LanguageName = "English (Zimbabwe)"
  1004. Case 12298: LanguageName = "Spanish (Ecuador)"
  1005. Case 12300: LanguageName = "French (Cote d'Ivoire)"
  1006. Case 13313: LanguageName = "Arabic (Kuwait)"
  1007. Case 13321: LanguageName = "English (Philippines)"
  1008. Case 13322: LanguageName = "Spanish (Chile)"
  1009. Case 13324: LanguageName = "French (Mali)"
  1010. Case 14337: LanguageName = "Arabic (U.A.E.)"
  1011. Case 14346: LanguageName = "Spanish (Uruguay)"
  1012. Case 14348: LanguageName = "French (Morocco)"
  1013. Case 15361: LanguageName = "Arabic (Bahrain)"
  1014. Case 15370: LanguageName = "Spanish (Paraguay)"
  1015. Case 16385: LanguageName = "Arabic (Qatar)"
  1016. Case 16393: LanguageName = "English (India)"
  1017. Case 16394: LanguageName = "Spanish (Bolivia)"
  1018. Case 17418: LanguageName = "Spanish (El Salvador)"
  1019. Case 18442: LanguageName = "Spanish (Honduras)"
  1020. Case 19466: LanguageName = "Spanish (Nicaragua)"
  1021. Case 20490: LanguageName = "Spanish (Puerto Rico)"
  1022. End Select
  1023. End Property
  1024.  
  1025. Public Property Get CreateTime()
  1026. CreateTime = DateAdd("s", -ElapsedSeconds_, RetrievalTime)
  1027. End Property
  1028.  
  1029. Public Property Get State()
  1030. State = State_
  1031. End Property
  1032.  
  1033. Public Property Get Flags()
  1034. Flags = Flags_
  1035. End Property
  1036.  
  1037. Public Property Get ParsedInfo()
  1038. ParsedInfo = _
  1039. "Game name: " & Name & vbCrLf & _
  1040. "Creation time: " & CreateTime & vbCrLf & _
  1041. "Language: " & LanguageName & vbCrLf & _
  1042. "State: " & State & vbCrLf & _
  1043. "Flags: " & Flags & vbCrLf & _
  1044. "Host Computer: " & Host.IPAddress & ":" & Host.Port & vbCrLf & _
  1045. Stats.ParsedInfo
  1046. End Property
  1047.  
  1048. Public Sub Init(Flags, Para, Language, HostAF, HostPort, HostIP, State, ElapsedSeconds, Name, Password, Statstring)
  1049. RetrievalTime = Now()
  1050. Parameter_ = Para
  1051. Flags_ = Flags
  1052. Language_ = Language
  1053. Set HostData_ = New clsEndPoint
  1054. HostData_.Init HostAF, HostIP, HostPort
  1055. State_ = State
  1056. ElapsedSeconds_ = ElapsedSeconds
  1057. Name_ = Name
  1058. Password_ = Password
  1059. Set Stats_ = New clsStatsData
  1060. Stats_.Init Statstring
  1061.  
  1062. Latency_ = -1
  1063. End Sub
  1064.  
  1065. Public Sub SetPing(IP, Port, Latency)
  1066. Latency_ = Latency
  1067. End Sub
  1068.  
  1069. Public Sub Connect()
  1070. tmpFlags = Right(Flags_, 1)
  1071. Game.JoinGame Name, Password_, ParsedInfo, Host
  1072. End Sub
  1073. End Class
  1074.  
  1075. Class clsStatsData
  1076. Private MapSizeX, MapSizeY, MapMax, MapApproval, MapCheck, MapTileset, MapName
  1077. Private GameSpeed, GameType, GameTypeParam, GameIsReplay, GameStartRes, GameCreator
  1078. Private W3Flags, W3Speed, W3Visibility, W3Observers, W3TeamsTogether, W3TeamsFixed, W3UnitShare, W3HeroRandom, W3RaceRandom
  1079.  
  1080. Public Property Get ParsedInfo()
  1081. ParsedInfo = _
  1082. "WarCraft III Game:" & vbCrLf & _
  1083. " Host: " & GameCreator & vbCrLf & _
  1084. " Speed: " & GameSpeedName & vbCrLf & _
  1085. " Map Name: " & MapName & vbCrLf & _
  1086. " Visibility: " & VisibilityName & vbCrLf & _
  1087. " Observe Settings: " & ObserversName & vbCrLf & _
  1088. " Teams Start Together: " & TeamsTogetherName & vbCrLf & _
  1089. " Teams Fixed: " & TeamsFixedName & vbCrLf & _
  1090. " Team Units Shared: " & UnitShareName & vbCrLf & _
  1091. " Random Hero: " & HeroRandomName & vbCrLf & _
  1092. " Random Race: " & RaceRandomName
  1093. End Property
  1094.  
  1095. Public Property Get GameTypeName()
  1096. Select Case GameType
  1097. Case 0 : GameTypeName = "Show All"
  1098. Case 1 : GameTypeName = "Custom"
  1099. Case 2 : GameTypeName = "Melee"
  1100. Case 3 : GameTypeName = "Free For All"
  1101. Case 4 : GameTypeName = "One Vs One"
  1102. Case 5 : GameTypeName = "Capture The Flag"
  1103. Case 6 : GameTypeName = "Greed"
  1104. Case 7 : GameTypeName = "Slaughter"
  1105. Case 8 : GameTypeName = "Sudden Death"
  1106. Case 9 : GameTypeName = "Ladder"
  1107. Case 10 : GameTypeName = "Use Map Settings"
  1108. Case 11 : GameTypeName = "Team Melee"
  1109. Case 12 : GameTypeName = "Team Free For All"
  1110. Case 13 : GameTypeName = "Team Capture The Flag"
  1111. Case 15 : GameTypeName = "Top Vs Bottom"
  1112. Case 16 : GameTypeName = "Iron Man Ladder"
  1113. End Select
  1114. GameTypeName = GameTypeName & " (" & GameTypeParam & ")"
  1115. End Property
  1116.  
  1117. Public Property Get GameSpeedName()
  1118. Select Case GameSpeed
  1119. Case 0 : GameSpeedName = "Slow"
  1120. Case 1 : GameSpeedName = "Normal"
  1121. Case 2 : GameSpeedName = "Fast"
  1122. End Select
  1123. End Property
  1124.  
  1125. Public Property Get VisibilityName()
  1126. Select Case W3Visibility
  1127. Case &H100 : VisibilityName = "Hide Terrain"
  1128. Case &H200 : VisibilityName = "Map Explored"
  1129. Case &H400 : VisibilityName = "Always Visible"
  1130. Case &H800 : VisibilityName = "Default"
  1131. End Select
  1132. End Property
  1133.  
  1134. Public Property Get ObserversName()
  1135. Select Case W3Observers
  1136. Case &H00000000 : ObserversName = "No Observers"
  1137. Case &H00002000 : ObserversName = "Observers on Defeat"
  1138. Case &H00003000 : ObserversName = "Observers Allowed"
  1139. Case &H40000000 : ObserversName = "Referees Allowed"
  1140. End Select
  1141. End Property
  1142.  
  1143. Public Property Get TeamsTogetherName()
  1144. If W3TeamsTogether Then
  1145. TeamsTogetherName = "Yes"
  1146. Else
  1147. TeamsTogetherName = "No"
  1148. End If
  1149. End Property
  1150.  
  1151. Public Property Get TeamsFixedName()
  1152. If W3TeamsFixed Then
  1153. TeamsFixedName = "Yes"
  1154. Else
  1155. TeamsFixedName = "No"
  1156. End If
  1157. End Property
  1158.  
  1159. Public Property Get UnitShareName()
  1160. If W3UnitShare Then
  1161. UnitShareName = "Yes"
  1162. Else
  1163. UnitShareName = "No"
  1164. End If
  1165. End Property
  1166.  
  1167. Public Property Get HeroRandomName()
  1168. If W3HeroRandom Then
  1169. HeroRandomName = "Yes"
  1170. Else
  1171. HeroRandomName = "No"
  1172. End If
  1173. End Property
  1174.  
  1175. Public Property Get RaceRandomName()
  1176. If W3RaceRandom Then
  1177. RaceRandomName = "Yes"
  1178. Else
  1179. RaceRandomName = "No"
  1180. End If
  1181. End Property
  1182.  
  1183. Public Sub Init(Statstring)
  1184. Dim StatSplit
  1185. Statstring = W3DecodeGameStatstring(Statstring)
  1186. With DataBufferEx()
  1187. .Data = Statstring
  1188. W3Flags = .GetDWORD()
  1189. W3Speed = W3Flags And &H03
  1190. W3Visibility = W3Flags And &H0F00
  1191. W3Observers = W3Flags And &H40003000
  1192. W3TeamsTogether = CBool(W3Flags And &H4000)
  1193. W3TeamsFixed = CBool(W3Flags And &H060000)
  1194. W3UnitShare = CBool(W3Flags And &H01000000)
  1195. W3HeroRandom = CBool(W3Flags And &H02000000)
  1196. W3RaceRandom = CBool(W3Flags And &H04000000)
  1197. .GetDWORD 'unknown bytes/0 bytes
  1198. .GetByte '0 byte
  1199. MapCheck = .GetDWORD()
  1200. MapName = .GetString()
  1201. GameCreator = .GetString()
  1202. End With
  1203. End Sub
  1204.  
  1205. Public Function W3DecodeGameStatstring(ByVal Encoded)
  1206. ' Ported to VB by l2k-Shadow
  1207. ' Converted to VBs by Ribose
  1208. Dim Dec, I, J, D, iLen
  1209. ReDim Dec(0)
  1210. J = 0
  1211. D = 0
  1212. iLen = 0
  1213. Encoded = Mid(Encoded, 2)
  1214. 'enc = StrConvEx(Encoded, 128) 'vbFromUnicode
  1215. For I = 0 To Len(Encoded) - 1
  1216. If I Mod 8 Then
  1217. ReDim Preserve Dec(iLen)
  1218. Dec(iLen) = (Asc(Mid(Encoded, I + 1, 1)) And ((RShift(D, 1 + J) Or Not 1)))
  1219. J = J + 1
  1220. iLen = iLen + 1
  1221. Else
  1222. J = 0
  1223. D = Asc(Mid(Encoded, I + 1, 1))
  1224. End If
  1225. Next
  1226. 'W3DecodeGameStatstring = StrConvEx(dec, 64) 'vbUnicode
  1227. W3DecodeGameStatstring = ""
  1228. For I = 0 To Ubound(dec)
  1229. W3DecodeGameStatstring = W3DecodeGameStatstring & Chr(dec(I))
  1230. Next
  1231. W3DecodeGameStatstring = Mid(W3DecodeGameStatstring, InStrRev(Left(W3DecodeGameStatstring, 10), "0") + 1)
  1232. End Function
  1233.  
  1234. Public Function RShift(ByVal pnValue, ByVal pnShift)
  1235. RShift = CLng(pnValue \ (2 ^ pnShift))
  1236. End Function
  1237. End Class
  1238.  
  1239. Class clsW3GameClient
  1240. Private GameName, GamePass, ParsedInfo_, Port, InStage_, MyIndex
  1241. Private HostConn, Conns, Players_, Slots_
  1242.  
  1243. Public Sub Class_Initialize()
  1244. InStage_ = True
  1245. Set HostConn = Nothing
  1246. End Sub
  1247.  
  1248. Private Sub Class_Terminate()
  1249. CloseAll
  1250. End Sub
  1251.  
  1252. Public Property Get Starting()
  1253. Starting = (Not HostConn Is Nothing And Not InStage_)
  1254. End Property
  1255.  
  1256. Public Property Get InStage()
  1257. InStage = InStage_
  1258. End Property
  1259.  
  1260. Public Property Get Name()
  1261. Name = GameName
  1262. End Property
  1263.  
  1264. Public Property Get Password()
  1265. Password = GamePass
  1266. End Property
  1267.  
  1268. Public Property Get Slots()
  1269. Set Slots = Slots_
  1270. End Property
  1271.  
  1272. Public Property Get Players()
  1273. Set Players = Players_
  1274. End Property
  1275.  
  1276. Public Property Get ParsedGameInfo()
  1277. ParsedGameInfo = "Game Name: " & Name & vbCrLf
  1278. If Password <> "" Then _
  1279. ParsedGameInfo = ParsedGameInfo & "Game Password: " & Password & vbCrLf
  1280. ParsedGameInfo = ParsedGameInfo & ParsedInfo_
  1281. End Property
  1282.  
  1283. Public Sub JoinGame(Name, Pass, ParsedInfo, HostEndPoint)
  1284. InStage_ = False
  1285. GameName = Name
  1286. GamePass = Pass
  1287. ParsedInfo_ = ParsedInfo
  1288. CreateObj "Winsock", "TcpListener"
  1289. With TcpListener
  1290. If .LocalPort = 0 Then
  1291. .Protocol = 0 ' TCP
  1292. On Error Resume Next
  1293. Port = 6112
  1294. .Listen Port
  1295. Do While Err.Number = 10048
  1296. Err.Clear
  1297. Port = Port + 1
  1298. .Listen Port
  1299. Loop
  1300. On Error GoTo 0
  1301. If Detailed Then AddGChat "Listening for connections on port " & Port & "."
  1302. End If
  1303. End With
  1304. Set Conns = CreateObject("Scripting.Dictionary")
  1305. Set Players_ = CreateObject("Scripting.Dictionary")
  1306. Set Slots_ = CreateObject("Scripting.Dictionary")
  1307. 'AddGChat "Connecting to host of game " & GameName & "..."
  1308. Set HostConn = New clsW3PlayerConnection
  1309. HostConn.Connect HostEndPoint, 1
  1310. End Sub
  1311.  
  1312. Public Sub SendMessage(String)
  1313. Call HostConn.Send_W3GS_Message(String, 0)
  1314. End Sub
  1315.  
  1316. Public Sub SendMessageToPlayer(String, PID)
  1317. Call HostConn.Send_W3GS_Message(String, PID)
  1318. End Sub
  1319.  
  1320. Public Sub JoinSuccess(MyPID)
  1321. GameTimeoutTimer.Enabled = False
  1322. MyIndex = MyPID
  1323. AddGChat "Game join successful as user #" & MyPID & "."
  1324. End Sub
  1325.  
  1326. Public Sub CloseAll()
  1327. Dim I, SlotKeys
  1328. If HostConn Is Nothing Then Exit Sub
  1329. HostConn.Disconnect
  1330. Set HostConn = Nothing
  1331. For I = 2 To Conns.Count + 1
  1332. Conns.Disconnect
  1333. Set Conns(I) = Nothing
  1334. Next
  1335. For I = 2 To Players_.Count + 1
  1336. Set Players_(I) = Nothing
  1337. Next
  1338. SlotKeys = Slots_.Keys()
  1339. For I = 0 To Slots_.Count - 1
  1340. Set Slots_(SlotKeys(I)) = Nothing
  1341. Next
  1342. Slots_.RemoveAll
  1343. Players_.RemoveAll
  1344. PlayerList.RemoveAll
  1345. UpdatePanel
  1346. Conns.RemoveAll
  1347. TcpListener.Close
  1348. AddGChat "Disconnected."
  1349. Connected = False
  1350. GameUIForm.GetObjByName("lblGameInfo").Caption = "No game selected."
  1351. End Sub
  1352.  
  1353. Public Sub Event_ConnectionRequest(RequestID, EndPoint)
  1354. Dim Index
  1355. AddGChat "Connection request from " & EndPoint.ToString() & "."
  1356.  
  1357. Index = GetPlayerByEndPoint(EndPoint).Index()
  1358. Set Conns(Index) = New clsW3PlayerConnection
  1359. Conns(Index).Accept RequestID, EndPoint, Index
  1360. End Sub
  1361.  
  1362. Public Sub Event_Connect(Index)
  1363. If Index = 1 Then
  1364. HostConn.Event_Connect
  1365. HostConn.Send_W3GS_REQUESTJOIN()
  1366. Else
  1367. Conns(Index).Event_Connect
  1368. End If
  1369. End Sub
  1370.  
  1371. Public Sub Event_Close(Index)
  1372. If Index = 1 Then
  1373. HostConn.Event_Close
  1374. 'AddGChat "The host has closed your connection."
  1375. CloseAll
  1376. Else
  1377. Conns(Index).Event_Close
  1378. End If
  1379. End Sub
  1380.  
  1381. Public Sub Event_DataArrival(Index, Total)
  1382. If Index = 1 Then
  1383. HostConn.Event_DataArrival Total
  1384. Else
  1385. Conns(Index).Event_DataArrival Total
  1386. End If
  1387. End Sub
  1388.  
  1389. Public Sub Event_Error(Index, a,b,c,d,e,f)
  1390. If Index = 1 Then
  1391. HostConn.Event_Error a,b,c,d,e,f
  1392. Else
  1393. Conns(Index).Event_Error a,b,c,d,e,f
  1394. End If
  1395. End Sub
  1396.  
  1397. Public Function GetPlayerByEndPoint(EndPoint)
  1398. For Each Player In Players_.Items()
  1399. If Player.EndPoint.IPAddress = EndPoint.IPAddress And _
  1400. Player.EndPoint.Port = EndPoint.Port Then
  1401. Set GetPlayerByEndPoint = Player
  1402. Exit For
  1403. End If
  1404. Next
  1405. Set GetPlayerByEndPoint = Nothing
  1406. End Function
  1407. End Class
  1408.  
  1409. Class clsW3PlayerConnection
  1410. Private EndPoint_, Index_, Latency_, Winsock_, Incoming
  1411. Private Map, GLOBALPID
  1412.  
  1413. Private Sub Class_Initialize()
  1414. Set Endpoint_ = Nothing
  1415. Set Winsock_ = Nothing
  1416. End Sub
  1417.  
  1418. Private Sub Class_Terminate()
  1419. Disconnect
  1420. End Sub
  1421.  
  1422. Public Sub Connect(EndPoint, Index)
  1423. Init EndPoint, Index
  1424. If Detailed Then AddGChat "Connecting to user at " & EndPoint.ToString() & "..."
  1425. Winsock_.Connect
  1426. End Sub
  1427.  
  1428. Public Sub Accept(RequestID, EndPoint, Index)
  1429. Init EndPoint, Index
  1430. AddGChat "Accepting user at " & EndPoint.ToString() & "..."
  1431. Winsock_.Accept RequestID
  1432. End Sub
  1433.  
  1434. Private Sub Init(EndPoint, Index)
  1435. Set EndPoint_ = EndPoint
  1436. Set Winsock_ = CreateObj("Winsock", "W3" & Index)
  1437. ExecuteGlobal "Sub W3" & Index & "_Connect() : Game.Event_Connect " & Index & " : End " & "Sub"
  1438. ExecuteGlobal "Sub W3" & Index & "_DataArrival(Total) : Game.Event_DataArrival " & Index & ", Total : End " & "Sub"
  1439. ExecuteGlobal "Sub W3" & Index & "_Error(a,b,c,d,e,f) : Game.Event_DataArrival " & Index & ", a,b,c,d,e,f : End " & "Sub"
  1440. ExecuteGlobal "Sub W3" & Index & "_Close() : Game.Event_Close " & Index & " : End " & "Sub"
  1441. Winsock_.RemoteHost = EndPoint.IPAddress
  1442. Winsock_.RemotePort = EndPoint.Port
  1443. Index_ = Index
  1444. Incoming = vbNullString
  1445. End Sub
  1446.  
  1447. Public Property Get EndPoint()
  1448. Set EndPoint = EndPoint_
  1449. End Property
  1450.  
  1451. Public Property Get Index()
  1452. Index = Index_
  1453. End Property
  1454.  
  1455. Public Property Get Latency()
  1456. Latency = Latency_
  1457. End Property
  1458.  
  1459. Public Sub Event_Error(Number, Description, Scode, Source, HelpFile, HelpContext, CancelDisplay)
  1460. AddGChat "Connection Error #" & Number & ": " & Description
  1461. End Sub
  1462.  
  1463. Public Sub Disconnect()
  1464. 'If Not Winsock_ Is Nothing Then
  1465. Winsock_.Close
  1466. 'ExecuteGlobal "W3" & Index & ".Close"
  1467. End Sub
  1468.  
  1469. Public Sub Event_Connect()
  1470. 'AddGChat "User #" & Index_ & " connected!"
  1471. 'AddGChat "Connection successful."
  1472. Connected = True
  1473. End Sub
  1474.  
  1475. Public Sub Event_Close()
  1476. 'AddGChat "Connection aborted."
  1477. Connected = False
  1478. End Sub
  1479.  
  1480. '-----------------------------------Ingame Packets----------------------------------'
  1481.  
  1482. Private Sub SendPacket(ID, Data)
  1483. With DataBufferEx()
  1484. .InsertBYTE &HF7
  1485. .InsertBYTE ID
  1486. .InsertWORD Len(Data) + 4
  1487. Data = .Data & Data
  1488. Winsock_.SendData Data
  1489. End With
  1490. If DebugInfo Then DisplayPacket "SENT TO #" & Index_, "W3GS", ID, Len(Data), Data, False
  1491. End Sub
  1492.  
  1493. Public Sub Event_DataArrival(ByVal Total)
  1494. Dim Data, F7, ID, Length
  1495. Winsock_.GetData Data, 8, Total
  1496. Incoming = Incoming & Data
  1497. Do While Len(Incoming) >= 4
  1498. With DataBufferEx()
  1499. .Data = Incoming
  1500. F7 = .GetBYTE()
  1501. ID = .GetBYTE()
  1502. Length = .GetWORD()
  1503. End With
  1504. If F7 <> &HF7 Then
  1505. AddGChat "User #" & Index_ & " has sent malformed data (does not begin with 0xF7)."
  1506. Winsock_.Close
  1507. Exit Do
  1508. End If
  1509.  
  1510. If Length > Len(Incoming) Then Exit Do
  1511. Packet_Parse ID, Left(Incoming, Length)
  1512. Incoming = Mid(Incoming, Length + 1)
  1513. Loop
  1514. End Sub
  1515.  
  1516. Sub Send_W3GS_Message(String, PID)
  1517. If PID = 0 Then
  1518. Dim i, PIDs
  1519. PIDs = PlayerList.Keys
  1520. With DataBufferEx()
  1521. .InsertBYTE CByte(PlayerList.Count - 1)
  1522. For i = 0 to UBound(PIDs)
  1523. If not PIDs(i) = GLOBALPID Then .InsertBYTE CByte(PIDs(i))
  1524. Next
  1525. .InsertBYTE CByte(GLOBALPID)
  1526. .InsertBYTE CByte(&H10)
  1527. .InsertNTString CStr(String)
  1528. SendPacket &H28, .Data
  1529. .Clear
  1530. End With
  1531. AddGChat "<" & BotName & "> " & CStr(String)
  1532. Elseif PID > 0 Then
  1533. With DataBufferEx()
  1534. .InsertBYTE CByte(1)
  1535. .InsertBYTE CByte(PID)
  1536. .InsertBYTE CByte(GLOBALPID)
  1537. .InsertBYTE CByte(&H10)
  1538. .InsertNTString CStr(String)
  1539. SendPacket &H28, .Data
  1540. .Clear
  1541. End With
  1542. Dim Username
  1543. Username = PlayerList.Item(CStr(PID))
  1544. If LenB(Username) = 0 Then Username = BotName
  1545. AddGChat "<To " & Username & "> " & String
  1546. End If
  1547. End Sub
  1548.  
  1549. Private Sub Send_W3GS_HOSTPING(Data)
  1550. With DataBufferEx()
  1551. .InsertDWord Data
  1552. SendPacket &H46, .Data
  1553. End With
  1554. End Sub
  1555.  
  1556. Public Sub Send_W3GS_REQUESTJOIN()
  1557. If Detailed Then AddGChat "Sending join information to host..."
  1558. With DataBufferEx()
  1559. .InsertDWORD JoinSlot ' (DWORD) Join game counter
  1560. .InsertDWORD 0 ' (DWORD) Tick count (0 on b.net)
  1561. .InsertBYTE 0 ' (BYTE) 0
  1562. .InsertWORD 6112 ' (DWORD) External port
  1563. .InsertDWORD JoinSlot + 1 ' (DWORD) Join game counter + create game counter
  1564. .InsertNTString CStr(BotName) ' (STRING) Username
  1565. .InsertWORD &H01 ' (WORD) IP Type IPv4
  1566. .InsertWORD &H02 ' (WORD) Addr Family
  1567. .InsertWORD FlipPort(6112) ' (WORD) Internal port
  1568. .InsertDWORD &H4201A8C0 ' (DWORD) Internal IP
  1569. .InsertDWORD 0 ' (DWORD) 0
  1570. .InsertDWORD 0 ' (DWORD) 0
  1571. SendPacket &H1E, .Data ' W3GS_REQUESTJOIN
  1572. End With
  1573. End Sub
  1574.  
  1575.  
  1576. Private Sub Packet_Parse(ID, ByVal Data)
  1577. Dim D, Unhandled
  1578. D = Mid(Data, 5)
  1579. Unhandled = False
  1580. Select Case ID
  1581. Case &H01 : Recv_W3GS_HOSTPING D
  1582. Case &H04 : Recv_W3GS_SLOTINFOJOIN D
  1583. Case &H05 : Recv_W3GS_REJECTJOIN D
  1584. Case &H06 : Recv_W3GS_PLAYERINFO D
  1585. Case &H07 : Recv_W3GS_LEAVER D
  1586. Case &H08 : Recv_W3GS_CLIENTREADY D
  1587. Case &H09 : Recv_W3GS_SLOTINFO D
  1588. Case &H0A : Recv_W3GS_START D
  1589. Case &H0B : Recv_W3GS_LOADING D
  1590. Case &H0F : Recv_W3GS_MESSAGE D
  1591. Case &H35 : Recv_W3GS_CLIENTPING D
  1592. Case &H3D : Recv_W3GS_MAPCHECK D
  1593. Case &H3F : Recv_W3GS_MAPDOWNLOAD D
  1594. Case &H43 : Recv_W3GS_MAPPART D
  1595. Case Else : Unhandled = True
  1596. End Select
  1597. If DebugInfo Then DisplayPacket "RECV FROM #" & Index_, "W3GS", ID, Len(Data), Data, Unhandled
  1598. End Sub
  1599.  
  1600. Private Sub Recv_W3GS_HOSTPING(Data)
  1601. Dim Val
  1602. With DataBufferEx()
  1603. .Data = Data
  1604. Val = .GetDWord
  1605. End With
  1606. Call Send_W3GS_HOSTPING(Val)
  1607. End Sub
  1608.  
  1609. Private Sub Recv_W3GS_SLOTINFOJOIN(Data)
  1610. Dim SlotInfoSize, SlotCount, I, PID, DLLen, Status, IsComputer, TeamNum, ColorNum, _
  1611. RaceStatus, ComputerType, Handicap, HostGTC, MyPID, HostLocalAF, HostLocalPort, _
  1612. HostLocalIP
  1613. With DataBufferEx()
  1614. .Data = Data
  1615. SlotInfoSize = .GetWORD()
  1616. If SlotInfoSize > 0 Then
  1617. SlotCount = .GetBYTE()
  1618. For I = 0 To SlotCount - 1
  1619. PID = .GetBYTE()
  1620. DLLen = .GetBYTE()
  1621. Status = .GetBYTE()
  1622. IsComputer = .GetBYTE()
  1623. TeamNum = .GetBYTE()
  1624. ColorNum = .GetBYTE()
  1625. RaceStatus = .GETBYTE()
  1626. ComputerType = .GetBYTE()
  1627. Handicap = .GetBYTE()
  1628. Next
  1629. HostGTC = .GetDWORD() ' (DWORD) Host tick count (0 om b.net)
  1630. .GetBYTE() ' (BYTE) 0 or 0xCC for ladder
  1631. .GetBYTE() ' (BYTE) slot count or 0xCC for ladder
  1632. End If
  1633. MyPID = .GetBYTE() ' (BYTE) My ID
  1634. HostLocalAF = .GetWORD() ' (DWORD) Host Local Address Family
  1635. HostLocalPort = .GetWORD() ' (DWORD) Host Local Port
  1636. HostLocalIP = .GetDWORD() ' (DWORD) Host Local IP
  1637. .GetDWORD() ' (DWORD) 0
  1638. .GetDWORD() ' (DWORD) 0
  1639. GLOBALPID = MyPID
  1640. PlayerList.Add GLOBALPID, BotName
  1641. Game.JoinSuccess MyPID
  1642. End With
  1643. End Sub
  1644.  
  1645. Private Sub Recv_W3GS_REJECTJOIN(Data)
  1646. Dim Val
  1647. With DataBufferEx()
  1648. .Data = Data
  1649. Val = .GetDWORD() ' (DWORD) Unknown
  1650. If Val = &H07 Then
  1651. AddGChat "Join rejected. The slot you requested was taken."
  1652. TestTimer.Enabled = True
  1653. TestTimer.Interval = 1
  1654. GameTimeoutTimer.Enabled = False
  1655. Else
  1656. AddGChat "Join rejected due to unknown error (" & Val & ")."
  1657. End If
  1658. End With
  1659. End Sub
  1660.  
  1661. Private Sub Recv_W3GS_PLAYERINFO(Data)
  1662. Dim GameCount, PID, Name, AF, Port, IP, InAF, InPort, InIP, RealName
  1663. With DataBufferEx()
  1664. .Data = Data
  1665. GameCount = .GetDWORD() ' (DWORD) Join/create game count
  1666. PID = .GetBYTE() ' (BYTE) Player ID
  1667. Name = .GetString() ' (STRING) Name
  1668. AF = .GetWORD() ' (WORD) External address family
  1669. Port = .GetWORD() ' (WORD) External port
  1670. IP = .GetDWORD() ' (DWORD) External IP
  1671. .GetDWORD() ' (DWORD) 0
  1672. .GetDWORD() ' (DWORD) 0
  1673. InAF = .GetWORD() ' (WORD) Internal address family
  1674. InPort = .GetWORD() ' (WORD) Internal port
  1675. InIP = .GetDWORD() ' (DWORD) Internal IP
  1676. .GetDWORD() ' (DWORD) 0
  1677. .GetDWORD() ' (DWORD) 0
  1678. If not PlayerList.Exists(CStr(PID)) Then
  1679. PlayerList.Item(CStr(PID)) = Name
  1680. Else
  1681. AddGChat "An Error has occured with " & Name
  1682. End If
  1683. AddGChat PlayerList.Item(CStr(PID)) & " has joined the game."
  1684. Call UpdatePanel()
  1685. End With
  1686. End Sub
  1687.  
  1688. Private Sub Recv_W3GS_LEAVER(Data)
  1689. Dim PID
  1690. With DataBufferEx()
  1691. .Data = Data
  1692. PID = .GetByte
  1693. If PlayerList.Exists(CStr(PID)) Then
  1694. AddGChat PlayerList.Item(CStr(PID)) & " has left the game."
  1695. PlayerList.Remove CStr(PID)
  1696. Else
  1697. AddGChat "An Unknown Player (" & CStr(PID) & ") has left the game."
  1698. End If
  1699. Call UpdatePanel()
  1700. End With
  1701. End Sub
  1702.  
  1703.  
  1704. Private Sub Recv_W3GS_CLIENTREADY(Data)
  1705. AddGChat "All clients have loaded the map."
  1706. End Sub
  1707.  
  1708. Private Sub Recv_W3GS_SLOTINFO(Data)
  1709. Dim SlotInfoSize, SlotCount, I, PID, DLLen, Status, IsComputer, TeamNum, ColorNum, _
  1710. RaceStatus, ComputerType, Handicap, HostGTC
  1711. With DataBufferEx()
  1712. .Data = Data
  1713. SlotInfoSize = .GetWORD()
  1714. If SlotInfoSize > 0 Then
  1715. SlotCount = .GetBYTE()
  1716. For I = 1 To SlotInfoSize
  1717. PID = .GetBYTE()
  1718. DLLen = .GetBYTE()
  1719. Status = .GetBYTE()
  1720. IsComputer = .GetBYTE()
  1721. TeamNum = .GetBYTE()
  1722. ColorNum = .GetBYTE()
  1723. RaceStatus = .GETBYTE()
  1724. ComputerType = .GetBYTE()
  1725. Handicap = .GetBYTE()
  1726. Next
  1727. HostGTC = .GetDWORD() ' (DWORD) Host tick count (0 om b.net)
  1728. .GetBYTE() ' (BYTE) 0 or 0xCC for ladder
  1729. .GetBYTE() ' (BYTE) slot count or 0xCC for ladder
  1730. End If
  1731. End With
  1732. End Sub
  1733.  
  1734. Private Sub Recv_W3GS_START(Data)
  1735. If Failsafe Then
  1736. AddGChat "Game Starting... Automatically aborting to avoid further errors."
  1737. Game.CloseAll
  1738. Else
  1739. AddGChat "Game Starting..."
  1740. End If
  1741. End Sub
  1742.  
  1743. Private Sub Recv_W3GS_LOADING(Data)
  1744. If Failsafe Then
  1745. AddGChat "The map is supposed to be loading... feature not installed in this version."
  1746. AddGChat "Aborting..."
  1747. Game.CloseAll
  1748. Else
  1749. AddGChat "Pretending to have loaded the map..."
  1750. SendPacket &H23, vbNullString
  1751. End If
  1752. End Sub
  1753.  
  1754. Private Sub Recv_W3GS_MESSAGE(Data)
  1755. Dim RecvCount, I, Recv, Send, Message, Sender, Value, SenderID
  1756. With DataBufferEx()
  1757. .Data = Data
  1758. RecvCount = .GetBYTE() ' (BYTE) Count of recievers
  1759. ReDim Recv(RecvCount)
  1760. For I = 0 To UBound(Recv) - 1
  1761. Recv(I) = .GetBYTE() ' (BYTE[RecvCount]) PIDs of Recievers
  1762. Next
  1763. SenderID = .GetBYTE() ' (BYTE) Sender
  1764. .GetBYTE() ' (BYTE) 0x10
  1765. Message = .GetString() ' (STRING) Message
  1766. End With
  1767. If PlayerList.Exists(CStr(SenderID)) Then Sender = PlayerList.Item(CStr(SenderID))
  1768. If LenB(Sender) = 0 Then Sender = BotName
  1769. AddGChat "<" & Sender & "> " & Message
  1770. Call Check_Message(Sender, SenderID, Message)
  1771. End Sub
  1772.  
  1773. Private Sub Recv_W3GS_CLIENTPING(Data)
  1774. AddGChat "Client Ping - If you come accross this, please contact Neco with the data log."
  1775. End Sub
  1776.  
  1777. Sub Check_Message(Username, PID, Message)
  1778. If Left(Message, Len(BotVars.Trigger)) = BotVars.Trigger Then
  1779. Select Case LCase(Message)
  1780. Case BotVars.Trigger & "leave" : AddGChat "Leaving game..." : Game.CloseAll
  1781. Case Else : Call SSC.Command(Username, Message)
  1782. End Select
  1783. End If
  1784. End Sub
  1785.  
  1786.  
  1787.  
  1788.  
  1789.  
  1790. '///////////////////// MAP STUFF //////////////////////////'
  1791.  
  1792. Private Sub Recv_W3GS_MAPDOWNLOAD(Data)
  1793. Dim PID
  1794. With DataBufferEx()
  1795. .Data = Data
  1796. .GetDWORD ' (DWORD) 1
  1797. PID = .GetBYTE ' (BYTE) Sender PID
  1798. End With
  1799. AddChat vbYellow, "[W3GS] Starting map download from player #" & PID & "..."
  1800. DOWNLOADSPOOF = 1
  1801. End Sub
  1802.  
  1803. Private Sub Send_W3GS_MAPCHECK(Action, FileSize)
  1804. AddChat vbBlue, Action & " | " & FileSize
  1805. With DataBufferEx()
  1806. .InsertDWORD &H01 ' (DWORD) 1
  1807. .InsertBYTE Action ' (BYTE) Action (1=complete, 3=incomplete)
  1808. .InsertDWORD FileSize ' (DWORD) Map size
  1809. SendPacket &H42, .Data ' W3GS_MAPSIZE
  1810. End With
  1811. End Sub
  1812.  
  1813. Private Sub Recv_W3GS_MAPCHECK(Data)
  1814. Dim MapPath, FileSize, Crc32
  1815. With DataBufferEx()
  1816. .Data = Data
  1817. .GetDWORD ' (DWORD) 1
  1818. MapPath = .GetString() ' (STRING) Map path
  1819. FileSize = .GetDWORD() ' (DWORD) Size
  1820. .GetDWORD ' (DWORD) Unknown
  1821. Crc32 = .GetDWORD() ' (DWORD) CRC32
  1822. End With
  1823. '//If Download Then
  1824. 'If DOWNLOADSPOOF = 0 Then
  1825. ' DOWNLOAD_SIZE = FileSize
  1826. ' Call Send_W3GS_MAPCHECK(&H03, 0)
  1827. ' AddChat vbBlue, "START"
  1828. 'Elseif DOWNLOADSPOOF >= FileSize Then
  1829. ' Call Send_W3GS_MAPCHECK(&H01, FileSize)
  1830. ' AddChat vbBlue, "Complete"
  1831. 'End If
  1832. 'AddChat vbBlue, "RECIVED MAPPART"
  1833. 'AddChat vbRed, DOWNLOADSPOOF
  1834. 'AddChat vbRed, DOWNLOAD_SIZE
  1835. 'If DOWNLOADSPOOF >= (DOWNLOAD_SIZE) Then
  1836. ' Call Send_W3GS_MAPCHECK(&H01, DOWNLOAD_SIZE)
  1837. ' AddChat vbBlue, "Downloading complete."
  1838. 'End If
  1839. Call Send_W3GS_MAPCHECK(&H01, FileSize)
  1840. End Sub
  1841.  
  1842. Private Sub Recv_W3GS_MAPPART(Data)
  1843. Dim RPID, SPID, Start
  1844. With DataBufferEx()
  1845. .Data = Data
  1846. RPID = .GetBYTE() ' (BYTE) Reciever PID
  1847. SPID = .GetBYTE() ' (BYTE) Sender PID
  1848. .GetDWORD ' (DWORD) 1
  1849. Start = .GetDWORD() ' (DWORD) Start position
  1850. Data = Mid(Data, 11) ' (BYTE[-> end]) Map part
  1851. End With
  1852. AddChat vbBlue, "RECIVED MAPPART"
  1853. AddChat vbRed, DOWNLOADSPOOF
  1854. AddChat vbRed, DOWNLOAD_SIZE
  1855. Call Send_W3GS_MAPPARTOK(SPID, RPID, DOWNLOADSPOOF)
  1856. End Sub
  1857.  
  1858. Private Sub Send_W3GS_MAPPARTOK(SPID, RPID, Size)
  1859. With DataBufferEx()
  1860. .InsertBYTE SPID ' (BYTE) Sender PID
  1861. .InsertBYTE RPID ' (BYTE) Reciever PID
  1862. .InsertDWORD 1 ' (DWORD) 1
  1863. .InsertDWORD Size ' (DWORD) Size
  1864. SendPacket &H44, .Data ' W3GS_MAPPARTOK
  1865. End With
  1866. End Sub
  1867.  
  1868.  
  1869. End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement