SimpleUDP - NetzwerkLib 1.25

Übersicht BlitzBasic Codearchiv

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

ToeB

Betreff: SimpleUDP - NetzwerkLib 1.25

BeitragFr, Aug 07, 2009 23:16
Antworten mit Zitat
Benutzer-Profile anzeigen
So ich habe schonmal eine Version von meiner Netztwerklib, die Alle Grundfunctionen beinhaltet, die man für Netzwerkspiele Braucht. Also Hosten,Joinen,Update,NAchrichten senden, Server Suchen, SPieler Kicken.

Die Beschreibung und ein Tutorial ist in der ReadMe.txt (Bitte lesen !)

Hier die Lib :

Code: [AUSKLAPPEN]



Const UDP_ServerPort = 8000
Const UDP_PingTime = 1000

Const UDP_Msg_nom = 1
Const UDP_Msg_new = 2
Const UDP_Msg_not = 3
Const UDP_Msg_pg1 = 4
Const UDP_Msg_pg2 = 5
Const UDP_Msg_kik = 6
Const UDP_Msg_end = 7
Const UDP_Msg_ask = 8
Const UDP_Msg_att = 9
Const UDP_Msg_at2 = 10
Const UDP_Msg_nam = 11
Const UDP_Msg_snc = 12
Const UDP_Msg_ban = 13

Const UDP_CommandSign$ = "§"
Const UDP_EnCodeNumber = 4


Global UDP_Server,UDP_ServerStream,UDP_ServerName$
Global UDP_ServerMsg$
Global UDP_ServerPass$
Global UDP_PingMS
Global UDP_PlayerNumber,UDP_PlayerID
Global UDP_CommandLine$ = ""
Global UDP_Command$,UDP_ParameterNumber
Global UDP_SendNewMsg = 0,UDP_RecvMsg = 0
Global UDP_MsgID
Global UDP_EventID,UDP_EventMsg$
Global UDP_Player_ChangeName
Global UDP_BanTime

Global UDP_PingTimeOut = 10000


Dim UDP_Player_Online(0),UDP_Player_Stream(0),UDP_Player_IP(0),UDP_Player_Port(0),UDP_Player_Name$(0)
Dim UDP_Player_local(0)
Dim UDP_Player_TMsg.UDP_Msg(0),UDP_Player_SendNewMsg(0),UDP_Player_RecvMsg(0)
Dim UDP_Player_Ping(0),UDP_Player_PingMs(0)
Dim UDP_Player_Event(0)

Dim UDP_Parameter$(0)

Dim UDP_Servertmp_name$(0)
Dim UDP_Servertmp_ip$(0)
Dim UDP_Servertmp_port(0)
Dim UDP_Servertmp_pl1(0)
Dim UDP_Servertmp_pl2(0)
Dim UDP_Servertmp_msg$(0)
Dim UDP_Servertmp_pass(0)
Dim UDP_Server_name$(0)
Dim UDP_Server_ip$(0)
Dim UDP_Server_port(0)
Dim UDP_Server_pl1(0)
Dim UDP_Server_pl2(0)
Dim UDP_Server_msg$(0)
Dim UDP_Server_pass(0)


Type UDP_Msg
   Field msg$
   Field ms
   Field ID
   Field From
   Field it
End Type

Type UDP_RecvMsg
   Field msg$
   Field From
   Field att
End Type 

Type UDP_Event
   Field typ
   Field ID
   Field msg$
End Type

Type UDP_Ban
   Field IP$
   Field time,ms
End Type




;----------



Function UDP_HostGame(GameName$,PlayerName$,PlayerNumber=1)
   UDP_Server = 1
   UDP_ServerStream = CreateUDPStream(UDP_ServerPort)
   UDP_NewPlayerNumber(PlayerNumber)
   UDP_PlayerID = 0
   UDP_ServerName = GameName
   UDP_Player_Online(0) = 1
   If PlayerName <> "" Then
      UDP_Player_Name$(0) = PlayerName$
   Else
      UDP_Player_Name$(0) = "unnamed"
   EndIf
   dat = ReadFile("Banlist.ban")
   If dat <> 0
      While Not Eof(dat)
         newban.UDP_ban = New UDP_ban
         newban\IP$ = ReadLine(dat)
         DebugLog newban\IP$
      Wend
   EndIf
   Return (UDP_ServerStream <> 0)
End Function 

Function UDP_JoinGame(GameIP$,PlayerName$,ServerPass$="",WaitTime=100)
   UDP_Server = 0
   If Instr(GameIp,":") > 0 Then GameIp = Mid(GameIP,1,Instr(GameIP,":")-1)
   If Instr(GameIp,".") > 0 Then GameIP = UDP_IntIP(GameIP)
   UDP_ServerStream = CreateUDPStream()
   If UDP_ServerStream = 0 Then Return 0
   If PlayerNAme$ = "" Then PlayerName$ = "unnamed"
   WriteByte(UDP_ServerStream,UDP_Msg_new)   
   WriteString(UDP_ServerStream,PlayerName$)
   WriteString(UDP_ServerStream,UDP_Encode(ServerPass))
   SendUDPMsg(UDP_ServerStream,GameIP,UDP_ServerPort)
   Connection = 0
   WaitMs = MilliSecs() + WaitTime
   While WaitMs > MilliSecs()
      If RecvUDPMsg(UDP_ServerStream) Then
         byte = ReadByte(UDP_ServerStream)
         If byte = UDP_Msg_new Then
            If UDPMsgIP(UDP_ServerStream) = GameIP Then
               UDP_PlayerID = ReadInt(UDP_ServerStream)
               UDP_PlayerNumber = ReadInt(UDP_ServerStream)
               UDP_NewPlayerNumber(UDP_PlayerNumber)
               UDP_Player_Port(0) = UDP_ServerPort
               UDP_Player_IP(0) = GameIP
               UDP_ServerMsg$ = ReadString(UDP_ServerStream)
               While Not Eof(UDP_ServerStream)
                  TmpPlayerID = ReadInt(UDP_ServerStream)
                  UDP_Player_Online(tmpPlayerID) = 1
                  UDP_Player_Name$(tmpPlayerID) = ReadString(UDP_ServerStream)
                  UDP_Player_Local(tmpPlayerID) = ReadByte(UDP_ServerStream)
                  tmpe.UDP_Event = New UDP_Event
                  tmpe\typ = UDP_Msg_New
                  tmpe\ID = tmpPlayerID
               Wend
               UDP_Player_Online(UDP_PlayerID) = 1
               UDP_Player_Name$(UDP_PlayerID) = PlayerName$
               Connection = 1
               Exit
            EndIf
         EndIf
         If byte = UDP_Msg_ban Then
            Connection = UDP_Msg_ban
            UDP_BanTime = ReadInt(UDP_ServerStream)
         EndIf
      EndIf 
   Wend
   If Connection Then UDP_Player_Stream(0) = CreateUDPStream()
   If UDP_Player_Stream(0) = 0 Then Return 0
   Return Connection
End Function 


