Implemented refine result broadcast packet (#7301)

This commit is contained in:
Jittapan Pluemsumran 2022-10-04 15:27:25 +07:00 committed by GitHub
parent 6fc3a07247
commit 19fe27932f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 193 additions and 10 deletions

View File

@ -116,7 +116,7 @@ default_bind_on_equip: 4
allow_bound_sell: 0x0
// Hide n last characters of player's name with asterisk (*) when the player
// obtained an item with special broadcast flag.
// obtained an item with special broadcast flag or refined an item at a level with broadcast flag.
// Note: Players with short names can be fully converted to asterisks if this
// config value is set high.
broadcast_hide_name: 2

View File

@ -30,6 +30,8 @@
# Bonus Refinement bonus. (Default: 0)
# RandomBonus Extra refinement bonus of 0~RandomBonus stacked on Bonus. (Default: 0)
# BlacksmithBlessingAmount Amount of Blacksmith Blessing required. (Default: 0)
# BroadcastSuccess Broadcast to the whole server when a refine attempt at this level succeeds. (Default: false)
# BroadcastFailure Broadcast to the whole server when a refine attempt at this level fails. (Default: false)
# Chances: Success chance based on cost type. (Default: null)
# - Type Refinement cost type based on ore used.
# Rate Chance of success out of 0~10000. (Default: 0)
@ -41,7 +43,7 @@
Header:
Type: REFINE_DB
Version: 1
Version: 2
###########################################################################
# Event Refine Rates

View File

@ -30,6 +30,8 @@
# Bonus Refinement bonus. (Default: 0)
# RandomBonus Extra refinement bonus of 0~RandomBonus stacked on Bonus. (Default: 0)
# BlacksmithBlessingAmount Amount of Blacksmith Blessing required. (Default: 0)
# BroadcastSuccess Broadcast to the whole server when a refine attempt at this level succeeds. (Default: false)
# BroadcastFailure Broadcast to the whole server when a refine attempt at this level fails. (Default: false)
# Chances: Success chance based on cost type. (Default: null)
# - Type Refinement cost type based on ore used.
# Rate Chance of success out of 0~10000. (Default: 0)
@ -41,7 +43,7 @@
Header:
Type: REFINE_DB
Version: 1
Version: 2
Body:
- Group: Armor

View File

@ -30,6 +30,8 @@
# Bonus Refinement bonus. (Default: 0)
# RandomBonus Extra refinement bonus of 0~RandomBonus stacked on Bonus. (Default: 0)
# BlacksmithBlessingAmount Amount of Blacksmith Blessing required. (Default: 0)
# BroadcastSuccess Broadcast to the whole server when a refine attempt at this level succeeds. (Default: false)
# BroadcastFailure Broadcast to the whole server when a refine attempt at this level fails. (Default: false)
# Chances: Success chance based on cost type. (Default: null)
# - Type Refinement cost type based on ore used.
# Rate Chance of success out of 0~10000. (Default: 0)
@ -41,7 +43,7 @@
Header:
Type: REFINE_DB
Version: 1
Version: 2
Body:
- Group: Armor
@ -252,6 +254,8 @@ Body:
- Level: 13
Bonus: 2800
BlacksmithBlessingAmount: 16
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 800
@ -267,6 +271,8 @@ Body:
- Level: 14
Bonus: 3200
BlacksmithBlessingAmount: 22
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 800
@ -281,6 +287,8 @@ Body:
DowngradeAmount: 1
- Level: 15
Bonus: 3600
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -295,6 +303,8 @@ Body:
DowngradeAmount: 1
- Level: 16
Bonus: 4000
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -309,6 +319,8 @@ Body:
DowngradeAmount: 1
- Level: 17
Bonus: 4500
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -323,6 +335,8 @@ Body:
DowngradeAmount: 1
- Level: 18
Bonus: 5000
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -337,6 +351,8 @@ Body:
DowngradeAmount: 1
- Level: 19
Bonus: 5500
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 500
@ -351,6 +367,8 @@ Body:
DowngradeAmount: 1
- Level: 20
Bonus: 6000
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 500
@ -517,6 +535,8 @@ Body:
BreakingRate: 10000
- Level: 13
Bonus: 3360
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 800
@ -530,6 +550,8 @@ Body:
BreakingRate: 10000
- Level: 14
Bonus: 3840
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 800
@ -543,6 +565,8 @@ Body:
BreakingRate: 10000
- Level: 15
Bonus: 4320
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -556,6 +580,8 @@ Body:
BreakingRate: 10000
- Level: 16
Bonus: 4800
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -569,6 +595,8 @@ Body:
BreakingRate: 10000
- Level: 17
Bonus: 5400
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -582,6 +610,8 @@ Body:
BreakingRate: 10000
- Level: 18
Bonus: 6000
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -595,6 +625,8 @@ Body:
BreakingRate: 10000
- Level: 19
Bonus: 6600
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 500
@ -608,6 +640,8 @@ Body:
BreakingRate: 10000
- Level: 20
Bonus: 7200
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 500
@ -824,6 +858,8 @@ Body:
Bonus: 2600
RandomBonus: 1800
BlacksmithBlessingAmount: 16
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1800
@ -840,6 +876,8 @@ Body:
Bonus: 2800
RandomBonus: 2100
BlacksmithBlessingAmount: 22
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1800
@ -855,6 +893,8 @@ Body:
- Level: 15
Bonus: 3000
RandomBonus: 2400
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1800
@ -870,6 +910,8 @@ Body:
- Level: 16
Bonus: 4800
RandomBonus: 2700
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1700
@ -885,6 +927,8 @@ Body:
- Level: 17
Bonus: 5100
RandomBonus: 3000
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1700
@ -900,6 +944,8 @@ Body:
- Level: 18
Bonus: 5400
RandomBonus: 3300
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1700
@ -915,6 +961,8 @@ Body:
- Level: 19
Bonus: 5700
RandomBonus: 3600
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1500
@ -930,6 +978,8 @@ Body:
- Level: 20
Bonus: 6000
RandomBonus: 3900
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1500
@ -1149,6 +1199,8 @@ Body:
Bonus: 3900
RandomBonus: 3500
BlacksmithBlessingAmount: 16
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1800
@ -1165,6 +1217,8 @@ Body:
Bonus: 4200
RandomBonus: 4000
BlacksmithBlessingAmount: 22
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1800
@ -1180,6 +1234,8 @@ Body:
- Level: 15
Bonus: 4500
RandomBonus: 4500
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1800
@ -1195,6 +1251,8 @@ Body:
- Level: 16
Bonus: 8000
RandomBonus: 5000
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1700
@ -1210,6 +1268,8 @@ Body:
- Level: 17
Bonus: 8500
RandomBonus: 5500
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1700
@ -1225,6 +1285,8 @@ Body:
- Level: 18
Bonus: 9000
RandomBonus: 6000
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1700
@ -1240,6 +1302,8 @@ Body:
- Level: 19
Bonus: 9500
RandomBonus: 6500
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1500
@ -1255,6 +1319,8 @@ Body:
- Level: 20
Bonus: 10000
RandomBonus: 7000
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1500
@ -1478,6 +1544,8 @@ Body:
Bonus: 6500
RandomBonus: 6400
BlacksmithBlessingAmount: 16
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1800
@ -1494,6 +1562,8 @@ Body:
Bonus: 7000
RandomBonus: 7200
BlacksmithBlessingAmount: 22
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1800
@ -1509,6 +1579,8 @@ Body:
- Level: 15
Bonus: 7500
RandomBonus: 8000
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1800
@ -1524,6 +1596,8 @@ Body:
- Level: 16
Bonus: 11200
RandomBonus: 8800
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1700
@ -1539,6 +1613,8 @@ Body:
- Level: 17
Bonus: 11900
RandomBonus: 9600
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1700
@ -1554,6 +1630,8 @@ Body:
- Level: 18
Bonus: 12600
RandomBonus: 10400
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1700
@ -1569,6 +1647,8 @@ Body:
- Level: 19
Bonus: 13300
RandomBonus: 11200
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1500
@ -1584,6 +1664,8 @@ Body:
- Level: 20
Bonus: 14000
RandomBonus: 12000
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 1500
@ -1811,6 +1893,8 @@ Body:
Bonus: 9100
RandomBonus: 12600
BlacksmithBlessingAmount: 16
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 800
@ -1827,6 +1911,8 @@ Body:
Bonus: 9800
RandomBonus: 14000
BlacksmithBlessingAmount: 22
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 800
@ -1842,6 +1928,8 @@ Body:
- Level: 15
Bonus: 10500
RandomBonus: 15400
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -1857,6 +1945,8 @@ Body:
- Level: 16
Bonus: 16000
RandomBonus: 16800
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -1872,6 +1962,8 @@ Body:
- Level: 17
Bonus: 17000
RandomBonus: 18200
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -1887,6 +1979,8 @@ Body:
- Level: 18
Bonus: 18000
RandomBonus: 19600
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -1902,6 +1996,8 @@ Body:
- Level: 19
Bonus: 19000
RandomBonus: 21000
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 500
@ -1917,6 +2013,8 @@ Body:
- Level: 20
Bonus: 20000
RandomBonus: 22400
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 500
@ -2083,6 +2181,8 @@ Body:
BreakingRate: 10000
- Level: 13
Bonus: 10400
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 800
@ -2096,6 +2196,8 @@ Body:
BreakingRate: 10000
- Level: 14
Bonus: 11200
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 800
@ -2109,6 +2211,8 @@ Body:
BreakingRate: 10000
- Level: 15
Bonus: 12000
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -2122,6 +2226,8 @@ Body:
BreakingRate: 10000
- Level: 16
Bonus: 12800
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -2135,6 +2241,8 @@ Body:
BreakingRate: 10000
- Level: 17
Bonus: 13600
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -2148,6 +2256,8 @@ Body:
BreakingRate: 10000
- Level: 18
Bonus: 14400
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 700
@ -2161,6 +2271,8 @@ Body:
BreakingRate: 10000
- Level: 19
Bonus: 15200
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 500
@ -2174,6 +2286,8 @@ Body:
BreakingRate: 10000
- Level: 20
Bonus: 16000
BroadcastSuccess: true
BroadcastFailure: true
Chances:
- Type: Normal
Rate: 500

View File

@ -30,6 +30,8 @@
# Bonus Refinement bonus. (Default: 0)
# RandomBonus Extra refinement bonus of 0~RandomBonus stacked on Bonus. (Default: 0)
# BlacksmithBlessingAmount Amount of Blacksmith Blessing required. (Default: 0)
# BroadcastSuccess Broadcast to the whole server when a refine attempt at this level succeeds. (Default: false)
# BroadcastFailure Broadcast to the whole server when a refine attempt at this level fails. (Default: false)
# Chances: Success chance based on cost type. (Default: null)
# - Type Refinement cost type based on ore used.
# Rate Chance of success out of 0~10000. (Default: 0)
@ -41,7 +43,7 @@
Header:
Type: REFINE_DB
Version: 1
Version: 2
Footer:
Imports:

View File

@ -20878,6 +20878,14 @@ void clif_parse_merge_item_cancel(int fd, struct map_session_data* sd) {
return; // Nothing todo yet
}
static std::string clif_hide_name(const char* original_name)
{
std::string censored(original_name);
int hide = min(battle_config.broadcast_hide_name, censored.length() - 1);
censored.replace(censored.length() - hide, hide, hide, '*');
return censored;
}
/**
* 07fd <size>.W <type>.B <itemid>.W <charname_len>.B <charname>.24B <source_len>.B <containerid>.W (ZC_BROADCASTING_SPECIAL_ITEM_OBTAIN)
* 07fd <size>.W <type>.B <itemid>.W <charname_len>.B <charname>.24B <source_len>.B <srcname>.24B (ZC_BROADCASTING_SPECIAL_ITEM_OBTAIN)
@ -20888,10 +20896,8 @@ void clif_broadcast_obtain_special_item( const char *char_name, t_itemid nameid,
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( name, dispname.c_str(), sizeof( name ) );
std::string dispname = clif_hide_name(char_name);
safestrncpy(name, dispname.c_str(), sizeof(name));
}else{
safestrncpy( name, char_name, sizeof( name ) );
}
@ -22308,6 +22314,9 @@ void clif_parse_refineui_refine( int fd, struct map_session_data* sd ){
log_pick_pc( sd, LOG_TYPE_OTHER, 1, item );
clif_misceffect( &sd->bl, 3 );
clif_refine( fd, 0, index, item->refine );
if (info->broadcast_success) {
clif_broadcast_refine_result(*sd, item->nameid, item->refine, true);
}
if( id->type == IT_WEAPON ){
achievement_update_objective( sd, AG_ENCHANT_SUCCESS, 2, id->weapon_level, item->refine );
}
@ -22315,6 +22324,9 @@ void clif_parse_refineui_refine( int fd, struct map_session_data* sd ){
}else{
// Failure
if (info->broadcast_failure) {
clif_broadcast_refine_result(*sd, item->nameid, item->refine, false);
}
// Blacksmith blessings were used to prevent breaking and downgrading
if( blacksmith_amount > 0 ){
clif_refine( fd, 3, index, item->refine );
@ -24593,6 +24605,27 @@ void clif_parse_itempackage_select( int fd, struct map_session_data* sd ){
#endif
}
void clif_broadcast_refine_result(map_session_data& sd, t_itemid itemId, int8 level, bool success)
{
#if PACKETVER_MAIN_NUM >= 20170906 || PACKETVER_RE_NUM >= 20170830 || defined(PACKETVER_ZERO)
PACKET_ZC_BROADCAST_ITEMREFINING_RESULT p{};
p.packetType = HEADER_ZC_BROADCAST_ITEMREFINING_RESULT;
p.itemId = itemId;
p.refine_level = level;
p.status = (int8)success;
if (battle_config.broadcast_hide_name) {
std::string dispname = clif_hide_name(sd.status.name);
safestrncpy(p.name, dispname.c_str(), sizeof(p.name));
}
else {
safestrncpy(p.name, sd.status.name, sizeof(p.name));
}
clif_send(&p, sizeof(p), &sd.bl, ALL_CLIENT);
#endif
}
/*==========================================
* Main client packet processing function
*------------------------------------------*/

View File

@ -1215,4 +1215,6 @@ void clif_enchantwindow_open( struct map_session_data& sd, uint64 clientLuaIndex
// Enchanting Shadow / Shadow Scar Spirit
void clif_enchantingshadow_spirit(unit_data &ud);
void clif_broadcast_refine_result(struct map_session_data& sd, t_itemid itemId, int8 level, bool success);
#endif /* CLIF_HPP */

View File

@ -230,6 +230,32 @@ uint64 RefineDatabase::parseBodyNode( const ryml::NodeRef& node ){
}
}
if (this->nodeExists(refineLevelNode, "BroadcastSuccess")) {
bool bcast;
if (!this->asBool(refineLevelNode, "BroadcastSuccess", bcast)) {
return 0;
}
level_info->broadcast_success = bcast;
}
else {
if (!level_exists) {
level_info->broadcast_success = false;
}
}
if (this->nodeExists(refineLevelNode, "BroadcastFailure")) {
bool bcast;
if (!this->asBool(refineLevelNode, "BroadcastFailure", bcast)) {
return 0;
}
level_info->broadcast_failure = bcast;
}
else {
if (!level_exists) {
level_info->broadcast_failure = false;
}
}
if( this->nodeExists( refineLevelNode, "Chances" ) ){
const auto& chancesNode = refineLevelNode["Chances"];
for( const auto& chanceNode : chancesNode ){

View File

@ -73,6 +73,8 @@ struct s_refine_level_info{
uint32 bonus;
uint32 randombonus_max;
uint16 blessing_amount;
bool broadcast_success;
bool broadcast_failure;
std::unordered_map<uint16, std::shared_ptr<s_refine_cost>> costs;
};
@ -92,7 +94,7 @@ private:
std::shared_ptr<s_refine_level_info> findLevelInfoSub( const struct item_data& data, struct item& item, uint16 refine );
public:
RefineDatabase() : TypesafeYamlDatabase( "REFINE_DB", 1 ){
RefineDatabase() : TypesafeYamlDatabase( "REFINE_DB", 2, 1 ){
}