Direct Play Funktioniert nicht :DD

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Bobo2040

Betreff: Direct Play Funktioniert nicht :DD

BeitragDo, Feb 06, 2014 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu Very Happy
Nach längerer Pause melde ich mich mal Wieder hier Very Happy
Und habe nen kleines Problem und zwar will ich mal Direct Play ausprobieren
habe dazu nen Beispiel Script gefunden für Client und Server und klappt prima
aber wenn ich es jetzt bei mir einbaue dann nichtmehr Very Happy
Kommt dieser Fehler "Runtime Error <br/> Multiplayer game already Started!"
Aber der kommt erst wenn das Fenster aktiv wird also wenn ich draufklicke dann kommt der Fehler wenn ich nicht draufklicke bleibt das Fenster einfach schwarz...
Ich habe die Funktion Client() im "Spiel" relativ weit und in der HS drinne und davon auch keine Variablen Globalisiert oder so ...
Die Daten meines Spielers also X und Y werden einmal gesendet dann bricht es ab und es gibt den Error
Hier mal der Code so wie er Funktioniert:
BlitzBasic: [AUSKLAPPEN]

Graphics 640,480,16,2
SetBuffer BackBuffer()

gamename$="LightOrbit v0.0.9"
gameIP$="0.0.0.0" ;insert IP here

Select JoinNetGame(gamename$,gameIP$)
Case 1
Print "Joined!"
Default
Print "failed to locate server"
Print "press any key to close"
WaitKey
End Select

player=CreateNetPlayer("player"+Rnd(1,100))

x=100
y=100

;main loop
While Not KeyDown(1)
Cls



;cursor keys to move around
If KeyDown(203) Then x = x - 10
If KeyDown(205) Then x = x + 10
If KeyDown(200) Then y = y - 10
If KeyDown(208) Then y = y + 10


;send message
io = MilliSecs() / 50
If io > ioi Then
msgx$=x
msgy$=y
SendNetMsg 1,msgx$+msgy$, player, server, 1
ioi = io
End If

;incoming messages
If RecvNetMsg() Then
msgType = NetMsgType()
msgFrom = NetMsgFrom()
msgData = NetMsgData$()
a# = Mid(msgdata,1,3)
b# = Mid(msgdata,3,6)
End If


;draw player
Color 255, 255, 0
Oval x, y, 20, 20, True
;draw player
Color 255, 0, 0
Oval a, b, 20, 20, True

Flip
Wend

End
;Server
gamename$="RPG"

Select HostNetGame(gamename$)
Case 2
Print "Successfully started host game!"
Default
Print "Game was unable to start!"
End Select

host=CreateNetPlayer("server")

While Not KeyDown(1)

;incoming messages
If RecvNetMsg() Then
msgType = NetMsgType()
msgFrom = NetMsgFrom()
msgData = NetMsgData$()
x$ = Mid(msgdata,1,3)
y$ = Mid(msgdata,3,6)
Print "receivinbg message from player " + msgfrom + "..."
Print "message type = " + msgtype
Print "player X = " + x
Print "player Y = " + y
;send message
SendNetMsg 1,x$+y$, server, 0, 1
Print "sending player coords....
End If



Wend


Und jetzt meine Funktion
BlitzBasic: [AUSKLAPPEN]

Function Client()
Local gamename$="RPG"
Local gameIP$="0.0.0.0" ;insert IP here

Select JoinNetGame(gamename$,gameIP$)
Case 1
Print "Joined!"
Default
Print "failed to locate server"
Print "press any key to close"
WaitKey
End Select

player=CreateNetPlayer("player"+Rnd(1,100))

;send message
io = MilliSecs() / 50
If io > ioi Then
msgx$=SpielerX
msgy$=SpielerY
SendNetMsg 1,msgx$+msgy$, player, server, 1
ioi = io
End If

