@@ -2419,6 +2419,98 @@ static uint64 itemdb_unique_id(struct map_session_data *sd)
24192419 return ((uint64 )sd -> status .char_id << 32 ) | sd -> status .uniqueitem_counter ++ ;
24202420}
24212421
2422+ static bool itemdb_read_libconfig_lapineddukddak (void )
2423+ {
2424+ struct config_t item_lapineddukddak ;
2425+ struct config_setting_t * it = NULL ;
2426+ char filepath [256 ];
2427+
2428+ int i = 0 ;
2429+ int count = 0 ;
2430+
2431+ safesnprintf (filepath , sizeof (filepath ), "%s/%s" , map -> db_path , DBPATH "item_lapineddukddak.conf" );
2432+ if (libconfig -> load_file (& item_lapineddukddak , filepath ) == CONFIG_FALSE )
2433+ return false;
2434+
2435+ while ((it = libconfig -> setting_get_elem (item_lapineddukddak .root , i ++ )) != NULL ) {
2436+ if (itemdb -> read_libconfig_lapineddukddak_sub (it , filepath ))
2437+ ++ count ;
2438+ }
2439+
2440+ libconfig -> destroy (& item_lapineddukddak );
2441+ ShowStatus ("Done reading '" CL_WHITE "%d" CL_RESET "' entries in '" CL_WHITE "%s" CL_RESET "'.\n" , count , filepath );
2442+ return true;
2443+ }
2444+
2445+ static bool itemdb_read_libconfig_lapineddukddak_sub (struct config_setting_t * it , const char * source )
2446+ {
2447+ nullpo_retr (false, it );
2448+ nullpo_retr (false, source );
2449+
2450+ struct item_data * data = NULL ;
2451+ const char * name = config_setting_name (it );
2452+ const char * str = NULL ;
2453+ int i32 = 0 ;
2454+
2455+ if ((data = itemdb -> name2id (name )) == NULL ) {
2456+ ShowWarning ("itemdb_read_libconfig_lapineddukddak_sub: unknown item '%s', skipping..\n" , name );
2457+ return false;
2458+ }
2459+
2460+ data -> lapineddukddak = aCalloc (1 , sizeof (struct item_lapineddukddak ));
2461+ if (libconfig -> setting_lookup_int (it , "NeedCount" , & i32 ) == CONFIG_TRUE )
2462+ data -> lapineddukddak -> NeedCount = (int16 )i32 ;
2463+
2464+ if (libconfig -> setting_lookup_int (it , "NeedRefineMin" , & i32 ) == CONFIG_TRUE )
2465+ data -> lapineddukddak -> NeedRefineMin = (int8 )i32 ;
2466+
2467+ if (libconfig -> setting_lookup_int (it , "NeedRefineMax" , & i32 ) == CONFIG_TRUE )
2468+ data -> lapineddukddak -> NeedRefineMax = (int8 )i32 ;
2469+
2470+ struct config_setting_t * sources = libconfig -> setting_get_member (it , "SourceItems" );
2471+ itemdb -> read_libconfig_lapineddukddak_sub_sources (sources , data );
2472+
2473+ if (libconfig -> setting_lookup_string (it , "Script" , & str ) == CONFIG_TRUE )
2474+ data -> lapineddukddak -> script = * str ? script -> parse (str , source , - data -> nameid , SCRIPT_IGNORE_EXTERNAL_BRACKETS , NULL ) : NULL ;
2475+ return true;
2476+ }
2477+
2478+ static bool itemdb_read_libconfig_lapineddukddak_sub_sources (struct config_setting_t * sources , struct item_data * data )
2479+ {
2480+ nullpo_retr (false, data );
2481+ nullpo_retr (false, data -> lapineddukddak );
2482+
2483+ int i = 0 ;
2484+ struct config_setting_t * entry = NULL ;
2485+
2486+ if (sources == NULL || !config_setting_is_group (sources ))
2487+ return false;
2488+
2489+ VECTOR_INIT (data -> lapineddukddak -> SourceItems );
2490+ while ((entry = libconfig -> setting_get_elem (sources , i ++ )) != NULL ) {
2491+ struct item_data * edata = NULL ;
2492+ struct itemlist_entry item = { 0 };
2493+ const char * name = config_setting_name (entry );
2494+ int i32 = 0 ;
2495+
2496+ if ((edata = itemdb -> name2id (name )) == NULL ) {
2497+ ShowWarning ("itemdb_read_libconfig_lapineddukddak_sub: unknown item '%s', skipping..\n" , name );
2498+ continue ;
2499+ }
2500+ item .id = edata -> nameid ;
2501+
2502+ if ((i32 = libconfig -> setting_get_int (entry )) == CONFIG_TRUE && (i32 <= 0 || i32 > MAX_AMOUNT )) {
2503+ ShowWarning ("itemdb_read_libconfig_lapineddukddak_sub: invalid amount (%d) for source item '%s', skipping..\n" , i32 , name );
2504+ continue ;
2505+ }
2506+ item .amount = i32 ;
2507+
2508+ VECTOR_ENSURE (data -> lapineddukddak -> SourceItems , 1 , 1 );
2509+ VECTOR_PUSH (data -> lapineddukddak -> SourceItems , item );
2510+ }
2511+ return true;
2512+ }
2513+
24222514/**
24232515 * Reads all item-related databases.
24242516 */
@@ -2457,6 +2549,7 @@ static void itemdb_read(bool minimal)
24572549 itemdb -> read_groups ();
24582550 itemdb -> read_chains ();
24592551 itemdb -> read_packages ();
2552+ itemdb -> read_libconfig_lapineddukddak ();
24602553}
24612554
24622555/**
@@ -2517,6 +2610,12 @@ static void destroy_item_data(struct item_data *self, int free_self)
25172610 script -> free_code (self -> rental_end_script );
25182611 if ( self -> combos )
25192612 aFree (self -> combos );
2613+ if (self -> lapineddukddak != NULL ) {
2614+ if (self -> lapineddukddak -> script != NULL )
2615+ script -> free_code (self -> lapineddukddak -> script );
2616+ VECTOR_CLEAR (self -> lapineddukddak -> SourceItems );
2617+ aFree (self -> lapineddukddak );
2618+ }
25202619 HPM -> data_store_destroy (& self -> hdata );
25212620#if defined(DEBUG )
25222621 // trash item
@@ -2821,4 +2920,7 @@ void itemdb_defaults(void)
28212920 itemdb -> lookup_const = itemdb_lookup_const ;
28222921 itemdb -> lookup_const_mask = itemdb_lookup_const_mask ;
28232922 itemdb -> addname_sub = itemdb_addname_sub ;
2923+ itemdb -> read_libconfig_lapineddukddak = itemdb_read_libconfig_lapineddukddak ;
2924+ itemdb -> read_libconfig_lapineddukddak_sub = itemdb_read_libconfig_lapineddukddak_sub ;
2925+ itemdb -> read_libconfig_lapineddukddak_sub_sources = itemdb_read_libconfig_lapineddukddak_sub_sources ;
28242926}
0 commit comments