From 0f5fdca8945ec3afd5ba2e67a9d414f1ef5565c3 Mon Sep 17 00:00:00 2001 From: Haru Date: Fri, 2 Dec 2016 20:10:44 +0100 Subject: Ensure that pc->addfame() increments the correct fame points The function now takes the rank type as argument, rather than guessing it from the character's class. If the wrong fame point type for the current character is requested, the request is ignored. This fixes some (unofficial) edge cases where a Taekwon or an Alchemist refined a signed item, they could obtain rank points. Signed-off-by: Haru --- src/map/pc.c | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) (limited to 'src/map/pc.c') diff --git a/src/map/pc.c b/src/map/pc.c index 11bc511b1..531cc555a 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -388,26 +388,43 @@ int pc_banding(struct map_session_data *sd, uint16 skill_lv) { } // Increases a player's fame points and displays a notice to him -void pc_addfame(struct map_session_data *sd,int count) +/** + * Increases a player's fame points and displays a notice to them. + * + * If the character's job class doesn't allow the specified rank type, nothing + * happens and the request is ignored. + * + * @param sd The target character. + * @param type The fame list type (@see enum fame_list_type). + * @param count The amount of points to add. + */ +void pc_addfame(struct map_session_data *sd, int ranktype, int count) { - int ranktype = -1; nullpo_retv(sd); - sd->status.fame += count; - if(sd->status.fame > MAX_FAME) - sd->status.fame = MAX_FAME; - switch (sd->job & MAPID_UPPERMASK) { - case MAPID_BLACKSMITH: - ranktype = RANKTYPE_BLACKSMITH; + switch (ranktype) { + case RANKTYPE_BLACKSMITH: + if ((sd->job & MAPID_UPPERMASK) != MAPID_BLACKSMITH) + return; break; - case MAPID_ALCHEMIST: - ranktype = RANKTYPE_ALCHEMIST; + case RANKTYPE_ALCHEMIST: + if ((sd->job & MAPID_UPPERMASK) != MAPID_ALCHEMIST) + return; break; - case MAPID_TAEKWON: - ranktype = RANKTYPE_TAEKWON; + case RANKTYPE_TAEKWON: + if ((sd->job & MAPID_UPPERMASK) != MAPID_TAEKWON) + return; break; + case RANKTYPE_PK: + // Not supported + FALLTHROUGH + default: + Assert_retv(0); } - Assert_retv(ranktype != -1); + + sd->status.fame += count; + if (sd->status.fame > MAX_FAME) + sd->status.fame = MAX_FAME; clif->update_rankingpoint(sd, ranktype, count); chrif->updatefamelist(sd); -- cgit v1.2.3-70-g09d2