I got weird probs

Blitz3D Forums/Blitz3D Programming/I got weird probs

I have interrmittent failures of some functions. I suspect it is because I am not doing something right.

This is what I have trouble with.
1. The crossbow shoots arrows but not all the time. It still counts down in ammo but no arrow is seen.

2. Trees will not ignore water. I try to make them ignore water... I suspect that I am going to have to do the ignore water thing when making up the initial positions.

3. Anyone that has an idea for a more spohisticated AI than pointentity / collide please let me know!

The code is here:
http://www.silverimports.com/crapola/

All told the size is about 20mg. If you are dialup this may take 9 - 14min... cable and dsl much sater!

I could really use another perspective on this! : )

_ROOK

FYI, 20 megs is a minimum one hour download on 56k ( hence why I'm not going to download )

If you could narrow it down and post a little code, I think you'll get more help than if you ask ppl to download 20 megs. Heck, that's a lot for a full game.

Certainly... I just added the full DL so you would have all the models and textures and sounds! :)

Well the code looks like this:

; Gnash v1.alpha
; Ralph Dunn
; June 10, 2004
; starting to come together
; -------------------

Graphics3D 800,600
SetBuffer BackBuffer()
SeedRnd (MilliSecs())

campiv = CreatePivot()
Global camera = CreateCamera(campiv)
floorpivot=CreatePivot()
PositionEntity camera,1466,200,410  ; 600,440,2000 - BUILDING 1466,200,410 - PAD
CameraRange camera,.1,1500
CameraFogRange camera,10,1300
EntityRadius camera,8,41
EntityType camera,1
Global gun_timer=MilliSecs() ; timer to track the difference in millisecs
Global gun_time=750 ; time in milliseconds that the gun will fire
Global ammo
Global rs
; --------------

HidePointer

;setup lighting
light=CreateLight()
RotateEntity light,45,45,0
AmbientLight 32,32,32   ; was 32,32,32

; =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= SOUND
; Load Sound for backmusic
Global windnoise=LoadSound("media/windlow.ogg")
LoopSound windnoise
Global wind=LoadSound("media/windy1.ogg")
LoopSound wind
firebow=LoadSound("media/click1.wav")
Global doorx=LoadSound("media/metaldoor.wav")
Global walk=LoadSound("media/walk2.ogg")
SoundPitch walk,18000
LoopSound walk
play_walk=PlaySound(walk)

; =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= MAP

Global terr=LoadTerrain("textures\hmap_1024.bmp")
ScaleEntity terr,25,400,25
PositionEntity terr,-20*512,0,-20*512
EntityFX terr,1
EntityType terr,2	;Load terrain

;apply textures To terrain	
tex1=LoadTexture( "textures\coolgrass1.bmp",1 )
ScaleTexture tex1,10,10
tex2=LoadTexture( "textures\lmap_256.bmp" ) ; i like a nice set of colors
ScaleTexture tex2,TerrainSize(terr),TerrainSize(terr)
EntityTexture terr,tex1,0,0
EntityTexture terr,tex2,0,1

; Draw the Aimpoint where the TEXT goes or you never see it
aim=LoadImage("textures\aimpoint3.png")


;create cloud planes
cloud=LoadTexture( "textures\cloud_2.bmp",3)
ScaleTexture cloud,1000,1000
p=CreatePlane()
EntityTexture p,cloud
EntityFX p,1
PositionEntity p,0,900,0
p=CopyEntity( p )
RotateEntity p,0,0,180

;create water plane
tex=LoadTexture( "textures\wawa1.bmp",3 )
ScaleTexture tex,128,128
Global w=CreatePlane()
EntityTexture w,tex
EntityType w,6
EntityBlend w,1
EntityAlpha w,.75
PositionEntity w,0,39,0
EntityFX w,1
;EntityType p,2


; =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ENTITYS

;cool castle
Global castle=LoadMesh( "textures\tower1.b3d" )
PositionEntity castle,418,125,809
EntityFX castle,0
EntityType castle,2
UpdateNormals castle
TurnEntity castle,0,164,0
ScaleEntity castle,18,30,18

