瀏覽代碼

- Corrected mob angry mode, now it only "restores" itself after being hit when the mob has no target within their range of sight rather than on picking a new target.
- Corrected a pair of incorrect sql query parsing logic in the login-sql ban request packet.


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

skotlex 19 年之前
父節點
當前提交
6a7fd3930f
共有 4 個文件被更改,包括 15 次插入12 次删除
  1. 6 0
      Changelog-Trunk.txt
  2. 5 7
      src/login_sql/login.c
  3. 3 4
      src/map/mob.c
  4. 1 1
      src/map/script.c

+ 6 - 0
Changelog-Trunk.txt

@@ -3,7 +3,13 @@ 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.
 
+2006/05/24
+	* Corrected a pair of incorrect sql query parsing logic in the login-sql
+	  ban request packet. [Skotlex]
 2006/05/23
+	* Corrected mob angry mode, now it only "restores" itself after being hit
+	  when the mob has no target within their range of sight rather than on
+	  picking a new target. [Skotlex]
 	* Fixed wedding sprite where it would stay active after unequipping. [Zido]
 	* Some cleanup of run_script, should fix the memory leak there. [Skotlex]
 	* the charname request hack message has been downgraded to only include

+ 5 - 7
src/login_sql/login.c

@@ -1733,16 +1733,16 @@ int parse_login(int fd) {
 				}
 				//check query result
 				sql_res = mysql_store_result(&mysql_handle) ;
-				sql_row = mysql_fetch_row(sql_res);	//row fetching
+				sql_row = sql_res?mysql_fetch_row(sql_res):NULL;	//row fetching
 
-				if (atoi(sql_row[0]) >= dynamic_pass_failure_ban_how_many ) {
+				if (sql_row && atoi(sql_row[0]) >= dynamic_pass_failure_ban_how_many ) {
 					sprintf(tmpsql,"INSERT INTO `ipbanlist`(`list`,`btime`,`rtime`,`reason`) VALUES ('%d.%d.%d.*', NOW() , NOW() +  INTERVAL %d MINUTE ,'Password error ban: %s')", p[0], p[1], p[2], dynamic_pass_failure_ban_how_long, t_uid);
 					if(mysql_query(&mysql_handle, tmpsql)) {
 						ShowSQL("DB error - %s\n",mysql_error(&mysql_handle));
 						ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
 					}
 				}
-				mysql_free_result(sql_res);
+				if(sql_res) mysql_free_result(sql_res);
 			}
 			else if (result == -2){	//dynamic banned - add ip to ban list.
 				sprintf(tmpsql,"INSERT INTO `ipbanlist`(`list`,`btime`,`rtime`,`reason`) VALUES ('%d.%d.%d.*', NOW() , NOW() +  INTERVAL 1 MONTH ,'Dynamic banned user id : %s')", p[0], p[1], p[2], t_uid);
@@ -1761,15 +1761,13 @@ int parse_login(int fd) {
 					ShowDebug("at %s:%d - %s\n", __FILE__,__LINE__,tmp_sql);
             }
             sql_res = mysql_store_result(&mysql_handle) ;
-            if (sql_res)	{
-                sql_row = mysql_fetch_row(sql_res);	//row fetching
-            }
+				sql_row = sql_res?mysql_fetch_row(sql_res):NULL;	//row fetching
 			//cannot connect login failed
 			memset(WFIFOP(fd,0),'\0',23);
 			WFIFOW(fd,0)=0x6a;
 			WFIFOB(fd,2)=result;
 			if (result == 6) { // 6 = Your are Prohibited to log in until %s
-				if (atol(sql_row[0]) != 0) { // if account is banned, we send ban timestamp
+				if (sql_row && atol(sql_row[0]) != 0) { // if account is banned, we send ban timestamp
 					char tmpstr[256];
 					time_t ban_until_time;
 					ban_until_time = atol(sql_row[0]);

+ 3 - 4
src/map/mob.c

@@ -569,7 +569,6 @@ int mob_linksearch(struct block_list *bl,va_list ap)
 		md->last_linktime = tick;
 		if( mob_can_reach(md,target,md->db->range2, MSS_FOLLOW) ){	// Reachability judging
 			md->target_id = target->id;
-			md->state.aggressive = (status_get_mode(&md->bl)&MD_ANGRY)?1:0;
 			md->min_chase=md->db->range3;
 			return 1;
 		}
@@ -685,6 +684,7 @@ int mob_spawn (struct mob_data *md)
 	md->master_id = 0;
 	md->master_dist = 0;
 
+	md->state.aggressive = md->db->mode&MD_ANGRY?1:0;
 	md->state.skillstate = MSS_IDLE;
 	md->next_walktime = tick+rand()%5000+1000;
 	md->last_linktime = tick;
@@ -817,7 +817,6 @@ static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap)
 		) {
 			(*target) = bl;
 			md->target_id=bl->id;
-			md->state.aggressive = (status_get_mode(&md->bl)&MD_ANGRY)?1:0;
 			md->min_chase= dist + md->db->range3;
 			if(md->min_chase>MAX_MINCHASE)
 				md->min_chase=MAX_MINCHASE;
@@ -855,7 +854,6 @@ static int mob_ai_sub_hard_changechase(struct block_list *bl,va_list ap)
 		) {
 			(*target) = bl;
 			md->target_id=bl->id;
-			md->state.aggressive = (status_get_mode(&md->bl)&MD_ANGRY)?1:0;
 			md->min_chase= md->db->range3;
 			return 1;
 		}
@@ -965,7 +963,6 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick)
 			}
 			if (tbl && status_check_skilluse(&md->bl, tbl, 0, 0)) {
 				md->target_id=tbl->id;
-				md->state.aggressive = (status_get_mode(&md->bl)&MD_ANGRY)?1:0;
 				md->min_chase=md->db->range3+distance_bl(&md->bl, tbl);
 				if(md->min_chase>MAX_MINCHASE)
 					md->min_chase=MAX_MINCHASE;
@@ -1167,6 +1164,8 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap)
 	) {
 		map_foreachinrange (mob_ai_sub_hard_activesearch, &md->bl,
 			view_range, md->special_state.ai?BL_CHAR:BL_PC, md, &tbl);
+		if(!tbl && mode&MD_ANGRY && !md->state.aggressive)
+			md->state.aggressive = 1; //Restore angry state when no targets are visible.
 	} else if (mode&MD_CHANGECHASE && (md->state.skillstate == MSS_RUSH || md->state.skillstate == MSS_FOLLOW)) {
 		search_size = view_range<md->db->range ? view_range:md->db->range;
 		map_foreachinrange (mob_ai_sub_hard_changechase, &md->bl,

+ 1 - 1
src/map/script.c

@@ -654,7 +654,7 @@ struct {
 	{buildin_classchange,"classchange","ii"},
 	{buildin_misceffect,"misceffect","i"},
 	{buildin_soundeffect,"soundeffect","si"},
-	{buildin_soundeffectall,"soundeffectall","*"},	// SoundEffectAll [Codemaster]
+	{buildin_soundeffectall,"soundeffectall","si*"},	// SoundEffectAll [Codemaster]
 	{buildin_strmobinfo,"strmobinfo","ii"},	// display mob data [Valaris]
 	{buildin_guardian,"guardian","siisii*i"},	// summon guardians
 	{buildin_guardianinfo,"guardianinfo","i"},	// display guardian data [Valaris]