Function UDP_Update(LoginBlock=0)
   If UDP_Server = 1 Then
      For i = 1 To UDP_PlayerNumber
         If UDP_Player_Online(i) = 1 Then
            If UDP_Player_SendNewMsg(i) = 1 Then
               get = 0
               tmp.UDP_Msg = Null
               For tmp_.UDP_Msg = Each UDP_Msg
                  If tmp_\ID = i Then tmp = tmp_ : Exit
               Next
               If tmp <> Null Then
                  WriteByte(UDP_Player_Stream(i),UDP_Msg_Att)
                  WriteInt(UDP_Player_Stream(i),tmp\From)
                  WriteString(UDP_Player_Stream(i),tmp\msg)
                  SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
                  tmp\ms = MilliSecs()
                  UDP_Player_SendNewMsg(i) = 0
                  UDP_Player_TMsg(i) = tmp
                  UDP_Player_RecvMsg(i) = 1
               Else
                  UDP_Player_SendNewMsg(i) = 0
                  UDP_Player_RecvMsg(i) = 0
               EndIf
            EndIf
            If UDP_Player_RecvMsg(i) = 1 Then
               tmp.UDP_Msg = UDP_Player_TMsg(i)
               If tmp\ms <= MilliSecs() - 64 Then
                  WriteByte(UDP_Player_Stream(i),UDP_Msg_Att)
                  WriteInt(UDP_Player_Stream(i),tmp\From)
                  WriteString(UDP_Player_Stream(i),tmp\msg)
                  SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
                  tmp\it = tmp\it + 1                  
                  tmp\ms = MilliSecs()
                  If tmp\it => 16 Then
                     Delete tmp
                     UDP_Player_SendNewMsg(i) = 1
                     UDP_Player_RecvMsg(i) = 0
                  EndIf
               EndIf
            EndIf
         Else
            For tmp.UDP_Msg = Each UDP_Msg
               If tmp\ID = i Then Delete tmp
            Next
            UDP_Player_SendNewMsg(i) = 0
            UDP_Player_RecvMsg(i) = 0
         EndIf
      Next
      For ban.UDP_Ban = Each UDP_ban
         If ban\time > 0 Then
            If MilliSecs()-ban\ms => ban\time Then
               Delete ban
            EndIf
         EndIf
      Next
      If UDP_PingMs <= MilliSecs() Then
         For i = 1 To UDP_PlayerNumber
            If UDP_Player_Online(i) = 1 And UDP_Player_PingMs(i) = 0 And UDP_Player_Local(i) = 0 Then
               WriteByte(UDP_Player_Stream(i),UDP_Msg_pg1)
               For j = 1 To UDP_PlayerNumber
                  If UDP_Player_Online(j) = 1 Then
                     WriteInt(UDP_Player_Stream(i),j)
                     WriteInt(UDP_Player_Stream(i),UDP_PLayer_Ping(j))
                  EndIf
               Next
               SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
               UDP_Player_PingMs(i) = MilliSecs()
            EndIf
         Next
         UDP_PingMs = MilliSecs() + UDP_PingTime
      EndIf
      For i = 0 To UDP_PlayerNumber
         If UDP_Player_Online(i) = 1 And UDP_Player_Local(i) = 0 Then
            If i > 0 Then
               If UDP_Player_PingMs(i) > 0 Then
                  If (MilliSecs()-UDP_Player_PingMs(i)) > UDP_PingTimeOut Then
                     UDP_KickPlayer(i)
                  EndIf
               EndIf
            EndIf             
         EndIf
      Next       
      While RecvUDPMsg(UDP_ServerStream)
         byte = ReadByte(UDP_ServerStream)
         Select byte
         Case UDP_Msg_nom
            TmpID = ReadInt(UDP_ServerStream)
            ToID = ReadInt(UDP_serverStream)
            If ToID = -1 Or ToID = 0 Then
               tmpr.UDP_RecvMsg = New UDP_RecvMsg
               tmpr\msg = ReadString(UDP_serverStream)
               tmpr\From = TmpID
               tmpr\att = 0
               If toID = -1 Then
                  For i = 1 To UDP_PlayerNumber
                     If UDP_Player_Online(i) = 1 And i <> TmpID Then
                        WriteByte(UDP_Player_Stream(i),UDP_Msg_nom)
                        WriteInt(UDP_Player_Stream(i),TmpID)
                        WriteString(UDP_Player_stream(i),tmpr\msg)
                        SendUDPMsg(UDP_Player_stream(i),UDP_Player_IP(i),UDP_player_Port(i))
                     EndIf
                  Next
               EndIf
            Else
               WriteByte(UDP_Player_Stream(ToID),UDP_Msg_nom)
               WriteInt(UDP_Player_Stream(ToID),TmpID)
               WriteString(UDP_Player_stream(ToID),tmpr\msg)
               SendUDPMsg(UDP_Player_stream(toID),UDP_Player_IP(ToID),UDP_player_Port(toID))
            EndIf
         Case UDP_Msg_new
            place = UDP_GetFreePlace()
            New_Name$ = ReadString(UDP_ServerStream)
            New_Pass$ = ReadString(UDP_ServerStream)
            New_Port% = UDPMsgPort(UDP_ServerStream)
            New_IP%   = UDPMsgIP(UDP_ServerStream)
            New_Pass = UDP_DeCode(New_Pass)
            If LoginBlock = 0 And New_Pass = UDP_ServerPass Then
               If place > 0 Then      
                  banned.UDP_ban = Null
                  For ban.UDP_ban = Each UDP_ban
                     If ban\IP$ = DottedIP(New_IP) Then banned = ban : Exit
                  Next
                  If banned = Null      
                     player_accept = UDP_CreateNewPlayer(place,New_Name$,New_IP,New_Port)
                     If player_accept > 0 Then                  
                        WriteByte(UDP_Player_Stream(place),UDP_Msg_new)
                        WriteInt(UDP_Player_Stream(place),place)
                        WriteInt(UDP_Player_Stream(place),UDP_PlayerNumber)
                        WriteString(UDP_Player_Stream(place),UDP_ServerMsg$)
                        For i = 0 To UDP_PlayerNumber
                           If place <> i Then
                              If UDP_Player_Online(i) = 1 Then
                                 WriteInt(UDP_Player_Stream(place),i)
                                 WriteString(UDP_Player_Stream(place),UDP_Player_Name(i))
                                 WriteByte(UDP_Player_Stream(place),UDP_Player_Local(i))
                              EndIf
                           EndIf
                        Next
                        SendUDPMsg(UDP_Player_Stream(place),UDP_Player_IP(place),UDP_Player_Port(place))
                        For i = 1 To UDP_PlayerNumber
                           If UDP_Player_Online(i) = 1 And i <> place Then
                              WriteByte(UDP_Player_Stream(i),UDP_Msg_new)
                              WriteInt(UDP_Player_Stream(i),place)
                              WriteByte(UDP_Player_Stream(i),0)
                              WriteString(UDP_Player_Stream(i),UDP_Player_Name$(place))
                              SendUDPMsg(UDP_Player_Stream(i),UDP_PLayer_IP(i),UDP_Player_Port(i))
                           EndIf
                        Next
                        tmpe.UDP_Event = New UDP_Event
                        tmpe\typ = UDP_Msg_New
                        tmpe\ID = place
                        UDP_CheckNames()
                     EndIf
                  Else
                     If banned\time > 0 Then
                        MS = banned\time - (MilliSecs()-banned\ms)
                     Else
                        MS = 0
                     EndIf
                     WriteByte(UDP_ServerStream,UDP_Msg_ban)
                     WriteInt(UDP_ServerStream,MS)
                     SendUDPMsg(UDP_ServerStream,New_IP,New_Port)
                  EndIf
               EndIf
            EndIf
         Case UDP_Msg_pg1
            TmpID = ReadInt(UDP_ServerStream)
            If UDP_Player_Online(TmpID) = 1 Then
               UDP_Player_Ping(TmpID) = MilliSecs() - UDP_Player_PingMs(TmpID)
               UDP_Player_PingMs(TmpID) = 0
               WriteByte(UDP_Player_Stream(TmpID),UDP_Msg_pg2)
               SendUDPMsg(UDP_Player_Stream(TmpID),UDP_Player_IP(TmpID),UDP_PLayer_Port(TmpID))
            EndIf
         Case UDP_Msg_end
            TmpID = ReadInt(UDP_ServerStream)
            If UDP_Player_Online(TmpID) = 1 Then
               UDP_Player_Online(TmpID) = 0
               tmpe.UDP_Event = New UDP_Event
               tmpe\typ = UDP_Msg_end
               tmpe\ID = tmpID
               CloseUDPStream(UDP_Player_Stream(TmpID))
               For i = 1 To UDP_PLayerNumber
                  If UDP_PLayer_Online(i) = 1 Then
                     WriteByte(UDP_Player_Stream(i),UDP_Msg_End)
                     WriteInt(UDP_Player_Stream(i),TmpID)
                     SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
                  EndIf
               Next
            EndIf
         Case UDP_Msg_ask
            IP = UDPMsgIP(UDP_ServerStream)
            Port = UDPMsgPort(UDP_ServerStream)
            count = UDP_CountPlayers()
            WriteByte(UDP_ServerStream,UDP_Msg_ask)
            WriteString(UDP_ServerStream,UDP_ServerName$)
            WriteInt(UDP_ServerStream,count)
            WriteInt(UDP_ServerStream,UDP_PlayerNumber)
            WriteString(UDP_ServerStream,UDP_ServerMsg)
            WriteByte(UDP_ServerStream,(UDP_ServerPass<>""))
            SendUDPMsg(UDP_ServerStream,Ip,Port)
         Case UDP_Msg_att
            TmpID = ReadInt(UDP_ServerStream)
            toID = ReadInt(UDP_ServerStream)
            ;UDP_Player_Msg(TmpID) = ReadString(UDP_ServerStream)
            If toID = -1 Or ToID = 0 Then
               tmpr.UDP_RecvMsg = New UDP_RecvMsg
               tmpr\msg = ReadString(UDP_ServerStream)
               tmpr\From = TmpID
               tmpr\att = 1
               If tmpr\msg <> "" And toID = -1
                  WriteByte(UDP_Player_Stream(TmpID),UDP_Msg_at2)
                  SendUDPMsg(UDP_Player_Stream(TmpID),UDP_Player_IP(TmpID),UDP_Player_Port(TmpID))
                  For i = 1 To UDP_PlayerNumber
                     If UDP_Player_Online(i) = 1 And tmpID <> i Then
                        c = 0
                        For tmp.UDP_Msg = Each UDP_Msg
                           If tmp\ID = i Then c = 1 : Exit
                        Next
                        tmp.UDP_msg = New UDP_Msg
                        tmp\msg$ = tmpr\msg$
                        tmp\ms = MilliSecs()
                        tmp\ID = i
                        tmp\From = TmpID
                        If c = 0 Then UDP_Player_SendNewMsg(i) = 1
                        UDP_Player_TMsg(i) = tmp
                     EndIf
                  Next
               EndIf
            Else
               If tmpr\msg <> "" Then
                  WriteByte(UDP_Player_Stream(TmpID),UDP_Msg_at2)
                  SendUDPMsg(UDP_Player_Stream(TmpID),UDP_Player_IP(TmpID),UDP_Player_Port(TmpID))
                  c = 0
                  For tmp.UDP_Msg = Each UDP_Msg
                     If tmp\ID = toID Then c = 1 : Exit
                  Next
                  tmp.UDP_msg = New UDP_Msg
                  tmp\msg$ = tmpr\msg$
                  tmp\ms = MilliSecs()
                  tmp\ID = toID
                  tmp\From = TmpID
                  If c = 0 Then UDP_Player_SendNewMsg(toID) = 1
                  UDP_Player_TMsg(toID) = tmp
               EndIf
            EndIf
         Case UDP_Msg_at2
            TmpID = ReadInt(UDP_ServerStream)
            Delete UDP_Player_TMsg(tmpID)
            UDP_Player_SendNewMsg(TmpID) = 1
            UDP_Player_RecvMsg(TmpID) = 0
         Case UDP_Msg_nam
            tmpPlayerID = ReadInt(UDP_ServerStream)
            oldNam$ = UDP_Player_Name(tmpPlayerID)
            UDP_Player_Name(tmpPlayerID) = ReadString(UDP_ServerStream)
            UDP_Player_ChangeName = 1
            For i = 1 To UDP_PlayerNumber
               If UDP_Player_Online(i) = 1 And UDP_Player_Local(i) = 0 And i <> tmpPlayerID Then
                  WriteByte(UDP_Player_Stream(i),UDP_Msg_nam)
                  WriteInt(UDP_Player_Stream(i),tmpPlayerID)
                  WriteString(UDP_Player_Stream(i),UDP_Player_Name(tmpPlayerID))
                  SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
               EndIf
            Next
            tmpe.UDP_Event = New UDP_Event
            tmpe\typ = UDP_Msg_nam
            tmpe\ID = tmpPlayerID
            tmpe\msg = oldNam$
            UDP_CheckNames()
         End Select
      Wend
   ElseIf UDP_Server = 0
      If UDP_Player_SendNewMsg(0) = 1 Then
         tmp.UDP_Msg = First UDP_Msg
         If tmp <> Null Then
            WriteByte(UDP_Player_Stream(0),UDP_Msg_Att)
            WriteInt(UDP_Player_Stream(0),tmp\From)
            WriteInt(UDP_Player_Stream(i),tmp\ID)
            WriteString(UDP_Player_Stream(0),tmp\msg)
            SendUDPMsg(UDP_Player_Stream(0),UDP_Player_IP(0),UDP_Player_Port(0))
            tmp\ms = MilliSecs()
            UDP_Player_SendNewMsg(0) = 0
            UDP_Player_TMsg(0) = tmp
            UDP_Player_RecvMsg(0) = 1
         Else
            UDP_Player_SendNewMsg(0) = 0
            UDP_Player_RecvMsg(0) = 0
         EndIf
      EndIf
      If UDP_Player_RecvMsg(0) = 1 Then
         tmp.UDP_Msg = UDP_Player_TMsg(0)
         If tmp\ms <= MilliSecs() - 64 Then
            WriteByte(UDP_Player_Stream(0),UDP_Msg_Att)
            WriteInt(UDP_Player_Stream(0),tmp\From)
            WriteInt(UDP_Player_Stream(i),tmp\ID)
            WriteString(UDP_Player_Stream(0),tmp\msg)
            SendUDPMsg(UDP_Player_Stream(0),UDP_Player_IP(0),UDP_Player_Port(0))
            tmp\it = tmp\it + 1            
            tmp\ms = MilliSecs()
            If tmp\it => 16 Then
               Delete tmp
               UDP_Player_SendNewMsg(0) = 0
               UDP_Player_RecvMsg(0) = 0
            EndIf
         EndIf
      EndIf 
      While RecvUDPMsg(UDP_ServerStream)
         byte = ReadByte(UDP_ServerStream)
         Select byte
         Case UDP_Msg_nom
            TmpID = ReadInt(UDP_ServerStream)
            tmpr.UDP_RecvMsg = New UDP_RecvMsg
            tmpr\msg = ReadString(UDP_serverStream)
            tmpr\From = TmpID
            tmpr\att = 0
         Case UDP_Msg_new
            TmpPlayerID = ReadInt(UDP_ServerStream)
            LocalPlayer = ReadByte(UDP_serverStream)
            UDP_Player_Online(TmpPlayerID) = 1
            UDP_Player_Name$(TmpPlayerID) = ReadString(UDP_ServerStream)
            UDP_Player_Local(tmpPlayerID) = LocalPlayer
            tmpe.UDP_Event = New UDP_Event
            tmpe\typ = UDP_Msg_New
            tmpe\ID = tmpPlayerID
         Case UDP_Msg_pg1
            While Not Eof(UDP_ServerStream)
               TmpID = ReadInt(UDP_ServerStream)
               UDP_Player_Ping(TmpID) = ReadInt(UDP_ServerStream)
            Wend
            WriteByte(UDP_Player_Stream(0),UDP_Msg_pg1)
            WriteInt(UDP_Player_Stream(0),UDP_PlayerID)
            SendUDPMsg(UDP_Player_Stream(0),UDP_Player_IP(0),UDP_Player_Port(0))
            UDP_Player_pingms(0) = MilliSecs()
         Case UDP_Msg_pg2
            UDP_Player_ping(0) = MilliSecs() - UDP_Player_pingms(0)
         Case UDP_Msg_kik
            TmpID = ReadInt(UDP_ServerStream)
            UDP_Player_Online(TmpID) = 0
            tmpe.UDP_Event = New UDP_Event
            tmpe\typ = UDP_Msg_kik
            tmpe\ID = tmpID
         Case UDP_Msg_ban
            TmpID = ReadInt(UDP_ServerStream)
            UDP_Player_Online(TmpID) = 0
            tmpe.UDP_Event = New UDP_Event
            tmpe\typ = UDP_Msg_ban
            tmpe\ID = tmpID
            tmpe\msg = ReadInt(UDP_ServerStream)
         Case UDP_Msg_end
            TmpID = ReadInt(UDP_ServerStream)
            UDP_Player_Online(TmpID) = 0
            tmpe.UDP_Event = New UDP_Event
            tmpe\typ = UDP_Msg_end
            tmpe\ID = tmpID   
         Case UDP_Msg_att
            TmpID = ReadInt(UDP_ServerStream)
            tmpr.UDP_RecvMsg = New UDP_RecvMsg
            tmpr\msg = ReadString(UDP_serverStream)
            tmpr\From = TmpID
            tmpr\att = 1
            If tmpr\msg <> "" Then
               WriteByte(UDP_Player_Stream(0),UDP_Msg_at2)
               WriteInt(UDP_Player_Stream(0),UDP_PlayerID)
               SendUDPMsg(UDP_Player_Stream(0),UDP_Player_IP(0),UDP_player_Port(0))
            EndIf
         Case UDP_Msg_at2
            Delete UDP_Player_TMsg(0)
            UDP_Player_SendNewMsg(0) = 1
            UDP_Player_RecvMsg(0) = 0
         Case UDP_Msg_Nam,UDP_Msg_snc
            tmpPlayerID = ReadInt(UDP_ServerStream)
            oldNam$ = UDP_Player_Name(tmpPlayerID)
            UDP_Player_Name(tmpPlayerID) = ReadString(UDP_ServerStream)
            tmpe.UDP_Event = New UDP_Event
            tmpe\typ = byte
            tmpe\ID = tmpPlayerID
            tmpe\msg = oldNam$
         End Select
      Wend
   EndIf