; GREAT HALL
Global ghall=LoadMesh( "textures\great_hall.b3d" )
PositionEntity ghall,3179,260,2458
EntityFX ghall,0
EntityType ghall,2
UpdateNormals ghall
TurnEntity ghall,0,164,0
ScaleEntity ghall,15,15,15

; CRYPT
Global crypt=LoadMesh( "textures\portal2.b3d" )
PositionEntity crypt,1835,399,2872
EntityFX crypt,0
EntityType crypt,2
UpdateNormals crypt
TurnEntity crypt,0,0,0
ScaleEntity crypt,15,15,15

; SWITCH
Global switch=LoadMesh( "textures\trigger1.b3d" )
PositionEntity switch,1835,399,2872
EntityFX switch,0
EntityAlpha switch,0
UpdateNormals switch
EntityType switch,4
TurnEntity switch,0,0,0
ScaleEntity switch,15,15,15


; CRYPT2
Global crypt2=LoadMesh( "textures\portal4.b3d" )
PositionEntity crypt2,1835,399,2872
EntityFX crypt2,0
EntityType crypt2,2
UpdateNormals crypt2
TurnEntity crypt2,0,0,0
ScaleEntity crypt2,15,15,15
HideEntity crypt2


; CRYPT3
Global crypt3=LoadMesh( "textures\crypt4.b3d" )
PositionEntity crypt3,1835,399,2872
EntityFX crypt3,0
EntityType crypt3,2
UpdateNormals crypt3
TurnEntity crypt3,0,0,0
ScaleEntity crypt3,15,15,15
HideEntity crypt3


;DOCK
Global dock=LoadMesh( "textures\dock_old.b3d" )
PositionEntity dock,950,80,116
EntityFX dock,0
EntityType dock,2
UpdateNormals dock
TurnEntity dock,0,180,0
ScaleEntity dock,18,18,18

;TELEPORT PAD
pad=LoadMesh( "textures\teleportpad1.b3d" )
PositionEntity pad,1466,150,410
EntityFX pad,0
EntityType pad,2
UpdateNormals pad
TurnEntity pad,0,0,0
ScaleEntity pad,5,5,5

Global pad2=LoadMesh( "textures\teleportpad1.b3d" )
PositionEntity pad2,949,-86,1949
EntityType pad2,2
UpdateNormals pad2
ScaleEntity pad2,5,5,5

; PAD 2 Trigger
Global switch2=LoadMesh( "textures\trigger1.b3d" )
PositionEntity switch2,950,-60,1949
EntityFX switch2,0
EntityAlpha switch2,1 ; was 0
UpdateNormals switch2
EntityType switch2,5
ScaleEntity switch2,25,25,25
HideEntity switch2


;WALL
Global wall=LoadMesh( "textures\gate3.b3d" )
PositionEntity wall,1190,175,837
EntityFX wall,0
EntityType wall,2
UpdateNormals wall
;TurnEntity wall,0,164,0
ScaleEntity wall,18,20,18

; PORTAL
Global portal=LoadMesh( "textures\0portal.b3d" )
PositionEntity portal,725,250,1957
EntityFX portal,0
EntityType portal,2
UpdateNormals portal
TurnEntity portal,0,0,0
ScaleEntity portal,25,25,25
EntityPickMode portal,1

;lil dingy
Global boat=LoadMesh( "textures\smallboat.b3d" )
PositionEntity boat,74,3,-267
EntityFX boat,0
EntityType boat,2
UpdateNormals boat
TurnEntity boat,0,0,0
ScaleEntity boat,2,2,2

;ladder
Global ladder=LoadMesh( "textures\ladder_1.b3d" )
PositionEntity ladder,570,251,2022
EntityFX ladder,0
EntityType ladder,2
EntityPickMode ladder,3
UpdateNormals ladder
TurnEntity ladder,0,180,0
ScaleEntity ladder,7,7,7

