Explorar o código

Fixed some minor inconsistencies in homunculus packets, in an attempt to make the lvl99 aura show to owner onSpawn.
Still doesn't work as there appears to be a complex packet order dependency...

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11851 54d463be-8e91-2dee-dedb-b68131a5f0ec

ultramage %!s(int64=17) %!d(string=hai) anos
pai
achega
2b186ae7b8
Modificáronse 3 ficheiros con 7 adicións e 9 borrados
  1. 2 2
      src/map/clif.c
  2. 1 2
      src/map/mercenary.c
  3. 4 5
      src/map/status.c

+ 2 - 2
src/map/clif.c

@@ -1203,7 +1203,7 @@ int clif_hominfo(struct map_session_data *sd, struct homun_data *hd, int flag)
 	WBUFL(buf,59)=hd->homunculus.exp;
 	WBUFL(buf,63)=hd->exp_next;
 	WBUFW(buf,67)=hd->homunculus.skillpts;
-	WBUFW(buf,69)=1; // FIXME: Attackable? When exactly is a homun not attackable? [Skotlex]
+	WBUFW(buf,69)=2; // FIXME: undocumented flag, seems to be '2' all the time [ultramage]
 	clif_send(buf,packet_len(0x22e),&sd->bl,SELF);
 	return 0;
 }
@@ -7832,9 +7832,9 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
 	if(merc_is_hom_active(sd->hd)) {
 		map_addblock(&sd->hd->bl);
 		clif_spawn(&sd->hd->bl);
+		clif_send_homdata(sd,0,0);
 		clif_hominfo(sd,sd->hd,1);
 		clif_hominfo(sd,sd->hd,0); //for some reason, at least older clients want this sent twice
-		clif_send_homdata(sd,0,0);
 		clif_homskillinfoblock(sd);
 		if (battle_config.hom_setting&0x8)
 			status_calc_bl(&sd->hd->bl, SCB_SPEED); //Homunc mimic their master's speed on each map change

+ 1 - 2
src/map/mercenary.c

@@ -716,11 +716,10 @@ int merc_hom_recv_data(int account_id, struct s_homunculus *sh, int flag)
 	{
 		map_addblock(&hd->bl);
 		clif_spawn(&hd->bl);
+		clif_send_homdata(sd,SP_ACK,0);
 		clif_hominfo(sd,hd,1);
 		clif_hominfo(sd,hd,0); // send this x2. dunno why, but kRO does that [blackhole89]
 		clif_homskillinfoblock(sd);
-		clif_hominfo(sd,hd,0);
-		clif_send_homdata(sd,SP_ACK,0);
 		merc_hom_init_timers(hd);
 	}
 	return 1;

+ 4 - 5
src/map/status.c

@@ -2404,6 +2404,7 @@ int status_calc_homunculus(struct homun_data *hd, int first)
 	struct status_data b_status, *status;
 	struct s_homunculus *hom;
 	int skill;
+	int amotion;
 
 	memcpy(&b_status, &hd->base_status, sizeof(struct status_data));
 	hom = &hd->homunculus;
@@ -2468,17 +2469,15 @@ int status_calc_homunculus(struct homun_data *hd, int first)
 
 	status->aspd_rate = 1000;
 
-	skill = (1000 -4*status->agi -status->dex)
-			*hd->homunculusDB->baseASPD/1000;
-
-	status->amotion = cap_value(skill,battle_config.max_aspd,2000);
+	amotion = (1000 -4*status->agi -status->dex) * hd->homunculusDB->baseASPD/1000;
+	status->amotion = cap_value(amotion,battle_config.max_aspd,2000);
 	status->adelay = status->amotion; //It seems adelay = amotion for Homunculus.
 
 	status_calc_misc(&hd->bl, status, hom->level);
 	status_cpy(&hd->battle_status, status);
 	status_calc_bl(&hd->bl, SCB_ALL); //Status related changes.
 
-	if (memcmp(&b_status, status, sizeof(struct status_data)))
+	if( memcmp(&b_status, status, sizeof(struct status_data)) && !first )
 		clif_hominfo(hd->master,hd,0) ;
 
 	return 1;