Browse Source

- Merged a few minor bugfixes
- Merged in a bunch of the eA renewal support patch.



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

Skotlex 15 years ago
parent
commit
9c244595de
10 changed files with 306 additions and 101 deletions
  1. 2 0
      Changelog-Trunk.txt
  2. 6 6
      db/mob_skill_db.txt
  3. 63 8
      db/packet_db.txt
  4. 7 3
      src/char/char.c
  5. 2 2
      src/char/int_storage.c
  6. 4 0
      src/char_sql/char.c
  7. 7 1
      src/common/mmo.h
  8. 212 76
      src/map/clif.c
  9. 2 2
      src/map/mob.c
  10. 1 3
      src/map/pet.c

+ 2 - 0
Changelog-Trunk.txt

@@ -3,6 +3,8 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 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.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 
+2010/08/03
+	* Merged quite a bit of the RagexeRE eA Compatibility patch (eA topic 222623) to support the more recent clients. [Skotlex]
 2010/07/27
 2010/07/27
 	* Rev. 14367 Implemented three new mercenary skills. [L0ne_W0lf]
 	* Rev. 14367 Implemented three new mercenary skills. [L0ne_W0lf]
 2010/07/27
 2010/07/27

+ 6 - 6
db/mob_skill_db.txt

@@ -654,7 +654,7 @@
 1126,Goblin@NPC_EMOTION,chase,197,1,2000,0,5000,yes,self,always,0,28,,,,,,
 1126,Goblin@NPC_EMOTION,chase,197,1,2000,0,5000,yes,self,always,0,28,,,,,,
 1126,Goblin@NPC_EMOTION,chase,197,1,200,0,5000,yes,self,always,0,19,0x81,,,,,
 1126,Goblin@NPC_EMOTION,chase,197,1,200,0,5000,yes,self,always,0,19,0x81,,,,,
 1126,Goblin@NPC_EMOTION,idle,197,1,2000,0,5000,yes,self,always,0,2,0x308D,,,,,
 1126,Goblin@NPC_EMOTION,idle,197,1,2000,0,5000,yes,self,always,0,2,0x308D,,,,,
-1126,GoblinNPC_WATERATTACK,attack,184,2,500,500,5000,no,target,always,0,,,,,,,
+1126,Goblin@NPC_WATERATTACK,attack,184,2,500,500,5000,no,target,always,0,,,,,,,
 1127,Hode@AS_CLOAKING,attack,135,1,2000,200,5000,yes,self,always,0,,,,,,,
 1127,Hode@AS_CLOAKING,attack,135,1,2000,200,5000,yes,self,always,0,,,,,,,
 1127,Hode@AS_CLOAKING,chase,135,1,2000,200,5000,yes,self,always,0,,,,,,,
 1127,Hode@AS_CLOAKING,chase,135,1,2000,200,5000,yes,self,always,0,,,,,,,
 1127,Hode@NPC_GROUNDATTACK,attack,185,3,500,500,5000,no,target,always,0,,,,,,6,
 1127,Hode@NPC_GROUNDATTACK,attack,185,3,500,500,5000,no,target,always,0,,,,,,6,
@@ -1618,10 +1618,10 @@
 1372,Goat@NPC_STUNATTACK,attack,179,3,500,1500,5000,no,target,always,0,,,,,,6,
 1372,Goat@NPC_STUNATTACK,attack,179,3,500,1500,5000,no,target,always,0,,,,,,6,
 1373,Lord of Death@AL_DECAGI,chase,30,10,2000,0,60000,no,target,always,0,,,,,,,
 1373,Lord of Death@AL_DECAGI,chase,30,10,2000,0,60000,no,target,always,0,,,,,,,
 1373,Lord of Death@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,,
 1373,Lord of Death@AL_TELEPORT,idle,26,1,10000,0,0,yes,self,rudeattacked,,,,,,,,
-1373,Lord of the Dead@NPC_POWERUP,attack,349,5,10000,0,30000,yes,self,myhpltmaxrate,30,,,,,,6,
-1373,Lord of the Dead@NPC_HELLJUDGEMENT,chase,662,10,10000,1000,10000,no,self,always,0,,,,,,36,
-1373,Lord of the Dead@NPC_HELLJUDGEMENT,attack,662,10,10000,1000,10000,no,self,always,0,,,,,,36,
-1373,Lord of the Dead@KN_BRANDISHSPEAR,attack,57,20,2000,500,5000,no,target,always,0,,,,,,,
+1373,Lord of Death@NPC_POWERUP,attack,349,5,10000,0,30000,yes,self,myhpltmaxrate,30,,,,,,6,
+1373,Lord of Death@NPC_HELLJUDGEMENT,chase,662,10,10000,1000,10000,no,self,always,0,,,,,,36,
+1373,Lord of Death@NPC_HELLJUDGEMENT,attack,662,10,10000,1000,10000,no,self,always,0,,,,,,36,
+1373,Lord of Death@KN_BRANDISHSPEAR,attack,57,20,2000,500,5000,no,target,always,0,,,,,,,
 1373,Lord of Death@NPC_DARKSTRIKE,chase,340,10,2000,0,5000,yes,target,always,0,,,,,,,
 1373,Lord of Death@NPC_DARKSTRIKE,chase,340,10,2000,0,5000,yes,target,always,0,,,,,,,
 1373,Lord of Death@NPC_CHANGEUNDEAD,attack,348,1,2000,0,5000,no,target,always,0,,,,,,,
 1373,Lord of Death@NPC_CHANGEUNDEAD,attack,348,1,2000,0,5000,no,target,always,0,,,,,,,
 1373,Lord of Death@NPC_AGIUP,attack,350,5,10000,0,120000,yes,self,myhpltmaxrate,30,,,,,,6,
 1373,Lord of Death@NPC_AGIUP,attack,350,5,10000,0,120000,yes,self,myhpltmaxrate,30,,,,,,6,
@@ -2831,7 +2831,7 @@
 1634,Seyren Windsor@LK_SPIRALPIERCE,chase,397,5,2000,0,5000,yes,target,always,0,,,,,,,
 1634,Seyren Windsor@LK_SPIRALPIERCE,chase,397,5,2000,0,5000,yes,target,always,0,,,,,,,
 1634,Seyren Windsor@LK_SPIRALPIERCE,attack,397,5,2000,0,5000,yes,target,always,0,,,,,,,
 1634,Seyren Windsor@LK_SPIRALPIERCE,attack,397,5,2000,0,5000,yes,target,always,0,,,,,,,
 1634,Seyren Windsor@KN_SPEARBOOMERANG,chase,59,5,10000,0,0,yes,target,skillused,18,,,,,,6,
 1634,Seyren Windsor@KN_SPEARBOOMERANG,chase,59,5,10000,0,0,yes,target,skillused,18,,,,,,6,
-//1634,Seyren@KN_BOWLINGBASH,attack,62,5,1000,0,10000,yes,target,always,0,,,,,,,
+//1634,Seyren Windsor@KN_BOWLINGBASH,attack,62,5,1000,0,10000,yes,target,always,0,,,,,,,
 1634,Seyren Windsor@SM_BASH,attack,5,10,1000,0,5000,yes,target,always,0,,,,,,,
 1634,Seyren Windsor@SM_BASH,attack,5,10,1000,0,5000,yes,target,always,0,,,,,,,
 1634,Seyren Windsor@SM_MAGNUM,attack,7,9,1000,0,0,yes,self,attackpcge,2,,,,,,,
 1634,Seyren Windsor@SM_MAGNUM,attack,7,9,1000,0,0,yes,self,attackpcge,2,,,,,,,
 1634,Seyren Windsor@NPC_POWERUP,attack,349,5,2000,0,100000,yes,self,always,0,,,,,,,
 1634,Seyren Windsor@NPC_POWERUP,attack,349,5,2000,0,100000,yes,self,always,0,,,,,,,