;DOOR animated
Global Adoor=LoadAnimMesh( "textures\adoor1.b3d" )
PositionEntity Adoor,850,252,2180 ; 252
EntityFX Adoor,0
EntityType Adoor,2	
EntityPickMode Adoor,2
EntityRadius Adoor,10
UpdateNormals Adoor
TurnEntity Adoor,0,0,0
RotateEntity Adoor,90,0,0
ScaleEntity Adoor,6,8,7
;making new doors
;door2 = CopyMesh(Adoor)
;PositionEntity door2,800,252,2000

; TREE
dot=LoadMesh("textures\tree2.b3d")
HideEntity dot
UpdateNormals dot
EntityFX dot,2
Type tree
	Field entity
	Field treex
	Field treey
	Field treez
	Field scale
End Type

; Load Xbow

Global gun=LoadAnimMesh("textures\xbow3.b3d",camera)
ScaleEntity gun,.8,.8,.8
PositionEntity gun,-.1,-4,8

; load xbow ammo
Global bolt=LoadMesh("textures\bolt6.b3d",gun)
;PositionEntity bolt,.26,-4,9
HideEntity bolt
; create a type
Type bullet
	Field entity
	Field speed#
	Field range
	Field pivot
End Type


CameraFogColor camera, 2, 2, 2
CameraFogMode camera,1


Collisions 1,2,2,3
Collisions 2,1,2,3
Collisions 4,1,2,2
Collisions 5,1,2,2
Collisions 1,4,2,2
Collisions 1,5,2,2
Collisions 2,2,2,1
Collisions 2,6,2,2
Collisions 6,2,2,2

ammo = 100

jumpflag=False

j#=1
PlaySound windnoise
PlaySound wind
healthy#=1
current = MilliSecs()

chnWalk=PlaySound (mov)

For tt= 1 To 100 ; 					1000 trees on the map??? Sure!
t.tree = New tree ;						where did "T" come from... I made it up. I could
t\entity = CopyEntity (dot) ;			have used a letter or any word not reserved
t\treex=Rnd(-5000,5000) ;				NOTE " \ " not " / "
t\treey=100
t\treez=Rnd(-5000,5000)
t\scale=Rnd(.5,2) ; 					Since B3D uses both + and - nums I had to use Rnd
Next ;	

put_trees()


; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX   HERE
While Not KeyDown( 1 )

If rs=1 Then 
	PositionEntity camera,1466,220,412
	ResetEntity camera
EndIf
rs=0

volume_walk=0
ChannelVolume play_walk,volume_walk

x#=EntityX(camera)
y#=EntityY(camera)
z#=EntityZ(camera)

; ---- HOW TO USE GRAVITY

y#=y#-8

PositionEntity camera,x#,y#,z#

mxs#=MouseXSpeed()/4
mys#=MouseYSpeed()/4
xa#=(xa#-mxs#)Mod 360
ya#=(ya#+mys#)Mod 360 
;limit up and down looking
	If ya#>=90 Then ya#=90 
    If ya#<= -89 Then ya#= -89

MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
RotateEntity camera,ya#,xa#,0
    
If KeyDown (209)=True Then healthy#=healthy#-.1: ScaleEntity health,healthy#,.5,.5
If KeyDown (201)=True Then healthy#=healthy#+.1: ScaleEntity health,healthy#,.5,.5
If KeyDown( 205 )=True Then RotateEntity camera,0,-5,0
If KeyDown( 203 )=True Then RotateEntity camera,0,+5,0
If KeyHit (156)=True Then
		PositionEntity camera,1466,220,412
		ResetEntity camera
EndIf
If KeyDown( 208 )=True Then 
		MoveEntity camera,0,0,-5 
		volume_walk = 1
		ChannelVolume play_walk,volume_walk
EndIf
If KeyDown( 200 )=True Then 
		MoveEntity camera,0,0,+5
		volume_walk = 1
		ChannelVolume play_walk,volume_walk
