I'd go for this perhaps:
static int can_take_obj(struct char_data *ch, struct obj_data *obj)
{
+ if (((IS_CARRYING_N(ch) >= CAN_CARRY_N(ch)) ||
(IS_CARRYING_W(ch) + GET_OBJ_WEIGHT(obj) > CAN_CARRY_W(ch))) &&
(GET_LEVEL(ch) >= LVL_IMMORT)) {
+ act("$p: You usually cannot carry this much. However you're an immortal so go ahead!", FALSE, ch, obj, 0, TO_CHAR);
- if (IS_CARRYING_N(ch) >= CAN_CARRY_N(ch)) {
+ } else if (IS_CARRYING_N(ch) >= CAN_CARRY_N(ch)) {
act("$p: you can't carry that many items.", FALSE, ch, obj, 0, TO_CHAR);
return (0);
} else if ((IS_CARRYING_W(ch) + GET_OBJ_WEIGHT(obj)) > CAN_CARRY_W(ch)) {
act("$p: you can't carry that much weight.", FALSE, ch, obj, 0, TO_CHAR);
return (0);
} else if (!(CAN_WEAR(obj, ITEM_WEAR_TAKE))) {
act("$p: you can't take that!", FALSE, ch, obj, 0, TO_CHAR);
return (0);
} else if (OBJ_SAT_IN_BY(obj)){
act("It appears someone is sitting on $p..", FALSE, ch, obj, 0, TO_CHAR);
return (0);
}
return (1);
}