+ 63 - 8
db/packet_db.txt

@@ -1452,23 +1452,23 @@ packet_ver: 25
 //0x0801,-1
 //0x0801,-1
 
 
 //2009-12-22aRagexeRE
 //2009-12-22aRagexeRE
-//0x0802,18
+0x0802,18		// Booking System
 //0x0803,4
 //0x0803,4
-//0x0804,8
+0x0804,8		// Booking System
 //0x0805,-1
 //0x0805,-1
-//0x0806,4
+0x0806,4		// Booking System
 //0x0807,2
 //0x0807,2
-//0x0808,4
+0x0808,4		// Booking System
 //0x0809,14
 //0x0809,14
 //0x080A,50
 //0x080A,50
 //0x080B,18
 //0x080B,18
 //0x080C,6
 //0x080C,6
 
 
 //2009-12-29aRagexeRE
 //2009-12-29aRagexeRE
-//0x0804,14
-//0x0806,2
+0x0804,14		// Booking System
+0x0806,2		// Booking System
 //0x0807,4
 //0x0807,4
-//0x0808,14
+0x0808,14		// Booking System
 //0x0809,50
 //0x0809,50
 //0x080A,18
 //0x080A,18
 //0x080B,6
 //0x080B,6
@@ -1479,7 +1479,7 @@ packet_ver: 25
 //2010-01-26aRagexeRE
 //2010-01-26aRagexeRE
 //0x080C,2
 //0x080C,2
 //0x080D,3
 //0x080D,3
-//0x080E,14
+0x080E,14
 
 
 //2010-02-09aRagexeRE
 //2010-02-09aRagexeRE
 //0x07F0,6
 //0x07F0,6
@@ -1527,5 +1527,60 @@ packet_ver: 25
 //2010-04-14dRagexeRE
 //2010-04-14dRagexeRE
 //0x081B,8
 //0x081B,8
 
 
+//2010-04-20aRagexeRE
+//0x0812,8
+//0x0814,86
+//0x0815,2
+//0x0817,6
+//0x0819,-1
+//0x081a,4
+//0x081b,10
+//0x081c,10
+//0x0824,6
+
+//2010-06-01aRagexeRE
+//0x0825,-1
+//0x0826,4
+//0x0835,-1
+//0x0836,-1
+//0x0837,3
+//0x0838,3
+
+//2010-06-08aRagexeRE
+//0x0838,2
+//0x0839,66
+//0x083A,4 	// Search Stalls Feature
+//0x083B,2
+//0x083C,12
+//0x083D,6
+
+//2010-06-15aRagexeRE
+//0x083E,26
+
+//2010-06-22aRagexeRE
+//0x083F,22
+
+//2010-06-29aRagexeRE
+0x00AA,9
+//0x07F1,18
+//0x07F2,8
+//0x07F3,6
+
+//2010-07-01aRagexeRE
+//0x083A,5 	// Search Stalls Feature
+
+//2010-07-13aRagexeRE
+//0x0827,6
+//0x0828,14
+//0x0829,6
+//0x082A,10
+//0x082B,6
+//0x082C,14
+//0x0840,-1
+//0x0841,19
+
+//2010-07-14aRagexeRE
+//0x841,4
+
 //Add new packets here
 //Add new packets here
 //packet_ver: 26
 //packet_ver: 26

+ 7 - 3
src/char/char.c

@@ -790,7 +790,7 @@ int mmo_char_fromstr(char *str, struct mmo_charstatus *p, struct global_reg *reg
 			p->inventory[i].refine = tmp_int[5];
 			p->inventory[i].refine = tmp_int[5];
 			p->inventory[i].attribute = tmp_int[6];
 			p->inventory[i].attribute = tmp_int[6];
 
 
-			for(j = 0; j < MAX_SLOTS && tmp_str[0] && sscanf(tmp_str[0], ",%d%[0-9,-]",&tmp_int[0], tmp_str[0]) > 0; j++)
+			for(j = 0; j < MAX_SLOTS && tmp_str[0][0] && sscanf(tmp_str[0], ",%d%[0-9,-]",&tmp_int[0], tmp_str[0]) > 0; j++)
 				p->inventory[i].card[j] = tmp_int[0];
 				p->inventory[i].card[j] = tmp_int[0];
 
 
 			next += len;
 			next += len;
@@ -814,7 +814,7 @@ int mmo_char_fromstr(char *str, struct mmo_charstatus *p, struct global_reg *reg
 			p->cart[i].refine = tmp_int[5];
 			p->cart[i].refine = tmp_int[5];
 			p->cart[i].attribute = tmp_int[6];
 			p->cart[i].attribute = tmp_int[6];
 			
 			
-			for(j = 0; j < MAX_SLOTS && tmp_str && sscanf(tmp_str[0], ",%d%[0-9,-]",&tmp_int[0], tmp_str[0]) > 0; j++)
+			for(j = 0; j < MAX_SLOTS && tmp_str[0][0] && sscanf(tmp_str[0], ",%d%[0-9,-]",&tmp_int[0], tmp_str[0]) > 0; j++)
 				p->cart[i].card[j] = tmp_int[0];
 				p->cart[i].card[j] = tmp_int[0];
 			
 			
 			next += len;
 			next += len;
@@ -1735,6 +1735,10 @@ int mmo_char_tobuf(uint8* buffer, struct mmo_charstatus* p)
 #if PACKETVER >= 20061023
 #if PACKETVER >= 20061023
 	WBUFW(buf,106) = ( p->rename > 0 ) ? 0 : 1;
 	WBUFW(buf,106) = ( p->rename > 0 ) ? 0 : 1;
 	offset += 2;
 	offset += 2;
+#endif
+#if PACKETVER >= 20100721
+	mapindex_getmapname_ext(mapindex_id2name(p->last_point.map), (char*)WBUFP(buf,108));
+	offset += 16;
 #endif
 #endif
 	return 106+offset;
 	return 106+offset;
 }
 }
@@ -1747,7 +1751,7 @@ int mmo_char_send006b(int fd, struct char_session_data* sd)
 	int i, j, found_num, offset = 0;
 	int i, j, found_num, offset = 0;
 #if PACKETVER >= 20100413
 #if PACKETVER >= 20100413
 	offset += 3;
 	offset += 3;
