SimpleUDP - NetzwerkLib 1.25

Übersicht BlitzBasic Codearchiv

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen

hazumu-kun

BeitragDi, Okt 13, 2009 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn ich das richtig verstehe ist der Server nichtmehr dedicated, sondern kann mitspielen, und das ist direkt in der Lib implementiert?
cool!
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

ToeB

BeitragDi, Okt 13, 2009 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop das ist richtig ^^ aber du kannst trotzdem einen Dezidierten Server drauf machen Exclamation Du musst nur den Server nicht als Spieler Definieren (nihct in der Lib, im Spiel)...

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!
 

Meik

Betreff: Falscher Link?

BeitragDi, Okt 13, 2009 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich weiss ja nicht ob das normal ist aber ich bekomme auf dem Downloadlink nur ein weißes Fenster mit einem vll 300x300px großes Werbefenster drinne und dann noch das (jetzt leider schon fast alltägliche) "Ich-schiebe-mich-von-jeder-richtung-ins-fenster-und-verstecke-meinen-x-button" Werbepopup.

Kann nichts runterladen nur arme 5 Handys umballern oder mich bei nem webbrowser Spaceschießmichtot spielchen anmelden.

Schade :/

p.s. Benutze Firefox 3.5.3 mit abgestelltem popupblocker

Edit:

Code: [AUSKLAPPEN]
<!DOCTYPE html PUBLIC
    "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title> .. bplaced.net </title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta http-equiv="Content-Language" content="en" />
        <meta http-equiv="Content-Style-Type" content="text/css" />
        <meta name="Robots" content="INDEX, FOLLOW" />
        <meta name="Copyright" content="miro" />
        <meta name="Revisit-after" content="5 days" />

        <link rel="shortcut icon" href="http://www.bplaced.net/favicon.ico" />
        <style type="text/css">
            a:link, a:visited {
                color : #000;
                text-decoration : none;
            }
            a:hover {
                color : #495796;
                text-decoration : underline;
            }
            a:active {
                color : #333399;
                text-decoration : none;
            }
        </style>
    </head>
    <body>

        <div style="margin: 250px auto 120px auto; width: 350px; height: 250px;">
            <!-- Begin: AdShopping Ad -->
            <script type="text/javascript">
                // <![CDATA[
                    if (typeof adshoppingParams == "undefined"){var adshoppingParams=new Object();}
                    adshoppingParams.zone_4292 = [{
                    "color_border" : "#F8F8F8",
                    "color_bg" : "#FFFFFF",
                    "color_link" : "#C40000",
                    "color_text" : "#000000",
                    "color_title" : "#2F59AD",
                    "end_of_params" : "true"
                    // Ende Variablen
                }];
                function loadAdShopping4292(){s=document.createElement("script");s.charset="utf-8";s.type="text/javascript";s.src="http://ads.adshopping.com/view/?zid=4292&code";if(!document.getElementsByTagName("head")){h=document.createElement("head");document.getElementsByTagName("html")[0].appendChild(h);}document.getElementsByTagName("head")[0].appendChild(s);}if(window.addEventListener){window.addEventListener("load",loadAdShopping4292, false);}else if(window.attachEvent){window.attachEvent("onload",loadAdShopping4292);}else{}
                // ]]>
            </script>

            <div id="AdShoppingZone_4292"></div>
            <!-- End: AdShopping Ad -->
        </div>
        <div style="margin: 120px auto 0 auto; width: 750px; text-align: center;">
            <!-- Begin: AdShopping Ad -->
            <script type="text/javascript">
                // <![CDATA[
                    if (typeof adshoppingParams == "undefined"){var adshoppingParams=new Object();}
                    adshoppingParams.zone_5617 = [{
                    "color_border" : "#F8F8F8",
                    "color_bg" : "#FFFFFF",
                    "color_link" : "#C40000",
                    "color_text" : "#000000",
                    "color_title" : "#2F59AD",
                    "end_of_params" : "true"
                    // Ende Variablen
                }];
                function init5617(){s=document.createElement("script");s.charset="utf-8";s.type="text/javascript";s.src="http://ads.adshopping.com/view/?zid=5617&code";if(!document.getElementsByTagName("head")){h=document.createElement("head");document.getElementsByTagName("html")[0].appendChild(h);}document.getElementsByTagName("head")[0].appendChild(s);}init5617();
                // ]]>
            </script>
            <div id="AdShoppingZone_5617"></div>
            <!-- End: AdShopping Ad -->

            <div style="font: 9px/1.2em Arial, Verdana, sans-serif;">
                <br />
                &nbsp; <a href="http://www.bplaced.net/"><span style="color: #0b5fb4;">b</span>placed.net</a>
                &nbsp; Diese Seite ist leider nicht mehr verfügbar, Fehler 404.
                &nbsp; Sorry, this page is not available any more, error 404.
                &nbsp; - <a href="http://www.bplaced.net/?location=contact">Impressum</a>

            </div>
        </div>
        <script type="text/javascript">
            document.write ('<scr' + 'ipt Language="JavaScript" src="http://www.euros4click.de/showme.php?id=15749&rnd=' + Math.random() + '&popup=false&layer=true"></scr' + 'ipt>');
        </script>
    </body>