;incoming messages
If RecvNetMsg() Then
msgType = NetMsgType()
msgFrom = NetMsgFrom()
msgData = NetMsgData$()
a# = Mid(msgdata,1,3)
b# = Mid(msgdata,3,6)
End If
;Gegner Zeichnen
DrawImage SpielerShip,a-KameraX-25,b-KameraY-25

End Function


Der Server bleibt gleich... und den Server starte ich auch bevor ich versuche das Spiel
zu starten Very Happy
Mfg

EDIT:
Im Debug Log steht :

Select JoinNetGame(gamename$,gameIP$)

Also das ist Rot makiert Very Happy

BtbN

BeitragDo, Feb 06, 2014 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
DirectPlay ist hoffnungslos veraltet und sollte nicht mehr benutzt werden.
 

Bobo2040

BeitragDo, Feb 06, 2014 20:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Joar Very Happy
Zu dem Fehler war meine eigenen Blödheit xD
Habe JoinnetGame() in der Schleife drinne gehabt deshalb wollte er Permanent in das Gleiche Spiel rein...geht jetzt
nur iwie sehr Schwach die Daten werden oft nur Halb versendet und auch MultiThreading oder wie das heist klappt nicht Very Happy
ich kann mit 2 Spielern max. drinne sein wobei das nichtmal flüssig läuft da z.B. Spieler1 10 packete sendet und Spieler2 danach erst 10 pakete sendet also abwechselnd und zwar mit so ner großen zeitspanne das es für mich zwecklos ist -_-
Dann muss ich wohl doch an UDP ran Very HappyD
Mfg

Dottakopf

BeitragFr, Feb 07, 2014 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
nutze nicht direkt play.. Evil or Very Mad
Rechtschreibfehler gelten der allgemeinen Belustigung!

DAK

BeitragSa, Feb 08, 2014 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
DirectPlay ist selbst zu der Zeit als es noch aktuell war nur recht wenig verwendet worden. Es hat einen doch nicht unbeachtlichen Overhead und dabei keinen besonderen Funktionsumfang. Man kann sich das alles recht einfach mit TCP oder UDP nachbasteln.

Du solltest dir auch bevor du dich auf ein Protokoll festlegst noch Gedanken darüber machen, wie dein Protokoll funktionieren wird. Schau dir dazu noch dringend diesen Link an (ich kenn den nur auf Englisch, weiß nicht, ob es den auf Deutsch gibt): klick.

Mir schaut es so aus als würdest du im Moment allen Spielern jedes Frame alle Daten schicken wollen. Das funktioniert bestenfalls im LAN, über Internet kannst du das so ziemlich vergessen, vor allem wenn da mehr als zwei Spieler drinnen sein sollen.
Gewinner der 6. und der 68. BlitzCodeCompo

Dottakopf

BeitragSa, Feb 08, 2014 9:43
Antworten mit Zitat
Benutzer-Profile anzeigen
nun ich denke für die ersten schritte ist es erstmal ok wenn du jeden fame sendest.. natürlich aufpassen dass du nicht 100 mal die msg abschickst und dein spieler sich 0 bewegt hat...

arbeite beim programieren viel mit debuglog um später schnell einen netzwerkfehler zu finden.
zu der Geschwindigkeit. Ich hatte 13 Spieler über internet verbunden habe jeden postionsfame senden lassen und es lief locker flüssig. Nur schüsse oder irgendwas was schnell richtig viel wird, darf nur auf der client seite berechnet werden.

Wenn du die basisc beherrscht kannst du dich an die tiefe der thematik machen. Um das umzusetzen muss man schon im kopf/Papier ein durchgängiges konzept haben. On the Fly proggt man das nicht.

Viel Erfolg!
Rechtschreibfehler gelten der allgemeinen Belustigung!
 

Bobo2040