-#endif;
+#endif
 
 
 	found_num = 0;
 	found_num = 0;
 	for(i = 0; i < char_num; i++) {
 	for(i = 0; i < char_num; i++) {

+ 2 - 2
src/char/int_storage.c

@@ -80,7 +80,7 @@ bool storage_fromstr(char* str, int* account_id, struct storage_data* p)
 		p->items[i].refine = tmp_int[5];
 		p->items[i].refine = tmp_int[5];
 		p->items[i].attribute = tmp_int[6];
 		p->items[i].attribute = tmp_int[6];
 			
 			
-		for(j = 0; j < MAX_SLOTS && tmp_str && sscanf(tmp_str, ",%d%[0-9,-]",&tmp_int[0], tmp_str) > 0; j++)
+		for(j = 0; j < MAX_SLOTS && tmp_str[0] && sscanf(tmp_str, ",%d%[0-9,-]",&tmp_int[0], tmp_str) > 0; j++)
 			p->items[i].card[j] = tmp_int[0];
 			p->items[i].card[j] = tmp_int[0];
 			
 			
 		next += len;
 		next += len;
@@ -145,7 +145,7 @@ int guild_storage_fromstr(char *str,struct guild_storage *p)
 			p->storage_[i].identify = tmp_int[4];
 			p->storage_[i].identify = tmp_int[4];
 			p->storage_[i].refine = tmp_int[5];
 			p->storage_[i].refine = tmp_int[5];
 			p->storage_[i].attribute = tmp_int[6];
 			p->storage_[i].attribute = tmp_int[6];
-			for(j = 0; j < MAX_SLOTS && tmp_str && sscanf(tmp_str, ",%d%[0-9,-]",&tmp_int[0], tmp_str) > 0; j++)
+			for(j = 0; j < MAX_SLOTS && tmp_str[0] && sscanf(tmp_str, ",%d%[0-9,-]",&tmp_int[0], tmp_str) > 0; j++)
 				p->storage_[i].card[j] = tmp_int[0];
 				p->storage_[i].card[j] = tmp_int[0];
 			next += len;
 			next += len;
 			if (str[next] == ' ')
 			if (str[next] == ' ')

+ 4 - 0
src/char_sql/char.c

@@ -1595,6 +1595,10 @@ int mmo_char_tobuf(uint8* buffer, struct mmo_charstatus* p)
 #if PACKETVER >= 20061023
 #if PACKETVER >= 20061023
 	WBUFW(buf,106) = ( p->rename > 0 ) ? 0 : 1;
 	WBUFW(buf,106) = ( p->rename > 0 ) ? 0 : 1;
 	offset+=2;
 	offset+=2;
+#endif
+#if PACKETVER >= 20100721
+	mapindex_getmapname_ext(mapindex_id2name(p->last_point.map), (char*)WBUFP(buf,108));
+	offset += 16;
 #endif
 #endif
 	return 106+offset;
 	return 106+offset;
 }
 }

+ 7 - 1
src/common/mmo.h

@@ -21,6 +21,7 @@
 // 20070821 - 2007-08-21aSakexe+   - 0x2c5
 // 20070821 - 2007-08-21aSakexe+   - 0x2c5
 // 20070918 - 2007-09-18aSakexe+   - 0x2d7, 0x2d9, 0x2da
 // 20070918 - 2007-09-18aSakexe+   - 0x2d7, 0x2d9, 0x2da
 // 20071106 - 2007-11-06aSakexe+   - 0x78, 0x7c, 0x22c
 // 20071106 - 2007-11-06aSakexe+   - 0x78, 0x7c, 0x22c
+// 20080102 - 2008-01-02aSakexe+   - 0x2ec, 0x2ed , 0x2ee
 // 20081126 - 2008-11-26aSakexe+   - 0x1a2
 // 20081126 - 2008-11-26aSakexe+   - 0x1a2
 // 20090408 - 2009-04-08aSakexe+   - 0x44a (dont use as it overlaps with RE client packets)
 // 20090408 - 2009-04-08aSakexe+   - 0x44a (dont use as it overlaps with RE client packets)
 // 20080827 - 2008-08-27aRagexeRE+ - First RE Client
 // 20080827 - 2008-08-27aRagexeRE+ - First RE Client
@@ -31,11 +32,16 @@
 // 20090922 - 2009-09-22aRagexeRE+ - 0x7e5, 0x7e7, 0x7e8, 0x7e9
 // 20090922 - 2009-09-22aRagexeRE+ - 0x7e5, 0x7e7, 0x7e8, 0x7e9
 // 20091103 - 2009-11-03aRagexeRE+ - 0x7f7, 0x7f8, 0x7f9
 // 20091103 - 2009-11-03aRagexeRE+ - 0x7f7, 0x7f8, 0x7f9
 // 20100105 - 2010-01-05aRagexeRE+ - 0x133, 0x800, 0x801
 // 20100105 - 2010-01-05aRagexeRE+ - 0x133, 0x800, 0x801
+// 20100126 - 2010-01-26aRagexeRE+ - 0x80e
 // 20100223 - 2010-02-23aRagexeRE+ - 0x80f
 // 20100223 - 2010-02-23aRagexeRE+ - 0x80f
+// 20100413 - 2010-04-13aRagexeRE+ - 0x6b
+// 20100629 - 2010-06-29aRagexeRE+ - 0x2d0, 0xaa, 0x2d1, 0x2d2
+// 20100721 - 2010-07-21aRagexeRE+ - 0x6b, 0x6d
+// 20100727 - 2010-07-27aRagexeRE+ - 0x6b, 0x6d
 
 
 #ifndef PACKETVER
 #ifndef PACKETVER
 	#define PACKETVER	20081126
 	#define PACKETVER	20081126
-	//#define PACKETVER 20100223
+	//#define PACKETVER 20100629
 #endif
 #endif
 // backward compatible PACKETVER 8 and 9
 // backward compatible PACKETVER 8 and 9
 #if PACKETVER == 8
 #if PACKETVER == 8

+ 212 - 76
src/map/clif.c

@@ -1801,7 +1801,11 @@ static void clif_addcards(unsigned char* buf, struct item* item)
 int clif_additem(struct map_session_data *sd, int n, int amount, int fail)
 int clif_additem(struct map_session_data *sd, int n, int amount, int fail)
 {
 {
 	int fd;
 	int fd;
-	int cmd = ((PACKETVER < 20071002) ? 0xa0 : 0x2d4);
+#if PACKETVER < 20071002
+	const int cmd = 0xa0;
+#else
+	const int cmd = 0x2d4;
+#endif
 	nullpo_retr(0, sd);
 	nullpo_retr(0, sd);
 
 
 	fd = sd->fd;
 	fd = sd->fd;
@@ -1914,11 +1918,19 @@ void clif_inventorylist(struct map_session_data *sd)
 
 
 #if PACKETVER < 5
 #if PACKETVER < 5
 	const int s = 10; //Entry size.
 	const int s = 10; //Entry size.
+#elif PACKETVER < 20080102
+	const int s = 18;
+#else
+	const int s = 22;
+#endif
+#if PACKETVER < 20071002
+	const int se = 20;
+#elif PACKETVER < 20100629
+	const int se = 26;
 #else
 #else
-	const int s = ((PACKETVER < 20080102) ? 18 : 22);
+	const int se = 28;
 #endif
 #endif
 
 
-	const int se = ((PACKETVER < 20071002) ? 20 : 26);
 	buf = (unsigned char*)aMallocA(MAX_INVENTORY * s + 4);
 	buf = (unsigned char*)aMallocA(MAX_INVENTORY * s + 4);
 	bufe = (unsigned char*)aMallocA(MAX_INVENTORY * se + 4);
 	bufe = (unsigned char*)aMallocA(MAX_INVENTORY * se + 4);
 	
 	
@@ -1932,11 +1944,16 @@ void clif_inventorylist(struct map_session_data *sd)
 			WBUFW(bufe,ne*se+4)=i+2;
 			WBUFW(bufe,ne*se+4)=i+2;
 			clif_item_sub(bufe, ne*se+6, &sd->status.inventory[i], sd->inventory_data[i], pc_equippoint(sd,i));
 			clif_item_sub(bufe, ne*se+6, &sd->status.inventory[i], sd->inventory_data[i], pc_equippoint(sd,i));
 			clif_addcards(WBUFP(bufe, ne*se+16), &sd->status.inventory[i]);
 			clif_addcards(WBUFP(bufe, ne*se+16), &sd->status.inventory[i]);
-			if( PACKETVER >= 20071002 )
-			{
-				WBUFL(bufe,ne*se+24)=sd->status.inventory[i].expire_time;
-				WBUFW(bufe,ne*se+28)=0; //Unknown
-			}
+#if PACKETVER >= 20071002
+			WBUFL(bufe,ne*se+24)=sd->status.inventory[i].expire_time;
+			WBUFW(bufe,ne*se+28)=0; //Unknown
+#endif
+#if PACKETVER >= 20100629
+			if (sd->inventory_data[i]->equip&EQP_HELM)
+				WBUFW(bufe,ne*se+30)= sd->inventory_data[i]->look;
+			else
+				WBUFW(bufe,ne*se+30)=0;
+#endif
 			ne++;
 			ne++;
 		}
 		}
 		else
 		else