End Function

Function UDP_SendMsg(Msg$,ID=-1)
   If UDP_Server = 1 Then
      If ID < 0 Or ID > UDP_PlayerNumber Then
         For i = 1 To UDP_PlayerNumber
            If UDP_Player_Online(i) = 1 And UDP_Player_local(i) = 0 Then
               WriteByte(UDP_Player_Stream(i),UDP_Msg_nom)
               WriteInt(UDP_Player_Stream(i),0)
               WriteString(UDP_Player_stream(i),Msg$)
               SendUDPMsg(UDP_Player_stream(i),UDP_Player_IP(i),UDP_player_Port(i))
            EndIf
         Next
      Else
         WriteByte(UDP_Player_Stream(ID),UDP_Msg_nom)
         WriteInt(UDP_Player_Stream(ID),0)
         WriteString(UDP_Player_stream(ID),Msg$)
         SendUDPMsg(UDP_Player_stream(ID),UDP_Player_IP(ID),UDP_player_Port(ID))
      EndIf
   Else
      If UDP_Player_Online(UDP_PlayerID) = 1 And UDP_Player_Online(0) = 1 Then
         If ID < 0 Or ID > UDP_PlayerNumber Then
            WriteByte(UDP_Player_Stream(0),UDP_Msg_nom)
            WriteInt(UDP_Player_Stream(0),UDP_PlayerID)
            WriteInt(UDP_Player_Stream(0),-1)
            WriteString(UDP_Player_stream(0),Msg$)
            SendUDPMsg(UDP_Player_stream(0),UDP_Player_IP(0),UDP_player_Port(0))
         Else
            WriteByte(UDP_Player_Stream(0),UDP_Msg_nom)
            WriteInt(UDP_Player_Stream(0),UDP_PlayerID)
            WriteInt(UDP_Player_Stream(0),ID)
            WriteString(UDP_Player_stream(0),Msg$)
            SendUDPMsg(UDP_Player_stream(0),UDP_Player_IP(0),UDP_player_Port(0))
         EndIf
      EndIf
   EndIf
End Function

Function UDP_SendMsg_Att(msg$,ID=-1)   
   If UDP_Server = 1 Then
      If ID < 0 Or ID > UDP_PlayerNumber Then
         For i = 1 To UDP_PlayerNumber
            If UDP_Player_Online(i) = 1 And UDP_Player_Local(i) = 0 Then
               c = 0
               For tmp.UDP_Msg = Each UDP_Msg
                  If tmp\ID = i   Then c = 1:Exit
               Next
               tmp.UDP_msg = New UDP_Msg
               tmp\msg$ = msg$
               tmp\ms = MilliSecs()
               tmp\ID = i
               tmp\From = 0
               If c = 0 Then UDP_Player_SendNewMsg(i) = 1
            EndIf
         Next
      Else
         c = 0
         For tmp.UDP_Msg = Each UDP_Msg
            If tmp\ID = ID Then c = 1:Exit
         Next
         tmp.UDP_msg = New UDP_Msg
         tmp\msg$ = msg$
         tmp\ms = MilliSecs()
         tmp\ID = ID
         tmp\From = 0
         If c = 0 Then UDP_Player_SendNewMsg(ID) = 1
      EndIf
   Else
      If UDP_Player_Online(UDP_PlayerID) = 1 And UDP_Player_Online(0) = 1 Then
         If ID < 0 Or ID > UDP_PlayerNumber Then
            c = 0
            For tmp.UDP_Msg = Each UDP_Msg
               If tmp\ID = 0 Then c = 1 : Exit
            Next
            tmp.UDP_msg = New UDP_Msg
            tmp\msg$ = msg$
            tmp\ms = MilliSecs()
            tmp\ID = -1   
            tmp\From = UDP_PlayerID
            If c = 0 Then UDP_Player_SendNewMsg(0) = 1 
         Else
            c = 0
            For tmp.UDP_Msg = Each UDP_Msg
               If tmp\ID = 0 Then c = 1 : Exit
            Next
            tmp.UDP_msg = New UDP_Msg
            tmp\msg$ = msg$
            tmp\ms = MilliSecs()
            tmp\ID = ID
            tmp\From = UDP_PlayerID
            If c = 0 Then UDP_Player_SendNewMsg(ID) = 1 
         EndIf
      EndIf
   EndIf    
End Function


Function UDP_SendLocalMsg(msg$,LocalID)
   If UDP_Server = 1 Then
      For i = 1 To UDP_PlayerNumber
         If UDP_Player_Online(i) = 1 And UDP_Player_local(i) = 0 Then
            WriteByte(UDP_Player_Stream(i),UDP_Msg_nom)
            WriteInt(UDP_Player_Stream(i),LocalID)
            WriteString(UDP_Player_stream(i),Msg$)
            SendUDPMsg(UDP_Player_stream(i),UDP_Player_IP(i),UDP_player_Port(i))
         EndIf
      Next
   EndIf
End Function


Function UDP_SendLocalMsg_att(msg$,LocalID)
   If UDP_Server = 1 Then
      For i = 1 To UDP_PlayerNumber
         If UDP_Player_Online(i) = 1 And UDP_Player_local(i) = 0 Then
            c = 0
            For tmp.UDP_Msg = Each UDP_Msg
               If tmp\ID = i Then c = 1:Exit
            Next
            tmp.UDP_msg = New UDP_Msg
            tmp\msg$ = msg$
            tmp\ms = MilliSecs()
            tmp\ID = i
            tmp\From = LocalID
            If c = 0 Then UDP_Player_SendNewMsg(i) = 1
         EndIf
      Next
   EndIf
End Function

Function UDP_GetMsg$()
   tmp.UDP_RecvMsg = First UDP_RecvMsg
   If tmp <> Null Then
      UDP_MsgID= tmp\From
      tmpMsg$ = tmp\msg
      Delete tmp
      Return tmpmsg$
   EndIf
   Return ""
End Function

Function UDP_KickPlayer(ID)
   If UDP_Server = 1 Then   
      For i = 1 To UDP_PlayerNumber
         If UDP_Player_Online(i) = 1 Then
            WriteByte(UDP_Player_Stream(i),UDP_Msg_Kik)
            WriteInt(UDP_Player_Stream(i),ID)
            SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
         EndIf
      Next
      UDP_Player_Online(ID) = 0         
      UDP_Player_Port(ID) = 0
      UDP_Player_IP(ID) = 0
      UDP_Player_PingMs(ID) = 0
      CloseUDPStream(UDP_Player_Stream(ID))
      tmp.UDP_Event = New UDP_Event
      tmp\typ = UDP_Msg_kik
      tmp\ID = ID      
   EndIf
End Function

Function UDP_BanPlayer(flag$,ms=0)
   If UDP_Server <> 1 Then Return
   Local banIP$ = ""
   Local banID = 0
   If DottedIP(UDP_IntIP(flag$)) = flag$ Then
      For i = 1 To Len(flag$)
         B$ = Mid(Flag$,i,1)
         count = count + 1
         If B$ = "." Then count = 0
         If count => 4 Exit
         banIP$ = banIP$ + B$
      Next
   ElseIf Int(flag$) = Flag$
      If flag$ => 1 And Flag$ <= UDP_PlayerNumber Then
         BanIP$ = DottedIP(UDP_Player_IP(Int(flag)))
         BanID = Int(Flag)
      EndIf
   Else
      For i = 1 To UDP_PlayerNumber
         If UDP_Player_Online(i) = 1 And UDP_Player_Local(i) = 0 Then
            If Lower(UDP_Player_Name(i)) = Lower(flag$) Then
               BanIP$ = DottedIP(UDP_Player_IP(i))
               BanID = Int(flag)
               Exit
            EndIf
         EndIf
      Next
   EndIf
   If BanIP$ = "" Then Return
   newban.UDP_ban = New UDP_ban
   newban\IP$ = BanIP$
   If ms > 0 Then
      newban\time = ms
      newban\ms = MilliSecs()
   Else
      dat = WriteFile("Banlist.ban")
      SeekFile(dat,FileSize("Banlist.ban"))
      WriteLine(dat,BanIP$)
   EndIf
   If BanID > 0
      For i = 1 To UDP_PlayerNumber
         If UDP_Player_Online(i) = 1 Then
            WriteByte(UDP_Player_Stream(i),UDP_Msg_ban)
            WriteInt(UDP_Player_Stream(i),BanID)
            WriteInt(UDP_Player_Stream(i),ms)
            SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
         EndIf
      Next
      UDP_Player_Online(banID) = 0         
      UDP_Player_Port(banID) = 0
      UDP_Player_IP(banID) = 0
      UDP_Player_PingMs(banID) = 0
      CloseUDPStream(UDP_Player_Stream(BanID))
      tmp.UDP_Event = New UDP_Event
      tmp\typ = UDP_Msg_ban
      tmp\ID = BanID
      tmp\msg = ms
   EndIf       
   
End Function

Function UDP_End()
   If UDP_Server = 1 Then
      For i = 1 To UDP_PLayerNumber
         If UDP_PLayer_Online(i) = 1 Then
            WriteByte(UDP_Player_Stream(i),UDP_Msg_End)
            WriteInt(UDP_Player_Stream(i),0)
            SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
         EndIf
      Next
      Delay 50
      If UDP_ServerStream <> 0 CloseUDPStream(UDP_ServerStream)
      For i = 1 To UDP_PLayerNumber
         If UDP_PLayer_Online(i) = 1 Then
            CloseUDPStream(UDP_Player_Stream(i))
         EndIf
      Next
   Else
      If UDP_ServerStream <> 0 And UDP_Player_Stream(0) <> 0 Then
         WriteByte(UDP_Player_Stream(0),UDP_Msg_End)
         WriteInt(UDP_Player_Stream(0),UDP_PlayerID)
         SendUDPMsg(UDP_Player_Stream(0),UDP_Player_IP(0),UDP_Player_Port(0))
         Delay 50
         CloseUDPStream(UDP_Player_Stream(0))
         CloseUDPStream(UDP_ServerStream)
      EndIf
   EndIf
   
End Function 

Function UDP_GetEvent()
   tmp.UDP_Event = First UDP_Event
   If tmp <> Null Then
      UDP_EventID = tmp\ID
      UDP_EventMsg$ = tmp\msg$
      typ = tmp\typ
      Delete tmp
      Return typ
   EndIf
   Return 0
End Function


Function UDP_ChangeName(Name$,ID=0)
   If UDP_Server = 1 Then
      oldNam$ = UDP_Player_Name(ID)
      UDP_Player_Name$(ID) = Name$
      UDP_CheckNames()
      For i = 1 To UDP_PlayerNumber
         If UDP_Player_Online(i) = 1 And UDP_Player_Local(i) = 0 Then
            WriteByte(UDP_Player_Stream(i),UDP_Msg_nam)
            WriteInt(UDP_Player_Stream(i),ID)
            WriteString(UDP_Player_Stream(i),Name$)
            SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
         EndIf
      Next
      tmpe.UDP_Event = New UDP_Event
      tmpe\typ = UDP_Msg_nam
      tmpe\ID = ID
      tmpe\msg = oldNam$
   Else
      oldNam$ = UDP_Player_Name(UDP_PlayerID)
      UDP_Player_Name$(UDP_PlayerID) = Name$
      WriteByte(UDP_ServerStream,UDP_Msg_nam)
      WriteInt(UDP_ServerStream,UDP_PlayerID)
      WriteString(UDP_ServerStream,Name$)
      SendUDPMsg(UDP_ServerStream,UDP_Player_IP(0),UDP_ServerPort)
      tmpe.UDP_Event = New UDP_Event
      tmpe\typ = UDP_Msg_nam
      tmpe\ID = UDP_PlayerID
      tmpe\msg = oldNam$
   EndIf
