DirectPlay помогите с клиентом

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
TrueTrue
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 167
Зарегистрирован: 20.05.2009 (Ср) 23:18

DirectPlay помогите с клиентом

Сообщение TrueTrue » 19.03.2010 (Пт) 0:45

Здравствуйте, вобщем ситуация следующая.

Есть Игра, Age Of Empires II Conquerrors Expansion
Она использует DirectPlay для соединения между клиентами.
Тип соединения Peer-to-peer

Мы с ребятами, любителями поиграть в эту игру, собрались в ХАМАЧЕ и хотим написать свой клиент для этой игры.
Я нашёл чуток информации и пример кода с использованием DirectPlay, немного видоизменил код,
Я узнал GUID самой игры, создаю в игре хост, как обычно, другая игра этот же хост видит,
но при попытке поиска хоста из своей проги ничего не происходит, тоесть хост просто не находиться,
хотя я знаю, что моя прога хост ищет и ищет правильно, так как когда я пробовал создавать хост при помощи второй программы на VB(пример кода тоже нашёл в интернете), то моя первая программа находит Хост, созданный моей второй программой и подключается к ней.

Тоесть, мне кажется что программа работает правильно. Но видимо чего-то не хватает :(

Очень прошу, вас, всех знающих людей, помогите пожалуйста. :) Вы принесёте радость не только мне а ещё многим, в нашей сети :)

Вот мой код:
Код: Выделить всё
Option Explicit

Public dx As New DirectX8
Public dpp As DirectPlay8Peer
Public dpAddres As DirectPlay8Address

Private mEnumAsync As Byte

Implements DirectPlay8Event
-------------------------------------------------------------------------------------------------------------------
Private Sub Form_Load()
    Dim I As Integer
    Dim dpnSPInfo As DPN_SERVICE_PROVIDER_INFO
    Dim Desc As DPN_APPLICATION_DESC

    Set dpp = dx.DirectPlayPeerCreate
    dpp.RegisterMessageHandler frmConnect

    For I = 1 To dpp.GetCountServiceProviders
         dpnSPInfo = dpp.GetServiceProvider(I)
         List1.AddItem dpnSPInfo.Name
         List2.AddItem dpnSPInfo.Guid
    Next
   
    Set dpAddres = dx.DirectPlayAddressCreate
    dpAddres.SetSP dpp.GetServiceProvider(List1.ListIndex + 4).Guid

    Desc.guidApplication = "{5DE93F3F-FC90-4ee1-AE5A-63DAFA055950}"
    mEnumAsync = dpp.EnumHosts(Desc, Nothing, dpAddres, INFINITE, 0, INFINITE, DPNENUMHOSTS_OKTOQUERYFORADDRESSING, ByVal 0&, 0)
End Sub
-------------------------------------------------------------------------------------------------------------------
Private Sub DirectPlay8Event_EnumHostsResponse(dpNotify As DxVBLibA.DPNMSG_ENUM_HOSTS_RESPONSE, fRejectMsg As Boolean)
    AddHostsToListBox dpNotify
    dpp.CancelAsyncOperation mEnumAsync, 0
End Sub
-------------------------------------------------------------------------------------------------------------------
Private Sub AddHostsToListBox(fHost As DPNMSG_ENUM_HOSTS_RESPONSE)
      stop