@@ -1958,8 +1975,10 @@ void clif_inventorylist(struct map_session_data *sd)
 	{
 	{
 #if PACKETVER < 5
 #if PACKETVER < 5
 		WBUFW(buf,0)=0xa3;
 		WBUFW(buf,0)=0xa3;
+#elif PACKETVER < 20080102
+		WBUFW(buf,0)=0x1ee;
 #else
 #else
-		WBUFW(buf,0)=((PACKETVER < 20080102) ? 0x1ee : 0x2e8);
+		WBUFW(buf,0)=0x2e8;
 #endif
 #endif
 		WBUFW(buf,2)=4+n*s;
 		WBUFW(buf,2)=4+n*s;
 		clif_send(buf, WBUFW(buf,2), &sd->bl, SELF);
 		clif_send(buf, WBUFW(buf,2), &sd->bl, SELF);
@@ -1969,7 +1988,11 @@ void clif_inventorylist(struct map_session_data *sd)
 
 
 	if( ne )
 	if( ne )
 	{
 	{
-		WBUFW(bufe,0)=((PACKETVER < 20071002) ? 0xa4 : 0x2d0);
+#if PACKETVER < 20071002
+		WBUFW(bufe,0)=0xa4;
+#else
+		WBUFW(bufe,0)=0x2d0;
+#endif
 		WBUFW(bufe,2)=4+ne*se;
 		WBUFW(bufe,2)=4+ne*se;
 		clif_send(bufe, WBUFW(bufe,2), &sd->bl, SELF);
 		clif_send(bufe, WBUFW(bufe,2), &sd->bl, SELF);
 	}
 	}
@@ -1983,7 +2006,14 @@ void clif_equiplist(struct map_session_data *sd)
 {
 {
 	int i,n,fd = sd->fd;
 	int i,n,fd = sd->fd;
 	unsigned char *buf;
 	unsigned char *buf;
-	const int cmd = ((PACKETVER < 20071002) ? 20 : 26);
+#if PACKETVER < 20071002
+	const int cmd = 20;
+#elif PACKETVER < 20100629
+	const int cmd = 26;
+#else
+	const int cmd = 28;
+#endif
+
 	WFIFOHEAD(fd, MAX_INVENTORY * cmd + 4);
 	WFIFOHEAD(fd, MAX_INVENTORY * cmd + 4);
 	buf = WFIFOP(fd,0);
 	buf = WFIFOP(fd,0);
 
 
@@ -1997,15 +2027,18 @@ void clif_equiplist(struct map_session_data *sd)
 		WBUFW(buf,n*cmd+4)=i+2;
 		WBUFW(buf,n*cmd+4)=i+2;
 		clif_item_sub(buf, n*cmd+6, &sd->status.inventory[i], sd->inventory_data[i], pc_equippoint(sd,i));
 		clif_item_sub(buf, n*cmd+6, &sd->status.inventory[i], sd->inventory_data[i], pc_equippoint(sd,i));
 		clif_addcards(WBUFP(buf, n*cmd+16), &sd->status.inventory[i]);
 		clif_addcards(WBUFP(buf, n*cmd+16), &sd->status.inventory[i]);
-		if(PACKETVER >= 20071002)
-		{
-			WBUFL(buf,n*cmd+24)=sd->status.inventory[i].expire_time;
-			WBUFW(buf,n*cmd+28)=0; //Unknown
-		}
+#if PACKETVER >= 20071002
+		WBUFL(buf,n*cmd+24)=sd->status.inventory[i].expire_time;
+		WBUFW(buf,n*cmd+28)=0; //Unknown
+#endif
 		n++;
 		n++;
 	}
 	}
 	if (n) {
 	if (n) {
-		WBUFW(buf,0)=((PACKETVER < 20071002) ? 0xa4 : 0x2d0);
+#if PACKETVER < 20071002
+		WBUFW(buf,0)=0xa4;
+#else
+		WBUFW(buf,0)=0x2d0;
+#endif
 		WBUFW(buf,2)=4+n*cmd;
 		WBUFW(buf,2)=4+n*cmd;
 		WFIFOSET(fd,WFIFOW(fd,2));
 		WFIFOSET(fd,WFIFOW(fd,2));
 	}
 	}
@@ -2019,11 +2052,19 @@ void clif_storagelist(struct map_session_data* sd, struct storage_data* stor)
 	unsigned char *bufe;
 	unsigned char *bufe;
 #if PACKETVER < 5
 #if PACKETVER < 5
 	const int s = 10; //Entry size.
 	const int s = 10; //Entry size.
+#elfi PACKETVER < 20080102
+	const int s = 18;
 #else
 #else
-	const int s = ((PACKETVER < 20080102) ? 18 : 22);
+	const int s = 22;
+#endif
+#if PACKETVER < 20071002
+	const int cmd = 20;
+#elif PACKETVER < 20100629
+	const int cmd = 26;
+#else
+	const int cmd = 28;
 #endif
 #endif
 
 
-	const int cmd = ((PACKETVER < 20071002) ? 20 : 26);
 	buf = (unsigned char*)aMallocA(MAX_STORAGE * s + 4);
 	buf = (unsigned char*)aMallocA(MAX_STORAGE * s + 4);
 	bufe = (unsigned char*)aMallocA(MAX_STORAGE * cmd + 4);
 	bufe = (unsigned char*)aMallocA(MAX_STORAGE * cmd + 4);
 
 
@@ -2037,11 +2078,10 @@ void clif_storagelist(struct map_session_data* sd, struct storage_data* stor)
 			WBUFW(bufe,ne*cmd+4)=i+1;
 			WBUFW(bufe,ne*cmd+4)=i+1;
 			clif_item_sub(bufe, ne*cmd+6, &stor->items[i], id, id->equip);
 			clif_item_sub(bufe, ne*cmd+6, &stor->items[i], id, id->equip);
 			clif_addcards(WBUFP(bufe, ne*cmd+16), &stor->items[i]);
 			clif_addcards(WBUFP(bufe, ne*cmd+16), &stor->items[i]);
-			if( PACKETVER >= 20071002 )
-			{
-				WBUFL(bufe,ne*cmd+24)=stor->items[i].expire_time;
-				WBUFW(bufe,ne*cmd+28)=0; //Unknown
-			}
+#if PACKETVER >= 20071002
+			WBUFL(bufe,ne*cmd+24)=stor->items[i].expire_time;
+			WBUFW(bufe,ne*cmd+28)=0; //Unknown
+#endif
 			ne++;
 			ne++;
 		}
 		}
 		else
 		else
