Legacy GM Need Help With 3D Collisions [GM Studio]

K

koirapoika74

Guest
I downloaded this free project from marketplace (Minecraft Engine) and it has really wonky collisions when hitting the wall. I've been trying to figure this out but its just way too complicated for me so I was wondering if any if you guys could help me with my problem. Thanks! :)

SCR: collide
// collide(player width, player height)
// makes the player object collide with the block-world
// to exectute this script the player-object needs a 'z', 'zspeed' and a 'jump' variable
// this script is still not perfect

var ww,hh, x1,y1,z1,x2,y2,z2,x3,y3,x4,y4,z5;

ww=argument0/2
hh=argument1/2

// current position
x1=floor((x-ww)/global.size)
y1=floor((y-ww)/global.size)
z1=floor((z-hh)/global.size)

x2=floor((x+ww)/global.size)
y2=floor((y+ww)/global.size)
z2=floor((z+hh)/global.size)

// go up when trapped
if floor(z/global.size)<global.cz
while(ds_grid_get(global.layer[floor(z/global.size)],floor(x/global.size),floor(y/global.size)))
{
z+=global.size
z1=floor((z-hh)/global.size)
z2=floor((z+hh)/global.size)

if floor(z/global.size)>=global.cz break
}

// previous position
x3=floor((x-hspeed-ww)/global.size)
y3=floor((y-vspeed-ww)/global.size)
z3=floor((z-zspeed-hh)/global.size)

x4=floor((x-hspeed+ww)/global.size)
y4=floor((y-vspeed+ww)/global.size)
z4=floor((z-zspeed+hh)/global.size)

//
z5=round(z3+(z4-z3)/2)

if z1>=0 if z1<=global.cz-1
if ds_grid_get(global.layer[z1],x3,y3)
or ds_grid_get(global.layer[z1],x3,y4)
or ds_grid_get(global.layer[z1],x4,y4)
or ds_grid_get(global.layer[z1],x4,y3)
{z=z3*global.size+hh zspeed=0 jump=true}

if z2>=0 if z2<=global.cz-1
if ds_grid_get(global.layer[z2],x3,y3)
or ds_grid_get(global.layer[z2],x3,y4)
or ds_grid_get(global.layer[z2],x4,y4)
or ds_grid_get(global.layer[z2],x4,y3)
{z=(z4+1)*global.size-hh-.01 zspeed=0}

if z1>=0 if z3>=0 if z1<=global.cz-1 if z3<=global.cz-1
{
z2=min(z2,global.cz-1)
z4=min(z4,global.cz-1)
z5=min(z5,global.cz-1)

//x
if ds_grid_get(global.layer[z3],x1,y3)
or ds_grid_get(global.layer[z3],x1,y4)
or ds_grid_get(global.layer[z4],x1,y4)
or ds_grid_get(global.layer[z4],x1,y3)
or ds_grid_get(global.layer[z5],x1,y3)
or ds_grid_get(global.layer[z5],x1,y4)
{x=x3*global.size+ww hspeed=0}

if ds_grid_get(global.layer[z3],x2,y3)
or ds_grid_get(global.layer[z3],x2,y4)
or ds_grid_get(global.layer[z4],x2,y4)
or ds_grid_get(global.layer[z4],x2,y3)
or ds_grid_get(global.layer[z5],x2,y3)
or ds_grid_get(global.layer[z5],x2,y4)
{x=(x4+1)*global.size-ww-.01 hspeed=0}

//y
if ds_grid_get(global.layer[z3],x3,y1)
or ds_grid_get(global.layer[z3],x4,y1)
or ds_grid_get(global.layer[z4],x4,y1)
or ds_grid_get(global.layer[z4],x3,y1)
or ds_grid_get(global.layer[z5],x3,y1)
or ds_grid_get(global.layer[z5],x4,y1)
{y=y3*global.size+ww vspeed=0}

if y2>=0 if y2<=global.cy-1
if ds_grid_get(global.layer[z3],x3,y2)
or ds_grid_get(global.layer[z3],x4,y2)
or ds_grid_get(global.layer[z4],x4,y2)
or ds_grid_get(global.layer[z4],x3,y2)
or ds_grid_get(global.layer[z5],x3,y2)
or ds_grid_get(global.layer[z5],x4,y2)
{y=(y4+1)*global.size-ww-.01 vspeed=0}
}

// still trapped? go to the previous position
x1=floor((x-ww)/global.size)
y1=floor((y-ww)/global.size)
z1=floor((z-hh)/global.size)

x2=floor((x+ww)/global.size)
y2=floor((y+ww)/global.size)
z2=floor((z+hh)/global.size)

if x1>=0 if x2<=global.cx-1
if y1>=0 if y2<=global.cy-1
if z1>=0 if z2<=global.cz-1
if ds_grid_get(global.layer[z1],x1,y1)
or ds_grid_get(global.layer[z1],x2,y1)
or ds_grid_get(global.layer[z1],x1,y2)
or ds_grid_get(global.layer[z2],x1,y1)
or ds_grid_get(global.layer[z1],x2,y2)
or ds_grid_get(global.layer[z2],x1,y2)
or ds_grid_get(global.layer[z2],x2,y1)
or ds_grid_get(global.layer[z2],x2,y2)
{
x-=hspeed
y-=vspeed
z-=zspeed
speed=0
zspeed=0
}

SCR: boundaries
// boundaries(player width, player height)
// keeps the player into the map
// to exectute this script the player-object needs a 'z', 'zspeed' and a 'jump' variable

var ww,hh;

ww=argument0/2
hh=argument1/2

//x
if x<ww
{
x=ww
hspeed=0
}
else
if x>global.cx*global.size-ww-1
{
x=global.cx*global.size-ww-1
hspeed=0
}

//y
if y<ww
{
y=ww
vspeed=0
}
else
if y>global.cy*global.size-ww-1
{
y=global.cy*global.size-ww-1
vspeed=0
}

//z
if z<hh
{
z=hh
zspeed=0
jump=true
}
 
Top