Pārlūkot izejas kodu

- When walking into a Guild Dungeon your pvp_points will be set to 5 so you have to die twice before being warped out.
- If jobchanging while disguised, the disguise will be removed, since it can't be kept and still calculate correctly the new job class to use.
- Fuuma shurikens are now unbreakable code-wise (like all maces, books, etc)
- Applied Meruru's patch to increase speed of easy path seeks.


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

skotlex 18 gadi atpakaļ
vecāks
revīzija
224e07c6cc
5 mainītis faili ar 56 papildinājumiem un 33 dzēšanām
  1. 7 0
      Changelog-Trunk.txt
  2. 4 0
      src/map/clif.c
  3. 39 32
      src/map/path.c
  4. 5 1
      src/map/pc.c
  5. 1 0
      src/map/skill.c

+ 7 - 0
Changelog-Trunk.txt

@@ -4,6 +4,13 @@ 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/12/18
+	* When walking into a Guild Dungeon your pvp_points will be set to 5 so you
+	  have to die twice before being warped out.
+	* If jobchanging while disguised, the disguise will be removed, since it
+	  can't be kept and still calculate correctly the new job class to use.
+	* Fuuma shurikens are now unbreakable code-wise (like all maces, books,
+	  etc)
+	* Applied Meruru's patch to increase speed of easy path seeks. [Skotlex]
 	* Cosmetic changes to db.
 	* Fixed the unused MAPINDEX_AUTOADD section in mapindex.c (mapindex.h 
 	  wasn't being included) [FlavioJS]

+ 4 - 0
src/map/clif.c

@@ -8308,7 +8308,11 @@ void clif_parse_LoadEndAck(int fd,struct map_session_data *sd)
 		clif_set0199(fd, 1);
 
 	if (map[sd->bl.m].flag.gvg_dungeon)
+	{
 		clif_set0199(fd,2); //TODO: Figure out the real thing to do here.
+		if (!sd->pvp_point)
+			sd->pvp_point=5; //Need to die twice to be warped out.
+	}
 
 	if(map_flag_gvg(sd->bl.m))
 		clif_set0199(fd,3);

+ 39 - 32
src/map/path.c

@@ -23,6 +23,13 @@
 struct tmp_path { short x,y,dist,before,cost,flag;};
 #define calc_index(x,y) (((x)+(y)*MAX_WALKPATH) & (MAX_WALKPATH*MAX_WALKPATH-1))
 
+const char walk_choices [3][3] =
+{
+	{1,0,7},
+	{2,-1,6},
+	{3,4,5},
+};
+
 /*==========================================
  * 経路探索補助heap push
  *------------------------------------------
@@ -307,14 +314,14 @@ int path_search_long_real(struct shootpath_data *spd,int m,int x0,int y0,int x1,
  * path探索 (x0,y0)->(x1,y1)
  *------------------------------------------
  */
+
 int path_search_real(struct walkpath_data *wpd,int m,int x0,int y0,int x1,int y1,int flag,cell_t flag2)
 {
 	int heap[MAX_HEAP+1];
 	struct tmp_path tp[MAX_WALKPATH*MAX_WALKPATH];
-	int i,rp,x,y;
-	int xs,ys;
+	register int i,x,y,dx,dy;
+	int rp,xs,ys;
 	struct map_data *md;
-	int dx,dy;
 
 	nullpo_retr(0, wpd);
 
@@ -331,36 +338,36 @@ int path_search_real(struct walkpath_data *wpd,int m,int x0,int y0,int x1,int y1
 	if(x1<0 || x1>=md->xs || y1<0 || y1>=md->ys || map_getcellp(md,x1,y1,flag2))
 		return -1;
 
-	// easy
-	// この内部では、0 <= x+dx < sx, 0 <= y+dy < sy は保証されている
-	dx = (x1-x0<0) ? -1 : 1;
-	dy = (y1-y0<0) ? -1 : 1;
-	for(x=x0,y=y0,i=0;x!=x1 || y!=y1;){
-		if(i>=sizeof(wpd->path))
-			return -1;
-		if(x!=x1 && y!=y1){
-			if(map_getcellp(md,x+dx,y   ,flag2))
-				break;
-			if(map_getcellp(md,x   ,y+dy,flag2))
-				break;
-			if(map_getcellp(md,x+dx,y+dy,flag2))
-				break;
-			x+=dx;
-			y+=dy;
-			wpd->path[i++]=(dx<0) ? ((dy>0)? 1 : 3) : ((dy<0)? 5 : 7);
-		} else if(x!=x1){
-			if(map_getcellp(md,x+dx,y   ,flag2))
-				break;
-			x+=dx;
-			wpd->path[i++]=(dx<0) ? 2 : 6;
-		} else if(y!=y1){
-			if(map_getcellp(md,x   ,y+dy,flag2))
-				break;
-			y+=dy;
-			wpd->path[i++]=(dy>0) ? 0 : 4;
-		}
+	// easy and better [Meruru]
+	dx = ((dx = x1-x0)) ? ((dx<0) ? -1 : 1) : 0;
+	dy = ((dy = y1-y0)) ? ((dy<0) ? -1 : 1) : 0;
+
+	//Better faster stronger simple path algo. [Meruru]
+	for(x=x0,y=y0,i=0;i < sizeof(wpd->path);)
+	{
+		wpd->path[i++] = walk_choices[-dy + 1][dx + 1];
+
+		x += dx;
+		y += dy;
+
+		if(x == x1) dx = 0;
+		if(y == y1) dy = 0;
+
+		if((!dx && !dy) || map_getcellp(md,x,y,flag2))
+			break;
 	}
-	if (x==x1 && y==y1) { //easy path successful.
+
+	/*
+	You may be thinking what about diagonal
+	moves? Cant they cause a error with this some how?
+	Answer is NO! The only time this can cause a error
+	is if the target block lies on the diagonal and
+	is non walkable. But rember we already checked that
+	up above! So no problems here... I think [Meruru]
+	*/
+
+	if (x==x1 && y==y1)
+	{ //easy path successful.
 		wpd->path_len=i;
 		wpd->path_pos=0;
 		wpd->path_half=0;

+ 5 - 1
src/map/pc.c

@@ -5538,7 +5538,11 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper)
 				pc_unequipitem(sd,sd->equip_index[i],2);	// ?”õŠO‚µ
 	}
 
-	//Change look
+	//Change look, if disguised, you need to undisguise 
+	//to correctly calculate new job sprite without
+	if (sd->disguise)
+		pc_disguise(sd, 0);
+
 	status_set_viewdata(&sd->bl, job);
 	clif_changelook(&sd->bl,LOOK_BASE,sd->vd.class_); // move sprite update to prevent client crashes with incompatible equipment [Valaris]
 	if(sd->vd.cloth_color)

+ 1 - 0
src/map/skill.c

@@ -1650,6 +1650,7 @@ int skill_break_equip (struct block_list *bl, unsigned short where, int rate, in
 				case W_MACE: // Axes and Maces can't be broken [DracoRPG]
 				case W_STAFF:
 				case W_BOOK: //Rods and Books can't be broken [Skotlex]
+				case W_HUUMA:
 					where &= ~EQP_WEAPON;
 			}
 		}