@@ -2061,15 +2101,21 @@ void clif_storagelist(struct map_session_data* sd, struct storage_data* stor)
 	{
 	{
 #if PACKETVER < 5
 #if PACKETVER < 5
 		WBUFW(buf,0)=0xa5;
 		WBUFW(buf,0)=0xa5;
+#elif PACKETVER < 20080102
+		WBUFW(buf,0)=0x1f0;
 #else
 #else
-		WBUFW(buf,0)=((PACKETVER < 20080102) ? 0x1f0 : 0x2ea);
+		WBUFW(buf,0)=0x2ea;
 #endif
 #endif
 		WBUFW(buf,2)=4+n*s;
 		WBUFW(buf,2)=4+n*s;
 		clif_send(buf, WBUFW(buf,2), &sd->bl, SELF);
 		clif_send(buf, WBUFW(buf,2), &sd->bl, SELF);
 	}
 	}
 	if( ne )
 	if( ne )
 	{
 	{
-		WBUFW(bufe,0)=((PACKETVER < 20071002) ? 0xa6 : 0x2d1);
+#if PACKETVER < 20071002
+		WBUFW(bufe,0)=0xa6;
+#else
+		WBUFW(bufe,0)=0x2d1;
+#endif
 		WBUFW(bufe,2)=4+ne*cmd;
 		WBUFW(bufe,2)=4+ne*cmd;
 		clif_send(bufe, WBUFW(bufe,2), &sd->bl, SELF);
 		clif_send(bufe, WBUFW(bufe,2), &sd->bl, SELF);
 	}
 	}
@@ -2087,11 +2133,19 @@ void clif_guildstoragelist(struct map_session_data *sd,struct guild_storage *sto
 	unsigned char *bufe;
 	unsigned char *bufe;
 #if PACKETVER < 5
 #if PACKETVER < 5
 	const int s = 10; //Entry size.
 	const int s = 10; //Entry size.
+#elif PACKETVER < 20080102
+	const int s = 18;
+#else
+	const int s = 22;
+#endif
+#if PACKETVER < 20071002
+	const int cmd = 20;
+#elif PACKETVER < 20100629
+	const int cmd = 26;
 #else
 #else
-	const int s = ((PACKETVER < 20080102) ? 18 : 22);
+	const int cmd = 28;
 #endif
 #endif
 
 
-	const int cmd = ((PACKETVER < 20071002) ? 20 : 26);
 	buf = (unsigned char*)aMallocA(MAX_GUILD_STORAGE * s + 4);
 	buf = (unsigned char*)aMallocA(MAX_GUILD_STORAGE * s + 4);
 	bufe = (unsigned char*)aMallocA(MAX_GUILD_STORAGE * cmd + 4);
 	bufe = (unsigned char*)aMallocA(MAX_GUILD_STORAGE * cmd + 4);
 
 
@@ -2105,11 +2159,10 @@ void clif_guildstoragelist(struct map_session_data *sd,struct guild_storage *sto
 			WBUFW(bufe,ne*cmd+4)=i+1;
 			WBUFW(bufe,ne*cmd+4)=i+1;
 			clif_item_sub(bufe, ne*cmd+6, &stor->storage_[i], id, id->equip);
 			clif_item_sub(bufe, ne*cmd+6, &stor->storage_[i], id, id->equip);
 			clif_addcards(WBUFP(bufe, ne*cmd+16), &stor->storage_[i]);
 			clif_addcards(WBUFP(bufe, ne*cmd+16), &stor->storage_[i]);
-			if( PACKETVER >= 20071002 )
-			{
-				WBUFL(bufe,ne*cmd+24)=stor->storage_[i].expire_time;
-				WBUFW(bufe,ne*cmd+28)=0; //Unknown
-			}
+#if PACKETVER >= 20071002
+			WBUFL(bufe,ne*cmd+24)=stor->storage_[i].expire_time;
+			WBUFW(bufe,ne*cmd+28)=0; //Unknown
+#endif
 			ne++;
 			ne++;
 		}
 		}
 		else
 		else
@@ -2129,15 +2182,21 @@ void clif_guildstoragelist(struct map_session_data *sd,struct guild_storage *sto
 	{
 	{
 #if PACKETVER < 5
 #if PACKETVER < 5
 		WBUFW(buf,0)=0xa5;
 		WBUFW(buf,0)=0xa5;
+#elif PACKETVER < 20080102
+		WBUFW(buf,0)=0x1f0;
 #else
 #else
-		WBUFW(buf,0)=((PACKETVER < 20080102) ? 0x1f0 : 0x2ea);
+		WBUFW(buf,0)=0x2ea;
 #endif
 #endif
 		WBUFW(buf,2)=4+n*s;
 		WBUFW(buf,2)=4+n*s;
 		clif_send(buf, WBUFW(buf,2), &sd->bl, SELF);
 		clif_send(buf, WBUFW(buf,2), &sd->bl, SELF);
 	}
 	}
 	if( ne )
 	if( ne )
 	{
 	{
-		WBUFW(bufe,0)=((PACKETVER < 20071002) ? 0xa6 : 0x2d1);
+#if PACKETVER < 20071002
+		WBUFW(bufe,0)=0xa6;
+#else
+		WBUFW(bufe,0)=0x2d1;
+#endif
 		WBUFW(bufe,2)=4+ne*cmd;
 		WBUFW(bufe,2)=4+ne*cmd;
 		clif_send(bufe, WBUFW(bufe,2), &sd->bl, SELF);
 		clif_send(bufe, WBUFW(bufe,2), &sd->bl, SELF);
 	}
 	}
@@ -2154,11 +2213,19 @@ void clif_cartlist(struct map_session_data *sd)
 	unsigned char *bufe;
 	unsigned char *bufe;
 #if PACKETVER < 5
 #if PACKETVER < 5
 	const int s = 10; //Entry size.
 	const int s = 10; //Entry size.
+#elif PACKETVER < 20080102
+	const int s = 18;
+#else
+	const int s = 22;
+#endif
+#if PACKETVER < 20071002
+	const int cmd = 20;
+#elif PACKETVER < 20100629
+	const int cmd = 26;
 #else
 #else
-	const int s = ((PACKETVER < 20080102) ? 18 : 22);
+	const int cmd = 28;
 #endif
 #endif
 
 
-	const int cmd = ((PACKETVER<20071002)?20:26);
 	buf = (unsigned char*)aMallocA(MAX_CART * s + 4);
 	buf = (unsigned char*)aMallocA(MAX_CART * s + 4);
 	bufe = (unsigned char*)aMallocA(MAX_CART * cmd + 4);
 	bufe = (unsigned char*)aMallocA(MAX_CART * cmd + 4);
 	
 	
@@ -2172,11 +2239,10 @@ void clif_cartlist(struct map_session_data *sd)
 			WBUFW(bufe,ne*cmd+4)=i+2;
 			WBUFW(bufe,ne*cmd+4)=i+2;
 			clif_item_sub(bufe, ne*cmd+6, &sd->status.cart[i], id, id->equip);
 			clif_item_sub(bufe, ne*cmd+6, &sd->status.cart[i], id, id->equip);
 			clif_addcards(WBUFP(bufe, ne*cmd+16), &sd->status.cart[i]);
 			clif_addcards(WBUFP(bufe, ne*cmd+16), &sd->status.cart[i]);
-			if(PACKETVER >= 20071002)
-			{
-				WBUFL(bufe,ne*cmd+24)=sd->status.cart[i].expire_time;
-				WBUFW(bufe,ne*cmd+28)=0; //Unknown
-			}
+#if PACKETVER >= 20071002
+			WBUFL(bufe,ne*cmd+24)=sd->status.cart[i].expire_time;
+			WBUFW(bufe,ne*cmd+28)=0; //Unknown
+#endif
 			ne++;
 			ne++;
 		}
 		}
 		else
 		else
