diff options
author | Andrei Karas <akaras@inbox.ru> | 2019-04-13 03:17:10 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2019-04-15 21:27:39 +0300 |
commit | 35d1c082365b061d147b23b534f54a3a84904f7b (patch) | |
tree | 27d5990ea537d932115e7e2c0ad17cab2eb7a60d /src/map | |
parent | 563ddcf6da8b1c0b4bedb3417d8950e20b7c5a0d (diff) | |
download | hercules-35d1c082365b061d147b23b534f54a3a84904f7b.tar.gz hercules-35d1c082365b061d147b23b534f54a3a84904f7b.tar.bz2 hercules-35d1c082365b061d147b23b534f54a3a84904f7b.tar.xz hercules-35d1c082365b061d147b23b534f54a3a84904f7b.zip |
Improve get items from rodex
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/intif.c | 20 | ||||
-rw-r--r-- | src/map/intif.h | 1 | ||||
-rw-r--r-- | src/map/rodex.c | 58 | ||||
-rw-r--r-- | src/map/rodex.h | 1 |
4 files changed, 51 insertions, 29 deletions
diff --git a/src/map/intif.c b/src/map/intif.c index da85c96a2..e25f56b63 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -2873,6 +2873,22 @@ static void intif_parse_GetZenyAck(int fd) rodex->getZenyAck(sd, mail_id, opentype, zeny); } +static void intif_parse_GetItemsAck(int fd) +{ + int char_id = RFIFOL(fd, 2); + + struct map_session_data *sd = map->charid2sd(char_id); + if (sd == NULL) // User is not online anymore + return; + + int64 mail_id = RFIFOQ(fd, 6); + uint8 opentype = RFIFOB(fd, 14); + int count = RFIFOB(fd, 15); + struct rodex_item items[RODEX_MAX_ITEM]; + memcpy(&items[0], RFIFOP(fd, 16), sizeof(struct rodex_item) * RODEX_MAX_ITEM); + rodex->getItemsAck(sd, mail_id, opentype, count, &items[0]); +} + //----------------------------------------------------------------- // Communication from the inter server // Return a 0 (false) if there were any errors. @@ -2991,6 +3007,7 @@ static int intif_parse(int fd) case 0x3897: intif->pRodexSendMail(fd); break; case 0x3898: intif->pRodexCheckName(fd); break; case 0x3899: intif->pGetZenyAck(fd); break; + case 0x389a: intif->pGetItemsAck(fd); break; // Clan System case 0x3858: intif->pRecvClanMemberAction(fd); break; @@ -3020,7 +3037,7 @@ void intif_defaults(void) -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3860 Quests [Kevin] [Inkfish] -1, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 3, 3, 0, //0x3870 Mercenaries [Zephyrus] / Elemental [pakpil] 14,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //0x3880 - -1,-1, 7, 3, 0,-1, 7, 15,18 + NAME_LENGTH, 23, 0, 0, 0, 0, 0, 0, //0x3890 Homunculus [albator] / RoDEX [KirieZ] + -1,-1, 7, 3, 0,-1, 7, 15,18 + NAME_LENGTH, 23, 16 + sizeof(struct rodex_item) * RODEX_MAX_ITEM, 0, 0, 0, 0, 0, //0x3890 Homunculus [albator] / RoDEX [KirieZ] }; intif = &intif_s; @@ -3191,6 +3208,7 @@ void intif_defaults(void) intif->pRodexSendMail = intif_parse_RodexSendMail; intif->pRodexCheckName = intif_parse_RodexCheckName; intif->pGetZenyAck = intif_parse_GetZenyAck; + intif->pGetItemsAck = intif_parse_GetItemsAck; /* Clan System */ intif->pRecvClanMemberAction = intif_parse_RecvClanMemberAction; /* Achievement System */ diff --git a/src/map/intif.h b/src/map/intif.h index cf857a79c..8df669217 100644 --- a/src/map/intif.h +++ b/src/map/intif.h @@ -139,6 +139,7 @@ struct intif_interface { int(*rodex_sendmail) (struct rodex_message *msg); int(*rodex_checkname) (struct map_session_data *sd, const char *name); void (*pGetZenyAck) (int fd); + void (*pGetItemsAck) (int fd); /* Clan System */ int (*clan_kickoffline) (int clan_id, int kick_interval); int (*clan_membercount) (int clan_id, int kick_interval); diff --git a/src/map/rodex.c b/src/map/rodex.c index 2b8ac7757..766fdc5ea 100644 --- a/src/map/rodex.c +++ b/src/map/rodex.c @@ -457,7 +457,6 @@ static void rodex_getZenyAck(struct map_session_data *sd, int64 mail_id, int8 op /// @param mail_id : Mail ID that we're getting zeny from static void rodex_get_zeny(struct map_session_data *sd, int8 opentype, int64 mail_id) { - nullpo_retv(sd); struct rodex_message *msg = rodex->get_mail(sd, mail_id); @@ -477,19 +476,39 @@ static void rodex_get_zeny(struct map_session_data *sd, int8 opentype, int64 mai intif->rodex_updatemail(sd, mail_id, opentype, 1); } +// give requested items from message to player +static void rodex_getItemsAck(struct map_session_data *sd, int64 mail_id, int8 opentype, int count, const struct rodex_item *items) +{ + nullpo_retv(sd); + nullpo_retv(items); + + for (int i = 0; i < count; ++i) { + const struct item *it = &items[i].item; + + if (it->nameid == 0) { + continue; + } + + if (pc->additem(sd, it, it->amount, LOG_TYPE_MAIL) != 0) { + clif->rodex_request_items(sd, opentype, mail_id, RODEX_GET_ITEM_FULL_ERROR); + return; + } + } + + clif->rodex_request_items(sd, opentype, mail_id, RODEX_GET_ITEMS_SUCCESS); +} + /// Gets attached item /// @param sd : Who's getting /// @param mail_id : Mail ID that we're getting items from static void rodex_get_items(struct map_session_data *sd, int8 opentype, int64 mail_id) { - struct rodex_message *msg; - int weight = 0; - int empty_slots = 0, required_slots; - int i; - nullpo_retv(sd); - msg = rodex->get_mail(sd, mail_id); + int weight = 0; + int empty_slots = 0; + + struct rodex_message *msg = rodex->get_mail(sd, mail_id); if (msg == NULL) { clif->rodex_request_items(sd, opentype, mail_id, RODEX_GET_ITEM_FATAL_ERROR); @@ -501,7 +520,7 @@ static void rodex_get_items(struct map_session_data *sd, int8 opentype, int64 ma return; } - for (i = 0; i < RODEX_MAX_ITEM; ++i) { + for (int i = 0; i < RODEX_MAX_ITEM; ++i) { if (msg->items[i].item.nameid != 0) { weight += itemdb->search(msg->items[i].item.nameid)->weight * msg->items[i].item.amount; } @@ -512,8 +531,8 @@ static void rodex_get_items(struct map_session_data *sd, int8 opentype, int64 ma return; } - required_slots = msg->items_count; - for (i = 0; i < sd->status.inventorySize; ++i) { + int required_slots = msg->items_count; + for (int i = 0; i < sd->status.inventorySize; ++i) { if (sd->status.inventory[i].nameid == 0) { empty_slots++; } else if (itemdb->isstackable(sd->status.inventory[i].nameid) == 1) { @@ -538,27 +557,9 @@ static void rodex_get_items(struct map_session_data *sd, int8 opentype, int64 ma return; } - for (i = 0; i < RODEX_MAX_ITEM; ++i) { - struct item *it = &msg->items[i].item; - - if (it->nameid == 0) { - continue; - } - - if (pc->additem(sd, it, it->amount, LOG_TYPE_MAIL) != 0) { - clif->rodex_request_items(sd, opentype, mail_id, RODEX_GET_ITEM_FULL_ERROR); - intif->rodex_updatemail(sd, mail_id, opentype, 2); - return; - } else { - memset(it, 0x0, sizeof(*it)); - } - } - msg->type &= ~MAIL_TYPE_ITEM; msg->items_count = 0; intif->rodex_updatemail(sd, mail_id, opentype, 2); - - clif->rodex_request_items(sd, opentype, mail_id, RODEX_GET_ITEMS_SUCCESS); } /// Cleans user's RoDEX related data @@ -678,4 +679,5 @@ void rodex_defaults(void) rodex->get_items = rodex_get_items; rodex->clean = rodex_clean; rodex->getZenyAck = rodex_getZenyAck; + rodex->getItemsAck = rodex_getItemsAck; } diff --git a/src/map/rodex.h b/src/map/rodex.h index 385c77e25..b6e7ca5b7 100644 --- a/src/map/rodex.h +++ b/src/map/rodex.h @@ -75,6 +75,7 @@ struct rodex_interface { void (*delete_mail) (struct map_session_data *sd, int64 mail_id); void (*clean) (struct map_session_data *sd, int8 flag); void (*getZenyAck) (struct map_session_data *sd, int64 mail_id, int8 opentype, int64 zeny); + void (*getItemsAck) (struct map_session_data *sd, int64 mail_id, int8 opentype, int count, const struct rodex_item *items); }; #ifdef HERCULES_CORE |