I did as you said and added constant speed if liftable_free(x,y+4) but nothing happens if I go !place_meeting(x,y-1,obj_solid_terrain) it moves and collides with the object but only with that object (as expected) so my question did I call it wrong or does the liftable_free(x,y) need something more?
Okay, I think I've found the cause: the liftable is colliding with itself (rather, its "idle prop") so we need a special exception for that. Something like this should work better:
var blocked = false;
with(parent_terrain){ if(place_meeting(x,y - 4,other)){ if(id != other.idleprop){ blocked = true; } } }
if(!blocked){ y += 4 with(idleprop){ y += 4 } }