@@ -2196,15 +2262,21 @@ void clif_cartlist(struct map_session_data *sd)
 	{
 	{
 #if PACKETVER < 5
 #if PACKETVER < 5
 		WBUFW(buf,0)=0x123;
 		WBUFW(buf,0)=0x123;
+#elif PACKETVER < 20080102
+		WBUFW(buf,0)=0x1ef;
 #else
 #else
-		WBUFW(buf,0)=((PACKETVER < 20080102) ? 0x1ef : 0x2e9);
+		WBUFW(buf,0)=0x2e9;
 #endif
 #endif
 		WBUFW(buf,2)=4+n*s;
 		WBUFW(buf,2)=4+n*s;
 		clif_send(buf, WBUFW(buf,2), &sd->bl, SELF);
 		clif_send(buf, WBUFW(buf,2), &sd->bl, SELF);
 	}
 	}
 	if( ne )
 	if( ne )
 	{
 	{
-		WBUFW(bufe,0)=((PACKETVER < 20071002) ? 0x122 : 0x2d2);
+#if PACKETVER < 20071002
+	WBUFW(bufe,0)=0x122;
+#else
+	WBUFW(bufe,0)=0x2d2;
+#endif
 		WBUFW(bufe,2)=4+ne*cmd;
 		WBUFW(bufe,2)=4+ne*cmd;
 		clif_send(bufe, WBUFW(bufe,2), &sd->bl, SELF);
 		clif_send(bufe, WBUFW(bufe,2), &sd->bl, SELF);
 	}
 	}
@@ -2842,7 +2914,15 @@ int clif_equipitemack(struct map_session_data *sd,int n,int pos,int ok)
 	WFIFOW(fd,0)=0xaa;
 	WFIFOW(fd,0)=0xaa;
 	WFIFOW(fd,2)=n+2;
 	WFIFOW(fd,2)=n+2;
 	WFIFOW(fd,4)=pos;
 	WFIFOW(fd,4)=pos;
+#if PACKETVER < 20100629
 	WFIFOB(fd,6)=ok;
 	WFIFOB(fd,6)=ok;
+#else
+	if (ok && sd->inventory_data[n]->equip&EQP_HELM)
+		WFIFOW(fd,6)=sd->inventory_data[n]->look;
+	else
+		WFIFOW(fd,6)=0;
+	WFIFOB(fd,8)=ok;
+#endif
 	WFIFOSET(fd,packet_len(0xaa));
 	WFIFOSET(fd,packet_len(0xaa));
 
 
 	return 0;
 	return 0;
@@ -5938,11 +6018,17 @@ int clif_party_xy_single(int fd, struct map_session_data *sd)
 int clif_party_hp(struct map_session_data *sd)
 int clif_party_hp(struct map_session_data *sd)
 {
 {
 	unsigned char buf[16];
 	unsigned char buf[16];
+#if PACKETVER < 20100126
+	const int cmd = 0x106;
+#else
+	const int cmd = 0x80e;
+#endif
 
 
 	nullpo_retr(0, sd);
 	nullpo_retr(0, sd);
 
 
-	WBUFW(buf,0)=0x106;
+	WBUFW(buf,0)=cmd;
 	WBUFL(buf,2)=sd->status.account_id;
 	WBUFL(buf,2)=sd->status.account_id;
+#if PACKETVER < 20100126
 	if (sd->battle_status.max_hp > SHRT_MAX) { //To correctly display the %hp bar. [Skotlex]
 	if (sd->battle_status.max_hp > SHRT_MAX) { //To correctly display the %hp bar. [Skotlex]
 		WBUFW(buf,6) = sd->battle_status.hp/(sd->battle_status.max_hp/100);
 		WBUFW(buf,6) = sd->battle_status.hp/(sd->battle_status.max_hp/100);
 		WBUFW(buf,8) = 100;
 		WBUFW(buf,8) = 100;
@@ -5950,7 +6036,11 @@ int clif_party_hp(struct map_session_data *sd)
 		WBUFW(buf,6) = sd->battle_status.hp;
 		WBUFW(buf,6) = sd->battle_status.hp;
 		WBUFW(buf,8) = sd->battle_status.max_hp;
 		WBUFW(buf,8) = sd->battle_status.max_hp;
 	}
 	}
-	clif_send(buf,packet_len(0x106),&sd->bl,PARTY_AREA_WOS);
+#else
+	WBUFL(buf,6) = sd->battle_status.hp;
+	WBUFL(buf,10) = sd->battle_status.max_hp;
+#endif
+	clif_send(buf,packet_len(cmd),&sd->bl,PARTY_AREA_WOS);
 	return 0;
 	return 0;
 }
 }
 
 
