From fc7ed9d397463e4953c821ebb18fef1f9e5218ae Mon Sep 17 00:00:00 2001 From: Joam <35770095+attackjom@users.noreply.github.com> Date: Fri, 18 Feb 2022 06:26:27 +0700 Subject: [PATCH] Update Biolo & Meister summon packet (#6505) Co-authored-by: Lemongrass3110 --- src/map/clif.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ src/map/clif.hpp | 3 +++ src/map/mob.cpp | 6 ++++++ src/map/packets.hpp | 16 ++++++++++++++++ 4 files changed, 65 insertions(+) diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 93e14cbcf7..12db1024ec 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -1714,6 +1714,8 @@ int clif_spawn( struct block_list *bl, bool walking ){ clif_specialeffect(&md->bl,EF_GIANTBODY2,AREA); else if(md->special_state.size==SZ_MEDIUM) clif_specialeffect(&md->bl,EF_BABYBODY2,AREA); + if ( md->special_state.ai == AI_ABR || md->special_state.ai == AI_BIONIC ) + clif_summon_init(*md); } break; case BL_NPC: @@ -23045,6 +23047,44 @@ void clif_parse_barter_extended_buy( int fd, struct map_session_data* sd ){ #endif } +void clif_summon_init(struct mob_data& md) { +#if PACKETVER_MAIN_NUM >= 20200916 || PACKETVER_RE_NUM >= 20200724 + struct block_list* master_bl = battle_get_master(&md.bl); + + if( master_bl == nullptr ){ + return; + } + + struct PACKET_ZC_SUMMON_HP_INIT p = {}; + + p.PacketType = HEADER_ZC_SUMMON_HP_INIT; + p.summonAID = md.bl.id; + p.CurrentHP = md.status.hp; + p.MaxHP = md.status.max_hp; + + clif_send( &p, sizeof( p ), master_bl, SELF ); +#endif +} + +void clif_summon_hp_bar(struct mob_data& md) { +#if PACKETVER_MAIN_NUM >= 20200916 || PACKETVER_RE_NUM >= 20200724 + struct block_list* master_bl = battle_get_master(&md.bl); + + if( master_bl == nullptr ){ + return; + } + + struct PACKET_ZC_SUMMON_HP_UPDATE p = {}; + + p.PacketType = HEADER_ZC_SUMMON_HP_UPDATE; + p.summonAID = md.bl.id; + p.VarId = SP_HP; // HP parameter + p.Value = md.status.hp; + + clif_send( &p, sizeof( p ), master_bl, SELF ); +#endif +} + /*========================================== * Main client packet processing function *------------------------------------------*/ diff --git a/src/map/clif.hpp b/src/map/clif.hpp index 1a656e84f0..eb94f5c5f2 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -1187,4 +1187,7 @@ void clif_inventory_expansion_info( struct map_session_data* sd ); void clif_barter_open( struct map_session_data& sd, struct npc_data& nd ); void clif_barter_extended_open( struct map_session_data& sd, struct npc_data& nd ); +void clif_summon_init(struct mob_data& md); +void clif_summon_hp_bar(struct mob_data& md); + #endif /* CLIF_HPP */ diff --git a/src/map/mob.cpp b/src/map/mob.cpp index 6aa59814ed..4f5da9752a 100644 --- a/src/map/mob.cpp +++ b/src/map/mob.cpp @@ -2473,6 +2473,9 @@ void mob_damage(struct mob_data *md, struct block_list *src, int damage) #if PACKETVER >= 20120404 if (battle_config.monster_hp_bars_info && !map_getmapflag(md->bl.m, MF_HIDEMOBHPBAR)) { int i; + if (md->special_state.ai == AI_ABR || md->special_state.ai == AI_BIONIC) { + clif_summon_hp_bar(*md); + } for(i = 0; i < DAMAGELOG_SIZE; i++){ // must show hp bar to all char who already hit the mob. struct map_session_data *sd = map_charid2sd(md->dmglog[i].id); if( sd && check_distance_bl(&md->bl, &sd->bl, AREA_SIZE) ) // check if in range @@ -3396,6 +3399,9 @@ void mob_heal(struct mob_data *md,unsigned int heal) #if PACKETVER >= 20120404 if (battle_config.monster_hp_bars_info && !map_getmapflag(md->bl.m, MF_HIDEMOBHPBAR)) { int i; + if (md->special_state.ai == AI_ABR || md->special_state.ai == AI_BIONIC) { + clif_summon_hp_bar(*md); + } for(i = 0; i < DAMAGELOG_SIZE; i++)// must show hp bar to all char who already hit the mob. if( md->dmglog[i].id ) { struct map_session_data *sd = map_charid2sd(md->dmglog[i].id); diff --git a/src/map/packets.hpp b/src/map/packets.hpp index 6ad98bab68..7d0354e215 100644 --- a/src/map/packets.hpp +++ b/src/map/packets.hpp @@ -232,6 +232,20 @@ struct PACKET_CZ_REQ_STYLE_CLOSE{ int16 packetType; } __attribute__((packed)); +struct PACKET_ZC_SUMMON_HP_INIT { + int16 PacketType; + uint32 summonAID; + uint32 CurrentHP; + uint32 MaxHP; +} __attribute__((packed)); + +struct PACKET_ZC_SUMMON_HP_UPDATE { + int16 PacketType; + uint32 summonAID; + uint16 VarId; + uint32 Value; +} __attribute__((packed)); + // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute #if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 ) #pragma pack( pop ) @@ -285,6 +299,8 @@ DEFINE_PACKET_HEADER(CZ_UNCONFIRMED_TSTATUS_UP, 0x0b24) DEFINE_PACKET_HEADER(CZ_GUILD_EMBLEM_CHANGE2, 0x0b46) DEFINE_PACKET_HEADER(ZC_UNCONFIRMED_SPIRITS3, 0xb73) DEFINE_PACKET_HEADER(CZ_UNCONFIRMED_RODEX_RETURN, 0xb98) +DEFINE_PACKET_HEADER(ZC_SUMMON_HP_INIT, 0xb6b) +DEFINE_PACKET_HEADER(ZC_SUMMON_HP_UPDATE, 0xb6c) const int16 MAX_INVENTORY_ITEM_PACKET_NORMAL = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_normal ) - ( sizeof( struct NORMALITEM_INFO ) * MAX_ITEMLIST) ) ) / sizeof( struct NORMALITEM_INFO ) ); const int16 MAX_INVENTORY_ITEM_PACKET_EQUIP = ( ( INT16_MAX - ( sizeof( struct packet_itemlist_equip ) - ( sizeof( struct EQUIPITEM_INFO ) * MAX_ITEMLIST ) ) ) / sizeof( struct EQUIPITEM_INFO ) );