Skip to content

Commit 5a63a7e

Browse files
committed
Implementation of LapineDdukDdak System
1 parent ef98eca commit 5a63a7e

File tree

9 files changed

+2356
-0
lines changed

9 files changed

+2356
-0
lines changed

db/item_lapineddukddak.conf

Lines changed: 2050 additions & 0 deletions
Large diffs are not rendered by default.

src/map/clif.c

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22676,6 +22676,106 @@ static void clif_announce_refine_status(struct map_session_data *sd, int item_id
2267622676
#endif
2267722677
}
2267822678

22679+
static bool clif_lapineDdukDdak_open(struct map_session_data *sd, int item_id)
22680+
{
22681+
#if PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
22682+
nullpo_retr(false, sd);
22683+
nullpo_retr(false, itemdb->exists(item_id));
22684+
struct PACKET_ZC_LAPINEDDUKDDAK_OPEN p;
22685+
22686+
p.packetType = HEADER_ZC_LAPINEDDUKDDAK_OPEN;
22687+
p.itemId = item_id;
22688+
clif->send(&p, sizeof(p), &sd->bl, SELF);
22689+
return true;
22690+
#else
22691+
return false;
22692+
#endif // PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
22693+
}
22694+
22695+
static bool clif_lapineDdukDdak_result(struct map_session_data *sd, enum lapineddukddak_result result)
22696+
{
22697+
#if PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
22698+
nullpo_retr(false, sd);
22699+
struct PACKET_ZC_LAPINEDDUKDDAK_RESULT p;
22700+
22701+
p.packetType = HEADER_ZC_LAPINEDDUKDDAK_RESULT;
22702+
p.result = result;
22703+
clif->send(&p, sizeof(p), &sd->bl, SELF);
22704+
return true;
22705+
#else
22706+
return false;
22707+
#endif // PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
22708+
}
22709+
22710+
static void clif_parse_lapineDdukDdak_ack(int fd, struct map_session_data *sd) __attribute__((nonnull (2)));
22711+
static void clif_parse_lapineDdukDdak_ack(int fd, struct map_session_data *sd)
22712+
{
22713+
#if PACKETVER >= 20160302
22714+
const struct PACKET_CZ_LAPINEDDUKDDAK_ACK *p = RP2PTR(fd);
22715+
struct item_data *it = itemdb->exists(p->itemId);
22716+
22717+
if (it == NULL || it->lapineddukddak == NULL)
22718+
return;
22719+
if (pc_isdead(sd))
22720+
return;
22721+
if ((sd->npc_id == 0 && pc_istrading(sd)) || sd->chat_id != 0)
22722+
return;
22723+
if (pc->search_inventory(sd, it->nameid) == INDEX_NOT_FOUND)
22724+
return;
22725+
22726+
if (((p->packetLength - sizeof(struct PACKET_CZ_LAPINEDDUKDDAK_ACK)) / sizeof(struct PACKET_CZ_LAPINEDDUKDDAK_ACK_sub)) != it->lapineddukddak->NeedCount)
22727+
return;
22728+
22729+
for (int i = 0; i < it->lapineddukddak->NeedCount; ++i) {
22730+
int16 idx = p->items[i].index - 2;
22731+
Assert_retv(idx >= 0 && idx < sd->status.inventorySize);
22732+
22733+
struct item itr = sd->status.inventory[idx];
22734+
int j = 0;
22735+
for (j = 0; j < VECTOR_LENGTH(it->lapineddukddak->SourceItems); ++j) {
22736+
if (itr.nameid == VECTOR_INDEX(it->lapineddukddak->SourceItems, j).id) {
22737+
// Validate that the amount sent in the packet is matching the database
22738+
if (p->items[i].count != VECTOR_INDEX(it->lapineddukddak->SourceItems, j).amount) {
22739+
clif->lapineDdukDdak_result(sd, LAPINEDDKUKDDAK_INSUFFICIENT_AMOUNT);
22740+
return;
22741+
}
22742+
22743+
// Validate that the player have enough of the item
22744+
if (itr.amount < VECTOR_INDEX(it->lapineddukddak->SourceItems, j).amount) {
22745+
clif->lapineDdukDdak_result(sd, LAPINEDDKUKDDAK_INSUFFICIENT_AMOUNT);
22746+
return;
22747+
}
22748+
22749+
// Validate refine rate requirement
22750+
if ((itemdb_type(itr.nameid) == IT_ARMOR || itemdb_type(itr.nameid) == IT_WEAPON)
22751+
&& itr.refine < it->lapineddukddak->NeedRefineMin)
22752+
return;
22753+
22754+
// All requirements are met, move to the next one
22755+
break;
22756+
}
22757+
}
22758+
// The item is not in sources list
22759+
if (j == VECTOR_LENGTH(it->lapineddukddak->SourceItems)) {
22760+
clif->lapineDdukDdak_result(sd, LAPINEDDKUKDDAK_INVALID_ITEM);
22761+
return;
22762+
}
22763+
}
22764+
22765+
for (int i = 0; i < it->lapineddukddak->NeedCount; ++i)
22766+
pc->delitem(sd, p->items[i].index - 2, p->items[i].count, 0, DELITEM_NORMAL, LOG_TYPE_SCRIPT);
22767+
if (it->lapineddukddak->script != NULL)
22768+
script->run_item_lapineddukddak_script(sd, it, npc->fake_nd->bl.id);
22769+
clif->lapineDdukDdak_result(sd, LAPINEDDKUKDDAK_SUCCESS);
22770+
return;
22771+
#endif // PACKETVER >= 20160302
22772+
}
22773+
22774+
static void clif_parse_lapineDdukDdak_close(int fd, struct map_session_data *sd) __attribute__((nonnull (2)));
22775+
static void clif_parse_lapineDdukDdak_close(int fd, struct map_session_data *sd)
22776+
{
22777+
}
22778+
2267922779
/*==========================================
2268022780
* Main client packet processing function
2268122781
*------------------------------------------*/
@@ -23898,4 +23998,8 @@ void clif_defaults(void)
2389823998
clif->pRefineryUIClose = clif_parse_RefineryUIClose;
2389923999
clif->pRefineryUIRefine = clif_parse_RefineryUIRefine;
2390024000
clif->announce_refine_status = clif_announce_refine_status;
24001+
clif->lapineDdukDdak_open = clif_lapineDdukDdak_open;
24002+
clif->lapineDdukDdak_result = clif_lapineDdukDdak_result;
24003+
clif->plapineDdukDdak_ack = clif_parse_lapineDdukDdak_ack;
24004+
clif->plapineDdukDdak_close = clif_parse_lapineDdukDdak_close;
2390124005
}

