Browse Source

- Fixed pet equip not displaying correctly at all (closes topic:153753)
- Removed old fixpos packet (the 'new' one is way smaller)
- Fixed some major logical typos in the code, cleaned up many places


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

ultramage 18 năm trước cách đây
mục cha
commit
a57b40f407
9 tập tin đã thay đổi với 179 bổ sung200 xóa
  1. 7 1
      Changelog-Trunk.txt
  2. 2 3
      conf-tmpl/msg_athena.conf
  3. 113 176
      src/map/clif.c
  4. 6 6
      src/map/clif.h
  5. 2 1
      src/map/map.c
  6. 5 5
      src/map/mob.c
  7. 8 8
      src/map/pet.c
  8. 35 0
      src/map/status.c
  9. 1 0
      src/map/status.h

+ 7 - 1
Changelog-Trunk.txt

@@ -3,8 +3,14 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
+2007/06/11
+	* accumulated clif.c fixes [ultramage]
+	- Fixed pet equip not displaying correctly at all
+	- Removed old fixpos packet (the 'new' one is way smaller)
+	- Fixed some major logical typos in the code, cleaned up many places
 2007/06/10
-	* Rev. 10745 Updated itemdb.h with the two new item group values. (38 and 39) Why are they static anyway? [L0ne_W0lf]
+	* Rev. 10745 Updated itemdb.h with the two new item group values.
+	  (38 and 39) Why are they static anyway? [L0ne_W0lf]
 2007/06/09
 	* Added 'nosave' mapflag to que_bingo for Bingo system purposes. [SinSloth]
 2007/06/04

+ 2 - 3
conf-tmpl/msg_athena.conf

@@ -310,7 +310,7 @@
 291: Weather effects will dispell on warp/refresh
 // Guild Castles Number
 // --------------------
-299: ?? Castles
+//299: ?? Castles
 300: None Taken
 301: One Castle
 302: Two Castles
@@ -335,9 +335,8 @@
 321: Twenty One Castles
 322: Twenty Two Castles
 323: Twenty Three Castles
-324: Total Domination
-//alternative
 //324: Twenty Four Castles
+324: Total Domination
 
 // Players Titles (for @who, etc commands, check battle_athena.conf for titles level setting)
 // Useful note: you may remove ':%d' from the line, then you will see only player title, w/o his level

+ 113 - 176
src/map/clif.c

@@ -600,21 +600,22 @@ int clif_charselectok(int id)
 }
 
 /*==========================================
- *
+ * Makes an item appear on the ground
+ * 009e <ID>.l <name ID>.w <identify flag>.B <X>.w <Y>.w <subX>.B <subY>.B <amount>.w
  *------------------------------------------*/
