Below is a set of codes to make it so that your troops will actually carry the ladders to the walls and deposit them in a siege.

If the ladder carrier is killed, a new carrier will be selected and he will pick the ladder back up. To use follow the instructions below:
Add the following to module scripts:
("select_carrier",
[(try_for_agents,reg(5)),
(agent_is_ally,reg(5)),
(agent_is_alive,reg(5)),
(get_player_agent_no,":no"),
(neq,reg(5),":no"),
(assign,"$carrier",reg(5)),
(end_try),]),
("ramp",
[(agent_get_position,1,"$carrier"),
(entry_point_get_position,2,1),
(agent_set_scripted_destination,"$carrier",2),
(try_begin),
(get_distance_between_positions,":dist",1,2),
(lt,":dist",100),
(prop_instance_get_position,3,reg(59)),
(prop_instance_animate_to_position,reg(60),3,50),
(entry_point_get_position,1,1),
(try_for_agents,reg(5)),
(agent_is_ally,reg(5)),
(agent_set_scripted_destination,reg(5),1),
(end_try),
(assign,"$ramp",1),
(else_try),
(position_move_y,1,-40),
(try_begin),
(neg|agent_is_alive,"$carrier"),
(assign,"$ocarrier","$carrier"),
(position_rotate_x,1,90),
(position_move_y,1,40),
(assign,"$ramp",-1),
(prop_instance_animate_to_position,reg(60),1,75),
(else_try),
(prop_instance_animate_to_position,reg(60),1,10),
(try_end),
(call_script,"script_guard_carrier"),
(try_end),]),
("guard_carrier",
[(try_for_agents,reg(5)),
(agent_is_alive,reg(5)),
(agent_is_human,reg(5)),
(agent_is_ally,reg(5)),
(neq,reg(5),"$carrier"),
(agent_get_position,1,"$carrier"),
(position_move_y,1,500),
(agent_set_scripted_destination,reg(5),1),
(try_end),]),
("pass_ramp",
[(agent_get_position,1,"$ocarrier"),
(agent_set_scripted_destination,"$carrier",1),
(agent_get_position,2,"$carrier"),
(get_distance_between_positions,":dist",1,2),
(lt,":dist",200),
(assign,"$ramp",0)]),
Add the following to the castle attack mission template:
(1.0,0,ti_once,[],[(assign,"$ramp",0),(call_script,"script_select_carrier")]),
(0.1,0,0 ,[(eq,"$ramp",0)],[(call_script,"script_ramp")]),
(0.25,0,0,[(eq,"$ramp",1)],[(call_script,"script_waypoint")]), #you can use my script for this, but I recemend Raz's
(2.5,0,0,[(eq,"$ramp",-1)],[(call_script,"script_select_carrier"),(call_script,"script_pass_ramp")]),
Add the following to module scene props:
("ramp_invisible",sokf_invisible,"ramp2",0, [(ti_on_scene_prop_init,
[(store_trigger_param_1,reg59)]),
]),
("ramp_14m",0,"ramp2","bo_ramp2", [(ti_on_scene_prop_init,
[(store_trigger_param_1,reg60),(assign,"$ramp",-2)]),
]),
ramp2 is a prop I made, change this to whatever ladder you are going to use. Make sure that the invisible ramp is already in pricisely in the position you want the real ramp to fall into. I've tested this and it all works just fine.

I always manage to get my carrier shot, though.