Procházet zdrojové kódy

- Merged the necessary changes to make the script engine support negative constants (db/const.txt). Thanks to Rayce (from jA) for the code.
- Cleaned up the skill.c code to take into account when skill_unitsetting returns null (skill failed), fixes a possible crash with Wand of Hermode


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

skotlex před 18 roky
rodič
revize
f7a1d44c3e
3 změnil soubory, kde provedl 23 přidání a 14 odebrání
  1. 6 0
      Changelog-Trunk.txt
  2. 5 3
      src/map/script.c
  3. 12 11
      src/map/skill.c

+ 6 - 0
Changelog-Trunk.txt

@@ -3,6 +3,12 @@ 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/09/28
+	* Merged the necessary changes to make the script engine support negative
+	  constants (db/const.txt). Thanks to Rayce (from jA) for the code. [Skotlex]
+	* Cleaned up the skill.c code to take into account when skill_unitsetting
+	  returns null (skill failed), fixes a possible crash with Wand of Hermode
+	  [Skotlex]
 2006/09/27
 	* Cleaned up status_get_party/guild_id, it should also fix a possible crash
 	  when invoking such a functio on a masterless pet. [Skotlex]

+ 5 - 3
src/map/script.c

@@ -408,7 +408,9 @@ static void add_scriptl(int l)
 		add_scriptb(backpatch>>16);
 		break;
 	case C_INT:
-		add_scripti(str_data[l].val);
+		add_scripti(abs(str_data[l].val));
+		if(str_data[l].val < 0) //Notice that this is negative, from jA (Rayce)
+			add_scriptc(C_NEG);
 		break;
 	default:
 		// もう他の用途と確定してるので数字をそのまま
@@ -1499,8 +1501,8 @@ static void read_constdb(void)
 		if(line[0]=='/' && line[1]=='/')
 			continue;
 		type=0;
-		if(sscanf(line,"%[A-Za-z0-9_],%[0-9xXA-Fa-f],%d",name,val,&type)>=2 ||
-		   sscanf(line,"%[A-Za-z0-9_] %[0-9xXA-Fa-f] %d",name,val,&type)>=2){
+		if(sscanf(line,"%[A-Za-z0-9_],%[-0-9xXA-Fa-f],%d",name,val,&type)>=2 ||
+		   sscanf(line,"%[A-Za-z0-9_] %[-0-9xXA-Fa-f] %d",name,val,&type)>=2){
 			for(i=0;name[i];i++)
 				name[i]=tolower(name[i]);
 			n=add_str((const unsigned char *) name);

+ 12 - 11
src/map/skill.c

@@ -6020,15 +6020,15 @@ int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid, int s
 		break;
 	case HP_BASILICA:
 		skill_clear_unitgroup(src);
-		sg = skill_unitsetting(src,skillid,skilllv,x,y,0);
-		sc_start(src,type,100,skilllv,skill_get_time(skillid,skilllv));
+		if ((sg = skill_unitsetting(src,skillid,skilllv,x,y,0)))
+			sc_start(src,type,100,skilllv,skill_get_time(skillid,skilllv));
 		flag|=1;
 		break;
 	case CG_HERMODE:
 		skill_clear_unitgroup(src);
-		sg = skill_unitsetting(src,skillid,skilllv,x,y,0);
-		sc_start4(src,SC_DANCING,100,
-			skillid,0,skilllv,sg->group_id,skill_get_time(skillid,skilllv));
+		if ((sg = skill_unitsetting(src,skillid,skilllv,x,y,0)))
+			sc_start4(src,SC_DANCING,100,
+				skillid,0,skilllv,sg->group_id,skill_get_time(skillid,skilllv));
 		flag|=1;
 		break;
 	case RG_CLEANER: // [Valaris]
@@ -6172,8 +6172,8 @@ int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid, int s
 		break;
 	
 	case HW_GRAVITATION:
-		sg = skill_unitsetting(src,skillid,skilllv,x,y,0);	
-		sc_start4(src,type,100,skilllv,0,BCT_SELF,(int)sg,skill_get_time(skillid,skilllv));
+		if ((sg = skill_unitsetting(src,skillid,skilllv,x,y,0)))
+			sc_start4(src,type,100,skilllv,0,BCT_SELF,(int)sg,skill_get_time(skillid,skilllv));
 		flag|=1;
 		break;
 
@@ -6199,8 +6199,8 @@ int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid, int s
 	case SG_SUN_WARM:
 	case SG_MOON_WARM:
 	case SG_STAR_WARM:
-		sg = skill_unitsetting(src,skillid,skilllv,src->x,src->y,0);
-		sc_start4(src,type,100,skilllv,0,0,(int)sg,skill_get_time(skillid,skilllv));
+		if ((sg = skill_unitsetting(src,skillid,skilllv,src->x,src->y,0)))
+			sc_start4(src,type,100,skilllv,0,0,(int)sg,skill_get_time(skillid,skilllv));
 		flag|=1;
 		break;
 
@@ -6210,14 +6210,15 @@ int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid, int s
 		else
 	  	{
 			sg = skill_unitsetting(src,skillid,skilllv,src->x,src->y,0);
+			if (!sg) break;
 			if (sc && sc->data[type].timer != -1)
 				status_change_end(src,type,-1); //Was under someone else's Gospel. [Skotlex]
 			sc_start4(src,type,100,skilllv,0,(int)sg,BCT_SELF,skill_get_time(skillid,skilllv));
 		}
 		break;
 	case NJ_TATAMIGAESHI:
-		sc_start(src,type,100,skilllv,skill_get_time2(skillid,skilllv));
-		skill_unitsetting(src,skillid,skilllv,src->x,src->y,0);
+		if (skill_unitsetting(src,skillid,skilllv,src->x,src->y,0))
+			sc_start(src,type,100,skilllv,skill_get_time2(skillid,skilllv));
 		break;
 
 	case AM_CALLHOMUN:	//[orn]