-static int clif_set009e(struct flooritem_data *fitem,unsigned char *buf)
+int clif_dropflooritem(struct flooritem_data* fitem)
 {
+	uint8 buf[17];
 	int view;
 
 	nullpo_retr(0, fitem);
 
-	//009e <ID>.l <name ID>.w <identify flag>.B <X>.w <Y>.w <subX>.B <subY>.B <amount>.w
+	if (fitem->item_data.nameid <= 0)
+		return 0;
+
 	WBUFW(buf, 0) = 0x9e;
 	WBUFL(buf, 2) = fitem->bl.id;
-	if ((view = itemdb_viewid(fitem->item_data.nameid)) > 0)
-		WBUFW(buf, 6) = view;
-	else
-		WBUFW(buf, 6) = fitem->item_data.nameid;
+	WBUFW(buf, 6) = ((view = itemdb_viewid(fitem->item_data.nameid)) > 0) ? view : fitem->item_data.nameid;
 	WBUFB(buf, 8) = fitem->item_data.identify;
 	WBUFW(buf, 9) = fitem->bl.x;
 	WBUFW(buf,11) = fitem->bl.y;
@@ -622,21 +623,6 @@ static int clif_set009e(struct flooritem_data *fitem,unsigned char *buf)
 	WBUFB(buf,14) = fitem->suby;
 	WBUFW(buf,15) = fitem->item_data.amount;
 
-	return packet_len(0x9e);
-}
-
-/*==========================================
- *
- *------------------------------------------*/
-int clif_dropflooritem(struct flooritem_data *fitem)
-{
-	unsigned char buf[64];
-
-	nullpo_retr(0, fitem);
-
-	if (fitem->item_data.nameid <= 0)
-		return 0;
-	clif_set009e(fitem, buf);
 	clif_send(buf, packet_len(0x9e), &fitem->bl, AREA);
 
 	return 0;
@@ -770,53 +756,29 @@ void clif_get_weapon_view(TBL_PC* sd, unsigned short *rhand, unsigned short *lha
 #endif
 }	
 
-static void clif_get_guild_data(struct block_list *bl, long *guild_id, short *emblem_id) 
-{
-	//TODO: There has to be a way to clean this up.
-	switch (bl->type) {
-		case BL_PC:
-			*guild_id = ((TBL_PC*)bl)->status.guild_id;
-			*emblem_id = ((TBL_PC*)bl)->guild_emblem_id;
-			break;
-		case BL_MOB:
-			if (((TBL_MOB*)bl)->guardian_data) {
-				*guild_id =((TBL_MOB*)bl)->guardian_data->guild_id;
-				*emblem_id =((TBL_MOB*)bl)->guardian_data->emblem_id;
-			}
-			break;
-		case BL_NPC:
-			if (bl->subtype == SCRIPT && ((TBL_NPC*)bl)->u.scr.guild_id > 0) {
-				struct guild *g = guild_search(((TBL_NPC*)bl)->u.scr.guild_id);
-				if (g) {
-					*guild_id =g->guild_id;
-					*emblem_id =g->emblem_id;
-				}
-			}
-			break;
-		default:
-			*guild_id = status_get_guild_id(bl);
-	}
-	return;
-}
 /*==========================================
  *
  *------------------------------------------*/
-static int clif_set0078(struct block_list *bl, struct view_data *vd, unsigned char *buf)
+static int clif_set0078(struct block_list* bl, unsigned char* buf)
 {
-	struct status_change *sc;
-	struct map_session_data *sd;
-	long guild_id=0;
-	unsigned short emblem_id=0, lv;
-	unsigned short dir;
+	struct status_change* sc;
+	struct view_data* vd;
+	int guild_id, emblem_id, dir, lv;
 
 	nullpo_retr(0, bl);
-	BL_CAST(BL_PC, bl, sd);
 	sc = status_get_sc(bl);
+	vd = status_get_viewdata(bl);
 
-	clif_get_guild_data(bl, &guild_id, &emblem_id);
+	guild_id = status_get_guild_id(bl);
+	emblem_id = status_get_emblem_id(bl);
 	dir = unit_getdir(bl);
 	lv = status_get_lv(bl);
-	if(pcdb_checkid(vd->class_)) { 
+
+	if(pcdb_checkid(vd->class_))
+	{ 
+		struct map_session_data* sd;
+		BL_CAST(BL_PC, bl, sd);
+
 #if PACKETVER > 6
 		memset(buf,0,packet_len(0x22a));
 
@@ -955,9 +917,9 @@ static int clif_set0078(struct block_list *bl, struct view_data *vd, unsigned ch
 	//44B: Karma
 	//45B: Sex
 	WBUFPOS(buf,46,bl->x,bl->y,dir);
-	WBUFB(buf,49)=5;
-	WBUFB(buf,50)=5;
-	//51BL Sit/Stand
+	//WBUFB(buf,49)=5;
+	//WBUFB(buf,50)=5;
+	//51B: Sit/Stand
 	WBUFW(buf,52)=clif_setlevel(lv);
 	return packet_len(0x78);
 }
@@ -968,18 +930,20 @@ static int clif_set0078(struct block_list *bl, struct view_data *vd, unsigned ch
 static int clif_set007b(struct block_list *bl, struct view_data *vd, struct unit_data *ud, unsigned char *buf)
 {
 	struct status_change *sc;
-	struct map_session_data *sd;
-	long guild_id=0;
-	unsigned short emblem_id=0, lv;
+	int guild_id, emblem_id, lv;
 
 	nullpo_retr(0, bl);
-	BL_CAST(BL_PC, bl, sd);
 	sc = status_get_sc(bl);
 	
-	clif_get_guild_data(bl, &guild_id, &emblem_id);
+	guild_id = status_get_guild_id(bl);
+	emblem_id = status_get_emblem_id(bl);
 	lv = status_get_lv(bl);
 	
-	if(pcdb_checkid(vd->class_)) { 
+	if(pcdb_checkid(vd->class_))
+	{ 
+		struct map_session_data* sd;
+		BL_CAST(BL_PC, bl, sd);
+
 #if PACKETVER > 6
 		memset(buf,0,packet_len(0x22c));
 
@@ -1291,6 +1255,7 @@ int clif_spawn(struct block_list *bl)
 {
 	unsigned char buf[128];
 	struct view_data *vd;
+
 	nullpo_retr(0, bl);
 	vd = status_get_viewdata(bl);
 	if (!vd || vd->class_ == INVISIBLE_CLASS)
@@ -1298,8 +1263,9 @@ int clif_spawn(struct block_list *bl)
 
 	if (pcdb_checkid(vd->class_))
 	{	//Player spawn packet.
-		clif_set0078(bl, vd, buf);
-		switch(WBUFW(buf,0)) {
+		clif_set0078(bl, buf);
+		switch(WBUFW(buf,0))
+		{
 			case 0x78: //Convert to 0x79
 				WBUFW(buf, 0) = 0x79;
 				WBUFW(buf,51) = WBUFW(buf,52); //Lv is placed on offset 52
@@ -1337,9 +1303,7 @@ int clif_spawn(struct block_list *bl)
 			WBUFW(buf,10)=sc->opt2;
 			WBUFW(buf,12)=sc->option;
 		}
-		WBUFW(buf,14)=vd->hair_style;  //Required for pets.
 		WBUFW(buf,20)=vd->class_;
-		WBUFW(buf,24)=vd->head_bottom;	//Pet armor
 
 		WBUFPOS(buf,36,bl->x,bl->y,unit_getdir(bl));
 		clif_send(buf,packet_len(0x7c),bl,AREA_WOS);
@@ -1374,6 +1338,13 @@ int clif_spawn(struct block_list *bl)
 				clif_specialeffect(&md->bl,421,AREA);
 		}
 	break;
+	case BL_PET:
+		{
+			unsigned char buf[64];
+			int len = clif_set0078(bl, buf);
+			clif_send(buf, len, bl, AREA_WOS);
+		}
+		break;
 	}
 	return 0;
 }
@@ -2644,6 +2615,7 @@ int clif_updatestatus(struct map_session_data *sd,int type)
 
 	return 0;
 }
+
 int clif_changestatus(struct block_list *bl,int type,int val)
 {
 	unsigned char buf[12];
@@ -2654,7 +2626,6 @@ int clif_changestatus(struct block_list *bl,int type,int val)
 	if(bl->type == BL_PC)
 		sd = (struct map_session_data *)bl;
 
-//printf("clif_changestatus id:%d type:%d val:%d\n",bl->id,type,val);
 	if(sd){
 		WBUFW(buf,0)=0x1ab;
 		WBUFL(buf,2)=bl->id;
@@ -3693,7 +3664,7 @@ void clif_getareachar_pc(struct map_session_data* sd,struct map_session_data* ds
 	*/
 
 }
-void clif_getareachar_char(struct map_session_data* sd,struct block_list *bl)
+void clif_getareachar_unit(struct map_session_data* sd,struct block_list *bl)
 {
 	struct unit_data *ud;
 	struct view_data *vd;
@@ -3724,7 +3695,7 @@ void clif_getareachar_char(struct map_session_data* sd,struct block_list *bl)
 #else
 		WFIFOHEAD(fd,packet_len(0x78));
 #endif
-		len = clif_set0078(bl,vd,WFIFOP(fd,0));
+		len = clif_set0078(bl,WFIFOP(fd,0));
 		WFIFOSET(fd,len);
 	}
 
@@ -3732,7 +3703,7 @@ void clif_getareachar_char(struct map_session_data* sd,struct block_list *bl)
 		clif_refreshlook(&sd->bl,bl->id,LOOK_CLOTHES_COLOR,vd->cloth_color,SELF);
 
 	switch (bl->type)
-	{
+	{	// FIXME: 'AREA' causes unneccessary spam since this should be 1:1 communication
 	case BL_PC:
 		{
 			TBL_PC* tsd = (TBL_PC*)bl;
@@ -3758,39 +3729,16 @@ void clif_getareachar_char(struct map_session_data* sd,struct block_list *bl)
 				clif_specialeffect(bl,421,AREA);
 		}
 		break;
+	case BL_PET:
+		{
+			unsigned char buf[64];
+			int len = clif_set0078(bl, buf);
+			clif_send(buf, len, &sd->bl, SELF);
+		}
+		break;
 	}
 }
 
-/*==========================================
- * Older fix pos packet.
- *------------------------------------------*/
-int clif_fixpos2(struct block_list* bl)
-{
-	struct unit_data *ud;
-	struct view_data *vd;
-	unsigned char buf[256];
-	int len;
-
-	nullpo_retr(0, bl);
-	ud = unit_bl2ud(bl);
-	vd = status_get_viewdata(bl);
-	if (!vd || vd->class_ == INVISIBLE_CLASS)
-		return 0;
-	
-	if(ud && ud->walktimer != -1)
-		len = clif_set007b(bl,vd,ud,buf);
-	else
-		len = clif_set0078(bl,vd,buf);
-
-	if (disguised(bl)) {
-		clif_send(buf,len,bl,AREA_WOS);
-		clif_setdisguise((TBL_PC*)bl, buf, len, 0);
-		clif_setdisguise((TBL_PC*)bl, buf, len, 1);
-	} else
-		clif_send(buf,len,bl,AREA);
-	return 0;
-}
-
 //Modifies the type of damage according to status changes [Skotlex]
 #define clif_calc_delay(type,delay) (type==1||type==4||type==0x0a)?type:(delay==0?9:type)
 
@@ -4056,7 +4004,7 @@ int clif_01ac(struct block_list *bl)
 	default:
 		if(&sd->bl == bl)
 			break;
-		clif_getareachar_char(sd,bl);
+		clif_getareachar_unit(sd,bl);
 		break;
 	}
 	return 0;
@@ -4134,13 +4082,13 @@ int clif_insight(struct block_list *bl,va_list ap)
 			clif_getareachar_skillunit(tsd,(TBL_SKILL*)bl);
 			break;
 		default:
-			clif_getareachar_char(tsd,bl);
+			clif_getareachar_unit(tsd,bl);
 			break;
 		}
 	}
 	if (sd && sd->fd)
 	{	//Tell sd that tbl walked into his view
-		clif_getareachar_char(sd,tbl);
+		clif_getareachar_unit(sd,tbl);
 	}
 	return 0;
 }
@@ -4187,7 +4135,7 @@ int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range)
 int clif_skillinfoblock(struct map_session_data *sd)
 {
 	int fd;
-	int i,c,len=4,id;
+	int i,c,len,id;
 
 	nullpo_retr(0, sd);
 
@@ -4195,21 +4143,23 @@ int clif_skillinfoblock(struct map_session_data *sd)
 	if (!fd) return 0;
 
 	WFIFOHEAD(fd, MAX_SKILL * 37 + 4);
-	WFIFOW(fd,0)=0x10f;
-	for ( i = c = 0; i < MAX_SKILL; i++){
-		if( (id=sd->status.skill[i].id)!=0 ){
-			WFIFOW(fd,len  ) = id;
+	WFIFOW(fd,0) = 0x10f;
+	for ( i = 0, c = 0, len = 4; i < MAX_SKILL; i++)
+	{
+		if( (id = sd->status.skill[i].id) != 0 )
+		{
+			WFIFOW(fd,len)   = id;
 			WFIFOW(fd,len+2) = skill_get_inf(id);
 			WFIFOW(fd,len+4) = 0;
 			WFIFOW(fd,len+6) = sd->status.skill[i].lv;
 			WFIFOW(fd,len+8) = skill_get_sp(id,sd->status.skill[i].lv);
 			WFIFOW(fd,len+10)= skill_get_range2(&sd->bl, id,sd->status.skill[i].lv);
 			strncpy((char*)WFIFOP(fd,len+12), skill_get_name(id), NAME_LENGTH);
-			if(sd->status.skill[i].flag ==0)
-				WFIFOB(fd,len+36)= (sd->status.skill[i].lv < skill_tree_get_max(id, sd->status.class_))? 1:0;
+			if(sd->status.skill[i].flag == 0)
+				WFIFOB(fd,len+36) = (sd->status.skill[i].lv < skill_tree_get_max(id, sd->status.class_))? 1:0;
 			else
 				WFIFOB(fd,len+36) = 0;
-			len+=37;
+			len += 37;
 			c++;
 		}
 	}
@@ -6051,7 +6001,7 @@ int clif_catch_process(struct map_session_data *sd)
 	return 0;
 }
 
-int clif_pet_rulet(struct map_session_data *sd,int data)
+int clif_pet_roulette(struct map_session_data *sd,int data)
 {
 	int fd;
 
@@ -6102,24 +6052,48 @@ int clif_sendegg(struct map_session_data *sd)
 	return 0;
 }
 
-int clif_send_petdata(struct map_session_data *sd,int type,int param)
+/*==========================================
+ * Sends a specific pet data update.
+ * type = 0 -> param = 0 (initial data)
+ * type = 1 -> param = intimacy value
+ * type = 2 -> param = hungry value
+ * type = 3 -> param = accessory id
+ * type = 4 -> param = performance number (1-3:normal, 4:special)
+ * type = 5 -> param = hairstyle number
+ *------------------------------------------*/
+int clif_send_petdata(struct map_session_data* sd, int type, int param)
 {
 	int fd;
 
 	nullpo_retr(0, sd);
 	nullpo_retr(0, sd->pd);
 
-	fd=sd->fd;
+	fd = sd->fd;
 	WFIFOHEAD(fd,packet_len(0x1a4));
-	WFIFOW(fd,0)=0x1a4;
-	WFIFOB(fd,2)=type;
-	WFIFOL(fd,3)=sd->pd->bl.id;
-	WFIFOL(fd,7)=param;
+	WFIFOW(fd,0) = 0x1a4;
+	WFIFOB(fd,2) = type;
+	WFIFOL(fd,3) = sd->pd->bl.id;
+	WFIFOL(fd,7) = param;
 	WFIFOSET(fd,packet_len(0x1a4));
 
 	return 0;
 }
 
+int clif_send_petdata_area(struct pet_data* pd, int type, int param)
+{
+	uint8 buf[16];
+
+	nullpo_retr(0, pd);
+
+	WBUFW(buf,0) = 0x1a4;
+	WBUFB(buf,2) = type;
+	WBUFL(buf,3) = pd->bl.id;
+	WBUFL(buf,7) = param;
+	clif_send(buf, packet_len(0x1a4), &pd->bl, AREA);
+
+	return 0;
+}
+
 int clif_send_petstatus(struct map_session_data *sd)
 {
 	int fd;
@@ -6171,41 +6145,6 @@ int clif_pet_emotion(struct pet_data *pd,int param)
 	return 0;
 }
 
-int clif_pet_performance(struct block_list *bl,int param)
-{
-	unsigned char buf[16];
-
-	nullpo_retr(0, bl);
-
-	memset(buf,0,packet_len(0x1a4));
-
-	WBUFW(buf,0)=0x1a4;
-	WBUFB(buf,2)=4;
-	WBUFL(buf,3)=bl->id;
-	WBUFL(buf,7)=param;
-
-	clif_send(buf,packet_len(0x1a4),bl,AREA);
-
-	return 0;
-}
-
-int clif_pet_equip(struct pet_data *pd)
-{
-	unsigned char buf[16];
-
-	nullpo_retr(0, pd);
-
-	memset(buf,0,packet_len(0x1a4));
-
-	WBUFW(buf,0)=0x1a4;
-	WBUFB(buf,2)=3;
-	WBUFL(buf,3)=pd->bl.id;
-	WBUFL(buf,7)=pd->vd.shield;
-	clif_send(buf,packet_len(0x1a4),&pd->bl,AREA);
-
-	return 0;
-}
-
 int clif_pet_food(struct map_session_data *sd,int foodid,int fail)
 {
 	int fd;
@@ -6554,16 +6493,14 @@ int clif_guild_send_onlineinfo(struct map_session_data *sd)
  *------------------------------------------*/
 int clif_guild_masterormember(struct map_session_data *sd)
 {
-	int type=0x57,fd;
+	int fd;
 
 	nullpo_retr(0, sd);
 
 	fd=sd->fd;
-	if(sd->state.gmaster_flag)
-		type=0xd7;
 	WFIFOHEAD(fd,packet_len(0x14e));
-	WFIFOW(fd,0)=0x14e;
-	WFIFOL(fd,2)=type;
+	WFIFOW(fd,0) = 0x14e;
+	WFIFOL(fd,2) = (sd->state.gmaster_flag) ? 0xd7 : 0x57;
 	WFIFOSET(fd,packet_len(0x14e));
 	return 0;
 }
@@ -6572,7 +6509,7 @@ int clif_guild_masterormember(struct map_session_data *sd)
  *------------------------------------------*/
 int clif_guild_basicinfo(struct map_session_data *sd)
 {
-	int fd,i,t=0;
+	int fd,i,t;
 	struct guild *g;
 	struct guild_castle *gc=NULL;
 
@@ -6599,15 +6536,13 @@ int clif_guild_basicinfo(struct map_session_data *sd)
 	memcpy(WFIFOP(fd,46),g->name, NAME_LENGTH);
 	memcpy(WFIFOP(fd,70),g->master, NAME_LENGTH);
 
-	for(i=0;i<MAX_GUILDCASTLE;i++){
-		gc=guild_castle_search(i);
-		if(!gc) continue;
-			if(g->guild_id == gc->guild_id)	t++;
+	for(i = 0, t = 0; i < MAX_GUILDCASTLE; i++)
+	{
+		gc = guild_castle_search(i);
+		if(gc && g->guild_id == gc->guild_id)
+			t++;
 	}
-	if (t>=0 && t<=MAX_GUILDCASTLE) //(0=None, 1..24 = N of Casles) [Lupus]
-		strncpy((char*)WFIFOP(fd,94),msg_txt(300+t),20);
-	else
-		strncpy((char*)WFIFOP(fd,94),msg_txt(299),20);
+	strncpy((char*)WFIFOP(fd,94),msg_txt(300+t),20); // "'N' castles"
 
 	WFIFOSET(fd,packet_len(WFIFOW(fd,0)));
 	return 0;
@@ -6838,8 +6773,10 @@ int clif_guild_skillinfo(struct map_session_data *sd)
 	WFIFOSET(fd,WFIFOW(fd,2));
 	return 0;
 }
+
 /*==========================================
- * ƒMƒ‹ƒh��’m‘—�M
+ * Sends guild notice to client
+ * R 016f <str1z>.60B <str2z>.120B
  *------------------------------------------*/
 int clif_guild_notice(struct map_session_data *sd,struct guild *g)
 {
@@ -7455,7 +7392,7 @@ int clif_soundeffectall(struct block_list *bl, const char *name, int type, int c
 }
 
 // displaying special effects (npcs, weather, etc) [Valaris]
-int clif_specialeffect(struct block_list *bl, int type, int flag)
+int clif_specialeffect(struct block_list* bl, int type, enum send_target target)
 {
 	unsigned char buf[24];
 
@@ -7467,7 +7404,7 @@ int clif_specialeffect(struct block_list *bl, int type, int flag)
 	WBUFL(buf,2) = bl->id;
 	WBUFL(buf,6) = type;
 
-	clif_send(buf, packet_len(0x1f3), bl, flag);
+	clif_send(buf, packet_len(0x1f3), bl, target);
 
 	if (disguised(bl)) {
 		WBUFL(buf,2) = -bl->id;

+ 6 - 6
src/map/clif.h

@@ -79,7 +79,6 @@ int clif_changemapserver(struct map_session_data* sd, const char* mapname, int x
 int clif_blown(struct block_list *); // area
 int clif_slide(struct block_list *,int,int); // area
 int clif_fixpos(struct block_list *);	// area
-int clif_fixpos2(struct block_list *);	// area
 int clif_npcbuysell(struct map_session_data*,int);	//self
 int clif_buylist(struct map_session_data*,struct npc_data*);	//self
 int clif_selllist(struct map_session_data*);	//self
@@ -313,13 +312,14 @@ void clif_upgrademessage(int fd, int result, int item_id);
 
 //petsystem
 int clif_catch_process(struct map_session_data *sd);
-int clif_pet_rulet(struct map_session_data *sd,int data);
+int clif_pet_roulette(struct map_session_data *sd,int data);
 int clif_sendegg(struct map_session_data *sd);
-int clif_send_petdata(struct map_session_data *sd,int type,int param);
 int clif_send_petstatus(struct map_session_data *sd);
+int clif_send_petdata(struct map_session_data* sd, int type, int param);
+int clif_send_petdata_area(struct pet_data* pd, int type, int param);
+#define clif_pet_equip(pd) clif_send_petdata_area(pd, 3, (pd)->vd.head_bottom)
+#define clif_pet_performance(pd, param) clif_send_petdata_area(pd, 4, param)
 int clif_pet_emotion(struct pet_data *pd,int param);
-int clif_pet_performance(struct block_list *bl,int param);
-int clif_pet_equip(struct pet_data *pd);
 int clif_pet_food(struct map_session_data *sd,int foodid,int fail);
 
 //friends list
@@ -330,7 +330,7 @@ void clif_friendslist_reqack(struct map_session_data *sd, struct map_session_dat
 // [Valaris]
 int clif_mob_hp(struct mob_data *md);
 int clif_weather(int m); // [Valaris]
-int clif_specialeffect(struct block_list *bl,int type, int flag); // special effects [Valaris]
+int clif_specialeffect(struct block_list* bl, int type, enum send_target target); // special effects [Valaris]
 int clif_message(struct block_list *bl, const char* msg); // messages (from mobs/npcs) [Valaris]
 
 int clif_GM_kickack(struct map_session_data *sd,int id);

+ 2 - 1
src/map/map.c

@@ -342,8 +342,9 @@ void map_delblcell(struct block_list *bl)
 
 /*==========================================
  * Adds a block to the map.
- * If flag is 1, then the block was just added
+ * If flag is 1, then the block was just added,
  * otherwise it is part of a transition.
+ * Returns 0 on success, 1 on failure (illegal coordinates).
  *------------------------------------------*/
 int map_addblock_sub (struct block_list *bl, int flag)
 {

+ 5 - 5
src/map/mob.c

@@ -3631,7 +3631,7 @@ static int mob_readskilldb(void)
 	} cond1[] = {
 		{	"always",			MSC_ALWAYS				},
 		{	"myhpltmaxrate",	MSC_MYHPLTMAXRATE		},
-		{  "myhpinrate",		MSC_MYHPINRATE 		},
+		{	"myhpinrate",		MSC_MYHPINRATE 		},
 		{	"friendhpltmaxrate",MSC_FRIENDHPLTMAXRATE	},
 		{	"friendhpinrate",	MSC_FRIENDHPINRATE	},
 		{	"mystatuson",		MSC_MYSTATUSON			},
@@ -3651,7 +3651,7 @@ static int mob_readskilldb(void)
 		{	"masterhpltmaxrate",MSC_MASTERHPLTMAXRATE	},
 		{	"masterattacked",	MSC_MASTERATTACKED		},
 		{	"alchemist",		MSC_ALCHEMIST			},
-		{	"onspawn",		MSC_SPAWN},
+		{	"onspawn",			MSC_SPAWN},
 	}, cond2[] ={
 		{	"anybad",		-1				},
 		{	"stone",		SC_STONE		},
@@ -3666,14 +3666,14 @@ static int mob_readskilldb(void)
 		{	"hiding",		SC_HIDING		},
 		{	"sight",		SC_SIGHT		},
 	}, state[] = {
-		{	"any",		MSS_ANY	}, //All states except Dead
+		{	"any",		MSS_ANY		}, //All states except Dead
 		{	"idle",		MSS_IDLE	},
 		{	"walk",		MSS_WALK	},
 		{	"loot",		MSS_LOOT	},
 		{	"dead",		MSS_DEAD	},
 		{	"attack",	MSS_BERSERK	}, //Retaliating attack
-		{	"angry",		MSS_ANGRY	}, //Preemptive attack (aggressive mobs)
-		{	"chase",		MSS_RUSH		}, //Chase escaping target
+		{	"angry",	MSS_ANGRY	}, //Preemptive attack (aggressive mobs)
+		{	"chase",	MSS_RUSH	}, //Chase escaping target
 		{	"follow",	MSS_FOLLOW	}, //Preemptive chase (aggressive mobs)
 		{	"anytarget",MSS_ANYTARGET	}, //Berserk+Angry+Rush+Follow
 	}, target[] = {

+ 8 - 8
src/map/pet.c

@@ -325,13 +325,13 @@ static int pet_performance(struct map_session_data *sd, struct pet_data *pd)
 
 	if (pd->pet.intimate > 900)
 		val = (pd->petDB->s_perfor > 0)? 4:3;
-	else if(pd->pet.intimate > 750)
+	else if(pd->pet.intimate > 750) //TODO: this is way too high
 		val = 2;
 	else
 		val = 1;
 
 	pet_stop_walking(pd,2000<<8);
-	clif_pet_performance(&pd->bl,rand()%val + 1);
+	clif_pet_performance(pd, rand()%val + 1);
 	pet_lootitem_drop(pd,NULL);
 	return 1;
 }
@@ -556,7 +556,7 @@ int pet_catch_process2(struct map_session_data *sd,int target_id)
 	
 	if (sd->menuskill_id != SA_TAMINGMONSTER) 
 	{	//Exploit?
-		clif_pet_rulet(sd,0);
+		clif_pet_roulette(sd,0);
 		sd->catch_target_class = -1;
 		return 1;
 	}
@@ -566,7 +566,7 @@ int pet_catch_process2(struct map_session_data *sd,int target_id)
 		i=pc_search_inventory(sd,sd->menuskill_lv);
 		if (i < 0)
 		{	//they tried an exploit?
-			clif_pet_rulet(sd,0);
+			clif_pet_roulette(sd,0);
 			sd->catch_target_class = -1;
 			return 1;
 		}
@@ -584,7 +584,7 @@ int pet_catch_process2(struct map_session_data *sd,int target_id)
 		sd->catch_target_class = md->class_;
 	if(i < 0 || sd->catch_target_class != md->class_) {
 		clif_emotion(&md->bl, 7);	//mob will do /ag if wrong lure is used on them.
-		clif_pet_rulet(sd,0);
+		clif_pet_roulette(sd,0);
 		sd->catch_target_class = -1;
 		return 1;
 	}
@@ -597,16 +597,16 @@ int pet_catch_process2(struct map_session_data *sd,int target_id)
 	if(rand()%10000 < pet_catch_rate) {
 		unit_remove_map(&md->bl,0);
 		status_kill(&md->bl);
-		clif_pet_rulet(sd,1);
+		clif_pet_roulette(sd,1);
 //		if(battle_config.etc_log)
-//			printf("rulet success %d\n",target_id);
+//			printf("roulette success %d\n",target_id);
 		intif_create_pet(sd->status.account_id,sd->status.char_id,pet_db[i].class_,mob_db(pet_db[i].class_)->lv,
 			pet_db[i].EggID,0,pet_db[i].intimate,100,0,1,pet_db[i].jname);
 	}
 	else
 	{
 		sd->catch_target_class = -1;
-		clif_pet_rulet(sd,0);
+		clif_pet_roulette(sd,0);
 	}
 
 	return 0;

+ 35 - 0
src/map/status.c

@@ -4151,6 +4151,41 @@ int status_get_guild_id(struct block_list *bl)
 	return 0;
 }
 
+int status_get_emblem_id(struct block_list *bl)
+{
+	nullpo_retr(0, bl);
+	switch (bl->type) {
+	case BL_PC:
+		return ((TBL_PC*)bl)->guild_emblem_id;
+	case BL_PET:
+		if (((TBL_PET*)bl)->msd)
+			return ((TBL_PET*)bl)->msd->guild_emblem_id;
+		break;
+	case BL_MOB:
+	{
+		struct map_session_data *msd;
+		struct mob_data *md = (struct mob_data *)bl;
+		if (md->guardian_data)	//Guardian's guild [Skotlex]
+			return md->guardian_data->emblem_id;
+		if (md->special_state.ai && (msd = map_id2sd(md->master_id)) != NULL)
+			return msd->guild_emblem_id; //Alchemist's mobs [Skotlex]
+	}
+		break;
+	case BL_HOM:
+	  	if (((TBL_HOM*)bl)->master)
+			return ((TBL_HOM*)bl)->master->guild_emblem_id;
+		break;
+	case BL_NPC:
+		if (bl->subtype == SCRIPT && ((TBL_NPC*)bl)->u.scr.guild_id > 0) {
+			struct guild *g = guild_search(((TBL_NPC*)bl)->u.scr.guild_id);
+			if (g)
+				return g->emblem_id;
+		}
+		break;
+	}
+	return 0;
+}
+
 int status_get_mexp(struct block_list *bl)
 {
 	nullpo_retr(0, bl);

+ 1 - 0
src/map/status.h

@@ -614,6 +614,7 @@ unsigned char status_get_attack_lelement(struct block_list *bl);
 #define status_get_mode(bl) status_get_status_data(bl)->mode
 int status_get_party_id(struct block_list *bl);
 int status_get_guild_id(struct block_list *bl);
+int status_get_emblem_id(struct block_list *bl);
 int status_get_mexp(struct block_list *bl);
 int status_get_race2(struct block_list *bl);