BeitragSa, Feb 08, 2014 20:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay Very Happy
So habe mich nun mal dran gesetzt und bisschen was auf nen Blatt gezeichnet und geschrieben
was und soweiter an server und clienten verteilt werden soll...
so nun hat es auch geklappt Very Happy also die kommunikation zwischen server und client funktioniert einwandfrei Very Happy
aber ich will jetzt für einen user erstmal überprüfen ob es für diesen user schon ein type gibt
also ob sein username schon existiert im type aber wie mache ich das ?
Dachte an eine for ...each ...next schleife aber denken und können/wissen ist nen unterschied Very Happy
Hier mal mein Code bis jetzt :
Client
BlitzBasic: [AUSKLAPPEN]

;Client
Type Enemies
Field ip
Field port
Field username$
Field x_coor
Field y_coor
Field map
Field rang
Field inlog
Field damage
Field ship_rotation
Field hitpoints
Field shield
End Type

Global x_coor=100
Global y_coor=250
Global map=2
Global rang=1
Global inlog="Bobo2040"
Global damage=25000
Global ship_rotation=1
Global hitpoints=306000
Global shield=262000

Global server_port=6354
Global server_ip=INT_IP("127.0.0.1")
Global udpStream=CreateUDPStream()

If Not udpStream Then
Print "Verbindung fehlgeschlagen.."
EndIf

Print "Suche nach Server..."
Print "Server gefunden..."
Print "Server anfrage gestartet!"

WriteByte udpStream,1 ; Frage ob erlaubnis erteilt wird
Print "Versuche zu verbinden"
WriteLine udpStream,Input("Username:")
WriteInt udpStream,x_coor
WriteInt udpStream,y_coor
WriteInt udpStream,map
WriteInt udpStream,rang
WriteLine udpStream,inlog
WriteInt udpStream,damage
WriteInt udpStream,ship_rotation
WriteInt udpStream,hitpoints
WriteInt udpStream,shield
;Daten an Server senden
SendUDPMsg udpStream,server_ip,server_port

Print "Warte auf Server antwort"



;###### Hauptschleife ######
Repeat
Client()
Until KeyHit(1)



;###### Funktionen ######
Function Client()
Local ipRecv=RecvUDPMsg(udpStream) ; UDP Nachricht abrufen
If ipRecv=0 Then Return ; Falls nichts kam -> Return

Local portRecv=UDPMsgPort(udpStream) ; Port abspeichern

If ipRecv<>server_ip Or portRecv<>server_port Then Print "Hacked"
;handler holen
Local handler=ReadByte(udpStream)
Select handler
Case 1 ; Erlaubnis vom Server bekommen
Print "Server hat Anfrage bearbeitet.."
Print "Du bist nun eingeloggt!"

Case 2 ; Daten von anderen Usern
Print "Erhalte daten..."
Local oC_ip=ReadInt(udpStream)
Local oC_prot=ReadInt(udpStream)
Local oC_username$=ReadLine(udpStream)
Local oC_coor_x=ReadInt(udpStream)
Local oC_coor_y=ReadInt(udpStream)
Local oC_map=ReadInt(udpStream)
Local oC_rang=ReadInt(udpStream)
Local oC_inlog=ReadLine(udpStream)
Local oC_damage=ReadLine(udpStream)
Local oC_ship_rotation=ReadInt(udpStream)
Local oC_hitpoints=ReadInt(udpStream)
Local oC_shield=ReadInt(udpStream)
For
Local info.Enemie=New Enemie ; Neuer Feind wird erstellt
info\ip=oC_ip
info\port=oC_port
info\username$=oC_username$
info\coor_x=oC_coor_x
info\coor_y=oC_coor_y
info\map=oC_map
info\rang=oC_rang
info\inlog=oC_inlog
info\damage=oC_damage
info\ship_rotation=oC_ship_rotation
info\hitpoints=oC_hitpoints
info\shield=oC_shield

End Select

End Function

;Ip umwandeln
Function INT_IP(IP$) ; DottedIP to IntIP
a1 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
a2 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
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


WaitKey


Die int_ip funktion ist NICHT von mir sondern aus dem internet!

der server:
BlitzBasic: [AUSKLAPPEN]

