diff options
Diffstat (limited to 'src/map')
-rw-r--r-- | src/map/clif.c | 4 | ||||
-rw-r--r-- | src/map/path.c | 71 | ||||
-rw-r--r-- | src/map/pc.c | 6 | ||||
-rw-r--r-- | src/map/skill.c | 1 |
4 files changed, 49 insertions, 33 deletions
diff --git a/src/map/clif.c b/src/map/clif.c index a695ee78b..668ef21ee 100644 --- a/src/map/clif.c +++ b/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); diff --git a/src/map/path.c b/src/map/path.c index 9e247f366..550defaa8 100644 --- a/src/map/path.c +++ b/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; diff --git a/src/map/pc.c b/src/map/pc.c index e6ae6c8af..8ffa54291 100644 --- a/src/map/pc.c +++ b/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); // ?備外し } - //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) diff --git a/src/map/skill.c b/src/map/skill.c index 0c2485307..c69ecbaeb 100644 --- a/src/map/skill.c +++ b/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; } } |