October 17, 2021, 09:42:31

Author Topic: [bb] BlitzPlay Lite + eNet by GIB3D [ 1+ years ago ]  (Read 4589 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] BlitzPlay Lite + eNet by GIB3D [ 1+ years ago ]
« on: June 29, 2017, 00:28:38 »
Title : BlitzPlay Lite + eNet
Author : GIB3D
Posted : 1+ years ago

Description : Links
eNet - <a href="http://enet.bespin.org/" target="_blank">http://enet.bespin.org/[/url]
Original BlitzPlay Lite - <a href="http://members.shaw.ca/blitzplay/BPlitev1.14.zip" target="_blank">http://members.shaw.ca/blitzplay/BPlitev1.14.zip[/url]

I was using BlitzPlay Lite which was working just fine for me. But when I tested with someone other than myself, I found out I needed reliable messaging. Since I couldn't get BlitzPlay Pro, I had to find a way to add the reliable messaging myself.

Some things I had to take out
-Connecting port for client. The client only needs to put in the Hosting port now.
-Banning. Since eNet doesn't allow me to see the IPs, you can't ban anyone by IP.

Added
-Reliable messaging. It is defaulted to True, which can be changed to False if you wish.


Code :
Code: BlitzBasic
  1. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-Constants=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  2. ;------These are the values that JoinSession will return
  3. Const BP_NOREPLY = 0                    ;No reply from host within 15 seconds
  4. Const BP_IAMBANNED = 1                  ;Local player's IP has been banned
  5. Const BP_GAMEISFULL = 2         ;The game has maxed out players
  6. Const BP_PORTNOTAVAILABLE = 3   ;The local port wasn't available
  7. Const BP_SUCCESS = 4                    ;The game was joined!
  8. Const BP_USERABORT = 5                  ;The user pushed ESC while joining
  9. Const BP_INVALIDHOSTIP = 6              ;The IP used for the Host was invalid
  10. ;------These are all the messages BP can generate for the end user.
  11. Const BP_PLAYERHASJOINED = 255  ;msgData = new player name|msgFrom = player's id
  12. Const BP_PLAYERHASLEFT = 254    ;msgData = T/F on if intentionally|msgFrom = player's id
  13. Const BP_HOSTHASLEFT = 253              ;msgData = T/F on if intentionally|msgFrom = old host's id
  14. Const BP_PLAYERWASKICKED = 252  ;msgData = null|msgFrom = kicked player's id
  15.  
  16. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=Globals=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  17. ;---------------The following shouldn't be modified externally------------------
  18. ;**Although these ones might be useful to you**
  19. Global BP_Bank = CreateBank(128)
  20. Global BP_Bank_PeerID = CreateBank(4)
  21. Global BP_Bank_DataSize = CreateBank(4)
  22.  
  23. Global BP_GameType                          ;Type of game. (0-255)
  24. Global BP_TotRecvPacket         ;Packets received
  25. Global BP_TotSentPacket         ;Packets sent
  26. Global BP_Host                              ;T/F, am I the Host?
  27. Global BP_Host_ID                               ;Host's ID #
  28. Global BP_Host_IP$                              ;Host's IP; (in integer format) not anymore
  29. Global BP_Host_Port                     ;Host's Port
  30. Global BP_MaxPlayers = 255      ;Maximum # of players
  31. Global BP_My_Name$                              ;Local player's Name
  32. Global BP_My_ID                         ;Local player's ID #
  33. Global BP_My_Port                               ;Local port being used by BlitzPlay
  34. Global BP_NumPlayers                    ;How many players are connected to the game right now
  35. Global BP_LocalHost = BP_ConvertIp ("127.0.0.1");integer local loopback address
  36. Global BP_Online = False                ;T/F
  37. Global BP_My_IP                         ;This computers IP. Set to local if no IP
  38. Global BP_LogFile$ = ""                 ;Define if you want logging enabled.
  39. Global BP_TimeoutPeriod=15000   ;How long before we assuming connection dropped(in ms)
  40. Global BP_Log                                   ;Log file handle, 0 if logging disabled
  41. Global BP_AutoLogging                   ;True or False on if BP should internally do the logging
  42. Global BP_UDPdebug                          ;Odds (in %) that packets do NOT get sent (for testing)
  43. ;**These ones probably not as useful..
  44. Global BP_UDP_Stream                    ;UDP Stream handle
  45. Global BP_CompressBank = CreateBank(4);Bank used for converting Floats to Strings
  46. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=Types=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  47. Type NetInfo                                    ;--The general player info.
  48.         Field Name$                             ;Player's Name
  49.         Field Net_id%                   ;Players unique ID #
  50.         Field eNet_id                   ;eNet uses a different ID system
  51.         Field LastHeard%                ;When the last packet was received from them.
  52.         Field Alive%                    ;Boolean on if we think this player is still there
  53. End Type
  54.  
  55. Type MsgInfo                                    ;--Messages that have arrived are stored here
  56.         Field msgData$                  ;actual packet contents
  57.         Field msgType%                  ;Msg type(0-255)
  58.         Field msgFrom%                  ;ID of msg sender
  59. End Type
  60.  
  61. Type DiscID                                             ;--Keeps track of disconnects' ID's
  62.         Field id%                               ;ID of disconnect
  63. End Type
  64.  
  65. Type Connecting                                 ;--For players trying to connect
  66.         Field Name$                             ;Connect name
  67.         Field Net_id%                   ;new player's ID
  68.         Field eNet_id                   ;eNet uses a different ID system
  69.         Field LastHeard%                ;When the last packet was received from them.
  70.         Field Alive%                    ;Boolean on if we think this new connect is still trying
  71. End Type
  72.  
  73. Type UnrecMsgQueue                              ;--Messages from unrecognized IP+Port
  74.         Field msgData$                  ;Hm. Self explanatory.
  75.         Field msgType%
  76.         Field Time%                             ;These will be stored for up to 1 second then disregarded
  77.         Field Net_id%
  78.         Field eNet_id                   ;eNet uses a different ID system
  79. End Type
  80.  
  81. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=Functions=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  82. Function BP_ClearSession()
  83. ;-=-=-=Clears out any data that could be leftover from previous sessions.
  84.         If First NetInfo<>Null Then Delete Each NetInfo
  85.         If First UnrecMsgQueue<>Null Then Delete Each UnrecMsgQueue
  86.         If First Connecting<>Null Then Delete Each Connecting
  87.         If First MsgInfo<>Null Then Delete Each MsgInfo
  88.         If First DiscID<>Null Then Delete Each DiscID
  89.         BP_TotSentPacket = 0
  90.         BP_TotRecvPacket = 0
  91.         BP_StopLogFile()
  92.         If BP_Online ENetDeInitialize()
  93. End Function
  94.  
  95. Function BP_ConvertIp(IP$)
  96. ;-=-=-=Convert an IP from x.x.x.x to integer format.
  97.         Local dot1 = Instr(IP$,".")
  98.         Local dot2 = Instr(IP$,".",dot1+1)
  99.         Local dot3 = Instr(IP$,".",dot2+1)
  100.         Local Octet1% = Mid$(IP$,1,dot1-1)
  101.         Local Octet2% = Mid$(IP$,dot1+1,dot2-1)
  102.         Local Octet3% = Mid$(IP$,dot2+1,dot3-1)
  103.         Local Octet4% = Mid$(IP$,dot3+1)
  104.         Return (((((Octet1 Shl 8) Or Octet2) Shl 8) Or Octet3) Shl 8) Or Octet4
  105. End Function
  106.  
  107. Function BP_ConvertDomain(domain$)
  108. ;-=-=-=Converts from www.domain.com to integer IP address.
  109.         Return HostIP(CountHostIPs (domain))
  110. End Function
  111.  
  112. Function BP_EndSession()
  113. ;-=-=-=Disconnect from everything
  114.         If BP_Online
  115.                 If BP_Host Then
  116.                         BP_UDPMessage(0,251,Chr(BP_My_ID))
  117.                 Else
  118.                         BP_UDPMessage(BP_Host_ID,253,Chr(BP_My_ID))
  119.                 EndIf
  120.                
  121.                 BP_Online = False
  122.         EndIf
  123.        
  124.         BP_UDP_Stream = 0
  125.         BP_ClearSession()
  126.         BP_StopLogFile()
  127. End Function
  128.  
  129. Function BP_FindConnect.Connecting(id,enet=False)
  130. ;-=-=-=Go through the Connecting type list and search by IP+Port
  131.         Local a.Connecting
  132.        
  133.         For a.Connecting = Each Connecting
  134.                 If enet
  135.                         If aeNet_id = id Then Return a
  136.                 Else
  137.                         If aNet_id = id Then Return a
  138.                 EndIf
  139.         Next
  140. End Function
  141.  
  142. Function BP_FindID.NetInfo(id,enet=False)
  143. ;-=-=-=Go through the NetInfo type list and find a specific instance, based on the ID
  144.         Local a.NetInfo
  145.        
  146.         For a.NetInfo = Each NetInfo
  147.                 If enet
  148.                         If aeNet_id = id Then Return a
  149.                 Else
  150.                         If aNet_id = id Then Return a
  151.                 EndIf
  152.         Next
  153. End Function
  154.  
  155. Function BP_FloatToStr$(num#)
  156. ;-=-=-=Convert a floating point number to a 4 byte string
  157.         Local st$ = "",i%
  158.         PokeFloat BP_CompressBank,0,num
  159.         For i = 0 To 3
  160.                 st = st + Chr(PeekByte(BP_CompressBank,i))
  161.         Next
  162.         Return st
  163. End Function
  164.  
  165. Function BP_GetGameType()
  166. ;-=-=-=Returns the currently set game type
  167.     Return BP_GameType%
  168. End Function
  169.  
  170. Function BP_GetHostID()
  171. ;-=-=-=Returns the Host ID
  172.     Return BP_Host_ID%
  173. End Function
  174.  
  175. Function BP_GetHostIP$()
  176. ;-=-=-=Returns the Host IP address
  177.     Return BP_Host_IP
  178. End Function
  179.  
  180. Function BP_GetHostPort()
  181. ;-=-=-=Returns the Host Port
  182.     Return BP_Host_Port%
  183. End Function
  184.  
  185. Function BP_GetLogFileName$()
  186. ;-=-=-=Returns the currently set Log File name
  187.     Return BP_LogFile$
  188. End Function
  189.  
  190. Function BP_GetMaxPlayers()
  191. ;-=-=-=Returns the currently set Max Players value
  192.     Return BP_MaxPlayers%
  193. End Function
  194.  
  195. Function BP_GetMyID()
  196. ;-=-=-=Returns this users ID
  197.     Return BP_My_ID%
  198. End Function
  199.  
  200. Function BP_GetMyIP$()
  201. ;-=-=-=Returns this users IP address
  202.         Local ip%
  203.         If CountHostIPs ("") Then ip = HostIP(CountHostIPs("")) Else ip = BP_LocalHost
  204.         Return DottedIP$(ip)
  205. End Function
  206.  
  207. Function BP_GetMyName$()
  208. ;-=-=-=Returns this users name
  209.         Return BP_My_Name$
  210. End Function
  211.  
  212. Function BP_GetMyPort()
  213. ;-=-=-=Returns this users Port
  214.         Return BP_My_Port%
  215. End Function
  216.  
  217. Function BP_GetNumberOfPlayers()
  218. ;-=-=-=Returns the current number of players
  219.         Return BP_NumPlayers%
  220. End Function
  221.  
  222. Function BP_GetPacketsReceived()
  223. ;-=-=-=Returns the number of packets that have been received
  224.         Return BP_TotRecvPacket%
  225. End Function
  226.  
  227. Function BP_GetPacketsSent()
  228. ;-=-=-=Returns the number of packets that have been sent
  229.         Return BP_TotSentPacket%
  230. End Function
  231.  
  232. Function BP_GetPlayerName$(ID)
  233. ;-=-=-=Find a player's name based on the ID
  234.     Local a.NetInfo
  235.        
  236.         For a.NetInfo = Each NetInfo
  237.                 If aNet_id = ID Then Return aName$
  238.         Next
  239. End Function
  240.  
  241. Function BP_GetTimeoutPeriod()
  242. ;-=-=-=Returns the current Timeout Period
  243.     Return BP_TimeoutPeriod / 1000
  244. End Function
  245.  
  246. Function BP_HostSession(HostName$,MaxPlayers%,GameType%,LocalPort%,TimeoutPeriod%)
  247. ;-=-=-=Host the game
  248. ;First clear out any left over data from a previous session
  249.         BP_ClearSession()
  250.         ENetInitialize()
  251. ;Now initialize the Host information and open the specified port.
  252.         BP_NumPlayers = 1
  253.         BP_MaxPlayers = MaxPlayers
  254.         BP_Host = True
  255.         BP_My_IP = BP_ConvertIp(BP_GetMyIP())
  256.         BP_My_Port = LocalPort
  257.         BP_Host_Port = BP_My_Port
  258.         BP_Host_ID = 1
  259.         BP_Host_IP = BP_My_IP
  260.         Local nInfo.NetInfo = New NetInfo
  261.         nInfoName = HostName
  262.         BP_My_Name = HostName
  263.         BP_My_ID = 1
  264.         nInfoNet_id = 1
  265.         nInfoeNet_id = -1
  266.        
  267.         BP_UDP_Stream = ENetCreate(True,BP_My_IP,BP_My_Port,BP_MaxPlayers,0,0)
  268.        
  269. ;And set up the game information
  270.         BP_GameType = GameType
  271.         BP_TimeoutPeriod = TimeoutPeriod * 1000 ;TimeoutPeriod is converted to milliseconds
  272.        
  273.         If BP_UDP_Stream Then
  274.                 BP_Online = True
  275.         Else
  276.                 BP_Online = False
  277.                 ENetDeInitialize()
  278.         EndIf
  279.        
  280.         Return BP_Online
  281. End Function
  282.  
  283. Function BP_IntToStr$(Num%, StrLen% = 4)
  284. ;-=-=-=Take an Integer and compress it to a string, of "strlen" bytes long.
  285.         Local shiftin%
  286.         Local st$ = Chr(Num And 255)
  287.         For shiftin = 1 To (StrLen - 1)
  288.                 st$ = st$ + Chr(Num Sar (8 * shiftin))
  289.         Next
  290.         Return st
  291. End Function
  292.  
  293. Function BP_JoinSession(ClientName$,HostPort%,strHostIP$)
  294. ;-=-=-=Join a game already in progress
  295. ;JoinSession will return:
  296. ;0=No reply from BP_Host
  297. ;1=This IP is banned
  298. ;2=Game is full
  299. ;3=Local port not available
  300. ;4=Joined game!
  301.  
  302. ;Also notice the constants which coincide w/ these values:
  303. ;BP_NOREPLY, BP_IAMBANNED, BP_GAMEISFULL, BP_PORTNOTAVAILABLE, BP_SUCCESS
  304.         DebugLog strHostIP
  305.         Local msg.MsgInfo,nInfo.NetInfo
  306.         Local Starttime
  307.         Local Reason
  308.         Local Counter
  309.         Local IntHostIP
  310.         Local Message$
  311.        
  312. ;Clear out any left over data from a previous session and initialize this session
  313.         BP_ClearSession()
  314.        
  315.         ;Directly convert the Host's IP into an integer, to test to see if the IP entered is simply a number (w/ no periods)
  316.         IntHostIP = strHostIP
  317.         If IntHostIP Then       ;First, error check for valid IP's
  318.                 If Not(Instr(strHostIP, ".")) Then
  319.                         BP_UpdateLog ("Connection attempt aborted. Host IP is invalid.")
  320.                         Return BP_INVALIDHOSTIP%
  321.                 EndIf
  322.         EndIf
  323.        
  324.         ;Now, convert the IP/Domain to an integer
  325.         IntHostIP = BP_DotToInt(strHostIP);BP_ConvertDomain(strHostIP)
  326.         BP_UpdateLog ("New connection attempt for " + ClientName + " on Port " + HostPort + ". Server: " + DottedIP(IntHostIP) + ":" + HostPort)
  327.  
  328.         ;Error check again
  329.         If Not(IntHostIP) Then
  330.                 BP_UpdateLog ("Connection attempt aborted. Host IP is invalid.")
  331.                 Return BP_INVALIDHOSTIP%
  332.         EndIf
  333.  
  334.         BP_Host = False
  335.         BP_My_IP = BP_ConvertIp(BP_GetMyIP())
  336.         ;BP_My_Port = LocalPort
  337.         BP_Host_IP = strHostIP;IntHostIP
  338.         BP_Host_Port = HostPort
  339.        
  340.         ;Start connecting with BP_Host
  341.         ENetInitialize()
  342.         BP_UDP_Stream = ENetCreate(False,"",0,0,0,0)
  343.        
  344.         If BP_UDP_Stream Then
  345.                 DebugLog "BP_Host_IP = " + BP_Host_IP
  346.                
  347.                 Local Connect = ENetConnect(BP_Host_IP,HostPort)
  348.                 If Connect
  349.                         DebugLog "Connected = " + Connect
  350.                         Message = Chr(254) + Chr(0) + Chr(1) + ClientName
  351.                         DebugLog "Message = " + (Chr(254) + Chr(0) + Chr(1) + ClientName)
  352.                         ENetSendData(Message,Len(Message),0,True)
  353.                        
  354.                         BP_NumPlayers = 255
  355.                        
  356.                         Starttime = MilliSecs()
  357.                        
  358.                         Reason = 0
  359.                         BP_Online = True
  360.                        
  361.                         ;Receive info on game session as well as other player information
  362.                         Repeat
  363.                                 BP_UpdateNetwork ()
  364.                                
  365.                                 If (MilliSecs() - Starttime) > 15000 Then
  366.                                         BP_Online = False
  367.                                         Exit
  368.                                 EndIf
  369.                                
  370.                                 For msg.MsgInfo = Each MsgInfo
  371.                                         If msgmsgType = 256 Then
  372.                                                 Reason = msgmsgData
  373.                                                 BP_Online = False
  374.                                                 Exit
  375.                                         EndIf
  376.                                 Next
  377.                                
  378.                                 Counter = 0
  379.                                
  380.                                 For nInfo.NetInfo = Each NetInfo
  381.                                         Counter = Counter + 1
  382.                                 Next
  383.                                
  384.                                 If Counter = BP_NumPlayers Then
  385.                                         Reason = BP_SUCCESS
  386.                                         BP_Online = True
  387.                                         Exit
  388.                                 EndIf
  389.                                
  390.                                 If KeyHit(1) Then
  391.                                         Reason = BP_USERABORT
  392.                                         BP_Online = False
  393.                                 EndIf
  394.                                
  395.                         Until Reason
  396.                        
  397.                         If BP_Online Then
  398.                                 nInfo.NetInfo = New NetInfo
  399.                                 nInfoName = ClientName
  400.                                 nInfoNet_id = BP_My_ID
  401.                                 nInfoAlive = True
  402.                                
  403.                                 BP_My_Name$ = ClientName
  404.                                 Message = Chr(254) + Chr(0) + Chr(2)
  405.                                 ENetSendData(Message,Len(Message),0,True)
  406.                                
  407.                                 BP_NumPlayers = BP_NumPlayers + 1
  408.                         Else
  409.                                 ENetDeInitialize()
  410.                                 BP_UDP_Stream = 0
  411.                         EndIf
  412.                 Else
  413.                         BP_Online = False
  414.                         Reason = BP_NOREPLY
  415.                         ENetDeInitialize()
  416.                 EndIf
  417.         Else
  418.                 BP_Online = False
  419.                 Reason = BP_PORTNOTAVAILABLE
  420.                 ENetDeInitialize()
  421.         EndIf
  422.        
  423.         Return Reason
  424. End Function
  425.  
  426. Function BP_KickID(id%, ban% = False)
  427. ;-=-=-=Kick an ID, maybe even ban 'em
  428.         Local nInfo.NetInfo
  429.         Local msg.MsgInfo
  430.        
  431.         If BP_My_ID = BP_Host_ID Then
  432.                 nInfo.NetInfo = BP_FindID (id)
  433.                 If nInfo<>Null And id <> BP_My_ID Then
  434.                         BP_UDPMessage (0, 249, Chr(id)+Chr(ban))
  435.                         msg.MsgInfo = New MsgInfo
  436.                         msgmsgType = 252
  437.                         msgmsgFrom = id
  438.                         msgmsgData = ban
  439. ;                       If ban Then
  440. ;                               BP_BanIP (nInfoIP)
  441. ;                               If BP_Log Then BP_UpdateLog ("You banned: " + nInfoName)
  442. ;                       Else
  443. ;                               If BP_Log Then BP_UpdateLog ("You kicked: " + nInfoName)
  444. ;                       EndIf
  445.                         Delete nInfo
  446.                         BP_NumPlayers = BP_NumPlayers - 1
  447.                 EndIf
  448.         EndIf
  449. End Function
  450.  
  451. Function BP_NextAvailID%()
  452. ;-=-=-=Find out the Next available ID # that is Not in use
  453.         Local a.NetInfo
  454.         Local testing
  455.         Local foundit
  456.         Local temp_array[256]
  457.        
  458.         For a.NetInfo = Each NetInfo
  459.                 temp_array[aNet_id] = True
  460.         Next
  461.  
  462.         For testing = 1 To BP_MaxPlayers
  463.                 If Not temp_array[testing] Then
  464.                         foundit = testing
  465.                         Exit
  466.                 EndIf
  467.         Next
  468.         Return foundit
  469. End Function
  470.  
  471. Function BP_SetGameType(GameType%)
  472. ;-=-=-=Allows the user to control the numeric game type value
  473.         If BP_My_ID = BP_Host_ID Then
  474.             BP_GameType% = GameType%
  475.                 BP_UDPMessage (0,248,"1"+GameType)
  476.         EndIf
  477. End Function
  478.  
  479. Function BP_SetMaxPlayers(MaximumPlayers%)
  480. ;-=-=-=Allows the user to control the maximum allowable players
  481.         If (BP_My_ID = BP_Host_ID) Then
  482.                 If MaximumPlayers > 255 Then MaximumPlayers = 255
  483.                 If MaximumPlayers < 0 Then MaximumPlayers = 0
  484.             BP_MaxPlayers% = MaximumPlayers%
  485.                 BP_UDPMessage (0,248,"2"+MaximumPlayers)
  486.         EndIf
  487. End Function
  488.  
  489. Function BP_SetTimeoutPeriod(TimeoutPeriod%)
  490. ;-=-=-=Allows the user to set or change the TimeoutPeriod value
  491.     BP_TimeoutPeriod% = TimeoutPeriod%
  492. End Function
  493.  
  494. Function BP_SimulatePacketLoss(Odds%)
  495. ;-=-=-=Allows the user to control simulated packet loss
  496.     BP_UDPdebug = Odds%
  497. End Function
  498.  
  499. Function BP_StartLogFile(FileName$, Append% = True, Automatic% = True)
  500. ;-=-=-=Opens up the log file. Also, optionally appends to the file instead of overwriting.
  501. ;Will only start a log if there isn't one already, and if the filename is valid.
  502.         If (Len(FileName$) > 0) And (BP_Log = 0) Then
  503.                 BP_LogFile$ = FileName$
  504.                 BP_AutoLogging = Automatic
  505.                 ;Check to see if the file exists already
  506.                 If FileType(FileName$) = 1 Then
  507.                         Select Append   ;If it does, check to see if we're going to append or overwrite
  508.                                 Case True
  509.                                         BP_Log = OpenFile (FileName$)
  510.                                         SeekFile (BP_Log, FileSize(FileName$))
  511.                                         WriteLine BP_Log, ""
  512.                                 Case False
  513.                                         DeleteFile FileName$
  514.                                         BP_Log = WriteFile (FileName$)
  515.                         End Select
  516.                 Else
  517.                         BP_Log = WriteFile (FileName$)
  518.                 EndIf                  
  519.                 ;Now that the file is opened, insert the header information
  520.                 WriteLine BP_Log, "**Logging enabled at " + CurrentTime$() + " for " + BP_GetMyName() + "."
  521.                 If BP_Online Then
  522.                         WriteLine BP_Log, "Connection Status: Online  Local IP/Port = " + DottedIP$(BP_GetMyIP()) + "/" + BP_GetMyPort() + "  Host IP/Port = " + DottedIP$(BP_GetHostIP()) + "/" + BP_GetHostPort()
  523.                 Else
  524.                         WriteLine BP_Log, "Connection Status: Offline  Local IP/Port = " + DottedIP$(BP_GetMyIP()) + "/" + BP_GetMyPort() + "  Host IP/Port = " + DottedIP$(BP_GetHostIP()) + "/" + BP_GetHostPort()
  525.                 EndIf
  526.                 WriteLine BP_Log, "Current Session Stats: GameType = " + BP_GetGameType() + "  NumPlayers = " + BP_GetNumberOfPlayers() + "  Local ID/Host ID = " + BP_GetMyID() + "/" + BP_GetHostID()
  527.         EndIf
  528. End Function
  529.  
  530. Function BP_StopLogFile()
  531. ;-=-=-=Allows the user to stop the logfile
  532.         If BP_Log
  533.                 WriteLine BP_Log, "**Logging stopped at " + CurrentTime$() + "."
  534.                 CloseFile BP_Log
  535.                 BP_Log = 0
  536.         EndIf
  537.         BP_AutoLogging = False
  538. End Function
  539.  
  540. Function BP_StrToInt%(st$)
  541. ;-=-=-=Take a String of any length and turn it into an integer again.
  542.         Local shiftin%
  543.         Local num%
  544.         For shiftin = 0 To (Len (st$) - 1)
  545.                 num = num Or (Asc (Mid$ (st$, shiftin + 1, 1)) Shl shiftin * 8)
  546.         Next
  547.         Return num
  548. End Function
  549.  
  550. Function BP_StrToFloat#(st$)
  551. ;-=-=-=Take a 4 byte string and turn it back into a floating point #.
  552.         Local num#,i%
  553.         For i = 0 To 3
  554.                 PokeByte BP_CompressBank,i,Asc(Mid$(st$,i+1,1))
  555.         Next
  556.         num# = PeekFloat(BP_CompressBank,0)
  557.         Return num
  558. End Function
  559.  
  560. Function BP_DotToInt%(ip$)
  561.         Local off1=Instr(ip$,".")         :Local ip1=Left$(ip$,off1-1)
  562.         Local off2=Instr(ip$,".",off1+1):Local ip2=Mid$(ip$,off1+1,off2-off1-1)
  563.         Local off3=Instr(ip$,".",off2+1):Local ip3=Mid$(ip$,off2+1,off3-off2-1)
  564.         Local off4=Instr(ip$," ",off3+1):Local ip4=Mid$(ip$,off3+1,off4-off3-1)
  565.         Return ip1 Shl 24 + ip2 Shl 16 + ip3 Shl 8 + ip4
  566. End Function
  567.  
  568. Function BP_UpdateNetwork()             ;This is the -meat- of the library.
  569.         ;Host mostly uses the eNet ID system for checking clients
  570.         ;Client only uses the BlitzPlay ID system for checking
  571.        
  572.        
  573. ;-=-=-=Check for messages, disconnects, new players, and UDP resends.
  574.         ;First lets get the variables defined as local to this function only
  575.         Local CurTime
  576.         Local MsgFrom,eNetID
  577.         Local MsgType
  578.         Local MsgTarget
  579.         Local MsgToSend$
  580.         Local MsgData$
  581.         Local Counter
  582.         Local Allowed
  583.         Local KickedID
  584.         Local Event
  585.        
  586. ;***Check UDP Messages first
  587.         If BP_Online
  588.                 If BP_Host
  589.                         ;[Block] Host's UpdateNetwork
  590.                        
  591.                         While( ENetDoEventCheck(0) > 0 )
  592.                                 Event = ENetCheckEvents(BP_Bank_PeerID,BP_Bank_DataSize,BP_Bank)
  593.                                
  594.                                 If Event = 3
  595.                                         CurTime = MilliSecs ()
  596.                                         BP_TotRecvPacket = BP_TotRecvPacket + 1
  597.                                        
  598.                                         eNetID = PeekInt(BP_Bank_PeerID,0)
  599.                                         ;DebugLog "MsgData1 = " + MsgData
  600.                                         MsgData = BP_ReturnMessage(BP_Bank,BP_Bank_DataSize)
  601.                                         MsgType = Asc(Mid(MsgData,1,1))
  602.                                         MsgTarget = Asc(Mid(MsgData,2,1))
  603.                                         MsgData = Mid(MsgData,3,Len(MsgData)-2)
  604.                                        
  605.                                         ;DebugLog "eNetID = " + eNetID
  606.                                         ;DebugLog "MsgData2 = " + MsgData
  607.                                         ;DebugLog "MsgType = " + MsgType
  608.                                        
  609.                                         Local nInfo.NetInfo = BP_FindID(eNetID,True)
  610.                                         If nInfo<>Null Then nInfoLastHeard = CurTime : nInfoAlive = True : MsgFrom = nInfoNet_id;Make sure we don't timeout
  611.                                        
  612.                                         ;DebugLog "MsgFrom = " + MsgFrom
  613.                                        
  614.                                         Select MsgType
  615.                                                 Case 255                        ;If it was a keep alive packet
  616.                                                         If nInfo <> Null Then
  617.                                                                 nInfoLastHeard = CurTime
  618.                                                                 nInfoAlive = True
  619.                                                         EndIf
  620.                                                        
  621.                                                 Case 254                        ;A packet with connecting info for a new player
  622.                                                         Select Asc(MsgData)
  623.                                                                 Case 1
  624.                                                                         Local c.Connecting = BP_FindConnect(eNetID,True)
  625.                                                                         If c = Null Then        ;New join! Time to see if we'll let 'em in
  626.                                                                                 ;check to see that they aren't banned
  627.                                                                                 ;allowed is the code that we assign to this connect
  628.                                                                                 ;1 = banned|2 = no room|4 = allowed!
  629.                                                                                 Allowed% = BP_SUCCESS
  630.                                                                                
  631.                                                                                 Local ccount.Connecting
  632.                                                                                 ;make sure there's room, counting people in middle of connecting
  633.                                                                                 Counter = 0
  634.                                                                                 For ccount.Connecting = Each Connecting
  635.                                                                                         Counter = Counter + 1
  636.                                                                                 Next
  637.                                                                                 If (BP_NumPlayers + Counter) => BP_MaxPlayers Then Allowed = BP_GAMEISFULL
  638.                                                                                 If Allowed = BP_SUCCESS Then
  639.                                                                                         c.Connecting = New Connecting
  640.                                                                                         cName = Mid$ (MsgData,2)
  641.                                                                                         cNet_id = BP_NextAvailID()
  642.                                                                                         ceNet_id = eNetID
  643.                                                                                         cLastHeard = CurTime
  644.                                                                                         MsgToSend = Chr(254) + Chr(BP_My_ID) + Chr(1) + Chr(cNet_id) + Chr(BP_My_ID) + Chr(BP_NumPlayers) + Chr(BP_MaxPlayers) + Chr(BP_GameType) + Chr(BP_TimeoutPeriod/1000)
  645.                                                                                         ENetSendData(MsgToSend,Len(MsgToSend),ceNet_id,True)
  646.                                                                                        
  647.                                                                                         For nInfo.NetInfo = Each NetInfo
  648.                                                                                                 MsgToSend = Chr(254) + Chr(BP_My_ID) + Chr(2) +  Chr(nInfoNet_id) + nInfoName
  649.                                                                                                 ENetSendData(MsgToSend,Len(MsgToSend),ceNet_id,True)
  650.                                                                                         Next
  651.                                                                                         If BP_Log Then BP_UpdateLog (cName + " is attempting to join the game..")
  652.                                                                                 Else
  653.                                                                                         MsgToSend = Chr(254) + Chr(BP_My_ID) + Chr(3) + Chr(Allowed)
  654.                                                                                         ENetSendData(MsgToSend,Len(MsgToSend),eNetID,True)
  655.                                                                                 EndIf
  656.                                                                         EndIf
  657.                                                                 Case 2
  658.                                                                         c.Connecting = BP_FindConnect(eNetID,True)
  659.                                                                         If c<>Null Then
  660.                                                                                 Local sendmsg$ = Chr(cNet_id) + cName
  661.                                                                                 BP_UDPMessage (0,252,sendmsg)
  662.                                                                                 nInfo.NetInfo = New NetInfo
  663.                                                                                 nInfoName = cName
  664.                                                                                 nInfoNet_id = cNet_id
  665.                                                                                 nInfoeNet_id = eNetID
  666.                                                                                 nInfoLastHeard = CurTime
  667.                                                                                 nInfoAlive = True
  668.                                                                                 Delete c
  669.                                                                                 Local msg.MsgInfo = New MsgInfo
  670.                                                                                 msgmsgType = 255
  671.                                                                                 msgmsgFrom = nInfoNet_id
  672.                                                                                 msgmsgData = nInfoName
  673.                                                                                 BP_NumPlayers = BP_NumPlayers + 1
  674.                                                                                 If BP_Log Then BP_UpdateLog (nInfoName + " has joined the game  ID #" + nInfoNet_id)
  675.                                                                         EndIf
  676.                                                         End Select
  677.                                                        
  678.                                                 Case 253                        ;Someone has left the game
  679.                                                         nInfo.NetInfo = BP_FindID(Asc(MsgData)) ;Since this player is the Host, then tell everyone
  680.                                                         If nInfo<>Null Then                                             ;else about it too
  681.                                                                 Local disc_id = nInfoNet_id
  682.                                                                 msg.MsgInfo = New MsgInfo
  683.                                                                 msgmsgData = True
  684.                                                                 msgmsgType = BP_PLAYERHASLEFT
  685.                                                                 msgmsgFrom = nInfoNet_id
  686.                                                                 If BP_Log Then BP_UpdateLog (nInfoName + " has left the game.")
  687.                                                                 Delete nInfo
  688.                                                                 BP_UDPMessage(0,253,Chr(disc_id) + Chr(True))
  689.                                                                 For c.Connecting = Each Connecting
  690.                                                                         MsgToSend = Chr(253) + Chr(BP_My_ID) + Chr(disc_id) + Chr(True)
  691.                                                                         ENetSendData(MsgToSend,Len(MsgToSend),ceNet_id,True)
  692.                                                                 Next
  693.                                                                 BP_NumPlayers = BP_NumPlayers - 1
  694.                                                         EndIf
  695.                                                        
  696.                                                 Case 252                ;Someone has successfully joined the game
  697.                                                
  698.                                                 Case 251                ;The Host has disconnected
  699.                                                        
  700.                                                 Case 250                ;This was a "are you still there??" packet from someone.
  701.                                                         MsgToSend = Chr(255) + Chr(BP_My_ID) + "yup"
  702.                                                         ENetSendData(MsgToSend,Len(MsgToSend),eNetID,True)
  703.                                                        
  704.                                                 Case 249                ;Someone got kicked
  705.                                                        
  706.                                                 Default                 ;Nothing internal, a user packet. ***User Message
  707.                                                         Local nInfo2.NetInfo = nInfo
  708.                                                         If nInfo2 <> Null Then  ;Do we recognize the sender?
  709.                                                                 If MsgTarget <> BP_My_ID Then
  710.                                                                         If MsgTarget = 0 Then                   ;If its a UDP broadcast..
  711.                                                                                 MsgToSend = Chr(MsgType) + Chr(nInfo2Net_id) + MsgData
  712.                                                                                 For nInfo.NetInfo = Each NetInfo
  713.                                                                                         If nInfoNet_id <> BP_My_ID And nInfoNet_id <> nInfo2Net_id Then
  714.                                                                                                 ENetSendData(MsgToSend,Len(MsgToSend),nInfoeNet_id,True)
  715.                                                                                         EndIf
  716.                                                                                 Next
  717.                                                                         Else                                                    ;Ah, a specific target.
  718.                                                                                 MsgToSend = Chr(MsgType) + Chr(nInfo2Net_id) + MsgData
  719.                                                                                 nInfo.NetInfo = BP_FindID(MsgTarget)
  720.                                                                                 ENetSendData(MsgToSend,Len(MsgToSend),nInfoeNet_id,True)
  721.                                                                         EndIf
  722.                                                                 EndIf
  723.                                                                
  724.                                                                 If MsgTarget = 0 Or MsgTarget = BP_My_ID Then
  725.                                                                         msg.MsgInfo = New MsgInfo
  726.                                                                         msgmsgData = MsgData
  727.                                                                         msgmsgType = MsgType
  728.                                                                         msgmsgFrom = nInfo2Net_id
  729.                                                                         nInfo2LastHeard = CurTime
  730.                                                                         nInfo2Alive = True
  731.                                                                         If BP_AutoLogging Then BP_UpdateLog ("[Incoming] From: " + LSet(nInfo2Name,20) + " Type: " + LSet(MsgType,3) + " {" + MsgData$ + "}")
  732.                                                                 EndIf
  733.                                                         Else
  734.                                                                 Local msgq.UnrecMsgQueue = New UnrecMsgQueue
  735.                                                                 msgqmsgData = MsgData
  736.                                                                 msgqmsgType = MsgType
  737.                                                                 msgqTime = CurTime
  738.                                                         EndIf
  739.                                         End Select
  740.                                 Else
  741.                                         Exit                    ;Ah finally done receiving UDP messages? Outta this loop then!
  742.                                 EndIf
  743.                         Wend
  744.                        
  745.                         CurTime = MilliSecs ()
  746.                        
  747.                         If BP_Online            ;Have to check again because something *could* have made us offline in prev loop
  748.                                 ;Now look through messages from unrecognized players and see if they've recently joined
  749.                                 For msgq.UnrecMsgQueue = Each UnrecMsgQueue
  750.                                         nInfo.NetInfo = BP_FindID(eNetID, True)
  751.                                         If nInfo <> Null Then
  752.                                                 msg.MsgInfo = New MsgInfo
  753.                                                 msgmsgData = MsgData
  754.                                                 msgmsgType = MsgType
  755.                                                 msgmsgFrom = nInfoNet_id
  756.                                                 If BP_AutoLogging Then BP_UpdateLog ("[Incoming] From: " + LSet(nInfoName,20) + " Type: " + LSet(msgmsgType,3) + " {" + msgmsgData$ + "}")
  757.                                                 Delete msgq
  758.                                         Else
  759.                                                 If (msgqTime + 1000) < CurTime Then Delete msgq
  760.                                         EndIf
  761.                                 Next
  762.                                
  763.                                 ;Check to see who might have been disconnected
  764.                                 For nInfo.NetInfo = Each NetInfo
  765.                                         If nInfoNet_id <> BP_My_ID Then
  766.                                                 If ((nInfoLastHeard + (BP_TimeoutPeriod / 2)) < CurTime) And (nInfoAlive) Then  ;It's been 5 secs?
  767.                                                         BP_UDPMessage (nInfoNet_id, 250, "hello?")
  768.                                                         nInfoAlive = False
  769.                                                         If BP_Log Then BP_UpdateLog (nInfoName + " hasn't been heard from in: " + (BP_TimeoutPeriod/1000) + " seconds. Testing to see if still connected.")
  770.                                                 EndIf
  771.                                                 If ((nInfoLastHeard + BP_TimeoutPeriod) < CurTime) And (nInfoAlive = False) Then                                        ;It's been 10 secs!?
  772.                                                         disc_id = nInfoNet_id
  773.                                                         msg.MsgInfo = New MsgInfo
  774.                                                         msgmsgType = BP_PLAYERHASLEFT
  775.                                                         msgmsgFrom = nInfoNet_id
  776.                                                         msgmsgData = False
  777.                                                         BP_UDPMessage (disc_id,249,Chr(disc_id))
  778.                                                         If BP_Log Then BP_UpdateLog (nInfoName + " has lagged out of the game.")
  779.                                                         Delete nInfo
  780.                                                         BP_UDPMessage (0,253,Chr(disc_id) + Chr(False))
  781.                                                         BP_NumPlayers = BP_NumPlayers - 1
  782.                                                 EndIf
  783.                                         EndIf
  784.                                 Next
  785.                                 ;Scan through the list of people connecting, and see if we haven't heard from them in 10 secs          
  786.                                 For c.Connecting = Each Connecting
  787.                                         If (cLastHeard + BP_TimeoutPeriod) < CurTime Then                                               ;It's been 10 secs!?
  788.                                                 If BP_Log Then BP_UpdateLog (cName + " didn't reply fast enough. Deleting from connecting queue.")
  789.                                                 Delete c
  790.                                         EndIf
  791.                                 Next
  792.                         EndIf
  793.                         ;[End]
  794.                 Else
  795.                         ;[Block] Client's UpdateNetwork
  796.                         While( ENetDoEventCheck(0) > 0 )
  797.                                 Event = ENetCheckEvents(BP_Bank_PeerID,BP_Bank_DataSize,BP_Bank)
  798.                                
  799.                                 ;DebugLog "Event = " + Event
  800.                                
  801.                                 If Event = 3
  802.                                         CurTime = MilliSecs ()
  803.                                         BP_TotRecvPacket = BP_TotRecvPacket + 1
  804.                                        
  805.                                         eNetID = 0 ; Host
  806.                                         MsgData = BP_ReturnMessage(BP_Bank,BP_Bank_DataSize)
  807.                                         MsgType = Asc(Mid(MsgData,1,1))
  808.                                         MsgFrom = Asc(Mid(MsgData,2,1))
  809.                                         MsgData = Mid(MsgData,3,Len(MsgData)-2)
  810.                                        
  811.                                         CurTime = MilliSecs ()
  812.                                         nInfo.NetInfo = BP_FindID (BP_Host_ID)
  813.                                         If nInfo<>Null Then nInfoLastHeard = CurTime:nInfoAlive = True
  814.                                         BP_TotRecvPacket = BP_TotRecvPacket + 1
  815.                                         ;Msg will be in format: 123 1=Type|2=Sender|3=Data
  816.                                        
  817.                                         ;DebugLog "MsgData = " + MsgData
  818.                                         ;DebugLog "MsgType = " + MsgType
  819.                                         ;DebugLog "MsgFrom = " + MsgFrom
  820.                                        
  821.                                         Select MsgType
  822.                                                 Case 255                        ;If it was a keep alive packet..
  823.                                                         nInfo.NetInfo = BP_FindID(MsgFrom)
  824.                                                         If nInfo<>Null Then
  825.                                                                 nInfoLastHeard = CurTime
  826.                                                                 nInfoAlive = True
  827.                                                         EndIf
  828.                                                        
  829.                                                 Case 254                        ;A packet with connecting info for a new player
  830.                                                         Select Asc(MsgData)
  831.                                                                 Case 1
  832.                                                                         BP_My_ID = Asc(Mid$(MsgData,2))
  833.                                                                         BP_Host_ID = Asc(Mid$(MsgData,3))
  834.                                                                         BP_NumPlayers = Asc(Mid$(MsgData,4))
  835.                                                                         BP_MaxPlayers = Asc(Mid$(MsgData,5))
  836.                                                                         BP_GameType = Asc(Mid$(MsgData,6))
  837.                                                                         BP_TimeoutPeriod = Asc(Mid$(MsgData,7)) * 1000
  838.                                                                        
  839.                                                                 Case 2
  840.                                                                         nInfo.NetInfo = BP_FindID(Asc(Mid$(MsgData,2)))
  841.                                                                         If nInfo=Null Then
  842.                                                                                 MsgData = Mid$(MsgData,2)
  843.                                                                                 nInfo.NetInfo = New NetInfo
  844.                                                                                 nInfoNet_id = Asc(Mid$(MsgData,1))
  845.                                                                                 nInfoName = Mid$(MsgData,2)
  846.                                                                                 nInfoAlive = True
  847.                                                                                 nInfoLastHeard = CurTime
  848.                                                                                 msg.MsgInfo = New MsgInfo
  849.                                                                                 msgmsgType = 255
  850.                                                                                 msgmsgFrom = nInfoNet_id
  851.                                                                                 msgmsgData = nInfoName
  852.                                                                         EndIf
  853.                                                                        
  854.                                                                 Case 3
  855.                                                                         Local reason% = Asc(Mid$(MsgData,2,1))
  856.                                                                         msg.MsgInfo = New MsgInfo
  857.                                                                         msgmsgType = 256
  858.                                                                         msgmsgFrom = 0
  859.                                                                         msgmsgData = reason
  860.                                                                        
  861.                                                         End Select
  862.                                                        
  863.                                                 Case 253                        ;Someone has left the game
  864.                                                         nInfo.NetInfo = BP_FindID(Asc(MsgData)) ;If they're still in the game
  865.                                                         If nInfo<>Null Then
  866.                                                                 msg.MsgInfo = New MsgInfo                       ;And make a new msg about it
  867.                                                                 msgmsgData = Asc(Mid$(MsgData,2))
  868.                                                                 msgmsgType = 254
  869.                                                                 msgmsgFrom = nInfoNet_id
  870.                                                                 Delete nInfo
  871.                                                                 BP_NumPlayers = BP_NumPlayers - 1
  872.                                                                 If BP_Log Then
  873.                                                                         If msgmsgData Then BP_UpdateLog (nInfoName + " has left the game.") Else BP_UpdateLog (nInfoName + " has lagged out of the game." + nInfoNet_id)
  874.                                                                 EndIf
  875.                                                         EndIf
  876.                                                        
  877.                                                 Case 252                ;Someone has successfully joined the game
  878.                                                         CurTime = MilliSecs ()
  879.                                                         nInfo.NetInfo = New NetInfo
  880.                                                         nInfoNet_id = Asc(Mid$(MsgData,1))
  881.                                                         nInfoeNet_id = MsgFrom
  882.                                                         nInfoName = Mid$(MsgData,2)
  883.                                                         nInfoLastHeard = CurTime
  884.                                                         nInfoAlive = True
  885.                                                         BP_NumPlayers = BP_NumPlayers + 1
  886.                                                         msg.MsgInfo = New MsgInfo
  887.                                                         msgmsgData = nInfoName
  888.                                                         msgmsgType = 255
  889.                                                         msgmsgFrom = nInfoNet_id
  890.                                                         If BP_Log Then BP_UpdateLog (nInfoName + " has joined the game w/ ID #" + nInfoNet_id)
  891.                                                        
  892.                                                 Case 251                ;The Host has disconnected
  893.                                                         nInfo.NetInfo = BP_FindID(Asc(MsgData))
  894.                                                         If nInfo<>Null Then
  895.                                                                 BP_Online = False
  896.                                                                 ENetDeInitialize()
  897.                                                                 BP_UDP_Stream = 0
  898.                                                                 msg.MsgInfo = New MsgInfo
  899.                                                                 msgmsgType = 253
  900.                                                                 msgmsgFrom = nInfoNet_id
  901.                                                                 msgmsgData = True
  902.                                                                 If First NetInfo<>Null Then Delete Each NetInfo
  903.                                                                 BP_NumPlayers = 0
  904.                                                         EndIf
  905.                                                         If BP_Log Then BP_UpdateLog ("The Host ended the session.")
  906.                                                        
  907.                                                 Case 250                ;This was a "are you still there??" packet from someone.
  908.                                                         MsgToSend = Chr(255) + Chr(BP_My_ID) + "yup"
  909.                                                         ENetSendData(MsgToSend,Len(MsgToSend),0,True)
  910.                                                        
  911.                                                 Case 249                ;Someone got kicked
  912.                                                         KickedID = Asc(MsgData)
  913.                                                         nInfo.NetInfo = BP_FindID(KickedID)
  914.                                                         If nInfo <> Null Then
  915.                                                                 msg.MsgInfo = New MsgInfo
  916.                                                                 msgmsgType = 252
  917.                                                                 msgmsgFrom = nInfoNet_id
  918.                                                                 msgmsgData = Asc(Mid$(MsgData,2))
  919.                                                                
  920.                                                                 If BP_Log Then
  921.                                                                         If msgmsgData Then BP_UpdateLog (nInfoName + " was banned") Else BP_UpdateLog (nInfoName + " was kicked")
  922.                                                                 EndIf
  923.                                                                
  924.                                                                 If KickedID = BP_My_ID Then
  925.                                                                         If First NetInfo<>Null Then Delete Each NetInfo
  926.                                                                         BP_Online = False
  927.                                                                         ENetDeInitialize()
  928.                                                                         BP_UDP_Stream = 0
  929.                                                                         BP_NumPlayers = 0
  930.                                                                         Return
  931.                                                                 Else
  932.                                                                         Delete nInfo
  933.                                                                         BP_NumPlayers = BP_NumPlayers - 1
  934.                                                                 EndIf
  935.                                                         EndIf
  936.                                                        
  937.                                                 Case 248
  938.                                                         Select Asc(MsgData)
  939.                                                                 Case 1
  940.                                                                         BP_GameType = Asc(Mid$(MsgData,2))
  941.                                                                 Case 2
  942.                                                                         BP_MaxPlayers = Asc(Mid$(MsgData,2))
  943.                                                         End Select
  944.                                                        
  945.                                                 Default                 ;Nothing 'special'
  946.                                                         nInfo.NetInfo = BP_FindID(MsgFrom)
  947.                                                         CurTime = MilliSecs ()
  948.                                                         If nInfo <> Null Then
  949.                                                                 msg.MsgInfo = New MsgInfo
  950.                                                                 msgmsgData = MsgData
  951.                                                                 msgmsgType = MsgType
  952.                                                                 msgmsgFrom = MsgFrom
  953.                                                                 nInfoLastHeard = CurTime
  954.                                                                 nInfoAlive = True
  955.                                                                 If BP_AutoLogging Then BP_UpdateLog ("[Incoming] UDP From: " + LSet(nInfoName,20) + " Type: " + LSet(MsgType,3) + " {" + MsgData$ + "}")
  956.                                                         Else
  957.                                                                 msgq.UnrecMsgQueue = New UnrecMsgQueue
  958.                                                                 msgqmsgData = MsgData
  959.                                                                 msgqmsgType = MsgType
  960.                                                                 msgqNet_id = MsgFrom
  961.                                                                 msgqTime = CurTime
  962.                                                         EndIf
  963.                                                        
  964.                                         End Select
  965.                                 Else
  966.                                         Exit    ;Ah finally done receiving messages? Outta this loop then!
  967.                                 EndIf
  968.                         Wend
  969.                        
  970.                         If BP_Online            ;Have to check again because something *could* have made us offline in prev loop
  971.                                 CurTime = MilliSecs ()
  972.                                 ;Now look through messages from unrecognized players and see if they've recently joined
  973.                                 For msgq.UnrecMsgQueue = Each UnrecMsgQueue
  974.                                         nInfo.NetInfo = BP_FindID(msgqNet_id)
  975.                                         If nInfo <> Null Then
  976.                                                 msg.MsgInfo = New MsgInfo
  977.                                                 msgmsgData = MsgData
  978.                                                 msgmsgType = MsgType
  979.                                                 msgmsgFrom = nInfoNet_id
  980.                                                 If BP_AutoLogging Then BP_UpdateLog ("[Incoming] From: " + LSet(nInfoName,20) + " Type: " + LSet(msgmsgType,3) + " {" + msgmsgData$ + "}")
  981.                                                 Delete msgq
  982.                                         Else
  983.                                                 If (msgqTime + 1000) < CurTime Then Delete msgq
  984.                                         EndIf
  985.                                 Next           
  986.                                
  987.                                 ;Check for disconnection from Host
  988.                                 nInfo.NetInfo = BP_FindID (BP_Host_ID)
  989.                                 If nInfo<>Null
  990.                                         If ((nInfoLastHeard + (BP_TimeoutPeriod/2)) < CurTime) And (nInfoAlive) Then    ;It's been awhile..
  991.                                                 BP_UDPMessage (nInfoNet_id, 250, "hello?")
  992.                                                 nInfoAlive = False
  993.                                         EndIf
  994.                                         If ((nInfoLastHeard + BP_TimeoutPeriod) < CurTime) And (nInfoAlive = False) Then        ;It's been BP_TimeoutPeriod secs!?
  995.                                                 BP_Online = False
  996.                                                 ENetDeInitialize()
  997.                                                 BP_UDP_Stream = 0
  998.                                                 msg.MsgInfo = New MsgInfo
  999.                                                 msgmsgType = 253
  1000.                                                 msgmsgFrom = nInfoNet_id
  1001.                                                 Delete Each NetInfo
  1002.                                                 BP_NumPlayers = 0
  1003.                                                 If BP_Log Then BP_UpdateLog ("Host hasn't replied in " + (BP_TimeoutPeriod/1000) + " seconds, game ended")
  1004.                                         EndIf
  1005.                                 EndIf;If nInfo<>Null
  1006.                         EndIf;If BP_Online
  1007.                         ;[End]
  1008.                 EndIf
  1009.         EndIf
  1010. End Function
  1011.  
  1012. Function BP_UDPMessage(msgTarget%, msgType%, msgData$,reliable=True)
  1013.         Local a.NetInfo
  1014. ;-=-=-=Prepare a UDP message to send.
  1015.         If BP_Online
  1016.         ;Insert the message type
  1017.                 If BP_Host
  1018.                         If msgTarget = 0 Then                   ;If its a UDP broadcast..
  1019.                                 msgData = Chr(msgType) + Chr(BP_My_ID) + msgData
  1020.                                 For a.NetInfo = Each NetInfo
  1021.                                         If aNet_id <> BP_My_ID Then
  1022.                                                 If BP_AutoLogging Then BP_UpdateLog ("[Outgoing] UDP   To: " + LSet(aName,20) + " Type: " + LSet(msgType,3) + " {" + msgData + "}")
  1023.                                                 ENetSendData(msgData,Len(msgData),aeNet_id,reliable)
  1024.                                         EndIf
  1025.                                 Next
  1026.                         Else                                                    ;Ah, a specific target.
  1027.                                 msgData = Chr(msgType) + Chr(BP_My_ID) + msgData
  1028.                                 a.NetInfo = BP_FindID(msgTarget)
  1029.                                 If BP_AutoLogging Then BP_UpdateLog ("[Outgoing] UDP   To: " + LSet(aName,20) + " Type: " + LSet(msgType,3) + " {" + msgData + "}")
  1030.                                 ENetSendData(msgData,Len(msgData),aeNet_id,reliable)
  1031.                         EndIf
  1032.                 Else                    ;Client doing a send
  1033.                         msgData = Chr(msgType) + Chr(msgTarget) + msgData
  1034.                         If BP_AutoLogging Then BP_UpdateLog ("[Outgoing] UDP   To: " + msgTarget + " Type: " + LSet(msgType,3) + " {" + msgData + "}")
  1035.                         ENetSendData(msgData,Len(msgData),0,reliable)
  1036.                 EndIf
  1037.         EndIf
  1038. End Function
  1039.  
  1040. Function BP_ReturnMessage$(bank,dataSize)
  1041.         Local Message$
  1042.         Local size = PeekInt(dataSize, 0)-1
  1043.        
  1044.         For n = 0 To size-1
  1045.                 Message = Message + Chr(PeekByte(bank, n))
  1046.         Next
  1047.        
  1048.         Return Message
  1049. End Function
  1050.  
  1051. Function BP_UpdateLog(txt$)
  1052. ;-=-=-=Updates the log file, checks to see if its been started
  1053.         If BP_Log Then
  1054.                 WriteLine BP_Log, txt$
  1055.         EndIf
  1056. End Function


Comments : none...

Offline Rick Nasher

  • Hero Member
  • *****
  • Posts: 792
Re: [bb] BlitzPlay Lite + eNet by GIB3D [ 1+ years ago ]
« Reply #1 on: July 15, 2017, 03:03:43 »
Bit of a pity there's no demo on how to actually use this..
_______________________________________
 B3D + physics + shaders + X-platform = AGK!
:D ..ALIENBREED *LIVES* (thanks to Qube).. :D
_______________________________________

Offline RonTek

  • Sr. Member
  • ****
  • Posts: 357
Re: [bb] BlitzPlay Lite + eNet by GIB3D [ 1+ years ago ]
« Reply #2 on: July 15, 2017, 04:19:01 »
Hey Rick,

I was into Blitz3D networking for quite a bit and think I have managed to save a copy of the demo included in the zip download before it became unavailable.

Let me know if this works :)