Type Client
Field ip
Field dip
Field port
Field name$
Field x_coor
Field y_coor
Field map
Field rang
Field inlog
Field damage
Field ship_rotation
Field hitpoints
Field shield
End Type


Global ServerPort=6354
Global udpStream=CreateUDPStream(ServerPort)
Print "Versuche Server zu starten..."

If Not udpStream Then
Print "Server Timeout please Choose another Port and retry"
EndIf

Print "Server gestartet!"

Repeat

RecvMsg()
Delay 64

Until KeyHit(1)

;###### Funktionen ######
Function RecvMsg() ;Empfängt die Nachrichten und verarbeitet sie :3
Local ipRecv=RecvUDPMsg(udpStream) ; Die IP wird ausgelesen
If ipRecv=0 Then Return ; Falls keine Message ankam

Local portRecv=UDPMsgPort(udpStream) ; Der Port wird ausgelesen
Local handler=ReadByte(udpStream) ; List aus was der Client will

;### Case 1 -> Will Beitreten
;### Case 2 -> Sendet Koordinaten und weitere Daten (Hp,Sh,x,y,dmg,rang)
;### Case 3 -> Verlässt den Raum
Print "5"
Select handler
Case 1
Local info.Client=New Client ; Neuer Client wird erstellt

info\ip=ipRecv ; Die Client IP
info\dip=DottedIP(ipRecv) ; Sieht schöner aus -> 127.0.0.1 z.b.
info\port=portRecv ; Port abspeichern
info\name=ReadLine(udpStream) ; Username
info\x_coor=ReadInt(udpStream) ; x Koordinaten
info\y_coor=ReadInt(udpStream) ; y Koordinaten
info\map=ReadInt(udpStream) ; Map
info\rang=ReadInt(udpStream) ; Rang Colonell Captain etc
info\inlog=ReadLine(udpStream) ; wen er im Log hat
info\damage=ReadInt(udpStream) ; Wie viel Schaden macht er gerade?
info\ship_rotation=ReadInt(udpStream) ; wie ist sein schiff gedreht
info\hitpoints=ReadInt(udpStream) ; Hitpoints
info\shield=ReadInt(udpStream) ; Schilde

;#### Allgemeine Daten ausgeben
Print "* "+info\name+" hat sich von "+info\dip+":"+info\port+" eingeloggt *"
Print "Daten:"
Print "Username:"+info\name
Print "Koordinaten (x/y):"+info\x_coor+"/"+info\y_coor
Print "Standort (Map):"+info\map
Print "Rang:"+info\rang
Print "Logbuch:"+info\inlog
Print "Schaden:"+info\damage
Print "Schiff drehung:"+info\ship_rotation
Print "Hitpoints:"+info\hitpoints
Print "Schild:"+info\shield
;### Daten ausgabe Ende

;Erlaubniss erteilen
WriteByte(udpStream,1)
;Nachricht absenden
SendUDPMsg(udpStream,info\ip,info\port)
Print "Erlaubniss erteilt!"
Case 2 ; Falls normale Daten weitergeleitet werden sollen
For s_info.Client=Each Client
If s_info<>info
WriteByte udpStream,2 ;Daten verteilen
WriteInt udpStream,s_info\ip ; Ip
WriteInt udpStream,s_info\port ; Port
WriteLine udpStream,s_info\name ; Username
WriteInt udpStream,s_info\x_coor ; X koordinaten
WriteInt udpStream,s_info\y_coor ; Y koordinaten
WriteInt udpStream,s_info\map ; Map
WriteInt udpStream,s_info\rang ; Rang
WriteLine udpStream,s_info\inlog ; Logbuch
WriteInt udpStream,s_info\damage ; Schaden
WriteInt udpStream,s_info\ship_rotation ; Schiff drehung
WriteInt udpStream,s_info\hitpoints ; Hitpoints
WriteInt udpStream,s_info\shield ; Schild

;Daten senden
SendUDPMsg udpStream,s_info\ip,s_info\port
EndIf
Next
End Select
End Function



So bei client beim zweiten case wollte ich bevor er das in ein type speichert
erstmal überprüfen ob der eintrag schon existiert Very Happy
Kann mir da jemand weiterhelfen ?


Über tipps zu meinem code würde ich mich freuen D:

PS: ich weiß das delay veraltet ist und nicht benutzt werden sollte
benutze es aber jetzt in der testphase um den code klein zu halten zwecks übersichtlichkeit etc.

Xeres

Moderator

BeitragSa, Feb 08, 2014 20:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe nichts vom Netzwerk Zeug - aber anstatt das Rad da neu zu erfinden, solltest du vielleicht eine der Libs dafür benutzen.
Types allerdings habe ich begriffen und würde sagen, wer "info.Typename" schreibt, hat das nicht. Ganz kurz also: "zahl%" Ist eine Variable vom Typ Integer, "text$" ist eine Variable vom Typ String und "client.TClient" ist eine Variable vom Typ TClient. Üblicherweise werden die Types mit vorangestelltem T deklariert, damit man beim Zugriff zwischen Instanz und Klasse unterscheiden kann.
Dein Instinkt ist im Übrigen richtig: Du kannst alle Objekte der Reihe nach mit for..each durchgehen und den Namen vergleichen. Eine schnellere Möglichkeit existiert in BB meines Wissens auch nicht.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Bobo2040

BeitragSa, Feb 08, 2014 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay ich änder das mal schnell Very Happy

So ich hab jetzt überall mal % bzw $ davor gemacht Very Happy
Dachte ich brauchs nicht weils ja kein errror gab bzw es funktioniert hat ;D

so kannst du mir aber bei dem mit der for each next schleife helfen ;D
Kann das mit den types nicht so wirklich weiß wie die funktionieren aber nicht wie ich die daten so
durchlaufen lasse bei nem array wäres ja einfach ne for step x next schleife das kann
ich ja aber mir wurden types geraten also wollte ich es mit types probieren Very Happy
nen lösungsanstaz wäre nett Very Happy

DAK

BeitragSo, Feb 09, 2014 8:11
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
For x.TTypename = Each x.TTypename
If (x\Name=Spielername) Then
;Spieler gefunden!
EndIf
Next


Hätt man sich aber auch ohne Weiteres per Google oder aus der Hilfe holen können... (Siehe Each-Befehl in der Hilfe)

Beim nächsten Mal schau in die Hilfe unter das Thema, worüber du wissen willst (z.B. Datenverwaltung/Types) und lies dir dort alle Befehle durch. Die haben alle Sample Codes, mit denen du auch sehen kannst, wie du sie verwendest.
Gewinner der 6. und der 68. BlitzCodeCompo

Xeres

Moderator

BeitragSo, Feb 09, 2014 13:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann wäre Schritt eins erst mal Types zu verstehen, wenn du die benutzen willst. Es gibt ein paar Tutorials im Forum - nicht alle perfekt aber ausreichend um sich die Grundlagen an zu eigenen.
Wenn du dann noch Schwierigkeiten hast, gebe ich gerne ein paar Hinweise.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Bobo2040

BeitragSo, Feb 09, 2014 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay danke Very Happy
Xerxes kennst du dich mit UDP aus ?
Weil habe iwie nen Bug drinne denn er soll einen neuen User in ein Type speichern was auch funktioniert
also der Server speichert es ab und leitet es auch weiter aber aus irgendeinem grund werden die Daten von anderen Usern nicht an die Cliente verteilt also nur der eigene User wird im Type vom Clienten gespeichert aber ein anderer nicht -_-
Der Fehler liegt glaube ich beim Clienten...
Client:
BlitzBasic: [AUSKLAPPEN]

;Client
Type Enemies
Field ip%
Field port%
Field username$
Field x_coor%
Field y_coor%
Field map%
Field rang%
Field inlog$
Field damage%
Field ship_rotation%
Field hitpoints%
Field shield%
End Type

