Explorar o código

- Corrected the @follow timer not being deleted on logout.
- Applied the homunculus code fixes provided by Toms.


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

skotlex %!s(int64=19) %!d(string=hai) anos
pai
achega
4289e1c98d
Modificáronse 6 ficheiros con 22 adicións e 9 borrados
  1. 2 0
      Changelog-Trunk.txt
  2. 2 0
      src/map/battle.c
  3. 3 1
      src/map/clif.c
  4. 11 8
      src/map/mercenary.c
  5. 1 0
      src/map/skill.c
  6. 3 0
      src/map/unit.c

+ 2 - 0
Changelog-Trunk.txt

@@ -4,6 +4,8 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2006/07/21
+	* Corrected the @follow timer not being deleted on logout. [Skotlex]
+	* Applied the homunculus code fixes provided by Toms. [Skotlex]
 	* battle_check_target will now tag homunculus as invalid target when the
 	  source is a skill-type object. [Skotlex]
 	* Added a check on pc_equipitem so that when the client specifies to equip

+ 2 - 0
src/map/battle.c

@@ -3088,6 +3088,8 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
 				return 0;
 			//Just fallback on master.
 			t_bl=(struct block_list *)((TBL_HOMUNCULUS*)target)->master;
+			if (((TBL_PC*)t_bl)->state.monster_ignore && t_bl != s_bl && flag&BCT_ENEMY)
+				return 0;
 			break;
 		}
 		case BL_SKILL: //Skill with no owner? Kinda odd... but.. let it through.

+ 3 - 1
src/map/clif.c

@@ -1471,6 +1471,8 @@ int clif_hominfo(struct map_session_data *sd, int flag)
 	WBUFW(buf,0)=0x22e;
 	memcpy(WBUFP(buf,2),sd->homunculus.name,NAME_LENGTH);
 	WBUFB(buf,26)=sd->homunculus.rename_flag * 2;
+	// Bit field, bit 0 : rename_flag (1 = already renamed), bit 1 : homunc vaporized (1 = true), bit 2 : homunc dead (1 = true)
+	WBUFB(buf,26)=sd->homunculus.rename_flag | (sd->homunculus.vaporize << 1) | (sd->homunculus.hp?0:4);
 	WBUFW(buf,27)=sd->homunculus.level;
 	WBUFW(buf,29)=sd->homunculus.hunger;
 	WBUFW(buf,31)=(unsigned short) (hd->master->homunculus.intimacy / 100) ;
@@ -5043,7 +5045,7 @@ int clif_displaymessage(const int fd, char* mes)
 		int len_mes = strlen(mes);
 
 		if (len_mes > 0) { // don't send a void message (it's not displaying on the client chat). @help can send void line.
-                        WFIFOHEAD(fd, 5 + len_mes);
+			WFIFOHEAD(fd, 5 + len_mes);
 			WFIFOW(fd,0) = 0x8e;
 			WFIFOW(fd,2) = 5 + len_mes; // 4 + len + NULL teminate
 			memcpy(WFIFOP(fd,4), mes, len_mes + 1);

+ 11 - 8
src/map/mercenary.c

@@ -54,14 +54,6 @@ void merc_load_exptables(void);
 int mercskill_castend_id( int tid, unsigned int tick, int id,int data );
 static int merc_hom_hungry(int tid,unsigned int tick,int id,int data);
 
-int do_init_merc (void)
-{
-	merc_load_exptables();
-	memset(homunculus_db,0,sizeof(homunculus_db));	//[orn]
-	read_homunculusdb();	//[orn]
-	return 0;
-}
-
 static unsigned long hexptbl[MAX_LEVEL+1];
 
 void merc_load_exptables(void)
@@ -1089,4 +1081,15 @@ int read_homunculusdb()
 	return 0;
 }
 
+int do_init_merc (void)
+{
+	merc_load_exptables();
+	memset(homunculus_db,0,sizeof(homunculus_db));	//[orn]
+	read_homunculusdb();	//[orn]
+	// Add homunc timer function to timer func list [Toms]
+	add_timer_func_list(merc_natural_heal, "merc_natural_heal");
+	add_timer_func_list(merc_hom_hungry, "merc_hom_hungry");
+	return 0;
+}
+
 int do_final_merc (void);

+ 1 - 0
src/map/skill.c

@@ -5589,6 +5589,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 	{
 		if (sd && sd->hd && ( sd->hd->battle_status.hp >= (sd->hd->battle_status.max_hp * 80 / 100 ) ) ) {
 			sd->homunculus.vaporize = 1;
+			clif_hominfo(sd, 0);
 			merc_hom_delete(sd->hd, 0) ;
 		} else if ( sd ) 
 		{

+ 3 - 0
src/map/unit.c

@@ -1638,6 +1638,9 @@ int unit_free(struct block_list *bl) {
 					status_change_end(bl,SC_EXPLOSIONSPIRITS,-1);
 			}
 		}
+		if (sd->followtimer != -1)
+			pc_stop_following(sd);
+		
 		// Notify friends that this char logged out. [Skotlex]
 		clif_foreachclient(clif_friendslist_toggle_sub, sd->status.account_id, sd->status.char_id, 0);
 		party_send_logout(sd);