All pastes #828571 Raw Edit

Someone

public text v1 · immutable
#828571 ·published 2007-12-22 16:03 UTC
rendered paste body
AppTitle "StuntMoto server"
Graphics 800,600,32,2
SeedRnd MilliSecs()
;Consts
Const Port=53006

;Types
Type Player
	Field Name$
	Field X#
	Field Y#
	Field Z#
	Field Pitch#
	Field Yaw#
	Field Roll#
	Field RearWheelSpeed#
	Field FrontWheelSpeed#
	Field TurnVol#
	Field Connection
	Field IP$
End Type

;Globals
Global Bank=CreateBank(512)
Global Server=CreateTCPServer(Port)
If Not Server Then RuntimeError "Could not create server at port " + Port


Print "Server started."

Repeat

	;Check for incoming connections
	NewConnection = AcceptTCPStream(Server)
	If NewConnection Then
		p.Player = New Player
		p\Connection = NewConnection
		p\Name$ = ""
		p\RearWheelSpeed = 0.0
		p\FrontWheelSpeed = 0.0
		p\TurnVol# = 0.0
		p\IP$ = DottedIP$(TCPStreamIP(p\Connection))
		Print p\IP$ + " connected!"
	EndIf
	
	;Loop players
	For p.Player = Each Player
		;Disconnect
		If Eof(p\Connection) Or (Not p\Connection) Then
			Print p\Ip$ + " disconnected!"
			;Broadcast players
			For p2.Player = Each Player
				If p <> p2 Then
					WriteLine p2\Connection,"2"+p\Name$
				EndIf
			Next
			;Delete player
			Delete p.Player
			
		Else
			;Read msg
			If ReadAvail(p\Connection)>0 Then
				ReceivedMsg$ = Chr$(ReadByte(p\Connection))
				
				If Left$(ReceivedMsg$,1) = "1" Then
					ReceivedMsg$=ReadLine$(p\Connection)
				
					;Received name
					p\Name$ = ReceivedMsg$
					
					While Not Freename(p,p\Name$)
						p\Name$ = "player"+Rand(0,9)+Rand(0,9)+Rand(0,9)+Rand(0,9)
					Wend
					
					Print "Name received: " + p\Name$
					
					;Broadcast new player
					For p2.Player = Each Player
						If p <> p2 Then
							WriteLine p2\Connection,"1"+p\Name$
						EndIf
					Next
				EndIf
				
				;Chat
				If Left$(ReceivedMsg$,1) = "3" Then
					ReceivedMsg$ = ReadLine$(p\Connection)
				
					;Broadcast chat
					For p2.Player = Each Player
						If Not Eof(p2\Connection) Then WriteLine p2\Connection,"3"+p\Name$+": "+ReceivedMsg$
					Next
				EndIf
				
				;Update pos
				If Left$(ReceivedMsg$,1) = "4" Then
					ReadBytes Bank,p\Connection,2,36

					PokeByte Bank,0,Asc("4")
					PokeByte Bank,1,38+Len(p\Name$)
					p\X# = PeekFloat(Bank,2)
					p\Y# = PeekFloat(Bank,6)
					p\Z# = PeekFloat(Bank,10)
					p\Pitch# = PeekFloat(Bank,14)
					p\Yaw# = PeekFloat(Bank,18)
					p\Roll# = PeekFloat(Bank,22)
					p\RearWheelSpeed# = PeekFloat(Bank,26)
					p\FrontWheelSpeed# = PeekFloat(Bank,30)
					p\TurnVol# = PeekFloat(Bank,34)
					
					PokeString(p\Name$,Bank,38)

					
					;Print "Received "+p\X#+","+p\Y#+","+p\Z#
					
					;Broadcast
					For p2.Player = Each Player
						If Not Eof(p2\Connection) Then
							If p <> p2 Then
								WriteBytes Bank,p2\Connection,0,38+Len(p\Name$)
							EndIf
						EndIf
					Next
					
				EndIf
			EndIf
		EndIf
	Next


Until KeyHit(1)

Function Freename(p4.Player,TestName$)
	For p3.Player = Each Player
		If (p3\Name$ = TestName$) And (p3<>p4) Then Return False
	Next
	Return True
End Function

Function StringToBank(FromString$,ToBank,Count)
	For t=0 To Count-1
		PokeByte ToBank,t,Asc(Mid$(FromString,t+1,1))
	Next
End Function

Function PokeString(FromString$,ToBank,Offset)
	For t=0 To Len(FromString$)-1
		PokeByte ToBank,t+OffSet,Asc(Mid$(FromString$,t+1,1))
	Next
End Function

Function PeekString$(FromBank,OffSet,Count)
	rString$=""
	For t=Offset To Offset+Count-1
		rString$ = rString$ + Chr$(PeekByte(FromBank,t))
	Next
	Return rString$
End Function