Code: BlitzBasic
  1. Include "BPlite.bb"
  2. Const kUp% = 200, KDown% = 208, KLeft% = 203, KRight% = 205, fps% = 40, KF1% = 59, KF11% = 87
  3. Const kShift% = 42, KTab% = 15
  4. Global send_freq% = 4, chat$
  5. Global width% = 400, height% = 100
  6. Global logging% = False
  7. Global myname$
  8. Global sendupdates% = True
  9. Global DebugInfo% = 0
  10. Global WindowCount% = 0
  11. Global fullscreen%
  12. Global Host%
  13.  
  14. Type pdata
  15.         Field x#,y#,r#,name$,net_id%
  16.         Field xvel#,yvel#,rvel#
  17. End Type
  18.  
  19. Type Info
  20.         Field txt$
  21. End Type
  22.  
  23. tmr = CreateTimer(fps)
  24. SeedRnd MilliSecs()
  25.  
  26.  
  27. Graphics width,height,16,2
  28. AppTitle "BlitzPlay - Lite Demo"
  29.  
  30. ClsColor 10,15,30
  31. Cls
  32. Color 100,150,100
  33. Text 0,0,"Would you like to:"
  34. Text 20,FontHeight()*2,"[H]ost a game"
  35. Text 10,FontHeight()*3,"or"
  36. Text 20,FontHeight()*4,"[J]oin one in progress?"
  37.  
  38. FlushKeys()
  39. Repeat
  40.         If KeyHit(35) Then
  41.                 Host = True
  42.                 Exit
  43.         End If
  44.         If KeyHit(36) Then
  45.                 Host = False
  46.                 Exit
  47.         End If
  48. Forever
  49.  
  50. Cls
  51. FlushKeys
  52. myname$ = Input$ ("Your name? ")
  53. FlushKeys
  54. fullscreen = Input$ ("Run fullscreen? (0=false,1=true)")
  55. width = 800
  56. height = 600
  57. If Host Then
  58.         If Not fullscreen Then
  59.                 width = 600
  60.                 height = 600
  61.         End If
  62.         My_Port = 2222
  63.         If Not BP_HostSession (myname,10,1,2222,10) Then
  64.                 Cls
  65.                 Locate 0,0
  66.                 Print "Host port was unavailable..Push a key to exit.."
  67.                 WaitKey
  68.                 End
  69.         End If
  70.         p.pdata = New pdata
  71.         p\name = myname
  72.         p\x = width/2
  73.         p\y = height/2
  74.         p\r = 90
  75.         p\net_id = BP_My_ID
  76. Else
  77.         Print "Host port = 2222"
  78.         Print "(Blank for Local IP)"
  79.         IP$ = Input$("Please enter the host's IP? ")
  80.         Select IP
  81.                 Case ""
  82.                         IP$ = "127.0.0.1"
  83.                         My_Port = Rand(3000,4000)
  84.                         If Not fullscreen Then
  85.                                 width = 600
  86.                                 height = 200
  87.                         End If
  88.                 Default
  89.                         My_Port = Input$ ("What port would you like to use? ")
  90.                         If Not My_Port Then My_Port = Rand (3000,4000)
  91.                         If Not fullscreen
  92.                                 width = 600
  93.                                 height = 600
  94.                         End If
  95.         End Select
  96.         Cls
  97.         Text 200,50,"Connecting! (Hit [esc] to cancel)",True,True
  98.         Select BP_JoinSession (myname,2222,IP)
  99.                 ;Handle any of the reasons if we couldn't join.
  100.                 Case BP_NOREPLY
  101.                         Cls
  102.                         Text 0,0,"No reply in specified timeout period.. exiting"
  103.                         WaitKey
  104.                         End
  105.                 Case BP_IAMBANNED
  106.                         Cls
  107.                         Text 0,0,"You have been banned from joining this game.. exiting"
  108.                         WaitKey
  109.                         End
  110.                 Case BP_GAMEISFULL
  111.                         Cls
  112.                         Text 0,0,"The game is full.. exiting"
  113.                         WaitKey
  114.                         End
  115.                 Case BP_PORTNOTAVAILABLE
  116.                         Cls
  117.                         Text 0,0,"Port: " + My_Port + " was not available.. exiting"
  118.                         WaitKey
  119.                         End
  120.                 Case BP_USERABORT
  121.                         Cls
  122.                         Text 0,0,"Connection attempt aborted!"
  123.                         WaitKey
  124.                         End
  125.         End Select
  126.         ;Oh, we're allowed in? here we go!
  127.         p.pdata = New pdata
  128.         p\name = myname
  129.         p\x = width/2
  130.         p\y = height/2
  131.         p\r = 90
  132.         p\net_id = BP_My_ID
  133. End If
  134.  
  135. If fullscreen Then Graphics width,height,32,1 Else Graphics width,height,16,2
  136. ClsColor 10,15,30
  137. Cls
  138. SetBuffer BackBuffer()
  139.  
  140. While Not KeyHit(1)
  141.         frames = WaitTimer(tmr)
  142.         For k = 1 To frames
  143.                 BP_UpdateNetwork()
  144.                 HandleMessages()
  145.                 UpdatePlayers()
  146.                 send_count = send_count - 1
  147.                 If send_count <= 0 Then
  148.                         send_count = send_freq
  149.                         p.pdata = First pdata
  150.                         msgtosend$ = BP_IntToStr(Int(p\x),2) + BP_IntToStr(Int(p\y),2) + BP_IntToStr(Int(p\r),2)
  151.                         If sendupdates Then BP_UDPMessage (0,1,msgtosend)
  152.                 End If
  153.         Next
  154.         RenderAll()
  155. Wend
  156.  
  157. BP_EndSession ()
  158.  
  159. End
  160. ;******************************Functions*******************************
  161. Function HandleMessages ()
  162.         For msg.MsgInfo = Each MsgInfo
  163.                 Select msg\msgType
  164.                         Case 255        ;A new player has joined!
  165.                                 p.pdata = New pdata
  166.                                 p\name = msg\msgData
  167.                                 p\x = width/2
  168.                                 p\y = height/2
  169.                                 p\r = 90
  170.                                 p\net_id = msg\msgFrom
  171.                                 nInfo.NetInfo = BP_FindID(p\net_id)
  172.                                 Info ("**" + p\Name + " has joined!")
  173.                         Case 254        ;A player has left
  174.                                 p.pdata = Find_pdata(msg\msgFrom)
  175.                                 If p<>Null Then
  176.                                         If msg\msgData = True Then Info ("**" + p\Name + " has left!") Else Info ("**" + p\Name + " lagged out!")
  177.                                         Delete p
  178.                                 End If
  179.                         Case 253        ;The host has disconnected
  180.                                 For p.pdata = Each pdata
  181.                                         If p\net_id <> BP_My_ID Then Delete p
  182.                                 Next
  183.                                 If msg\msgData = True Then Info ("**The host ended the game!") Else Info ("**No reply from host in " + (BP_TimeoutPeriod / 1000) + " seconds. Exiting game..")
  184.                         Case 252        ;Someone got kicked/banned
  185.                                 p.pdata = Find_pdata(msg\msgFrom)
  186.                                 If p\net_id = BP_My_ID Then     ;It was -me-??
  187.                                         If msg\msgData = False Then Info ("**You have been kicked!") Else Info ("**You have been banned!")
  188.                                         For p.pdata = Each pdata
  189.                                                 If p\net_id <> BP_My_ID Then
  190.                                                         Delete p
  191.                                                 End If
  192.                                         Next
  193.                                 Else                            ;It wasn't? Ok then.
  194.                                         If msg\msgData = False Then Info ("**" + p\Name + " has been kicked!") Else Info ("**" + p\Name + " has been banned!")
  195.                                         Delete p
  196.                                 End If
  197.                         Case 1          ;a position update packet
  198.                                 newx% = BP_StrToInt (Mid$(msg\msgData,1,2))
  199.                                 newy% = BP_StrToInt (Mid$(msg\msgData,3,2))
  200.                                 newr% = BP_StrToInt (Mid$(msg\msgData,5,2))
  201.                                 p.pdata = Find_pdata(msg\msgFrom)
  202.                                 ;This demo handles movement by calculating an average speed to bring the player to the point indicated
  203.                                 ;in the packet by the time we think the next update should arrive.
  204.                                 ;This is fairly accurate in describing where the player moved, at one point, but unfortunately is not very
  205.                                 ;accurate for predicting where the player is "now" so to speak.
  206.                                 p\xvel = (newx - p\x) / send_freq
  207.                                 p\yvel = (newy - p\y) / send_freq
  208.                                 p\rvel = rotarydir(p\r,newr,send_freq)
  209.                         Case 2          ;a chat packet
  210.                                 p.pdata = Find_pdata(msg\msgFrom)
  211.                                 Info (p\Name + ":" + msg\msgData)
  212.                 End Select
  213.                 Delete msg
  214.         Next
  215. End Function
  216.  
  217. Function Info (t$)
  218.         i.Info=New Info
  219.         i\txt$=t$
  220.         Insert i Before First Info
  221. End Function
  222.  
  223. Function UpdatePlayers ()
  224.         For p.pdata = Each pdata
  225.                 If p\net_id = BP_My_ID Then
  226.                         p\xvel = 0
  227.                         p\yvel = 0
  228. ;'Ship' control
  229.                         If KeyDown(KUp) Then
  230.                                 p\xvel = Cos(p\r) * 3
  231.                                 p\yvel = -Sin(p\r) * 3
  232.                         End If
  233.                         If KeyDown(KDown) Then
  234.                                 p\xvel = Cos(p\r + 180) * 3
  235.                                 p\yvel = -Sin(p\r + 180) * 3
  236.                         End If
  237.                         If KeyDown(KRight) Then
  238.                                 p\r = p\r - 5
  239.                                 If p\r < 0 Then p\r = p\r + 360
  240.                         End If
  241.                         If KeyDown(KLeft) Then
  242.                                 p\r = p\r + 5
  243.                                 If p\r > 360 Then p\r = p\r - 360
  244.                         End If
  245. ;Other input
  246.                          If KeyHit(KF1) Then
  247.                                 logging = 1 - logging
  248.                                 If logging Then
  249.                                         BP_StartLogFile (myname + ".txt")
  250.                                 Else
  251.                                         BP_StopLogFile ()
  252.                                 End If
  253.                         End If
  254.                         If BP_My_ID = BP_Host_ID
  255.                                 For keycheck = 60 To 68
  256.                                         If KeyHit(keycheck) Then
  257.                                                 If keycheck - 58 <> My_ID Then          ;No kicking yourself!
  258.                                                         If KeyDown(kShift) Then
  259.                                                                 nInfo.NetInfo = BP_FindID(keycheck - 58)
  260.                                                                 If nInfo<>Null Then
  261.                                                                         Info("**You banned: " + nInfo\Name)
  262.                                                                         BP_KickID(keycheck - 58, True)
  263.                                                                 End If
  264.                                                         Else
  265.                                                                 nInfo.NetInfo = BP_FindID(keycheck - 58)
  266.                                                                 If nInfo<>Null Then
  267.                                                                         Info("**You kicked: " + nInfo\Name)
  268.                                                                         BP_KickID(keycheck - 58, False)
  269.                                                                 End If
  270.                                                         End If
  271.                                                 End If
  272.                                         End If
  273.                                 Next
  274.                         End If
  275.                         If KeyHit(KF11) Then
  276.                                 sendupdates = 1 - sendupdates
  277.                         End If
  278.                         If KeyDown(KTab) Then DebugInfo = 1 Else DebugInfo = 0
  279. ;Chat
  280.                         key=GetKey()
  281.                         If key
  282.                                 If key=13
  283.                                         If chat$<>"" Then
  284.                                                 BP_UDPMessage (0,2,chat$)
  285.                                                 Info (p\name + ":" + chat)
  286.                                                 chat$=""
  287.                                         End If
  288.                                 Else If key=8
  289.                                         If Len(chat$)>0 Then chat$=Left$(chat$,Len(chat$)-1)
  290.                                 Else If key>=32 And key<127
  291.                                         chat$=chat$+Chr$(key)
  292.                                 EndIf
  293.                         EndIf
  294.                         p\y = p\y + p\yvel
  295.                         p\x = p\x + p\xvel
  296.                         p\r = p\r + p\rvel
  297.                         If p\y > height Then p\y = height
  298.                         If p\y < 0 Then p\y = 0
  299.                         If p\x > width Then p\x = width
  300.                         If p\x < 0 Then p\x = 0
  301.                 Else
  302.                         p\y = p\y + p\yvel
  303.                         p\x = p\x + p\xvel
  304.                         p\r = p\r + p\rvel
  305.                         If p\y > height Then p\y = height
  306.                         If p\y < 0 Then p\y = 0
  307.                         If p\x > width Then p\x = width
  308.                         If p\x < 0 Then p\x = 0
  309.                         If p\r < 0 Then p\r = p\r + 360
  310.                         If p\r > 360 Then p\r = p\r - 360
  311.                 End If
  312.         Next
  313. End Function
  314.  
  315. Function RenderAll ()
  316.         Local st$
  317.         Local counter%
  318.         For p.pdata = Each pdata
  319.                 counter = counter + 1
  320.         Next
  321.         Color 100,100,100
  322.         Rect 0,FontHeight()*2,width,FontHeight()*(counter) + 1,False
  323.         Color 10,10,50
  324.         Rect 1,(FontHeight()*2)+1,width-2,FontHeight()*(counter) - 1,True
  325.         textcounter = 2
  326.         Color 20,150,150
  327.         Text width/2,0,"-=[BlitzPlay - Lite Demo]=-",True
  328.         For p.pdata = Each pdata
  329.                 If p\net_id = BP_My_ID Then
  330.                         Text 1,FontHeight()*textcounter, p\net_id + "] " + "**" + p\name + "**"
  331.                 Else
  332.                         Text 1,FontHeight()*textcounter, p\net_id + "] " + p\name
  333.                 End If
  334.                 st$ = "X/Y: " + Int(p\x) + "/" + Int(p\y)
  335.                 Text width-StringWidth(st$),FontHeight()*textcounter,st$
  336.                 textcounter = textcounter + 1          
  337.         Next
  338.         Color 0,200,50
  339.         textcounter = textcounter + 1          
  340.         Text 0,FontHeight()*textcounter, ">" + chat$ + "_"
  341.         textcounter = textcounter + 1
  342.         counter = 0
  343.         Color 150,150,150
  344.         For i.Info = Each Info
  345.                 counter = counter + 1
  346.                 If counter > 15 Then
  347.                         Delete i
  348.                 Else
  349.                         Text 0,FontHeight()*textcounter, i\txt
  350.                         textcounter = textcounter + 1
  351.                 End If
  352.         Next
  353.  
  354.         Color 0,140,160
  355.         If logging Then Text 0,height-FontHeight(),"Logging: Enabled    (f1 to toggle)" Else Text 0,height-FontHeight(),"Logging: Disabled   (f1 to toggle)"
  356.         If sendupdates Then Text 0,height-FontHeight()*2,"Sending updates: True    (f11 to toggle)" Else Text 0,height-FontHeight()*2,"Sending updates: False  (f11 to toggle)"
  357.         Text 0,height-FontHeight()*3,"[TAB] displays debug information",False, False
  358.         If host Then Text 0,height-FontHeight()*4,"F2-10 to boot that player, hold [SHIFT] to ban"
  359.  
  360.         For p.pdata = Each pdata
  361.                 x1=p\x+Cos(p\r)*8
  362.                 y1=p\y-Sin(p\r)*8
  363.                 x2=p\x+Cos(p\r+150)*8
  364.                 y2=p\y-Sin(p\r+150)*8
  365.                 x3=p\x+Cos(p\r-150)*8
  366.                 y3=p\y-Sin(p\r-150)*8
  367.                
  368.                 Color 100,100,100
  369.                 Line x1,y1,x2,y2:Line x2,y2,x3,y3:Line x3,y3,x1,y1
  370.                
  371.                 Color 150,20,0
  372.                 Text p\x+12,p\y,p\name,0,1
  373.         Next
  374.  
  375.         If DebugInfo Then
  376.                 p.pdata = First pdata
  377.                 Color 40,100,150
  378.                 Rect (width/2) - WindowCount - 1,(height/2)-51,(WindowCount * 2) + 2, 102,False
  379.                 Color WindowCount/4,WindowCount/3,WindowCount/2
  380.                 Rect (width/2) - WindowCount,(height/2)-50,WindowCount * 2, 100,True
  381.                 If WindowCount < 210 Then
  382.                         WindowCount = WindowCount + 10
  383.                         If WindowCount > 210 Then WindowCount = 210
  384.                 Else
  385.                         If BP_Online Then
  386.                                 Color 100,200,100
  387.                                 Text (width/2) - WindowCount,(height/2)-50,"Online",False,False
  388.                         Else
  389.                                 Color 200,50,50
  390.                                 Text (width/2) - WindowCount,(height/2)-50,"Offline",False,False
  391.                         End If
  392.  
  393.                         Color 200,200,200
  394.  
  395.                         st$ = "-=[" + p\Name + "]=-"
  396.                         Text (width/2),(height/2) - (FontHeight() * 3),st$,True,True
  397.  
  398.                         st$ = "GameType: " + BP_GetGameType()
  399.                         Text (width/2) - (WindowCount),(height/2) - FontHeight(),st$,False,True
  400.                         st$ = "TimeoutPeriod: " + BP_GetTimeoutPeriod() + "s."
  401.                         Text (width/2) - (WindowCount),(height/2),st$,False,True
  402.                         st$ = "My IP: " + BP_GetMyIP()
  403.                         Text (width/2) - (WindowCount),(height/2) + FontHeight(),st$,False,True
  404.                         st$ = "Host IP: " + DottedIP$(BP_GetHostIP())
  405.                         Text (width/2) - (WindowCount),(height/2) + (FontHeight() * 2),st$,False,True
  406.  
  407.                         st$ = "# Of Players: " + BP_GetNumberOfPlayers()
  408.                         Text (width/2),(height/2) - FontHeight(),st$,False,True
  409.                         st$ = "Max. # Of Players: " + BP_GetMaxPlayers()
  410.                         Text (width/2),(height/2),st$,False,True
  411.                         st$ = "Packets Sent: " + BP_GetPacketsSent()
  412.                         Text (width/2),(height/2) + FontHeight(),st$,False,True
  413.                         st$ = "Packets Received: " + BP_GetPacketsReceived()
  414.                         Text (width/2),(height/2) + (FontHeight() * 2),st$,False,True
  415.                 End If
  416.         Else
  417.                 If WindowCount > 0 Then
  418.                         Color 40,100,150
  419.                         Rect (width/2) - WindowCount - 1,(height/2)-51,(WindowCount * 2) + 2, 102,False
  420.                         Color WindowCount/4,WindowCount/3,WindowCount/2
  421.                         Rect (width/2) - WindowCount,(height/2)-50,WindowCount * 2, 100,True
  422.                         WindowCount = WindowCount - 10
  423.                         If WindowCount < 0 Then WindowCount = 0
  424.                 End If
  425.         End If
  426.         Flip
  427.         Cls
  428. End Function
  429.  
  430. Function Find_pdata.pdata (ID)
  431.         For p.pdata = Each pdata
  432.                 If p\net_id = ID Then Return p
  433.         Next
  434. End Function
  435.  
  436. Function rotarydir#(Asource#,Adest#,smooth#)            ;Taken from the Code Archives on blitzbasic.com,
  437.         If Asource#>Adest#                                                                      ;Thanks Skully!
  438.                 Diff1#=Asource-Adest
  439.                 diff2#=(360.0-Asource)+Adest
  440.                 If diff2<diff1
  441.                         dir#=diff2/smooth
  442.                 Else
  443.                         dir#=diff1/smooth*-1
  444.                 EndIf
  445.         Else
  446.                 If Asource#<Adest#
  447.                         diff1=Adest-Asource
  448.                         diff2=(360.0-Adest)+Asource
  449.                         If diff2<diff1
  450.                                 dir#=diff2/smooth*-1
  451.                         Else
  452.                                 dir#=diff1/smooth
  453.                         EndIf
  454.                 Else
  455.                         dir=0
  456.                 EndIf
  457.         EndIf
  458.         Return dir
  459. End Function