@@ -5959,9 +6049,15 @@ int clif_party_hp(struct map_session_data *sd)
  *------------------------------------------*/
  *------------------------------------------*/
 void clif_hpmeter_single(int fd, int id, unsigned int hp, unsigned int maxhp)
 void clif_hpmeter_single(int fd, int id, unsigned int hp, unsigned int maxhp)
 {
 {
-	WFIFOHEAD(fd,packet_len(0x106));
-	WFIFOW(fd,0) = 0x106;
+#if PACKETVER < 20100126
+	const int cmd = 0x106;
+#else
+	const int cmd = 0x80e;
+#endif
+	WFIFOHEAD(fd,packet_len(cmd));
+	WFIFOW(fd,0) = cmd;
 	WFIFOL(fd,2) = id;
 	WFIFOL(fd,2) = id;
+#if PACKETVER < 20100126
 	if( maxhp > SHRT_MAX )
 	if( maxhp > SHRT_MAX )
 	{// To correctly display the %hp bar. [Skotlex]
 	{// To correctly display the %hp bar. [Skotlex]
 		WFIFOW(fd,6) = hp/(maxhp/100);
 		WFIFOW(fd,6) = hp/(maxhp/100);
@@ -5970,7 +6066,11 @@ void clif_hpmeter_single(int fd, int id, unsigned int hp, unsigned int maxhp)
 		WFIFOW(fd,6) = hp;
 		WFIFOW(fd,6) = hp;
 		WFIFOW(fd,8) = maxhp;
 		WFIFOW(fd,8) = maxhp;
 	}
 	}
-	WFIFOSET(fd, packet_len(0x106));
+#else
+	WFIFOL(fd,6) = hp;
+	WFIFOL(fd,10) = maxhp;
+#endif
+	WFIFOSET(fd, packet_len(cmd));
 }
 }
 
 
 /*==========================================
 /*==========================================
@@ -5980,6 +6080,11 @@ int clif_hpmeter_sub(struct block_list *bl, va_list ap)
 {
 {
 	struct map_session_data *sd, *tsd;
 	struct map_session_data *sd, *tsd;
 	int level;
 	int level;
+#if PACKETVER < 20100126
+	const int cmd = 0x106;
+#else
+	const int cmd = 0x80e;
+#endif
 
 
 	sd = va_arg(ap, struct map_session_data *);
 	sd = va_arg(ap, struct map_session_data *);
 	tsd = (TBL_PC *)bl;
 	tsd = (TBL_PC *)bl;
@@ -5990,21 +6095,25 @@ int clif_hpmeter_sub(struct block_list *bl, va_list ap)
 	if( !tsd->fd || tsd == sd )
 	if( !tsd->fd || tsd == sd )
 		return 0;
 		return 0;
 
 
-	if( (level = pc_isGM(tsd)) >= battle_config.disp_hpmeter && level >= pc_isGM(sd) )
-	{
-		WFIFOHEAD(tsd->fd,packet_len(0x106));
-		WFIFOW(tsd->fd,0) = 0x106;
-		WFIFOL(tsd->fd,2) = sd->status.account_id;
-		if( sd->battle_status.max_hp > SHRT_MAX )
-		{ //To correctly display the %hp bar. [Skotlex]
-			WFIFOW(tsd->fd,6) = sd->battle_status.hp/(sd->battle_status.max_hp/100);
-			WFIFOW(tsd->fd,8) = 100;
-		} else {
-			WFIFOW(tsd->fd,6) = sd->battle_status.hp;
-			WFIFOW(tsd->fd,8) = sd->battle_status.max_hp;
-		}
-		WFIFOSET(tsd->fd,packet_len(0x106));
+	if( (level = pc_isGM(tsd)) < battle_config.disp_hpmeter || level < pc_isGM(sd) )
+		return 0;
+	WFIFOHEAD(tsd->fd,packet_len(cmd));
+	WFIFOW(tsd->fd,0) = cmd;
+	WFIFOL(tsd->fd,2) = sd->status.account_id;
+#if PACKETVER < 20100126
+	if( sd->battle_status.max_hp > SHRT_MAX )
+	{ //To correctly display the %hp bar. [Skotlex]
+		WFIFOW(tsd->fd,6) = sd->battle_status.hp/(sd->battle_status.max_hp/100);
+		WFIFOW(tsd->fd,8) = 100;
+	} else {
+		WFIFOW(tsd->fd,6) = sd->battle_status.hp;
+		WFIFOW(tsd->fd,8) = sd->battle_status.max_hp;
 	}
 	}
+#else
+	WFIFOL(tsd->fd,6) = sd->battle_status.hp;
+	WFIFOL(tsd->fd,10) = sd->battle_status.max_hp;
+#endif
+	WFIFOSET(tsd->fd,packet_len(cmd));
 	return 0;
 	return 0;
 }
 }
 
 
@@ -7889,23 +7998,30 @@ void clif_equipcheckbox(struct map_session_data* sd)
 /*==========================================
 /*==========================================
  * Sends info about a player's equipped items
  * Sends info about a player's equipped items
  * R 002d7 <length>.W <name>.24B <class>.w <hairstyle>.w <up-viewid>.w <mid-viewid>.w <low-viewid>.w <haircolor>.w <cloth-dye>.w <gender>.1B {equip item}.26B*
  * R 002d7 <length>.W <name>.24B <class>.w <hairstyle>.w <up-viewid>.w <mid-viewid>.w <low-viewid>.w <haircolor>.w <cloth-dye>.w <gender>.1B {equip item}.26B*
+ * for PACKETVER >= 20100629
+ * R 002d7 <length>.W <name>.24B <class>.w <hairstyle>.w <bottom-viewid>.w <mid-viewid>.w <up-viewid>.w <haircolor>.w <cloth-dye>.w <gender>.1B {equip item}.28B*
  *------------------------------------------*/
  *------------------------------------------*/
 void clif_viewequip_ack(struct map_session_data* sd, struct map_session_data* tsd)
 void clif_viewequip_ack(struct map_session_data* sd, struct map_session_data* tsd)
 {
 {
 	int i, n, fd;
 	int i, n, fd;
+#if PACKETVER < 20100629
+	const int s = 26;
+#else
+	const int s = 28;
+#endif
 	nullpo_retv(sd);
 	nullpo_retv(sd);
 	nullpo_retv(tsd);
 	nullpo_retv(tsd);
 	fd = sd->fd;
 	fd = sd->fd;
 	
 	
-	WFIFOHEAD(fd, MAX_INVENTORY * 26 + 43);
+	WFIFOHEAD(fd, MAX_INVENTORY * s + 43);
 
 
 	WFIFOW(fd, 0) = 0x2d7;
 	WFIFOW(fd, 0) = 0x2d7;
 	safestrncpy((char*)WFIFOP(fd, 4), tsd->status.name, NAME_LENGTH);
 	safestrncpy((char*)WFIFOP(fd, 4), tsd->status.name, NAME_LENGTH);
 	WFIFOW(fd,28) = tsd->status.class_;
 	WFIFOW(fd,28) = tsd->status.class_;
 	WFIFOW(fd,30) = tsd->vd.hair_style;	
 	WFIFOW(fd,30) = tsd->vd.hair_style;	
-	WFIFOW(fd,32) = tsd->vd.head_top;
+	WFIFOW(fd,32) = tsd->vd.head_bottom;
 	WFIFOW(fd,34) = tsd->vd.head_mid;
 	WFIFOW(fd,34) = tsd->vd.head_mid;
-	WFIFOW(fd,36) = tsd->vd.head_bottom;
+	WFIFOW(fd,36) = tsd->vd.head_top;
 	WFIFOW(fd,38) = tsd->vd.hair_color;
 	WFIFOW(fd,38) = tsd->vd.hair_color;
 	WFIFOW(fd,40) = tsd->vd.cloth_color;
 	WFIFOW(fd,40) = tsd->vd.cloth_color;
 	WFIFOB(fd,42) = tsd->vd.sex;
 	WFIFOB(fd,42) = tsd->vd.sex;
@@ -7914,22 +8030,28 @@ void clif_viewequip_ack(struct map_session_data* sd, struct map_session_data* ts
 	{
 	{
 		if (tsd->status.inventory[i].nameid <= 0 || tsd->inventory_data[i] == NULL)	// Item doesn't exist
 		if (tsd->status.inventory[i].nameid <= 0 || tsd->inventory_data[i] == NULL)	// Item doesn't exist
 			continue;
 			continue;
-		if (itemdb_isstackable2(tsd->inventory_data[i])) // Is not equippable
+		if (!itemdb_isequip2(tsd->inventory_data[i])) // Is not equippable
 			continue;
 			continue;
 	
 	
 		// Inventory position
 		// Inventory position
-		WFIFOW(fd, n*26+43) = i + 2;
+		WFIFOW(fd, n*s+43) = i + 2;
 		// Add refine, identify flag, element, etc.
 		// Add refine, identify flag, element, etc.
-		clif_item_sub(WFIFOP(fd,0), n*26+45, &tsd->status.inventory[i], tsd->inventory_data[i], pc_equippoint(tsd, i));
+		clif_item_sub(WFIFOP(fd,0), n*s+45, &tsd->status.inventory[i], tsd->inventory_data[i], pc_equippoint(tsd, i));
 		// Add cards
 		// Add cards
-		clif_addcards(WFIFOP(fd, n*26+55), &tsd->status.inventory[i]);	
+		clif_addcards(WFIFOP(fd, n*s+55), &tsd->status.inventory[i]);	
 		// Expiration date stuff, if all of those are set to 0 then the client doesn't show anything related (6 bytes)
 		// Expiration date stuff, if all of those are set to 0 then the client doesn't show anything related (6 bytes)
-		WFIFOL(fd, n*26+63) = tsd->status.inventory[i].expire_time;
-		WFIFOW(fd, n*26+67) = 0;
+		WFIFOL(fd, n*s+63) = tsd->status.inventory[i].expire_time;
+		WFIFOW(fd, n*s+67) = 0;
+#if PACKETVER >= 20100629
+		if (tsd->inventory_data[i]->equip&EQP_HELM)
+			WFIFOW(fd, n*s+69) = tsd->inventory_data[i]->look;
+		else
+			WFIFOW(fd, n*s+69) = 0;
+#endif
 		n++;
 		n++;
 	}
 	}
 
 
-	WFIFOW(fd, 2) = 43 + n*26;	// Set length
+	WFIFOW(fd, 2) = 43 + n*s;	// Set length
 	WFIFOSET(fd, WFIFOW(fd, 2));
 	WFIFOSET(fd, WFIFOW(fd, 2));
 }
 }
 
 
@@ -13252,10 +13374,16 @@ void clif_readbook(int fd, int book_id, int page)
 int clif_bg_hp(struct map_session_data *sd)
 int clif_bg_hp(struct map_session_data *sd)
 {
 {
 	unsigned char buf[16];
 	unsigned char buf[16];
+#if PACKETVER < 20100126
+	const int cmd = 0x106;
+#else
+	const int cmd = 0x80e;
+#endif
 	nullpo_retr(0, sd);
 	nullpo_retr(0, sd);
 
 
-	WBUFW(buf,0)=0x106;
+	WBUFW(buf,0)=cmd;
 	WBUFL(buf,2) = sd->status.account_id;
 	WBUFL(buf,2) = sd->status.account_id;
+#if PACKETVER < 20100126
 	if( sd->battle_status.max_hp > SHRT_MAX )
 	if( sd->battle_status.max_hp > SHRT_MAX )
 	{ // To correctly display the %hp bar. [Skotlex]
 	{ // To correctly display the %hp bar. [Skotlex]
 		WBUFW(buf,6) = sd->battle_status.hp/(sd->battle_status.max_hp/100);
 		WBUFW(buf,6) = sd->battle_status.hp/(sd->battle_status.max_hp/100);
@@ -13266,7 +13394,11 @@ int clif_bg_hp(struct map_session_data *sd)
 		WBUFW(buf,6) = sd->battle_status.hp;
 		WBUFW(buf,6) = sd->battle_status.hp;
 		WBUFW(buf,8) = sd->battle_status.max_hp;
 		WBUFW(buf,8) = sd->battle_status.max_hp;
 	}
 	}
-	clif_send(buf, packet_len(0x106), &sd->bl, BG_AREA_WOS);
+#else
+		WBUFL(buf,6) = sd->battle_status.hp;
+		WBUFL(buf,10) = sd->battle_status.max_hp;
+#endif
+	clif_send(buf, packet_len(cmd), &sd->bl, BG_AREA_WOS);
 	return 0;
 	return 0;
 }
 }
 
 
@@ -13802,7 +13934,11 @@ static int packetdb_readdb(void)
 	//#0x0080
 	//#0x0080
 	    7,  3,  2,  2,  2,  5, 16, 12, 10,  7, 29,  2, -1, -1, -1,  0, // 0x8b changed to 2 (was 23)
 	    7,  3,  2,  2,  2,  5, 16, 12, 10,  7, 29,  2, -1, -1, -1,  0, // 0x8b changed to 2 (was 23)
 	    7, 22, 28,  2,  6, 30, -1, -1,  3, -1, -1,  5,  9, 17, 17,  6,
 	    7, 22, 28,  2,  6, 30, -1, -1,  3, -1, -1,  5,  9, 17, 17,  6,
+#if PACKETVER <= 20100622
 	   23,  6,  6, -1, -1, -1, -1,  8,  7,  6,  7,  4,  7,  0, -1,  6,
 	   23,  6,  6, -1, -1, -1, -1,  8,  7,  6,  7,  4,  7,  0, -1,  6,
+#else
+	   23,  6,  6, -1, -1, -1, -1,  8,  7,  6,  9,  4,  7,  0, -1,  6, // 0xaa changed to 9 (was 7)
+#endif
 	    8,  8,  3,  3, -1,  6,  6, -1,  7,  6,  2,  5,  6, 44,  5,  3,
 	    8,  8,  3,  3, -1,  6,  6, -1,  7,  6,  2,  5,  6, 44,  5,  3,
 	//#0x00C0
 	//#0x00C0
 	    7,  2,  6,  8,  6,  7, -1, -1, -1, -1,  3,  3,  6,  3,  2, 27, // 0xcd change to 3 (was 6)
 	    7,  2,  6,  8,  6,  7, -1, -1, -1, -1,  3,  3,  6,  3,  2, 27, // 0xcd change to 3 (was 6)
@@ -13966,7 +14102,7 @@ static int packetdb_readdb(void)
 	    0,  0,  0,  0,  0,  8,  8, 32, -1,  5,  0,  0,  0,  0,  0,  0,
 	    0,  0,  0,  0,  0,  8,  8, 32, -1,  5,  0,  0,  0,  0,  0,  0,
 	    0,  0,  0,  0,  0,  0, 14, 93, 86, 87,  0,  0,  0,  0, 26,  0,
 	    0,  0,  0,  0,  0,  0, 14, 93, 86, 87,  0,  0,  0,  0, 26,  0,
 	//#0x0800
 	//#0x0800
-	   -1, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 20,
+	   -1, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14, 20,
 	    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 	    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 	    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 	    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 	    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 	    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

+ 2 - 2
src/map/mob.c

@@ -599,7 +599,7 @@ int mob_spawn_guardian(const char* mapname, short x, short y, const char* mobnam
 		return 0;
 		return 0;
 	}
 	}
 	
 	
