Networking help

Blitz3D Forums/Blitz3D Beginners Area/Networking help

Q(Posted 2005) [#1]
I just would like to say before I began, that I did not originally write this code. Ok. I don't really understand much about how all this works, so I need some help. I'm trying to make it so when I move the player, it'll show it on another player's screen. I have only accomplished being able to see the player that i'm controlling.

Here's the code so far:

client
Graphics 800,600,16,2

Include "TCP_CONTROL.bb"

Init_CLIENT()

SetBuffer BackBuffer()
player = LoadImage("demon.bmp")

While Not KeyHit(1)

	ClsColor 255, 255, 255

	Cls

	If KeyDown(203)=True Then my_xpos = my_xpos-3
	If KeyDown(205)=True Then my_xpos = my_xpos+3
	If KeyDown(200)=True Then my_ypos = my_ypos-3
	If KeyDown(208)=True Then my_ypos = my_ypos+3
	
	DrawImage player, my_xpos, my_ypos, 0

	Flip
			
	Update_CLIENT

Wend
Close_CLIENT()
End


TCP Control:
;Magic TCP Server
;////////////////

;FUNCTIONS (ADD THIS TO ANY GAME)
Type broadcast
	Field msg$
End Type

Type user
	Field player
	Field name$,stream
	Field xpos,ypos,zpos
	Field xrot,yrot,zrot
	Field update,ready
End Type

Type logit
	Field msg$,time
End Type

Global entry.logit
Global plr.user
Global bc.broadcast
Global tcp,tcp_msg$,tcp_stream
Global tcp_upd%,tcp_curplr%
Global tcp_sent%,tcp_recv%
Global tcp_username$,tcp_new,tcp_newname$
Global tcp_sending


;//////////EDIT THESE VARIABLES\\\\\\\\\\\\\\
Global tcp_updtime%=50			;Set this to the update frames. Standard is 50
Global tcp_maxplr%=6			;Set to maximum players alloted
Global tcp_ip$="local"		;MUST SET TO SERVERS IP!
Global my_xpos					;Adjust these in your game to reflect positions and rotations
Global my_ypos					;	"		"
Global my_zpos					;	"		"
Global my_xrot					;	"		"
Global my_yrot					;	"		"
Global my_zrot					;	"		"
;\\\\\\\\\\\\\\\\\\\\\///////////////////////

Function Init_SERVER()
	tcp=CreateTCPServer(8067) ;That port is ASCII for PC!
	If tcp=0 Then RuntimeError "Could not create TCP server on port 8067"
	AddLog "Server initiated"
End Function

Function Update_SERVER()
	tcp_upd%=tcp_upd%+1
	If tcp_upd%>=tcp_updtime%
		Cls
		Text 0,0,"Users loged-in: "+tcp_curplr%
		Text 0,10,"Maximum users permited: "+tcp_maxplr%
		Text 0,30,"Packets Sent: "+tcp_sent%
		Text 0,40,"Packets Recieved: "+tcp_recv%
		DrawLogs()
		Flip
	End If
	
	;Find new users
	tcp_stream=AcceptTCPStream(tcp)
	If tcp_curplr%<tcp_maxplr And tcp_stream<>0
		tcp_msg$=ReadLine(tcp_stream)
		If tcp_msg$="Login request"
			tcp_msg$=ReadLine(tcp_stream)
			failsafe=False
			For plr.user=Each user
				If plr\name$=tcp_msg$
					failsafe=True
					Exit
				EndIf
			Next
			If failsafe=True
				WriteLine(tcp_stream,"Username taken.")
				AddLog "User login failed. Name was taken."
			Else
				plr.user=New user
				plr\name$=tcp_msg$
				plr\player=LoadImage("demon.bmp")
				plr\stream=tcp_stream
				tcp_curplr%=tcp_curplr%+1
				AddLog "User '"+tcp_msg$+"' was accepted into server."
				WriteLine(tcp_stream,"User accepted")
			EndIf
		EndIf
	EndIf
	
	;Update users
	For plr.user=Each user
		plr\update=plr\update-1
		If Not Eof(plr\stream)
			If ReadAvail(plr\stream)
				tcp_msg$=ReadLine(plr\stream)
				If tcp_msg$="Coordinates"						;This is where the commands come in.
					AddLog "Accepting "+plr\name$+"'s coordinates"
					plr\xpos=ReadLine(plr\stream)
					plr\ypos=ReadLine(plr\stream)
					plr\zpos=ReadLine(plr\stream)
					plr\xrot=ReadLine(plr\stream)
					plr\yrot=ReadLine(plr\stream)
					plr\zrot=ReadLine(plr\stream)
					tcp_recv=tcp_recv+1
					plr\ready=True
				Else
					If Instr(tcp_msg$,"[broadcast]")<>0
						tcp_msg$=Trim(Replace(tcp_msg$,"[broadcast]"," "))
						bc.broadcast=New broadcast
						bc\msg$="<"+plr\name+">"+tcp_msg$
					EndIf
				EndIf
			EndIf
		Else ;User disconnected
			AddLog plr\name$+" has disconnected."
			Delete plr
			tcp_curplr%=tcp_curplr%-1
			Exit
		EndIf
		
		If plr\update<=0 And plr\ready=True
			plr\update=25
			plr\ready=False
			
			For other.user=Each user
				WriteLine(plr\stream,"Other coordinates")
				WriteLine(plr\stream,other\name$)
				WriteLine(plr\stream,other\xpos)
				WriteLine(plr\stream,other\ypos)
				WriteLine(plr\stream,other\zpos)
				WriteLine(plr\stream,other\xrot)
				WriteLine(plr\stream,other\yrot)
				WriteLine(plr\stream,other\zrot)
				tcp_sent=tcp_sent+1
				For bc.broadcast= Each broadcast
					WriteLine(plr\stream,bc\msg$)
				Next
			Next
			For bc.broadcast=Each broadcast
				Delete bc
			Next
		EndIf
	Next
End Function

Function Close_SERVER()
	For plr.user=Each user
		WriteLine(plr\stream,"SERVER CLOSING")
		Delete plr
	Next
	CloseTCPStream(tcp)
End Function



Function Init_CLIENT()
	While Len(tcp_username$)<4
		tcp_username$=Input("Desired username (over 4 charecters): ")
	Wend
	tcp=OpenTCPStream(tcp_ip$,8067)	;Remember that magic port number?
	If tcp=0
		For i=1 To 3	;Try 3 more times.
			tcp=OpenTCPStream(tcp_ip$,8067)
			If tcp<>0
				Exit
			EndIf
		Next
		If tcp=0
			RuntimeError "Could not connect to server '"+tcp_ip$+"' on port 8067"
		EndIf
	EndIf
	WriteLine(tcp,"Login request")
	WriteLine(tcp,tcp_username$)
	
	tcp_msg$=ReadLine(tcp)
	If tcp_msg$="Username taken"
		RuntimeError "The username was taken. Try again."
	Else If tcp_msg$="User accepted"
		WriteLine(tcp,"Coordinates")
		WriteLine(tcp,"0")							;YOU CAN CHANGE THESE TO STARTING COORDINATES
		WriteLine(tcp,"0")
		WriteLine(tcp,"0")
		WriteLine(tcp,"0")
		WriteLine(tcp,"0")
		WriteLine(tcp,"0")
	EndIf
End Function

Function Update_CLIENT()
	If ReadAvail(tcp)
		tcp_msg$=ReadLine(tcp)
		If tcp_msg$="Other coordinates"
			tcp_new=True
			tcp_newname$=ReadLine(tcp)
			If tcp_newname<>tcp_username$
				For plr.user=Each user
					If plr\name$=tcp_newname$
						tcp_new=False
						Exit
					EndIf
				Next
				If tcp_new=True
					plr.user=New user
					plr\name$=tcp_newname$
				EndIf
				plr\xpos=ReadLine(tcp)
				plr\ypos=ReadLine(tcp)
				plr\zpos=ReadLine(tcp)
				plr\xrot=ReadLine(tcp)
				plr\yrot=ReadLine(tcp)
				plr\zrot=ReadLine(tcp)
				tcp_curplr%=tcp_curplr%+1
			EndIf
			tcp_sending=True
		Else If tcp_msg$<>"0"	;Broadcast
			Print tcp_msg$	;Replace with log entry system
		EndIf
		If tcp_sending=True
			WriteLine(tcp,"Coordinates")
			WriteLine(tcp,my_xpos)
			WriteLine(tcp,my_ypos)
			WriteLine(tcp,my_zpos)
			WriteLine(tcp,my_xrot)
			WriteLine(tcp,my_yrot)
			WriteLine(tcp,my_zrot)
			tcp_sending=False
		EndIf
	EndIf
End Function

Function Close_CLIENT()
	CloseTCPStream(tcp)
End Function

Function BroadcastMsg(mesg$)
	WriteLine(tcp,"[broadcast]"+mesg$)
End Function

Function DrawLogs()
	cnt=0
	For entry.logit=Each logit
		Text 0,50+(10*cnt),entry\msg$
		If MilliSecs()>=entry\time
			Delete entry
		EndIf
		cnt=cnt+1
	Next
End Function

Function AddLog(mesg$)
	entry.logit=New logit
	entry\msg$=mesg$
	entry\time=MilliSecs()+2000	;Adjust this number to fit the length the log shows.
End Function


Any help would be appreciated :D


jhocking(Posted 2005) [#2]
I would suggest saving yourself a lot of effort and using BlitzPlay:
http://www.blitzcoder.com/blitzplay/


Q(Posted 2005) [#3]
I'll look into it, but I would really like to do it on my own.


Q(Posted 2005) [#4]
Is it free to sell games using it?


jhocking(Posted 2005) [#5]
The site makes this somewhat contradictory statement:
BlitzPlay Lite is offered for you to use in any way you wish. BP Pro is licensed for $50, which allows you to use it in any projects you'd like to create

It sounds like the last part of the sentence refers to the pro license, but it is unclear. You should probably email the guy to check. Then again, if you're going to use it in a commercial product just buy the pro version; $50 is not much.