Offline Rick Nasher

  • Hero Member
  • *****
  • Posts: 792
Re: [bb] BlitzPlay Lite + eNet by GIB3D [ 1+ years ago ]
« Reply #3 on: July 17, 2017, 23:24:32 »
Many thanks RonTek. First brief test(running low on time here, in the mids of home construction) appears to work fine, besides the little bit of jerky movement, but reliable networking is very BIG plus. 8)

(I wasn't fully aware of the fact that this would just replace some of the BPLite networking and transparently making it reliable.)

2 Questions:
1) Is there an easy way to smooth the movement using BPLite? I want to use this in a 3d environment and I think it would require something known as interpolation but I'm under the impression that's part of the Pro version(which is unobtainable apparently).

2) Do you happened to know if BPLite also allows for host switching on the fly? So that if for instance in a game of 4 players the host(Player1) leaves and then gets replaced by Player2(or the player who's IP is best and longest in the game), effectively making him the new host so the game can continue?
*)I forsee some issues implementing this using the BlitzPlay+eNet version as the creator mentions:
Quote
Some things I had to take out:
-Connecting port for client. The client only needs to put in the Hosting port now.
-Banning. Since eNet doesn't allow me to see the IPs, you can't ban anyone by IP.


I would really like this feature for it greatly enhances the continuity without the need for a dedicated server, making ad-hoc gaming possible.
« Last Edit: July 17, 2017, 23:52:39 by Rick Nasher »
_______________________________________
 B3D + physics + shaders + X-platform = AGK!