Global x_coor%=100
Global y_coor%=250
Global map%=2
Global rang%=1
Global inlog$="Bobo2040"
Global damage%=25000
Global ship_rotation%=1
Global hitpoints%=306000
Global shield%=262000

Global server_port=6354
Global server_ip=INT_IP("127.0.0.1")
Global udpStream=CreateUDPStream()

If Not udpStream Then
Print "Verbindung fehlgeschlagen.."
EndIf

Print "Suche nach Server..."
Print "Server gefunden..."
Print "Server anfrage gestartet!"

Global username$=Input("Username:")

WriteByte udpStream,1 ; Frage ob erlaubnis erteilt wird
Print "Versuche zu verbinden"
WriteLine udpStream,username$
WriteInt udpStream,x_coor%
WriteInt udpStream,y_coor%
WriteInt udpStream,map%
WriteInt udpStream,rang%
WriteLine udpStream,inlog$
WriteInt udpStream,damage%
WriteInt udpStream,ship_rotation%
WriteInt udpStream,hitpoints%
WriteInt udpStream,shield%
;Daten an Server senden
SendUDPMsg udpStream,server_ip,server_port

Print "Warte auf Server antwort"



;###### Hauptschleife ######
Repeat
Client()
Until KeyHit(1)



;###### Funktionen ######
Function Client()
Local ipRecv=RecvUDPMsg(udpStream) ; UDP Nachricht abrufen
If ipRecv=0 Then Return ; Falls nichts kam -> Return

Local portRecv=UDPMsgPort(udpStream) ; Port abspeichern

If ipRecv<>server_ip Or portRecv<>server_port Then Print "Hacked"
;handler holen
Local handler=ReadByte(udpStream)
Select handler
Case 1 ; Erlaubnis vom Server bekommen
Print "Server hat Anfrage bearbeitet.."
Print "Du bist nun eingeloggt!"

Case 2 ; Daten von NEUEN nutzern werden gespeichert
;### Hier ist der Fehler irgendwo ###
oC_ip%=ReadInt(udpStream)
oC_prot%=ReadInt(udpStream)
oC_username$=ReadLine(udpStream)
oC_coor_x%=ReadInt(udpStream)
oC_coor_y%=ReadInt(udpStream)
oC_map%=ReadInt(udpStream)
oC_rang%=ReadInt(udpStream)
oC_inlog$=ReadLine(udpStream)
oC_damage%=ReadLine(udpStream)
oC_ship_rotation%=ReadInt(udpStream)
oC_hitpoints%=ReadInt(udpStream)
oC_shield%=ReadInt(udpStream)

info.Enemies=New Enemies ; Neuer Feind wird erstellt

info\ip%=oC_ip
info\port%=oC_port
info\username$=oC_username$
info\x_coor%=oC_coor_x
info\y_coor%=oC_coor_y
info\map%=oC_map
info\rang%=oC_rang
info\inlog$=oC_inlog
info\damage%=oC_damage
info\ship_rotation%=oC_ship_rotation
info\hitpoints%=oC_hitpoints
info\shield%=oC_shield

Case 3 ;Daten abspielen
For s_info.Enemies=Each Enemies
Print s_info\username$
Next

End Select

End Function

;Ip umwandeln
Function INT_IP(IP$) ; DottedIP to IntIP
a1 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
a2 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, "."))
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


WaitKey


Der Server:
BlitzBasic: [AUSKLAPPEN]

Type Client
Field ip%
Field dip%
Field port%
Field name$
Field x_coor%
Field y_coor%
Field map%
Field rang%
Field inlog$
Field damage%
Field ship_rotation%
Field hitpoints%
Field shield%
End Type


Global ServerPort=6354
Global udpStream=CreateUDPStream(ServerPort)
Print "Versuche Server zu starten..."

If Not udpStream Then
Print "Server Timeout please Choose another Port and retry"
EndIf

Print "Server gestartet!"

Repeat

