Procházet zdrojové kódy

Some all-around code reformatting/cleaning

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@10947 54d463be-8e91-2dee-dedb-b68131a5f0ec
ultramage před 18 roky
rodič
revize
0a0782c664
7 změnil soubory, kde provedl 232 přidání a 344 odebrání
  1. 19 20
      src/common/utils.c
  2. 3 5
      src/common/utils.h
  3. 19 29
      src/map/battle.c
  4. 121 149
      src/map/clif.c
  5. 6 6
      src/map/clif.h
  6. 52 119
      src/map/status.c
  7. 12 16
      src/map/unit.c

+ 19 - 20
src/common/utils.c

@@ -20,41 +20,40 @@
 	#include <sys/stat.h>
 #endif
 
-#ifdef UTIL_DUMP
-void dump(const unsigned char* buffer, int num)
+// generate a hex dump of the first 'length' bytes of 'buffer'
+void dump(FILE* fp, const unsigned char* buffer, int length)
 {
-	int icnt, jcnt;
+	int i, j;
 
-	printf("         Hex                                                  ASCII\n");
-	printf("         -----------------------------------------------      ----------------");
+	fprintf(fp, "         Hex                                                  ASCII\n");
+	fprintf(fp, "         -----------------------------------------------      ----------------");
 
-	for (icnt = 0; icnt < num; icnt += 16)
+	for (i = 0; i < length; i += 16)
 	{
-		printf("\n%p ", &buffer[icnt]);
-		for (jcnt = icnt; jcnt < icnt + 16; ++jcnt)
+		fprintf(fp, "\n%p ", &buffer[i]);
+		for (j = i; j < i + 16; ++j)
 		{
-			if (jcnt < num)
-				printf("%02hX ", buffer[jcnt]);
+			if (j < length)
+				fprintf(fp, "%02hX ", buffer[j]);
 			else
-				printf("   ");
+				fprintf(fp, "   ");
 		}
 
-		printf("  |  ");
+		fprintf(fp, "  |  ");
 
-		for (jcnt = icnt; jcnt < icnt + 16; ++jcnt)
+		for (j = i; j < i + 16; ++j)
 		{
-			if (jcnt < num) {
-				if (buffer[jcnt] > 31 && buffer[jcnt] < 127)
-					printf("%c", buffer[jcnt]);
+			if (j < length) {
+				if (buffer[j] > 31 && buffer[j] < 127)
+					fprintf(fp, "%c", buffer[j]);
 				else
-					printf(".");
+					fprintf(fp, ".");
 			} else
-				printf(" ");
+				fprintf(fp, " ");
 		}
 	}
-	printf("\n");
+	fprintf(fp, "\n");
 }
-#endif
 
 // Allocate a StringBuf  [MouseJstr]
 struct StringBuf * StringBuf_Malloc() 

+ 3 - 5
src/common/utils.h

@@ -4,13 +4,11 @@
 #ifndef _UTILS_H_
 #define _UTILS_H_
 
+#include <stdio.h>
 #include <stdarg.h>
 
-// Function that dumps the hex of the first num bytes of the buffer to the screen
-//#define UTIL_DUMP
-#ifdef UTIL_DUMP
-void dump(const unsigned char* buffer, int num);
-#endif
+// generate a hex dump of the first 'length' bytes of 'buffer'
+void dump(FILE* fp, const unsigned char* buffer, int length);
 
 struct StringBuf {
 	char *buf_;

+ 19 - 29
src/map/battle.c

@@ -1,11 +1,6 @@
 // Copyright (c) Athena Dev Teams - Licensed under GNU GPL
 // For more information, see LICENCE in the main folder
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-
 #include "../common/cbasetypes.h"
 #include "../common/timer.h"
 #include "../common/nullpo.h"
@@ -26,6 +21,11 @@
 #include "party.h"
 #include "battle.h"
 
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
 int attr_fix_table[4][ELE_MAX][ELE_MAX];
 
 struct Battle_Config battle_config;
@@ -87,18 +87,14 @@ struct block_list* battle_gettargeted(struct block_list *target)
 
 
 //Returns the id of the current targetted character of the passed bl. [Skotlex]
-int battle_gettarget(struct block_list *bl)
+int battle_gettarget(struct block_list* bl)
 {
 	switch (bl->type)
 	{
-		case BL_PC:
-			return ((struct map_session_data*)bl)->ud.target;
-		case BL_MOB:
-			return ((struct mob_data*)bl)->target_id;
-		case BL_PET:
-			return ((struct pet_data*)bl)->target_id;
-		case BL_HOM:
-			return ((struct homun_data*)bl)->ud.target;
+		case BL_PC:  return ((struct map_session_data*)bl)->ud.target;
+		case BL_MOB: return ((struct mob_data*)bl)->target_id;
+		case BL_PET: return ((struct pet_data*)bl)->target_id;
+		case BL_HOM: return ((struct homun_data*)bl)->ud.target;
 	}
 	return 0;
 }
@@ -2645,16 +2641,10 @@ struct Damage  battle_calc_misc_attack(
 struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag)
 {
 	struct Damage d;
-	switch(attack_type){
-	case BF_WEAPON:
-		d = battle_calc_weapon_attack(bl,target,skill_num,skill_lv,flag);
-		break;
-	case BF_MAGIC:
-		d = battle_calc_magic_attack(bl,target,skill_num,skill_lv,flag);
-		break;
-	case BF_MISC:
-		d = battle_calc_misc_attack(bl,target,skill_num,skill_lv,flag);
-		break;
+	switch(attack_type) {
+	case BF_WEAPON: d = battle_calc_weapon_attack(bl,target,skill_num,skill_lv,flag); break;
+	case BF_MAGIC:  d = battle_calc_magic_attack(bl,target,skill_num,skill_lv,flag);  break;
+	case BF_MISC:   d = battle_calc_misc_attack(bl,target,skill_num,skill_lv,flag);   break;
 	default:
 		if (battle_config.error_log)
 			ShowError("battle_calc_attack: unknown attack type! %d\n",attack_type);
@@ -2671,9 +2661,10 @@ struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct bl
 	return d;
 }
 
-int battle_calc_return_damage(struct block_list *bl, int *damage, int flag) {
-	struct map_session_data *sd=NULL;
-	struct status_change *sc;
+int battle_calc_return_damage(struct block_list* bl, int* damage, int flag)
+{
+	struct map_session_data* sd = NULL;
+	struct status_change* sc;
 	int rdamage = 0;
 
 	BL_CAST(BL_PC, bl, sd);
@@ -2703,8 +2694,7 @@ int battle_calc_return_damage(struct block_list *bl, int *damage, int flag) {
 	// magic_damage_return by [AppleGirl] and [Valaris]
 	if(flag&BF_MAGIC)
 	{
-		if(sd && sd->magic_damage_return &&
-			rand()%100 < sd->magic_damage_return)
+		if(sd && sd->magic_damage_return && rand()%100 < sd->magic_damage_return)
 		{	//Bounces back full damage, you take none.
 			rdamage = *damage;
 		 	*damage = 0;

+ 121 - 149
src/map/clif.c

@@ -1,9 +1,6 @@
 // Copyright (c) Athena Dev Teams - Licensed under GNU GPL
 // For more information, see LICENCE in the main folder
 
-#define DUMP_UNKNOWN_PACKET	0
-#define DUMP_ALL_PACKETS	0
-
 #include "../common/cbasetypes.h"
 #include "../common/socket.h"
 #include "../common/timer.h"
@@ -45,6 +42,8 @@
 #include <stdarg.h>
 #include <time.h>
 
+#define DUMP_UNKNOWN_PACKET	0
+
 struct Clif_Config {
 	int packet_db_ver;	//Preferred packet version.
 	int connect_cmd[MAX_PACKET_VER + 1]; //Store the connect command for all versions. [Skotlex]
@@ -3805,9 +3804,20 @@ static int clif_calc_walkdelay(struct block_list *bl,int delay, int type, int da
 }
 
 /*==========================================
- * 通常攻撃エフェクト&ダメージ
- *------------------------------------------*/
-int clif_damage(struct block_list *src,struct block_list *dst,unsigned int tick,int sdelay,int ddelay,int damage,int div,int type,int damage2)
+ * Sends a 'damage' packet (src performs action on dst)
+ * R 008a <src ID>.l <dst ID>.l <server tick>.l <src speed>.l <dst speed>.l <param1>.w <param2>.w <type>.B <param3>.w
+ *
+ * type=00 damage [param1: total damage, param2: div, param3: assassin dual-wield damage]
+ * type=01 pick up item
+ * type=02 sit down
+ * type=03 stand up
+ * type=04 reflected/absorbed damage?
+ * type=08 double attack
+ * type=09 don't display flinch animation (endure)
+ * type=0a critical hit
+ * type=0b lucky dodge
+ *------------------------------------------*/
+int clif_damage(struct block_list* src, struct block_list* dst, unsigned int tick, int sdelay, int ddelay, int damage, int div, int type, int damage2)
 {
 	unsigned char buf[256];
 	struct status_change *sc;
@@ -3818,13 +3828,10 @@ int clif_damage(struct block_list *src,struct block_list *dst,unsigned int tick,
 	type = clif_calc_delay(type, ddelay); //Type defaults to 0 for normal attacks.
 
 	sc = status_get_sc(dst);
-
 	if(sc && sc->count) {
 		if(sc->data[SC_HALLUCINATION].timer != -1) {
-			if(damage > 0)
-				damage = damage*(5+sc->data[SC_HALLUCINATION].val1) + rand()%100;
-			if(damage2 > 0)
-				damage2 = damage2*(5+sc->data[SC_HALLUCINATION].val1) + rand()%100;
+			if(damage > 0) damage = damage*(5+sc->data[SC_HALLUCINATION].val1) + rand()%100;
+			if(damage2 > 0) damage2 = damage2*(5+sc->data[SC_HALLUCINATION].val1) + rand()%100;
 		}
 	}
 
@@ -3846,22 +3853,17 @@ int clif_damage(struct block_list *src,struct block_list *dst,unsigned int tick,
 	clif_send(buf,packet_len(0x8a),src,AREA);
 
 	if(disguised(src)) {
-		WBUFL(buf,2)=-src->id;
-		if(damage > 0)
-			WBUFW(buf,22)=-1;
-		if(damage2 > 0)
-			WBUFW(buf,27)=-1;
+		WBUFL(buf,2) = -src->id;
+		if(damage > 0) WBUFW(buf,22) = -1;
+		if(damage2 > 0) WBUFW(buf,27) = -1;
 		clif_send(buf,packet_len(0x8a),src,SELF);
 	}
 	if (disguised(dst)) {
-		WBUFL(buf,6)=-dst->id;
-		if (disguised(src))
-			WBUFL(buf,2)=src->id;
+		WBUFL(buf,6) = -dst->id;
+		if (disguised(src)) WBUFL(buf,2) = src->id;
 		else {
-			if(damage > 0)
-				WBUFW(buf,22)=-1;
-			if(damage2 > 0)
-				WBUFW(buf,27)=-1;
+			if(damage > 0) WBUFW(buf,22) = -1;
+			if(damage2 > 0) WBUFW(buf,27) = -1;
 		}
 		clif_send(buf,packet_len(0x8a),dst,SELF);
 	}
@@ -3869,6 +3871,65 @@ int clif_damage(struct block_list *src,struct block_list *dst,unsigned int tick,
 	return clif_calc_walkdelay(dst,ddelay,type,damage+damage2,div);
 }
 
+/*==========================================
+ * src picks up dst
+ *------------------------------------------*/
+void clif_takeitem(struct block_list* src, struct block_list* dst)
+{
+	//clif_damage(src,dst,0,0,0,0,0,1,0);
+	unsigned char buf[32];
+
+	nullpo_retv(src);
+	nullpo_retv(dst);
+
+	WBUFW(buf, 0) = 0x8a;
+	WBUFL(buf, 2) = src->id;
+	WBUFL(buf, 6) = dst->id;
+	WBUFB(buf,26) = 1;
+	clif_send(buf, packet_len(0x8a), src, AREA);
+
+}
+
+/*==========================================
+ * inform clients in area that `sd` is sitting
+ *------------------------------------------*/
+void clif_sitting(struct map_session_data* sd)
+{
+	unsigned char buf[32];
+
+	nullpo_retv(sd);
+
+	WBUFW(buf, 0) = 0x8a;
+	WBUFL(buf, 2) = sd->bl.id;
+	WBUFB(buf,26) = 2;
+	clif_send(buf, packet_len(0x8a), &sd->bl, AREA);
+
+	if(disguised(&sd->bl)) {
+		WBUFL(buf, 2) = -sd->bl.id;
+		clif_send(buf, packet_len(0x8a), &sd->bl, SELF);
+	}
+}
+
+/*==========================================
+ * inform clients in area that `sd` is standing
+ *------------------------------------------*/
+void clif_standing(struct map_session_data* sd)
+{
+	unsigned char buf[32];
+
+	nullpo_retv(sd);
+
+	WBUFW(buf, 0) = 0x8a;
+	WBUFL(buf, 2) = sd->bl.id;
+	WBUFB(buf,26) = 3;
+	clif_send(buf, packet_len(0x8a), &sd->bl, AREA);
+
+	if(disguised(&sd->bl)) {
+		WBUFL(buf, 2) = -sd->bl.id;
+		clif_send(buf, packet_len(0x8a), &sd->bl, SELF);
+	}
+}
+
 /*==========================================
  *
  *------------------------------------------*/
@@ -7219,46 +7280,6 @@ void clif_parse_ReqMarriage(int fd, struct map_session_data *sd)
 	WFIFOSET(fd, packet_len(0x1e2));
 }
 
-/*==========================================
- * inform clients in area that `sd` is sitting
- *------------------------------------------*/
-void clif_sitting(struct map_session_data* sd)
-{
-	unsigned char buf[32];
-
-	nullpo_retv(sd);
-
-	WBUFW(buf, 0) = 0x8a;
-	WBUFL(buf, 2) = sd->bl.id;
-	WBUFB(buf,26) = 2;
-	clif_send(buf, packet_len(0x8a), &sd->bl, AREA);
-
-	if(disguised(&sd->bl)) {
-		WBUFL(buf, 2) = -sd->bl.id;
-		clif_send(buf, packet_len(0x8a), &sd->bl, SELF);
-	}
-}
-
-/*==========================================
- * inform clients in area that `sd` is standing
- *------------------------------------------*/
-void clif_standing(struct map_session_data* sd)
-{
-	unsigned char buf[32];
-
-	nullpo_retv(sd);
-
-	WBUFW(buf, 0) = 0x8a;
-	WBUFL(buf, 2) = sd->bl.id;
-	WBUFB(buf,26) = 3;
-	clif_send(buf, packet_len(0x8a), &sd->bl, AREA);
-
-	if(disguised(&sd->bl)) {
-		WBUFL(buf, 2) = -sd->bl.id;
-		clif_send(buf, packet_len(0x8a), &sd->bl, SELF);
-	}
-}
-
 /*==========================================
  *
  *------------------------------------------*/
@@ -8702,8 +8723,9 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type,
 		if (sd->sc.count && (
 			sd->sc.data[SC_DANCING].timer != -1 ||
 			(sd->sc.data[SC_GRAVITATION].timer != -1 && sd->sc.data[SC_GRAVITATION].val3 == BCT_SELF)
-		)) //No sitting during these states neither.
-		break;
+		)) //No sitting during these states either.
+			break;
+
 		pc_setsit(sd);
 		skill_sit(sd,1);
 		clif_sitting(sd);
@@ -8881,8 +8903,7 @@ void clif_parse_Wis(int fd, struct map_session_data *sd)
 	// if there are 'Test' player on an other map-server and 'test' player on this map-server,
 	// and if we ask for 'Test', we must not contact 'test' player
 	// so, we send information to inter-server, which is the only one which decide (and copy correct name).
-	if (dstsd == NULL ||
-		strcmp(dstsd->status.name, target) != 0)
+	if (dstsd == NULL || strcmp(dstsd->status.name, target) != 0)
 	{	// send message to inter-server
 		intif_wis_message(sd, target, msg, len);
 		aFree(command);
@@ -10315,26 +10336,24 @@ void clif_parse_GuildChangeEmblem(int fd,struct map_session_data *sd)
 }
 
 /*==========================================
- * ギルド告知変更
+ * Guild notice update request
+ * S 016E <guildID>.l <msg1>.60B <msg2>.120B
  *------------------------------------------*/
-void clif_parse_GuildChangeNotice(int fd,struct map_session_data *sd)
+void clif_parse_GuildChangeNotice(int fd, struct map_session_data* sd)
 {
+	int guild_id = RFIFOL(fd,2);
+	char* msg1 = (char*)RFIFOP(fd,6);
+	char* msg2 = (char*)RFIFOP(fd,66);
+
 	if(!sd->state.gmaster_flag)
 		return;
 
-	// compensate for the client's double marker bug (in both strings)
-	if ((RFIFOB(fd, 6) == '|') && (RFIFOB(fd, 6+3) == '|')) {
-		memmove(RFIFOP(fd, 6+3), RFIFOP(fd, 6+6), 60-6); memset(RFIFOP(fd, 60-3), 0x00, 3); // drop the duplicate marker
-	}
-	if ((RFIFOB(fd, 66) == '|') && (RFIFOB(fd, 66+3) == '|')) {
-		memmove(RFIFOP(fd, 66+3), RFIFOP(fd, 66+6), 180-6); memset(RFIFOP(fd, 180-3), 0x00, 3); // drop the duplicate marker
-	}
-	// compensate for the client's adding of an extra space at the end of the message
-	if (RFIFOB(fd, 66) == '|') {
-		memset(RFIFOP(fd, 66 + strnlen((char*)RFIFOP(fd, 66), 120)-1), 0x00, 1); // delete extra space at the end
-	}
+	// compensate for some client defects when using multilanguage mode
+	if (msg1[0] == '|' && msg1[3] == '|') msg1+= 3; // skip duplicate marker
+	if (msg2[0] == '|' && msg2[3] == '|') msg2+= 3; // skip duplicate marker
+	if (msg2[0] == '|') msg2[strnlen(msg2, 120)-1] = '\0'; // delete extra space at the end of string
 
-	guild_change_notice(sd,RFIFOL(fd,2),(char*)RFIFOP(fd,6),(char*)RFIFOP(fd,66));
+	guild_change_notice(sd, guild_id, msg1, msg2);
 }
 
 /*==========================================
@@ -11476,13 +11495,12 @@ void clif_parse_debug(int fd,struct map_session_data *sd)
 }
 
 /*==========================================
- * クライアントからのパケット解析
- * socket.cのdo_parsepacketから呼び出される
+ * Main client packet processing function
  *------------------------------------------*/
 int clif_parse(int fd)
 {
-	int packet_len = 0, cmd, packet_ver, err, dump = 0;
-	TBL_PC *sd;
+	int packet_len = 0, cmd, packet_ver, err;
+	TBL_PC* sd;
 
 	sd = (TBL_PC *)session[fd]->session_data;
 	if (session[fd]->eof) {
@@ -11491,17 +11509,14 @@ int clif_parse(int fd)
 				//Disassociate character from the socket connection.
 				session[fd]->session_data = NULL;
 				sd->fd = 0;
-				ShowInfo("%sCharacter '"CL_WHITE"%s"CL_RESET"' logged off (using @autotrade).\n",
-					(pc_isGM(sd))?"GM ":"",sd->status.name);
+				ShowInfo("%sCharacter '"CL_WHITE"%s"CL_RESET"' logged off (using @autotrade).\n", (pc_isGM(sd))?"GM ":"", sd->status.name);
 			} else
 			if (sd->state.auth) {
 				 // Player logout display [Valaris]
-				ShowInfo("%sCharacter '"CL_WHITE"%s"CL_RESET"' logged off.\n",
-					(pc_isGM(sd))?"GM ":"",sd->status.name);
+				ShowInfo("%sCharacter '"CL_WHITE"%s"CL_RESET"' logged off.\n", (pc_isGM(sd))?"GM ":"", sd->status.name);
 				clif_quitsave(fd, sd);
 			} else {
-				ShowInfo("Player AID:%d/CID:%d (not authenticated) logged off.\n",
-					sd->bl.id, sd->status.char_id);
+				ShowInfo("Player AID:%d/CID:%d (not authenticated) logged off.\n", sd->bl.id, sd->status.char_id);
 				map_quit(sd);
 			}
 		} else {
@@ -11515,8 +11530,6 @@ int clif_parse(int fd)
 	if (RFIFOREST(fd) < 2)
 		return 0;
 
-//	printf("clif_parse: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
-
 	cmd = RFIFOW(fd,0);
 
 	// identify client's packet version
@@ -11547,63 +11560,28 @@ int clif_parse(int fd)
 		}
 	}
 
-	// ゲーム用以外パケットか、認証を終える前に0072以外が来たら、切断する
-	if (cmd > MAX_PACKET_DB || packet_db[packet_ver][cmd].len == 0) {	// if packet is not inside these values: session is incorrect?? or auth packet is unknown
+	// filter out invalid / unsupported packets
+	if (cmd > MAX_PACKET_DB || packet_db[packet_ver][cmd].len == 0) {
 		ShowWarning("clif_parse: Received unsupported packet (packet 0x%04x, %d bytes received), disconnecting session #%d.\n", cmd, RFIFOREST(fd), fd);
 		set_eof(fd);
 		return 0;
 	}
 
-	// パケット長を計算
+	// determine real packet length
 	packet_len = packet_db[packet_ver][cmd].len;
-	if (packet_len == -1) {
+	if (packet_len == -1) { // variable-length packet
 		if (RFIFOREST(fd) < 4)
-			return 0; // 可変長パケットで長さの所までデータが来てない
+			return 0;
 
 		packet_len = RFIFOW(fd,2);
 		if (packet_len < 4 || packet_len > 32768) {
-			ShowWarning("clif_parse: Packet 0x%04x specifies invalid packet_len (%d), disconnecting session #%d.\n", cmd, packet_len, fd);
+			ShowWarning("clif_parse: Received packet 0x%04x specifies invalid packet_len (%d), disconnecting session #%d.\n", cmd, packet_len, fd);
 			set_eof(fd);
 			return 0;
 		}
 	}
 	if ((int)RFIFOREST(fd) < packet_len)
-		return 0; // まだ1パケット分データが揃ってない
-
-#if DUMP_ALL_PACKETS
-	{
-		int i;
-		FILE *fp;
-		char packet_txt[256] = "save/packet.txt";
-		time_t now;
-		dump = 1;
-
-		if ((fp = fopen(packet_txt, "a")) == NULL) {
-			ShowError("clif.c: can't write [%s] !!! data is lost !!!\n", packet_txt);
-			return 1;
-		} else {
-			time(&now);
-			if (sd && sd->state.auth) {
-				if (sd->status.name != NULL)
-					fprintf(fp, "%sPlayer with account ID %d (character ID %d, player name %s) sent packet:\n",
-							  asctime(localtime(&now)), sd->status.account_id, sd->status.char_id, sd->status.name);
-				else
-					fprintf(fp, "%sPlayer with account ID %d sent wrong packet:\n", asctime(localtime(&now)), sd->bl.id);
-			} else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified)
-				fprintf(fp, "%sPlayer with account ID %d sent wrong packet:\n", asctime(localtime(&now)), sd->bl.id);
-
-			fprintf(fp, "\tsession #%d, packet 0x%04x, length %d, version %d\n", fd, cmd, packet_len, packet_ver);
-			fprintf(fp, "\t---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F");
-			for(i = 0; i < packet_len; i++) {
-				if ((i & 15) == 0)
-					fprintf(fp, "\n\t%04X ", i);
-				fprintf(fp, "%02X ", RFIFOB(fd,i));
-			}
-			fprintf(fp, "\n\n");
-			fclose(fp);
-		}
-	}
-#endif
+		return 0; // not enough data received to form the packet
 
 	if (sd && sd->state.waitingdisconnect == 1) {
 		// 切断待ちの場合パケットを処理しない
@@ -11650,6 +11628,7 @@ int clif_parse(int fd)
 	}
 #endif
 
+	/* TODO: use utils.c :: dump()
 	if (dump) {
 		int i;
 		ShowDebug("\nclif_parse: session #%d, packet 0x%04x, length %d, version %d\n", fd, cmd, packet_len, packet_ver);
@@ -11668,7 +11647,7 @@ int clif_parse(int fd)
 				printf("\nAccount ID %d.\n", sd->bl.id);
 		} else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified)
 			printf("\nAccount ID %d.\n", sd->bl.id);
-	}
+	}*/
 
 	RFIFOSKIP(fd, packet_len);
 
@@ -11890,7 +11869,7 @@ static int packetdb_readdb(void)
 		{NULL,NULL}
 	};
 
-	// Set server packet lengths - packet_db[SERVER]
+	// initialize packet_db[SERVER] from hardcoded packet_len_table[] values
 	memset(packet_db,0,sizeof(packet_db));
 	for( i = 0; i < sizeof(packet_len_table)/sizeof(packet_len_table[0]); ++i )
 		packet_len(i) = packet_len_table[i];
@@ -11947,17 +11926,11 @@ static int packetdb_readdb(void)
 				memcpy(&packet_db[packet_ver], &packet_db[prev_ver], sizeof(packet_db[0]));
 				continue;
 			} else if(strcmpi(w1,"packet_db_ver")==0) {
-				//This is the preferred version.
-				if(strcmpi(w2,"default")==0)
+				if(strcmpi(w2,"default")==0) //This is the preferred version.
 					clif_config.packet_db_ver = MAX_PACKET_VER;
-				else {
-					// to manually set the packet DB version
-					clif_config.packet_db_ver = atoi(w2);
-					// check for invalid version
-					if (clif_config.packet_db_ver > MAX_PACKET_VER ||
-						clif_config.packet_db_ver < 0)
-						clif_config.packet_db_ver = MAX_PACKET_VER;
-				}
+				else // to manually set the packet DB version
+					clif_config.packet_db_ver = cap_value(atoi(w2), 0, MAX_PACKET_VER);
+				
 				continue;
 			}
 		}
@@ -11992,8 +11965,7 @@ static int packetdb_readdb(void)
 			continue;
 		}
 		for(j=0;j<sizeof(clif_parse_func)/sizeof(clif_parse_func[0]);j++){
-			if(clif_parse_func[j].name != NULL &&
-				strcmp(str[2],clif_parse_func[j].name)==0)
+			if(clif_parse_func[j].name != NULL && strcmp(str[2],clif_parse_func[j].name)==0)
 			{
 				if (packet_db[packet_ver][cmd].func != clif_parse_func[j].func)
 				{	//If we are updating a function, we need to zero up the previous one. [Skotlex]

+ 6 - 6
src/map/clif.h

@@ -24,8 +24,8 @@ struct packet_db_t {
 
 // packet_db[SERVER] is reserved for server use
 #define SERVER 0
-#define packet_len(x) packet_db[SERVER][x].len
-extern struct packet_db_t packet_db[MAX_PACKET_VER + 1][MAX_PACKET_DB + 1];
+#define packet_len(cmd) packet_db[SERVER][cmd].len
+extern struct packet_db_t packet_db[MAX_PACKET_VER+1][MAX_PACKET_DB+1];
 
 // local define
 enum send_target {
@@ -100,8 +100,10 @@ int clif_additem(struct map_session_data*,int,int,int);	//self
 int clif_delitem(struct map_session_data*,int,int);	//self
 int clif_updatestatus(struct map_session_data*,int);	//self
 int clif_changestatus(struct block_list*,int,int);	//area
-int clif_damage(struct block_list *src,struct block_list *dst,unsigned int tick,int sdelay,int ddelay,int damage,int div,int type,int damage2);	// area
-#define clif_takeitem(src,dst) clif_damage(src,dst,0,0,0,0,0,1,0)
+int clif_damage(struct block_list* src,struct block_list *dst,unsigned int tick,int sdelay,int ddelay,int damage,int div,int type,int damage2);	// area
+void clif_takeitem(struct block_list* src,struct block_list* dst);
+void clif_sitting(struct map_session_data* sd);
+void clif_standing(struct map_session_data* sd);
 int clif_changelook(struct block_list *,int,int);	// area
 void clif_changetraplook(struct block_list *bl,int val); // area
 void clif_refreshlook(struct block_list *bl,int id,int type,int val,int area); //area specified in 'area'
@@ -132,8 +134,6 @@ int clif_fame_blacksmith(struct map_session_data *, int);
 int clif_fame_alchemist(struct map_session_data *, int);
 int clif_fame_taekwon(struct map_session_data *, int);
 
-void clif_sitting(struct map_session_data* sd);
-void clif_standing(struct map_session_data* sd);
 void clif_emotion(struct block_list *bl,int type);
 void clif_talkiebox(struct block_list* bl, const char* talkie);
 void clif_wedding_effect(struct block_list *bl);

+ 52 - 119
src/map/status.c

@@ -675,14 +675,9 @@ int status_damage(struct block_list *src,struct block_list *target,int hp, int s
 
 	switch (target->type)
 	{
-		case BL_MOB:
-			mob_damage((TBL_MOB*)target, src, hp);
-			break;
-		case BL_PC:
-			pc_damage((TBL_PC*)target,src,hp,sp);
-			break;
-		case BL_HOM:
-			merc_damage((TBL_HOM*)target,src,hp,sp);
+		case BL_PC:  pc_damage((TBL_PC*)target,src,hp,sp); break;
+		case BL_MOB: mob_damage((TBL_MOB*)target, src, hp); break;
+		case BL_HOM: merc_damage((TBL_HOM*)target,src,hp,sp); break;
 	}
 
 	if (status->hp)
@@ -698,17 +693,10 @@ int status_damage(struct block_list *src,struct block_list *target,int hp, int s
 	//Non-zero: Standard death. Clear status, cancel move/attack, etc
 	//&2: Also remove object from map.
 	//&4: Also delete object from memory.
-	switch (target->type)
-	{
-		case BL_MOB:
-			flag = mob_dead((TBL_MOB*)target, src, flag&4?3:0);
-			break;
-		case BL_PC:
-			flag = pc_dead((TBL_PC*)target,src);
-			break;
-		case BL_HOM:
-			flag = merc_hom_dead((TBL_HOM*)target,src);
-			break;
+	switch (target->type) {
+		case BL_PC:  flag = pc_dead((TBL_PC*)target,src); break;
+		case BL_MOB: flag = mob_dead((TBL_MOB*)target, src, flag&4?3:0); break;
+		case BL_HOM: flag = merc_hom_dead((TBL_HOM*)target,src); break;
 		default:	//Unhandled case, do nothing to object.
 			flag = 0;
 			break;
@@ -806,15 +794,9 @@ int status_heal(struct block_list *bl,int hp,int sp, int flag)
 		status_change_end(bl,SC_PROVOKE,-1);
 
 	switch(bl->type) {
-	case BL_MOB:
-		mob_heal((TBL_MOB*)bl,hp);
-		break;
-	case BL_PC:
-		pc_heal((TBL_PC*)bl,hp,sp,flag&2?1:0);
-		break;
-	case BL_HOM:
-		merc_hom_heal((TBL_HOM*)bl,hp,sp);
-		break;
+	case BL_PC:  pc_heal((TBL_PC*)bl,hp,sp,flag&2?1:0); break;
+	case BL_MOB: mob_heal((TBL_MOB*)bl,hp); break;
+	case BL_HOM: merc_hom_heal((TBL_HOM*)bl,hp,sp); break;
 	}
 	return hp+sp;
 }
@@ -912,15 +894,9 @@ int status_revive(struct block_list *bl, unsigned char per_hp, unsigned char per
 	if (bl->prev) //Animation only if character is already on a map.
 		clif_resurrection(bl, 1);
 	switch (bl->type) {
-		case BL_MOB:
-			mob_revive((TBL_MOB*)bl, hp);
-			break;
-		case BL_PC:
-			pc_revive((TBL_PC*)bl, hp, sp);
-			break;
-		case BL_HOM:	//[orn]
-			merc_hom_revive((TBL_HOM*)bl, hp, sp);
-			break;
+		case BL_PC:  pc_revive((TBL_PC*)bl, hp, sp); break;
+		case BL_MOB: mob_revive((TBL_MOB*)bl, hp); break;
+		case BL_HOM: merc_hom_revive((TBL_HOM*)bl, hp, sp); break;
 	}
 	return 1;
 }
@@ -1920,24 +1896,12 @@ int status_calc_pc(struct map_session_data* sd,int first)
 		if(!job_bonus[sd->status.class_][i])
 			continue;
 		switch(job_bonus[sd->status.class_][i]) {
-			case 1:
-				status->str++;
-				break;
-			case 2:
-				status->agi++;
-				break;
-			case 3:
-				status->vit++;
-				break;
-			case 4:
-				status->int_++;
-				break;
-			case 5:
-				status->dex++;
-				break;
-			case 6:
-				status->luk++;
-				break;
+			case 1: status->str++; break;
+			case 2: status->agi++; break;
+			case 3: status->vit++; break;
+			case 4: status->int_++; break;
+			case 5: status->dex++; break;
+			case 6: status->luk++; break;
 		}
 	}
 
@@ -3947,22 +3911,15 @@ void status_freecast_switch(struct map_session_data *sd)
 		clif_updatestatus(sd,SP_SPEED);
 }
 
-const char * status_get_name(struct block_list *bl)
+const char* status_get_name(struct block_list *bl)
 {
 	nullpo_retr(0, bl);
 	switch (bl->type) {
-	case BL_MOB:
-		return ((TBL_MOB*)bl)->name;
-	case BL_PC:
-		if(strlen(((TBL_PC *)bl)->fakename)>0)
-			return ((TBL_PC*)bl)->fakename;
-		return ((TBL_PC*)bl)->status.name;
-	case BL_PET:
-		return ((TBL_PET*)bl)->pet.name;
-	case BL_HOM:
-		return ((TBL_HOM*)bl)->homunculus.name;
-	case BL_NPC:
-		return ((TBL_NPC*)bl)->name;
+	case BL_PC:  return ((TBL_PC *)bl)->fakename[0] != '\0' ? ((TBL_PC*)bl)->fakename : ((TBL_PC*)bl)->status.name;
+	case BL_MOB: return ((TBL_MOB*)bl)->name;
+	case BL_PET: return ((TBL_PET*)bl)->pet.name;
+	case BL_HOM: return ((TBL_HOM*)bl)->homunculus.name;
+	case BL_NPC: return ((TBL_NPC*)bl)->name;
 	}
 	return "Unknown";
 }
@@ -3991,14 +3948,12 @@ int status_get_class(struct block_list *bl)
 int status_get_lv(struct block_list *bl)
 {
 	nullpo_retr(0, bl);
-	if(bl->type==BL_MOB)
-		return ((TBL_MOB*)bl)->level;
-	if(bl->type==BL_PC)
-		return ((TBL_PC*)bl)->status.base_level;
-	if(bl->type==BL_PET)
-		return ((TBL_PET*)bl)->pet.level;
-	if(bl->type==BL_HOM)
-		return ((TBL_HOM*)bl)->homunculus.level;
+	switch (bl->type) {
+		case BL_PC:  return ((TBL_PC*)bl)->status.base_level;
+		case BL_MOB: return ((TBL_MOB*)bl)->level;
+		case BL_PET: return ((TBL_PET*)bl)->pet.level;
+		case BL_HOM: return ((TBL_HOM*)bl)->homunculus.level;
+	}		
 	return 1;
 }
 
@@ -4006,10 +3961,8 @@ struct regen_data *status_get_regen_data(struct block_list *bl)
 {
 	nullpo_retr(NULL, bl);
 	switch (bl->type) {
-		case BL_PC:
-			return &((TBL_PC*)bl)->regen;
-		case BL_HOM:
-			return &((TBL_HOM*)bl)->regen;
+		case BL_PC:  return &((TBL_PC*)bl)->regen;
+		case BL_HOM: return &((TBL_HOM*)bl)->regen;
 		default:
 			return NULL;
 	}
@@ -4020,14 +3973,10 @@ struct status_data *status_get_status_data(struct block_list *bl)
 	nullpo_retr(&dummy_status, bl);
 		
 	switch (bl->type) {
-		case BL_PC:
-			return &((TBL_PC*)bl)->battle_status;
-		case BL_MOB:
-			return &((TBL_MOB*)bl)->status;
-		case BL_PET:
-			return &((TBL_PET*)bl)->status;
-		case BL_HOM:
-			return &((TBL_HOM*)bl)->battle_status;
+		case BL_PC:  return &((TBL_PC*)bl)->battle_status;
+		case BL_MOB: return &((TBL_MOB*)bl)->status;
+		case BL_PET: return &((TBL_PET*)bl)->status;
+		case BL_HOM: return &((TBL_HOM*)bl)->battle_status;
 		default:
 			return &dummy_status;
 	}
@@ -4037,16 +3986,10 @@ struct status_data *status_get_base_status(struct block_list *bl)
 {
 	nullpo_retr(NULL, bl);
 	switch (bl->type) {
-		case BL_PC:
-			return &((TBL_PC*)bl)->base_status;
-		case BL_MOB:
-			return ((TBL_MOB*)bl)->base_status?
-				((TBL_MOB*)bl)->base_status:
-				&((TBL_MOB*)bl)->db->status;
-		case BL_PET:
-			return &((TBL_PET*)bl)->db->status;
-		case BL_HOM:
-			return &((TBL_HOM*)bl)->base_status;
+		case BL_PC:  return &((TBL_PC*)bl)->base_status;
+		case BL_MOB: return ((TBL_MOB*)bl)->base_status ? ((TBL_MOB*)bl)->base_status : &((TBL_MOB*)bl)->db->status;
+		case BL_PET: return &((TBL_PET*)bl)->db->status;
+		case BL_HOM: return &((TBL_HOM*)bl)->base_status;
 		default:
 			return NULL;
 	}
@@ -4227,21 +4170,15 @@ int status_isimmune(struct block_list *bl)
 	return 0;
 }
 
-struct view_data *status_get_viewdata(struct block_list *bl)
+struct view_data* status_get_viewdata(struct block_list *bl)
 {
 	nullpo_retr(NULL, bl);
-	switch (bl->type)
-	{
-		case BL_PC:
-			return &((TBL_PC*)bl)->vd;
-		case BL_MOB:
-			return ((TBL_MOB*)bl)->vd;
-		case BL_PET:
-			return &((TBL_PET*)bl)->vd;
-		case BL_NPC:
-			return ((TBL_NPC*)bl)->vd;
-		case BL_HOM: //[blackhole89]
-			return ((TBL_HOM*)bl)->vd;
+	switch (bl->type) {
+		case BL_PC:  return &((TBL_PC*)bl)->vd;
+		case BL_MOB: return ((TBL_MOB*)bl)->vd;
+		case BL_PET: return &((TBL_PET*)bl)->vd;
+		case BL_NPC: return ((TBL_NPC*)bl)->vd;
+		case BL_HOM: return ((TBL_HOM*)bl)->vd;
 	}
 	return NULL;
 }
@@ -4364,14 +4301,10 @@ struct status_change *status_get_sc(struct block_list *bl)
 {
 	nullpo_retr(NULL, bl);
 	switch (bl->type) {
-	case BL_MOB:
-		return &((TBL_MOB*)bl)->sc;
-	case BL_PC:
-		return &((TBL_PC*)bl)->sc;
-	case BL_NPC:
-		return &((TBL_NPC*)bl)->sc;
-	case BL_HOM: //[blackhole89]
-		return &((TBL_HOM*)bl)->sc;
+	case BL_PC:  return &((TBL_PC*)bl)->sc;
+	case BL_MOB: return &((TBL_MOB*)bl)->sc;
+	case BL_NPC: return &((TBL_NPC*)bl)->sc;
+	case BL_HOM: return &((TBL_HOM*)bl)->sc;
 	}
 	return NULL;
 }

+ 12 - 16
src/map/unit.c

@@ -1366,21 +1366,17 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, unsigned int t
 	ud->attacktimer=-1;
 	target=map_id2bl(ud->target);
 
-	if(src->prev == NULL || target==NULL || target->prev == NULL)
+	if(src == NULL || src->prev == NULL || target==NULL || target->prev == NULL)
 		return 0;
 
-	if(ud->skilltimer != -1 && (!sd || pc_checkskill(sd,SA_FREECAST) <= 0))
-		return 0;
-	
 	if(src->m != target->m || status_isdead(src) || status_isdead(target) || !status_check_skilluse(src, target, 0, 0))
-		return 0;
-
-	sstatus = status_get_status_data(src);
+		return 0; // can't attack under these conditions
 
-	if(!battle_config.sdelay_attack_enable &&
-		DIFF_TICK(ud->canact_tick,tick) > 0 && 
-		(!sd || pc_checkskill(sd,SA_FREECAST) <= 0)
-	) {
+	if(ud->skilltimer != -1 && !(sd && pc_checkskill(sd,SA_FREECAST) > 0))
+		return 0; // can't attack while casting
+	
+	if(!battle_config.sdelay_attack_enable && DIFF_TICK(ud->canact_tick,tick) > 0 && !(sd && pc_checkskill(sd,SA_FREECAST) > 0))
+	{	// attacking when under cast delay has restrictions:
 		if (tid == -1) { //requested attack.
 			if(sd) clif_skill_fail(sd,1,4,0);
 			return 0;
@@ -1394,6 +1390,7 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, unsigned int t
 		return 1;
 	}
 
+	sstatus = status_get_status_data(src);
 	range = sstatus->rhw.range;
 	
 	if(!sd || sd->status.weapon != W_BOW) range++; //Dunno why everyone but bows gets this extra range...
@@ -1420,9 +1417,9 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, unsigned int t
 	//Non-players use the sync packet on the walk timer. [Skotlex]
 	if (tid == -1 && sd) clif_fixpos(src);
 
-	if(DIFF_TICK(ud->attackabletime,tick) <= 0) {
-		if (battle_config.attack_direction_change &&
-			(src->type&battle_config.attack_direction_change)) {
+	if(DIFF_TICK(ud->attackabletime,tick) <= 0)
+	{
+		if (battle_config.attack_direction_change && (src->type&battle_config.attack_direction_change)) {
 			ud->dir = map_calc_dir(src, target->x,target->y );
 		}
 		if(ud->walktimer != -1)
@@ -1433,8 +1430,7 @@ static int unit_attack_timer_sub(struct block_list* src, int tid, unsigned int t
 			if (sstatus->mode&MD_ASSIST && DIFF_TICK(md->last_linktime, tick) < MIN_MOBLINKTIME)
 			{	// Link monsters nearby [Skotlex]
 				md->last_linktime = tick;
-				map_foreachinrange(mob_linksearch, src, md->db->range2,
-					BL_MOB, md->class_, target, tick);
+				map_foreachinrange(mob_linksearch, src, md->db->range2, BL_MOB, md->class_, target, tick);
 			}
 		}
 		if(src->type == BL_PET && pet_attackskill((TBL_PET*)src, target->id))