https://code.google.com/p/orcao/downloads/detail?name=cell_mobnopassv01_workingdiff.diff&can=2&q=
depois faço 2 mirros e salvo aqui.
edit, mirror
Mirror 1 - 4shared
http://www.4shared.com/file/JrvcNrVfce/cell_mobnopassv01_workingdiff.htmlMirror 2 - Mega
https://mega.co.nz/#!fgpTCQaK!hTJOQg8qwqiuVCIqtrglFyMmOEUGLebOzi7tohbmtl4Mirror 3 - CODE
Index: db/const.txt===================================================================--- db/const.txt (revision 14075)+++ db/const.txt (working copy)@@ -232,6 +232,7 @@ cell_landprotector 5 cell_novending 6 cell_nochat 7+cell_nomobpass 8 //cell_gettype 0 cell_chkwall 1Index: src/map/battle.c===================================================================--- src/map/battle.c (revision 14075)+++ src/map/battle.c (working copy)@@ -3428,7 +3428,7 @@ *------------------------------------------*/ bool battle_check_range(struct block_list *src, struct block_list *bl, int range) {- int d;+ int d, CHK_Type; nullpo_retr(false, src); nullpo_retr(false, bl); @@ -3453,7 +3453,12 @@ if( d > AREA_SIZE ) return false; // Avoid targetting objects beyond your range of sight. - return path_search_long(NULL,src->m,src->x,src->y,bl->x,bl->y,CELL_CHKWALL);+ if (src->type == BL_MOB)+ CHK_Type = CELL_CHKMOBWALL;+ else+ CHK_Type = CELL_CHKWALL;++ return path_search_long(NULL,src->m,src->x,src->y,bl->x,bl->y,CHK_Type); } static const struct _battle_data {Index: src/map/map.c===================================================================--- src/map/map.c (revision 14075)+++ src/map/map.c (working copy)@@ -1247,7 +1247,7 @@ *------------------------------------------*/ int map_search_freecell(struct block_list *src, int m, short *x,short *y, int rx, int ry, int flag) {- int tries, spawn=0;+ int tries, CHK_Type, spawn=0; int bx, by; int rx2 = 2*rx+1; int ry2 = 2*ry+1;@@ -1258,6 +1258,11 @@ return 0; } + if ((src && src->type == BL_MOB) || !src) //Assume null source = mob... probably not a good idea+ CHK_Type = CELL_CHKMOBPASS;+ else+ CHK_Type = CELL_CHKREACH;+ if (flag&1) { bx = *x; by = *y;@@ -1270,7 +1275,7 @@ //No range? Return the target cell then.... *x = bx; *y = by;- return map_getcell(m,*x,*y,CELL_CHKREACH);+ return map_getcell(m,*x,*y,CHK_Type); } if (rx >= 0 && ry >= 0) {@@ -1288,7 +1293,7 @@ if (*x == bx && *y == by) continue; //Avoid picking the same target tile. - if (map_getcell(m,*x,*y,CELL_CHKREACH))+ if (map_getcell(m,*x,*y,CHK_Type)) { if(flag&2 && !unit_can_reach_pos(src, *x, *y, 1)) continue;@@ -2328,6 +2333,8 @@ case CELL_GETTYPE: return map_cell2gat(cell); + case CELL_CHKMOBWALL:+ if (cell.nomobpass && !cell.shootable) return 1; // base gat type checks case CELL_CHKWALL: return (!cell.walkable && !cell.shootable);@@ -2352,6 +2359,9 @@ return (cell.nochat); // special checks+ case CELL_CHKMOBPASS:++ if (cell.nomobpass == 1) return 0; case CELL_CHKPASS: #ifdef CELL_NOSTACK if (cell.cell_bl >= battle_config.cell_stack_limit) return 0;@@ -2359,6 +2369,8 @@ case CELL_CHKREACH: return (cell.walkable); + case CELL_CHKMOBNOPASS:+ if (cell.nomobpass == 1) return 1; case CELL_CHKNOPASS: #ifdef CELL_NOSTACK if (cell.cell_bl >= battle_config.cell_stack_limit) return 1;@@ -2402,6 +2414,7 @@ case CELL_LANDPROTECTOR: map[m].cell[j].landprotector = flag; break; case CELL_NOVENDING: map[m].cell[j].novending = flag; break; case CELL_NOCHAT: map[m].cell[j].nochat = flag; break;+ case CELL_NOMOBPASS: map[m].cell[j].nomobpass = flag; break; default: ShowWarning("map_setcell: invalid cell type '%d'n", (int)cell); break;Index: src/map/map.h===================================================================--- src/map/map.h (revision 14075)+++ src/map/map.h (working copy)@@ -349,6 +349,7 @@ CELL_LANDPROTECTOR, CELL_NOVENDING, CELL_NOCHAT,+ CELL_NOMOBPASS, } cell_t; // used by map_getcell()@@ -370,6 +371,9 @@ CELL_CHKLANDPROTECTOR, CELL_CHKNOVENDING, CELL_CHKNOCHAT,+ CELL_CHKMOBPASS, // Passable by monsters, Check CELL_NOMOB then work as CELL_CHKPASS [Orcao]+ CELL_CHKMOBNOPASS, // Used like the other No checks... seems redundant+ CELL_CHKMOBWALL, // Mob version of CHKWALL... } cell_chk; struct mapcell@@ -386,7 +390,8 @@ basilica : 1, landprotector : 1, novending : 1,- nochat : 1;+ nochat : 1,+ nomobpass : 1; #ifdef CELL_NOSTACK unsigned char cell_bl; //Holds amount of bls in this cell.Index: src/map/mob.c===================================================================--- src/map/mob.c (revision 14075)+++ src/map/mob.c (working copy)@@ -382,7 +382,7 @@ map_search_freecell(bl, m, &x, &y, 1, 1, 0); // if none found, pick random position on map- if (x <= 0 || y <= 0 || map_getcell(m,x,y,CELL_CHKNOREACH))+ if (x <= 0 || y <= 0 || map_getcell(m,x,y,CELL_CHKMOBNOPASS)) map_search_freecell(NULL, m, &x, &y, -1, -1, 1); data.x = x;@@ -477,7 +477,7 @@ x = rand()%(x1-x0+1)+x0; y = rand()%(y1-y0+1)+y0; j++;- } while( map_getcell(m,x,y,CELL_CHKNOPASS) && j < max );+ } while( map_getcell(m,x,y,CELL_CHKMOBNOPASS) && j < max ); if( j == max ) {// attempt to find an available cell failed@@ -1230,7 +1230,7 @@ x+=md->bl.x; y+=md->bl.y; - if((map_getcell(md->bl.m,x,y,CELL_CHKPASS)) && unit_walktoxy(&md->bl,x,y,1)){+ if((map_getcell(md->bl.m,x,y,CELL_CHKMOBPASS)) && unit_walktoxy(&md->bl,x,y,1)){ break; } }Index: src/map/pc.c===================================================================--- src/map/pc.c (revision 14075)+++ src/map/pc.c (working copy)@@ -4032,10 +4032,15 @@ *------------------------------------------*/ int pc_randomwarp(struct map_session_data *sd, int type) {- int x,y,i=0;+ int x,y,CHK_Type,i=0; int m; nullpo_retr(0, sd); m=sd->bl.m; + if (sd->bl.type == BL_MOB)+ CHK_Type = CELL_CHKMOBNOPASS;+ else+ CHK_Type = CELL_CHKNOPASS;+@@ -4045,7 +4050,7 @@ do{ x=rand()%(map[m].xs-2)+1; y=rand()%(map[m].ys-2)+1;- }while(map_getcell(m,x,y,CELL_CHKNOPASS) && (i++)<1000 );+ }while(map_getcell(m,x,y,CHK_Type) && (i++)<1000 ); if (i < 1000) return pc_setpos(sd,map[sd->bl.m].index,x,y,type);Index: src/map/unit.c===================================================================--- src/map/unit.c (revision 14075)+++ src/map/unit.c (working copy)@@ -55,15 +55,20 @@ int unit_walktoxy_sub(struct block_list *bl) {- int i;+ int i, CHK_Type; struct walkpath_data wpd; struct unit_data *ud = NULL; nullpo_retr(1, bl); ud = unit_bl2ud(bl); if(ud == NULL) return 0;+ + if (bl->type == BL_MOB)+ CHK_Type = CELL_CHKMOBNOPASS;+ else+ CHK_Type = CELL_CHKNOPASS; - if( !path_search(&wpd,bl->m,bl->x,bl->y,ud->to_x,ud->to_y,ud->state.walk_easy,CELL_CHKNOPASS) )+ if( !path_search(&wpd,bl->m,bl->x,bl->y,ud->to_x,ud->to_y,ud->state.walk_easy,CHK_Type) ) return 0; memcpy(&ud->walkpath,&wpd,sizeof(wpd));@@ -565,6 +570,7 @@ //it respects the no warp flags, so it is safe to call this without doing nowarpto/nowarp checks. int unit_warp(struct block_list *bl,short m,short x,short y,int type) {+ int CHK_Type; struct unit_data *ud; nullpo_retr(0, bl); ud = unit_bl2ud(bl);@@ -585,10 +591,13 @@ return 1; if (m != bl->m && map[m].flag.nobranch && battle_config.mob_warp&4) return 1;+ CHK_Type = CELL_CHKMOBNOPASS; break; case BL_PC: if (map[bl->m].flag.noteleport) return 1;+ default:+ CHK_Type = CELL_CHKNOREACH; break; } @@ -599,7 +608,7 @@ return 2; }- } else if (map_getcell(m,x,y,CELL_CHKNOREACH))+ } else if (map_getcell(m,x,y,CHK_Type)) { //Invalid target cell ShowWarning("unit_warp: Specified non-walkable target cell: %d (%s) at [%d,%d]n", m, map[m].name, x,y); @@ -1342,4 +1351,5 @@ *------------------------------------------*/ bool unit_can_reach_pos(struct block_list *bl,int x,int y, int easy) {+ int CHK_Type; nullpo_retr(false, bl);@@ -1350,2 +1360,7 @@- return path_search(NULL,bl->m,bl->x,bl->y,x,y,easy,CELL_CHKNOREACH);+ if (bl->type == BL_MOB)+ CHK_Type = CELL_CHKMOBNOPASS;+ else+ CHK_Type = CELL_CHKNOREACH;++ return path_search(NULL,bl->m,bl->x,bl->y,x,y,easy,CHK_Type); }@@ -1355,7 +1370,7 @@ *------------------------------------------*/ bool unit_can_reach_bl(struct block_list *bl,struct block_list *tbl, int range, int easy, short *x, short *y) {- int i;+ int i, CHK_Type; short dx,dy; nullpo_retr(false, bl); nullpo_retr(false, tbl);@@ -1375,9 +1390,16 @@ dx=(dx>0)?1:((dx<0)?-1:0); dy=(dy>0)?1:((dy<0)?-1:0); - if (map_getcell(tbl->m,tbl->x-dx,tbl->y-dy,CELL_CHKNOPASS))+ if(bl->type != BL_MOB){+ CHK_Type = CELL_CHKNOPASS;+ }+ else{+ CHK_Type = CELL_CHKMOBNOPASS;+ }++ if (map_getcell(tbl->m,tbl->x-dx,tbl->y-dy,CHK_Type)) { //Look for a suitable cell to place in.- for(i=0;i<9 && map_getcell(tbl->m,tbl->x-dirx[i],tbl->y-diry[i],CELL_CHKNOPASS);i++);+ for(i=0;i<9 && map_getcell(tbl->m,tbl->x-dirx[i],tbl->y-diry[i],CHK_Type);i++); if (i==9) return false; //No valid cells. dx = dirx[i]; dy = diry[i];@@ -1385,7 +1407,7 @@ if (x) *x = tbl->x-dx; if (y) *y = tbl->y-dy;- return path_search(NULL,bl->m,bl->x,bl->y,tbl->x-dx,tbl->y-dy,easy,CELL_CHKNOREACH);+ return path_search(NULL,bl->m,bl->x,bl->y,tbl->x-dx,tbl->y-dy,easy,CHK_Type); } /*========================================== * Calculates position of Pet/Mercenary/Homunculus