</html>


Keine Ahnung aber sieht mir irgendwie nach 404 aus? Kenne mich mit Html nicht aus ^^
Achso, weiss auch nicht ob ich hier den Html code zeigen darf :/ Wenn nicht bitte bescheid sagen dann nehm ich den wieder raus. Vielleicht wird ja jemand draus schlau Smile

Nochwas: dieses " &nbsp; Diese Seite ist leider nicht mehr verfügbar, Fehler 404." Wird mir auf der Seite auch nicht angezeigt.
  • Zuletzt bearbeitet von Meik am Di, Okt 13, 2009 18:35, insgesamt einmal bearbeitet

ToeB

BeitragDi, Okt 13, 2009 18:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhm komisch... ich überprüf das.

Aber der aktuelle Download ist noch der Alte, also der mit der vorgänger version.


mfg ToeB


Edit : Ich weiß worans lag : Ich habe das auf einem Bplaced webspace hochgeladen aber der exestiert gar nicht mehr Embarassed

Also hier der neue Download (Ohne fehler, versprochen) :
http://www.toebproductions.de/Blitz/SimpleUDP.rar

Edit : Hehe lag am schreibfehler ^^

Have fun 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!
  • Zuletzt bearbeitet von ToeB am Di, Okt 13, 2009 20:16, insgesamt einmal bearbeitet
 

Meik

BeitragDi, Okt 13, 2009 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm ^^

Header: Alice Suche - Fehler: 500 Unbekannter Server.

Code: [AUSKLAPPEN]

Die von Ihnen eingegebene Internetadresse www.toebprodutcions.de/Bl...
konnte nicht gefunden werden. Hier sind einige Vorschläge:


Funktioniert den der Code wenn ich ihn einfach von dir hierraus kopiere? Brauch ich den dringend den download? Beispiele währen schon toll aber würde mich dann auch so durchbeißen.

MFG

Edit: Fehler gefunden.
http://www.toebprodutcions.de/Blitz/SimpleUDP.rar -> Falsch
http://www.toebproductions.de/Blitz/SimpleUDP.rar -> Richtig

c und t vertauscht Smile

Danke nochmal Smile

MFG
 

marcelm

BeitragDi, Okt 13, 2009 19:31
Antworten mit Zitat
Benutzer-Profile anzeigen
sieht echt gut aus.
funktioniert's auch außerhalb des eig. netzwerks, wenn ports etc. offen sind?

ToeB

BeitragDi, Okt 13, 2009 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja tut es ! Ist ja UDP, nur die "UDP_CountServers" - Function wird im Internet nicht klappen Wink

