소스 검색

- Updated to most of jA's 1067

git-svn-id: https://svn.code.sf.net/p/rathena/svn/athena@352 54d463be-8e91-2dee-dedb-b68131a5f0ec
codemaster 20 년 전
부모
커밋
78209b4400
2개의 변경된 파일37개의 추가작업 그리고 10개의 파일을 삭제
  1. 23 3
      src/char/char.c
  2. 14 7
      src/char/int_guild.c

+ 23 - 3
src/char/char.c

@@ -2498,6 +2498,7 @@ int lan_ip_check(unsigned char *p){
 
 int parse_char(int fd) {
 	int i, ch;
+	unsigned short cmd;
 	char email[40];
 	struct char_session_data *sd;
 	unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
@@ -2515,10 +2516,29 @@ int parse_char(int fd) {
 	sd = session[fd]->session_data;
 
 	while (RFIFOREST(fd) >= 2) {
-//		if (RFIFOW(fd,0) < 30000)
-//			printf("parse_char: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd));
+		cmd = RFIFOW(fd,0);
+		// crc32のスキップ用
+		if(	sd==NULL			&&	// 未ログインor管理パケット
+			RFIFOREST(fd)>=4	&&	// 最低バイト数制限 & 0x7530,0x7532管理パケ除去
+			RFIFOREST(fd)<=21	&&	// 最大バイト数制限 & サーバーログイン除去
+			cmd!=0x20b	&&	// md5通知パケット除去
+			(RFIFOREST(fd)<6 || RFIFOW(fd,4)==0x65)	){	// 次に何かパケットが来てるなら、接続でないとだめ
+			RFIFOSKIP(fd,4);
+			cmd = RFIFOW(fd,0);
+			printf("parse_char : %d crc32 skipped\n",fd);
+			if(RFIFOREST(fd)==0)
+				return 0;
+		}
 
-		switch(RFIFOW(fd,0)) {
+//		if(cmd<30000 && cmd!=0x187)
+//			printf("parse_char : %d %d %d\n",fd,RFIFOREST(fd),cmd);
+
+		// 不正パケットの処理
+//		if (sd == NULL && cmd != 0x65 && cmd != 0x20b && cmd != 0x187 &&
+//					 cmd != 0x2af8 && cmd != 0x7530 && cmd != 0x7532)
+//			cmd = 0xffff;	// パケットダンプを表示させる
+		
+		switch(cmd){
 		case 0x20b:	//20040622暗号化ragexe対応
 			if (RFIFOREST(fd) < 19)
 				return 0;

+ 14 - 7
src/char/int_guild.c

@@ -619,8 +619,15 @@ int guild_nextexp(int level) {
 }
 
 // ギルドスキルがあるか確認
-int guild_checkskill(struct guild *g, int id){
-	return g->skill[id-10000].lv;
+int guild_checkskill(struct guild *g, int id) {
+	int idx = id - GD_SKILLBASE;
+
+
+	if(idx < 0 || idx >= MAX_GUILDSKILL)
+
+		return 0;
+
+	return g->skill[idx].lv;
 }
 
 // ギルドの情報の再計算
@@ -630,7 +637,7 @@ int guild_calcinfo(struct guild *g) {
 
 	// スキルIDの設定
 	for(i = 0; i < MAX_GUILDSKILL; i++)
-		g->skill[i].id = i + 10000;
+		g->skill[i].id=i+GD_SKILLBASE;
 
 	// ギルドレベル
 	if (g->guild_lv <= 0)
@@ -649,7 +656,7 @@ int guild_calcinfo(struct guild *g) {
 	g->next_exp = guild_nextexp(g->guild_lv);
 
 	// メンバ上限(ギルド拡張適用)
-	g->max_member = 16 + guild_checkskill(g, 10004) * 2;
+	g->max_member = 16 + guild_checkskill(g, GD_EXTENSION) * 2;
 
 	// 平均レベルとオンライン人数
 	g->average_lv = 0;
@@ -980,7 +987,7 @@ int mapif_parse_CreateGuild(int fd, int account_id, char *name, struct guild_mem
 	g->max_member = 16;
 	g->average_lv = master->lv;
 	for(i = 0; i < MAX_GUILDSKILL; i++)
-		g->skill[i].id = i + 10000;
+		g->skill[i].id=i + GD_SKILLBASE;
 
 	numdb_insert(guild_db, g->guild_id, g);
 
@@ -1230,9 +1237,9 @@ int mapif_parse_GuildPosition(int fd, int guild_id, int idx, struct guild_positi
 // ギルドスキルアップ要求
 int mapif_parse_GuildSkillUp(int fd, int guild_id, int skill_num, int account_id) {
 	struct guild *g = numdb_search(guild_db, guild_id);
-	int idx = skill_num - 10000;
+	int idx = skill_num - GD_SKILLBASE;
 
-	if (g == NULL || skill_num < 10000)
+	if (g == NULL || idx < 0 || idx >= MAX_GUILDSKILL)
 		return 0;
 
 	if (g->skill_point > 0 && g->skill[idx].id > 0 && g->skill[idx].lv < 10) {