I did a little modification so that it works with arrow keys
There was also a bug in the condition before your getdir(speed.x,speed.y)
You had &&'d it, and so it wouldn't update the direction if you were only moving one way. Just replace && with || like I did here.
EDIT: I changed a lot of the code. There were a lot of problems, I tested it with a friend and when we collided, we were stuck on each other! Now you can get out of walls and not fly through them if moving fast (only does the save check if you are stuck in a wall, otherwise you can still have a high speed set and the raytrace won't skip the wall)
LAST EDIT:
I fixed my own bugs and made it work almost perfectly! A saveCheck is set and overrides the speeds to try and get you out of the wall. Works perfectly for me

If you want to use it for mouse still, just uncomment the mouse lines I took out.
PHP Code:
//#CLIENTSIDE
//**************************************************
function onCreated()
{
this.baseSpeed = 8;
this.acceleration = 4.5;
this.baseFriction = .5;
this.target.x = player.x + 1.5;
this.target.y = player.y + 2;
onTimeout();
disabledefmovement();
}
function onPlayerEnters()
{
disabledefmovement();
this.target.x = player.x + 1.5;
this.target.y = player.y + 2;
}
//**************************************************
function onTimeout()
{
modY=0;
modX=0;
if (keydown(0)) modY=-1.2;
if (keydown(1)) modX=-1.2;
if (keydown(2)) modY=1.2;
if (keydown(3)) modX=1.2;
if (modY != 0 || modX != 0) SetTarget(player.x+1.5+modX,player.y+2+modY);
// *****Set target position so we know where to move
//if (leftmousebutton) {
// SetTarget(mousex, mousey);
//}
// *****Friction (We aren't walking on ice)
this.speed.x *= this.baseFriction;
this.speed.y *= this.baseFriction;
// *****Accelerate so we'll eventually reach that target position.
if (Distance(this.target.x - player.x - 1.5, this.target.y - player.y - 2) > 1 && !this.stopped) {
temp.angle = getangle(this.target.x - player.x - 1.5, this.target.y - player.y - 2);
temp.speed.x = cos(temp.angle) * this.acceleration;
temp.speed.y = -sin(temp.angle) * this.acceleration;
Accelerate(temp.speed.x, temp.speed.y, this.baseSpeed);
setani("walk", "");
}
else
{
if (this.speed.x < 0.1 && this.speed.x > -0.1) this.speed.x = 0;
if (this.speed.y < 0.1 && this.speed.y > -0.1) this.speed.y = 0;
this.stopped = true;
}
// *****Actually move the player according to current speed.
Move(this.speed.x, this.speed.y);
if (this.speed.x != 0 || this.speed.y != 0) player.dir = getdir(this.speed.x, this.speed.y);
if ((modX == 0 && modY == 0) && (this.speed.x !=0 || this.speed.y !=0))
{
this.stopped == true;
SetTarget(player.x+1.5,player.y+2);
//Hack
if (tiletype(player.x + 1.5, player.y + 2) == 3) {
setani("sit", "");
} else {
setani("idle", "");
}
}
setTimer(0.05);
}
//**************************************************
/*function onMouseDown(button)
{
// Set target position so we know where to move.
if (button == "left") {
SetTarget(mousex, mousey);
}
}*/
//**************************************************
// Set the position the system will try to reach.
function SetTarget(targetx, targety)
{
if (Distance(targetx - player.x - 1.5, targety - player.y - 2) > 1) {
this.target.x = targetx;
this.target.y = targety;
this.stopped = false;
}
}
//**************************************************
// Increase the speed in pixels per frame.
function Accelerate(xSpeed, ySpeed, maxSpeed)
{
if (Distance(this.speed.x, this.speed.y) < maxSpeed || (Distance(this.speed.x + xSpeed, this.speed.y + ySpeed) - Distance(this.speed.x, this.speed.y)) <= 0) {
// if (modX != 0 || modY != 0) {
this.speed.x += xSpeed;
this.speed.y += ySpeed;
// }
if (Distance(this.speed.x, this.speed.y) > maxSpeed) {
temp.angle = getangle(this.speed.x, this.speed.y);
this.speed.x = cos(temp.angle) * maxSpeed;
this.speed.y = -sin(temp.angle) * maxSpeed;
}
}
}
//**************************************************
// Move the player by specified amount of pixels.
function Move(xSpeed, ySpeed)
{
//if (!isapplicationactive) return;
xSpeed = xSpeed<0?int(xSpeed)+1:int(xSpeed);
ySpeed = ySpeed<0?int(ySpeed)+1:int(ySpeed);
temp.saveCheck = onwall2(player.x+1,player.y+2,1,1); // modify our detection to get unstuck if we are
// --- 'x' movement of the player --- \\
if (xSpeed != 0) {
temp.xDir = (abs(xSpeed) / xSpeed);
temp.x = int(player.x * 16);
temp.scanx = 0;
for (i=0; i < (temp.saveCheck ? .45 : abs(xSpeed)); i ++ ) {
if (!onwall2((temp.x+(i*temp.xDir)) / 16 + 1 + (temp.xDir*(temp.saveCheck ? 24 : 8)) * (1/16), player.y + 2, 1, 1)) temp.scanx++;
else if (temp.saveCheck) continue; else break;
}
temp.x+=(temp.scanx*temp.xDir);
player.x = temp.x / 16;
}
// --- 'y' movement of the player --- \\
if (ySpeed != 0) {
temp.y = int(player.y * 16);
temp.yDir = (abs(ySpeed) / ySpeed);
temp.scany = 0;
for (i=0; i<(temp.saveCheck ? .45 : abs(ySpeed)); i++) {
if (!onwall2(player.x + 1, (temp.y+(temp.scany*temp.yDir)) / 16 + (temp.saveCheck ? 1.5 : 2) + (temp.yDir*(temp.saveCheck ? 24 : 1)) * (1/16), 1, 1)) temp.scany++;
else if (temp.saveCheck) continue; else break;
}
temp.y+=(temp.scany*temp.yDir);
temp.varia=onwall2(player.x+1,player.y+2,1,1);
player.y = temp.y / 16;
}
if (tiletype(player.x + 1.5, player.y + 2) == 3) {
setani("sit", "");
}
}
//**************************************************
//Calculate the distance between (0, 0) and (dx, dy).
function Distance(dx, dy)
{
return ((dx)^2 + (dy)^2)^0.5
}
I'll be using this I think.
Thanks <3