src/map/clif.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,12 @@ enum expand_inventory_result {
697697
EXPAND_INVENTORY_RESULT_MAX_SIZE = 4
698698
};
699699

700+
enum lapineddukddak_result {
701+
LAPINEDDKUKDDAK_SUCCESS = 0,
702+
LAPINEDDKUKDDAK_INSUFFICIENT_AMOUNT = 5,
703+
LAPINEDDKUKDDAK_INVALID_ITEM = 7,
704+
};
705+
700706
/**
701707
* Clif.c Interface
702708
**/
@@ -1621,6 +1627,10 @@ struct clif_interface {
16211627
void (*pRefineryUIClose) (int fd, struct map_session_data *sd);
16221628
void (*pRefineryUIRefine) (int fd, struct map_session_data *sd);
16231629
void (*announce_refine_status) (struct map_session_data *sd, int item_id, int refine_level, bool success, enum send_target target);
1630+
bool (*lapineDdukDdak_open) (struct map_session_data *sd, int item_id);
1631+
bool (*lapineDdukDdak_result) (struct map_session_data *sd, enum lapineddukddak_result result);
1632+
void (*plapineDdukDdak_ack) (int fd, struct map_session_data *sd);
1633+
void (*plapineDdukDdak_close) (int fd, struct map_session_data *sd);
16241634
};
16251635

16261636
#ifdef HERCULES_CORE

src/map/itemdb.c

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2422,6 +2422,93 @@ static uint64 itemdb_unique_id(struct map_session_data *sd)
24222422
return ((uint64)sd->status.char_id << 32) | sd->status.uniqueitem_counter++;
24232423
}
24242424

2425+
static bool itemdb_read_libconfig_lapineddukddak(void)
2426+
{
2427+
struct config_t item_lapineddukddak;
2428+
struct config_setting_t *it = NULL;
2429+
const char *config_filename = "db/item_lapineddukddak.conf"; // FIXME hardcoded name
2430+
int i = 0;
2431+
int count = 0;
2432+
2433+
if (libconfig->load_file(&item_lapineddukddak, config_filename) == CONFIG_FALSE)
2434+
return false;
2435+
2436+
while ((it = libconfig->setting_get_elem(item_lapineddukddak.root, i++)) != NULL) {
2437+
if (itemdb->read_libconfig_lapineddukddak_sub(it, config_filename))
2438+
++count;
2439+
}
2440+
2441+
libconfig->destroy(&item_lapineddukddak);
2442+
ShowStatus("Done reading '"CL_WHITE"%d"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, config_filename);
2443+
return true;
2444+
}
2445+
2446+
static bool itemdb_read_libconfig_lapineddukddak_sub(struct config_setting_t *it, const char *source)
2447+
{
2448+
nullpo_retr(false, it);
2449+
nullpo_retr(false, source);
2450+
2451+
struct item_data *data = NULL;
2452+
const char *name = config_setting_name(it);
2453+
const char *str = NULL;
2454+
int i32 = 0;
2455+
2456+
if ((data = itemdb->name2id(name)) == NULL) {
2457+
ShowWarning("itemdb_read_libconfig_lapineddukddak_sub: unknown item '%s', skipping..\n", name);
2458+
return false;
2459+
}
2460+
2461+
data->lapineddukddak = aCalloc(1, sizeof(struct item_lapineddukddak));
2462+
if (libconfig->setting_lookup_int(it, "NeedCount", &i32) == CONFIG_TRUE)
2463+
data->lapineddukddak->NeedCount = (int16)i32;
2464+
2465+
if (libconfig->setting_lookup_int(it, "NeedRefineMin", &i32) == CONFIG_TRUE)
2466+
data->lapineddukddak->NeedRefineMin = (int8)i32;
2467+
2468+
struct config_setting_t *sources = libconfig->setting_get_member(it, "SourceItems");
2469+
itemdb->read_libconfig_lapineddukddak_sub_sources(sources, data);
2470+
2471+
if (libconfig->setting_lookup_string(it, "Script", &str) == CONFIG_TRUE)
2472+
data->lapineddukddak->script = *str ? script->parse(str, source, -data->nameid, SCRIPT_IGNORE_EXTERNAL_BRACKETS, NULL) : NULL;
2473+
return true;
2474+
}
2475+
2476+
static bool itemdb_read_libconfig_lapineddukddak_sub_sources(struct config_setting_t *sources, struct item_data *data)
2477+
{
2478+
nullpo_retr(false, data);
2479+
nullpo_retr(false, data->lapineddukddak);
2480+
2481+
int i = 0;
2482+
struct config_setting_t *entry = NULL;
2483+
2484+
if (sources == NULL || !config_setting_is_group(sources))
2485+
return false;
2486+
2487+
VECTOR_INIT(data->lapineddukddak->SourceItems);
2488+
while ((entry = libconfig->setting_get_elem(sources, i++)) != NULL) {
2489+
struct item_data *edata = NULL;
2490+
struct itemlist_entry item = { 0 };
2491+
const char *name = config_setting_name(entry);
2492+
int i32 = 0;
2493+
2494+
if ((edata = itemdb->name2id(name)) == NULL) {
2495+
ShowWarning("itemdb_read_libconfig_lapineddukddak_sub: unknown item '%s', skipping..\n", name);
2496+
continue;
2497+
}
2498+
item.id = edata->nameid;
2499+
2500+
if ((i32 = libconfig->setting_get_int(entry)) == CONFIG_TRUE && (i32 <= 0 || i32 > MAX_AMOUNT)) {
2501+
ShowWarning("itemdb_read_libconfig_lapineddukddak_sub: invalid amount (%d) for source item '%s', skipping..\n", i32, name);
2502+
continue;
2503+
}
2504+
item.amount = i32;
2505+
2506+
VECTOR_ENSURE(data->lapineddukddak->SourceItems, 1, 1);
2507+
VECTOR_PUSH(data->lapineddukddak->SourceItems, item);
2508+
}
2509+
return true;
2510+
}
2511+
24252512
/**
24262513
* Reads all item-related databases.
24272514
*/
@@ -2459,6 +2546,7 @@ static void itemdb_read(bool minimal)
24592546
itemdb->read_chains();
24602547
itemdb->read_packages();
24612548
itemdb->read_options();
2549+
itemdb->read_libconfig_lapineddukddak();
24622550
}
24632551

24642552
/**
@@ -2515,6 +2603,12 @@ static void destroy_item_data(struct item_data *self, int free_self)
25152603
script->free_code(self->unequip_script);
25162604
if( self->combos )
25172605
aFree(self->combos);
2606+
if (self->lapineddukddak != NULL) {
2607+
if (self->lapineddukddak->script != NULL)
2608+
script->free_code(self->lapineddukddak->script);
2609+
VECTOR_CLEAR(self->lapineddukddak->SourceItems);
2610+
aFree(self->lapineddukddak);
2611+
}
25182612
HPM->data_store_destroy(&self->hdata);
25192613
#if defined(DEBUG)
25202614
// trash item
@@ -2819,4 +2913,7 @@ void itemdb_defaults(void)
28192913
itemdb->lookup_const = itemdb_lookup_const;
28202914
itemdb->lookup_const_mask = itemdb_lookup_const_mask;
28212915
itemdb->addname_sub = itemdb_addname_sub;
2916+
itemdb->read_libconfig_lapineddukddak = itemdb_read_libconfig_lapineddukddak;
2917+
itemdb->read_libconfig_lapineddukddak_sub = itemdb_read_libconfig_lapineddukddak_sub;
2918+
itemdb->read_libconfig_lapineddukddak_sub_sources = itemdb_read_libconfig_lapineddukddak_sub_sources;
28222919
}

src/map/itemdb.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,13 @@ struct itemdb_option {
482482
struct script_code *script;
483483
};
484484

485+
struct item_lapineddukddak {
486+
int16 NeedCount;
487+
int8 NeedRefineMin;
488+
VECTOR_DECL(struct itemlist_entry) SourceItems;
489+
struct script_code *script;
490+
};
491+
485492
struct item_data {
486493
int nameid;
487494
char name[ITEM_NAME_LENGTH],jname[ITEM_NAME_LENGTH];
@@ -548,6 +555,7 @@ struct item_data {
548555
/* TODO add a pointer to some sort of (struct extra) and gather all the not-common vals into it to save memory */
549556
struct item_group *group;
550557
struct item_package *package;
558+
struct item_lapineddukddak *lapineddukddak;
551559
struct hplugin_data_store *hdata; ///< HPM Plugin Data Store
552560
};
553561

