Hi,
We have found a bug in circle30bpl10 that allows a group to
gain exp points by killing its own members in rounds.
Because there is a limit on maximum exp loss and there is no
limit on the total exp gain of the group, the group (if big enough)
receives all the exp(victim)/3 while the victim loses only
max_exp_loss. Note that it has advantage only when exp(victim) >
3*max_exp_loss.
Between begin(apua) and end(apua) are the changes we have made
to fight.c to correct this problem. In this code, if the the victim is
a PC, the total group gain is at most 2/3 max_exp_loss. This makes
the total exp gain be 2/3 of the victim's exp loss in every kill.
Apua~ (apua@dcc.unicamp.br)
Dirani (spharion@dcc.unicamp.br)
/* begin(apua) */
extern int max_exp_loss; /* see config.c */
/* end(apua) */
void group_gain(struct char_data * ch, struct char_data * victim)
{
int tot_members, base;
/* begin(apua) */
int tot_gain;
/* end(apua) */
struct char_data *k;
struct follow_type *f;
if (!(k = ch->master))
k = ch;
if (IS_AFFECTED(k, AFF_GROUP) && (k->in_room == ch->in_room))
tot_members = 1;
else
tot_members = 0;
for (f = k->followers; f; f = f->next)
if (IS_AFFECTED(f->follower, AFF_GROUP) && f->follower->in_room == ch->in_room)
tot_members++;
/* round up to the next highest tot_members */
/* begin(apua) */
/* base = (GET_EXP(victim) / 3) + tot_members - 1; */
tot_gain = (GET_EXP(victim) / 3) + tot_members - 1;
/* end(apua) */
/* begin(apua) */
/* prevent illegal xp creation when killing players */
if (!IS_NPC(victim))
tot_gain = MIN(max_exp_loss * 2 / 3, tot_gain);
/* end(apua) */
if (tot_members >= 1)
/* begin(apua) */
/* base = MAX(1, GET_EXP(victim) / (3 * tot_members)); */
base = MAX(1, tot_gain / tot_members);
/* end(apua) */
else
base = 0;
if (IS_AFFECTED(k, AFF_GROUP) && k->in_room == ch->in_room)
perform_group_gain(k, base, victim);
for (f = k->followers; f; f = f->next)
if (IS_AFFECTED(f->follower, AFF_GROUP) && f->follower->in_room == ch->in_room)
perform_group_gain(f->follower, base, victim);
}
This archive was generated by hypermail 2b30 : 12/18/00 PST