End Function

Function UDP_AddCommand$(Name$)
   UDP_CommandLine = UDP_CommandLine$+Name$+UDP_CommandSign$
End Function

Function UDP_GetCommand$()   
   txt$ = Mid(UDP_CommandLine,1,Instr(UDP_CommandLine,UDP_CommandSign)-1)
   lentxt = Len(txt)
   UDP_Command = Mid(txt$,1,Instr(txt$,",")-1)
   txt$ = Mid(txt$,Len(UDP_Command)+2,Len(txt$))
   count = 0
   oldPos = 1
   intr = Instr(txt$,",")
   While intr > 0
      count = count + 1
      oldpos = intr + 1
      intr = Instr(txt$,",",oldpos)
   Wend
   Dim UDP_Parameter(count)
   komma = 0
   While Instr(txt$,",") > 0
      UDP_Parameter(komma) = Mid(txt$,1,Instr(txt$,",")-1)
      txt$ = Right(txt$,Len(txt$)-Len(UDP_Parameter(komma))-1)
      komma = komma + 1
   Wend
   UDP_Parameter(komma) = txt$
   UDP_ParameterNumber = count
   UDP_CommandLine = Mid(UDP_CommandLine,Instr(UDP_CommandLine,UDP_CommandSign)+1,Len(UDP_CommandLine))
End Function


Function UDP_CreateLocalPlayer(Name$)
   If UDP_Server = 1 Then
      place = UDP_GetFreePlace()
      If place = 0 Return 0
      UDP_CreateNewPlayer(place,Name$,0,0,1)
      For i = 1 To UDP_PlayerNumber
         If UDP_Player_Online(i) = 1 And i <> place And UDP_Player_local(i) = 0 Then
            WriteByte(UDP_Player_Stream(i),UDP_Msg_new)
            WriteInt(UDP_Player_Stream(i),place)
            WriteByte(UDP_Player_Stream(i),1)
            WriteString(UDP_Player_Stream(i),UDP_Player_Name$(place))
            SendUDPMsg(UDP_Player_Stream(i),UDP_PLayer_IP(i),UDP_Player_Port(i))
         EndIf
      Next
      Return place
   EndIf
   Return -1
End Function







Function UDP_SetServerMsg(ServerMsg$)
   If UDP_Server = 1 Then
      UDP_ServerMsg$ = ServerMsg$
   EndIf
End Function 


Function UDP_SetServerPass(ServerPass$)
   If UDP_Server = 1 Then
      UDP_ServerPass = ServerPass
   EndIf
End Function





Function UDP_CountServers(MaxServer=100,WaitTime=500)
   Dim UDP_Servertmp_name$(MaxServer)
   Dim UDP_Servertmp_ip$(MaxServer)
   Dim UDP_Servertmp_port(MaxServer)
   Dim UDP_Servertmp_pl1(MaxServer)
   Dim UDP_Servertmp_pl2(MaxServer)
   Dim UDP_Servertmp_msg(MaxServer)
   Dim UDP_Servertmp_pass(MaxServer)
   IP = UDP_IntIP(UDP_BroadcastIP())
   UDP_ServerStream = CreateUDPStream()
   WriteByte(UDP_ServerStream,UDP_Msg_ask)
   SendUDPMsg(UDP_ServerStream,IP,UDP_ServerPort)
   ms = MilliSecs()
   serv = 0
   Repeat
      If RecvUDPMsg(UDP_ServerStream) Then
         If ReadByte(UDP_ServerStream) = UDP_Msg_ask Then
            UDP_Servertmp_name$(serv) = ReadString(UDP_ServerStream)
            UDP_Servertmp_ip(serv) = DottedIP(UDPMsgIP(UDP_ServerStream))
            UDP_Servertmp_port(serv) = UDPMsgPort(UDP_ServerStream)
            UDP_Servertmp_pl1(serv) = ReadInt(UDP_ServerStream)
            UDP_Servertmp_pl2(serv) = ReadInt(UDP_ServerStream)
            UDP_Servertmp_msg(serv) = ReadString(UDP_ServerStream)
            UDP_Servertmp_pass(serv) = ReadByte(UDP_ServerStream)
            serv = serv + 1
            If serv > MaxServer Then Exit
         EndIf
      EndIf
   Until ms <= MilliSecs() - WaitTime
   MaxServer = serv-1
   Dim UDP_Server_name$(MaxServer)
   Dim UDP_Server_ip$(MaxServer)
   Dim UDP_Server_port(MaxServer)
   Dim UDP_Server_pl1(MaxServer)
   Dim UDP_Server_pl2(MaxServer)
   Dim UDP_Server_msg(MaxServer)
   Dim UDP_Server_pass(MaxServer)
   For i = 0 To MaxServer
      UDP_Server_name$(i) = UDP_Servertmp_name(i)
      UDP_Server_ip$(i) = UDP_Servertmp_ip(i)
      UDP_Server_port(i) = UDP_Servertmp_port(i)
      UDP_Server_pl1(i) = UDP_Servertmp_pl1(i)
      UDP_Server_pl2(i) = UDP_Servertmp_pl2(i)
      UDP_Server_msg(i) = UDP_Servertmp_msg(i)
      UDP_Server_pass(i) = UDP_Servertmp_pass(i)
   Next
   Dim UDP_Servertmp_name$(0)
   Dim UDP_Servertmp_ip$(0)
   Dim UDP_Servertmp_port(0)
   Dim UDP_Servertmp_pl1(0)
   Dim UDP_Servertmp_pl2(0)
   Dim UDP_Servertmp_msg(0)
   Dim UDP_Servertmp_pass(0)
   CloseUDPStream(UDP_ServerStream)
   Return MaxServer+1
End Function


Function UDP_GetServerName$(ID)
   Return UDP_Server_name$(ID-1)
End Function

Function UDP_GetServerIP$(ID)
   Return UDP_Server_IP$(ID-1)+":"+UDP_Server_Port(ID-1)
End Function

Function UDP_GetServerPlayerNumber$(ID)
   Return UDP_Server_pl1(ID-1)+"/"+UDP_Server_pl2(ID-1)
End Function

Function UDP_GetServerMsg$(ID)
   Return UDP_Server_msg$(ID-1)
End Function

Function UDP_GetServerPass(ID)
   Return UDP_Server_pass(ID-1)
End Function


Function UDP_CountPlayers()
   count = 0
   For i = 0 To UDP_PlayerNumber
      If UDP_Player_Online(i) = 1 Then count = count + 1
   Next
   Return count
End Function

Function UDP_GetPlayerName$(ID)
   count = 0
   For i = 0 To UDP_PlayerNumber
      If UDP_Player_Online(i) = 1 Then count = count + 1
      If count = ID Then Return UDP_Player_Name(i)
   Next
   Return ""
End Function

Function UDP_GetPlayerPing(ID)
   count = 0
   For i = 0 To UDP_PlayerNumber
      If UDP_Player_Online(i) = 1 Then count = count + 1
      If count = ID Then Return UDP_Player_Ping(i)
   Next
   Return 0
End Function


Function UDP_GetPlayerID(ID)
   count = 0
   For i = 0 To UDP_PlayerNumber
      If UDP_Player_Online(i) = 1 Then count = count + 1
      If count = ID Then Return i
   Next
   Return ""
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


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_EnCode$(txt$)
   Local ntxt$
   For i = 1 To Len(txt)
      num = Asc(Mid(txt,i,1)) + UDP_EnCodeNumber
      ntxt$ = ntxt$ + Chr(num)
   Next
   Return ntxt
End Function

Function UDP_DeCode$(txt$)
   Local ntxt$
   For i = 1 To Len(txt$)
      num = Asc(Mid(txt$,i,1)) - UDP_EnCodeNumber
      ntxt$ = ntxt$ + Chr(num)
   Next
   Return ntxt$
End Function
 

   


;----------


Function UDP_CreateNewPlayer(place,Name$,IP,Port,LocalPlayer=0)
   If loacalPlayer = 0 Then UDP_Player_Stream(place) = CreateUDPStream()
   If UDP_Player_Stream(place) = 0 Then Return 0
   UDP_Player_Online(place) = 1
   UDP_Player_Name$(place) = Name$
   UDP_Player_Port(place) = Port
   UDP_Player_IP(place) = IP
   UDP_Player_Local(place) = localplayer
   Return 1
End Function

Function UDP_GetFreePlace()
   For i = 1 To UDP_PlayerNumber
      If UDP_Player_Online(i) = 0 Then Return i
   Next
   Return 0
End Function    


Function UDP_NewPlayerNumber(Anzahl)
   UDP_PlayerNumber = Anzahl
   Dim UDP_Player_Online(Anzahl),UDP_Player_Stream(Anzahl),UDP_Player_IP(Anzahl),UDP_Player_Port(Anzahl),UDP_Player_Name$(Anzahl)
   Dim UDP_Player_Local(Anzahl)
   Dim UDP_Player_TMsg.UDP_Msg(Anzahl),UDP_Player_SendNewMsg(Anzahl),UDP_Player_RecvMsg(Anzahl)
   Dim UDP_Player_Event(Anzahl)
   Dim UDP_Player_Ping(Anzahl),UDP_Player_PingMs(Anzahl)
End Function



Function UDP_CheckNames()
   For i = 0 To UDP_PlayerNumber
      If UDP_Player_Online(i) = 1 And UDP_Player_Local(i) = 0 Then
         count = 1
         If Instr(UDP_Player_Name(i),"(") And  Instr(UDP_Player_Name(i),")") Then
            txt2$ = Left(UDP_Player_Name(i),Instr(UDP_Player_Name(i),"(")-1)
         Else
            txt2$ = UDP_Player_Name(i)
         EndIf
         For j = i To UDP_PlayerNumber
             If UDP_Player_Online(j) = 1 And UDP_Player_Local(j) = 0 And i <> j Then
               If Instr(UDP_Player_Name(j),"(") And  Instr(UDP_Player_Name(j),")") Then
                  txt$ = Left(UDP_Player_Name(j),Instr(UDP_Player_Name(j),"(")-1)
               Else
                  txt$ = UDP_Player_Name(j)
               EndIf
               If txt = txt2 Then
                  count2 = Int(Mid(UDP_Player_Name(j),Instr(UDP_Player_Name(j),"(")+1,Instr(UDP_Player_Name(j),")")-1))
                  If count2 > count Then count = count2
                  If UDP_Player_Name(j) <> txt+"("+count+")" Then
                     oldNam$ = UDP_Player_Name(j)
                     UDP_Player_Name(j) = txt+"("+count+")"
                     UDP_Player_ChangeName = 1
                     For k = 1 To UDP_PlayerNumber
                        If UDP_Player_Online(k) = 1 And UDP_Player_Local(k) = 0 Then
                           WriteByte(UDP_Player_Stream(k),UDP_Msg_snc)
                           WriteInt(UDP_Player_Stream(k),j)
                           WriteString(UDP_Player_Stream(k),UDP_Player_Name(j))
                           SendUDPMsg(UDP_Player_Stream(k),UDP_Player_IP(k),UDP_Player_Port(k))
                        EndIf
                     Next
                     tmpe.UDP_Event = New UDP_Event
                     tmpe\typ = UDP_Msg_snc
                     tmpe\ID = j
                     tmpe\msg = oldNam$
                  EndIf
                  count = count + 1
               EndIf
            EndIf
         Next
      EndIf
   Next
End Function             
   



;----------



Beispiele + Lib könnt ihr hier Downloaden :

Edit : Version 1.50
SimpleUDP(*.rar, ~3,5Mb)

Viel spaß und schreibt bitte was !


mfg ToeB
  • Zuletzt bearbeitet von ToeB am Do, März 25, 2010 16:37, insgesamt 8-mal bearbeitet

ozzi789

BeitragFr, Aug 07, 2009 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm weis nicht recht wo anfangen

