Browse Source

Fixed Abracadabra unable to cast non-targeted skills (bugreport:186)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@12044 54d463be-8e91-2dee-dedb-b68131a5f0ec
ultramage 17 năm trước cách đây
mục cha
commit
787512d6db
2 tập tin đã thay đổi với 16 bổ sung9 xóa
  1. 1 0
      Changelog-Trunk.txt
  2. 15 9
      src/map/skill.c

+ 1 - 0
Changelog-Trunk.txt

@@ -4,6 +4,7 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2008/01/10
+	* Fixed Abracadabra unable to cast non-targeted skills (bugreport:186)
 	* Another round of login server cleaning [ultramage]
 	- fixed passwordencrypt on SQL not behaving correctly (since r10753)
 	- corrected some column lengths in the login db (username, password,...)

+ 15 - 9
src/map/skill.c

@@ -3023,14 +3023,21 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 			abra_skilllv = min(skilllv, skill_get_max(abra_skillid));
 			clif_skill_nodamage (src, bl, skillid, skilllv, 1);
 			
-			if (sd)
-			{	//Crash-protection against Abracadabra casting pets
-				sd->skillitem = abra_skillid;
-				sd->skillitemlv = abra_skilllv;
+			if( sd )
+			{// player-casted
 				sd->state.abra_flag = 1;
-				clif_item_skill (sd, abra_skillid, abra_skilllv);
-			} else
-			{	// [Skotlex]
+				if( skill_get_inf(abra_skillid)&INF_SELF_SKILL )
+					// non-targeted, execute immediately
+					unit_skilluse_id(src, bl->id, abra_skillid, abra_skilllv);
+				else
+				{// targeted, delay and let player pick target
+					sd->skillitem = abra_skillid;
+					sd->skillitemlv = abra_skilllv;
+					clif_item_skill(sd, abra_skillid, abra_skilllv);
+				}
+			}
+			else
+			{// mob-casted
 				struct unit_data *ud = unit_bl2ud(src);
 				int inf = skill_get_inf(abra_skillid);
 				int target_id = 0;
@@ -7485,8 +7492,7 @@ int skill_check_condition(struct map_session_data* sd, short skill, short lv, in
 			//Abracadabra skill, skip requisites!
 			if(type&1)
 			{	//Clear out the data.
-				sd->skillitem = sd->skillitemlv = 0;
-				sd->state.abra_flag = 0;
+				sd->skillitem = sd->skillitemlv = sd->state.abra_flag = 0;
 			}
 			return 1;
 		}