Преглед изворни кода

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://svn.code.sf.net/p/rathena/svn/trunk@15772 54d463be-8e91-2dee-dedb-b68131a5f0ec

shennetsind пре 13 година
родитељ
комит
1e942e8193
3 измењених фајлова са 11 додато и 4 уклоњено
  1. 5 3
      src/map/map.c
  2. 4 1
      src/map/map.h
  3. 2 0
      src/map/skill.c

+ 5 - 3
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;

+ 4 - 1
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.

+ 2 - 0
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);