Index: src/common/mmo.h =================================================================== --- src/common/mmo.h (revision 17121) +++ src/common/mmo.h (working copy) @@ -175,6 +175,7 @@ IT_UNKNOWN2,//9 IT_AMMO, //10 IT_DELAYCONSUME,//11 + IT_CHARM, //12 IT_CASH = 18, IT_MAX }; Index: src/map/clif.c =================================================================== --- src/map/clif.c (revision 17121) +++ src/map/clif.c (working copy) @@ -65,7 +65,7 @@ //Converts item type in case of pet eggs. static inline int itemtype(int type) { - return ( type == IT_PETEGG ) ? IT_WEAPON : type; + return ( type == IT_PETEGG ) ? IT_WEAPON : ( type == IT_CHARM ) ? IT_ETC : type; } @@ -14114,7 +14114,7 @@ return; } - if( (item = itemdb_exists(sd->status.inventory[idx].nameid)) != NULL && !(item->type == IT_ARMOR || item->type == IT_PETARMOR || item->type == IT_WEAPON || item->type == IT_CARD || item->type == IT_ETC) ) + if( (item = itemdb_exists(sd->status.inventory[idx].nameid)) != NULL && !(item->type == IT_ARMOR || item->type == IT_PETARMOR || item->type == IT_WEAPON || item->type == IT_CARD || item->type == IT_ETC || item->type == IT_CHARM) ) { // Consumable or pets are not allowed clif_Auction_setitem(sd->fd, idx, true); return; Index: src/map/itemdb.c =================================================================== --- src/map/itemdb.c (revision 17121) +++ src/map/itemdb.c (working copy) @@ -198,6 +198,7 @@ case IT_AMMO: return "Arrow/Ammunition"; case IT_DELAYCONSUME: return "Delay-Consume Usable"; case IT_CASH: return "Cash Usable"; + case IT_CHARM: return "Charm"; } return "Unknown Type"; } @@ -976,7 +977,7 @@ id->type = atoi(str[3]); - if( id->type < 0 || id->type == IT_UNKNOWN || id->type == IT_UNKNOWN2 || ( id->type > IT_DELAYCONSUME && id->type < IT_CASH ) || id->type >= IT_MAX ) + if( id->type < 0 || id->type == IT_UNKNOWN || id->type == IT_UNKNOWN2 || ( id->type > IT_CHARM && id->type < IT_CASH ) || id->type >= IT_MAX ) {// catch invalid item types ShowWarning("itemdb_parse_dbrow: Invalid item type %d for item %d. IT_ETC will be used.\n", id->type, nameid); id->type = IT_ETC; Index: src/map/log.c =================================================================== --- src/map/log.c (revision 17121) +++ src/map/log.c (working copy) @@ -111,7 +111,7 @@ if( ( filter&LOG_FILTER_ALL ) || ( filter&LOG_FILTER_HEALING && id->type == IT_HEALING ) || - ( filter&LOG_FILTER_ETC_AMMO && ( id->type == IT_ETC || id->type == IT_AMMO ) ) || + ( filter&LOG_FILTER_ETC_AMMO && ( id->type == IT_ETC || id->type == IT_AMMO || id->type == IT_CHARM ) ) || ( filter&LOG_FILTER_USABLE && ( id->type == IT_USABLE || id->type == IT_CASH ) ) || ( filter&LOG_FILTER_WEAPON && id->type == IT_WEAPON ) || ( filter&LOG_FILTER_ARMOR && id->type == IT_ARMOR ) || Index: src/map/pc.c =================================================================== --- src/map/pc.c (revision 17121) +++ src/map/pc.c (working copy) @@ -3835,6 +3835,8 @@ //Auto-equip if(data->flag.autoequip) pc_equipitem(sd, i, data->equip); + if(sd->inventory_data[i]->type == IT_CHARM) + status_calc_pc(sd,0); /* rental item check */ if( item_data->expire_time ) { @@ -3863,6 +3865,7 @@ *------------------------------------------*/ int pc_delitem(struct map_session_data *sd,int n,int amount,int type, short reason, e_log_pick_type log_type) { + int mem = 0; nullpo_retr(1, sd); if(sd->status.inventory[n].nameid==0 || amount <= 0 || sd->status.inventory[n].amountinventory_data[n] == NULL) @@ -3875,6 +3878,7 @@ if( sd->status.inventory[n].amount <= 0 ){ if(sd->status.inventory[n].equip) pc_unequipitem(sd,n,3); + mem = sd->inventory_data[n]->type; memset(&sd->status.inventory[n],0,sizeof(sd->status.inventory[0])); sd->inventory_data[n] = NULL; } @@ -3882,6 +3886,8 @@ clif_delitem(sd,n,amount,reason); if(!(type&2)) clif_updatestatus(sd,SP_WEIGHT); + if(mem == IT_CHARM) + status_calc_pc(sd,0); return 0; } Index: src/map/status.c =================================================================== --- src/map/status.c (revision 17121) +++ src/map/status.c (working copy) @@ -2425,6 +2425,24 @@ pc_delautobonus(sd,sd->autobonus3,ARRAYLENGTH(sd->autobonus3),true); // Parse equipment. + for(i=0;iinventory_data[i]) + continue; + if(sd->inventory_data[i]->type == IT_CHARM) + { + if(sd->inventory_data[i]->script && sd->inventory_data[i]->elv <= sd->status.base_level) + { + if((!((1<<(sd->class_&MAPID_BASEMASK)) &(sd->inventory_data[i]->class_base[sd->class_&JOBL_2_1?1:(sd->class_&JOBL_2_2?2:0)]))) + || (!((1<<(sd->class_&JOBL_UPPER?1:(sd->class_&JOBL_BABY?2:0))) &sd->inventory_data[i]->class_upper))) + continue; + run_script(sd->inventory_data[i]->script,0,sd->bl.id,0); + if (!calculating) + return 1; + } + } + } + for(i=0;iequip_index[i]; //We pass INDEX to current_equip_item_index - for EQUIP_SCRIPT (new cards solution) [Lupus] if(index < 0)