Here is the full code minus types
AppTitle "Alternate Realities client Test"
Dim splitdata$(10)
; collision determinators
Const TYPE_PLAYER=1,TYPE_BULLET=2,TYPE_TARGET=3
Const TYPE_SCENERY=10,TYPE_TERRAIN=11
Global noserver=0
Global fps = 30
Global send_freq=2 ;send every fifth update
Global networked=0
Dim splitdata$(1)
SeedRnd MilliSecs()
Global my_status$
Global play.player
Global message$
Global msg$
Global client_id$
Global me_net
; basic graphics setup
;Include "start.bb"
Graphics3D 1024,768,16,2
send_ct=1
Include "3denginefunctions.bb" ; all functions for world interaction
Include "3denginetypes.bb" ; all types and structures
Include "Alpha_Include.bb" ; include the functions
Global player_model
Global water_level=-98
Global light,castle,land,ground,water,sky
Global bull_x#=1.5
Global playercount
Collisions TYPE_PLAYER,TYPE_TERRAIN,2,3
Collisions TYPE_PLAYER,TYPE_SCENERY,2,3
Collisions TYPE_BULLET,TYPE_TERRAIN,2,1
Collisions TYPE_BULLET,TYPE_SCENERY,2,1
Collisions TYPE_TARGET,TYPE_TERRAIN,2,2
Collisions TYPE_TARGET,TYPE_SCENERY,2,2
setupworld()
ChangeDir "environ"
LoadEnviron( "terrain-1.jpg","water-2_mip.bmp","sky","heightmap_256.bmp" )
ChangeDir ".."
; connect to server
name$=Input("what is your name?")
ip$="ar.game-host.org"
port=8080
Global stream=OpenTCPStream(ip$,port)
If stream=0
Print "could not connect to server...playing solo"
Print "press a key to continue"
WaitKey()
Else
split(ReadLine(stream))
play.player=createplayer(0,8,5)
playercount=Int(splitdata$(1))
play\netid=Int(splitdata$(2))
play\name$=name$
networked=1
Print "You are playerid:"+play\netid+" and there are currently " + playercount + " players connected"
WaitKey()
EndIf
Global walk=ExtractAnimSeq(play\model,280,310)
; AnimateMD2 play\model,1,1,32,100,1
play\stream=stream
If networked=1 And playercount>1
WriteLine(play\stream,1+","+play\netid+","+EntityX(play\entity)+","+EntityY(play\entity)+","+EntityZ(play\entity)+","+EntityPitch(play\entity)+","+EntityYaw(play\entity)+","+EntityRoll(play\entity)+",1,1,"+name$) ; notify new player of all existing player
If ReadAvail(stream)
For ct=1 To playercount-1
p.player=createplayer(0,8,5)
Line$=ReadLine(stream)
split(Line$)
p\netid=Int(splitdata$(2))
p\px=Float(splitdata$(3)):p\py=Float(splitdata$(4)):p\pz=Float(splitdata$(5)):p\rx=Float(splitdata$(6)):p\ry=Float(splitdata$(7)):p\rz=Float(splitdata$(8))
p\Aniseq=Int(splitdata$(9)):p\animframe=Int(splitdata$(10)):p\name$=splitdata$(11)
p\stream=stream
PositionEntity p\entity,p\px,p\py,p\pz,1
RotateEntity p\entity,p\rx,p\ry,p\rz
Next
End If
End If
camera1.ChaseCam=CreateChaseCam( play\entity )
listener=CreateListener( play\entity,.1,1,.2 )
period=1000/fps
time=MilliSecs()-period
piv=CreatePivot()
PositionEntity piv,0,10,40
AlphaInit ; initialize the gui system; create the camera used throughout the system.
AlphaGuiLoad("ar.gui") ; load the gui in, set to fill the whole screen
While Not KeyHit(1)
AlphaGui
AlphaToFront
If KeyHit(17)
wire=Not wire
WireFrame wire
EndIf
Repeat
elapsed=MilliSecs()-time
Until elapsed
;how many 'frames' have elapsed
ticks=elapsed/period
;fractional remainder
tween#=Float(elapsed Mod period)/Float(period)
For k=1 To ticks
time=time+period
If k=ticks Then CaptureWorld
TurnEntity piv,0,5,0
PositionEntity piv,0,7,40;47+Sin(time*.1)*40,40
UpdateGame()
UpdateWorld
For c.ChaseCam=Each ChaseCam
UpdateChaseCam( c )
PositionEntity sky,EntityX(c\camera),EntityY(c\camera),EntityZ(c\camera)
Next
Next
RenderWorld tween
play\px = EntityX(play\entity) : play\py = EntityY(play\entity) : play\pz = EntityZ(play\entity)
Flip
Wend
End
Function UpdateGame()
;For h.Hole=Each Hole
; UpdateHole( h )
;Next
;For b.Bullet=Each Bullet
; UpdateBullet( b )
;Next
;For s.Spark=Each Spark
; UpdateSpark( s )
;Next
UpdatePlayer(play )
updatenetwork()
End Function
Function setupworld()
do1=LoadMesh("drawftest.b3d")
ScaleEntity do1,.03,.03,.03
PositionEntity do1,0,130,0
; ScaleEntity do1,.003,.003,.003
EntityType do1, TYPE_SCENERY
text2=LoadTexture("s04_stone01_s_01.tga")
EntityTexture(do1,text2)
player_model=LoadAnimMesh( "necromancer.b3d" )
DebugLog(AnimLength(player_model));
ScaleEntity player_model,.03,.03,.03
RotateEntity player_model,0,180,0;
TranslateEntity player_model,0,-1.25,0
HideEntity player_model
; setup collisions - PLAYER TO DUNGEON
End Function
Function UpdateNetwork()
While ReadAvail(stream)
split(ReadLine(stream))
Select splitdata$(1)
Case 1
For p.player=Each player
If Int(splitdata$(2))=p\netid
p\px=Float(splitdata$(3)):p\py=Float(splitdata$(4)):p\pz=Float(splitdata$(5)):p\rx=Float(splitdata$(6)):p\ry=Float(splitdata$(7)):p\rz=Float(splitdata$(8))
p\Aniseq=Int(splitdata$(9)):p\animframe=Int(splitdata$(10)):p\name$=splitdata$(11)
PositionEntity p\entity,p\px,p\py,p\pz,1
RotateEntity p\entity,p\rx,p\ry,p\rz
p\anim_speed=1.75
If Not AnimSeq(p\model) = walk
necro_anim(p)
EndIf
EndIf
Next
Case 2
p.player=createplayer(0,1.501,5)
Animate p\model,0
p\netid=splitdata$(2)
Case 7
For p.player=Each player
If Int(splitdata$(2))=p\netid
FreeEntity p\entity
Delete p
EndIf
Next
End Select
Wend
For p.player=Each player
If Animating(p\model)=False And anim_whichone(p\model)<>1
Animate p\model,0
EndIf
Next
End Function
Function UpdateChaseCam( c.chasecam )
If KeyDown(200)
TranslateEntity c\heading,0,-3,0
Else If KeyDown(208)
TranslateEntity c\heading,0,+3,0
EndIf
dx#=EntityX(c\target,True)-EntityX(c\camera,True)
dy#=EntityY(c\target,True)-EntityY(c\camera,True)
dz#=EntityZ(c\target,True)-EntityZ(c\camera,True)
TranslateEntity c\camera,dx*.1,dy*.1,dz*.1
PointEntity c\camera,c\heading
PositionEntity c\target,0,0,0
ResetEntity c\target
PositionEntity c\target,0,3,-10
; PositionEntity c\sky,EntityX(c\camera),EntityY(c\camera),EntityZ(c\camera)
AlphaToFront
End Function
Function CreatePlayer.Player( x#,y#,z#)
p.Player=New Player
p\px=x
p\py=y
p\pz=z
p\entity=CreatePivot()
p\model=CopyEntity( player_model,p\entity )
PositionEntity p\entity,x,y,z,0
EntityType p\entity,TYPE_PLAYER
EntityRadius p\entity,1.5
ResetEntity p\entity
HideEntity player_model
Return p
End Function
Function CreateChaseCam.ChaseCam( entity )
c.ChaseCam=New ChaseCam
c\entity=entity
c\camera=CreateCamera()
c\target=CreatePivot( entity )
PositionEntity c\target,0,3,-10
EntityType c\target,TYPE_TARGET
c\heading=CreatePivot( entity )
PositionEntity c\heading,0,0,20
; c\sky=CopyEntity( sky )
Return c
End Function
Function UpdatePlayer( p.Player )
DebugLog("anim frame:"+AnimTime#(p\model))
move$=""
If KeyHit(56) ;fire?
; CreateBullet( p )
EndIf
If KeyDown(203) ;left/right
move$="L"
TurnEntity p\entity,0,6,0 ;turn player left/right
ElseIf KeyDown(205)
move$=move$+"R"
TurnEntity p\entity,0,-6,0
EndIf
If KeyDown(30) ;forward
move$=move$+"F"
If p\anim_speed<=0
p\anim_speed=1.75
; Stop
DebugLog("animseq:"+AnimSeq(p\model))
If Not AnimSeq(p\model) = walk
necro_anim(p)
EndIf
; anim_walk(p)
EndIf
MoveEntity p\entity,0,0,1
ElseIf KeyDown(44) ;back
move$=move$+"B"
If p\anim_speed>=0
p\anim_speed=-1.75
If Not AnimSeq(p\model) = walk
necro_anim(p)
EndIf
EndIf
MoveEntity p\entity,0,0,-1
ElseIf p\anim_speed
p\anim_speed=0
Animate p\model,0
; anim_idle(p)
;move$="I"
EndIf
Goto skip
ex#=EntityX(p\entity):ez#=EntityZ(p\entity)
PositionEntity p\entity,ex,TerrainY( land,ex,0,ez )+1.5,ez
Return
.skip
ty#=EntityY(p\entity)
y_vel#=(ty-p\player_y)
p\player_y=ty
If KeyHit(57) ;jump?
y_vel=5 ;2.4
;move$=move$+"JUMP"
Else
y_vel=y_vel-.5 ;2
EndIf
TranslateEntity p\entity,0,y_vel,0
If networked=1 And move$<>""
; p\Animframe=MD2AnimTime(p\model)
If Instr(move$,"L") Or Instr(move$,"R") Then WriteLine(stream,1+","+p\netid+","+p\px+","+p\py+","+p\pz+","+p\rx+","+p\ry+","+p\rz+","+7+","+p\animframe+","+p\name$)
If Instr(move$,"F") Or Instr(move$,"B") Then WriteLine(stream,1+","+p\netid+","+p\px+","+p\py+","+p\pz+","+p\rx+","+p\ry+","+p\rz+","+8+","+p\animframe+","+p\name$)
EndIf
p\px=EntityX(p\entity)
p\py=EntityY(p\entity)
p\pz=EntityZ(p\entity)
p\rx=EntityPitch(p\entity)
p\ry=EntityYaw(p\entity)
p\rz=EntityRoll(p\entity)
my_status$="A"
.totallyskip
End Function
Function LoadEnviron( land_tex$,water_tex$,sky_tex$,height_map$ )
light=CreateLight()
TurnEntity light,45,45,0
LightRange light,500
; AmbientLight 10,10,10 ;dungeon to be dark, except for torch (local) lighting
LightRange light,1
land_tex=LoadTexture( land_tex$,1 )
ScaleTexture land_tex,10,10
land=LoadTerrain( height_map$ )
EntityTexture land,land_tex
TerrainShading land,True
PositionEntity land,-1000,-100,-1000
ScaleEntity land,2000.0/256,100,2000.0/256
EntityType land,TYPE_TERRAIN
TerrainDetail land,750,True
For k=1 To n_trees
Repeat
tx#=Rnd(-70,70)-150
tz#=Rnd(-70,70)+400
ty#=TerrainY( land,tx,0,tz )
Until ty>water_level
t=CopyEntity( tree_sprite )
PositionEntity t,tx,ty,tz
ScaleSprite t,Rand(2,3),Rand(4,6)
Next
ground=CreatePlane()
EntityTexture ground,land_tex
PositionEntity ground,0,-100,0
EntityOrder ground,9
water_tex=LoadTexture( water_tex$,3 )
ScaleTexture water_tex,20,20
water=CreatePlane()
EntityTexture water,water_tex
PositionEntity water,0,water_level,0
sky=LoadSkyBox( sky_tex$ )
EntityOrder sky,10
HideEntity sky
End Function
Function LoadSkyBox( file$ )
m=CreateMesh()
;front face
b=LoadBrush( file$+"_FR.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;right face
b=LoadBrush( file$+"_LF.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;back face
b=LoadBrush( file$+"_BK.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;left face
b=LoadBrush( file$+"_RT.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;top face
b=LoadBrush( file$+"_UP.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;bottom face
b=LoadBrush( file$+"_DN.jpg",49 )
s=CreateSurface( m,b )
AddVertex s,-1,-1,-1,1,0:AddVertex s,+1,-1,-1,1,1
AddVertex s,+1,-1,+1,0,1:AddVertex s,-1,-1,+1,0,0
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
ScaleMesh m,100,100,100
FlipMesh m
EntityFX m,1
Return m
End Function
Function anim_walk(p.player)
If anim_whichone(p\model)<>2
; DebugLog("frame:"+MD2AnimTime(p\model))
; AnimateMD2 p\model,1,p\anim_speed,1,31,1
EndIf
End Function
Function anim_walk2(p.player)
If anim_whichone(p\model)<>2
; DebugLog("frame:"+MD2AnimTime(p\model))
;AnimateMD2 p\model,3,p\anim_speed,1,31,1
EndIf
End Function
Function anim_idle(p.player)
If anim_whichone(p\model)<>1
; AnimateMD2 p\model,1,1,32,100,1
End If
End Function
Function anim_whichone(md2)
End Function
Function pnu(p.player)
pack$ = EntityX(p\Entity)+" "+EntityY(p\Entity)+" "+EntityZ(p\Entity)
; SendNBMsg(1,pack,0,mainstream)
pitch# = EntityPitch(p\entity)
roll# = EntityRoll(p\entity)
pack$=LSet$( pitch,7 )+LSet$( EntityYaw(p\entity),7 )+LSet$( roll,7 )
; SendNBMsg(3,pack,nbmsgfrom(mainstream),mainstream)
End Function
Function Split(DataToSplit$)
;Declare our variables
Local splitcounter = 0, pntr = -1,chris=1, pntr2 = 0, counter = 0
; Continue to check for splits until we reach the end of the string
Local a=0
While pntr <> 0
pntr = Instr(datatosplit$, ",", chris)
; If we found a split then add 1 to the counter
If pntr > 0 Then splitcounter = splitcounter + 1
chris=pntr+1
a=a+1
Wend
; Now we have the amount of items (-1) in the string so we can dimension our array
Dim SplitData$(splitcounter + 1)
; the first item in the string is handled differently than the rest since there is no comma preceding it
pntr = 0:pntr2 = Instr(DataToSplit$, ",", 1)
SplitData$(1) = Left$(DataToSplit$, pntr2 - 1)
; After splitting off the first item we move on to the rest of the string.
For counter = 2 To splitcounter
; These 2 pointers keep track of the beginning and ending of the item we are looking for in the string.
pntr = pntr2 + 1
pntr2 = Instr(DataToSplit$, ",", pntr)
; Now that we have the items location we can pull it from the main string and insert it in to our return array
SplitData$(counter) = Mid$(DataToSplit$, pntr, (pntr2 - pntr))
Next
; Once we have done every instance of the comma delimiters we are left with the very end of the string
; This also is handled differently than the rest of the string since there is no comma after it.
SplitData$(counter) = Right$(DataToSplit$, Len(DataToSplit$) - pntr2)
; Now we can return the # of items located in the string back to the calling program.
Return (splitcounter + 1)
End Function
Function necro_anim(p.player)
;If Animateseq(p\model)=False
Animate p\model,1,p\anim_speed,1,10
;EndIf
End Function