Und : Der Code würde auch ohne Download Functionieren Very Happy

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

BeitragSo, Dez 06, 2009 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

der link geht nicht .. gibts dafür nen grund?

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

ToeB

BeitragSo, Dez 06, 2009 14:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja sry der Vertrag bei 1&1 war abgelaufen und die Domain geküdigt. Link erneuert. Hier der neue Link :

Download :
SimpleUDP(*.rar / ~3,5Mb)

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

BeitragSo, Dez 06, 2009 14:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

danke

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

ToeB

BeitragMi, März 17, 2010 13:36
Antworten mit Zitat
Benutzer-Profile anzeigen
So eine kleine neue Version ist da : Version 1.30

Mir ist beim Schreiben der Onlinehilfe (ja sie schreitet laangsam voran Very Happy) aufgefallen, das es einen kleinen fehler gab. Undzwar kann man dem Server eine Nachricht über dem Befehl UDP_SetServerMsg mirgeben, sodass wenn ein Client nach dem Server sucht sofort sieht z.B. welche map grad dran ist, welche spielmodi er verwendet etc. ect. Aber wenn man auf dem Server direkt joined, dann weiß man ja nicht, welche map und so dran ist. Also hab ich eingebaut, das jetzt, wenn man connectet ist, man die Nachricht, die vom Server gesetzt worden ist, in der Variable "UDP_ServerMSG" auslesen kann, und dann dem entsprechend die map etc. laden.

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_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

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
   If PlayerName <> "" UDP_Player_Name$(0) = PlayerName$ Else UDP_Player_Name$(0) = "unnamed"
   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
   If PlayerNAme$ = "" 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)
         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
               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)
               Wend
               UDP_Player_Online(UDP_PlayerID) = 1
                  If PlayerName <> "" UDP_Player_Name$(UDP_PlayerID) = PlayerName$ Else UDP_Player_Name$(UDP_PlayerID) = "unnamed"
               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)
            New_Pass = UDP_DeCode(New_Pass)
            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)
                     WriteString(UDP_Player_Stream(place),UDP_ServerMsg$)
                     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

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
   



;----------


Und hier der Download :
SimpleUDP.rar (~3,4 MB)

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!

ToeB

BeitragDo, März 25, 2010 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
~Sry wegen DoppelPost, wenns da probleme gibt bitte den oberen Eintrag löschen, der war eh nicht so wichtig wie der heir ! ~

SimpleUDP - 1.5 ist nun da !!!