End Sub
-------------------------------------------------------------------------------------------------------------------
Public Sub DirectPlay8Event_AddRemovePlayerGroup(ByVal lMsgID As Long, ByVal lPlayerID As Long, ByVal lGroupID As Long, fRejectMsg As Boolean)
End Sub
Sub DirectPlay8Event_AppDesc(fRejectMsg As Boolean)
End Sub
Sub DirectPlay8Event_AsyncOpComplete(dpNotify As DxVBLibA.DPNMSG_ASYNC_OP_COMPLETE, fRejectMsg As Boolean)
End Sub
Sub DirectPlay8Event_ConnectComplete(dpNotify As DxVBLibA.DPNMSG_CONNECT_COMPLETE, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_CreateGroup(ByVal lGroupID As Long, ByVal lOwnerID As Long, fRejectMsg As Boolean)
End Sub
Sub DirectPlay8Event_CreatePlayer(ByVal lPlayerID As Long, fRejectMsg As Boolean)
End Sub
Sub DirectPlay8Event_DestroyGroup(ByVal lGroupID As Long, ByVal lReason As Long, fRejectMsg As Boolean)
End Sub
Sub DirectPlay8Event_DestroyPlayer(ByVal lPlayerID As Long, ByVal lReason As Long, fRejectMsg As Boolean)
End Sub
Sub DirectPlay8Event_EnumHostsQuery(dpNotify As DxVBLibA.DPNMSG_ENUM_HOSTS_QUERY, fRejectMsg As Boolean)
End Sub
Sub DirectPlay8Event_HostMigrate(ByVal lNewHostID As Long, fRejectMsg As Boolean)
End Sub
Sub DirectPlay8Event_IndicateConnect(dpNotify As DxVBLibA.DPNMSG_INDICATE_CONNECT, fRejectMsg As Boolean)
End Sub
Sub DirectPlay8Event_IndicatedConnectAborted(fRejectMsg As Boolean)
End Sub
Sub DirectPlay8Event_InfoNotify(ByVal lMsgID As Long, ByVal lNotifyID As Long, fRejectMsg As Boolean)
End Sub
Sub DirectPlay8Event_Receive(dpNotify As DxVBLibA.DPNMSG_RECEIVE, fRejectMsg As Boolean)
End Sub
Sub DirectPlay8Event_SendComplete(dpNotify As DxVBLibA.DPNMSG_SEND_COMPLETE, fRejectMsg As Boolean)
End Sub
Sub DirectPlay8Event_TerminateSession(dpNotify As DxVBLibA.DPNMSG_TERMINATE_SESSION, fRejectMsg As Boolean)
End Sub

TrueTrue
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 167
Зарегистрирован: 20.05.2009 (Ср) 23:18

Re: DirectPlay помогите с клиентом

Сообщение TrueTrue » 20.03.2010 (Сб) 2:31

Ребята, неужели никто ничего не может подсказать нюбу? Или хотя бы направить? Мне так это нада, шо капец! Я уже выяснил, что есть ещё Lobby, правда не до конца понимаю, что это. Может причина в этом Lobby? может игра использует Lobby и Хост игры не находиться, только потому, что я не использую Lobby в своей программе? Может такое Быть?! Может кто-нить, хоть код хоть кусок кода знает, я не могу в интернете найти код на VB где используется это Lobby. Как его включить в свою программу. Подскажите плиз.

TrueTrue
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 167
Зарегистрирован: 20.05.2009 (Ср) 23:18

Re: DirectPlay помогите с клиентом

Сообщение TrueTrue » 23.03.2010 (Вт) 23:05

Мне и в голову не могло придти, что всё на столько сложно. :(

Если никто даже советом помочь не может, то может есть кто-нибудь, кто знает на хорошем уровне и Борланд делфи и Vb6. У меня есть исходный код программы клиента, который делает всё что мне нужно, но он написан на Борланд Делфи. Мог ли бы мне кто-то помочь, конвертировать хотя бы часть кода на VB6. Хотя бы самую важную его часть, использование и подключение LOBBY к моей проге?!

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: DirectPlay помогите с клиентом

Сообщение iGrok » 24.03.2010 (Ср) 0:02

Не то, чтобы сложно. Просто вещь специфическая, и широким массам малоинтересная.
В разделе "работа" с переводом кода на дельфи, думаю, справятся достаточно быстро, и за не очень большую сумму.

Попробуй "перевести" с дельфи сам. Если что-то конкретное никак не будет получаться - тут могут и подсказать, как правильно перевести тот или иной кусок.

А разбираться почему не работает код для подключения к серверу игры - это для начала хотя бы игру найти и поставить надо...
label:
cli
jmp label

TrueTrue
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 167
Зарегистрирован: 20.05.2009 (Ср) 23:18

Re: DirectPlay помогите с клиентом

Сообщение TrueTrue » 30.03.2010 (Вт) 13:37

Спасибо за совет, нужда заставила, разобрался и выяснил в чём была проблема.

Хотел бы спросить ещё вот что:

У меня вышло найти хост игры и вобщем-то выходит подключаться к хосту, всё хорошо работает.

Но вот задача:
Хост игры рассчитан и создаётся на максимальное количество 8 человек.
И при поиске хоста, я получаю инфу о том, кто создал игру и какое количество людей уже к ней подключилось,
для того что бы получить эту инфу, мне не обязательно быть подключённым к игре, как игрок.

Но мне хотелось бы так же получить ещё и список всех пользователей, подключённых к этому хосту.
В DirectPlay есть функция GetDPEnumPlayers, которая даёт такую информацию, список игроков которые подключены к Хосту,
но при этом, я сам должен быть подключён к игре как игрок.

Помогите пожалуйста, потому как я уже запарился методом тыка выяснять всю эту инфу.

Возможно ли, получить информацию о хосте и и игроках хоста, не подключившись при этом к хосту как игрок.


И второе:
У меня сейчас выходит искать ХОСТ игры, по конкретному IP, при этом поиске прога немного подвисает 5-10 сек.,
Похожая програма клиент, написанная на Делфи, что у меня есть, она выдаёт информацию сразу по всем IP в локальной сети, на каком IP
есть хост и сколько людей в игре при этом. у неё задержка тоже 5-10 сек, как у меня на 1 IP.

Подскажите пожалуйста, как можно это оформить у меня в программе? Или мне необходимо в цикле подставлять каждый IP и проделывать ту процедуру поиска Хоста, что я проделываю на конкретный IP? Но если на 1 IP происходит задержка в 5-10 сек. То это вероятно будет очень долго... У нас в сети около 70 человек.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 10

    TopList