Jump to content

Bartender

Members
  • Posts

    6
  • Joined

  • Last visited

Profile Information

  • Gender
    Not Telling

Recent Profile Visitors

1819 profile views

Bartender's Achievements

Poring

Poring (1/15)

  • Week One Done
  • One Month Later
  • One Year In

Recent Badges

0

Reputation

  1. @Seravy this project looks preaty nice but imposible to compile with visual studip I got many errors: But this is really awsome, thx to make it free and available for all
  2. Hi, Could someone help me to convert this old diff to make it compatible with last git please? When I try to do it mob have glitch when they walk on cell. 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 1 Index: 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 cell_mobnopassv01_workingdiff.diff
×
×
  • Create New...