:D ..ALIENBREED *LIVES* (thanks to Qube).. :D
_______________________________________

Offline RonTek

  • Sr. Member
  • ****
  • Posts: 357
Re: [bb] BlitzPlay Lite + eNet by GIB3D [ 1+ years ago ]
« Reply #4 on: July 19, 2017, 13:25:26 »
Sure thing Rick. :) I have not checked with the demo code thoroughly, but I see some other network libraries that does interpolation. As for the host switching, I'm not quite sure but I think it is possible.

Quote
I would really like this feature for it greatly enhances the continuity without the need for a dedicated server, making ad-hoc gaming possible.

That would be using P2P and looks like WebRTC is the future and one solution that can do the job.  :D

Offline GW

  • Full Member
  • ***
  • Posts: 222
Re: [bb] BlitzPlay Lite + eNet by GIB3D [ 1+ years ago ]
« Reply #5 on: July 20, 2017, 15:46:52 »
It looks like the BP example is sending location information each step.  You might get better results if you send just the remote key-press events and update objects in the client locally that way. That's how most modern games work.

Offline Rick Nasher

  • Hero Member
  • *****
  • Posts: 792
Re: [bb] BlitzPlay Lite + eNet by GIB3D [ 1+ years ago ]
« Reply #6 on: July 21, 2017, 17:51:09 »
It looks like the BP example is sending location information each step.  You might get better results if you send just the remote key-press events and update objects in the client locally that way. That's how most modern games work.
That indeed would make more sense. And then check for other events that influence positions, rotation and states and only update when required.
_______________________________________
 B3D + physics + shaders + X-platform = AGK!
:D ..ALIENBREED *LIVES* (thanks to Qube).. :D
_______________________________________

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal