Skip to content

Commit a014752

Browse files
committed
Implementation of LapineDdukDdak System
1 parent bd1ebbc commit a014752

File tree

9 files changed

+2629
-0
lines changed

9 files changed

+2629
-0
lines changed

db/item_lapineddukddak.conf

Lines changed: 2318 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
@@ -22718,6 +22718,106 @@ static void clif_announce_refine_status(struct map_session_data *sd, int item_id
2271822718
#endif
2271922719
}
2272022720

22721+
static bool clif_lapineDdukDdak_open(struct map_session_data *sd, int item_id)
22722+
{
22723+
#if PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
22724+
nullpo_retr(false, sd);
22725+
nullpo_retr(false, itemdb->exists(item_id));
22726+
struct PACKET_ZC_LAPINEDDUKDDAK_OPEN p;
22727+
22728+
p.packetType = HEADER_ZC_LAPINEDDUKDDAK_OPEN;
22729+
p.itemId = item_id;
22730+
clif->send(&p, sizeof(p), &sd->bl, SELF);
22731+
return true;
22732+
#else
22733+
return false;
22734+
#endif // PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
22735+
}
22736+
22737+
static bool clif_lapineDdukDdak_result(struct map_session_data *sd, enum lapineddukddak_result result)
22738+
{
22739+
#if PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
22740+
nullpo_retr(false, sd);
22741+
struct PACKET_ZC_LAPINEDDUKDDAK_RESULT p;
22742+
22743+
p.packetType = HEADER_ZC_LAPINEDDUKDDAK_RESULT;
22744+
p.result = result;
22745+
clif->send(&p, sizeof(p), &sd->bl, SELF);
22746+
return true;
22747+
#else
22748+
return false;
22749+
#endif // PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
22750+
}
22751+
22752+
static void clif_parse_lapineDdukDdak_ack(int fd, struct map_session_data *sd) __attribute__((nonnull (2)));
22753+
static void clif_parse_lapineDdukDdak_ack(int fd, struct map_session_data *sd)
22754+
{
22755+
#if PACKETVER >= 20160302
22756+
const struct PACKET_CZ_LAPINEDDUKDDAK_ACK *p = RP2PTR(fd);
22757+
struct item_data *it = itemdb->exists(p->itemId);
22758+
22759+
if (it == NULL || it->lapineddukddak == NULL)
22760+
return;
22761+
if (pc_isdead(sd))
22762+
return;
22763+
if ((sd->npc_id == 0 && pc_istrading(sd)) || sd->chat_id != 0)
22764+
return;
22765+
if (pc->search_inventory(sd, it->nameid) == INDEX_NOT_FOUND)
22766+
return;
22767+
22768+
if (((p->packetLength - sizeof(struct PACKET_CZ_LAPINEDDUKDDAK_ACK)) / sizeof(struct PACKET_CZ_LAPINEDDUKDDAK_ACK_sub)) != it->lapineddukddak->NeedCount)
22769+
return;
22770+
22771+
for (int i = 0; i < it->lapineddukddak->NeedCount; ++i) {
22772+
int16 idx = p->items[i].index - 2;
22773+
Assert_retv(idx >= 0 && idx < sd->status.inventorySize);
22774+
22775+
struct item itr = sd->status.inventory[idx];
22776+
int j = 0;
22777+
for (j = 0; j < VECTOR_LENGTH(it->lapineddukddak->SourceItems); ++j) {
22778+
if (itr.nameid == VECTOR_INDEX(it->lapineddukddak->SourceItems, j).id) {
22779+
// Validate that the amount sent in the packet is matching the database
22780+
if (p->items[i].count != VECTOR_INDEX(it->lapineddukddak->SourceItems, j).amount) {
22781+
clif->lapineDdukDdak_result(sd, LAPINEDDKUKDDAK_INSUFFICIENT_AMOUNT);
22782+
return;
22783+
}
22784+
22785+
// Validate that the player have enough of the item
22786+
if (itr.amount < VECTOR_INDEX(it->lapineddukddak->SourceItems, j).amount) {
22787+
clif->lapineDdukDdak_result(sd, LAPINEDDKUKDDAK_INSUFFICIENT_AMOUNT);
22788+
return;
22789+
}
22790+
22791+
// Validate refine rate requirement
22792+
if ((itemdb_type(itr.nameid) == IT_ARMOR || itemdb_type(itr.nameid) == IT_WEAPON)
22793+
&& (itr.refine < it->lapineddukddak->NeedRefineMin || itr.refine > it->lapineddukddak->NeedRefineMax))
22794+
return;
22795+
22796+
// All requirements are met, move to the next one
22797+
break;
22798+
}
22799+
}
22800+
// The item is not in sources list
22801+
if (j == VECTOR_LENGTH(it->lapineddukddak->SourceItems)) {
22802+
clif->lapineDdukDdak_result(sd, LAPINEDDKUKDDAK_INVALID_ITEM);
22803+
return;
22804+
}
22805+
}
22806+
22807+
for (int i = 0; i < it->lapineddukddak->NeedCount; ++i)
22808+
pc->delitem(sd, p->items[i].index - 2, p->items[i].count, 0, DELITEM_NORMAL, LOG_TYPE_SCRIPT);
22809+
if (it->lapineddukddak->script != NULL)
22810+
script->run_item_lapineddukddak_script(sd, it, npc->fake_nd->bl.id);
22811+
clif->lapineDdukDdak_result(sd, LAPINEDDKUKDDAK_SUCCESS);
22812+
return;
22813+
#endif // PACKETVER >= 20160302
22814+
}
22815+
22816+
static void clif_parse_lapineDdukDdak_close(int fd, struct map_session_data *sd) __attribute__((nonnull (2)));
22817+
static void clif_parse_lapineDdukDdak_close(int fd, struct map_session_data *sd)
22818+
{
22819+
}
22820+
2272122821
/*==========================================
2272222822
* Main client packet processing function
2272322823
*------------------------------------------*/
@@ -23942,4 +24042,8 @@ void clif_defaults(void)
2394224042
clif->pRefineryUIClose = clif_parse_RefineryUIClose;
2394324043
clif->pRefineryUIRefine = clif_parse_RefineryUIRefine;
2394424044
clif->announce_refine_status = clif_announce_refine_status;
24045+
clif->lapineDdukDdak_open = clif_lapineDdukDdak_open;
24046+
clif->lapineDdukDdak_result = clif_lapineDdukDdak_result;
24047+
clif->plapineDdukDdak_ack = clif_parse_lapineDdukDdak_ack;
24048+
clif->plapineDdukDdak_close = clif_parse_lapineDdukDdak_close;
2394524049
}

src/map/clif.h

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

701+
enum lapineddukddak_result {
702+
LAPINEDDKUKDDAK_SUCCESS = 0,
703+
LAPINEDDKUKDDAK_INSUFFICIENT_AMOUNT = 5,
704+
LAPINEDDKUKDDAK_INVALID_ITEM = 7,
705+
};
706+
701707
/**
702708
* Clif.c Interface
703709
**/
@@ -1624,6 +1630,10 @@ struct clif_interface {
16241630
void (*pRefineryUIClose) (int fd, struct map_session_data *sd);
16251631
void (*pRefineryUIRefine) (int fd, struct map_session_data *sd);
16261632
void (*announce_refine_status) (struct map_session_data *sd, int item_id, int refine_level, bool success, enum send_target target);
1633+
bool (*lapineDdukDdak_open) (struct map_session_data *sd, int item_id);
1634+
bool (*lapineDdukDdak_result) (struct map_session_data *sd, enum lapineddukddak_result result);
1635+
void (*plapineDdukDdak_ack) (int fd, struct map_session_data *sd);
1636+
void (*plapineDdukDdak_close) (int fd, struct map_session_data *sd);
16271637
};
16281638

16291639
#ifdef HERCULES_CORE

src/map/itemdb.c

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2422,6 +2422,96 @@ 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+
if (libconfig->setting_lookup_int(it, "NeedRefineMax", &i32) == CONFIG_TRUE)
2469+
data->lapineddukddak->NeedRefineMax = (int8)i32;
2470+
2471+
struct config_setting_t *sources = libconfig->setting_get_member(it, "SourceItems");
2472+
itemdb->read_libconfig_lapineddukddak_sub_sources(sources, data);
2473+
2474+
if (libconfig->setting_lookup_string(it, "Script", &str) == CONFIG_TRUE)
2475+
data->lapineddukddak->script = *str ? script->parse(str, source, -data->nameid, SCRIPT_IGNORE_EXTERNAL_BRACKETS, NULL) : NULL;
2476+
return true;
2477+
}
2478+
2479+
static bool itemdb_read_libconfig_lapineddukddak_sub_sources(struct config_setting_t *sources, struct item_data *data)
2480+
{
2481+
nullpo_retr(false, data);
2482+
nullpo_retr(false, data->lapineddukddak);
2483+
2484+
int i = 0;
2485+
struct config_setting_t *entry = NULL;
2486+
2487+
if (sources == NULL || !config_setting_is_group(sources))
2488+
return false;
2489+
2490+
VECTOR_INIT(data->lapineddukddak->SourceItems);
2491+
while ((entry = libconfig->setting_get_elem(sources, i++)) != NULL) {
2492+
struct item_data *edata = NULL;
2493+
struct itemlist_entry item = { 0 };
2494+
const char *name = config_setting_name(entry);
2495+
int i32 = 0;
2496+
2497+
if ((edata = itemdb->name2id(name)) == NULL) {
2498+
ShowWarning("itemdb_read_libconfig_lapineddukddak_sub: unknown item '%s', skipping..\n", name);
2499+
continue;
2500+
}
2501+
item.id = edata->nameid;
2502+
2503+
if ((i32 = libconfig->setting_get_int(entry)) == CONFIG_TRUE && (i32 <= 0 || i32 > MAX_AMOUNT)) {
2504+
ShowWarning("itemdb_read_libconfig_lapineddukddak_sub: invalid amount (%d) for source item '%s', skipping..\n", i32, name);
2505+
continue;
2506+
}
2507+
item.amount = i32;
2508+
2509+
VECTOR_ENSURE(data->lapineddukddak->SourceItems, 1, 1);
2510+
VECTOR_PUSH(data->lapineddukddak->SourceItems, item);
2511+
}
2512+
return true;
2513+
}
2514+
24252515
/**
24262516
* Reads all item-related databases.
24272517
*/
@@ -2460,6 +2550,7 @@ static void itemdb_read(bool minimal)
24602550
itemdb->read_groups();
24612551
itemdb->read_chains();
24622552
itemdb->read_packages();
2553+
itemdb->read_libconfig_lapineddukddak();
24632554
}
24642555

24652556
/**
@@ -2516,6 +2607,12 @@ static void destroy_item_data(struct item_data *self, int free_self)
25162607
script->free_code(self->unequip_script);
25172608
if( self->combos )
25182609
aFree(self->combos);
2610+
if (self->lapineddukddak != NULL) {
2611+
if (self->lapineddukddak->script != NULL)
2612+
script->free_code(self->lapineddukddak->script);
2613+
VECTOR_CLEAR(self->lapineddukddak->SourceItems);
2614+
aFree(self->lapineddukddak);
2615+
}
25192616
HPM->data_store_destroy(&self->hdata);
25202617
#if defined(DEBUG)
25212618
// trash item
@@ -2820,4 +2917,7 @@ void itemdb_defaults(void)
28202917
itemdb->lookup_const = itemdb_lookup_const;
28212918
itemdb->lookup_const_mask = itemdb_lookup_const_mask;
28222919
itemdb->addname_sub = itemdb_addname_sub;
2920+
itemdb->read_libconfig_lapineddukddak = itemdb_read_libconfig_lapineddukddak;
2921+
itemdb->read_libconfig_lapineddukddak_sub = itemdb_read_libconfig_lapineddukddak_sub;
2922+
itemdb->read_libconfig_lapineddukddak_sub_sources = itemdb_read_libconfig_lapineddukddak_sub_sources;
28232923
}

src/map/itemdb.h

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

485+
struct item_lapineddukddak {
486+
int16 NeedCount;
487+
int8 NeedRefineMin;
488+
int8 NeedRefineMax;
489+
VECTOR_DECL(struct itemlist_entry) SourceItems;
490+
struct script_code *script;
491+
};
492+
485493
struct item_data {
486494
int nameid;
487495
char name[ITEM_NAME_LENGTH],jname[ITEM_NAME_LENGTH];
@@ -549,6 +557,7 @@ struct item_data {
549557
/* TODO add a pointer to some sort of (struct extra) and gather all the not-common vals into it to save memory */
550558
struct item_group *group;
551559
struct item_package *package;
560+
struct item_lapineddukddak *lapineddukddak;
552561
struct hplugin_data_store *hdata; ///< HPM Plugin Data Store
553562
};
554563

@@ -686,6 +695,9 @@ struct itemdb_interface {
686695
bool (*lookup_const) (const struct config_setting_t *it, const char *name, int *value);
687696
bool (*lookup_const_mask) (const struct config_setting_t *it, const char *name, int *value);
688697
int (*addname_sub) (union DBKey key, struct DBData *data, va_list ap);
698+
bool (*read_libconfig_lapineddukddak) (void);
699+
bool (*read_libconfig_lapineddukddak_sub) (struct config_setting_t *it, const char *source);
700+
bool (*read_libconfig_lapineddukddak_sub_sources) (struct config_setting_t *sources, struct item_data *data);
689701
};
690702

691703
#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: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3533,6 +3533,45 @@ struct PACKET_ZC_HAT_EFFECT {
35333533
DEFINE_PACKET_HEADER(ZC_HAT_EFFECT, 0x0a3b);
35343534
#endif
35353535

3536+
#if PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
3537+
struct PACKET_ZC_LAPINEDDUKDDAK_OPEN {
3538+
int16 packetType;
3539+
#if PACKETVER_MAIN_NUM >= 20181121 || PACKETVER_RE_NUM >= 20180704 || PACKETVER_ZERO_NUM >= 20181114
3540+
int32 itemId;
3541+
#else
3542+
int16 itemId;
3543+
#endif
3544+
} __attribute__((packed));
3545+
DEFINE_PACKET_HEADER(ZC_LAPINEDDUKDDAK_OPEN, 0x0a4e);
3546+
#endif // PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
3547+
3548+
#if PACKETVER >= 20160302
3549+
struct PACKET_CZ_LAPINEDDUKDDAK_ACK_sub {
3550+
int16 index;
3551+
int16 count;
3552+
} __attribute__((packed));
3553+
3554+
struct PACKET_CZ_LAPINEDDUKDDAK_ACK {
3555+
int16 packetType;
3556+
int16 packetLength;
3557+
#if PACKETVER_MAIN_NUM >= 20181121 || PACKETVER_RE_NUM >= 20180704 || PACKETVER_ZERO_NUM >= 20181114
3558+
int32 itemId;
3559+
#else
3560+
int16 itemId;
3561+
#endif
3562+
struct PACKET_CZ_LAPINEDDUKDDAK_ACK_sub items[];
3563+
} __attribute__((packed));
3564+
DEFINE_PACKET_HEADER(CZ_LAPINEDDUKDDAK_ACK, 0x0a4f);
3565+
#endif // PACKETVER >= 20160302
3566+
3567+
#if PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
3568+
struct PACKET_ZC_LAPINEDDUKDDAK_RESULT {
3569+
int16 packetType;
3570+
int16 result;
3571+
} __attribute__((packed));
3572+
DEFINE_PACKET_HEADER(ZC_LAPINEDDUKDDAK_RESULT, 0x0a50);
3573+
#endif // PACKETVER_MAIN_NUM >= 20160601 || PACKETVER_RE_NUM >= 20160525 || defined(PACKETVER_ZERO)
3574+
35363575
#if !defined(sun) && (!defined(__NETBSD__) || __NetBSD_Version__ >= 600000000) // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
35373576
#pragma pack(pop)
35383577
#endif // not NetBSD < 6 / Solaris

0 commit comments

Comments
 (0)