From fe5f1e115d0f0444b098b9b027108948ec97004e Mon Sep 17 00:00:00 2001 From: Aleos Date: Fri, 4 Aug 2017 18:38:39 -0400 Subject: [PATCH] Added a new item flag for delayed consumption (#2300) * Added a new item flag for delayed consumption * Fixes #550. * The new flag will never consume the item. * Supports script command itemskill. Thanks to @cydh! --- db/import-tmpl/item_flag.txt | 10 ++++++---- db/pre-re/item_flag.txt | 1 + db/re/item_db.txt | 6 +++--- db/re/item_flag.txt | 6 ++++++ src/map/itemdb.c | 1 + src/map/itemdb.h | 2 +- src/map/skill.c | 2 +- 7 files changed, 19 insertions(+), 9 deletions(-) diff --git a/db/import-tmpl/item_flag.txt b/db/import-tmpl/item_flag.txt index a4419df723..b86479885f 100644 --- a/db/import-tmpl/item_flag.txt +++ b/db/import-tmpl/item_flag.txt @@ -2,8 +2,10 @@ // , // // : -// 1 - As Dead Branch item (will be logged at `branchlog` table and cannot be used at 'nobranch' mapflag) -// 2 - As item group container, check player's inventory and weight before consumed -// 4 - GUID item, cannot be stacked even same or stackable item -// 8 - Item will be bound item when equipped +// 1 - As Dead Branch item (will be logged at `branchlog` table and cannot be used at 'nobranch' mapflag) +// 2 - As item group container, check player's inventory and weight before consumed +// 4 - GUID item, cannot be stacked even same or stackable item +// 8 - Item will be bound item when equipped +// 16 - Special Broadcast: When item dropped by monster and player loot it, will be broadcasted! +// 32 - Item will not be removed on consumption. Also supports 'itemskill' // NOTE: For removing flag by import file, use "-" to remove the flag. Example, 604,-1 will removes flag 1 from Branch_Of_Dead_Tree diff --git a/db/pre-re/item_flag.txt b/db/pre-re/item_flag.txt index 4639dc22f0..ef9cce5b80 100644 --- a/db/pre-re/item_flag.txt +++ b/db/pre-re/item_flag.txt @@ -7,6 +7,7 @@ // 4 - GUID Item: When this item is obtained, will generates GUID that cannot be stacked even same or stackable item // 8 - Item will be bound item when equipped // 16 - Special Broadcast: When item dropped by monster and player loot it, will be broadcasted! +// 32 - Item will not be removed on consumption. Also supports 'itemskill' // NOTE: For removing flag by import file, use "-" to remove the flag. Example, 604,-1 will removes flag 1 from Branch_Of_Dead_Tree // Logged as Dead Branch item diff --git a/db/re/item_db.txt b/db/re/item_db.txt index ae260ab1d0..ac5d7814e6 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -6752,7 +6752,7 @@ 12619,Cgrade_Pocket,C Grade Coin Bag,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getgroupitem(IG_Cgrade_Pocket); },{},{} 12620,Dgrade_Pocket,D Grade Coin Bag,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getgroupitem(IG_Dgrade_Pocket); },{},{} 12621,Egrade_Pocket,E Grade Coin Bag,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getgroupitem(IG_Egrade_Pocket); },{},{} -12622,Boarding_Halter,Reins Of Mount,11,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ setmounting(); },{},{ if (ismounting()) setmounting(); } +12622,Boarding_Halter,Reins Of Mount,2,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ setmounting(); },{},{ if (ismounting()) setmounting(); } 12623,High_Weapon_Box,Advanced Weapons Box,2,20,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ getrandgroupitem(IG_Advanced_Weapons_Box,1); },{},{} 12624,Delicious_Jelly,Delicious Jelly,0,20,,50,,,,,0xFFFFFFFF,63,2,,,,,,{ percentheal 3,3; },{},{} 12625,Sapa_Feat_Cert_Pack,Sapa Feat Cert Pack,2,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} @@ -7007,7 +7007,7 @@ 12884,Infinite_Concentration_Potion,Infinite Concentration Potion,11,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION0,1800000,4; },{},{} 12885,Infinite_Awakening_Potion,Infinite Awakening Potion,11,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION1,1800000,6; },{},{} 12886,Infinite_Berserk_Potion,Infinite Berserk Potion,11,10,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ sc_start SC_ASPDPOTION2,1800000,9; },{},{} -12887,C_Wing_Of_Fly,Infinite Flywing,11,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ unitskilluseid getcharid(3),"AL_TELEPORT",1; },{},{} +12887,C_Wing_Of_Fly,Infinite Flywing,2,0,,0,,,,,0xFFFFFFFF,63,2,,,,,,{ itemskill "AL_TELEPORT",1; },{},{} 12888,Siege_Kit_Box,Siege Kit Box,18,0,,100,,,,,0xFFFFFFFF,63,2,,,,,,{},{},{} 12889,Weapon_Box_Spear,Weapon Box(Spear),2,10,,200,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{} 12890,Weapon_Box_Mace,Weapon Box(Mace),2,10,,200,,,,0,0xFFFFFFFF,63,2,,,,,,{},{},{} @@ -10873,7 +10873,7 @@ //=================================================================== // New Usable items //=================================================================== -22508,Para_Team_Mark_,Eden Group Mark,11,0,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ warp "moc_para01",171,115; },{},{} +22508,Para_Team_Mark_,Eden Group Mark,2,0,,0,,,,0,0xFFFFFFFF,63,2,,,,,,{ warp "moc_para01",171,115; },{},{} 22507,ShabbyOldScroll,Old Scroll,2,10,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ callfunc "F_22507"; },{},{} 22510,King_Wolf_Scroll,King Wolf Scroll,2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ /*TODO, confirm the rates*/ getitem callfunc("F_Rand",6635,19598,5658,6238,6239),1; },{},{} 22511,Fenrirs_Power_Scroll,Fenrir's Power Scroll,2,10,,10,,,,0,0xFFFFFFFF,63,2,,,,,,{ bonus_script "bonus bMatk,25; bonus bFixedCastRate,-50;",300,1025; },{},{} diff --git a/db/re/item_flag.txt b/db/re/item_flag.txt index 37d081b862..b68c97c2c0 100644 --- a/db/re/item_flag.txt +++ b/db/re/item_flag.txt @@ -7,6 +7,7 @@ // 4 - GUID Item: When this item is obtained, will generates GUID that cannot be stacked even same or stackable item // 8 - Item will be bound item when equipped // 16 - Special Broadcast: When item dropped by monster and player loot it, will be broadcasted! +// 32 - Item will not be removed on consumption. Also supports 'itemskill' // NOTE: For removing flag by import file, use "-" to remove the flag. Example, 604,-1 will removes flag 1 from Branch_Of_Dead_Tree // Logged as Dead Branch item @@ -1772,3 +1773,8 @@ // Special Broadcast 7782,16 //Gold_Key77 7783,16 //Silver_Key77 + +// Not removed after consumption +12622,32 //Boarding_Halter +12887,32 //C_Wing_Of_Fly +22508,32 //Para_Team_Mark_ diff --git a/src/map/itemdb.c b/src/map/itemdb.c index d32dc933c5..27ecedec70 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -907,6 +907,7 @@ static bool itemdb_read_flag(char* fields[], int columns, int current) { if (flag&4 && itemdb_isstackable2(id)) id->flag.guid = set ? 1 : 0; if (flag&8) id->flag.bindOnEquip = true; if (flag&16) id->flag.broadcast = 1; + if (flag&32) id->flag.delay_consume = 2; return true; } diff --git a/src/map/itemdb.h b/src/map/itemdb.h index 6cbd10b758..4e43123063 100644 --- a/src/map/itemdb.h +++ b/src/map/itemdb.h @@ -829,7 +829,7 @@ struct item_data unsigned available : 1; uint32 no_equip; unsigned no_refine : 1; // [celest] - unsigned delay_consume : 1; // Signifies items that are not consumed immediately upon double-click [Skotlex] + unsigned delay_consume : 2; // 1 - Signifies items that are not consumed immediately upon double-click; 2 - Signifies items that are not removed on consumption [Skotlex] unsigned trade_restriction : 9; //Item restrictions mask [Skotlex] unsigned autoequip: 1; unsigned buyingstore : 1; diff --git a/src/map/skill.c b/src/map/skill.c index 70d0d52317..e8139dcff0 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -14865,7 +14865,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } //Consume sd->itemid = sd->itemindex = -1; - if( skill_id == WZ_EARTHSPIKE && sc && sc->data[SC_EARTHSCROLL] && rnd()%100 > sc->data[SC_EARTHSCROLL]->val2 ) // [marquis007] + if( (skill_id == WZ_EARTHSPIKE && sc && sc->data[SC_EARTHSCROLL] && rnd()%100 > sc->data[SC_EARTHSCROLL]->val2) || sd->inventory_data[i]->flag.delay_consume == 2 ) // [marquis007] ; //Do not consume item. else if( sd->inventory.u.items_inventory[i].expire_time == 0 ) pc_delitem(sd,i,1,0,0,LOG_TYPE_CONSUME); // Rental usable items are not consumed until expiration