ich habs mir kurz mal angesehn und muss sagen, gar ned schlecht, kann dem einen oder anderen sehr viel stress und zeit sparen!

Die Befehlnamen sind gut gewählt
und das Tut ist ganz nett


werde den code eventuell für zukünftige Progs einsetzen ^^


mfg ozzi
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Xaymar

ehemals "Cgamer"

BeitragSa, Aug 08, 2009 0:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Endlich:D

Nu brauch ich mich nichtmehr mit meiner eigenen udp lib rumqüalen^^

testen tu ich heute auch noch aber nicht jetzt^^
Warbseite

Tankbuster

BeitragSa, Aug 08, 2009 1:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, nette Sache.

Ich werde das zwar nicht brauchen, da ich mehr oder weniger meine eigene Lib hab, aber ich denke einen paar Anfängern könnte es die Netzwerksache sehr leicht machen.

Sieht auch gut aus. Aber ist das ganze auch Internetfähig, mit Firewall, ect ?
Twitter
Download Jewel Snake!
Windows|Android

ToeB

BeitragSa, Aug 08, 2009 10:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Very Happy

@Tankbuster : Ja im prinzip kann man das ja auch übers Internet machen, nur must du die entsprecheneden dinge einstellen wie firewall deaktivieren oder portforwarding (das übliche wie bei allen UDP sachen Wink )

Aber finde ich gut das sie so gut ankommt Smile

ICh werde sie noch weiter schreiben, also so dass man seine Server auch im Internet hochladen kann für Internetgames usw..

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Xaymar

ehemals "Cgamer"

BeitragSa, Aug 08, 2009 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
ICh werde sie noch weiter schreiben, also so dass man seine Server auch im Internet hochladen kann für Internetgames usw..


Meinst du damit eien Serverliste?
Warbseite

ToeB

BeitragSa, Aug 08, 2009 12:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Jap... Ich hab mir das so vorgestellt das jeder, der so eine Liste haben möchte für sein spiel, einfach einen freien account bei bplaced erstellt und dort kann man dann mit meinen Functionen (Dann nicht mehr UDP sondern TCP) die Listen Hochladen, auch nach dem Schema der Abrafgen der Server im Netztwerk (Also NAme, Spieler und Ip+Port). Somit soll es für jeder mann einfach gemacht werden, auch Internet Spiele zu machen (Natürlich nach dem entsprechenden Portforwarding)

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Eingeproggt

BeitragSa, Aug 08, 2009 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Und lieferst du den php Teil dafür auch mit? Smile
Mittlerweile hab ich ja halbwegs Übung mit einfachen mySQl-Abfragen und dem nötigen php dazu, aber beim ersten Mal hab ich mir irrsinnig schwer getan und möcht auch heute nicht sagen dass ich n Profi dabei wär.

mfG, Christoph.

PS: Ich bevorzuge auch bplaced, aber du solltest vielleicht jeden Hoster zulassen, der php und mysql unterstützt.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Xaymar

ehemals "Cgamer"

BeitragSa, Aug 08, 2009 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
ok^^
wirst du es in php schreiben? wenn, dann kann ich dir dabei helfen, bzw dir den source meiner derzeitigen serverliste geben. Ist noch nicht komplett, da die website fehlt;)

hier mal den source fürs opengn... die "ogn test.bb" ist noch fürn lokalen gebrauch bei mir^^
https://www.blitzforum.de/upload/file.php?id=6424

Edit: und webspace hatte ich mir auch schon reserviert(100gb traffic/month)^^
http://opengn.hostoi.com/
istn freehoster. Plante eigentlich mal wenn die website fertig ist auf First-Level-Domain umzusteigen.
Warbseite
  • Zuletzt bearbeitet von Xaymar am Sa, Aug 08, 2009 12:53, insgesamt 2-mal bearbeitet

ToeB

BeitragSa, Aug 08, 2009 12:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey danke Cgamer ! Werd mal gucken ob ichs gebrauchen kann Smile

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Nicdel

BeitragSo, Aug 09, 2009 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Praktisch, kommt mir gerade Recht. Vielen Dank!
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

Xaymar

ehemals "Cgamer"

BeitragSo, Aug 09, 2009 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
ToeB, wenn du möchtest kann ich dir eine version schicken wo das webinterface fertig ist. Dauert allerdings noch 1-2 tage^^
Warbseite

ToeB

BeitragSo, Aug 09, 2009 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Jau das wär super.. Dann kannste je gleich den ganzen teil übernehmen (also Serverlisten hochladen usw.) und in meine Lib schreiben Wink


mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Xaymar

ehemals "Cgamer"

BeitragMo, Aug 10, 2009 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Das WebInterface steht jetzt. Gibt leider wieder propbleme mit dem Blitz beispiel. Kann also etwas dauern
Ach nennen wirs einfach Serverliste(nicht sehr schön, aber erfüllt seinen zweck)

Edit:
Nun ist auch das Problem damit beseitigt und die halbwegs getestete Version steht zum download:
Serverliste + SimpleUDP

Edit: in der OpenGN.bb müsst ihr bei dem ersten writeline befehl jeder funktion das /OpenGN wegmachen.
Arbeite derzeit an einer neuen version.
Warbseite

ToeB

BeitragDi, Aug 18, 2009 18:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Version 1.1

So ihr könnt jetzt die version 1.1 oben runterladen Very Happy !

Was hat sich geändert ?
Arrow Es werden nun nachrichten ausgegeben, wenn
- der Server das Spiel beendet
- der Server einen zu hohen Ping hat (Als Client) und deshalb vom Client aus gekickt wird
- der Server den Client Kickt
- der Server einen anderen Client Kickt
- ein Client beendet
- ein Client gekickt wurde
Arrow Geändert wurde auch der Parameter bei UDP_Update : AllowLogin. Ist die Variable 1 können Spieler sich einklinken, bei 0 nicht. Hat den vorteil wenn man bspw. eine Lobby machen möchte, das dann während das Spiel läuft keiner mehr einsteigen kann (Beispiel "SimpleUDP, Lobby")
Arrow Jetzt muss man auch nicht mehr diese Prüf schleife verwenden (also alle spieler durchgehen , gucken ob online etc.) sondern man benutz UDP_CountPlayers, dann macht man eine schleife auf die von 1 bis zu dem Rückgabe wert läuft und dann kann man die einzellnen daten mittels Functionen abrufen. Das sieht etwa so aus :
Code: [AUSKLAPPEN]
count = UDP_CountPlayers()
For i = 1 to count
     name$ = UDP_GetPlayerName(i)
     Ping = UDP_GetPlayerPing(i)
     Msg$ = UDP_GetPlayerMsg(i)
     ID = UDP_GetPlayerID(i)
Next





(wer das alles ausprobieren möchte, im Beispiel "SimpleUDP, Chat" kann man es, zum kicken einfach nur auf den Spieler klicken (in der Ping liste).)

Also viel spaß und bitte schreibt was dazu !

Wink

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

tft

BeitragDi, Aug 18, 2009 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

hast du das ganze auch mal mit HAMASHI getestet?

Gruss TFT
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

ToeB

BeitragDi, Aug 18, 2009 22:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein sry tft aber das habe ich noch nicht ...

Aber Danke für den Hinweis, werde es bei gelegenheit tun und euch berichten (aber es sollte eigl. klappen Wink )

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Milgo

BeitragSo, Aug 30, 2009 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab jetzt mal den entsprechenden Port freigeschaltet und versucht über Internet auf mein eigenes Programm zu connecten. Ich führe also auf meinem PC einfach den Client und einmal den Host aus - beim Client kommt dann allerdings die Meldung, dass der Port schon genutzt werde.
Liegts einfach daran, dass ich das auf einem Pc mache oder wirds per Inet nicht funzen?

ToeB

BeitragMo, Aug 31, 2009 12:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja also UDP_Joingame gibt einen wert zurück. Der kann 1 oder 0 sein.Bei 0 konnte keine verbindung aufgebaut werden, kein stream erstellt werdenóder der Servere voll sein.

Mit dem Port freischalten ist das hier so ne Sache, da jeder Client nicht nur eine Verbindung zum server aufbaut sondern 2. Eine zum senden und eine zum Empfangen. Das heißt du müsstest nicht nur den Port 8000 freischalten, sondern auch den sende Port der Clients. Der wird aber immer selber ausgesucht. Du könntest, aber dann kannst du keinen localentest mehr durchführen, folgende Function benutzen, bei der man den Port für den Clienten angeben muss :

Code: [AUSKLAPPEN]
Function UDP_JoinGame(GameIP$,PlayerName$,Port=0,WaitTime=100)
   UDP_Server = 0
   If Instr(GameIp,".") > 0 GameIP = UDP_IntIP(GameIP)
   UDP_ServerStream = CreateUDPStream(Port)
   If UDP_ServerStream = 0 Return 0
   WriteByte(UDP_ServerStream,UDP_Msg_new)   
   WriteString(UDP_ServerStream,PlayerName$)
   SendUDPMsg(UDP_ServerStream,GameIP,UDP_ServerPort)
   Connection = 0
   WaitMs = MilliSecs() + WaitTime
   While WaitMs > MilliSecs()
      If RecvUDPMsg(UDP_ServerStream)
         byte = ReadByte(UDP_ServerStream)
         If byte = UDP_Msg_new
            If UDPMsgIP(UDP_ServerStream) = GameIP
               UDP_PlayerID = ReadInt(UDP_ServerStream)
               UDP_PlayerNumber = ReadInt(UDP_ServerStream)
               UDP_NewPlayerNumber(UDP_PlayerNumber)
               UDP_Player_Port(0) = UDP_ServerPort
               UDP_Player_IP(0) = GameIP
               While Not Eof(UDP_ServerStream)
                  TmpPlayerID = ReadInt(UDP_ServerStream)
                  UDP_Player_Online(tmpPlayerID) = 1
                  UDP_Player_Name$(tmpPlayerID) = ReadString(UDP_ServerStream)
               Wend
               UDP_Player_Online(UDP_PlayerID) = 1
               UDP_Player_Name$(UDP_PlayerID) = PlayerName$
               Connection = 1
               Exit
            EndIf
         ElseIf byte = UDP_Msg_not
            Connection = 0
         EndIf
      EndIf 
   Wend
   If Connection UDP_Player_Stream(0) = CreateUDPStream()
   If UDP_Player_Stream(0) = 0 Return 0
   Return Connection
End Function


Falls das auch nicht hilft, weiß ich auch net weiter....


mfgToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

ToeB

BeitragDi, Okt 13, 2009 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
So es gibt jetzt wieder eine Neue version ! Leider habe ich dafür noch keine Beispiele geschrieben, kommt aber noch Wink

Folgendes wurde verändert/hinzugefügt :
Arrow Man kann jetzt "Gesicherte" nachrichten verschicken, die zu 99% ankommen
Arrow Nachrichten können jetzt bequemer wie Events ausgelesen werden
Arrow Nachrichten können jetzt wahlweise an alle oder nur an einen Spieler verschickt werden (man muss nur die ID wissen)
Arrow Man kann "LocalPlayers" hinzufügen, also Spieler die nur auf dem Server exestieren und von dort aus gesteuert werden. Dazu sagt aman einfach "UDP_CreateLocalPlayer" und gut is. Dann muss man noch wenn man der Server ist mit "UDP_SendLocalMsg" eine nachricht von dem Spieler an alle senden, auch ganz easy Cool
Arrow Passwort geschützer Server möglich
Arrow Server können eine "MSG" mitsenden, da können z.B. daten wie Maps, Mods etc. drin vorkommen
Arrow Einige Bugs sind gefixed worden ....

Hier Probierts aus :

Code: [AUSKLAPPEN]



Const UDP_ServerPort = 8000
Const UDP_PingTime = 1000

Const UDP_Msg_nom = 1
Const UDP_Msg_new = 2
Const UDP_Msg_not = 3
Const UDP_Msg_pg1 = 4
Const UDP_Msg_pg2 = 5
Const UDP_Msg_kik = 6
Const UDP_Msg_end = 7
Const UDP_Msg_ask = 8
Const UDP_Msg_att = 9
Const UDP_Msg_at2 = 10

Const UDP_CommandSign$ = "§"