EndIf
; =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Bullet code by Ross C
If MouseDown(1) And MilliSecs()>gun_time+gun_timer Then
		ammo = ammo-1
		If ammo<0 Goto carryon
			Animate gun,3
			PlaySound firebow
			gun_timer=MilliSecs() ; reset the timer
			create_bullet(gun); call function to create a bullet. Pass across the gun entity to the function
						  ; so the bullet can come from the guns position
		End If
.carryon
If ammo < 0 Then ammo = 0

check_collide()	

update_bullet()

; =--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-==-=-=-=-=-=-=

If MouseDown(2) = True Then entity = EntityPick(camera,190)
Select entity
			Case Adoor 
				For hh = 1 To 90
					RotateEntity Adoor,0,hh,0
				Next 
				Animate Adoor,3,1
			Default hh=0
			End Select
FlushMouse

If KeyHit( 57 )=True And jumpflag = False
		jumpflag=True
		oldtime=MilliSecs()
EndIf
		If jumpflag = True Then TranslateEntity camera,+0,+9,+0
			If MilliSecs()>oldtime+1250 Then jumpflag=False

; ------------------



UpdateWorld()

RenderWorld()

Text 0,0,"Use cursor keys to move about the terrain [ESC] to quit"
Text 0,10,"Jumpflag:"+jumpflag
Text 0,30,"X: "+x#
Text 100,30,"Y: "+y#
Text 200,30,"Z: "+z#

Text 0,50,"Entity: "+PickedEntity()
Text 0,60,"M1"+ MouseHit(1)
Text 0,70,"M2"+MouseHit(2)
;AIMPOINT
DrawImage aim,378,300
heal#=healthy#*100
Text 0,530,"Health: "+heal#
Text 0,90,"Ammo: "+ammo
Text 0,100,"JOP:"+jop

Flip

DUDE=0
Wend

End

Function create_bullet(gun_entity)
	b.bullet=New bullet
	
		temp_x=EntityX(gun_entity,True)
		temp_y=EntityY(gun_entity,True)
		temp_z=EntityZ(gun_entity,True)
		
		b\entity=CopyEntity(bolt) ; copy the main bullet entity , into the type object
		b\pivot=CreatePivot()
		EntityType b\entity,2
		PositionEntity b\entity,temp_x,temp_y,temp_z
		RotateEntity b\entity,EntityPitch(gun_entity,True),EntityYaw(gun_entity,True),0
		PositionEntity b\pivot,temp_x,temp_y,temp_z
		b\range=300 ; the range of the bullets
		b\speed=18; the speed of the bullets
End Function

Function update_bullet()
	For b.bullet = Each bullet
		MoveEntity b\entity,0,0,b\speed
		If EntityDistance#(b\entity,b\pivot) > b\range Then
			FreeEntity b\entity
			FreeEntity b\pivot
			Delete b.bullet
		End If
	Next
End Function

Function check_collide()

	If EntityCollided(camera,5) Then
		HideEntity switch2
		PositionEntity terr,-20*512,0,-20*512
		ResetEntity camera
		PositionEntity camera,1466,229,412
		ResetEntity camera
		ShowEntity w
		rs=1
		;playsound whoop
		ShowEntity crypt2
		ShowEntity crypt
		ShowEntity castle
		ShowEntity wall
		ShowEntity portal
		ShowEntity ghall
		HideEntity crypt3
		HideEntity pad2
		
	EndIf

	If EntityCollided(camera,4) Then
		HideEntity switch
		PlaySound doorx
		ShowEntity crypt3
		ShowEntity pad2
		ShowEntity switch2
		HideEntity crypt2
		HideEntity crypt
		HideEntity castle
		HideEntity wall
		HideEntity portal
		HideEntity ghall
		;FreeEntity t\entity
		PositionEntity terr,0,-120,0
		HideEntity w
	EndIf

End Function

