diff --git a/conf/battle/items.conf b/conf/battle/items.conf index 9205f68deb..8bfc676b9a 100644 --- a/conf/battle/items.conf +++ b/conf/battle/items.conf @@ -76,8 +76,16 @@ gtb_sc_immunity: 50 // always work independently of each other regardless of setting. autospell_stacking: no -// Will disabled consumables (disabled by item_noequip.txt) be consumed when trying to use them? (Note 1) -item_restricted_consumption_type: yes +// Allow to consume usable item that is disabled by item_noequip.txt. (Note 1) +// no = will be failed to consume +// yes = consumed with no effect +allow_consume_restricted_item: yes + +// Allow to equip item that is disabled by item_noequip.txt. (Note 1) +// no = can't be equipped and will be unequipped +// yes = can be equipped but gives no effect +// If the equip compounded with restricted card, it ignores this check but still gives no effect +allow_equip_restricted_item: yes // Allow changing of equipment while interacting with NPCs? (Note 1) // Default: yes diff --git a/src/char/Makefile.in b/src/char/Makefile.in index 5d8feed1f4..97a406aa22 100644 --- a/src/char/Makefile.in +++ b/src/char/Makefile.in @@ -52,7 +52,7 @@ help: char-server: obj_sql $(CHAR_SQL_OBJ) ../common/obj_sql/common_sql.a ../common/obj_all/common.a @echo " LD @OCHR@@EXEEXT@" - @@CC@ @LDFLAGS@ -o ../../@OCHR@@EXEEXT@ $(CHAR_OBJ) ../common/obj_sql/common_sql.a ../common/obj_all/common.a $(MT19937AR_OBJ) $(LIBCONFIG_OBJ) @LIBS@ @MYSQL_LIBS@ + @@CC@ @LDFLAGS@ -o ../../@OCHR@@EXEEXT@ $(CHAR_SQL_OBJ) ../common/obj_sql/common_sql.a ../common/obj_all/common.a $(MT19937AR_OBJ) $(LIBCONFIG_OBJ) @LIBS@ @MYSQL_LIBS@ needs_mysql: @echo "MySQL not found or disabled by the configure script" diff --git a/src/map/battle.c b/src/map/battle.c index 632aa0f318..6c4fd8a076 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -6882,7 +6882,8 @@ static const struct _battle_data { { "homunculus_S_max_level", &battle_config.hom_S_max_level, 150, 0, MAX_LEVEL, }, { "mob_size_influence", &battle_config.mob_size_influence, 0, 0, 1, }, { "skill_trap_type", &battle_config.skill_trap_type, 0, 0, 1, }, - { "item_restricted_consumption_type", &battle_config.item_restricted_consumption_type,1, 0, 1, }, + { "allow_consume_restricted_item", &battle_config.allow_consume_restricted_item, 1, 0, 1, }, + { "allow_equip_restricted_item", &battle_config.allow_equip_restricted_item, 1, 0, 1, }, { "max_walk_path", &battle_config.max_walk_path, 17, 1, MAX_WALKPATH, }, { "item_enabled_npc", &battle_config.item_enabled_npc, 1, 0, 1, }, { "item_flooritem_check", &battle_config.item_onfloor, 1, 0, 1, }, diff --git a/src/map/battle.h b/src/map/battle.h index da26fea143..867e136d45 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -488,7 +488,8 @@ extern struct Battle_Config int mob_size_influence; // Enable modifications on earned experience, drop rates and monster status depending on monster size. [mkbu95] int skill_trap_type; - int item_restricted_consumption_type; + int allow_consume_restricted_item; + int allow_equip_restricted_item; int max_walk_path; int item_enabled_npc; int item_onfloor; // Whether to drop an undroppable item on the map or destroy it if inventory is full. diff --git a/src/map/itemdb.c b/src/map/itemdb.c index a343981eae..28e7faef79 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -1324,6 +1324,25 @@ int itemdb_uid_load(){ return 0; } +/*========================================== + * Check if the item is restricted by item_noequip.txt (return): + * true - can't be used + * false - can be used + *------------------------------------------*/ +bool itemdb_isNoEquip(struct item_data *id, uint16 m) { + if (!id->flag.no_equip) + return false; + /* on restricted maps the item is consumed but the effect is not used */ + if ((!map_flag_vs(m) && id->flag.no_equip&1) || // Normal + (map[m].flag.pvp && id->flag.no_equip&2) || // PVP + (map_flag_gvg(m) && id->flag.no_equip&4) || // GVG + (map[m].flag.battleground && id->flag.no_equip&8) || // Battleground + (map[m].flag.restricted && id->flag.no_equip&(8*map[m].zone)) // Zone restriction + ) + return true; + return false; +} + /*==================================== * read all item-related databases *------------------------------------*/ diff --git a/src/map/itemdb.h b/src/map/itemdb.h index 1f51881db9..d4a3690d0b 100644 --- a/src/map/itemdb.h +++ b/src/map/itemdb.h @@ -239,6 +239,7 @@ int itemdb_isidentified(int); int itemdb_isstackable(int); int itemdb_isstackable2(struct item_data *); uint64 itemdb_unique_id(int8 flag, int64 value); // Unique Item ID +bool itemdb_isNoEquip(struct item_data *id, uint16 m); void itemdb_reload(void); diff --git a/src/map/pc.c b/src/map/pc.c index ec770bc693..c172929e6f 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -947,14 +947,9 @@ int pc_isequip(struct map_session_data *sd,int n) } } } - - /* restricted equip */ - if ((!map_flag_vs(sd->bl.m) && item->flag.no_equip&1) || // Normal - (map[sd->bl.m].flag.pvp && item->flag.no_equip&2) || // PVP - (map_flag_gvg(sd->bl.m) && item->flag.no_equip&4) || // GVG - (map[sd->bl.m].flag.battleground && item->flag.no_equip&8) || // Battleground - (map[sd->bl.m].flag.restricted && item->flag.no_equip&(8*map[sd->bl.m].zone)) // Zone restriction - ) + + //fail to equip if item is restricted + if (itemdb_isNoEquip(item, sd->bl.m) && !battle_config.allow_equip_restricted_item) return 0; //Not equipable by class. [Skotlex] @@ -4463,14 +4458,8 @@ int pc_useitem(struct map_session_data *sd,int n) } /* on restricted maps the item is consumed but the effect is not used */ - if (!pc_has_permission(sd,PC_PERM_ITEM_UNCONDITIONAL) && ( - (!map_flag_vs(sd->bl.m) && id->flag.no_equip&1) || // Normal - (map[sd->bl.m].flag.pvp && id->flag.no_equip&2) || // PVP - (map_flag_gvg(sd->bl.m) && id->flag.no_equip&4) || // GVG - (map[sd->bl.m].flag.battleground && id->flag.no_equip&8) || // Battleground - (map[sd->bl.m].flag.restricted && id->flag.no_equip&(8*map[sd->bl.m].zone)) // Zone restriction - )) { - if( battle_config.item_restricted_consumption_type ) { + if (!pc_has_permission(sd,PC_PERM_ITEM_UNCONDITIONAL) && itemdb_isNoEquip(id,sd->bl.m)) { + if( battle_config.allow_consume_restricted_item ) { clif_useitemack(sd,n,item.amount-1,true); pc_delitem(sd,n,1,1,0,LOG_TYPE_CONSUME); } @@ -8648,6 +8637,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) if(battle_config.battle_log) ShowInfo("equip %d(%d) %x:%x\n",sd->status.inventory[n].nameid,n,id?id->equip:0,req_pos); + if(!pc_isequip(sd,n) || !(pos&req_pos) || sd->status.inventory[n].equip != 0 || sd->status.inventory[n].attribute==1 ) { // [Valaris] // FIXME: pc_isequip: equip level failure uses 2 instead of 0 clif_equipitemack(sd,n,0,0); // fail @@ -8806,7 +8796,8 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) //OnEquip script [Skotlex] if (id) { - if (id->equip_script) + //only run the script if item isn't restricted + if (id->equip_script && (!id->flag.no_equip || (id->flag.no_equip && itemdb_isNoEquip(id, sd->bl.m) && pc_has_permission(sd, PC_PERM_USE_ALL_EQUIPMENT)))) run_script(id->equip_script,0,sd->bl.id,fake_nd->bl.id); if(itemdb_isspecial(sd->status.inventory[n].card[0])) ; //No cards @@ -8816,7 +8807,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) if (!sd->status.inventory[n].card[i]) continue; if ( ( data = itemdb_exists(sd->status.inventory[n].card[i]) ) != NULL ) { - if( data->equip_script ) + if( data->equip_script && (!data->flag.no_equip || (data->flag.no_equip && itemdb_isNoEquip(data, sd->bl.m) && pc_has_permission(sd, PC_PERM_USE_ALL_EQUIPMENT)))) run_script(data->equip_script,0,sd->bl.id,fake_nd->bl.id); } } diff --git a/src/map/status.c b/src/map/status.c index 9d38735283..db75d0a30e 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -2461,18 +2461,8 @@ int status_calc_pc_(struct map_session_data* sd, bool first) if(!sd->inventory_data[index]) continue; - if(sd->inventory_data[index]->flag.no_equip) { // Items may be equipped, their effects however are nullified. - if(map[sd->bl.m].flag.restricted && sd->inventory_data[index]->flag.no_equip&(8*map[sd->bl.m].zone)) - continue; - if(!map_flag_vs(sd->bl.m) && sd->inventory_data[index]->flag.no_equip&1) - continue; - if(map[sd->bl.m].flag.pvp && sd->inventory_data[index]->flag.no_equip&2) - continue; - if(map_flag_gvg(sd->bl.m) && sd->inventory_data[index]->flag.no_equip&4) - continue; - if(map[sd->bl.m].flag.battleground && sd->inventory_data[index]->flag.no_equip&8) - continue; - } + if(!pc_has_permission(sd, PC_PERM_USE_ALL_EQUIPMENT) && sd->inventory_data[index]->flag.no_equip && itemdb_isNoEquip(sd->inventory_data[index], sd->bl.m)) // Items may be equipped, their effects however are nullified. + continue; status->def += sd->inventory_data[index]->def; @@ -2615,18 +2605,8 @@ int status_calc_pc_(struct map_session_data* sd, bool first) } if(!data->script) continue; - if(data->flag.no_equip) { //Card restriction checks. - if(map[sd->bl.m].flag.restricted && data->flag.no_equip&(8*map[sd->bl.m].zone)) - continue; - if(!map_flag_vs(sd->bl.m) && data->flag.no_equip&1) - continue; - if(map[sd->bl.m].flag.pvp && data->flag.no_equip&2) - continue; - if(map_flag_gvg(sd->bl.m) && data->flag.no_equip&4) - continue; - if(map[sd->bl.m].flag.battleground && data->flag.no_equip&8) - continue; - } + if(!pc_has_permission(sd, PC_PERM_USE_ALL_EQUIPMENT) && data->flag.no_equip && itemdb_isNoEquip(data, sd->bl.m)) //Card restriction checks. + continue; if(i == EQI_HAND_L && sd->status.inventory[index].equip == EQP_HAND_L) { //Left hand status. sd->state.lr_flag = 1;