Was ist neu ?
Auch wenn es sich nicht viel anhört, steckte doch einiges an arbeit dahinter, an den "kleinigkeiten" sas ich gestern den ganzen tag und heute den ganzen mittag. Aber nun ist es Fertig, und die SimpleUDP ist jetzt in einem (fast) finalen zustand. Natürlich Wird es noch weitere änderungen geben, wenn mir was einfällt Wink Hier nun die neuen Features :
Arrow (auf den hinweis von Chrise) Habe ich alle If's zusaätzlich mit Thens versehen, ist besser so weil ich hab den code vor allem für einsteiger geschriben, wenn die da durchblocken wollen, ists besser wenn dort auch thens stehen Very Happy
Arrow Namen wärhend des Spieles ändern (einfach UDP_ChangeName). Beim server besteht noch die möglichkeit den namen eines anderen Spielers zu ändern
Arrow Sind zwei gleichnamige spieler auf dem server, so wird dem einen ein andere name zugewisesn . dann halt immer z.B. ToeB, dann ToeB(1) dann ToeB(2) unsw.
Arrow Spieler können gebannt werden. Sowohl für eine bestimmte zeit (nur solange der Server offen ist) oder für immer (wird gespeichert in einer datei) Gebannte ips können in der datei "Banlist.ban" wieder gelöscht werden oder auch neue hinzufefügt werden, allerdings muss bei veränderung der Datei der Server neugesartet werden.
Arrow Bei UDP_JoinGame wird jetzt auch zurückgegeben, wenn man gebannt ist und man deshlab nicht auf den server joinen kann. Zusätzlich kann man die Zeit mittels "UDP_BanTime" herausfinden (in millisekunden)
Arrow Weiter UDP_Msg_ - Constanten : UDP_Msg_nam (für namechange) ; UDP_Msg_snc für "ServerNameChange" und UDP_Msg_ban für einen gebannten spieler
Arrow Neuer parameter bei UDP_GetEvent(), und zwar UDP_EventMsg. Darin sind optionale informationen zu dem Event gespeichert (bisher braucht man es nur für namechange (alter name) und ban (banzeit).

Das ganze was neu hinzugekommen ist ist nur im Beispiel "SimpleUDP, Chat.bb" zu finden, die anderen funktionieren zwr immer noch habe ich aber noch nicht bearbeitet !

So 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             
   



;----------


Und der Download : SimpleUDP.rar

Hier nochmal einen kleinen Screen von einer sitzung :
user posted image

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

BeitragSo, Apr 04, 2010 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich finde dein Lib cool. leider wollen die server Demos bei mir nicht recht. Ich bekomme immer ein out of bone. Irgen ein Arry das nicht funktioniert.

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

ToeB

BeitragSo, Apr 04, 2010 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhm... Kannst du das Beispiel, bei dem der Fehler auftritt mal in Blitzbasic mit dem Debugger ausführen und mir villeicht sagen in welcher zeile der Fehler auftritt ?

Ich habe alle Beispiele hier bei meiner Freundin auf dem pc getestet, aber bei keinem hatte ich einen fehler...

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

BeitragMo, Apr 05, 2010 9:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.

ja das iss nu ja komisch. Heute morgen nochmal alle demos durchprobiert. Alle laufen. Der einzige unterschied iss , das ich gestern den ganzen Tag lang schon mit UDP uns TCP rumgemacht habe. Ich werde Heute abend nochmal versuchen.

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

tft

BeitragMo, Apr 05, 2010 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

habe jetzmal wider versucht, und tada ......

ich habe den Lobby Server gestartet........
danach auf dem gleichen rechner einen Client und als IP 127.0.0.1 angegeben.

Die Funktion UDP_JoinGame() verusacht einen fehler.

BlitzBasic: [AUSKLAPPEN]
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


Jetzt wo ich mir das ganze nochmal anschaue ... iss ja die Falsche funktion ..... irgendwie nicht die die zurm Denmo Verzeichniss gehört.
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

tft

BeitragMo, Apr 05, 2010 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ja daran lag es , die Simple UDP.bb war älter als die Demos. Ich habe jetzt ein UDP_Verion angehängt und gebe es vorsichtshalber aus.

gruss tft

PS: Warum kann ich mit diesem (%&*ç"*ç(/ç Bei Texten die länger werden nie richtig editieren. nach jedem Buchstaben scrollt das Fenster hoch. Und ich sehe nicht mer was ich schreibe.
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

ToeB

BeitragMo, Apr 05, 2010 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
@tft : Gut das Problem scheint gelöst zu sein...

Und das mit dem Hochscrollen hatte ich auch schonmal... was hatte ich da nochmal gemacht ? Ich glaub cookies gelöscht oder so... Musste mal ausprobieren 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!

ozzi789

BeitragDi, Apr 06, 2010 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Passiert afaik nur mit IE Wink
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Apollo30

BeitragSa, Jul 03, 2010 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe das ganze bei mir zum laufen gebracht und es geht einmal sogar bei mir.
Nur habe ich jetzt ein Problem ich habe von dem Code her das Beispiel
SimpleUDP, Action.exe genommen.
Das ganze ging mit 60 frames auch bei mir (localhost)
wenn ich das nun über Hamachi laufen lasse bekomme ich allerdings nur etwa 3Frames
Liegt das nun an Hamachi oder ist das ganze immer so langsam.

Gehe zu Seite Zurück  1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group