Parcourir la source

Fixed critical duel exploit (fixes #1055)
* Entering or leaving duel will now remove all the skill units you've placed
* Entering or leaving duel will now behave like warping / moving on a different tile

Playtester il y a 9 ans
Parent
commit
c6ed8a4f92
1 fichiers modifiés avec 25 ajouts et 3 suppressions
  1. 25 3
      src/map/duel.c

+ 25 - 3
src/map/duel.c

@@ -16,6 +16,8 @@
 struct duel duel_list[MAX_DUEL]; //list of current duel
 int duel_count = 0; //number of duel active
 
+static void duel_set(const unsigned int did, struct map_session_data* sd);
+
 /*
  * Save the current time of the duel in PC_LAST_DUEL_TIME
  */
@@ -88,6 +90,26 @@ void duel_showinfo(const unsigned int did, struct map_session_data* sd)
 	map_foreachpc(duel_showinfo_sub, sd, &p);
 }
 
+/*
+* Moves sd to duel
+*/
+static void duel_set(const unsigned int did, struct map_session_data* sd) {
+	sd->state.changemap = 1;
+	sd->state.warping = 1;
+
+	// As you move to a different plane, ground effects need to be cleared
+	skill_clear_unitgroup(&sd->bl);
+	skill_unit_move(&sd->bl, gettick(), 2);
+	skill_cleartimerskill(&sd->bl);
+
+	sd->duel_group = did;
+
+	skill_unit_move(&sd->bl, gettick(), 3);
+
+	sd->state.changemap = 0;
+	sd->state.warping = 0;
+}
+
 /*
  * Create a new duel for sd
  */
@@ -100,7 +122,7 @@ int duel_create(struct map_session_data* sd, const unsigned int maxpl)
 	if(i == MAX_DUEL) return 0;
 
 	duel_count++;
-	sd->duel_group = i;
+	duel_set(i, sd);
 	duel_list[i].members_count++;
 	duel_list[i].invites_count = 0;
 	duel_list[i].max_players_limit = maxpl;
@@ -169,7 +191,7 @@ void duel_leave(const unsigned int did, struct map_session_data* sd)
 		duel_count--;
 	}
 
-	sd->duel_group = 0;
+	duel_set(0, sd);
 	duel_savetime(sd);
 	clif_map_property(sd, MAPPROPERTY_NOTHING);
 	clif_maptypeproperty2(&sd->bl,SELF);
@@ -185,7 +207,7 @@ void duel_accept(const unsigned int did, struct map_session_data* sd)
 	char output[256];
 
 	duel_list[did].members_count++;
-	sd->duel_group = sd->duel_invite;
+	duel_set(sd->duel_invite, sd);
 	duel_list[did].invites_count--;
 	sd->duel_invite = 0;