Try replacing:
if (place_meeting(x,y,parSolid)){
if (!hold_l && !hold_r){
x += !place_meeting(x + width_f,y,parSolid) - !place_meeting(x - width_f,y,parSolid);
}
if (place_meeting(x,y,parSolid)){
y -= move_v;
}
}
with:
if (place_meeting(x,y,parSolid)){
if (!hold_l && !hold_r){
for (cc = 1; cc < width_f; cc += width_f div 2){
x += !place_meeting(x + cc,y,parSolid) - !place_meeting(x - cc,y,parSolid);
if (x != xprevious){
move_f = ROOT_ADD + 1;
break;
}
}
}
if (place_meeting(x,y,parSolid)){
y -= (move_y > 0) - (move_y < 0);
}
}
(assumes that in Link's create event you have width_f = sprite_get_width(mask_index) div 2, and that height_f = sprite_get_height(mask_index).)
Because it uses a for loop with function calls in the for loop, it is important not to loop too often. I think the values I used are appropriate enough for any situation. As for why the height_f in the Create Event is not integer divided by 2, I got better results when it wasn't - the height is a skinny thing as it is, half of the height doesn't do much for corner cutting. You can try tweaking the values if you want to.