소스 검색

Fixed the incorrect interpretation of the map-cell height information stored in .gat files; this was causing an overall of 20000 cells to be treated as water when officially they aren't.
A full mapcache rebuild is needed to apply this change.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11982 54d463be-8e91-2dee-dedb-b68131a5f0ec

ultramage 17 년 전
부모
커밋
a91d8177c6
3개의 변경된 파일39개의 추가작업 그리고 33개의 파일을 삭제
  1. 3 0
      Changelog-Trunk.txt
  2. 27 22
      src/map/map.c
  3. 9 11
      src/tool/mapcache.c

+ 3 - 0
Changelog-Trunk.txt

@@ -4,6 +4,9 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2007/12/26
+	* Fixed the incorrect interpretation of the map-cell height information
+	  stored in .gat files; this was causing an overall of 20000 cells to
+	  be treated as water when officially they aren't [ultramage]
 	* Fixed string variables dereferencing directly to the value instead of 
 	  dereferencing to a copy of the value. (fixes bugreport:684 bugreport:641) [FlavioJS]
 2007/12/23

+ 27 - 22
src/map/map.c

@@ -2474,33 +2474,38 @@ int map_waterheight(char* mapname)
  *----------------------------------*/
 int map_readgat (struct map_data* m)
 {
-	char fn[256];
-	char *gat;
-	int wh,x,y,xs,ys;
-	struct gat_1cell {float high[4]; int type;} *p = NULL;
+	char filename[256];
+	uint8* gat;
+	int water_height;
+	size_t xy, off, num_cells;
 
-	sprintf(fn, "data\\%s.gat", m->name);
+	sprintf(filename, "data\\%s.gat", m->name);
 
-	// read & convert fn
-	gat = (char *) grfio_read (fn);
+	gat = (uint8 *) grfio_read(filename);
 	if (gat == NULL)
 		return 0;
 
-	xs = m->xs = *(int*)(gat+6);
-	ys = m->ys = *(int*)(gat+10);
-	m->gat = (unsigned char *)aMallocA((xs * ys)*sizeof(unsigned char));
-
-	wh = map_waterheight(m->name);
-	for (y = 0; y < ys; y++) {
-		p = (struct gat_1cell*)(gat+y*xs*20+14);
-		for (x = 0; x < xs; x++) {
-			if (wh != NO_WATER && p->type == 0)
-				// �…�ê”»’è
-				m->gat[x+y*xs] = (p->high[0]>wh || p->high[1]>wh || p->high[2]>wh || p->high[3]>wh) ? 3 : 0;
-			else
-				m->gat[x+y*xs] = p->type;
-			p++;
-		}
+	m->xs = *(int32*)(gat+6);
+	m->ys = *(int32*)(gat+10);
+	num_cells = m->xs * m->ys;
+	CREATE(m->gat, uint8, num_cells);
+
+	water_height = map_waterheight(m->name);
+
+	// Set cell properties
+	off = 14;
+	for( xy = 0; xy < num_cells; ++xy )
+	{
+		// read cell data
+		float height = *(float*)( gat + off      );
+		uint32 type = *(uint32*)( gat + off + 16 );
+		off += 20;
+
+		if( type == 0 && water_height != NO_WATER && height > water_height )
+			type = 3; // Cell is 0 (walkable) but under water level, set to 3 (walkable water)
+
+		m->gat[xy] = (uint8)type;
+
 	}
 
 	aFree(gat);

+ 9 - 11
src/tool/mapcache.c

@@ -110,7 +110,7 @@ int read_map(char *name, struct map_data *m)
 	unsigned char *gat, *rsw;
 	int water_height;
 	size_t xy, off, num_cells;
-	float height[4];
+	float height;
 	unsigned long type;
 
 	// Open map GAT
@@ -140,18 +140,16 @@ int read_map(char *name, struct map_data *m)
 	off = 14;
 	for (xy = 0; xy < num_cells; xy++)
 	{
-		// Height of the corners
-		height[0] = GetFloat( gat + off      );
-		height[1] = GetFloat( gat + off + 4  );
-		height[2] = GetFloat( gat + off + 8  );
-		height[3] = GetFloat( gat + off + 12 );
+		// Height of the bottom-left corner
+		height = GetFloat( gat + off      );
 		// Type of cell
-		type      = GetULong( gat + off + 16 );
+		type   = GetULong( gat + off + 16 );
 		off += 20;
-		if (water_height != NO_WATER && type == 0 && (height[0] > water_height || height[1] > water_height || height[2] > water_height || height[3] > water_height))
-			m->cells[xy] = 3; // Cell is 0 (walkable) but under water level, set to 3 (walkable water)
-		else
-			m->cells[xy] = (unsigned char)type;
+
+		if (type == 0 && water_height != NO_WATER && height > water_height)
+			type = 3; // Cell is 0 (walkable) but under water level, set to 3 (walkable water)
+
+		m->cells[xy] = (unsigned char)type;
 	}
 
 	free(gat);