Global UDP_Server,UDP_ServerStream,UDP_ServerName$
Global UDP_ServerMsg$
Global UDP_ServerPass$
Global UDP_PingMS
Global UDP_PlayerNumber,UDP_PlayerID
Global UDP_CommandLine$ = ""
Global UDP_Command$,UDP_ParameterNumber
Global UDP_SendNewMsg = 0,UDP_RecvMsg = 0
Global UDP_MsgID
Global UDP_EventID

Global UDP_PingTimeOut = 10000


Dim UDP_Player_Online(0),UDP_Player_Stream(0),UDP_Player_IP(0),UDP_Player_Port(0),UDP_Player_Name$(0)
Dim UDP_Player_local(0)
Dim UDP_Player_TMsg.UDP_Msg(0),UDP_Player_SendNewMsg(0),UDP_Player_RecvMsg(0)
Dim UDP_Player_Ping(0),UDP_Player_PingMs(0)
Dim UDP_Player_Event(0)

Dim UDP_Servertmp_name$(0)
Dim UDP_Servertmp_ip$(0)
Dim UDP_Servertmp_port(0)
Dim UDP_Servertmp_pl1(0)
Dim UDP_Servertmp_pl2(0)
Dim UDP_Servertmp_msg$(0)
Dim UDP_Servertmp_pass(0)
Dim UDP_Server_name$(0)
Dim UDP_Server_ip$(0)
Dim UDP_Server_port(0)
Dim UDP_Server_pl1(0)
Dim UDP_Server_pl2(0)
Dim UDP_Server_msg$(0)
Dim UDP_Server_pass(0)


Type UDP_Msg
   Field msg$
   Field ms
   Field ID
   Field From
   Field it
End Type

Type UDP_RecvMsg
   Field msg$
   Field From
   Field att
End Type 

Type UDP_Event
   Field typ
   Field ID
End Type

Dim UDP_Parameter$(0)


;----------



Function UDP_HostGame(GameName$,PlayerName$,PlayerNumber=1)
   UDP_Server = 1
   UDP_ServerStream = CreateUDPStream(UDP_ServerPort)
   UDP_NewPlayerNumber(PlayerNumber)
   UDP_PlayerID = 0
   UDP_ServerName = GameName
   UDP_Player_Online(0) = 1
   UDP_Player_Name$(0) = PlayerName$
   Return (UDP_ServerStream <> 0)
End Function 

Function UDP_JoinGame(GameIP$,PlayerName$,ServerPass$="",WaitTime=100)
   UDP_Server = 0
   If Instr(GameIp,":") > 0 GameIp = Mid(GameIP,1,Instr(GameIP,":")-1)
   If Instr(GameIp,".") > 0 GameIP = UDP_IntIP(GameIP)
   UDP_ServerStream = CreateUDPStream()
   If UDP_ServerStream = 0 Return 0
   WriteByte(UDP_ServerStream,UDP_Msg_new)   
   WriteString(UDP_ServerStream,PlayerName$)
   WriteString(UDP_ServerStream,ServerPass)
   SendUDPMsg(UDP_ServerStream,GameIP,UDP_ServerPort)
   Connection = 0
   WaitMs = MilliSecs() + WaitTime
   While WaitMs > MilliSecs()
      If RecvUDPMsg(UDP_ServerStream)
         byte = ReadByte(UDP_ServerStream)
         If byte = UDP_Msg_new
            If UDPMsgIP(UDP_ServerStream) = GameIP
               UDP_PlayerID = ReadInt(UDP_ServerStream)
               UDP_PlayerNumber = ReadInt(UDP_ServerStream)
               UDP_NewPlayerNumber(UDP_PlayerNumber)
               UDP_Player_Port(0) = UDP_ServerPort
               UDP_Player_IP(0) = GameIP
               While Not Eof(UDP_ServerStream)
                  TmpPlayerID = ReadInt(UDP_ServerStream)
                  UDP_Player_Online(tmpPlayerID) = 1
                  UDP_Player_Name$(tmpPlayerID) = ReadString(UDP_ServerStream)
                  UDP_Player_Local(tmpPlayerID) = ReadByte(UDP_ServerStream)
               Wend
               UDP_Player_Online(UDP_PlayerID) = 1
               UDP_Player_Name$(UDP_PlayerID) = PlayerName$
               Connection = 1
               Exit
            EndIf
         EndIf
      EndIf 
   Wend
   If Connection UDP_Player_Stream(0) = CreateUDPStream()
   If UDP_Player_Stream(0) = 0 Return 0
   Return Connection
End Function 

Function UDP_SetServerMsg(ServerMsg$)
   If UDP_Server = 1
      UDP_ServerMsg$ = ServerMsg$
   EndIf
End Function 


Function UDP_SetServerPass(ServerPass$)
   If UDP_Server = 1
      UDP_ServerPass = ServerPass
   EndIf
End Function



Function UDP_SendMsg(Msg$,ID=-1)
   If UDP_Server = 1
      If ID < 0 Or ID > UDP_PlayerNumber
         For i = 1 To UDP_PlayerNumber
            If UDP_Player_Online(i) = 1 And UDP_Player_local(i) = 0
               WriteByte(UDP_Player_Stream(i),UDP_Msg_nom)
               WriteInt(UDP_Player_Stream(i),0)
               WriteString(UDP_Player_stream(i),Msg$)
               SendUDPMsg(UDP_Player_stream(i),UDP_Player_IP(i),UDP_player_Port(i))
            EndIf
         Next
      Else
         WriteByte(UDP_Player_Stream(ID),UDP_Msg_nom)
         WriteInt(UDP_Player_Stream(ID),0)
         WriteString(UDP_Player_stream(ID),Msg$)
         SendUDPMsg(UDP_Player_stream(ID),UDP_Player_IP(ID),UDP_player_Port(ID))
      EndIf
   Else
      If UDP_Player_Online(UDP_PlayerID) = 1 And UDP_Player_Online(0) = 1
         If ID < 0 Or ID > UDP_PlayerNumber
            WriteByte(UDP_Player_Stream(0),UDP_Msg_nom)
            WriteInt(UDP_Player_Stream(0),UDP_PlayerID)
            WriteInt(UDP_Player_Stream(0),-1)
            WriteString(UDP_Player_stream(0),Msg$)
            SendUDPMsg(UDP_Player_stream(0),UDP_Player_IP(0),UDP_player_Port(0))
         Else
            WriteByte(UDP_Player_Stream(0),UDP_Msg_nom)
            WriteInt(UDP_Player_Stream(0),UDP_PlayerID)
            WriteInt(UDP_Player_Stream(0),ID)
            WriteString(UDP_Player_stream(0),Msg$)
            SendUDPMsg(UDP_Player_stream(0),UDP_Player_IP(0),UDP_player_Port(0))
         EndIf
      EndIf
   EndIf
End Function

Function UDP_SendMsg_Att(msg$,ID=-1)   
   If UDP_Server = 1
      If ID < 0 Or ID > UDP_PlayerNumber
         For i = 1 To UDP_PlayerNumber
            If UDP_Player_Online(i) = 1 And UDP_Player_Local(i) = 0
               c = 0
               For tmp.UDP_Msg = Each UDP_Msg
                  If tmp\ID = i c = 1:Exit
               Next
               tmp.UDP_msg = New UDP_Msg
               tmp\msg$ = msg$
               tmp\ms = MilliSecs()
               tmp\ID = i
               tmp\From = 0
               If c = 0 UDP_Player_SendNewMsg(i) = 1
            EndIf
         Next
      Else
         c = 0
         For tmp.UDP_Msg = Each UDP_Msg
            If tmp\ID = ID c = 1:Exit
         Next
         tmp.UDP_msg = New UDP_Msg
         tmp\msg$ = msg$
         tmp\ms = MilliSecs()
         tmp\ID = ID
         tmp\From = 0
         If c = 0 UDP_Player_SendNewMsg(ID) = 1
      EndIf
   Else
      If UDP_Player_Online(UDP_PlayerID) = 1 And UDP_Player_Online(0) = 1
         If ID < 0 Or ID > UDP_PlayerNumber
            c = 0
            For tmp.UDP_Msg = Each UDP_Msg
               If tmp\ID = 0 c = 1 : Exit
            Next
            tmp.UDP_msg = New UDP_Msg
            tmp\msg$ = msg$
            tmp\ms = MilliSecs()
            tmp\ID = -1   
            tmp\From = UDP_PlayerID
            If c = 0 UDP_Player_SendNewMsg(0) = 1 
         Else
            c = 0
            For tmp.UDP_Msg = Each UDP_Msg
               If tmp\ID = 0 c = 1 : Exit
            Next
            tmp.UDP_msg = New UDP_Msg
            tmp\msg$ = msg$
            tmp\ms = MilliSecs()
            tmp\ID = ID
            tmp\From = UDP_PlayerID
            If c = 0 UDP_Player_SendNewMsg(ID) = 1 
         EndIf
      EndIf
   EndIf    
End Function


Function UDP_SendLocalMsg(msg$,LocalID)
   If UDP_Server = 1
      For i = 1 To UDP_PlayerNumber
         If UDP_Player_Online(i) = 1 And UDP_Player_local(i) = 0
            WriteByte(UDP_Player_Stream(i),UDP_Msg_nom)
            WriteInt(UDP_Player_Stream(i),LocalID)
            WriteString(UDP_Player_stream(i),Msg$)
            SendUDPMsg(UDP_Player_stream(i),UDP_Player_IP(i),UDP_player_Port(i))
         EndIf
      Next
   EndIf
End Function


Function UDP_SendLocalMsg_att(msg$,LocalID)
   If UDP_Server = 1
      For i = 1 To UDP_PlayerNumber
         If UDP_Player_Online(i) = 1 And UDP_Player_local(i) = 0
            c = 0
            For tmp.UDP_Msg = Each UDP_Msg
               If tmp\ID = i c = 1:Exit
            Next
            tmp.UDP_msg = New UDP_Msg
            tmp\msg$ = msg$
            tmp\ms = MilliSecs()
            tmp\ID = i
            tmp\From = LocalID
            If c = 0 UDP_Player_SendNewMsg(i) = 1
         EndIf
      Next
   EndIf
End Function

