diff options
author | shennetsind <shennetsind@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2012-03-23 04:32:38 +0000 |
---|---|---|
committer | shennetsind <shennetsind@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2012-03-23 04:32:38 +0000 |
commit | c73b9c6444ee0d7d9f91cce676c370b55ca234b7 (patch) | |
tree | f6e3c5c42e9455ec277fe210cfc491500b760307 | |
parent | f3bad5a9c57a123b9ae3f3070ef4edaa2f08698b (diff) | |
download | hercules-c73b9c6444ee0d7d9f91cce676c370b55ca234b7.tar.gz hercules-c73b9c6444ee0d7d9f91cce676c370b55ca234b7.tar.bz2 hercules-c73b9c6444ee0d7d9f91cce676c370b55ca234b7.tar.xz hercules-c73b9c6444ee0d7d9f91cce676c370b55ca234b7.zip |
Fixed bugreport:1017 a item dropping over a ice-wall-occupied cell is no longer lost/deleted.
Dev Note: the thing I added to sign icewalls may be suitable for bugreport:3574 as well
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@15772 54d463be-8e91-2dee-dedb-b68131a5f0ec
-rw-r--r-- | src/map/map.c | 8 | ||||
-rw-r--r-- | src/map/map.h | 5 | ||||
-rw-r--r-- | src/map/skill.c | 2 |
3 files changed, 11 insertions, 4 deletions
diff --git a/src/map/map.c b/src/map/map.c index d7be8e5a7..8fe860995 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -1346,8 +1346,7 @@ int map_clearflooritem_timer(int tid, unsigned int tick, int id, intptr_t data) * to place an BL_ITEM object. Scan area is 9x9, returns 1 on success. * x and y are modified with the target cell when successful. *------------------------------------------*/ -int map_searchrandfreecell(int m,int *x,int *y,int stack) -{ +int map_searchrandfreecell(int m,int *x,int *y,int stack) { int free_cell,i,j; int free_cells[9][2]; @@ -1357,7 +1356,7 @@ int map_searchrandfreecell(int m,int *x,int *y,int stack) for(j=-1;j<=1;j++){ if(j+*x<0 || j+*x>=map[m].xs) continue; - if(map_getcell(m,j+*x,i+*y,CELL_CHKNOPASS)) + if(map_getcell(m,j+*x,i+*y,CELL_CHKNOPASS) && !map_getcell(m,j+*x,i+*y,CELL_CHKICEWALL)) continue; //Avoid item stacking to prevent against exploits. [Skotlex] if(stack && map_count_oncell(m,j+*x,i+*y, BL_ITEM) > stack) @@ -2515,6 +2514,8 @@ int map_getcellp(struct map_data* m,int x,int y,cell_chk cellchk) return (cell.nochat); case CELL_CHKMAELSTROM: return (cell.maelstrom); + case CELL_CHKICEWALL: + return (cell.icewall); // special checks case CELL_CHKPASS: @@ -2568,6 +2569,7 @@ void map_setcell(int m, int x, int y, cell_t cell, bool flag) case CELL_NOVENDING: map[m].cell[j].novending = flag; break; case CELL_NOCHAT: map[m].cell[j].nochat = flag; break; case CELL_MAELSTROM: map[m].cell[j].maelstrom = flag; break; + case CELL_ICEWALL: map[m].cell[j].icewall = flag; break; default: ShowWarning("map_setcell: invalid cell type '%d'\n", (int)cell); break; diff --git a/src/map/map.h b/src/map/map.h index d8d0b00ea..ceddec555 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -401,6 +401,7 @@ typedef enum { CELL_NOVENDING, CELL_NOCHAT, CELL_MAELSTROM, + CELL_ICEWALL, } cell_t; @@ -424,6 +425,7 @@ typedef enum { CELL_CHKNOVENDING, CELL_CHKNOCHAT, CELL_CHKMAELSTROM, + CELL_CHKICEWALL, } cell_chk; @@ -442,7 +444,8 @@ struct mapcell landprotector : 1, novending : 1, nochat : 1, - maelstrom : 1; + maelstrom : 1, + icewall : 1; #ifdef CELL_NOSTACK unsigned char cell_bl; //Holds amount of bls in this cell. diff --git a/src/map/skill.c b/src/map/skill.c index e9a3ab61d..d1699f4ae 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -13216,6 +13216,7 @@ struct skill_unit *skill_initunit (struct skill_unit_group *group, int idx, int case WZ_ICEWALL: map_setgatcell(unit->bl.m,unit->bl.x,unit->bl.y,5); clif_changemapcell(0,unit->bl.m,unit->bl.x,unit->bl.y,5,AREA); + skill_unitsetmapcell(unit,WZ_ICEWALL,group->skill_lv,CELL_ICEWALL,true); break; case SA_LANDPROTECTOR: skill_unitsetmapcell(unit,SA_LANDPROTECTOR,group->skill_lv,CELL_LANDPROTECTOR,true); @@ -13270,6 +13271,7 @@ int skill_delunit (struct skill_unit* unit) case WZ_ICEWALL: map_setgatcell(unit->bl.m,unit->bl.x,unit->bl.y,unit->val2); clif_changemapcell(0,unit->bl.m,unit->bl.x,unit->bl.y,unit->val2,ALL_SAMEMAP); // hack to avoid clientside cell bug + skill_unitsetmapcell(unit,WZ_ICEWALL,group->skill_lv,CELL_ICEWALL,false); break; case SA_LANDPROTECTOR: skill_unitsetmapcell(unit,SA_LANDPROTECTOR,group->skill_lv,CELL_LANDPROTECTOR,false); |