summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshennetsind <shennetsind@54d463be-8e91-2dee-dedb-b68131a5f0ec>2012-03-23 04:32:38 +0000
committershennetsind <shennetsind@54d463be-8e91-2dee-dedb-b68131a5f0ec>2012-03-23 04:32:38 +0000
commitc73b9c6444ee0d7d9f91cce676c370b55ca234b7 (patch)
treef6e3c5c42e9455ec277fe210cfc491500b760307
parentf3bad5a9c57a123b9ae3f3070ef4edaa2f08698b (diff)
downloadhercules-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.c8
-rw-r--r--src/map/map.h5
-rw-r--r--src/map/skill.c2
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);