Function UDP_Update(LoginBlock=0)
   If UDP_Server = 1
      For i = 1 To UDP_PlayerNumber
         If UDP_Player_Online(i) = 1
            If UDP_Player_SendNewMsg(i) = 1
               get = 0
               tmp.UDP_Msg = Null
               For tmp_.UDP_Msg = Each UDP_Msg
                  If tmp_\ID = i tmp = tmp_ : Exit
               Next
               If tmp <> Null
                  WriteByte(UDP_Player_Stream(i),UDP_Msg_Att)
                  WriteInt(UDP_Player_Stream(i),tmp\From)
                  WriteString(UDP_Player_Stream(i),tmp\msg)
                  SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
                  tmp\ms = MilliSecs()
                  UDP_Player_SendNewMsg(i) = 0
                  UDP_Player_TMsg(i) = tmp
                  UDP_Player_RecvMsg(i) = 1
               Else
                  UDP_Player_SendNewMsg(i) = 0
                  UDP_Player_RecvMsg(i) = 0
               EndIf
            EndIf
            If UDP_Player_RecvMsg(i) = 1
               tmp.UDP_Msg = UDP_Player_TMsg(i)
               If tmp\ms <= MilliSecs() - 64 Then
                  WriteByte(UDP_Player_Stream(i),UDP_Msg_Att)
                  WriteInt(UDP_Player_Stream(i),tmp\From)
                  WriteString(UDP_Player_Stream(i),tmp\msg)
                  SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
                  tmp\it = tmp\it + 1                  
                  tmp\ms = MilliSecs()
                  If tmp\it => 16
                     Delete tmp
                     UDP_Player_SendNewMsg(i) = 1
                     UDP_Player_RecvMsg(i) = 0
                  EndIf
               EndIf
            EndIf
         Else
            For tmp.UDP_Msg = Each UDP_Msg
               If tmp\ID = i Then Delete tmp
            Next
            UDP_Player_SendNewMsg(i) = 0
            UDP_Player_RecvMsg(i) = 0
         EndIf
      Next
      If UDP_PingMs <= MilliSecs()
         For i = 1 To UDP_PlayerNumber
            If UDP_Player_Online(i) = 1 And UDP_Player_PingMs(i) = 0 And UDP_Player_Local(i) = 0
               WriteByte(UDP_Player_Stream(i),UDP_Msg_pg1)
               For j = 1 To UDP_PlayerNumber
                  If UDP_Player_Online(j) = 1
                     WriteInt(UDP_Player_Stream(i),j)
                     WriteInt(UDP_Player_Stream(i),UDP_PLayer_Ping(j))
                  EndIf
               Next
               SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
               UDP_Player_PingMs(i) = MilliSecs()
            EndIf
         Next
         UDP_PingMs = MilliSecs() + UDP_PingTime
      EndIf
      For i = 0 To UDP_PlayerNumber
         If UDP_Player_Online(i) = 1 And i > 0 And UDP_Player_Local(i) = 0
            If UDP_Player_PingMs(i) > 0
               If (MilliSecs()-UDP_Player_PingMs(i)) > UDP_PingTimeOut Then
                  UDP_KickPlayer(i)
               EndIf
            EndIf
         EndIf
      Next       
      While RecvUDPMsg(UDP_ServerStream)
         byte = ReadByte(UDP_ServerStream)
         Select byte
         Case UDP_Msg_nom
            TmpID = ReadInt(UDP_ServerStream)
            ToID = ReadInt(UDP_serverStream)
            If ToID = -1 Or ToID = 0
               tmpr.UDP_RecvMsg = New UDP_RecvMsg
               tmpr\msg = ReadString(UDP_serverStream)
               tmpr\From = TmpID
               tmpr\att = 0
               If toID = -1
                  For i = 1 To UDP_PlayerNumber
                     If UDP_Player_Online(i) = 1 And i <> TmpID
                        WriteByte(UDP_Player_Stream(i),UDP_Msg_nom)
                        WriteInt(UDP_Player_Stream(i),TmpID)
                        WriteString(UDP_Player_stream(i),tmpr\msg)
                        SendUDPMsg(UDP_Player_stream(i),UDP_Player_IP(i),UDP_player_Port(i))
                     EndIf
                  Next
               EndIf
            Else
               WriteByte(UDP_Player_Stream(ToID),UDP_Msg_nom)
               WriteInt(UDP_Player_Stream(ToID),TmpID)
               WriteString(UDP_Player_stream(ToID),tmpr\msg)
               SendUDPMsg(UDP_Player_stream(toID),UDP_Player_IP(ToID),UDP_player_Port(toID))
            EndIf
         Case UDP_Msg_new
            place = UDP_GetFreePlace()
            New_Name$ = ReadString(UDP_ServerStream)
            New_Pass$ = ReadString(UDP_ServerStream)
            New_Port% = UDPMsgPort(UDP_ServerStream)
            New_IP%   = UDPMsgIP(UDP_ServerStream)
            If LoginBlock = 0 And New_Pass = UDP_ServerPass Then
               If place > 0               
                  player_accept = UDP_CreateNewPlayer(place,New_Name$,New_IP,New_Port)
                  If player_accept > 0                  
                     WriteByte(UDP_Player_Stream(place),UDP_Msg_new)
                     WriteInt(UDP_Player_Stream(place),place)
                     WriteInt(UDP_Player_Stream(place),UDP_PlayerNumber)
                     For i = 0 To UDP_PlayerNumber
                        If place <> i
                           If UDP_Player_Online(i) = 1
                              WriteInt(UDP_Player_Stream(place),i)
                              WriteString(UDP_Player_Stream(place),UDP_Player_Name(i))
                              WriteByte(UDP_Player_Stream(place),UDP_Player_Local(i))
                           EndIf
                        EndIf
                     Next
                     SendUDPMsg(UDP_Player_Stream(place),UDP_Player_IP(place),UDP_Player_Port(place))
                     For i = 1 To UDP_PlayerNumber
                        If UDP_Player_Online(i) = 1 And i <> place
                           WriteByte(UDP_Player_Stream(i),UDP_Msg_new)
                           WriteInt(UDP_Player_Stream(i),place)
                           WriteByte(UDP_Player_Stream(i),0)
                           WriteString(UDP_Player_Stream(i),UDP_Player_Name$(place))
                           SendUDPMsg(UDP_Player_Stream(i),UDP_PLayer_IP(i),UDP_Player_Port(i))
                        EndIf
                     Next
                     tmpe.UDP_Event = New UDP_Event
                     tmpe\typ = UDP_Msg_New
                     tmpe\ID = place
                  EndIf
               EndIf
            EndIf
         Case UDP_Msg_pg1
            TmpID = ReadInt(UDP_ServerStream)
            If UDP_Player_Online(TmpID) = 1
               UDP_Player_Ping(TmpID) = MilliSecs() - UDP_Player_PingMs(TmpID)
               UDP_Player_PingMs(TmpID) = 0
               WriteByte(UDP_Player_Stream(TmpID),UDP_Msg_pg2)
               SendUDPMsg(UDP_Player_Stream(TmpID),UDP_Player_IP(TmpID),UDP_PLayer_Port(TmpID))
            EndIf
         Case UDP_Msg_end
            TmpID = ReadInt(UDP_ServerStream)
            If UDP_Player_Online(TmpID) = 1
               UDP_Player_Online(TmpID) = 0
               tmpe.UDP_Event = New UDP_Event
               tmpe\typ = UDP_Msg_end
               tmpe\ID = tmpID
               CloseUDPStream(UDP_Player_Stream(TmpID))
               For i = 1 To UDP_PLayerNumber
                  If UDP_PLayer_Online(i) = 1
                     WriteByte(UDP_Player_Stream(i),UDP_Msg_End)
                     WriteInt(UDP_Player_Stream(i),TmpID)
                     SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
                  EndIf
               Next
            EndIf
         Case UDP_Msg_ask
            IP = UDPMsgIP(UDP_ServerStream)
            Port = UDPMsgPort(UDP_ServerStream)
            count = UDP_CountPlayers()
            WriteByte(UDP_ServerStream,UDP_Msg_ask)
            WriteString(UDP_ServerStream,UDP_ServerName$)
            WriteInt(UDP_ServerStream,count)
            WriteInt(UDP_ServerStream,UDP_PlayerNumber)
            WriteString(UDP_ServerStream,UDP_ServerMsg)
            WriteByte(UDP_ServerStream,(UDP_ServerPass<>""))
            SendUDPMsg(UDP_ServerStream,Ip,Port)
         Case UDP_Msg_att
            TmpID = ReadInt(UDP_ServerStream)
            toID = ReadInt(UDP_ServerStream)
            ;UDP_Player_Msg(TmpID) = ReadString(UDP_ServerStream)
            If toID = -1 Or ToID = 0
               tmpr.UDP_RecvMsg = New UDP_RecvMsg
               tmpr\msg = ReadString(UDP_ServerStream)
               tmpr\From = TmpID
               tmpr\att = 1
               If tmpr\msg <> "" And toID = -1
                  WriteByte(UDP_Player_Stream(TmpID),UDP_Msg_at2)
                  SendUDPMsg(UDP_Player_Stream(TmpID),UDP_Player_IP(TmpID),UDP_Player_Port(TmpID))
                  For i = 1 To UDP_PlayerNumber
                     If UDP_Player_Online(i) = 1 And tmpID <> i
                        c = 0
                        For tmp.UDP_Msg = Each UDP_Msg
                           If tmp\ID = i c = 1 : Exit
                        Next
                        tmp.UDP_msg = New UDP_Msg
                        tmp\msg$ = tmpr\msg$
                        tmp\ms = MilliSecs()
                        tmp\ID = i
                        tmp\From = TmpID
                        If c = 0 UDP_Player_SendNewMsg(i) = 1
                        UDP_Player_TMsg(i) = tmp
                     EndIf
                  Next
               EndIf
            Else
               If tmpr\msg <> ""
                  WriteByte(UDP_Player_Stream(TmpID),UDP_Msg_at2)
                  SendUDPMsg(UDP_Player_Stream(TmpID),UDP_Player_IP(TmpID),UDP_Player_Port(TmpID))
                  c = 0
                  For tmp.UDP_Msg = Each UDP_Msg
                     If tmp\ID = toID c = 1 : Exit
                  Next
                  tmp.UDP_msg = New UDP_Msg
                  tmp\msg$ = tmpr\msg$
                  tmp\ms = MilliSecs()
                  tmp\ID = toID
                  tmp\From = TmpID
                  If c = 0 UDP_Player_SendNewMsg(toID) = 1
                  UDP_Player_TMsg(toID) = tmp
               EndIf
            EndIf
         Case UDP_Msg_at2
            TmpID = ReadInt(UDP_ServerStream)
            Delete UDP_Player_TMsg(tmpID)
            UDP_Player_SendNewMsg(TmpID) = 1
            UDP_Player_RecvMsg(TmpID) = 0
         End Select
      Wend
   ElseIf UDP_Server = 0
      If UDP_Player_SendNewMsg(0) = 1
         tmp.UDP_Msg = First UDP_Msg
         If tmp <> Null
            WriteByte(UDP_Player_Stream(0),UDP_Msg_Att)
            WriteInt(UDP_Player_Stream(0),tmp\From)
            WriteInt(UDP_Player_Stream(i),tmp\ID)
            WriteString(UDP_Player_Stream(0),tmp\msg)
            SendUDPMsg(UDP_Player_Stream(0),UDP_Player_IP(0),UDP_Player_Port(0))
            tmp\ms = MilliSecs()
            UDP_Player_SendNewMsg(0) = 0
            UDP_Player_TMsg(0) = tmp
            UDP_Player_RecvMsg(0) = 1
         Else
            UDP_Player_SendNewMsg(0) = 0
            UDP_Player_RecvMsg(0) = 0
         EndIf
      EndIf
      If UDP_Player_RecvMsg(0) = 1
         tmp.UDP_Msg = UDP_Player_TMsg(0)
         If tmp\ms <= MilliSecs() - 64 Then
            WriteByte(UDP_Player_Stream(0),UDP_Msg_Att)
            WriteInt(UDP_Player_Stream(0),tmp\From)
            WriteInt(UDP_Player_Stream(i),tmp\ID)
            WriteString(UDP_Player_Stream(0),tmp\msg)
            SendUDPMsg(UDP_Player_Stream(0),UDP_Player_IP(0),UDP_Player_Port(0))
            tmp\it = tmp\it + 1            
            tmp\ms = MilliSecs()
            If tmp\it => 16
               Delete tmp
               UDP_Player_SendNewMsg(0) = 0
               UDP_Player_RecvMsg(0) = 0
            EndIf
         EndIf
      EndIf 
      While RecvUDPMsg(UDP_ServerStream)
         byte = ReadByte(UDP_ServerStream)
         Select byte
         Case UDP_Msg_nom
            TmpID = ReadInt(UDP_ServerStream)
            tmpr.UDP_RecvMsg = New UDP_RecvMsg
            tmpr\msg = ReadString(UDP_serverStream)
            tmpr\From = TmpID
            tmpr\att = 0
         Case UDP_Msg_new
            TmpPlayerID = ReadInt(UDP_ServerStream)
            LocalPlayer = ReadByte(UDP_serverStream)
            UDP_Player_Online(TmpPlayerID) = 1
            UDP_Player_Name$(TmpPlayerID) = ReadString(UDP_ServerStream)
            UDP_Player_Local(tmpPlayerID) = LocalPlayer
            tmpe.UDP_Event = New UDP_Event
            tmpe\typ = UDP_Msg_New
            tmpe\ID = tmpPlayerID
         Case UDP_Msg_pg1
            While Not Eof(UDP_ServerStream)
               TmpID = ReadInt(UDP_ServerStream)
               UDP_Player_Ping(TmpID) = ReadInt(UDP_ServerStream)
            Wend
            WriteByte(UDP_Player_Stream(0),UDP_Msg_pg1)
            WriteInt(UDP_Player_Stream(0),UDP_PlayerID)
            SendUDPMsg(UDP_Player_Stream(0),UDP_Player_IP(0),UDP_Player_Port(0))
            UDP_Player_pingms(0) = MilliSecs()
         Case UDP_Msg_pg2
            UDP_Player_ping(0) = MilliSecs() - UDP_Player_pingms(0)
         Case UDP_Msg_kik
            TmpID = ReadInt(UDP_ServerStream)
            UDP_Player_Online(TmpID) = 0
            tmpe.UDP_Event = New UDP_Event
            tmpe\typ = UDP_Msg_kik
            tmpe\ID = tmpID
         Case UDP_Msg_end
            TmpID = ReadInt(UDP_ServerStream)
            UDP_Player_Online(TmpID) = 0
            tmpe.UDP_Event = New UDP_Event
            tmpe\typ = UDP_Msg_end
            tmpe\ID = tmpID   
         Case UDP_Msg_att
            TmpID = ReadInt(UDP_ServerStream)
            ;UDP_Player_Msg(TmpID) = ReadString(UDP_ServerStream)
            tmpr.UDP_RecvMsg = New UDP_RecvMsg
            tmpr\msg = ReadString(UDP_serverStream)
            tmpr\From = TmpID
            tmpr\att = 1
            If tmpr\msg <> ""
               WriteByte(UDP_Player_Stream(0),UDP_Msg_at2)
               WriteInt(UDP_Player_Stream(0),UDP_PlayerID)
               SendUDPMsg(UDP_Player_Stream(0),UDP_Player_IP(0),UDP_player_Port(0))
            EndIf
         Case UDP_Msg_at2
            Delete UDP_Player_TMsg(0)
            UDP_Player_SendNewMsg(0) = 1
            UDP_Player_RecvMsg(0) = 0
         End Select
      Wend
   EndIf
