From 32950ecead2a3ad0204dba3e0487d890efc8cbf0 Mon Sep 17 00:00:00 2001 From: Cydh Ramdh Date: Tue, 2 Jan 2018 12:55:52 +0700 Subject: [PATCH] Updated Item Group features (#2692) * Added config to hide last chars of player's name `broadcast_hide_name` and its default value is 2. * Fixed `getgroupitem` that should give unidentified item for equipment types. * Added optional param for `getgroupitem` and `getrandgroupitem` to always give player identified item, ignores the `itemdb_isidentified`'s check. * Thanks to @aleos89 @Lemongrass3110 --- conf/battle/items.conf | 6 ++++++ doc/script_commands.txt | 12 ++++++++++-- src/map/battle.cpp | 1 + src/map/battle.hpp | 1 + src/map/clif.cpp | 12 ++++++++++-- src/map/itemdb.cpp | 10 +++++----- src/map/itemdb.hpp | 2 +- src/map/script.cpp | 19 ++++++++++--------- 8 files changed, 44 insertions(+), 19 deletions(-) diff --git a/conf/battle/items.conf b/conf/battle/items.conf index aa74136ce2..f2118d24eb 100644 --- a/conf/battle/items.conf +++ b/conf/battle/items.conf @@ -121,3 +121,9 @@ allow_bound_sell: 0x0 // no = normal refine chances in effect (official/default value) // yes = event refine chances in effect event_refine_chance: no + +// Hide n last characters of player's name with asterisk (*) when the player +// obtained an item with special broadcast flag. +// Note: Players with short names can be fully converted to asterisks if this +// config value is set high. +broadcast_hide_name: 2 diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 42e8a68c94..5b1f4feb53 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -4864,7 +4864,7 @@ More info, see doc/item_group.txt. --------------------------------------- -*getrandgroupitem {,{,}}; +*getrandgroupitem {,{,{,{,}}}}; Similar to the above example, this command allows players to obtain the specified quantity of a random item from the group "". The different groups and @@ -4875,16 +4875,24 @@ If 'quantity' is not defined or 0, it will uses defined amount from Item Group l If 'sub_group' is not defined the value will be 1 (since random group is 1 ~ 5, and 0 is 'must' item group). +For item with type IT_WEAPON, IT_ARMOR, IT_PETARMOR, and IT_SHADOWGEAR will be given +as unidentified item (as defined by itemdb_isidentified in src/map/itemdb.cpp) except +if 'identify' is defined with value 1. + More info, see doc/item_group.txt. --------------------------------------- -*getgroupitem {,}; +*getgroupitem {,{,}}; Gives item(s) to the attached player based on item group contents. This is not working like 'getrandgroupitem' which only give 1 item for specified item group & sub_group. +For item with type IT_WEAPON, IT_ARMOR, IT_PETARMOR, and IT_SHADOWGEAR will be given +as unidentified item (as defined by itemdb_isidentified in src/map/itemdb.cpp) except +if 'identify' is defined with value 1. + More info, see doc/item_group.txt. --------------------------------------- diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 8841e61109..a6ccf3be1f 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -8492,6 +8492,7 @@ static const struct _battle_data { { "allow_bound_sell", &battle_config.allow_bound_sell, 0, 0, 0x3, }, { "event_refine_chance", &battle_config.event_refine_chance, 0, 0, 1, }, { "autoloot_adjust", &battle_config.autoloot_adjust, 0, 0, 1, }, + { "broadcast_hide_name", &battle_config.broadcast_hide_name, 2, 0, NAME_LENGTH, }, #include "../custom/battle_config_init.inc" }; diff --git a/src/map/battle.hpp b/src/map/battle.hpp index cc7120d9a1..e107390ad6 100644 --- a/src/map/battle.hpp +++ b/src/map/battle.hpp @@ -637,6 +637,7 @@ struct Battle_Config int allow_bound_sell; int event_refine_chance; int autoloot_adjust; + int broadcast_hide_name; #include "../custom/battle_config_struct.inc" }; diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 032173d560..a95efaeb95 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -19521,7 +19521,7 @@ void clif_parse_merge_item_cancel(int fd, struct map_session_data* sd) { /** * 07fd .W .B .W .B .24B .B .W (ZC_BROADCASTING_SPECIAL_ITEM_OBTAIN) * 07fd .W .B .W .B .24B .B .24B (ZC_BROADCASTING_SPECIAL_ITEM_OBTAIN) - * type: ITEMOBTAIN_TYPE_BOXITEM & ITEMOBTAIN_TYPE_MONSTER_ITEM "[playername] ... [surcename] ... [itemname]" -> MsgStringTable[1629] + * type: ITEMOBTAIN_TYPE_BOXITEM & ITEMOBTAIN_TYPE_MONSTER_ITEM "[playername] ... [sourcename] ... [itemname]" -> MsgStringTable[1629] * type: ITEMOBTAIN_TYPE_NPC "[playername] ... [itemname]" -> MsgStringTable[1870] **/ void clif_broadcast_obtain_special_item(const char *char_name, unsigned short nameid, unsigned short container, enum BROADCASTING_SPECIAL_ITEM_OBTAIN type, const char *srcname) { @@ -19539,7 +19539,15 @@ void clif_broadcast_obtain_special_item(const char *char_name, unsigned short na WBUFB(buf, 4) = type; WBUFW(buf, 5) = nameid; WBUFB(buf, 7) = NAME_LENGTH; - safestrncpy(WBUFCP(buf, 8), char_name, NAME_LENGTH); + + if (battle_config.broadcast_hide_name) { + std::string dispname = std::string(char_name); + int hide = min(battle_config.broadcast_hide_name, dispname.length() - 1); + dispname.replace(dispname.length() - hide, hide, hide, '*'); + safestrncpy(WBUFCP(buf, 8), dispname.c_str(), NAME_LENGTH); + } + else + safestrncpy(WBUFCP(buf, 8), char_name, NAME_LENGTH); switch (type) { case ITEMOBTAIN_TYPE_BOXITEM: diff --git a/src/map/itemdb.cpp b/src/map/itemdb.cpp index 9922778427..6513ce1e62 100644 --- a/src/map/itemdb.cpp +++ b/src/map/itemdb.cpp @@ -201,7 +201,7 @@ unsigned short itemdb_searchrandomid(uint16 group_id, uint8 sub_group) { * @param group_id: The group ID of item that obtained by player * @param *group: struct s_item_group from itemgroup_db[group_id].random[idx] or itemgroup_db[group_id].must[sub_group][idx] */ -static void itemdb_pc_get_itemgroup_sub(struct map_session_data *sd, struct s_item_group_entry *data) { +static void itemdb_pc_get_itemgroup_sub(struct map_session_data *sd, bool identify, struct s_item_group_entry *data) { uint16 i, get_amt = 0; struct item tmp; @@ -211,7 +211,7 @@ static void itemdb_pc_get_itemgroup_sub(struct map_session_data *sd, struct s_it tmp.nameid = data->nameid; tmp.bound = data->bound; - tmp.identify = 1; + tmp.identify = identify ? identify : itemdb_isidentified(data->nameid); tmp.expire_time = (data->duration) ? (unsigned int)(time(NULL) + data->duration*60) : 0; if (data->isNamed) { tmp.card[0] = itemdb_isequip(data->nameid) ? CARD0_FORGE : CARD0_CREATE; @@ -245,7 +245,7 @@ static void itemdb_pc_get_itemgroup_sub(struct map_session_data *sd, struct s_it * @param nameid: The item that trigger this item group * @return val: 0:success, 1:no sd, 2:invalid item group */ -char itemdb_pc_get_itemgroup(uint16 group_id, struct map_session_data *sd) { +char itemdb_pc_get_itemgroup(uint16 group_id, bool identify, struct map_session_data *sd) { uint16 i = 0; struct s_item_group_db *group; @@ -260,7 +260,7 @@ char itemdb_pc_get_itemgroup(uint16 group_id, struct map_session_data *sd) { if (group->must_qty) { for (i = 0; i < group->must_qty; i++) if (&group->must[i]) - itemdb_pc_get_itemgroup_sub(sd,&group->must[i]); + itemdb_pc_get_itemgroup_sub(sd, identify, &group->must[i]); } // Get the 'random' item each random group @@ -271,7 +271,7 @@ char itemdb_pc_get_itemgroup(uint16 group_id, struct map_session_data *sd) { rand = rnd()%group->random[i].data_qty; if (!(&group->random[i].data[rand]) || !group->random[i].data[rand].nameid) continue; - itemdb_pc_get_itemgroup_sub(sd,&group->random[i].data[rand]); + itemdb_pc_get_itemgroup_sub(sd, identify, &group->random[i].data[rand]); } return 0; diff --git a/src/map/itemdb.hpp b/src/map/itemdb.hpp index 297ecfbb5c..27e2f0a3e9 100644 --- a/src/map/itemdb.hpp +++ b/src/map/itemdb.hpp @@ -948,7 +948,7 @@ struct item_combo *itemdb_combo_exists(unsigned short combo_id); struct s_item_group_db *itemdb_group_exists(unsigned short group_id); bool itemdb_group_item_exists(unsigned short group_id, unsigned short nameid); -char itemdb_pc_get_itemgroup(uint16 group_id, struct map_session_data *sd); +char itemdb_pc_get_itemgroup(uint16 group_id, bool identify, struct map_session_data *sd); bool itemdb_parse_roulette_db(void); diff --git a/src/map/script.cpp b/src/map/script.cpp index bd95b31e2f..68974f8964 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -20993,16 +20993,16 @@ BUILDIN_FUNC(checkre) return SCRIPT_CMD_SUCCESS; } -/* getrandgroupitem {,{,}} */ +/* getrandgroupitem {,{,{,{,}}}} */ BUILDIN_FUNC(getrandgroupitem) { TBL_PC* sd; - int i, get_count = 0; + int i, get_count = 0, identify = 0; uint16 group, qty = 0; uint8 sub_group = 1; struct item item_tmp; struct s_item_group_entry *entry = NULL; - if (!script_rid2sd(sd)) + if (!script_charid2sd(6, sd)) return SCRIPT_CMD_SUCCESS; group = script_getnum(st,2); @@ -21014,6 +21014,7 @@ BUILDIN_FUNC(getrandgroupitem) { FETCH(3, qty); FETCH(4, sub_group); + FETCH(5, identify); entry = itemdb_get_randgroupitem(group,sub_group); if (!entry) @@ -21021,7 +21022,7 @@ BUILDIN_FUNC(getrandgroupitem) { memset(&item_tmp,0,sizeof(item_tmp)); item_tmp.nameid = entry->nameid; - item_tmp.identify = itemdb_isidentified(entry->nameid); + item_tmp.identify = identify ? 1 : itemdb_isidentified(entry->nameid); if (!qty) qty = entry->amount; @@ -21051,17 +21052,17 @@ BUILDIN_FUNC(getrandgroupitem) { return SCRIPT_CMD_SUCCESS; } -/* getgroupitem {,}; +/* getgroupitem {,{,}}; * Gives item(s) to the attached player based on item group contents */ BUILDIN_FUNC(getgroupitem) { TBL_PC *sd; int group_id = script_getnum(st,2); - if (!script_charid2sd(3,sd)) + if (!script_charid2sd(4,sd)) return SCRIPT_CMD_SUCCESS; - if (itemdb_pc_get_itemgroup(group_id,sd)) { + if (itemdb_pc_get_itemgroup(group_id, (script_hasdata(st, 3) ? script_getnum(st, 3) != 0 : false), sd)) { ShowError("buildin_getgroupitem: Invalid group id '%d' specified.\n",group_id); return SCRIPT_CMD_FAILURE; } @@ -24223,7 +24224,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF(get_revision,""), BUILDIN_DEF(get_githash,""), BUILDIN_DEF(freeloop,"?"), - BUILDIN_DEF(getrandgroupitem,"i??"), + BUILDIN_DEF(getrandgroupitem,"i????"), BUILDIN_DEF(cleanmap,"s"), BUILDIN_DEF2(cleanmap,"cleanarea","siiii"), BUILDIN_DEF(npcskill,"viii"), @@ -24270,7 +24271,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF(vip_time,"i?"), BUILDIN_DEF(bonus_script,"si????"), BUILDIN_DEF(bonus_script_clear,"??"), - BUILDIN_DEF(getgroupitem,"i?"), + BUILDIN_DEF(getgroupitem,"i??"), BUILDIN_DEF(enable_command,""), BUILDIN_DEF(disable_command,""), BUILDIN_DEF(getguildmember,"i??"),