Code archives/Networking/SimpleUDP2
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Sry, because i cant speak english so good i cant give you a longer Description :( But Check it out, its very easy to Create Games with it ! This Lib is in progress, it gets some other functions ! To Download the Samples, look here : http://www.toebproductions.bplaced.net/SimpleUDP%202.0.rar Have fun ! | |||||
;+-------------------------+
;| SimpleUDP |
;| by |
;| |
;| Tobias 'ToeB' Hendricks |
;+-------------------------+
;| Version 2.0 |
;+-------------------------+
Const UDP_JoinMsg = 1
Const UDP_NotJoinMsg = 2
Const UDP_PingMsg = 3
Const UDP_PingDataMsg = 4
Const UDP_CmdMsg = 5
Const UDP_EndMsg = 6
Const UDP_AnswerMsg = 7
Const UDP_KickMsg = 8
Const UDP_BannMsg = 9
Const UDP_NameMsg = 10
Const UDP_ChangeHostMsg = 11
Const UDP_GetInformationMsg = 12
Const UDP_StartSendServerFile = 13
Const UDP_AnswerSendServerFile = 14
Const UDP_SendServerFileBytes = 15
Const UDP_EndSendServerFile = 16
Const UDP_EndSend = 17
Const UDP_ReConnectMsg = 18
Const Event_NewPlayer = 1
Const Event_ConnectedServer = 2
Const Event_PlayerLeft= 3
Const Event_NoConnection = 4
Const Event_PlayerKicked = 5
Const Event_PlayerBanned = 6
Const Event_ChangeName = 7
Const Event_ReConnect = 8
Const UDP_LanGame=1, UDP_NetGame=2
Const UDP_MaxParameter = 15
Const UDP_PingSendTime = 1000;ms
Const UDP_PackedSize = 8187 ;Maximale Packetgröße : 8187
Const UDP_ServerFilePath$ = "ServerFiles\"
Global UDP_Host, UDP_Connected, UDP_Connect, UDP_ChangeHostConnect, UDP_Dediziert
Global UDP_Stream, UDP_ServerPort, UDP_ServerIP, UDP_ServerID, UDP_NetMode, UDP_MaxPlayers, UDP_ServerStream, UDP_ServerPing
Global UDP_SendJoinMsgMs, UDP_ServerGlobalPing
Global UDP_Player.UDP_Client, UDP_PlayerID, UDP_ServerClient.UDP_Client
Global UDP_SendPingTime, UDP_GetPingFromServer
Global UDP_EventID, UDP_EventMsg$, UDP_EventMsg2$, UDP_EventData$
Global UDP_MsgEntID
Global UDP_ChangeName, UDP_NewName$
Global UDP_SendServerFiles, UDP_ServerFileID, UDP_ServerFile.UDP_ServerFile
Global UDP_CmdID, UDP_CmdMaxParameter, UDP_CmdFromID, UDP_CmdBank
Dim UDP_CmdParameter$( UDP_MaxParameter )
Dim UDP_ClientInfo.UDP_Client( 0 )
Dim UDP_tmpParameter$( UDP_MaxParameter )
Type UDP_Client
Field ID
Field Stream
Field IP$,Port
Field Ping,PingMs,WaitPing
Field kick,host,connected
Field name$,changename,newname$
Field serverfile.UDP_ServerFile
Field recon, reconms
End Type
Type UDP_Server
Field IP,Port
Field Ping
End Type
Type UDP_Cmd
Field typ
Field ID
Field FromID,toID
Field maxparameter
Field parameter$[ UDP_MaxParameter ]
Field info.UDP_Cmd
Field del
Field send,sendms
Field bank
End Type
Type UDP_Event
Field Event
Field EventData$
Field EventMsg$
Field EventMsg2$
End Type
Type UDP_Ban
Field IP
Field time,ms
Field reason$
End Type
Type UDP_ServerFile
Field transfer
Field ID
Field filename$
Field datei, size
Field sendfile, sendms, byteID, byte
Field client.UDP_Client
End Type
Function UDP_HostGame( tmpMaxPlayers=16, tmpNetMode=UDP_LanGame, tmpPort=8000, tmpDediziert=0 )
;Übergabe an Globale
UDP_ServerPort = tmpPort
UDP_NetMode = tmpNetMode
UDP_Host = 1
UDP_Connected = 1
UDP_MaxPlayers = tmpMaxPlayers
UDP_Dediziert = tmpDediziert
Dim UDP_ClientInfo.UDP_Client( UDP_MaxPlayers )
UDP_CmdBank = CreateBank( 0 )
;Empfangs Stream erstellen
UDP_Stream = CreateUDPStream( UDP_ServerPort )
;Streamhandle prüfen
If UDP_Stream Then
If tmpDediziert = 0 Then ;Wenn der Host mitspielen soll
tmpClient.UDP_Client = New UDP_Client
tmpClient\ID = 1
tmpClient\IP = UDP_IntIP("127.0.0.1")
tmpClient\Port = UDP_ServerPort
tmpClient\stream = 0
tmpClient\name$ = "unnamed"
tmpClient\host = 1
tmpClient\connected = 1
UDP_Player = tmpClient
UDP_PlayerID = tmpClient\ID
UDP_ServerID = tmpClient\ID
UDP_ClientInfo( UDP_PlayerID ) = tmpClient
UDP_ServerClient = tmpClient
EndIf
Return 1
Else
UDP_Connected = 0
Return 0
EndIf
End Function
Function UDP_JoinGame( tmpHostIP$, tmpHostPort=8000 )
;Übergabe an Globale
UDP_ServerPort = tmpHostPort
UDP_Host = 0
UDP_Connected = 0
UDP_CmdBank = CreateBank( 0 )
If Instr(tmpHostIP,".")<>0 Then UDP_ServerIP = UDP_IntIP(tmpHostIP$) Else UDP_ServerIP = Int( tmpHostIP )
;Stream erstellen
If UDP_Stream = 0 Then UDP_Stream = CreateUDPStream( )
;Stream überpürfen
If UDP_Stream = 0 Then Return 0
;Wenn erfolgreich,
UDP_Connect = 1
UDP_ChangeHostConnect = 0
Return 1
End Function
Function UDP_Update( )
;Host Aufgabenbereich
If UDP_Host = 1 Then
If UDP_Connected = 1 Then
While RecvUDPMsg( UDP_Stream )<>0 ;Alle Nachrichten lesen
tmpByte = ReadByte( UDP_Stream ) ;Header-Byte auslesen
Select tmpByte ;Gucken welches Byte empfangen worden ist
Case UDP_JoinMsg
tmpClientIP = UDPMsgIP( UDP_Stream )
tmpClientPort = UDPMsgPort( UDP_Stream )
tmpClientConnected = ReadByte( UDP_Stream )
If tmpClientConnected = 0 Then
;Prüfen on ein Bann für die IP vorhanden ist
tmpBanned = 0
tmpBanntime = 0
tmpReason$ = ""
For tmpBan.UDP_Ban = Each UDP_Ban
If tmpBan\IP = tmpClientIP Then
tmpBanned = 1
If tmpBan\time > 0 Then
tmpBannTime = tmpBan\time - ( MilliSecs( ) - tmpBan\ms )
EndIf
tmpReason$ = tmpBan\reason
Exit
EndIf
Next
If tmpBanned = 0 Then
;Clients überpürfen
tmpGet = 0
For tmpCLient.UDP_Client = Each UDP_Client
If tmpClient\IP = tmpClientIP And tmpClient\Port = tmpClientPort Then tmpGet = 1 : Exit
Next
If tmpGet = 0
;Prüfen ob Platz frei ist
tmpID = 0
For i = 1 To UDP_MaxPlayers
If UDP_ClientInfo( i ) = Null Then tmpID = i : Exit
Next
Else
tmpID = tmpClient\ID
EndIf
If tmpID > 0 And tmpID <= UDP_MaxPlayers
;Clienten erstellen
If tmpGet = 0 Then tmpClient.UDP_Client = New UDP_Client
tmpClient\ID = tmpID
tmpClient\IP = tmpClientIP
tmpClient\Port = tmpClientPort
tmpClient\stream = UDP_Stream
tmpClient\name$ = "unnamed"
tmpClient\connected = 1
If UDP_NetMode = UDP_LanGame Then
tmpClient\stream = CreateUDPStream( )
EndIf
UDP_ClientInfo( tmpClient\ID ) = tmpClient
If UDP_SendServerFiles = 1 Then
For tmpFile.UDP_ServerFile = Each UDP_ServerFile
If tmpFile\transfer = 0 Then
serverfile.UDP_ServerFile = New UDP_ServerFile
serverfile\transfer = 1
serverfile\filename$ = tmpFile\filename$
serverfile\datei = ReadFile( serverfile\filename$ )
serverfile\size = tmpFile\size
serverfile\ID = tmpFile\ID
serverfile\byteID = 1
serverfile\byte = CreateBank( UDP_PackedSize )
ReadBytes( serverfile\byte, serverfile\datei, 0, UDP_PackedSize )
serverfile\client = tmpClient
tmpClient\serverfile = serverfile
EndIf
Next
EndIf
;Antwort geben mit Client daten
WriteByte( tmpClient\stream, UDP_JoinMsg )
WriteByte( tmpClient\stream, 0 )
WriteInt( tmpClient\stream, UDP_MaxPlayers )
WriteByte( tmpClient\stream, UDP_Dediziert )
WriteByte( tmpClient\stream, UDP_NetMode )
WriteInt( tmpClient\stream, tmpClient\ID )
WriteInt( tmpClient\stream, UDP_ServerID )
WriteByte( tmpClient\stream, tmpClient\connected )
For tmpClientAll.UDP_Client = Each UDP_Client
WriteInt( tmpClient\stream, tmpClientAll\ID )
WriteInt( tmpClient\stream, tmpClientAll\IP )
WriteInt( tmpClient\stream, tmpClientAll\Port )
WriteString( tmpClient\stream, tmpClientAll\name$ )
WriteByte( tmpClient\stream, tmpClientAll\connected )
Next
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\Port )
;Anderen Clienten den Neuen "vorstellen"
For tmpClientAll.UDP_Client = Each UDP_Client
If tmpClientAll <> tmpClient And tmpClientAll <> UDP_Player Then ;Wenn der Client nicht der Neue ist und nicht der eignene
WriteByte( tmpClientAll\stream, UDP_JoinMsg )
WriteInt( tmpClientAll\stream, tmpClient\ID )
WriteInt( tmpClientAll\stream, tmpClient\IP )
WriteInt( tmpClientAll\stream, tmpClient\Port )
SendUDPMsg( tmpClientAll\stream, tmpClientAll\IP, tmpClientAll\Port )
EndIf
Next
tmpEvent.UDP_Event = New UDP_Event
tmpEvent\Event = Event_NewPlayer
tmpEvent\EventData$ = tmpClient\ID
Else
WriteByte( UDP_Stream, UDP_NotJoinMsg )
WriteByte( UDP_Stream, 0 ) ;Server Voll
SendUDPMsg( UDP_Stream, tmpClientIP, tmpClientPort )
EndIf
Else
WriteByte( UDP_Stream, UDP_NotJoinMsg )
WriteByte( UDP_Stream, 1 ) ;Gebannt
WriteInt( UDP_Stream, tmpBannTime )
WriteString( UDP_Stream, tmpReason$ )
SendUDPMsg( UDP_Stream, tmpClientIP, tmpClientPort )
EndIf
Else
tmpClientID = ReadInt( UDP_Stream )
For tmpClient.UDP_Client = Each UDP_Client
If tmpClient\ID = tmpClientID Then Exit
Next
If tmpClient <> Null Then
tmpClient\connected = 1
WriteByte( tmpClient\stream, UDP_JoinMsg )
WriteByte( tmpClient\stream, 1 )
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\Port )
EndIf
EndIf
Case UDP_PingMsg
tmpID = ReadInt( UDP_Stream )
If tmpID => 0 And tmpID <= UDP_MaxPlayers
tmpClient.UDP_Client = UDP_ClientInfo.UDP_Client( tmpID )
If tmpClient <> Null
If tmpClient\connected = 1
If tmpClient\PingMs > 0 Then
;If tmpClient\waitping = 1
tmpClient\Ping = ( MilliSecs() - tmpClient\PingMs ) / 2 : tmpClient\PingMs = 0
tmpClient\waitping = 0
;EndIf
EndIf
WriteByte( tmpClient\stream, UDP_PingDataMsg )
For tmpClientAll.UDP_Client = Each UDP_Client
WriteByte( tmpClient\stream, 1)
WriteInt( tmpClient\stream, tmpClientAll\ID )
WriteInt( tmpClient\stream, tmpClientAll\Ping )
WriteByte( tmpClient\stream, tmpClientAll\connected )
Next
WriteByte ( tmpClient\stream, 2 )
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\Port)
EndIf
EndIf
EndIf
Case UDP_CmdMsg
tmpSafety = ReadByte( UDP_Stream )
tmpClientID = ReadInt( UDP_Stream )
If tmpSafety = 1 Then tmpID = ReadInt( UDP_Stream )
tmpCmdID = ReadInt( UDP_Stream )
tmpToID = ReadInt( UDP_Stream )
If tmpClientID => 0 And tmpClientID <= UDP_MaxPlayers Then
For tmpCmdInfo.UDP_Cmd=Each UDP_Cmd
If tmpCmdInfo\typ=0 And tmpCmdInfo\ID=tmpCmdID Then Exit
Next
tmpGet = 0
If tmpSafety = 1 Then
For tmpCmd.UDP_Cmd = Each UDP_Cmd
If tmpCmd\typ = 4 And tmpCmd\ID = tmpID Then tmpGet = 1: Exit
Next
EndIf
If tmpGet = 0 Then tmpCmd.UDP_Cmd = New UDP_Cmd
If tmpSafety = 0
tmpCmd\Typ = 2
tmpCmd\ID = tmpCmdID
Else
tmpCmd\typ = 2
tmpCmd\ID = tmpID
tmpCmd\sendMs = MilliSecs()
If tmpGet = 0
tmpCmdNew.UDP_Cmd = New UDP_Cmd
tmpCmdNew\Typ = 4
tmpCmdNew\ID = tmpID
EndIf
EndIf
tmpCmd\FromID = tmpClientID
tmpCmd\ToID = tmpToID
tmpCmd\info = tmpCmdInfo
tmpCmd\MaxParameter = tmpCmdInfo\MaxParameter
For i = 0 To tmpCmdInfo\MaxParameter
Select tmpCmdInfo\parameter[ i ]
Case 0 : tmpCmd\parameter[ i ] = ReadInt( UDP_Stream )
Case 1 : tmpCmd\parameter[ i ] = ReadFloat( UDP_Stream )
Case 2 : tmpCmd\parameter[ i ] = ReadString( UDP_Stream )
Case 3 : tmpCmd\parameter[ i ] = ReadByte( UDP_Stream )
Case 4 : tmpCmd\parameter[ i ] = ReadShort( UDP_Stream )
Case 5
tmpBankSize = ReadInt( UDP_Stream )
tmpCmd\bank = CreateBank( tmpBankSize )
For j = 0 To tmpBankSize-1
tmpByte = ReadByte( UDP_Stream )
PokeByte( tmpCmd\bank, j, tmpByte )
Next
tmpCmd\parameter[ i ] = tmpCmd\bank
End Select
Next
If tmpSafety = 0
tmpCmdNew.UDP_Cmd = New UDP_Cmd
tmpCmdNew\ID = tmpCmdID
tmpCmdNew\Typ = 1
tmpCmdNew\FromID = tmpClientID
tmpCmdNew\toID = tmpToID
tmpCmdNew\info = tmpCmdInfo
tmpCmdNew\MaxParameter = tmpCmdInfo\MaxParameter
For i = 0 To tmpCmdInfo\MaxParameter
tmpCmdNew\parameter[ i ] = tmpCmd\parameter[ i ]
Next
If tmptoID <> 1 And tmpToID > 0 And tmpToID <= UDP_MaxPlayers Then
If UDP_ClientInfo( tmptoID ) <> Null Then Delete tmpCmd
EndIf
Else
If tmpClientID => 0 And tmpClientID <= UDP_MaxPlayers Then
tmpClient.UDP_Client = UDP_ClientInfo( tmpClientID )
If tmpClient\connected = 1
WriteByte( tmpClient\stream, UDP_AnswerMsg )
WriteInt( tmpClient\stream, tmpID )
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\Port )
tmpCmdToID = tmPCmd\toID
If tmpCmdToID < 0 Or tmpCmdtoID > UDP_MaxPlayers Then tmpCmdtoID = -1
For tmpClient.UDP_Client = Each UDP_Client
If (tmpCmdToID = tmpClient\ID Or tmpCmdToID = -1 ) And tmpClient\ID <> tmpClientID And tmpClient\ID <> UDP_PlayerID Then
tmpCmdNew.UDP_Cmd = New UDP_Cmd
tmpCmdNew\info = tmpCmd\info
tmpCmdNew\typ = 3
tmpCmdNew\ID = UDP_MsgEntID
UDP_MsgEntID =( UDP_MsgEntID + 1 ) Mod 2147483647
tmpCmdNew\FromID = tmpCmd\FromID
tmpCmdNew\ToID = tmpClient\ID
If tmpCmdNew\toID > 0 And tmpCmdNew\toID <= UDP_MaxPlayers Then
If UDP_ClientInfo( tmpCmdNew\toID ) = Null Or tmpCmdNew\toID = UDP_PlayerID Then tmpCmdNew\toID = -1
EndIf
tmpCmdNew\MaxParameter = tmpCmd\MaxParameter
For i = 0 To tmpCmdNew\MaxParameter
tmpCmdNew\Parameter[ i ] = tmpCmd\Parameter[ i ]
Next
EndIf
Next
If UDP_ServerClient <> Null Then
If tmpToID <> UDP_PlayerID And tmpToID <> -1 Then Delete tmpCmd
Else
If tmpCmdToID <> 0 And tmpCmdtoID <> -1 Then Delete tmpCmd
EndIf
EndIf
EndIf
EndIf
EndIf
Case UDP_EndMsg
tmpID = ReadInt( UDP_Stream )
For tmpClient.UDP_Client = Each UDP_Client
If tmpClient <> UDP_Player Then
WriteByte( tmpClient\Stream, UDP_EndMsg )
WriteInt( tmpClient\Stream, tmpID )
SendUDPMsg( tmpClient\Stream, tmpClient\IP, tmpClient\Port )
EndIf
Next
If UDP_ClientInfo( tmpID ) <> Null Then Delete UDP_ClientInfo( tmpID )
tmpEvent.UDP_Event = New UDP_Event
tmpEvent\Event = Event_PlayerLeft
tmpEvent\EventData$ = tmpID
Case UDP_AnswerMsg
tmpPlayerID = ReadInt( UDP_Stream )
tmpID = ReadInt( UDP_Stream )
If tmpPlayerID => 0 And tmpPlayerID <= UDP_MaxPlayers Then
tmpClient.UDP_Client = UDP_ClientInfo( tmpPlayerID )
If tmpClient\connected = 1
If tmpClient <> Null Then
For tmpCmd.UDP_Cmd = Each UDP_Cmd
If tmpCmd\typ = 3 And tmpCmd\ID = tmpID Then
Delete tmpCmd
Exit
EndIf
Next
EndIf
EndIf
EndIf
Case UDP_NameMsg
tmpID = ReadInt( UDP_Stream )
tmpNewName$ = ReadString( UDP_Stream )
If tmpID => 0 And tmpID <= UDP_MaxPlayers Then
If UDP_ClientInfo( tmpID ) <> Null Then
UDP_ClientInfo( tmpID )\changeName = 1
UDP_ClientInfo( tmpID )\newName$ = tmpNewName$
EndIf
EndIf
Case UDP_GetInformationMsg
tmpIP = UDPMsgIP( UDP_Stream )
tmpPort = UDPMsgPort( UDP_Stream )
WriteByte( UDP_Stream, UDP_GetInformationMsg )
SendUDPMsg( UDP_Stream, tmpIP, tmpPort )
Case UDP_AnswerSendServerFile
tmpPlayerID = ReadInt( UDP_Stream )
tmpID = ReadInt( UDP_Stream )
If tmpPlayerID => 0 And tmpPlayerID <= UDP_MaxPlayers
If UDP_ClientInfo( tmpPlayerID ) <> Null Then
If UDP_ClientInfo( tmpPlayerID )\serverfile <> Null Then
If UDP_ClientInfo( tmpPlayerID )\serverfile\ID = tmpID Then
UDP_ClientInfo( tmpPlayerID )\serverfile\sendfile = 1
EndIf
EndIf
EndIf
EndIf
Case UDP_SendServerFileBytes
tmpPlayerID = ReadInt( UDP_Stream )
tmpByteID = ReadInt( UDP_Stream )
If tmpPlayerID => 0 And tmpPlayerID <= UDP_MaxPlayers
If UDP_ClientInfo( tmpPlayerID ) <> Null Then
If UDP_ClientInfo( tmpPlayerID )\serverfile\byteID = tmpByteID Then
UDP_CLientInfo( tmpPlayerID )\serverfile\byteID = ( UDP_CLientInfo( tmpPlayerID )\serverfile\byteID + UDP_PackedSize )
If UDP_CLientInfo( tmpPlayerID )\serverfile\byteID > UDP_CLientInfo( tmpPlayerID )\serverfile\size Then
UDP_CLientInfo( tmpPlayerID )\serverfile\byteID = UDP_CLientInfo( tmpPlayerID )\serverfile\size
EndIf
If Eof( UDP_ClientInfo( tmpPlayerID )\serverfile\datei ) = 1 Then
UDP_ClientInfo( tmpPlayerID )\serverfile\sendfile = 2
Else
For i = 0 To UDP_PackedSize-1 : PokeByte( UDP_CLientInfo( tmpPlayerID )\serverfile\byte, i, 0 ) : Next
ReadBytes( UDP_CLientInfo( tmpPlayerID )\serverfile\byte, UDP_CLientInfo( tmpPlayerID )\serverfile\datei, 0, UDP_PackedSize )
UDP_CLientInfo( tmpPlayerID )\serverfile\sendms = 0
EndIf
EndIf
EndIf
EndIf
Case UDP_EndSendServerFile
tmpPlayerID = ReadInt( UDP_Stream )
If UDP_ClientInfo( tmpPlayerID ) <> Null Then
tmpClient.UDP_Client = UDP_CLientInfo( tmpPlayerID )
CloseFile tmpClient\serverfile\datei
FreeBank tmpClient\serverfile\byte
Delete tmpClient\serverfile
For tmpfile.UDP_ServerFile = Each UDP_ServerFile
If tmpFile\client = tmpClient And tmpFile\transfer = 1 Then
tmpClient\serverfile = tmpFile
Exit
EndIf
Next
If tmpClient\serverfile = Null Then
tmpClient\connected = 1
WriteByte( tmpClient\stream, UDP_EndSend )
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\Port )
EndIf
EndIf
Case UDP_ReConnectMsg
tmpPlayerID = ReadInt( UDP_Stream )
If UDP_ClientInfo( tmpPlayerID ) <> Null Then
UDP_ClientInfo( tmpPlayerID )\recon = 0
UDP_ClientInfo( tmpPlayerID )\connected = 0
EndIf
End Select
Wend
;Ping updaten
tmpSendPing = 0
If UDP_SendPingTime <= MilliSecs() Then
tmpSendPing = 1
UDP_SendPingTime = MilliSecs() + UDP_PingSendTime
EndIf
;Cmd's senden
For tmpClient.UDP_Client = Each UDP_Client
If tmpClient\connected = 1 Then
;Serverfiles senden
If tmpClient\serverfile <> Null Then
tmpPing = tmpClient\Ping * 4
If tmpPing < 64 tmpPing = 64
If tmpClient\serverfile\sendfile = 0 And tmpClient\serverfile\sendms <= MilliSecs() - tmpPing Then
WriteByte( tmpClient\stream, UDP_StartSendServerFile )
WriteInt( tmpClient\stream, tmpCLient\serverFile\ID )
WriteInt( tmpClient\stream, tmpClient\serverFile\size )
WriteString( tmpClient\stream, UDP_ServerFilePath$+tmpClient\serverFile\filename$ )
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\port )
tmpClient\serverfile\sendms = MilliSecs()
EndIf
If tmpClient\serverfile\sendfile = 1 And tmpClient\serverfile\sendms <= MilliSecs() - tmpPing Then
WriteByte( tmpClient\stream, UDP_SendServerFileBytes )
WriteInt( tmpClient\stream, tmpClient\serverfile\byteID )
WriteBytes( tmpCLient\serverfile\byte, tmpClient\stream, 0, UDP_PackedSize )
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\Port )
tmpClient\serverfile\sendms = MilliSecs()
EndIf
If tmpClient\serverfile\sendfile = 2 And tmpClient\serverfile\sendms <= MilliSecs() - tmpPing Then
WriteByte( tmpClient\stream, UDP_EndSendServerFile )
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\port )
tmpClient\serverfile\sendms = MilliSecs()
EndIf
EndIf
If tmpSendPing = 1 Then
;Ping nachricht
If tmpClient\connected = 1
If tmpClient <> UDP_Player Then
If tmpClient\waitping = 1 Then tmpClient\Ping = (MilliSecs() - tmpClient\PingMS) /2
WriteByte( tmpClient\stream, UDP_PingMsg )
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\Port )
tmpClient\PingMS = MilliSecs()
tmpClient\WaitPing = 1
EndIf
EndIf
EndIf
If tmpClient\changeName = 1 Then
tmpClient\changename = 0
For tmpClientAll.UDP_Client = Each UDP_Client
If tmpClientAll <> UDP_Player Then
If tmpClientAll\stream <> 0 Then
WriteByte( tmpClientAll\stream, UDP_NameMsg )
WriteInt( tmpClientAll\stream, tmpClient\ID )
WriteString( tmpClientAll\stream, tmpClient\newname$ )
SendUDPMsg( tmpClientAll\stream, tmpClientAll\IP, tmpClientAll\Port )
EndIf
EndIf
Next
tmpEvent.UDP_Event = New UDP_Event
tmpEvent\Event = Event_ChangeName
tmpEvent\EventData = tmpClient\ID
tmpEvent\EventMsg$ = tmpClient\NewName$
tmpEvent\EventMsg2$ = tmpClient\name$
tmpClient\name$ = tmpClient\newname$
EndIf
If tmpClient <> UDP_Player Then
If tmpClient\recon = 1 Then
tmpPing = tmpClient\Ping * 4
If tmpPing < 64 tmpPing = 64
If tmpClient\reconms <= MilliSecs() - tmpPing Then
WriteByte( tmpClient\stream, UDP_ReConnectMsg )
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\Port )
tmpClient\reconms = MilliSecs()
EndIf
EndIf
For tmpCmd.UDP_Cmd = Each UDP_Cmd
If tmpCmd\typ = 1 Then
If ( tmpCmd\toID=tmpClient\ID Or tmpCmd\toID = -1 ) And tmpCmd\FromID <> tmpClient\ID Then
WriteByte( tmpClient\stream, UDP_CmdMsg )
WriteByte( tmpClient\stream, 0 )
WriteInt( tmpClient\stream, tmpCmd\ID )
WriteInt( tmpClient\stream, tmpCmd\FromID )
For i = 0 To tmpCmd\MaxParameter
Select tmpCmd\info\parameter[i]
Case 0 : WriteInt( tmpClient\stream, tmpCmd\parameter[ i ] )
Case 1 : WriteFloat( tmpClient\stream, tmpCmd\parameter[ i ] )
Case 2 : WriteString( tmpClient\stream, tmpCmd\parameter[ i ] )
Case 3 : WriteByte( tmpClient\stream, tmpCmd\parameter[ i ] )
Case 4 : WriteShort( tmpClient\stream, tmpCmd\parameter[ i ] )
Case 5
tmpBankSize = BankSize( tmpCmd\parameter[ i ] )
WriteInt( tmpClient\stream, tmpBankSize )
For j = 0 To tmpBankSize-1
WriteByte( tmpClient\stream, PeekByte( tmpCmd\Parameter[ i ], j ) )
Next
End Select
Next
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\Port )
tmpCmd\del = 1
EndIf
EndIf
If tmpCmd\typ = 3 And tmpCmd\del <> 1 Then
If ( tmpCmd\toID=tmpClient\ID ) Or tmpCmd\toID = -1 Then
WriteByte( tmpClient\stream, UDP_CmdMsg )
WriteByte( tmpClient\stream, 1 )
WriteInt( tmpClient\stream, tmpCmd\ID )
WriteInt( tmpClient\stream, tmpCmd\info\ID )
WriteInt( tmpClient\stream, tmpCmd\FromID )
For i = 0 To tmpCmd\MaxParameter
Select tmpCmd\info\parameter[i]
Case 0 : WriteInt( tmpClient\stream, tmpCmd\parameter[i] )
Case 1 : WriteFloat( tmpClient\stream, tmpCmd\parameter[i] )
Case 2 : WriteString( tmpClient\stream, tmpCmd\parameter[i] )
Case 3 : WriteByte( tmpClient\stream, tmpCmd\parameter[i] )
Case 4 : WriteShort( tmpClient\stream, tmpCmd\parameter[i] )
Case 5
tmpBankSize = BankSize( tmpCmd\parameter[ i ] )
WriteInt( tmpClient\stream, tmpBankSize )
For j = 0 To tmpBankSize-1
WriteByte( tmpClient\stream, PeekByte( tmpCmd\Parameter[ i ], j ) )
Next
End Select
Next
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\Port )
tmpCmd\del = 2
tmpCmd\sendms = MilliSecs()
EndIf
EndIf
Next
EndIf
If tmpClient\kick = 1 Then
If tmpClient\stream <> UDP_Stream Then CloseUDPStream( tmpClient\stream )
Delete tmpClient
EndIf
EndIf
Next
For tmpCmd.UDP_Cmd = Each UDP_Cmd
tmpDel = 0
If tmpCmd\typ = 1 And tmpCmd\del = 1 Then tmpDel = 1
If tmpCmd\typ = 3 Then
If tmpCmd\del = 2 Then tmpCmd\del = 1
If tmpCmd\del = 1 Then
tmpPing = 512
If tmpCmd\toID > 0 And tmpCmd\toID <= UDP_MaxPlayers
If UDP_ClientInfo( tmpCmd\toID ) <> Null Then
tmpPing = UDP_ClientInfo( tmpCmd\toID )\Ping * 4
If tmpPing < 64 tmpPing = 64
EndIf
EndIf
If MilliSecs()-tmpCmd\sendms > tmpPing Then
tmpCmd\del = 0 : tmpCmd\send = tmpCmd\send + 1
If tmpCmd\send > 3 Then tmpDel = 1
EndIf
EndIf
EndIf
If tmpCmd\typ = 4
If MilliSecs()-tmpCmd\sendms => 20000 Then tmpDel = 1
EndIf
If tmpDel = 1 Then Delete tmpCmd
Next
For tmpBan.UDP_Ban = Each UDP_Ban
If tmpBan\time > 0 Then
If MilliSecs() - tmpBan\ms => tmpBan\time Then Delete tmpBan
EndIf
Next
EndIf
EndIf
;Client Aufgabenbereich
If UDP_Host = 0 Then
;Auf Verbunden / Nicht verbunden prüfen
If UDP_Connected = 0 Then
;Wenn eine Anfrage geschickt worden ist ...
If UDP_Connect = 1
;Anfrage an den Server schicken
DebugLog "CON"
If UDP_SendJoinMsgMs <= MilliSecs() - 1000 Then
WriteByte( UDP_Stream, UDP_JoinMsg )
WriteByte( UDP_Stream, UDP_ChangeHostConnect )
If UDP_ChangeHostConnect Then
WriteInt( UDP_Stream, UDP_PlayerID )
EndIf
SendUDPMsg( UDP_Stream, UDP_ServerIP, UDP_ServerPort)
UDP_SendJoinMsgMs = MilliSecs()
EndIf
While RecvUDPMsg( UDP_Stream )
tmpByte = ReadByte( UDP_Stream )
Select tmpByte
Case UDP_JoinMsg ;Bestätigung vom Server
tmpGetJoin = ReadByte( UDP_Stream )
If tmpGetJoin = 0 Then
UDP_MaxPlayers = ReadInt( UDP_Stream )
UDP_Dediziert = ReadByte( UDP_Stream )
UDP_NetMode = ReadByte( UDP_Stream )
If UDP_NetMode = UDP_NetGame Then
UDP_ServerStream = UDP_Stream
Else
UDP_ServerStream = CreateUDPStream( )
EndIf
Dim UDP_ClientInfo.UDP_Client( UDP_MaxPlayers )
UDP_PlayerID = ReadInt( UDP_Stream )
UDP_ServerID = ReadInt( UDP_Stream )
UDP_Connected = ReadByte( UDP_Stream )
;Alle vorhandenen Clienten empfangen
tmpEvent.UDP_Event = New UDP_Event
tmpEvent\Event = Event_ConnectedServer
While Not Eof( UDP_Stream )
tmpClient.UDP_Client = New UDP_Client
tmpClient\ID = ReadInt( UDP_Stream )
tmpClient\IP = ReadInt( UDP_Stream )
tmpClient\Port = ReadInt( UDP_Stream )
tmpClient\Name$ = ReadString( UDP_Stream )
tmpClient\connected = ReadByte( UDP_Stream )
tmpClient\stream = UDP_Stream
UDP_ClientInfo( tmpClient\ID ) = tmpClient
If tmpClient\ID = UDP_PlayerID Then
UDP_Player.UDP_Client = tmpClient
;tmpClient\Port = UDPStreamPort(UDP_Stream)
EndIf
tmpEvent.UDP_Event = New UDP_Event
tmpEvent\Event = Event_NewPlayer
tmpEvent\EventData$ = tmpClient\ID
If (UDP_Dezidiert = 0 And tmpClient\ID = UDP_ServerID) Then
tmpClient\IP = UDP_ServerIP
tmpClient\Port = UDP_ServerPort
tmpClient\host = 1
If UDP_NetMode = UDP_LanGame Then tmpClient\stream = CreateUDPStream( ) : UDP_ServerStream = tmpClient\stream
UDP_ServerClient = tmpClient
EndIf
Wend
UDP_Connect = 0
UDP_Connected = 1
Else
UDP_Connect = 0
UDP_Connected = 1
EndIf
Case UDP_NotJoinMsg; Fehler, keine connection
tmpID = ReadByte( UDP_Stream )
UDP_Connect = 0
If tmpID = 0
tmpEvent.UDP_Event = New UDP_Event
tmpEvent\Event = Event_NoConnection
tmpEvent\EventData = 0
Else
tmpEvent.UDP_Event = New UDP_Event
tmpEvent\Event = Event_NoConnection
tmpEvent\EventData = 1
tmpEvent\EventMsg2$ = ReadInt( UDP_Stream )
tmpEvent\EventMsg$ = ReadString( UDP_Stream )
EndIf
End Select
Wend
ElseIf UDP_Connect = 2
While RecvUDPMsg( UDP_Stream )
tmpByte = ReadByte( UDP_Stream )
Select tmpByte
Case UDP_GetInformationMsg
tmpServer.UDP_Server = New UDP_Server
tmpServer\IP = UDPMsgIP( UDP_Stream )
tmpServer\Port = UDPMsgPort( UDP_Stream )
tmpServer\Ping = ( MilliSecs( ) - UDP_ServerGlobalPing ) / 2.0
End Select
Wend
EndIf
ElseIf UDP_Connected = 1
UDP_Connect = 0
While RecvUDPMsg( UDP_Stream ) ;NAchrichten empfangen
tmpByte = ReadByte( UDP_Stream ); Header byte auslesen und überprüfen
Select tmpByte
Case UDP_JoinMsg ;Neuer Spieler
tmpID = ReadInt( UDP_Stream )
tmpIP = ReadInt( UDP_Stream )
tmpPort = ReadInt( UDP_Stream )
If tmpID => 0 And tmpID <= UDP_MaxPlayers
;Clients überpürfen
tmpGet = 0
For tmpCLient.UDP_Client = Each UDP_Client
If tmpClient\IP = tmpIP And tmpClient\Port = tmpPort Then tmpGet = 1 : Exit
Next
If tmpGet = 0 Then tmpClient.UDP_Client = New UDP_Client
tmpClient\ID = tmpID
tmpClient\IP = tmpIP
tmpClient\Port = tmpPort
tmpClient\name$ = "unnamed"
tmpClient\Stream = UDP_Stream
tmpClient\host = 0
tmpClient\connected = 1
UDP_ClientInfo.UDP_Client( tmpClient\ID ) = tmpClient
tmpEvent.UDP_Event = New UDP_Event
tmpEvent\Event = Event_NewPlayer
tmpEvent\EventData$ = tmpClient\ID
EndIf
Case UDP_PingMsg ;Ping-Anfrage vom Server
WriteByte( UDP_ServerStream, UDP_PingMsg )
WriteInt( UDP_ServerStream, UDP_PlayerID )
SendUDPMsg( UDP_ServerStream, UDP_ServerIP, UDP_ServerPort )
If UDP_ServerClient <> Null Then
;If UDP_ServerClient\WaitPing = 0 Then
UDP_ServerClient\PingMs = MilliSecs()
UDP_ServerClient\WaitPing = 1
UDP_GetPingFromServer = 0
;EndIf
EndIf
Case UDP_PingDataMsg ;PingDaten der Spieler
While ReadByte( UDP_Stream ) = 1
tmpID = ReadInt( UDP_Stream )
tmpPing = ReadInt( UDP_Stream )
tmpConnected = ReadByte( UDP_Stream )
If tmpID => 0 And tmpID <= UDP_MaxPlayers Then
If UDP_ClientInfo( tmpID ) <> Null Then
UDP_ClientInfo.UDP_Client( tmpID )\Ping = tmpPing
UDP_ClientInfo.UDP_Client( tmpID )\Connected = tmpConnected
EndIf
EndIf
Wend
If UDP_ServerClient <> Null Then
;If UDP_ServerClient\WaitPing = 1
UDP_ServerClient\Ping = ( MilliSecs() - UDP_ServerClient\PingMs ) / 2
UDP_ServerClient\WaitPing = 0
UDP_GetPingFromServer = MilliSecs()
;EndIf
EndIf
Case UDP_CmdMsg
tmpSafety = ReadByte( UDP_Stream )
If tmpSafety = 1 Then tmpID = ReadInt( UDP_Stream )
tmpCmdID = ReadInt( UDP_Stream )
tmpFromID = ReadInt( UDP_Stream )
For tmpCmdInfo.UDP_Cmd = Each UDP_Cmd
If tmpCmdInfo\typ = 0 And tmpCmdInfo\ID = tmpCmdID Then Exit
Next
tmpGet = 0
If tmpSafety = 1 Then
For tmpCmd.UDP_Cmd = Each UDP_Cmd
If tmpCmd\typ = 4 And tmpCmd\ID = tmpID Then tmpGet = 1: Exit
Next
EndIf
If tmpGet = 0 Then tmpCmd.UDP_Cmd = New UDP_Cmd
If tmpCmd <> Null And tmpCmdInfo <> Null Then
If tmpSafety = 0 Then
tmpCmd\Typ = 2
tmpCmd\ID = tmpCmdID
Else
tmpCmd\typ = 2
tmpCmd\ID = tmpID
tmpCmd\sendms = MilliSecs()
If tmpGet = 0
tmpCmdNew.UDP_Cmd = New UDP_Cmd
tmpCmdNew\Typ = 4
tmpCmdNew\ID = tmpID
EndIf
EndIf
tmpCmd\FromID = tmpFromID
tmpCmd\info = tmpCmdInfo
tmpCmd\MaxParameter = tmpCmdInfo\MaxParameter
For i = 0 To tmpCmdInfo\MaxParameter
Select tmpCmdInfo\parameter[ i ]
Case 0 : tmpCmd\parameter[ i ] = ReadInt( UDP_Stream )
Case 1 : tmpCmd\parameter[ i ] = ReadFloat( UDP_Stream )
Case 2 : tmpCmd\parameter[ i ] = ReadString( UDP_Stream )
Case 3 : tmpCmd\parameter[ i ] = ReadByte( UDP_Stream )
Case 4 : tmpCmd\parameter[ i ] = ReadShort( UDP_Stream )
Case 5
tmpBankSize = ReadInt( UDP_Stream )
tmpCmd\bank = CreateBank( tmpBankSize )
For j = 0 To tmpBankSize-1
tmpByte = ReadByte( UDP_Stream )
PokeByte( tmpCmd\bank, j, tmpByte )
Next
tmpCmd\parameter[ i ] = tmpCmd\bank
End Select
Next
EndIf
If tmpSafety = 1
WriteByte( UDP_ServerStream, UDP_AnswerMsg )
WriteInt( UDP_ServerStream, UDP_PlayerID )
WriteInt( UDP_ServerStream, tmpID )
SendUDPMsg( UDP_ServerStream, UDP_ServerIP, UDP_ServerPort )
EndIf
Case UDP_EndMsg
tmpID = ReadInt( UDP_Stream )
If UDP_ClientInfo( tmpID ) <> Null Then Delete UDP_ClientInfo( tmpID )
If tmpID = 0 Then
UDP_Connected = 0
If UDP_ServerStream <> UDP_Stream Then CloseUDPStream( UDP_ServerStream )
CloseUDPStream( UDP_Stream )
Delete Each UDP_Client
EndIf
tmpEvent.UDP_Event = New UDP_Event
tmpEvent\Event = Event_PlayerLeft
tmpEvent\EventData$ = tmpID
Return
Case UDP_AnswerMsg
tmpID = ReadInt( UDP_Stream )
For tmpCmd.UDP_Cmd = Each UDP_Cmd
If tmpCmd\typ = 3 And tmpCmd\ID = tmpID Then
Delete tmpCmd
Exit
EndIf
Next
Case UDP_KickMsg
tmpID = ReadInt( UDP_Stream )
tmpReason$ = ReadString( UDP_Stream )
If tmpID = UDP_PlayerID Then
UDP_Connected = 0
If UDP_ServerStream <> UDP_Stream Then CloseUDPStream( UDP_ServerStream )
CloseUDPStream( UDP_Stream )
Delete Each UDP_CLient
Else
If UDP_ClientInfo( tmpID ) <> Null Then Delete UDP_ClientInfo( tmpID )
EndIf
tmpEvent.UDP_Event = New UDP_Event
tmpEvent\Event = Event_PlayerKicked
tmpEvent\EventData = tmpID
tmpEvent\EventMsg = tmpReason
Return
Case UDP_BannMsg
tmpID = ReadInt( UDP_Stream )
tmpTime = ReadInt( UDP_Stream )
tmpReason$ = ReadString( UDP_Stream )
If tmpID = UDP_PlayerID Then
UDP_Connected = 0
If UDP_ServerStream <> UDP_Stream Then CloseUDPStream( UDP_ServerStream )
CloseUDPStream( UDP_Stream )
Delete Each UDP_CLient
Else
If UDP_ClientInfo( tmpID ) <> Null Then Delete UDP_ClientInfo( tmpID )
EndIf
tmpEvent.UDP_Event = New UDP_Event
tmpEvent\Event = Event_PlayerBanned
tmpEvent\EventData = tmpID
tmpEvent\EventMsg$ = tmpReason
tmpEvent\EventMsg2$ = tmpTime
Return
Case UDP_NameMsg
tmpID = ReadInt( UDP_Stream )
tmpName$ = ReadString( UDP_Stream )
If UDP_ClientInfo( tmpID ) <> Null
tmpEvent.UDP_Event = New UDP_Event
tmpEvent\Event = Event_ChangeName
tmpEvent\EventData = tmpID
tmpEvent\EventMsg$ = tmpName$
tmpEvent\EventMsg2$ = UDP_CLientInfo( tmpID )\name$
UDP_CLientInfo( tmpID )\name$ = tmpName$
EndIf
Case UDP_ChangeHostMsg
tmpMe = ReadByte( UDP_Stream )
If tmpMe = 1 Then
UDP_NetMode = ReadByte( UDP_Stream )
UDP_CmdOn = ReadByte( UDP_Stream )
If UDP_CmdOn = 1 Then
tmpCmdID = ReadInt( UDP_Stream )
tmpCmd.UDP_Cmd = New UDP_Cmd
For tmpCmdInfo.UDP_Cmd = Each UDP_Cmd
If tmpCmdInfo\typ = 0 And tmpCmdInfo\ID = tmpCmdID Then Exit
Next
tmpCmd\Typ = 2
tmpCmd\ID = tmpCmdID
tmpCmd\info = tmpCmdInfo
tmpCmd\MaxParameter = tmpCmdInfo\MaxParameter
For i = 0 To tmpCmdInfo\MaxParameter
Select tmpCmdInfo\parameter[ i ]
Case 0 : tmpCmd\parameter[ i ] = ReadInt( UDP_Stream )
Case 1 : tmpCmd\parameter[ i ] = ReadFloat( UDP_Stream )
Case 2 : tmpCmd\parameter[ i ] = ReadString( UDP_Stream )
Case 3 : tmpCmd\parameter[ i ] = ReadByte( UDP_Stream )
Case 4 : tmpCmd\parameter[ i ] = ReadShort( UDP_Stream )
Case 5
tmpBankSize = ReadInt( UDP_Stream )
tmpCmd\bank = CreateBank( tmpBankSize )
For j = 0 To tmpBankSize-1
tmpByte = ReadByte( UDP_Stream )
PokeByte( tmpCmd\bank, j, tmpByte )
Next
tmpCmd\parameter[ i ] = tmpCmd\bank
End Select
Next
EndIf
; Delete Each UDP_Client
For tmpClient.UDP_CLient = Each UDP_Client
If tmpClient\ID = UDP_PlayerID Then
tmpClient\Host = 1
UDP_ServerClient = tmpCLient
UDP_ServerIP = tmpClient\IP
UDP_ServerPort = tmpClient\Port
UDP_ServerID = tmpClient\ID
Else
tmpClient\Host = 0
EndIf
tmpClient\waitping = 0
Next
UDP_Host = 1
For tmpClient.UDP_Client = Each UDP_Client
tmpClient\stream = UDP_Stream
If UDP_NetMode = UDP_LanGame Then
tmpClient\stream = CreateUDPStream()
EndIf
Next
Else
tmpID = ReadInt( UDP_Stream )
If tmpID => 0 And tmpID <= UDP_MaxPlayers
If UDP_ClientInfo( tmpID ) <> Null Then
For tmpClient.UDP_Client = Each UDP_Client
If tmpClient\host = 1 Then tmpClient\host = 0 : Exit
Next
UDP_ClientInfo( tmpID )\host = 1
UDP_ServerPort = UDP_ClientInfo( tmpID )\port
UDP_ServerIP = UDP_ClientInfo( tmpID )\IP
UDP_ServerClient = UDP_ClientInfo( tmpID )
UDP_ServerID = UDP_ClientInfo( tmpID )\ID
UDP_Connect = 1
UDP_Connected = 0
UDP_ChangeHostConnect = 1
EndIf
EndIf
EndIf
Case UDP_StartSendServerFile
tmpID = ReadInt( UDP_Stream )
tmpGet = 0
For tmpServerFile.UDP_ServerFile = Each UDP_ServerFile
If tmpID = tmpServerFile\ID Then get = 1 : Exit
Next
If get = 0 Then tmpServerFile.UDP_ServerFile = New UDP_ServerFile
tmpServerFile\ID = tmpID
tmpServerFile\size = ReadInt( UDP_Stream )
tmpServerFile\filename$ = ReadString( UDP_Stream )
tmpServerFile\transfer = 1
tmpServerFile\byte = CreateBank( UDP_PackedSize )
If tmpServerFile\datei = 0 Then
tmpServerFile\datei = UDP_CreateFile( tmpServerFile\filename$ )
EndIf
UDP_ServerFile = tmpServerFile
WriteByte( UDP_ServerStream, UDP_AnswerSendServerFile )
WriteInt( UDP_ServerStream, UDP_PlayerID )
WriteInt( UDP_ServerStream, tmpID )
SendUDPMsg( UDP_ServerStream, UDP_ServerIP, UDP_ServerPort )
Case UDP_SendServerFileBytes
tmpByteID = ReadInt( UDP_Stream )
If UDP_ServerFile <> Null Then
If UDP_ServerFile\byteID <> tmpByteID Then
ReadBytes( UDP_ServerFile\byte, UDP_Stream, 0, UDP_PackedSize )
If UDP_ServerFile\datei <> 0 Then WriteBytes( UDP_ServerFile\byte, UDP_ServerFile\datei, 0, UDP_PackedSize )
UDP_ServerFile\byteID = tmpByteID
EndIf
EndIf
WriteByte( UDP_ServerStream, UDP_SendServerFileBytes )
WriteInt( UDP_ServerStream, UDP_PlayerID )
WriteInt( UDP_ServerStream, tmpByteID )
SendUDPMsg( UDP_ServerStream, UDP_ServerIP, UDP_ServerPort )
Case UDP_EndSendServerFile
If UDP_ServerFile <> Null Then
If UDP_ServerFile\datei <> 0 Then CloseFile( UDP_ServerFile\datei )
FreeBank( UDP_ServerFile\byte )
Delete UDP_ServerFile
EndIf
WriteByte( UDP_ServerStream, UDP_EndSendServerFile )
WriteInt( UDP_ServerStream, UDP_PlayerID )
SendUDPMsg( UDP_ServerStream, UDP_ServerIP, UDP_ServerPort )
Case UDP_EndSend
UDP_Connected = 1
Case UDP_ReConnectMsg
UDP_ReConnect( )
WriteByte( UDP_ServerStream, UDP_ReConnectMsg )
WriteInt( UDP_ServerStream, UDP_PlayerID )
SendUDPMsg( UDP_ServerStream, UDP_ServerIP, UDP_ServerPort )
End Select
Wend
If UDP_ServerClient <> Null Then
tmpSendPing = 0
If UDP_SendPingTime <= MilliSecs() Then
tmpSendPing = 1
UDP_SendPingTime = MilliSecs() + UDP_PingSendTime
EndIf
If UDP_GetPingFromServer > 0
If (MilliSecs()-UDP_GetPingFromServer) > UDP_PingSendTime And tmpSendPing = 1 Then
UDP_ServerClient\Ping = ( MilliSecs() - UDP_GetPingFromServer ) / 2
EndIf
EndIf
EndIf
If UDP_ChangeName = 1 Then
UDP_ChangeName = 0
WriteByte( UDP_ServerStream, UDP_NameMsg )
WriteInt( UDP_ServerStream, UDP_PlayerID )
WriteString( UDP_ServerStream, UDP_NewName$ )
SendUDPMsg( UDP_ServerStream, UDP_ServerIP, UDP_ServerPort )
EndIf
For tmpCmd.UDP_Cmd = Each UDP_Cmd
tmpDel = 0
If tmpCmd\typ = 4
If MilliSecs()-tmpCmd\sendms => 20000 Then tmpDel = 1
EndIf
If tmpCmd\typ = 1 Then
WriteByte( UDP_ServerStream, UDP_CmdMsg )
WriteByte( UDP_ServerStream, 0 )
WriteInt( UDP_ServerStream, UDP_PlayerID )
WriteInt( UDP_ServerStream, tmpCmd\ID )
WriteInt( UDP_ServerStream, tmpCmd\toID )
For i = 0 To tmpCmd\MaxParameter
Select tmpCmd\info\parameter[i]
Case 0 : WriteInt( UDP_ServerStream, tmpCmd\parameter[i] )
Case 1 : WriteFloat( UDP_ServerStream, tmpCmd\parameter[i] )
Case 2 : WriteString( UDP_ServerStream, tmpCmd\parameter[i] )
Case 3 : WriteByte( UDP_ServerStream, tmpCmd\parameter[i] )
Case 4 : WriteShort( UDP_ServerStream, tmpCmd\parameter[i] )
Case 5
tmpBankSize = BankSize( tmpCmd\parameter[ i ] )
WriteInt( UDP_ServerStream, tmpBankSize )
For j = 0 To tmpBankSize-1
WriteByte( UDP_ServerStream, PeekByte( tmpCmd\Parameter[ i ], j ) )
Next
End Select
Next
SendUDPMsg( UDP_ServerStream, UDP_ServerIP, UDP_ServerPort )
tmpDel = 1
EndIf
If tmpCmd\typ = 3 Then
If tmpCmd\del = 0 Then
WriteByte( UDP_ServerStream, UDP_CmdMsg )
WriteByte( UDP_ServerStream, 1 )
WriteInt( UDP_ServerStream, UDP_PlayerID )
WriteInt( UDP_ServerStream, tmpCmd\ID )
WriteInt( UDP_ServerStream, tmpCmd\info\ID )
WriteInt( UDP_ServerStream, tmpCmd\toID )
For i = 0 To tmpCmd\MaxParameter
Select tmpCmd\info\parameter[i]
Case 0 : WriteInt( UDP_ServerStream, tmpCmd\parameter[i] )
Case 1 : WriteFloat( UDP_ServerStream, tmpCmd\parameter[i] )
Case 2 : WriteString( UDP_ServerStream, tmpCmd\parameter[i] )
Case 3 : WriteByte( UDP_ServerStream, tmpCmd\parameter[i] )
Case 4 : WriteShort( UDP_ServerStream, tmpCmd\parameter[i] )
Case 5
tmpBankSize = BankSize( tmpCmd\parameter[ i ] )
WriteInt( UDP_ServerStream, tmpBankSize )
For j = 0 To tmpBankSize-1
WriteByte( UDP_ServerStream, PeekByte( tmpCmd\Parameter[ i ], j ) )
Next
End Select
Next
SendUDPMsg( UDP_ServerStream, UDP_ServerIP, UDP_ServerPort )
tmpCmd\del = 1
tmpCmd\sendms = MilliSecs()
Else
tmpPing = 512
If UDP_ServerClient <> Null Then
tmpPing = UDP_ServerClient\Ping * 4
If tmpPing < 64 tmpPing = 64
EndIf
If MilliSecs()-tmpCmd\sendms > tmpPing Then
tmpCmd\del = 0
tmpCmd\send = tmpCmd\send + 1
If tmpCmd\send > 3 Then tmpDel = 1
EndIf
EndIf
EndIf
If tmpDel = 1 Then Delete tmpCmd
Next
EndIf
EndIf
End Function
Function UDP_AddCmd( tmpParameterList$ )
tmpID = 1
For tmpCmdAll.UDP_Cmd = Each UDP_Cmd
If tmpCmdAll\typ = 0 And tmpCmdAll\ID => tmpID Then tmpID = tmpCmdAll\ID + 1
Next
tmpCmd.UDP_Cmd = New UDP_Cmd
tmpCmd\ID = tmpID
tmpCmd\typ = 0
;String Parsen
If Not ( Mid( tmpParameterList$, Len( tmpParameterList$ ), 1 ) = ",") Then tmpParameterList$ = tmpParameterList$ + ","
tmpParameterList$ = Replace( Trim( Lower( tmpParameterList$ ) ), " ", "" )
tmpCount = -1
Repeat
tmpKomma = Instr( tmpParameterList$, "," )
If tmpKomma <> 0
tmpParameter$ = Mid( tmpParameterList$, 1, tmpKomma-1 )
tmpCount = tmpCount + 1
Select tmpParameter$
Case "int" : tmpCmd\parameter[ tmpCount ] = 0
Case "float" : tmpCmd\parameter[ tmpCount ] = 1
Case "string" : tmpCmd\parameter[ tmpCount ] = 2
Case "byte" : tmpCmd\parameter[ tmpCount ] = 3
Case "short" : tmpCmd\parameter[ tmpCount ] = 4
Case "bank" : tmpCmd\parameter[ tmpCount ] = 5
End Select
tmpParameterList$ = Mid( tmpParameterList$, tmpKomma+1, Len( tmpParameterList ) )
EndIf
Until tmpKomma = 0 Or tmpCount = UDP_MaxParameter
tmpCmd\MaxParameter = tmpCount
Return Handle( tmpCmd )
End Function
Function UDP_SendCmd( tmpCmdHandle, tmpParameterList$, tmpSafety=0, tmpToID=-1 )
Local tmpCmdOb.UDP_Cmd = Object.UDP_Cmd( tmpCmdHandle )
Local tmpKomma = 0, tmpKomma2 = 0
Local tmpCmd.UDP_Cmd = Null
If tmpCmdOb\MaxParameter > 0 Then
If Not ( Mid( tmpParameterList$, Len( tmpParameterList$ ), 1 ) = ",") Then tmpParameterList$ = tmpParameterList$ + ","
For i = 0 To tmpCmdOb\MaxParameter
tmpPlus = 0
If tmpCmdOb\Parameter[ i ] <> 2 Then
tmpKomma2 = Instr( tmpParameterList$, ",", tmpKomma+1 )
Else
tmp34_1 = Instr( tmpParameterList$, Chr(34), tmpKomma+1 )
tmp34_2 = Instr( tmpParameterList$, Chr(34), tmp34_1+1 )
If tmp34_1 <> 0 And tmp34_2 <> 0 Then
tmpKomma = tmp34_1
tmpKomma2 = tmp34_2
tmpPlus = 1
Else
tmpKomma2 = Instr( tmpParameterList$, ",", tmpKomma+1 )
EndIf
EndIf
tmpParameter$ = Mid( tmpParameterList$, tmpKomma+1 , tmpKomma2 - tmpKomma - 1 )
tmpKomma = tmpKomma2 + tmpPlus
UDP_tmpParameter$( i ) = tmpParameter
Next
Else
UDP_tmpParameter$( 0 ) = tmpParameterList$
EndIf
If tmpSafety = 0 Then
tmpCmd.UDP_Cmd = New UDP_Cmd
tmpCmd\info = tmpCmdOb
tmpCmd\typ = 1
tmpCmd\ID = tmpCmdOb\ID
tmpCmd\FromID = UDP_PlayerID
tmpCmd\ToID = tmpToID
If tmpCmd\toID > 0 And tmpCmd\toID <= UDP_MaxPlayers Then
If UDP_ClientInfo( tmpCmd\toID ) = Null Or tmpCmd\toID = UDP_PlayerID Then tmpCmd\toID = -1
ElseIf tmpCmd\toID < 0 Or tmpCmd\toID > UDP_MaxPlayers
tmpCmd\toID = -1
EndIf
;String übergeben
For i = 0 To tmpCmd\info\MaxParameter
tmpCmd\Parameter[ i ] = UDP_TmpParameter$( i )
Next
tmpCmd\MaxParameter = tmpCmd\info\MaxParameter
Else
If UDP_Host = 1
For tmpClient.UDP_Client = Each UDP_Client
If ( ( tmpToID > 0 And tmpToID <= UDP_MaxPlayers ) And tmpClient\ID = tmpToID ) Or ( ( tmpToID <= 0 Or tmpToID > UDP_MaxPlayers ) And tmpClient <> UDP_Player ) Then
tmpCmd.UDP_Cmd = New UDP_Cmd
tmpCmd\info = tmpCmdOb
tmpCmd\typ = 3
tmpCmd\ID = UDP_MsgEntID
UDP_MsgEntID =( UDP_MsgEntID + 1 ) Mod 2147483647
tmpCmd\FromID = UDP_PlayerID
tmpCmd\ToID = tmpClient\ID
If tmpCmd\toID > 0 And tmpCmd\toID <= UDP_MaxPlayers Then
If UDP_ClientInfo( tmpCmd\toID ) = Null Or tmpCmd\toID = UDP_PlayerID Then tmpCmd\toID = -1
ElseIf tmpCmd\toID < 0 Or tmpCmd\toID > UDP_MaxPlayers
tmpCmd\toID = -1
EndIf
;String übergeben
For i = 0 To tmpCmd\info\MaxParameter
tmpCmd\Parameter[ i ] = UDP_TmpParameter$( i )
Next
tmpCmd\MaxParameter = tmpCmd\info\MaxParameter
EndIf
Next
Else
tmpCmdOb.UDP_Cmd = Object.UDP_Cmd( tmpCmdHandle )
tmpCmd.UDP_Cmd = New UDP_Cmd
tmpCmd\info = tmpCmdOb
tmpCmd\typ = 3
tmpCmd\ID = UDP_MsgEntID
UDP_MsgEntID =( UDP_MsgEntID + 1 ) Mod 2147483647
tmpCmd\FromID = UDP_PlayerID
tmpCmd\ToID = tmpToID
If tmpCmd\toID > 0 And tmpCmd\toID <= UDP_MaxPlayers Then
If UDP_ClientInfo( tmpCmd\toID ) = Null Or tmpCmd\toID = UDP_PlayerID Then tmpCmd\toID = -1
ElseIf tmpCmd\toID < 0 Or tmpCmd\toID > UDP_MaxPlayers
tmpCmd\toID = -1
EndIf
;String übergeben
For i = 0 To tmpCmd\info\MaxParameter
tmpCmd\Parameter[ i ] = UDP_TmpParameter$( i )
Next
tmpCmd\MaxParameter = tmpCmd\info\MaxParameter
EndIf
EndIf
End Function
Function UDP_RecvCmd( )
For tmpCmd.UDP_Cmd = Each UDP_Cmd
If tmpCmd\typ = 2 Then
tmpCmdOb.UDP_Cmd = Object.UDP_Cmd( UDP_CmdID )
For i = 0 To tmpCmd\MaxParameter
If tmpCmdOb <> Null Then
If tmpCmdOb\Parameter[ i ] = 5 Then
FreeBank( UDP_CmdParameter( i ) )
UDP_CmdParameter( i ) = 0
EndIf
EndIf
UDP_CmdParameter( i ) = tmpCmd\Parameter[ i ]
Next
UDP_CmdID = Handle( tmpCmd\info )
UDP_CmdMaxParameter = tmpCmd\MaxParameter
UDP_CmdFromID = tmpCmd\FromID
Delete tmpCmd
Return 1
EndIf
Next
Return 0
End Function
Function UDP_End( )
If UDP_Host = 1 Then
If UDP_Connected = 1
For tmpClient.UDP_Client = Each UDP_Client
If tmpClient <> UDP_Player Then
WriteByte( tmpClient\Stream, UDP_EndMsg )
WriteInt( tmpClient\Stream, 0 )
SendUDPMsg( tmpClient\Stream, tmpClient\IP, tmpClient\Port )
If tmpClient\stream <> UDP_Stream Then CloseUDPStream( tmpClient\stream )
Delete tmpClient.UDP_Client
EndIf
Next
CloseUDPStream( UDP_Stream )
EndIf
Else
If UDP_Connected = 1
If UDP_ServerPing < 64 Then UDP_ServerPing = 64
For i = 1 To 5
WriteByte( UDP_ServerStream, UDP_EndMsg )
WriteInt( UDP_ServerStream, UDP_PlayerID )
SendUDPMsg( UDP_ServerStream, UDP_ServerIP, UDP_ServerPort )
ms = MilliSecs()
tmpGet = 0
Repeat
If RecvUDPMsg( UDP_Stream ) Then
byte = ReadByte( UDP_Stream )
If byte = UDP_End Then
tmpID = ReadInt( UDP_Stream )
If tmpID = UDP_PlayerID Then tmpGet = 1 : Exit
EndIf
EndIf
Until ms <= MilliSecs() - UDP_ServerPing
If tmpGet = 1 Then Exit
Next
If UDP_ServerStream <> UDP_Stream Then CloseUDPStream( UDP_ServerStream )
CloseUDPStream( UDP_Stream )
Delete Each UDP_Client
EndIf
EndIf
End Function
Function UDP_GetEvent( )
tmpEvent.UDP_Event = First UDP_Event
If tmpEvent = Null Then Return 0
UDP_EventID = tmpEvent\Event
UDP_EventData = tmpEvent\EventData$
UDP_EventMsg = tmpEvent\EventMsg$
UDP_EventMsg2$ = tmpEvent\EventMsg2$
Delete tmpEvent
Return 1
End Function
Function UDP_KickPlayer( tmpPlayerID$, tmpReason$="" )
If UDP_Host = 0 Return
tmpID = 0
If Int( tmpPlayerID ) = tmpPlayerID Then
tmpGet = 0
For tmpClient.UDP_Client = Each UDP_Client
If Int( tmpPlayerID ) = tmpClient\ID Then tmpID = tmpClient\ID : Exit
If Int( tmpPlayerID ) = tmpClient\IP Then
UDP_KickPlayer( tmpClient\ID, tmpReason$ )
tmpGet = 1
EndIf
Next
If tmpGet = 1 Then Return
Else
For tmpClient.UDP_Client = Each UDP_Client
If tmpClient\IP = UDP_IntIP( tmpPlayerID ) Then
UDP_KickPlayer( tmpClient\ID, tmpReason$ )
EndIf
Next
Return
EndIf
If tmpID = 0 Return
For tmpClient.UDP_Client = Each UDP_Client
If tmpClient <> UDP_Player Then
WriteByte( tmpClient\stream, UDP_KickMsg )
WriteInt( tmpClient\stream, tmpID )
WriteString( tmpClient\stream, tmpReason )
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\Port )
EndIf
Next
If UDP_ClientInfo( tmpID ) <> Null
UDP_ClientInfo( tmpID )\kick = 1
EndIf
tmpEvent.UDP_Event = New UDP_Event
tmpEvent\Event = UDP_EventPlayerKicked
tmpEvent\EventData$ = tmpID
tmpEvent\EventMsg$ = tmpReason
End Function
Function UDP_BannPlayer( tmpPlayerID$, tmpTime=0, tmpReason$="" )
If UDP_Host = 0 Return
If Int( tmpPlayerID ) = tmpPlayerID Then
tmpIP = 0
tmpID = 0
For tmpClient.UDP_Client = Each UDP_Client
If Int( tmpPlayerID ) = tmpClient\ID Then
tmpIP = tmpClient\IP
tmpID = tmpClient\ID
Exit
EndIf
If Int( tmpPlayerID ) = tmpClient\IP Then
UDP_BannPlayer( tmpClient\ID, tmpTime, tmpReason$ )
EndIf
Next
If tmpIP = 0 Return
tmpGetBann = 0
For tmpBanCheck.UDP_Ban = Each UDP_Ban
If tmpBanCheck\IP = tmpIP Then
tmpBanCheck\time = tmpTime
tmpBanCheck\ms = MilliSecs()
tmpGetBann = 1
EndIf
Next
If tmpGetBann = 0
tmpBan.UDP_ban = New UDP_Ban
tmpBan\IP = tmpIP
tmpBan\time = tmpTime
If tmpBan\Time < 0 Then tmpBan\time = 0 : Else : tmpBan\ms = MilliSecs()
tmpBan\reason = tmpReason
EndIf
If UDP_ClientInfo( tmpID ) <> Null
UDP_ClientInfo( tmpID )\kick = 1
EndIf
For tmpClient.UDP_Client = Each UDP_Client
If tmpClient <> UDP_Player Then
WriteByte( tmpClient\stream, UDP_BannMsg )
WriteInt( tmpClient\stream, tmpID )
WriteInt( tmpClient\stream, tmpTime )
WriteString( tmpClient\stream, tmpReason$ )
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\Port )
EndIf
Next
tmpEvent.UDP_Event = New UDP_Event
tmpEvent\Event = Event_PlayerBanned
tmpEvent\EventData = tmpID
tmpEvent\EventMsg$ = tmpReason
tmpEvent\EventMsg2$ = tmpTime
Else
tmpBan.UDP_ban = New UDP_Ban
tmpBan\IP = UDP_IntIP( tmpPlayerID )
tmpBan\time = tmpTime
If tmpBan\Time < 0 Then tmpBan\time = 0 : Else : tmpBan\ms = MilliSecs()
tmpBan\reason = tmpReason
For tmpClient.UDP_Client = Each UDP_Client
If tmpClient\IP = UDP_IntIP( tmpPlayerID ) Then
UDP_BannPlayer( tmpClient\ID, tmpTime, tmpReason$ )
EndIf
Next
EndIf
End Function
Function UDP_ChangeName$( tmpNewName$ )
If UDP_Host = 1 Then
If UDP_ServerClient = Null Then Return
UDP_ServerClient\changename = 1
UDP_ServerClient\newname$ = tmpNewName$
Else
UDP_ChangeName = 1
UDP_NewName$ = tmpNewName$
EndIf
End Function
Function UDP_ChangeHost( tmpNewHostID, tmpCmdHandle=-1, tmpParameterList$="" )
If UDP_Host = 0 Or UDP_Dediziert = 1 Then Return
If tmpNewHostID > 0 And tmpNewHostID <= UDP_MaxPlayers Then
If UDP_ClientInfo( tmpNewHostID ) <> Null Then
tmpClient.UDP_Client = UDP_ClientInfo( tmpNewHostID )
WriteByte( tmpClient\stream, UDP_ChangeHostMsg )
WriteByte( tmpClient\stream, 1 )
WriteByte( tmpClient\stream, UDP_NetMode )
If tmpCmdHandle > -1 Then
WriteByte( tmpClient\stream, 1 )
Local tmpCmdOb.UDP_Cmd = Object.UDP_Cmd( tmpCmdHandle )
Local tmpKomma = 0, tmpKomma2 = 0
Local tmpCmd.UDP_Cmd = Null
If tmpCmdOb\MaxParameter > 0 Then
If Not ( Mid( tmpParameterList$, Len( tmpParameterList$ ), 1 ) = ",") Then tmpParameterList$ = tmpParameterList$ + ","
For i = 0 To tmpCmdOb\MaxParameter
tmpPlus = 0
If tmpCmdOb\Parameter[ i ] <> 2 Then
tmpKomma2 = Instr( tmpParameterList$, ",", tmpKomma+1 )
Else
tmp34_1 = Instr( tmpParameterList$, Chr(34), tmpKomma+1 )
tmp34_2 = Instr( tmpParameterList$, Chr(34), tmp34_1+1 )
If tmp34_1 <> 0 And tmp34_2 <> 0 Then
tmpKomma = tmp34_1
tmpKomma2 = tmp34_2
tmpPlus = 1
Else
tmpKomma2 = Instr( tmpParameterList$, ",", tmpKomma+1 )
EndIf
EndIf
tmpParameter$ = Mid( tmpParameterList$, tmpKomma+1 , tmpKomma2 - tmpKomma - 1 )
tmpKomma = tmpKomma2 + tmpPlus
UDP_tmpParameter$( i ) = tmpParameter
Next
Else
UDP_tmpParameter$( 0 ) = tmpParameterList$
EndIf
WriteInt( tmpClient\stream, tmpCmdOb\ID )
For i = 0 To tmpCmdOb\MaxParameter
Select tmpCmdOb\parameter[i]
Case 0 : WriteInt( tmpClient\stream, UDP_tmpParameter( i ) )
Case 1 : WriteFloat( tmpClient\stream, UDP_tmpParameter( i ) )
Case 2 : WriteString( tmpClient\stream, UDP_tmpParameter( i ) )
Case 3 : WriteByte( tmpClient\stream, UDP_tmpParameter( i ) )
Case 4 : WriteShort( tmpClient\stream, UDP_tmpParameter( i ) )
Case 5
tmpBankSize = BankSize( UDP_tmpParameter( i ) )
WriteInt( tmpClient\stream, tmpBankSize )
For j = 0 To tmpBankSize-1
WriteByte( tmpClient\stream, PeekByte( UDP_tmpParameter( i ), j ) )
Next
End Select
Next
Else
WriteByte( tmpClient\stream, 0 )
EndIf
SendUDPMsg( tmpClient\stream, tmpClient\IP, tmpClient\Port )
For tmpClientAll.UDP_Client = Each UDP_Client
If tmpClientAll\stream <> 0 Then
If tmpClientAll <> tmpClient Then
WriteByte( tmpClientAll\stream, UDP_ChangeHostMsg )
WriteByte( tmpClientAll\stream, 0 )
WriteInt( tmpClientAll\stream, tmpClient\ID )
SendUDPMsg( tmpClientAll\stream, tmpClientAll\IP, tmpClientAll\Port )
EndIf
If tmpClientAll\stream <> UDP_Stream Then CloseUDPStream( tmpClientAll\stream )
EndIf
tmpClientAll\waitping = 0
Next
tmpClient\host = 1
UDP_Player\host = 0
UDP_ServerPort = tmpClient\port
UDP_ServerIP = tmpClient\IP
UDP_ServerClient = tmpClient
UDP_Host = 0
UDP_Connect = 1
UDP_Connected = 0
UDP_ServerID = tmpClient\ID
UDP_ChangeHostConnect = 1
UDP_ServerStream = UDP_Stream
If UDP_NetMode = UDP_LanGame Then UDP_ServerStream = CreateUDPStream( )
EndIf
EndIf
End Function
Function UDP_CountServer( tmpNetMode = UDP_LanGame, tmpServerPort = 8000 )
UDP_Stream = CreateUDPStream( )
UDP_Connect = 2
UDP_ServerIP = UDP_IntIP( UDP_BroadcastIP$() )
UDP_ServerPort = tmpServerPort
WriteByte( UDP_Stream, UDP_GetInformationMsg )
SendUDPMsg( UDP_Stream, UDP_ServerIP, tmpServerPort )
UDP_ServerGlobalPing = MilliSecs()
End Function
Function UDP_AddServerFile( tmpFileName$ )
If UDP_Host = 1 Then
tmpFileTyp = FileType( tmpFileName$ )
If tmpFileTyp = 1 Then
If FileSize( tmpFileName$ ) < 2147483647 Then
UDP_ServerFileID = ( UDP_ServerFileID + 1 )
tmpFile.UDP_ServerFile = New UDP_ServerFile
tmpFile\filename$ = tmpFileName$
tmpFile\size = FileSize( tmpFile\filename$ )
tmpFile\ID = UDP_ServerFileID
tmpFile\transfer = 0
UDP_SendServerFiles = 1
EndIf
ElseIf tmpFileTyp = 2 Then
tmpDir = ReadDir( tmpFileName$ )
If Right( tmpFilename$, 1 ) = "\" Then tmpFilename = Mid( tmpFilename$, 1, Len( tmpFilename$ ) - 1 )
NextFile( tmpDir ) : NextFile( tmpDir )
file$ = NextFile( tmpDir )
While file$ <> ""
UDP_AddServerFile( tmpFilename$ + "\" + file$ )
file$ = NextFile( tmpDir )
Wend
EndIf
EndIf
End Function
Function UDP_CreateFile( tmpPath$, tmpDir$ = "" )
tmpPath$ = Replace( tmpPath$, "/", "\" )
If Instr( tmpPath$, "\" ) > 0 Then
tmp_Dir$ = Mid( tmpPath$, 1, Instr( tmpPath$, "\" )-1 )
tmpNewDir$ = CurrentDir() + tmpDir$ + tmp_Dir$
;DebugLog tmpNewDir$
If FileType( tmpNewDir ) = 0 Then
CreateDir( tmpNewDir$ )
EndIf
tmpNewPath$ = Mid( tmpPath$, Instr( tmpPath$, "\" )+1, Len( tmpPath$ ) )
If tmpDir$ <> "" Then
If Right(tmpDir, 1) = "\" Then tmpDir = Mid(tmpDir, 1, Len(tmpDir) - 1 )
If Right(tmp_Dir, 1) = "\" Then tmp_Dir = Mid(tmp_Dir, 1, Len(tmp_Dir) - 1 )
tmpOldPath$ = tmpdir$ + "\" + tmp_Dir$ + "\"
Else
tmpOldPath$ = tmp_Dir$ + "\"
EndIf
tmpDat = UDP_CreateFile( tmpNewPath$, tmpOldPath$ )
Return tmpDat
Else
tmpDat = WriteFile( tmpDir$ + tmpPath$ )
Return tmpDat
EndIf
End Function
Function UDP_ReConnect( )
If UDP_Host = 1 Then
For tmpClient.UDP_Client = Each UDP_Client
tmpClient\recon = 1
tmpClient\reconms = 0
Next
Else
UDP_End()
UDP_Stream = CreateUDPStream( )
UDP_Connected = 0
UDP_Connect = 1
EndIf
End Function
Function UDP_BroadcastIP$()
CountHostIPs("")
Local IP$ = DottedIP(HostIP(1))
Local Subnetmask$ = "255.255.255.0"
Local IPDigits[3], SubnetDigits[3]
Local pos, i
For i = 0 To 3
pos = Instr( IP$, "." )
If pos > 0 Then
IPDigits[i] = Left( IP$, pos -1 )
IP$ = Mid( IP$, pos +1 )
Else
IPDigits[i] = IP$
EndIf
Next
For i = 0 To 3
pos = Instr( Subnetmask$, "." )
If pos > 0 Then
SubnetDigits[i] = Left( Subnetmask$, pos -1 ) Xor $FF
Subnetmask$ = Mid( Subnetmask$, pos +1 )
Else
SubnetDigits[i] = Subnetmask$ Xor $FF
EndIf
Next
For i = 0 To 3
IPDigits[i] = IPDigits[i] Or SubnetDigits[i]
Next
Return IPDigits[0] +"." +IPDigits[1] +"." +IPDigits[2] +"." +IPDigits[3]
End Function
Function UDP_IntIP( IP$ )
If Instr( IP$, "." )<>0 Then a1 = Int( Left( IP$, Instr( IP$, "." )-1 ) ) : IP$ = Right( IP$, Len( IP$ ) - Instr( IP$, "." ) )
If Instr( IP$, "." )<>0 Then a2 = Int( Left( IP$, Instr( IP$, "." )-1 ) ) : IP$ = Right( IP$, Len( IP$ ) - Instr( IP$, "." ) )
If Instr( IP$, "." )<>0 Then a3 = Int( Left( IP$, Instr( IP$, "." )-1 ) ) : IP$ = Right( IP$, Len( IP$ ) - Instr( IP$, "." ) )
a4 = Int( IP$ )
Return ( a1 Shl 24 ) + ( a2 Shl 16 ) + ( a3 Shl 8 ) + a4
End Function |
Comments
| ||
| Link is dead :( |
| ||
| Check here for info: http://www.blitzforum.de/forum/viewtopic.php?p=410348#410348 And then go down a few post for the download of SimpleUDP 3.0 including the Masterserver(or click on the same link here): http://www.blitzforum.de/upload/file.php?id=12554 (If German is not in your skill set then use Google Translate for the Readme.txt file..) |
Code Archives Forum