Pārlūkot izejas kodu

Random Homunculus cleanup

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@7857 54d463be-8e91-2dee-dedb-b68131a5f0ec
DracoRPG 19 gadi atpakaļ
vecāks
revīzija
d42fb96de3
6 mainītis faili ar 70 papildinājumiem un 90 dzēšanām
  1. 6 0
      Changelog-Trunk.txt
  2. 1 0
      npc/Changelog.txt
  3. 1 1
      npc/cities/lighthalzen.txt
  4. 1 1
      src/common/mmo.h
  5. 34 59
      src/map/clif.c
  6. 27 29
      src/map/mercenary.c

+ 6 - 0
Changelog-Trunk.txt

@@ -4,6 +4,12 @@ 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/24
+	* Homuculus cleanup [DracoRPG]
+	  - Replaced nullpo's in parse functions by silent checks
+	  - Removed server-side effect for menu option 0 (view status window...
+	    why does the client send us the packet since we don't care? -_-)
+	  - Rewrote intimacy underflow checks so they are really effective (no
+	    need to check if an unsigned is < 0, it won't work... check before!)
 	* fixed unban unblocking players as well. [Skotlex]
 	* Fixed Volcano/Deluge/Violent Gale increasing damage based on element of
 	  attack instead of defense element of attacker. [Skotlex]

+ 1 - 0
npc/Changelog.txt

@@ -40,6 +40,7 @@ Playtester
 Date		Added
 ======
 07/24
+	* Tiny typo fix in a Rekenber Guard dialog [DracoRPG]
 	* Added temporary Rachel spawn file, commented for now [Playtester]
 07/23
 	* Removed the regular Thanatos spawn, since the quest is now implemented. [MasterOfMuppets]

+ 1 - 1
npc/cities/lighthalzen.txt

@@ -2042,7 +2042,7 @@ s_Yes:
 	mes "[Regenschirm Guard]";
 	mes "I'm sorry but I can't let";
 	mes "staff without proper autorization";
-	mes "pass. Only staff memebers with";
+	mes "pass. Only staff members with";
 	mes "Laboratory Passports are allowed";
 	mes "to enter the underground.";
 	close;

+ 1 - 1
src/common/mmo.h

@@ -174,7 +174,7 @@ struct s_homunculus {	//[orn]
 	int char_id;
 	short class_;
 	int hp,max_hp,sp,max_sp;
-	unsigned long intimacy;	//[orn]
+	int intimacy;	//[orn]
 	short hunger;
 	struct skill hskill[MAX_HOMUNSKILL]; //albator
 	short skillpts;

+ 34 - 59
src/map/clif.c

@@ -105,7 +105,7 @@ static const int packet_len_table[MAX_PACKET_DB] = {
 //#0x200
    26, -1,  26, 10, 18, 26, 11, 34,  14, 36, 10, 0,  0, -1, 32, 10, // 0x20c change to 0 (was 19)
    22,  0,  26, 26, 42, -1, -1,  2,   2,282,282,10, 10, -1, -1, 66,
-   10, -1,  -1,  8, 10,  2,282, 18,  18, 15, 58, 57, 64, 5, 69,  5,
+   10, -1,  -1,  8, 10,  2,282, 18,  18, 15, 58, 57, 64, 5, 71,  5,
    12, 26,   9, 11, -1, -1, 10,  2, 282, 11,  4, 36, -1,-1,  4,  2,
    -1, -1,  -1, -1, -1,  3,  4,  8,  -1,  3, 70,  4,  8,12,  4, 10,
     3, 32,  -1,  3,  3,  5,  5,  8,   2,  3, -1, -1,  4,-1,  4
@@ -1463,11 +1463,8 @@ int clif_hominfo(struct map_session_data *sd, int flag)
 	
 	nullpo_retr(0, hd);
 
-//	if ( sd->hd ) 
-//		return 0 ;
-
 	status = &hd->battle_status;
-	memset(buf,0,71); //packet_len_table[0x22e]);
+	memset(buf,0,packet_len_table[0x22e]);
 	WBUFW(buf,0)=0x22e;
 	memcpy(WBUFP(buf,2),sd->homunculus.name,NAME_LENGTH);
 	WBUFB(buf,26)=sd->homunculus.rename_flag * 2;
@@ -1476,7 +1473,7 @@ int clif_hominfo(struct map_session_data *sd, int flag)
 	WBUFW(buf,27)=sd->homunculus.level;
 	WBUFW(buf,29)=sd->homunculus.hunger;
 	WBUFW(buf,31)=(unsigned short) (hd->master->homunculus.intimacy / 100) ;
-	WBUFW(buf,33)=0;			// equip id
+	WBUFW(buf,33)=0; // equip id
 	WBUFW(buf,35)=status->rhw.atk2;
 	WBUFW(buf,37)=status->matk_max;
 	WBUFW(buf,39)=status->hit;
@@ -1492,17 +1489,14 @@ int clif_hominfo(struct map_session_data *sd, int flag)
 	WBUFL(buf,59)=sd->homunculus.exp;
 	WBUFL(buf,63)=hd->exp_next;
 	WBUFW(buf,67)=sd->homunculus.skillpts;
-	WBUFW(buf,69)=1; //hd->attackable; FIXME: Attackable? When exactly is a homun not attackable? [Skotlex]
-	clif_send(buf,/*packet_len_table[0x22e]*/71,&sd->bl,SELF); 
+	WBUFW(buf,69)=1; // FIXME: Attackable? When exactly is a homun not attackable? [Skotlex]
+	clif_send(buf,packet_len_table[0x22e],&sd->bl,SELF);
 	return 0;
 }
 
-/*==========================================
- *
- *------------------------------------------
- */
 void clif_send_homdata(struct map_session_data *sd, int type, int param) {	//[orn]
 	int fd;
+
 	nullpo_retv(sd);
 	nullpo_retv(sd->hd);
 
@@ -1515,7 +1509,7 @@ void clif_send_homdata(struct map_session_data *sd, int type, int param) {	//[or
 
 	return;
 }
-// like skillinfoblock, just for homunculi.
+
 int clif_homskillinfoblock(struct map_session_data *sd) {	//[orn]
 	int fd;
 	int i,j,c,len=4,id/*, inf2*/;
@@ -1570,38 +1564,37 @@ void clif_homskillup(struct map_session_data *sd, int skill_num) {	//[orn]
 	return;
 }
 
-// Request a Homunculus name change
 void clif_parse_ChangeHomunculusName(int fd, struct map_session_data *sd) {	//[orn]
-	RFIFOHEAD(fd);
+
 	nullpo_retv(sd);
-	nullpo_retv(sd->hd);
+
+	if(sd->hd == NULL)
+		return;
+
+	RFIFOHEAD(fd);
 	memcpy(sd->homunculus.name,RFIFOP(fd,2),24);
-	sd->homunculus.rename_flag = 1 ;
+	sd->homunculus.rename_flag = 1;
 	clif_hominfo(sd,0);
 	clif_charnameack(sd->fd,&sd->hd->bl);
 }
 
-// Somebody who is less lazy than me rename this to ReturnToMaster or something
 void clif_parse_HomMoveToMaster(int fd, struct map_session_data *sd) {	//[orn]
-	RFIFOHEAD(fd);
+
 	nullpo_retv(sd);
-	nullpo_retv(sd->hd);
 
-	if ( sd->hd && status_isdead(&sd->hd->bl) ) 
-		return ;
+	if(sd->hd == NULL || status_isdead(&sd->hd->bl) || sd->homunculus.vaporize)
+		return;
 
-	unit_walktoxy(&sd->hd->bl, sd->bl.x,sd->bl.y-1, 0); //move to master
+	unit_walktoxy(&sd->hd->bl, sd->bl.x,sd->bl.y-1, 0);
 }
 
-// Request a Homunculus move-to-position
 void clif_parse_HomMoveTo(int fd,struct map_session_data *sd) {	//[orn]
 	int x,y,cmd;
 
 	nullpo_retv(sd);
-	nullpo_retv(sd->hd);
 
-	if ( sd->hd && status_isdead(&sd->hd->bl) ) 
-		return ;
+	if(sd->hd == NULL || status_isdead(&sd->hd->bl) || sd->homunculus.vaporize)
+		return;
 
 	cmd = RFIFOW(fd,0);
 	x = RFIFOB(fd,packet_db[sd->packet_ver][cmd].pos[0]) * 4 +
@@ -1612,18 +1605,17 @@ void clif_parse_HomMoveTo(int fd,struct map_session_data *sd) {	//[orn]
 	unit_walktoxy(&(sd->hd->bl),x,y,0);
 }
 
-// Request the Homunculus attacking a bl
 void clif_parse_HomAttack(int fd,struct map_session_data *sd) {	//[orn]
 	struct block_list *target;
+
 	nullpo_retv(sd);
-	nullpo_retv(sd->hd);
-	
-	target=map_id2bl(RFIFOL(fd,6));
+
+	if(sd->hd == NULL || status_isdead(&sd->hd->bl) || sd->homunculus.vaporize || sd->hd->bl.id != RFIFOL(fd,2))
+		return;
 	
-	if ( sd->hd && target && ( status_isdead(&sd->hd->bl) || status_isdead(target) ) ) 
-		return ;
+	if ((target = map_id2bl(RFIFOL(fd,6))) == NULL || status_isdead(target)) 
+		return;
 
-	if(sd->hd->bl.id != RFIFOL(fd,2)) return;
 	merc_stop_walking(sd->hd, 1);
 	merc_stop_attack(sd->hd);
 	if ( sd->hd && target ) {
@@ -1634,10 +1626,13 @@ void clif_parse_HomAttack(int fd,struct map_session_data *sd) {	//[orn]
 
 void clif_parse_HomMenu(int fd, struct map_session_data *sd) {	//[orn]
 	int cmd;
-	cmd = RFIFOW(fd,0);
+
 	RFIFOHEAD(fd);
-	if ( sd->hd && status_isdead(&sd->hd->bl) ) 
-		return ;
+	cmd = RFIFOW(fd,0);
+
+	if(sd->hd == NULL || status_isdead(&sd->hd->bl) || sd->homunculus.vaporize)
+		return;
+
 	merc_menu(sd,RFIFOB(fd,packet_db[sd->packet_ver][cmd].pos[0]));
 }
 
@@ -1657,27 +1652,6 @@ int clif_hom_food(struct map_session_data *sd,int foodid,int fail)	//[orn]
 	return 0;
 }
 
-/*==========================================
- * orn
- *------------------------------------------
- */
-int clif_hwalkok(struct homun_data *hd)
-{
-	int fd;
-
-	nullpo_retr(0, hd);
-
-	fd=hd->master->fd;
-	WFIFOHEAD(fd, packet_len_table[0x87]);
-	WFIFOW(fd,0)=0x87;
-	WFIFOL(fd,2)=gettick();
-	WFIFOPOS2(fd,6,hd->bl.x,hd->bl.y,hd->ud.to_x,hd->ud.to_y);
-	WFIFOB(fd,11)=0x88;
-	WFIFOSET(fd,packet_len_table[0x87]);
-
-	return 0;
-}
-
 /*==========================================
  *
  *------------------------------------------
@@ -9678,7 +9652,8 @@ static void clif_parse_UseSkillToId_homun(struct homun_data *hd, struct map_sess
 {
 	int lv;
 
-	if (!hd) return;
+	if (!hd)
+		return;
 
 	if (skillnotok_hom(skillnum, hd))	//[orn]
 		return;

+ 27 - 29
src/map/mercenary.c

@@ -34,8 +34,6 @@
 #include "mercenary.h"
 #include "charsave.h"
 
-typedef char char32[32];
-
 static int dirx[8]={0,-1,-1,-1,0,1,1,1};	//[orn]
 static int diry[8]={1,1,0,-1,-1,-1,0,1};	//[orn]
 
@@ -45,11 +43,6 @@ static int diry[8]={1,1,0,-1,-1,-1,0,1};	//[orn]
 struct homunculus_db homunculus_db[MAX_HOMUNCULUS_CLASS];	//[orn]
 struct skill_tree_entry hskill_tree[MAX_HOMUNCULUS_CLASS][MAX_SKILL_TREE];
 
-char32 merc_skillname[20] = {"NULL","HLIF_HEAL","HLIF_AVOID","HLIF_BRAIN","HLIF_CHANGE",
-							"HAMI_CASTLE","HAMI_DEFENCE","HAMI_SKIN","HAMI_BLOODLUST",
-							"HFLI_MOON","HFLI_FLEET","HFLI_SPEED","HFLI_SBR44",
-							"HVAN_CAPRICE","HVAN_CHAOTIC","HVAN_INSTRUCT","HVAN_EXPLOSION"};
-
 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);
@@ -111,11 +104,6 @@ void merc_load_exptables(void)
 
 }
 
-char *merc_hom_skill_get_name(int id)
-{
-	return merc_skillname[id-HM_SKILLBASE];
-}
-
 void merc_damage(struct homun_data *hd,struct block_list *src,int hp,int sp)
 {
 	nullpo_retv(hd);
@@ -150,6 +138,7 @@ int merc_hom_dead(struct homun_data *hd, struct block_list *src)
 int merc_hom_delete(struct homun_data *hd, int flag)
 {
 	nullpo_retr(0, hd);
+
 	// Delete homunculus
 	if ( flag&1 ) {	//sabbath
 		intif_homunculus_requestdelete(hd->master->homunculus.hom_id) ;
@@ -568,7 +557,6 @@ int merc_menu(struct map_session_data *sd,int menunum)
 	
 	switch(menunum) {
 		case 0:
-			merc_hom_food(sd, sd->hd);
 			break;
 		case 1:
 			merc_hom_food(sd, sd->hd);
@@ -585,7 +573,7 @@ int merc_menu(struct map_session_data *sd,int menunum)
 
 int merc_hom_food(struct map_session_data *sd, struct homun_data *hd)
 {
-	int i, k, emotion;
+	int i, k, intimacy, emotion;
 
 	if(hd->master->homunculus.vaporize)
 		return 1 ;
@@ -599,27 +587,28 @@ int merc_hom_food(struct map_session_data *sd, struct homun_data *hd)
 	pc_delitem(sd,i,1,0);
 
 	if ( hd->master->homunculus.hunger >= 91 ) {
-		hd->master->homunculus.intimacy -= 50 ;
-		emotion = 16 ;
+		intimacy = -50;
+		emotion = 16;
 	} else if ( hd->master->homunculus.hunger >= 76 ) {
-		hd->master->homunculus.intimacy -= 30 ;
-		emotion = 19 ;
+		intimacy = -30;
+		emotion = 19;
 	} else if ( hd->master->homunculus.hunger >= 26 ) {
-		hd->master->homunculus.intimacy += 80 ;
-		emotion = 2 ;
+		intimacy = 80;
+		emotion = 2;
 	} else if ( hd->master->homunculus.hunger >= 11 ) {
-		hd->master->homunculus.intimacy += 100 ;
-		emotion = 2 ;
+		intimacy = 100;
+		emotion = 2;
 	} else {
-		hd->master->homunculus.intimacy += 50 ;
-		emotion = 2 ;
+		intimacy = 50;
+		emotion = 2;
 	}
+	hd->master->homunculus.intimacy += intimacy;
+	if(hd->master->homunculus.intimacy < 0)
+		hd->master->homunculus.intimacy = 0;
 	if(hd->master->homunculus.intimacy > 100000)
 		hd->master->homunculus.intimacy = 100000;
-	if(hd->master->homunculus.intimacy < 0)
-		hd->master->homunculus.intimacy = 0 ;
 
-	emotion = 5 ; // Thanks 
+	//emotion = 5 ; // FIXME: why the code above and now always set emotion to Thanks? 
 	hd->master->homunculus.hunger += 10;	//dunno increase value for each food
 	if(hd->master->homunculus.hunger > 100)
 		hd->master->homunculus.hunger = 100;
@@ -629,6 +618,13 @@ int merc_hom_food(struct map_session_data *sd, struct homun_data *hd)
 	clif_send_homdata(sd,SP_INTIMATE,sd->homunculus.intimacy / 100);
 	clif_hom_food(sd,hd->homunculusDB->foodID,1);
 
+	if(hd->master->homunculus.intimacy == 0) {
+		merc_stop_walking(hd, 1);
+		merc_stop_attack(hd);
+		clif_emotion(&hd->master->bl, 23) ;	//omg
+		merc_hom_delete(hd,1) ;
+	}
+
 	return 0;
 }
 
@@ -662,9 +658,11 @@ static int merc_hom_hungry(int tid,unsigned int tick,int id,int data)
 	}  
 	if(hd->master->homunculus.hunger < 0) {
 		hd->master->homunculus.hunger = 0;
-		hd->master->homunculus.intimacy -= 100 ;
+		hd->master->homunculus.intimacy -= 100;
+		if(hd->master->homunculus.intimacy < 0)
+			hd->master->homunculus.intimacy = 0;
 		clif_send_homdata(sd,SP_INTIMATE,sd->homunculus.intimacy / 100);
-		if ( hd->master->homunculus.intimacy <= 0 ) {
+		if(hd->master->homunculus.intimacy == 0) {
 			merc_stop_walking(hd, 1);
 			merc_stop_attack(hd);
 			clif_emotion(&hd->master->bl, 23) ;	//omg