I think if I understand you right, you want Cartography Shop, and for the collision :
[EDIT] OOPS! the code in the source box does not work! use this instead.
`***************************
`.X Model sliding collision
`By Kensupen and Lokidecat
`Nerdsoft Creations (C) 2003
`***************************
`This uses all native DBPro commands to give a user sliding collision
`against ANY .X model to slide on ANY angle. It works almost as good as BSP
`collision, except for height. If you can walk onto an object, it just
`puts you at that height. I might try to advance the code later to give
`a smooth height adjustment.
autocam off
set image colorkey 255,0,255
sync on
srate=60
sync rate srate
color backdrop 0
set camera range 1,5000
set ambient light 75
make object sphere 2,20
`put your level here
load object ".x",1
set object transparency 1,2
dir$=get dir$()
`Height cam is off the ground
charht#=10
`speed to move
spd#=3
`set the radius for collisions
radius#=10.0
`set initial object position
position object 2,0,charht#,0
yrotate object 2,180
`number of checks
`the lower this number is, the more off the collisions will be vs. any rotated object.
`also, the lower the number, the more speed it runs at.
`lowest for rotated collision is 4(non rotated/box collision) max is 360, but 360 is WAAAY slow
`I'd advide is you play with this number to keep with a multiple of 4
checks=8
if checks<4 then checks=4
if checks>360 then checks=360
`width of the angles
angwidth=360/checks
`make arrays for collision data
dim ang#(checks-1,2)
dim sort#(checks-1,2)
do
set cursor 0,0
print "Sync Rate set at ",srate," Press Enter to change"
print "FPS:",screen fps()
if scancode()=0 then hold=0
if returnkey()=1 and hold=0
hold=1
if srate=60
srate=0
else
srate=60
endif
sync rate srate
endif
`Get initial positions and a revert set
oldx#=object position x(2)
oldz#=object position z(2)
cx#=object position x(2)
cy#=object position y(2)
cz#=object position z(2)
ca#=object angle y(2)
if upkey()=1
cx#=newxvalue(cx#,ca#,spd#)
cz#=newzvalue(cz#,ca#,spd#)
position object 2,cx#,cy#,cz#
endif
if leftkey()=1 then ca#=ca#-2
if rightkey()=1 then ca#=ca#+2
yrotate object 2,ca#
`Show the camera angle
print "Object angle:",object angle y(2)
`The main sliding collision code
gosub _collision
`My code to walk up a ramp if the angle isn't too steep
gosub _ramp
`A just in case reset
if spacekey()=1 then position object 2,0,200,0
`Camera follows the object
posx#=object position x(2)
posy#=object position y(2)
posz#=object position z(2)
angle#=object angle y(2)
set camera to follow posx#,posy#,posz#,angle#,50,posy#+20,30,1
sync
loop
_ramp:
`get positions again
cx#=object position x(2)
cz#=object position z(2)
`Get your old height
oldht#=object position y(2)
`calc new height using intersect object from the old height down charht# units
sub#=intersect object(1,cx#,oldht#,cz#,cx#,oldht#-(charht#*2),cz#)
ht#=(oldht#+charht#)-sub#
if sub#=0 then ht#=charht#
`do some gravity
grav#=grav#-0.25
`if you are going up a ramp
if oldht#+grav#>ht#
grav#=0.0
position object 2,cx#,ht#,cz#
else
`if you are falling
ht#=oldht#+grav#
position object 2,cx#,ht#,cz#
endif
return
_collision:
`make 72 collision points. You can use more or less, but this number seems to work good.
`These are vectors every 5 degrees from the camera position out.
`They return the distance when they hit an object
for x=0 to checks-1
chx#=newxvalue(cx#,x*angwidth,1)
chz#=newzvalue(cz#,x*angwidth,1)
ang#(x,1)=intersect object(1,cx#,cy#,cz#,chx#,cy#,chz#)
if ang#(x,1)=0 then ang#(x,1)=999999
ang#(x,2)=x*angwidth
sort#(x,1)=ang#(x,1)
sort#(x,2)=ang#(x,2)
next x
`sort the array to find the closest object and it's degrees
for x=0 to checks-2
for y=x+1 to checks-1
if ang#(x,1)>ang#(y,1)
temp#=ang#(x,1)
temp2#=ang#(x,2)
ang#(x,1)=ang#(y,1)
ang#(x,2)=ang#(y,2)
ang#(y,1)=temp#
ang#(y,2)=temp2#
endif
next x
next y
`This is the closest wall and what degrees you would face to see it
print "Angle to closest wall:",ang#(0,2)
print "Distance to that wall:",ang#(0,1)
`find +-90 degrees from the closest one for when you walk into a corner so it doesn't shake
prev=wrapvalue(ang#(0,2)-90)/angwidth
nxt=wrapvalue(ang#(0,2)+90)/angwidth
newd#=radius#-ang#(0,1)
newa#=wrapvalue(ang#(0,2)-180)
newd1#=radius#-sort#(prev,1)
newa1#=wrapvalue(sort#(prev,2)-180)
newd2#=radius#-sort#(nxt,1)
newa2#=wrapvalue(sort#(nxt,2)-180)
`if you are less than radius from a wall, push you out to 20 from it
if ang#(0,1)<radius# and ang#(0,1)>0.0
repx#=newxvalue(cx#,newa#,newd#)
repz#=newzvalue(cz#,newa#,newd#)
position object 2,repx#,cy#,repz#
endif
cx#=object position x(2)
cz#=object position z(2)
`this is if you are coming into a corner, this pushes you sideways
if sort#(prev,1)<radius# and sort#(prev,1)>0.0
repx1#=newxvalue(cx#,newa1#,newd1#)
repz1#=newzvalue(cz#,newa1#,newd1#)
position object 2,repx1#,cy#,repz1#
endif
cx#=object position x(2)
cz#=object position z(2)
`and the other way. above is left, this is right
if sort#(nxt,1)<radius# and sort#(nxt,1)>0.0
repx2#=newxvalue(cx#,newa2#,newd2#)
repz2#=newzvalue(cz#,newa2#,newd2#)
position object 2,repx2#,cy#,repz2#
endif
return
if none of these work goto the code snippets forum and find the topic BSP style .X collision and download that.[\EDIT]
I haven't tested this code with any .x object so i'm unsure how it will work, all credits go to Kensupen and Lokidecat.
and simquad, why the hell d'ya post that? If you don't know then you don't reply!