-	if((x<=0 || y<=0) && !map_search_freecell(NULL, m, &x, &y, -1,-1, 0))
+	if((x<=0 || y<=0) && !map_search_freecell(NULL, m, &x, &y, -1,-1, 1))
 	{
 	{
 		ShowWarning("mob_spawn_guardian: Couldn't locate a spawn cell for guardian class %d (index %d) at castle map %s\n",class_, guardian, map[m].name);
 		ShowWarning("mob_spawn_guardian: Couldn't locate a spawn cell for guardian class %d (index %d) at castle map %s\n",class_, guardian, map[m].name);
 		return 0;
 		return 0;
@@ -690,7 +690,7 @@ int mob_spawn_bg(const char* mapname, short x, short y, const char* mobname, int
 	}
 	}
 
 
 	data.class_ = class_;
 	data.class_ = class_;
-	if( (x <= 0 || y <= 0) && !map_search_freecell(NULL, m, &x, &y, -1,-1, 0) )
+	if( (x <= 0 || y <= 0) && !map_search_freecell(NULL, m, &x, &y, -1,-1, 1) )
 	{
 	{
 		ShowWarning("mob_spawn_bg: Couldn't locate a spawn cell for guardian class %d (bg_id %d) at map %s\n",class_, bg_id, map[m].name);
 		ShowWarning("mob_spawn_bg: Couldn't locate a spawn cell for guardian class %d (bg_id %d) at map %s\n",class_, bg_id, map[m].name);
 		return 0;
 		return 0;

+ 1 - 3
src/map/pet.c

@@ -1181,13 +1181,11 @@ int pet_skill_support_timer(int tid, unsigned int tick, int id, intptr data)
 	
 	
 	pet_stop_attack(pd);
 	pet_stop_attack(pd);
 	pet_stop_walking(pd,1);
 	pet_stop_walking(pd,1);
-	
+	pd->s_skill->timer=add_timer(tick+pd->s_skill->delay*1000,pet_skill_support_timer,sd->bl.id,0);
 	if (skill_get_inf(pd->s_skill->id) & INF_GROUND_SKILL)
 	if (skill_get_inf(pd->s_skill->id) & INF_GROUND_SKILL)
 		unit_skilluse_pos(&pd->bl, sd->bl.x, sd->bl.y, pd->s_skill->id, pd->s_skill->lv);
 		unit_skilluse_pos(&pd->bl, sd->bl.x, sd->bl.y, pd->s_skill->id, pd->s_skill->lv);
 	else
 	else
 		unit_skilluse_id(&pd->bl, sd->bl.id, pd->s_skill->id, pd->s_skill->lv);
 		unit_skilluse_id(&pd->bl, sd->bl.id, pd->s_skill->id, pd->s_skill->lv);
-
-	pd->s_skill->timer=add_timer(tick+pd->s_skill->delay*1000,pet_skill_support_timer,sd->bl.id,0);
 	return 0;
 	return 0;
 }
 }