Function put_trees()

	For t.tree = Each tree
		EntityType t\entity,2
		ScaleEntity t\entity,t\scale,t\scale,t\scale
		build=LinePick(t\treex,t\treey,t\treez,t\treex,TerrainY(terr,t\treex,t\treey,t\treez)-4,t\treez)
		If build=6 Then
			FreeEntity t\entity
			FreeEntity t\treex
			FreeEntity t\treey
			FreeEntity t\treez
		EndIf
		where1=TerrainY(terr,t\treex,t\treey,t\treez)-3 ; get the height of the terrain at that place
		PositionEntity t\entity,t\treex,where1,t\treez
	Next
			
End Function  

I get the probs listed. I have a version where my badguys (spheres for now) fly in to harrass my dude. I can put them on the map, I can make them point to the dude and fly to him. If he does manage to shoot an arrow at them (and hit) they pop.

But he doesn't always shoot the arrow. So I went back to a previous version and still have that problem. Figured I would try to solve it without enemies before I tried it with badguys! :)
-RZ

For some reason the arrow only seems to fire at certain locations... I am clueless.

When you Create a Bullet, I think you might want to use Floating point numbers like.

temp_x#=EntityX#(gun_entity,True)
temp_y#=EntityY#(gun_entity,True)
temp_z#=EntityZ#(gun_entity,True)

not sure though, I am at work and can't really take much time.

See if that helps at all.

Regards,
Eric

SO what is the difference between:

temp_x=EntityX(gun_entity,True)
temp_y=EntityY(gun_entity,True)
temp_z=EntityZ(gun_entity,True)
what I have....

and:
temp_x#=EntityX#(gun_entity,True)
temp_y#=EntityY#(gun_entity,True)
temp_z#=EntityZ#(gun_entity,True)

is the # thing after entityX that important??? :)
-RZ

The '#' Forces Floating Point Numbers. I'm not sure if you need the '#' After the EntityX, I just do it for clarity in my own code.

Regards,
Eric

Yeah, and if you get an error on those lines somthing like "Variable type mismatch" then that means it's declared as a different type of variable the very first time it's used.

OK let me try it... anything for clarity! :)
-RZ

Rook, I can tell you what your arrow problem is with out even looking at your code. Because I ran into the same thing with paintballs!

You are setting the collisions up to the initial arrow, then copyent. Do this instead, Copyent(arrow), positionent(arrow, at players bow), THEN set collision.

I will download your project and make sure this is the problem...

And your new create arrow code goes as follows

Function create_bullet(gun_entity)
b.bullet=New bullet

temp_x=EntityX(gun_entity,True)
temp_y=EntityY(gun_entity,True)
temp_z=EntityZ(gun_entity,True)

b\entity=CopyEntity(bolt) ; copy the main bullet entity , into the type object
b\pivot=CreatePivot()
PositionEntity b\entity,temp_x,temp_y,temp_z
EntityType b\entity,2
RotateEntity b\entity,EntityPitch(gun_entity,True),EntityYaw(gun_entity,True),0
PositionEntity b\pivot,temp_x,temp_y,temp_z
b\range=300 ; the range of the bullets
b\speed=18; the speed of the bullets
End Function

tadaaaaaaaaaaaa

Oh yeah, I think your using picks to try to determine there is not water, right? well, you have to make sure to set the water up so that it obscures picks.

G.O.D. That looks like fine advice... updating code NOW!!! : )

Bot Builder... That also looks like great advice... but I don't understand it. Sorry! :)

That G.O.D. code does the trick... now If I could just figure out why the treeplacer doesn't work! :)

-RZ

Picks are sensors basically. Define a origin, define a vector(From that origin) and define the radius of this virtual line in 3d space.(spherical)

Now, to check the ground beneath a tree..

hit=linepick(treeX,treeY,treeZ,0,-20,0)
;this will cast this virtual line and return the entiy hit if any.(Only checks entities that have a pickmode. poly is best)

then use pickedX,y,z etc to get exactly where the line and the geo(I.e the ground) meet. I.e exactly where you want to place the tree.

so instead of ENTITYTYPE, water,3 I should use ENTITYPICK water,4???