RecvMsg()
ShareData()
Delay 1024

Until KeyHit(1)

;###### Funktionen ######
Function RecvMsg() ;Empfängt die Nachrichten und verarbeitet sie :3
Local ipRecv=RecvUDPMsg(udpStream) ; Die IP wird ausgelesen
If ipRecv=0 Then Return ; Falls keine Message ankam

Local portRecv=UDPMsgPort(udpStream) ; Der Port wird ausgelesen
Local handler=ReadByte(udpStream) ; List aus was der Client will

;### Case 1 -> Will Beitreten
;### Case 2 -> Sendet Koordinaten und weitere Daten (Hp,Sh,x,y,dmg,rang)
;### Case 3 -> Verlässt den Raum
Select handler
Case 1
Local info.Client=New Client ; Neuer Client wird erstellt

info\ip%=ipRecv ; Die Client IP
info\dip%=DottedIP(ipRecv) ; Sieht schöner aus -> 127.0.0.1 z.b.
info\port%=portRecv ; Port abspeichern
info\name$=ReadLine(udpStream) ; Username
info\x_coor%=ReadInt(udpStream) ; x Koordinaten
info\y_coor%=ReadInt(udpStream) ; y Koordinaten
info\map%=ReadInt(udpStream) ; Map
info\rang%=ReadInt(udpStream) ; Rang Colonell Captain etc
info\inlog%=ReadLine(udpStream) ; wen er im Log hat
info\damage%=ReadInt(udpStream) ; Wie viel Schaden macht er gerade?
info\ship_rotation%=ReadInt(udpStream) ; wie ist sein schiff gedreht
info\hitpoints%=ReadInt(udpStream) ; Hitpoints
info\shield%=ReadInt(udpStream) ; Schilde

;#### Allgemeine Daten ausgeben
Print "* "+info\name$+" hat sich von "+info\dip%+":"+info\port%+" eingeloggt *"
Print "Daten:"
Print "Username:"+info\name$
Print "Koordinaten (x/y):"+info\x_coor%+"/"+info\y_coor%
Print "Standort (Map):"+info\map%
Print "Rang:"+info\rang%
Print "Logbuch:"+info\inlog$
Print "Schaden:"+info\damage%
Print "Schiff drehung:"+info\ship_rotation%
Print "Hitpoints:"+info\hitpoints%
Print "Schild:"+info\shield%
;### Daten ausgabe Ende

;Erlaubniss erteilen
WriteByte(udpStream,1)
;Nachricht absenden
SendUDPMsg(udpStream,info\ip%,info\port%)
Print "Erlaubniss erteilt!"

Print "Neuer User wird gespeichert.."
Print "Andere User werden Informiert.."
For s_info.Client=Each Client ;### Hier ist irgendwo glaube ich auch ein Fehler..###
If s_info\name$=info\name$ Then
Print ""
Else
WriteByte udpStream,2
WriteInt udpStream,s_info\ip% ; Ip
WriteInt udpStream,s_info\port% ; Port
WriteLine udpStream,s_info\name$ ; Username
WriteInt udpStream,s_info\x_coor% ; X koordinaten
WriteInt udpStream,s_info\y_coor% ; Y koordinaten
WriteInt udpStream,s_info\map% ; Map
WriteInt udpStream,s_info\rang% ; Rang
WriteLine udpStream,s_info\inlog$ ; Logbuch
WriteInt udpStream,s_info\damage% ; Schaden
WriteInt udpStream,s_info\ship_rotation% ; Schiff drehung
WriteInt udpStream,s_info\hitpoints% ; Hitpoints
WriteInt udpStream,s_info\shield% ; Schild
;Daten senden
SendUDPMsg udpStream,s_info\ip%,s_info\port%
Print "Daten versendet.."
EndIf
Next
End Select
End Function


Function ShareData()
For s_info.Client=Each Client
WriteByte udpStream,3
SendUDPMsg udpStream,s_info\ip%,s_info\port%
Next
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group