From 0a4351ef16db0024cb0b1da3816412edbc00c6e8 Mon Sep 17 00:00:00 2001 From: Asheraf Date: Sat, 21 Jan 2023 20:32:18 +0100 Subject: [PATCH] Queue up rodex item claim requests --- src/map/pc.c | 1 + src/map/pc.h | 1 + src/map/rodex.c | 36 ++++++++++++++++++++++++++++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/map/pc.c b/src/map/pc.c index 8ca685085b6..8aeab15be2d 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -1221,6 +1221,7 @@ static bool pc_authok(struct map_session_data *sd, int login_id2, time_t expirat memcpy(&sd->status, st, sizeof(*st)); memset(&sd->rodex, 0x0, sizeof(sd->rodex)); VECTOR_INIT(sd->rodex.messages); + VECTOR_INIT(sd->rodex.claim_list); if (st->sex != sd->status.sex) { clif->authfail_fd(sd->fd, 0); diff --git a/src/map/pc.h b/src/map/pc.h index bcb9543dacf..e6fb7ee471d 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -548,6 +548,7 @@ END_ZEROED_BLOCK; struct { struct rodex_message tmp; struct rodex_maillist messages; + VECTOR_DECL(int64) claim_list; int total; bool new_mail; } rodex; diff --git a/src/map/rodex.c b/src/map/rodex.c index d46c0d215d3..f889c276bb9 100644 --- a/src/map/rodex.c +++ b/src/map/rodex.c @@ -30,6 +30,7 @@ #include "common/nullpo.h" #include "common/sql.h" #include "common/memmgr.h" +#include "common/showmsg.h" // NOTE : These values are hardcoded into the client @@ -495,6 +496,16 @@ static void rodex_getItemsAck(struct map_session_data *sd, int64 mail_id, int8 o nullpo_retv(sd); nullpo_retv(items); + if (VECTOR_LENGTH(sd->rodex.claim_list) < 1) { + ShowError("rodex_getItemsAck: No mail ID queued for claiming.\n"); + return; + } + + if (VECTOR_INDEX(sd->rodex.claim_list, 0) != mail_id) { + ShowError("rodex_getItemsAck: Mail ID mismatch. Expected %"PRId64", got %"PRId64"\n", VECTOR_INDEX(sd->rodex.claim_list, 0), mail_id); + return; + } + for (int i = 0; i < count; ++i) { const struct item *it = &items[i].item; @@ -504,11 +515,19 @@ static void rodex_getItemsAck(struct map_session_data *sd, int64 mail_id, int8 o if (pc->additem(sd, it, it->amount, LOG_TYPE_MAIL) != 0) { clif->rodex_request_items(sd, opentype, mail_id, RODEX_GET_ITEM_FULL_ERROR); + VECTOR_ERASE(sd->rodex.claim_list, 0); return; } } clif->rodex_request_items(sd, opentype, mail_id, RODEX_GET_ITEMS_SUCCESS); + + // Remove the mail ID from the queue + VECTOR_ERASE(sd->rodex.claim_list, 0); + + // Claim the next mail if there is one + if (VECTOR_LENGTH(sd->rodex.claim_list) > 0) + rodex->get_items(sd, opentype, VECTOR_INDEX(sd->rodex.claim_list, 0)); } /// Gets attached item @@ -570,6 +589,18 @@ static void rodex_get_items(struct map_session_data *sd, int8 opentype, int64 ma return; } + // Queue the mail ID to be claimed + int i = 0; + ARR_FIND(0, VECTOR_LENGTH(sd->rodex.claim_list), i, VECTOR_INDEX(sd->rodex.claim_list, i) == mail_id); + if (i == VECTOR_LENGTH(sd->rodex.claim_list)) { + VECTOR_ENSURE(sd->rodex.claim_list, 1, 1); + VECTOR_PUSH(sd->rodex.claim_list, mail_id); + } + + // If another mail is being claimed, wait for it to finish + if (VECTOR_LENGTH(sd->rodex.claim_list) > 1 && VECTOR_INDEX(sd->rodex.claim_list, 0) != mail_id) + return; + msg->type &= ~MAIL_TYPE_ITEM; msg->items_count = 0; intif->rodex_updatemail(sd, mail_id, opentype, 2); @@ -585,9 +616,10 @@ static void rodex_clean(struct map_session_data *sd, int8 flag) { nullpo_retv(sd); - if (flag == 0) + if (flag == 0) { VECTOR_CLEAR(sd->rodex.messages); - + VECTOR_CLEAR(sd->rodex.claim_list); + } sd->state.workinprogress &= ~2; memset(&sd->rodex.tmp, 0x0, sizeof(sd->rodex.tmp));