Jelajahi Sumber

- Added a check to prevent casting ground skills on a target and vice-versa when said skill use packets are received. It really shouldn't be exploitable, but doing that certainly makes the server print a lot of "unknown skill used!" messages.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9163 54d463be-8e91-2dee-dedb-b68131a5f0ec
skotlex 18 tahun lalu
induk
melakukan
9ef52ebac7
2 mengubah file dengan 16 tambahan dan 7 penghapusan
  1. 4 0
      Changelog-Trunk.txt
  2. 12 7
      src/map/clif.c

+ 4 - 0
Changelog-Trunk.txt

@@ -4,6 +4,10 @@ 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.
 
 2006/11/07
+	* Added a check to prevent casting ground skills on a target and vice-versa
+	  when said skill use packets are received. It really shouldn't be
+	  exploitable, but doing that certainly makes the server print a lot of
+	  "unknown skill used!" messages. [Skotlex]
 	* Fixed map_foreachiddb and map_foreachpc so they don't encapsulate the
 	  variable arguments into  a double va_arg list. Thanks to the Ultra Mage for
 	  the tip. [Skotlex]

+ 12 - 7
src/map/clif.c

@@ -9724,7 +9724,7 @@ static void clif_parse_UseSkillToId_homun(struct homun_data *hd, struct map_sess
  *------------------------------------------
  */
 void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) {
-	int skillnum, skilllv, lv, target_id;
+	int skillnum, skilllv, tmp, target_id;
 	unsigned int tick = gettick();
 	RFIFOHEAD(fd);
 
@@ -9741,6 +9741,10 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) {
 	//Whether skill fails or not is irrelevant, the char ain't idle. [Skotlex]
 	sd->idletime = last_tick;
 
+	tmp = skill_get_inf(skillnum);
+	if (tmp&INF_GROUND_SKILL)
+		return; //Using a ground skill on a target? WRONG.
+
 	if (skillnum >= HM_SKILLBASE && skillnum <= HM_SKILLBASE+MAX_HOMUNSKILL) {
 		clif_parse_UseSkillToId_homun(sd->hd, sd, tick, skillnum, skilllv, target_id);
 		return;
@@ -9749,9 +9753,7 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) {
 	if (skillnotok(skillnum, sd))
 		return;
 
-	if (sd->bl.id != target_id &&
-		!sd->state.skill_flag &&
-		skill_get_inf(skillnum)&INF_SELF_SKILL)
+	if (sd->bl.id != target_id && !sd->state.skill_flag && tmp&INF_SELF_SKILL)
 		target_id = sd->bl.id; //What good is it to mess up the target in self skills? Wished I knew... [Skotlex]
 	
 	if (sd->ud.skilltimer != -1) {
@@ -9814,9 +9816,9 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) {
 		else
 			skilllv = 0;
 	} else {
-		lv = pc_checkskill(sd, skillnum);
-		if (skilllv > lv)
-			skilllv = lv;
+		tmp = pc_checkskill(sd, skillnum);
+		if (skilllv > tmp)
+			skilllv = tmp;
 	}
 
 	if (skilllv)
@@ -9842,6 +9844,9 @@ void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, int skilll
 	if (skillnotok(skillnum, sd))
 		return;
 
+	if (!(skill_get_inf(skillnum)&INF_GROUND_SKILL))
+		return; //Using a target skill on the ground? WRONG.
+
 	if (skillmoreinfo != -1) {
 		if (pc_issit(sd)) {
 			clif_skill_fail(sd, skillnum, 0, 0);