@@ -685,6 +693,9 @@ struct itemdb_interface {
685693
bool (*lookup_const) (const struct config_setting_t *it, const char *name, int *value);
686694
bool (*lookup_const_mask) (const struct config_setting_t *it, const char *name, int *value);
687695
int (*addname_sub) (union DBKey key, struct DBData *data, va_list ap);
696+
bool (*read_libconfig_lapineddukddak) (void);
697+
bool (*read_libconfig_lapineddukddak_sub) (struct config_setting_t *it, const char *source);
698+
bool (*read_libconfig_lapineddukddak_sub_sources) (struct config_setting_t *sources, struct item_data *data);
688699
};
689700

690701
#ifdef HERCULES_CORE

src/map/packets.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1954,4 +1954,12 @@ packet(0x96e,clif->ackmergeitems);
19541954
packet(0x0b22,clif->pHotkeyRowShift2); // CZ_SHORTCUTKEYBAR_ROTATE
19551955
#endif
19561956

1957+
#if PACKETVER >= 20160302
1958+
packet(0x0a4f,clif->plapineDdukDdak_ack);
1959+
#endif
1960+
1961+
#if PACKETVER >= 20160504
1962+
packet(0x0a70,clif->plapineDdukDdak_close);
1963+
#endif
1964+
19571965
#endif /* MAP_PACKETS_H */

src/map/packets_struct.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3451,6 +3451,44 @@ struct PACKET_ZC_REFINE_STATUS {
34513451
DEFINE_PACKET_HEADER(ZC_REFINE_STATUS, 0x0ada);
34523452
#endif
34533453

3454+
#if PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
3455+
struct PACKET_ZC_LAPINEDDUKDDAK_OPEN {
3456+
int16 packetType;
3457+
#if PACKETVER_MAIN_NUM >= 20181121 || PACKETVER_RE_NUM >= 20180704 || PACKETVER_ZERO_NUM >= 20181114
3458+
int32 itemId;
3459+
#else
3460+
int16 itemId;
3461+
#endif
3462+
} __attribute__((packed));
3463+
DEFINE_PACKET_HEADER(ZC_LAPINEDDUKDDAK_OPEN, 0x0a4e);
3464+
#endif // PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
3465+
3466+
#if PACKETVER >= 20160302
3467+
struct PACKET_CZ_LAPINEDDUKDDAK_ACK_sub {
3468+
int16 index;
3469+
int16 count;
3470+
} __attribute__((packed));
3471+
3472+
struct PACKET_CZ_LAPINEDDUKDDAK_ACK {
3473+
int16 packetType;
3474+
int16 packetLength;
3475+
#if PACKETVER_MAIN_NUM >= 20181121 || PACKETVER_RE_NUM >= 20180704 || PACKETVER_ZERO_NUM >= 20181114
3476+
int32 itemId;
3477+
#else
3478+
int16 itemId;
3479+
#endif
3480+
struct PACKET_CZ_LAPINEDDUKDDAK_ACK_sub items[];
3481+
} __attribute__((packed));
3482+
DEFINE_PACKET_HEADER(CZ_LAPINEDDUKDDAK_ACK, 0x0a4f);
3483+
#endif // PACKETVER >= 20160302
3484+
3485+
#if PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
3486+
struct PACKET_ZC_LAPINEDDUKDDAK_RESULT {
3487+
int16 packetType;
3488+
int16 result;
3489+
} __attribute__((packed));
3490+
DEFINE_PACKET_HEADER(ZC_LAPINEDDUKDDAK_RESULT, 0x0a50);
3491+
#endif // PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
34543492

34553493
#if !defined(sun) && (!defined(__NETBSD__) || __NetBSD_Version__ >= 600000000) // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
34563494
#pragma pack(pop)

0 commit comments

Comments
 (0)