With code like below I expect that two entities pass through each other, and trigger event impact and nothing else. But, instead I get situations where one object "pushes aside" (along Y axis) other object a bit. Something that is quite annoying for my game where all objects must remain in XZ plane.

However, this "pushing aside" happens only if two objects are very asymmetric in shape and I use c_rotate too. With only c_move active or if objects are symmetric, pushing aside does not happen.

Any way I can avoid this for objects of any shape?

Code:
function event_handler()
{
	if (event_type == EVENT_IMPACT)
	{
		printf("id= %.0f  id= %.0f", (double)me.skill79, (double)you.skill79);
	}
}

action ent1_move()
{
	wait(1);
	c_setminmax(me);
	me.emask |= ENABLE_IMPACT;
	me.event = event_handler;
	me.skill79 = 1;
	
	while(me != NULL)
	{
		c_move(me, vector(-40 * time_step, 0, 0), vector(0, 0, 0 * time_step), IGNORE_PASSABLE | IGNORE_YOU);
		c_rotate(me, vector(0,0, 20 * time_step), IGNORE_PASSABLE | IGNORE_YOU);
		wait(1);
	}
}

action ent2_move()
{
	wait(1);
	c_setminmax(me);
	me.emask |= ENABLE_IMPACT;
	me.event = event_handler;
	me.skill79 = 2;

	while(me != NULL)
	{
		c_move(me, vector(30 * time_step, 0, 0), vector(0, 0, 0 * time_step), IGNORE_PASSABLE | IGNORE_YOU);
		c_rotate(me, vector(0,0, 10 * time_step), IGNORE_PASSABLE | IGNORE_YOU);
		wait(1);
	}
}

function main()
{
	video_mode = 9;
	
	level_load ("");
	vec_set(camera.x,vector(0, 200, -1000));
	vec_set(camera.pan,vector(0, 90, 0));
	
	wait(-2);
	
	ENTITY* ent1 = ent_create ("ent1.mdl", vector(400, 40, 0), ent1_move);
	ENTITY* ent2 = ent_create ("ent2.mdl", vector(-400, 0, 0), ent2_move);
}