End Function


Function UDP_GetMsg$()
   tmp.UDP_RecvMsg = First UDP_RecvMsg
   If tmp <> Null
      UDP_MsgID= tmp\From
      tmpMsg$ = tmp\msg
      Delete tmp
      Return tmpmsg$
   EndIf
   Return ""
End Function

Function UDP_KickPlayer(ID)
   If UDP_Server = 1   
      For i = 1 To UDP_PlayerNumber
         If UDP_Player_Online(i) = 1
            WriteByte(UDP_Player_Stream(i),UDP_Msg_Kik)
            WriteInt(UDP_Player_Stream(i),ID)
            SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
         EndIf
      Next
      UDP_Player_Online(ID) = 0         
      UDP_Player_Port(ID) = 0
      UDP_Player_IP(ID) = 0
      UDP_Player_PingMs(ID) = 0
      CloseUDPStream(UDP_Player_Stream(ID))
      tmp.UDP_Event = New UDP_Event
      tmp\typ = UDP_Msg_kik
      tmp\ID = ID      
   EndIf
End Function

Function UDP_End()
   If UDP_Server = 1
      For i = 1 To UDP_PLayerNumber
         If UDP_PLayer_Online(i) = 1
            WriteByte(UDP_Player_Stream(i),UDP_Msg_End)
            WriteInt(UDP_Player_Stream(i),0)
            SendUDPMsg(UDP_Player_Stream(i),UDP_Player_IP(i),UDP_Player_Port(i))
         EndIf
      Next
      Delay 50
      If UDP_ServerStream <> 0 CloseUDPStream(UDP_ServerStream)
      For i = 1 To UDP_PLayerNumber
         If UDP_PLayer_Online(i) = 1
            CloseUDPStream(UDP_Player_Stream(i))
         EndIf
      Next
   Else
      If UDP_ServerStream <> 0 And UDP_Player_Stream(0) <> 0
         WriteByte(UDP_Player_Stream(0),UDP_Msg_End)
         WriteInt(UDP_Player_Stream(0),UDP_PlayerID)
         SendUDPMsg(UDP_Player_Stream(0),UDP_Player_IP(0),UDP_Player_Port(0))
         Delay 50
         CloseUDPStream(UDP_Player_Stream(0))
         CloseUDPStream(UDP_ServerStream)
      EndIf
   EndIf
   
End Function 

Function UDP_GetEvent()
   tmp.UDP_Event = First UDP_Event
   If tmp <> Null
      UDP_EventID = tmp\ID
      typ = tmp\typ
      Delete tmp
      Return typ
   EndIf
   Return 0
End Function

Function UDP_CountServers(MaxServer=100,WaitTime=500)
   Dim UDP_Servertmp_name$(MaxServer)
   Dim UDP_Servertmp_ip$(MaxServer)
   Dim UDP_Servertmp_port(MaxServer)
   Dim UDP_Servertmp_pl1(MaxServer)
   Dim UDP_Servertmp_pl2(MaxServer)
   Dim UDP_Servertmp_msg(MaxServer)
   Dim UDP_Servertmp_pass(MaxServer)
   IP = UDP_IntIP(UDP_BroadcastIP())
   UDP_ServerStream = CreateUDPStream()
   WriteByte(UDP_ServerStream,UDP_Msg_ask)
   SendUDPMsg(UDP_ServerStream,IP,UDP_ServerPort)
   ms = MilliSecs()
   serv = 0
   Repeat
      If RecvUDPMsg(UDP_ServerStream)
         If ReadByte(UDP_ServerStream) = UDP_Msg_ask
            UDP_Servertmp_name$(serv) = ReadString(UDP_ServerStream)
            UDP_Servertmp_ip(serv) = DottedIP(UDPMsgIP(UDP_ServerStream))
            UDP_Servertmp_port(serv) = UDPMsgPort(UDP_ServerStream)
            UDP_Servertmp_pl1(serv) = ReadInt(UDP_ServerStream)
            UDP_Servertmp_pl2(serv) = ReadInt(UDP_ServerStream)
            UDP_Servertmp_msg(serv) = ReadString(UDP_ServerStream)
            UDP_Servertmp_pass(serv) = ReadByte(UDP_ServerStream)
            serv = serv + 1
            If serv > MaxServer Exit
         EndIf
      EndIf
   Until ms <= MilliSecs() - WaitTime
   MaxServer = serv-1
   Dim UDP_Server_name$(MaxServer)
   Dim UDP_Server_ip$(MaxServer)
   Dim UDP_Server_port(MaxServer)
   Dim UDP_Server_pl1(MaxServer)
   Dim UDP_Server_pl2(MaxServer)
   Dim UDP_Server_msg(MaxServer)
   Dim UDP_Server_pass(MaxServer)
   For i = 0 To MaxServer
      UDP_Server_name$(i) = UDP_Servertmp_name(i)
      UDP_Server_ip$(i) = UDP_Servertmp_ip(i)
      UDP_Server_port(i) = UDP_Servertmp_port(i)
      UDP_Server_pl1(i) = UDP_Servertmp_pl1(i)
      UDP_Server_pl2(i) = UDP_Servertmp_pl2(i)
      UDP_Server_msg(i) = UDP_Servertmp_msg(i)
      UDP_Server_pass(i) = UDP_Servertmp_pass(i)
   Next
   Dim UDP_Servertmp_name$(0)
   Dim UDP_Servertmp_ip$(0)
   Dim UDP_Servertmp_port(0)
   Dim UDP_Servertmp_pl1(0)
   Dim UDP_Servertmp_pl2(0)
   Dim UDP_Servertmp_msg(0)
   Dim UDP_Servertmp_pass(0)
   CloseUDPStream(UDP_ServerStream)
   Return MaxServer+1
End Function


Function UDP_GetServerName$(ID)
   Return UDP_Server_name$(ID-1)
End Function

Function UDP_GetServerIP$(ID)
   Return UDP_Server_IP$(ID-1)+":"+UDP_Server_Port(ID-1)
End Function

Function UDP_GetServerPlayerNumber$(ID)
   Return UDP_Server_pl1(ID-1)+"/"+UDP_Server_pl2(ID-1)
End Function

Function UDP_GetServerMsg$(ID)
   Return UDP_Server_msg$(ID-1)
End Function

Function UDP_GetServerPass(ID)
   Return UDP_Server_pass(ID-1)
End Function


Function UDP_CountPlayers()
   count = 0
   For i = 0 To UDP_PlayerNumber
      If UDP_Player_Online(i) = 1 count = count + 1
   Next
   Return count
End Function

Function UDP_GetPlayerName$(ID)
   count = 0
   For i = 0 To UDP_PlayerNumber
      If UDP_Player_Online(i) = 1 count = count + 1
      If count = ID Return UDP_Player_Name(i)
   Next
   Return ""
End Function

Function UDP_GetPlayerPing(ID)
   count = 0
   For i = 0 To UDP_PlayerNumber
      If UDP_Player_Online(i) = 1 count = count + 1
      If count = ID Return UDP_Player_Ping(i)
   Next
   Return 0
End Function


Function UDP_GetPlayerID(ID)
   count = 0
   For i = 0 To UDP_PlayerNumber
      If UDP_Player_Online(i) = 1 count = count + 1
      If count = ID Return i
   Next
   Return ""
End Function


Function UDP_IntIP(IP$)
   If Instr(IP$,".") <> 0 a1=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
   If Instr(IP$,".") <> 0 a2=Int(Left(IP$,Instr(IP$,".")-1)):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
   If Instr(IP$,".") <> 0 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


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
         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
         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_AddCommand$(Name$)
   UDP_CommandLine = UDP_CommandLine$+Name$+UDP_CommandSign$
End Function

Function UDP_GetCommand$()   
   txt$ = Mid(UDP_CommandLine,1,Instr(UDP_CommandLine,UDP_CommandSign)-1)
   lentxt = Len(txt)
   UDP_Command = Mid(txt$,1,Instr(txt$,",")-1)
   txt$ = Mid(txt$,Len(UDP_Command)+2,Len(txt$))
   count = 0
   oldPos = 1
   intr = Instr(txt$,",")
   While intr > 0
      count = count + 1
      oldpos = intr + 1
      intr = Instr(txt$,",",oldpos)
   Wend
   Dim UDP_Parameter(count)
   komma = 0
   While Instr(txt$,",") > 0
      UDP_Parameter(komma) = Mid(txt$,1,Instr(txt$,",")-1)
      txt$ = Right(txt$,Len(txt$)-Len(UDP_Parameter(komma))-1)
      komma = komma + 1
   Wend
   UDP_Parameter(komma) = txt$
   UDP_ParameterNumber = count
   UDP_CommandLine = Mid(UDP_CommandLine,Instr(UDP_CommandLine,UDP_CommandSign)+1,Len(UDP_CommandLine))
End Function


Function UDP_CreateLocalPlayer(Name$)
   place = UDP_GetFreePlace()
   If place = 0 Return 0
   UDP_CreateNewPlayer(place,Name$,0,0,1)
   For i = 1 To UDP_PlayerNumber
      If UDP_Player_Online(i) = 1 And i <> place And UDP_Player_local(i) = 0
         WriteByte(UDP_Player_Stream(i),UDP_Msg_new)
         WriteInt(UDP_Player_Stream(i),place)
         WriteByte(UDP_Player_Stream(i),1)
         WriteString(UDP_Player_Stream(i),UDP_Player_Name$(place))
         SendUDPMsg(UDP_Player_Stream(i),UDP_PLayer_IP(i),UDP_Player_Port(i))
      EndIf
   Next
   Return place
End Function

   


;----------


Function UDP_CreateNewPlayer(place,Name$,IP,Port,LocalPlayer=0)
   If loacalPlayer = 0 UDP_Player_Stream(place) = CreateUDPStream()
   If UDP_Player_Stream(place) = 0 Return 0
   UDP_Player_Online(place) = 1
   UDP_Player_Name$(place) = Name$
   UDP_Player_Port(place) = Port
   UDP_Player_IP(place) = IP
   UDP_Player_Local(place) = localplayer
   Return 1
End Function

Function UDP_GetFreePlace()
   For i = 1 To UDP_PlayerNumber
      If UDP_Player_Online(i) = 0 Return i
   Next
   Return 0
End Function    


Function UDP_NewPlayerNumber(Anzahl)
   UDP_PlayerNumber = Anzahl
   Dim UDP_Player_Online(Anzahl),UDP_Player_Stream(Anzahl),UDP_Player_IP(Anzahl),UDP_Player_Port(Anzahl),UDP_Player_Name$(Anzahl)
   Dim UDP_Player_Local(Anzahl)
   Dim UDP_Player_TMsg.UDP_Msg(Anzahl),UDP_Player_SendNewMsg(Anzahl),UDP_Player_RecvMsg(Anzahl)
   Dim UDP_Player_Event(Anzahl)
   Dim UDP_Player_Ping(Anzahl),UDP_Player_PingMs(Anzahl)
End Function



Viel Spaß !!!


mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
  • Zuletzt bearbeitet von ToeB am Di, Okt 13, 2009 18:48, insgesamt einmal bearbeitet

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group