Prechádzať zdrojové kódy

Fixing party death icon in newer clients

Fixes #2356

Thanks to @admkakaroto and @4144
Lemongrass3110 6 rokov pred
rodič
commit
95c3aed810
4 zmenil súbory, kde vykonal 26 pridanie a 1 odobranie
  1. 16 0
      src/map/clif.cpp
  2. 1 0
      src/map/clif.hpp
  3. 1 0
      src/map/clif_packetdb.hpp
  4. 8 1
      src/map/pc.cpp

+ 16 - 0
src/map/clif.cpp

@@ -7706,6 +7706,22 @@ void clif_party_hp(struct map_session_data *sd)
 	clif_send(buf,packet_len(cmd),&sd->bl,PARTY_AREA_WOS);
 }
 
+/// Notifies the party members of a character's death or revival.
+/// 0AB2 <GID>.L <dead>.B
+void clif_party_dead( struct map_session_data *sd ){
+#if PACKETVER >= 20170502
+	unsigned char buf[7];
+
+	nullpo_retv(sd);
+
+	WBUFW(buf, 0) = 0xab2;
+	WBUFL(buf, 2) = sd->status.account_id;
+	WBUFB(buf, 6) = pc_isdead(sd);
+
+	clif_send(buf, packet_len(0xab2), &sd->bl, PARTY);
+#endif
+}
+
 /// Updates the job and level of a party member
 /// 0abd <account id>.L <job>.W <level>.W
 void clif_party_job_and_level(struct map_session_data *sd){

+ 1 - 0
src/map/clif.hpp

@@ -758,6 +758,7 @@ void clif_party_xy_single(int fd, struct map_session_data *sd);
 void clif_party_hp(struct map_session_data *sd);
 void clif_hpmeter_single(int fd, int id, unsigned int hp, unsigned int maxhp);
 void clif_party_job_and_level(struct map_session_data *sd);
+void clif_party_dead( struct map_session_data *sd );
 
 // guild
 void clif_guild_created(struct map_session_data *sd,int flag);

+ 1 - 0
src/map/clif_packetdb.hpp

@@ -2354,6 +2354,7 @@
 #if PACKETVER >= 20170502
 	packet(0x0A43,85);
 	packet(0x0A44,-1);
+	packet(0x0AB2,7);
 	packet(0x0ABD,10);
 	parseable_packet(0x0ACE,4,clif_parse_dull,0);
 #endif

+ 8 - 1
src/map/pc.cpp

@@ -7812,6 +7812,8 @@ int pc_dead(struct map_session_data *sd,struct block_list *src)
 
 	pc_setdead(sd);
 
+	clif_party_dead( sd );
+
 	pc_setglobalreg(sd, add_str(PCDIECOUNTER_VAR), sd->die_counter+1);
 	pc_setparam(sd, SP_KILLERRID, src?src->id:0);
 
@@ -10651,7 +10653,12 @@ bool pc_setstand(struct map_session_data *sd, bool force){
 	clif_standing(&sd->bl); //Inform area PC is standing
 	//Reset sitting tick.
 	sd->ssregen.tick.hp = sd->ssregen.tick.sp = 0;
-	sd->state.dead_sit = sd->vd.dead_sit = 0;
+	if( pc_isdead( sd ) ){
+		sd->state.dead_sit = sd->vd.dead_sit = 0;
+		clif_party_dead( sd );
+	}else{
+		sd->state.dead_sit = sd->vd.dead_sit = 0;
+	}
 	return true;
 }