Преглед на файлове

* Cleaned up junk left in the code by the mapcache/mapindex update
- Added mapindex_getmapname(_ext) to help with ".gat" adding/removing
- Moved related processing to the interface (prevents duplicity)

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

ultramage преди 18 години
родител
ревизия
f5f77a5d51
променени са 15 файла, в които са добавени 193 реда и са изтрити 217 реда
  1. 4 0
      Changelog-Trunk.txt
  2. 16 20
      src/char/char.c
  3. 14 16
      src/char_sql/char.c
  4. 55 18
      src/common/mapindex.c
  5. 3 1
      src/common/mapindex.h
  6. 10 10
      src/map/chrif.c
  7. 50 90
      src/map/clif.c
  8. 5 5
      src/map/clif.h
  9. 9 10
      src/map/guild.c
  10. 2 2
      src/map/guild.h
  11. 2 2
      src/map/map.c
  12. 6 6
      src/map/mob.c
  13. 13 25
      src/map/script.c
  14. 1 9
      src/map/skill.c
  15. 3 3
      src/map/unit.c

+ 4 - 0
Changelog-Trunk.txt

@@ -3,6 +3,10 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
+2007/08/08
+	* Cleaned up junk left in the code by the mapcache/mapindex update
+	- Added mapindex_getmapname(_ext) to help with ".gat" adding/removing
+	- Moved related processing to the interface (prevents duplicity)
 2007/08/07
 	* Expanded isloggedin script command to support an optional argument (char id)
 	* Expanded warpparty command to accept target "Leader", this will warp the

+ 16 - 20
src/char/char.c

@@ -3446,26 +3446,22 @@ int parse_char(int fd)
 				ShowWarning("Unable to find map-server for '%s', sending to major city '%s'.\n", mapindex_id2name(cd->last_point.map), mapindex_id2name(j));
 				cd->last_point.map = j;
 			}
-			{
-				//Send player to map
-				uint32 subnet_map_ip;
-				char map_name[MAP_NAME_LENGTH_EXT];
-				snprintf(map_name, MAP_NAME_LENGTH_EXT, "%s.gat", mapindex_id2name(cd->last_point.map));
-
-				WFIFOHEAD(fd,28);
-				WFIFOW(fd,0) = 0x71;
-				WFIFOL(fd,2) = cd->char_id;
-				memcpy(WFIFOP(fd,6), map_name, MAP_NAME_LENGTH_EXT);
-			
-				// Advanced subnet check [LuzZza]
-				subnet_map_ip = lan_subnetcheck(ipl);
-				WFIFOL(fd,22) = htonl((subnet_map_ip) ? subnet_map_ip : server[i].ip);
-				WFIFOW(fd,26) = ntows(htons(server[i].port)); // [!] LE byte order here [!]
-				WFIFOSET(fd,28);
-
-				ShowInfo("Character selection '%s' (account: %d, slot: %d).\n",
-					cd->name, sd->account_id, ch);
-			}
+
+			//Send player to map
+			WFIFOHEAD(fd,28);
+			WFIFOW(fd,0) = 0x71;
+			WFIFOL(fd,2) = cd->char_id;
+			safestrncpy((char*)WFIFOP(fd,6), mapindex_getmapname_ext(mapindex_id2name(cd->last_point.map),NULL), MAP_NAME_LENGTH_EXT);
+		{
+			// Advanced subnet check [LuzZza]
+			uint32 subnet_map_ip;
+			subnet_map_ip = lan_subnetcheck(ipl);
+			WFIFOL(fd,22) = htonl((subnet_map_ip) ? subnet_map_ip : server[i].ip);
+			WFIFOW(fd,26) = ntows(htons(server[i].port)); // [!] LE byte order here [!]
+			WFIFOSET(fd,28);
+		}
+			ShowInfo("Character selection '%s' (account: %d, slot: %d).\n", cd->name, sd->account_id, ch);
+
 			if (auth_fifo_pos >= AUTH_FIFO_SIZE)
 				auth_fifo_pos = 0;
 			auth_fifo[auth_fifo_pos].account_id = sd->account_id;

+ 14 - 16
src/char_sql/char.c

@@ -3182,22 +3182,20 @@ int parse_char(int fd)
 				ShowWarning("Unable to find map-server for '%s', sending to major city '%s'.\n", mapindex_id2name(char_dat.last_point.map), mapindex_id2name(j));
 				char_dat.last_point.map = j;
 			}
-			{
-				//Send player to map
-				uint32 subnet_map_ip;
-				char map_name[MAP_NAME_LENGTH_EXT];
-				snprintf(map_name, MAP_NAME_LENGTH_EXT, "%s.gat", mapindex_id2name(char_dat.last_point.map));	
-				WFIFOHEAD(fd,28);
-				WFIFOW(fd,0) = 0x71;
-				WFIFOL(fd,2) = char_dat.char_id;
-				memcpy(WFIFOP(fd,6), map_name, MAP_NAME_LENGTH_EXT);
-
-				// Advanced subnet check [LuzZza]
-				subnet_map_ip = lan_subnetcheck(ipl);
-				WFIFOL(fd,22) = htonl((subnet_map_ip) ? subnet_map_ip : server[i].ip);
-				WFIFOW(fd,26) = ntows(htons(server[i].port)); // [!] LE byte order here [!]
-				WFIFOSET(fd,28);
-			}
+
+			//Send player to map
+			WFIFOHEAD(fd,28);
+			WFIFOW(fd,0) = 0x71;
+			WFIFOL(fd,2) = char_dat.char_id;
+			safestrncpy((char*)WFIFOP(fd,6), mapindex_getmapname_ext(mapindex_id2name(char_dat.last_point.map),NULL), MAP_NAME_LENGTH_EXT);
+		{
+			// Advanced subnet check [LuzZza]
+			uint32 subnet_map_ip;
+			subnet_map_ip = lan_subnetcheck(ipl);
+			WFIFOL(fd,22) = htonl((subnet_map_ip) ? subnet_map_ip : server[i].ip);
+			WFIFOW(fd,26) = ntows(htons(server[i].port)); // [!] LE byte order here [!]
+			WFIFOSET(fd,28);
+		}
 			if (auth_fifo_pos >= AUTH_FIFO_SIZE)
 				auth_fifo_pos = 0;
 			auth_fifo[auth_fifo_pos].account_id = sd->account_id;

+ 55 - 18
src/common/mapindex.c

@@ -15,46 +15,84 @@
 
 struct _indexes {
 	char name[MAP_NAME_LENGTH]; //Stores map name
-	bool exists; //Set to 1 if index exists
 } indexes[MAX_MAPINDEX];
 
 static unsigned short max_index = 0;
 
 char mapindex_cfgfile[80] = "db/map_index.txt";
 
-// Removes the extension from a map name
-char* mapindex_normalize_name(char* mapname)
+#define mapindex_exists(id) (indexes[id].name[0] != '\0')
+
+/// Retrieves the map name from 'string' (removing .gat extension if present).
+/// Result gets placed either into 'buf' or in a static local buffer.
+const char* mapindex_getmapname(const char* string, char* output)
+{
+	static char buf[MAP_NAME_LENGTH];
+	char* dest = (output != NULL) ? output : buf;
+	
+	size_t len = strnlen(string, MAP_NAME_LENGTH_EXT);
+	if (len == MAP_NAME_LENGTH_EXT) {
+		ShowWarning("(mapindex_normalize_name) Map name '%*s' is too long!", 2*MAP_NAME_LENGTH_EXT, string);
+		len--;
+	}
+	if (len >= 4 && stricmp(&string[len-4], ".gat") == 0)
+		len -= 4; // strip .gat extension
+	
+	len = min(len, MAP_NAME_LENGTH-1);
+	safestrncpy(dest, string, len+1);
+	
+	return dest;
+}
+
+/// Retrieves the map name from 'string' (adding .gat extension if not already present).
+/// Result gets placed either into 'buf' or in a static local buffer.
+const char* mapindex_getmapname_ext(const char* string, char* output)
 {
-	char* ptr = strrchr(mapname, '.');
-	if (ptr && stricmp(ptr, ".gat") == 0)
-		*ptr = '\0'; // remove extension
-	return mapname;
+	static char buf[MAP_NAME_LENGTH_EXT];
+	char* dest = (output != NULL) ? output : buf;
+	
+	size_t len = strnlen(string, MAP_NAME_LENGTH);
+	if (len == MAP_NAME_LENGTH) {
+		ShowWarning("(mapindex_normalize_name) Map name '%*s' is too long!", 2*MAP_NAME_LENGTH, string);
+		len--;
+	}
+	
+	safestrncpy(dest, string, len+1);
+	
+	if (len < 4 || stricmp(&dest[len-4], ".gat") != 0) {
+		strcpy(&dest[len], ".gat");
+		len += 4; // add .gat extension
+	}
+	
+	return dest;
 }
 
 /// Adds a map to the specified index
 /// Returns 1 if successful, 0 oherwise
 int mapindex_addmap(int index, const char* name)
 {
-	char map_name[MAP_NAME_LENGTH_EXT];
+	char map_name[MAP_NAME_LENGTH];
 
 	if (index < 0 || index >= MAX_MAPINDEX) {
 		ShowError("(mapindex_add) Map index (%d) for \"%s\" out of range (max is %d)\n", index, name, MAX_MAPINDEX);
 		return 0;
 	}
 
-	safestrncpy(map_name, name, MAP_NAME_LENGTH_EXT);
-	mapindex_normalize_name(map_name);
+	mapindex_getmapname(name, map_name);
 
-	if (strlen(map_name) >= MAP_NAME_LENGTH) {
-		ShowError("(mapindex_add) Map name %s is too long. Maps are limited to %d characters.\n", map_name, MAP_NAME_LENGTH);
+	if (map_name[0] == '\0') {
+		ShowError("(mapindex_add) Cannot add maps with no name.\n");
 		return 0;
 	}
+	//if (strlen(map_name) >= MAP_NAME_LENGTH) {
+	//	ShowError("(mapindex_add) Map name %s is too long. Maps are limited to %d characters.\n", map_name, MAP_NAME_LENGTH);
+	//	return 0;
+	//}
 
-	if (indexes[index].exists)
+	if (mapindex_exists(index))
 		ShowWarning("(mapindex_add) Overriding index %d: map \"%s\" -> \"%s\"\n", index, indexes[index].name, map_name);
 
 	safestrncpy(indexes[index].name, map_name, MAP_NAME_LENGTH);
-	indexes[index].exists = true;
 	if (max_index <= index)
 		max_index = index+1;
 
@@ -66,9 +104,8 @@ unsigned short mapindex_name2id(const char* name)
 	//TODO: Perhaps use a db to speed this up? [Skotlex]
 	int i;
 
-	char map_name[MAP_NAME_LENGTH_EXT];
-	safestrncpy(map_name, name, MAP_NAME_LENGTH_EXT);
-	mapindex_normalize_name(map_name);
+	char map_name[MAP_NAME_LENGTH];
+	mapindex_getmapname(name, map_name);
 
 	for (i = 1; i < max_index; i++)
 	{
@@ -91,7 +128,7 @@ unsigned short mapindex_name2id(const char* name)
 
 const char* mapindex_id2name(unsigned short id)
 {
-	if (id > MAX_MAPINDEX || !indexes[id].exists) {
+	if (id > MAX_MAPINDEX || !mapindex_exists(id)) {
 		ShowDebug("mapindex_id2name: Requested name for non-existant map index [%d] in cache.\n", id);
 		return indexes[0].name; // dummy empty string so that the callee doesn't crash
 	}

+ 3 - 1
src/common/mapindex.h

@@ -36,7 +36,9 @@ extern char mapindex_cfgfile[80];
 #define MAP_VEINS "veins"
 #define MAP_JAIL "sec_pri"
 #define MAP_NOVICE "new_zone01"
-char *mapindex_normalize_name(char *mapname);
+
+const char* mapindex_getmapname(const char* string, char* output);
+const char* mapindex_getmapname_ext(const char* string, char* output);
 int mapindex_addmap(int index, const char *name);
 unsigned short mapindex_name2id(const char*);
 const char* mapindex_id2name(unsigned short);

+ 10 - 10
src/map/chrif.c

@@ -28,7 +28,7 @@ struct dbt *auth_db;
 
 static const int packet_len_table[0x3d] = { // U - used, F - free
 	60, 3,-1,27,10,-1, 6,-1,	// 2af8-2aff: U->2af8, U->2af9, U->2afa, U->2afb, U->2afc, U->2afd, U->2afe, U->2aff
-	 6,-1,18, 7,-1,49,30,10,	// 2b00-2b07: U->2b00, U->2b01, U->2b02, U->2b03, U->2b04, U->2b05, U->2b06, U->2b07
+	 6,-1,18, 7,-1,35,30,10,	// 2b00-2b07: U->2b00, U->2b01, U->2b02, U->2b03, U->2b04, U->2b05, U->2b06, U->2b07
 	 6,30,-1,10,86, 7,44,34,	// 2b08-2b0f: U->2b08, U->2b09, U->2b0a, U->2b0b, U->2b0c, U->2b0d, U->2b0e, U->2b0f
 	11,-1,10, 6,11,-1, 0,10,	// 2b10-2b17: U->2b10, U->2b11, U->2b12, U->2b13, U->2b14, U->2b15, U->2b16, U->2b17
 	-1,-1,-1,-1,-1,-1, 2, 7,	// 2b18-2b1f: U->2b18, U->2b19, U->2b1a, U->2b1b, U->2b1c, U->2b1d, U->2b1e, U->2b1f
@@ -310,25 +310,25 @@ int chrif_changemapserver(struct map_session_data* sd, short map, int x, int y,
 	return 0;
 }
 
-// map-server change request acknowledgement (positive or negative)
-int chrif_changemapserverack(int fd)
+/// map-server change request acknowledgement (positive or negative)
+/// R 2b06 <account_id>.L <login_id1>.L <login_id2>.L <char_id>.L <map_index>.W <x>.W <y>.W <ip>.L <port>.W
+int chrif_changemapserverack(int account_id, int login_id1, int login_id2, int char_id, short map_index, short x, short y, uint32 ip, uint16 port)
 {
+
 	struct map_session_data *sd;
-	char mapname[MAP_NAME_LENGTH_EXT];
-	sd = map_id2sd(RFIFOL(fd,2));
+	sd = map_id2sd(account_id);
 
-	if (sd == NULL || sd->status.char_id != RFIFOL(fd,14))
+	if (sd == NULL || sd->status.char_id != char_id)
 		return -1;
 
-	if (RFIFOL(fd,6) == 1) {
+	if (login_id1 == 1) { //FIXME: charserver says '0'!
 		if (battle_config.error_log)
 			ShowError("map server change failed.\n");
 		clif_authfail_fd(sd->fd, 0);
 		return 0;
 	}
 
-	sprintf(mapname, "%s.gat", mapindex_id2name(RFIFOW(fd,18)));
-	clif_changemapserver(sd, mapname, RFIFOW(fd,20), RFIFOW(fd,22), ntohl(RFIFOL(fd,24)), ntohs(RFIFOW(fd,28)));
+	clif_changemapserver(sd, map_index, x, y, ntohl(ip), ntohs(port));
 
 	//Player has been saved already, remove him from memory. [Skotlex]	
 	map_quit(sd);
@@ -1297,7 +1297,7 @@ int chrif_parse(int fd)
 		case 0x2b00: map_setusers(fd); break;
 		case 0x2b03: clif_charselectok(RFIFOL(fd,2)); break;
 		case 0x2b04: chrif_recvmap(fd); break;
-		case 0x2b06: chrif_changemapserverack(fd); break;
+		case 0x2b06: chrif_changemapserverack(RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14), RFIFOW(fd,18), RFIFOW(fd,20), RFIFOW(fd,22), RFIFOL(fd,24), RFIFOW(fd,28)); break;
 		case 0x2b07: clif_updatemaxid(RFIFOL(fd,2), RFIFOL(fd,6)); break;
 		case 0x2b09: map_addchariddb(RFIFOL(fd,2), (char*)RFIFOP(fd,6)); break;
 		case 0x2b0b: chrif_changedgm(fd); break;

+ 50 - 90
src/map/clif.c

@@ -1187,21 +1187,15 @@ static void clif_spiritball_single(int fd, struct map_session_data *sd)
 /*==========================================
  *
  *------------------------------------------*/
-static int clif_set0192(int fd, int m, int x, int y, int type)
+static void clif_set0192(int fd, int m, int x, int y, int type)
 {
-	char map_name[MAP_NAME_LENGTH_EXT];
-
-	sprintf(map_name, "%s.gat", map[m].name);
-
 	WFIFOHEAD(fd, packet_len(0x192));
 	WFIFOW(fd,0) = 0x192;
 	WFIFOW(fd,2) = x;
 	WFIFOW(fd,4) = y;
 	WFIFOW(fd,6) = type;
-	memcpy(WFIFOP(fd,8),map_name,MAP_NAME_LENGTH_EXT);
+	safestrncpy((char*)WFIFOP(fd,8), mapindex_getmapname_ext(map[m].name,NULL), MAP_NAME_LENGTH_EXT);
 	WFIFOSET(fd,packet_len(0x192));
-
-	return 0;
 }
 
 // new and improved weather display [Valaris]
@@ -1650,49 +1644,38 @@ void clif_setwaitclose(int fd)
 /*==========================================
  *
  *------------------------------------------*/
-int clif_changemap(struct map_session_data *sd, short map, int x, int y)
+void clif_changemap(struct map_session_data *sd, short map, int x, int y)
 {
 	int fd;
-	char map_name[MAP_NAME_LENGTH_EXT];
-
-	nullpo_retr(0, sd);
-
+	nullpo_retv(sd);
 	fd = sd->fd;
 
-	sprintf(map_name, "%s.gat", mapindex_id2name(map));
-
 	WFIFOHEAD(fd, packet_len(0x91));
 	WFIFOW(fd,0) = 0x91;
-	memcpy(WFIFOP(fd,2), map_name, MAP_NAME_LENGTH_EXT);
+	safestrncpy((char*)WFIFOP(fd,2), mapindex_getmapname_ext(mapindex_id2name(map),NULL), MAP_NAME_LENGTH_EXT);
 	WFIFOW(fd,18) = x;
 	WFIFOW(fd,20) = y;
 	WFIFOSET(fd, packet_len(0x91));
-
-	return 0;
 }
 
 /*==========================================
  * Tells the client to connect to another map-server
  *------------------------------------------*/
-int clif_changemapserver(struct map_session_data* sd, const char* mapname, int x, int y, uint32 ip, uint16 port)
+void clif_changemapserver(struct map_session_data* sd, unsigned short map_index, int x, int y, uint32 ip, uint16 port)
 {
 	int fd;
-
-	nullpo_retr(0, sd);
-
+	nullpo_retv(sd);
 	fd = sd->fd;
+
 	WFIFOHEAD(fd, packet_len(0x92));
 	WFIFOW(fd,0) = 0x92;
-	//Better not trust the null-terminator is there. [Skotlex]
-	memcpy(WFIFOP(fd,2), mapname, MAP_NAME_LENGTH_EXT);
+	safestrncpy((char*)WFIFOP(fd,2), mapindex_getmapname_ext(mapindex_id2name(map_index),NULL), MAP_NAME_LENGTH_EXT);
 	WFIFOB(fd,17) = 0;	//Null terminator for mapname
 	WFIFOW(fd,18) = x;
 	WFIFOW(fd,20) = y;
 	WFIFOL(fd,22) = htonl(ip);
 	WFIFOW(fd,26) = ntows(htons(port)); // [!] LE byte order here [!]
 	WFIFOSET(fd, packet_len(0x92));
-
-	return 0;
 }
 
 int clif_blown(struct block_list *bl)
@@ -4717,22 +4700,21 @@ int clif_skill_delunit(struct skill_unit *unit)
 /*==========================================
  * ワープ場所選択
  *------------------------------------------*/
-int clif_skill_warppoint(struct map_session_data* sd, int skill_num, int skill_lv, int map1, int map2, int map3, int map4)
+void clif_skill_warppoint(struct map_session_data* sd, int skill_num, int skill_lv, int map1, int map2, int map3, int map4)
 {
 	int fd;
-
-	nullpo_retr(0, sd);
+	nullpo_retv(sd);
 	fd = sd->fd;
 
 	WFIFOHEAD(fd,packet_len(0x11c));
 	WFIFOW(fd,0) = 0x11c;
 	WFIFOW(fd,2) = skill_num;
 	memset(WFIFOP(fd,4), 0x00, 4*MAP_NAME_LENGTH_EXT);
-	if (map1 == -1) strcpy((char*)WFIFOP(fd, 4), "Random");
-	if (map1 > 0) snprintf((char*)WFIFOP(fd, 4), MAP_NAME_LENGTH_EXT, "%s.gat", mapindex_id2name(map1));
-	if (map2 > 0) snprintf((char*)WFIFOP(fd,20), MAP_NAME_LENGTH_EXT, "%s.gat", mapindex_id2name(map2));
-	if (map3 > 0) snprintf((char*)WFIFOP(fd,36), MAP_NAME_LENGTH_EXT, "%s.gat", mapindex_id2name(map3));
-	if (map4 > 0) snprintf((char*)WFIFOP(fd,52), MAP_NAME_LENGTH_EXT, "%s.gat", mapindex_id2name(map4));
+	if (map1 == -1) safestrncpy((char*)WFIFOP(fd, 4), "Random", MAP_NAME_LENGTH_EXT);
+	if (map1 > 0)   safestrncpy((char*)WFIFOP(fd, 4), mapindex_getmapname_ext(mapindex_id2name(map1),NULL), MAP_NAME_LENGTH_EXT);
+	if (map2 > 0)   safestrncpy((char*)WFIFOP(fd,20), mapindex_getmapname_ext(mapindex_id2name(map2),NULL), MAP_NAME_LENGTH_EXT);
+	if (map3 > 0)   safestrncpy((char*)WFIFOP(fd,36), mapindex_getmapname_ext(mapindex_id2name(map3),NULL), MAP_NAME_LENGTH_EXT);
+	if (map4 > 0)   safestrncpy((char*)WFIFOP(fd,52), mapindex_getmapname_ext(mapindex_id2name(map4),NULL), MAP_NAME_LENGTH_EXT);
 	WFIFOSET(fd,packet_len(0x11c));
 
 	sd->menuskill_id = skill_num;
@@ -4740,7 +4722,6 @@ int clif_skill_warppoint(struct map_session_data* sd, int skill_num, int skill_l
 		sd->menuskill_val = (sd->ud.skillx<<16)|sd->ud.skilly; //Store warp position here.
 	else
 		sd->menuskill_val = skill_lv;
-	return 0;
 }
 /*==========================================
  * メモ応答
@@ -5698,7 +5679,6 @@ int clif_party_created(struct map_session_data *sd,int flag)
 int clif_party_member_info(struct party_data *p, struct map_session_data *sd)
 {
 	unsigned char buf[96];
-	char map_name[MAP_NAME_LENGTH_EXT];
 
 	if (!sd) { //Pick any party member (this call is used when changing item share rules)
 		int i;
@@ -5707,17 +5687,15 @@ int clif_party_member_info(struct party_data *p, struct map_session_data *sd)
 		sd = p->data[i].sd;
 	}
 
-	snprintf(map_name, MAP_NAME_LENGTH_EXT, "%s.gat", mapindex_id2name(sd->mapindex));
-
-	WBUFW(buf,0)=0x1e9;
-	WBUFL(buf,2)= sd->status.account_id;
-	WBUFL(buf,6)= 0; //Apparently setting this to 1 makes you adoptable.
-	WBUFW(buf,10)=sd->bl.x;
-	WBUFW(buf,12)=sd->bl.y;
-	WBUFB(buf,14)=0; //Unconfirmed byte, could be online/offline.
+	WBUFW(buf, 0) = 0x1e9;
+	WBUFL(buf, 2) = sd->status.account_id;
+	WBUFL(buf, 6) = 0; //Apparently setting this to 1 makes you adoptable.
+	WBUFW(buf,10) = sd->bl.x;
+	WBUFW(buf,12) = sd->bl.y;
+	WBUFB(buf,14) = 0; //Unconfirmed byte, could be online/offline.
 	memcpy(WBUFP(buf,15), p->party.name, NAME_LENGTH);
 	memcpy(WBUFP(buf,39), sd->status.name, NAME_LENGTH);
-	memcpy(WBUFP(buf,63), map_name, MAP_NAME_LENGTH_EXT);
+	safestrncpy((char*)WBUFP(buf,63), mapindex_getmapname_ext(mapindex_id2name(sd->mapindex),NULL), MAP_NAME_LENGTH_EXT);
 	WBUFB(buf,79) = (p->party.item&1)?1:0;
 	WBUFB(buf,80) = (p->party.item&2)?1:0;
 	clif_send(buf,packet_len(0x1e9),&sd->bl,PARTY);
@@ -5742,17 +5720,13 @@ int clif_party_info(struct party_data* p, struct map_session_data *sd)
 	for(i = 0, c = 0; i < MAX_PARTY; i++)
 	{
 		struct party_member* m = &p->party.member[i];
-		char map_name[MAP_NAME_LENGTH_EXT];
-
 		if(!m->account_id) continue;
 
 		if(party_sd == NULL) party_sd = p->data[i].sd;
 
-		snprintf(map_name, MAP_NAME_LENGTH_EXT, "%s.gat", mapindex_id2name(m->map));
-
 		WBUFL(buf,28+c*46) = m->account_id;
 		memcpy(WBUFP(buf,28+c*46+4), m->name, NAME_LENGTH);
-		memcpy(WBUFP(buf,28+c*46+28), map_name, MAP_NAME_LENGTH_EXT);
+		safestrncpy((char*)WBUFP(buf,28+c*46+28), mapindex_getmapname_ext(mapindex_id2name(m->map),NULL), MAP_NAME_LENGTH_EXT);
 		WBUFB(buf,28+c*46+44) = (m->leader) ? 0 : 1;
 		WBUFB(buf,28+c*46+45) = (m->online) ? 0 : 1;
 		c++;
@@ -6016,27 +5990,23 @@ int clif_hpmeter(struct map_session_data *sd)
 /*==========================================
  * パーティ場所移動(未使用)
  *------------------------------------------*/
-int clif_party_move(struct party *p,struct map_session_data *sd,int online)
+void clif_party_move(struct party* p, struct map_session_data* sd, int online)
 {
 	unsigned char buf[128];
-	char map_name[MAP_NAME_LENGTH_EXT];
 
-	nullpo_retr(0, sd);
-	nullpo_retr(0, p);
-
-	snprintf(map_name, MAP_NAME_LENGTH_EXT, "%s.gat", map[sd->bl.m].name);
-
-	WBUFW(buf, 0)=0x104;
-	WBUFL(buf, 2)=sd->status.account_id;
-	WBUFL(buf, 6)=0;
-	WBUFW(buf,10)=sd->bl.x;
-	WBUFW(buf,12)=sd->bl.y;
-	WBUFB(buf,14)=!online;
+	nullpo_retv(sd);
+	nullpo_retv(p);
+
+	WBUFW(buf, 0) = 0x104;
+	WBUFL(buf, 2) = sd->status.account_id;
+	WBUFL(buf, 6) = 0;
+	WBUFW(buf,10) = sd->bl.x;
+	WBUFW(buf,12) = sd->bl.y;
+	WBUFB(buf,14) = !online;
 	memcpy(WBUFP(buf,15),p->name, NAME_LENGTH);
 	memcpy(WBUFP(buf,39),sd->status.name, NAME_LENGTH);
-	memcpy(WBUFP(buf,63),map_name, MAP_NAME_LENGTH_EXT);
+	safestrncpy((char*)WBUFP(buf,63), mapindex_getmapname_ext(map[sd->bl.m].name,NULL), MAP_NAME_LENGTH_EXT);
 	clif_send(buf,packet_len(0x104),&sd->bl,PARTY);
-	return 0;
 }
 /*==========================================
  * 攻撃するために移動が必要
@@ -6411,13 +6381,10 @@ int clif_bladestop(struct block_list *src,struct block_list *dst,
 /*==========================================
  *
  *------------------------------------------*/
-int clif_changemapcell(int m,int x,int y,int cell_type,int type)
+void clif_changemapcell(short m, short x, short y, int cell_type, int type)
 {
 	struct block_list bl;
 	unsigned char buf[32];
-	char map_name[MAP_NAME_LENGTH_EXT];
-
-	snprintf(map_name, MAP_NAME_LENGTH_EXT, "%s.gat", map[m].name);
 
 	bl.type = BL_NUL;
 	bl.m = m;
@@ -6427,13 +6394,8 @@ int clif_changemapcell(int m,int x,int y,int cell_type,int type)
 	WBUFW(buf,2) = x;
 	WBUFW(buf,4) = y;
 	WBUFW(buf,6) = cell_type;
-	memcpy(WBUFP(buf,8),map_name,MAP_NAME_LENGTH_EXT);
-	if(!type)
-		clif_send(buf,packet_len(0x192),&bl,AREA);
-	else
-		clif_send(buf,packet_len(0x192),&bl,ALL_SAMEMAP);
-
-	return 0;
+	safestrncpy((char*)WBUFP(buf,8), mapindex_getmapname_ext(map[m].name,NULL), MAP_NAME_LENGTH_EXT);
+	clif_send(buf,packet_len(0x192),&bl,(!type)?AREA:ALL_SAMEMAP);
 }
 
 /*==========================================
@@ -7786,20 +7748,17 @@ void clif_gospel_info(struct map_session_data *sd, int type)
  * Info about Star Glaldiator save map [Komurka]
  * type: 1: Information, 0: Map registered
  *------------------------------------------*/
-void clif_feel_info(struct map_session_data *sd, unsigned char feel_level, unsigned char type)
+void clif_feel_info(struct map_session_data* sd, unsigned char feel_level, unsigned char type)
 {
 	int fd=sd->fd;
-	char map_name[MAP_NAME_LENGTH_EXT];
-
-	snprintf(map_name, MAP_NAME_LENGTH_EXT, "%s.gat", mapindex_id2name(sd->feel_map[feel_level].index));
 
 	WFIFOHEAD(fd,packet_len(0x20e));
-	WFIFOW(fd,0)=0x20e;
-	memcpy(WFIFOP(fd,2),map_name, MAP_NAME_LENGTH_EXT);
-	WFIFOL(fd,26)=sd->bl.id;
-	WFIFOB(fd,30)=feel_level;
-	WFIFOB(fd,31)=type?1:0;
-	WFIFOSET(fd, packet_len(0x20e));
+	WFIFOW(fd,0) = 0x20e;
+	safestrncpy((char*)WFIFOP(fd,2), mapindex_getmapname_ext(mapindex_id2name(sd->feel_map[feel_level].index),NULL), MAP_NAME_LENGTH_EXT);
+	WFIFOL(fd,26) = sd->bl.id;
+	WFIFOB(fd,30) = feel_level;
+	WFIFOB(fd,31) = type?1:0;
+	WFIFOSET(fd,packet_len(0x20e));
 }
 
 /*==========================================
@@ -9701,10 +9660,11 @@ void clif_parse_UseSkillToPosMoreInfo(int fd, struct map_session_data *sd)
 /*==========================================
  * スキル使用(map指定)
  *------------------------------------------*/
-void clif_parse_UseSkillMap(int fd,struct map_session_data *sd)
+void clif_parse_UseSkillMap(int fd, struct map_session_data* sd)
 {
-	int skill_num;
-	skill_num = RFIFOW(fd,2);
+	int skill_num = RFIFOW(fd,2);
+	char map_name[MAP_NAME_LENGTH];
+	mapindex_getmapname((char*)RFIFOP(fd,4), map_name);
 
 	if(skill_num != sd->menuskill_id) 
 		return;
@@ -9716,7 +9676,7 @@ void clif_parse_UseSkillMap(int fd,struct map_session_data *sd)
 	}
 
 	pc_delinvincibletimer(sd);
-	skill_castend_map(sd,skill_num,(char*)RFIFOP(fd,4));
+	skill_castend_map(sd,skill_num,map_name);
 }
 /*==========================================
  * メモ要求

+ 5 - 5
src/map/clif.h

@@ -80,8 +80,8 @@ int clif_clearunit_delayed(struct block_list* bl, unsigned int tick);
 int clif_spawn(struct block_list*);	//area
 int clif_walkok(struct map_session_data*);	// self
 void clif_move(struct unit_data *ud); //area
-int clif_changemap(struct map_session_data*,short,int,int);	//self
-int clif_changemapserver(struct map_session_data* sd, const char* mapname, int x, int y, uint32 ip, uint16 port);	//self
+void clif_changemap(struct map_session_data*,short,int,int);	//self
+void clif_changemapserver(struct map_session_data* sd, unsigned short map_index, int x, int y, uint32 ip, uint16 port);	//self
 int clif_blown(struct block_list *); // area
 int clif_slide(struct block_list *,int,int); // area
 int clif_fixpos(struct block_list *);	// area
@@ -191,7 +191,7 @@ int clif_skill_nodamage(struct block_list *src,struct block_list *dst,
 int clif_skill_poseffect(struct block_list *src,int skill_id,
 	int val,int x,int y,int tick);
 int clif_skill_estimation(struct map_session_data *sd,struct block_list *dst);
-int clif_skill_warppoint(struct map_session_data* sd, int skill_num, int skill_lv, int map1, int map2, int map3, int map4);
+void clif_skill_warppoint(struct map_session_data* sd, int skill_num, int skill_lv, int map1, int map2, int map3, int map4);
 int clif_skill_memo(struct map_session_data *sd,int flag);
 int clif_skill_teleportmessage(struct map_session_data *sd,int flag);
 int clif_skill_produce_mix_list(struct map_session_data *sd, int trigger);
@@ -209,7 +209,7 @@ int clif_marionette(struct block_list *src, struct block_list *target);
 int clif_spiritball(struct map_session_data *sd);
 int clif_combo_delay(struct block_list *src,int wait);
 int clif_bladestop(struct block_list *src,struct block_list *dst,int bool_);
-int clif_changemapcell(int m,int x,int y,int cell_type,int type);
+void clif_changemapcell(short m, short x, short y, int cell_type, int type);
 
 int clif_status_load(struct block_list *bl,int type, int flag);
 int clif_status_change(struct block_list *bl,int type,int flag);
@@ -265,7 +265,7 @@ int clif_party_inviteack(struct map_session_data* sd, const char* nick, int flag
 int clif_party_option(struct party_data *p,struct map_session_data *sd,int flag);
 int clif_party_leaved(struct party_data* p, struct map_session_data* sd, int account_id, const char* name, int flag);
 int clif_party_message(struct party_data* p, int account_id, const char* mes, int len);
-int clif_party_move(struct party *p,struct map_session_data *sd,int online);
+void clif_party_move(struct party* p, struct map_session_data* sd, int online);
 int clif_party_xy(struct map_session_data *sd);
 int clif_party_xy_single(int fd, struct map_session_data *sd);
 int clif_party_hp(struct map_session_data *sd);

+ 9 - 10
src/map/guild.c

@@ -12,6 +12,7 @@
 #include "../common/mapindex.h"
 #include "../common/showmsg.h"
 #include "../common/ers.h"
+#include "../common/strlib.h"
 
 #include "map.h"
 #include "guild.h"
@@ -184,9 +185,9 @@ static int guild_read_castledb(void)
 
 		gc=(struct guild_castle *)aCalloc(1,sizeof(struct guild_castle));
 		gc->castle_id=atoi(str[0]);
-		memcpy(gc->map_name,mapindex_normalize_name(str[1]),MAP_NAME_LENGTH);
-		memcpy(gc->castle_name,str[2],NAME_LENGTH);
-		memcpy(gc->castle_event,str[3],NAME_LENGTH);
+		safestrncpy(gc->map_name,mapindex_getmapname(str[1],NULL),MAP_NAME_LENGTH);
+		safestrncpy(gc->castle_name,str[2],NAME_LENGTH);
+		safestrncpy(gc->castle_event,str[3],NAME_LENGTH);
 
 		idb_put(castle_db,gc->castle_id,gc);
 
@@ -250,15 +251,13 @@ struct guild_castle *guild_castle_search(int gcid)
 }
 
 // mapnameに対応したアジトのgcを返す
-struct guild_castle *guild_mapname2gc(char *mapname)
+struct guild_castle* guild_mapname2gc(const char* mapname)
 {
 	int i;
-	struct guild_castle *gc=NULL;
-
-	mapindex_normalize_name(mapname);
-
-	for(i=0;i<MAX_GUILDCASTLE;i++){
-		gc=guild_castle_search(i);
+	for(i = 0; i < MAX_GUILDCASTLE; i++)
+	{
+		struct guild_castle* gc;
+		gc = guild_castle_search(i);
 		if(!gc) continue;
 		if(strcmp(gc->map_name,mapname)==0) return gc;
 	}

+ 2 - 2
src/map/guild.h

@@ -24,8 +24,8 @@ struct guild *guild_search(int guild_id);
 struct guild *guild_searchname(char *str);
 struct guild_castle *guild_castle_search(int gcid);
 
-struct guild_castle *guild_mapname2gc(char *mapname);
-struct guild_castle *guild_mapindex2gc(short mapindex);
+struct guild_castle* guild_mapname2gc(const char* mapname);
+struct guild_castle* guild_mapindex2gc(short mapindex);
 
 struct map_session_data *guild_getavailablesd(struct guild *g);
 int guild_getindex(struct guild *g,int account_id,int char_id);

+ 2 - 2
src/map/map.c

@@ -2462,7 +2462,7 @@ int map_readfromcache(struct map_data *m, FILE *fp)
 	return 0;
 }
 
-int map_addmap(char *mapname)
+int map_addmap(char* mapname)
 {
 	if (strcmpi(mapname,"clear")==0) {
 		map_num=0;
@@ -2475,7 +2475,7 @@ int map_addmap(char *mapname)
 		return 1;
 	}
 
-	memcpy(map[map_num].name, mapindex_normalize_name(mapname), MAP_NAME_LENGTH);
+	mapindex_getmapname(mapname, map[map_num].name);
 	map_num++;
 	return 0;
 }

+ 6 - 6
src/map/mob.c

@@ -311,10 +311,9 @@ struct mob_data *mob_once_spawn_sub(struct block_list *bl, int m,
 /*==========================================
  * The MOB appearance for one time (for scripts)
  *------------------------------------------*/
-int mob_once_spawn (struct map_session_data *sd, const char *mapname,
-	short x, short y, const char *mobname, int class_, int amount, const char *event)
+int mob_once_spawn (struct map_session_data* sd, const char* mapname, short x, short y, const char* mobname, int class_, int amount, const char* event)
 {
-	struct mob_data *md = NULL;
+	struct mob_data* md = NULL;
 	int m, count, lv = 255;
 	
 	if(sd) lv = sd->status.base_level;
@@ -327,7 +326,8 @@ int mob_once_spawn (struct map_session_data *sd, const char *mapname,
 	if (m < 0 || amount <= 0)	// 値が異常なら召喚を止める
 		return 0;
 	
-	for (count = 0; count < amount; count++) {
+	for (count = 0; count < amount; count++)
+	{
 		md = mob_once_spawn_sub(sd?&sd->bl:NULL, m, x, y, mobname,
 			class_<0?
 				mob_get_random_id(-class_-1, battle_config.random_monster_checklv?3:1, lv):
@@ -336,8 +336,8 @@ int mob_once_spawn (struct map_session_data *sd, const char *mapname,
 		if (!md) continue;
 
 		if(class_ == MOBID_EMPERIUM) {
-			struct guild_castle *gc = guild_mapname2gc(map[md->bl.m].name);
-			struct guild *g = gc?guild_search(gc->guild_id):NULL;
+			struct guild_castle* gc = guild_mapname2gc(map[md->bl.m].name);
+			struct guild* g = gc?guild_search(gc->guild_id):NULL;
 			if(gc) {
 				md->guardian_data = aCalloc(1, sizeof(struct guardian_data));
 				md->guardian_data->castle = gc;

+ 13 - 25
src/map/script.c

@@ -9576,42 +9576,33 @@ BUILDIN_FUNC(flagemblem)
 
 BUILDIN_FUNC(getcastlename)
 {
-	char mapname[MAP_NAME_LENGTH_EXT];
-	struct guild_castle *gc;
-
-	strncpy(mapname, script_getstr(st,2), MAP_NAME_LENGTH_EXT);
-	gc = guild_mapname2gc(mapname);
-
-	if(gc)
-		script_pushconststr(st,gc->castle_name);
-	else
-		script_pushconststr(st,"");
+	const char* mapname = mapindex_getmapname(script_getstr(st,2),NULL);
+	struct guild_castle* gc = guild_mapname2gc(mapname);
+	char* name = (gc) ? gc->castle_name : "";
+	script_pushconststr(st,name);
 	return 0;
 }
 
 BUILDIN_FUNC(getcastledata)
 {
-	char mapname[MAP_NAME_LENGTH_EXT];
-	int index=script_getnum(st,3);
-	const char *event=NULL;
-	struct guild_castle *gc;
-	int i;
+	const char* mapname = mapindex_getmapname(script_getstr(st,2),NULL);
+	int index = script_getnum(st,3);
 
-	strncpy(mapname, script_getstr(st,2), MAP_NAME_LENGTH_EXT);
-	gc = guild_mapname2gc(mapname);
+	struct guild_castle* gc = guild_mapname2gc(mapname);
 
 	if(script_hasdata(st,4) && index==0 && gc) {
-		event=script_getstr(st,4);
+		const char* event = script_getstr(st,4);
 		check_event(st, event);
 		guild_addcastleinfoevent(gc->castle_id,17,event);
 	}
 
 	if(gc){
 		switch(index){
-			case 0:
+			case 0: {
+				int i;
 				for(i=1;i<26;i++) // Initialize[AgitInit]
 					guild_castledataload(gc->castle_id,i);
-				break;
+					} break;
 			case 1:
 				script_pushint(st,gc->guild_id); break;
 			case 2:
@@ -9659,13 +9650,10 @@ BUILDIN_FUNC(getcastledata)
 
 BUILDIN_FUNC(setcastledata)
 {
-	char mapname[MAP_NAME_LENGTH_EXT];
 	int index=script_getnum(st,3);
 	int value=script_getnum(st,4);
-	struct guild_castle *gc;
-
-	strncpy(mapname, script_getstr(st,2), MAP_NAME_LENGTH_EXT);
-	gc = guild_mapname2gc(mapname);
+	
+	struct guild_castle* gc = guild_mapname2gc( mapindex_getmapname(script_getstr(st,2),NULL) );
 
 	if(gc) {
 		// Save Data byself First

+ 1 - 9
src/map/skill.c

@@ -6328,14 +6328,6 @@ int skill_castend_map (struct map_session_data *sd, int skill_num, const char *m
 		return 0;
 	}
 
-	if (strlen(map) > MAP_NAME_LENGTH_EXT-1)
-	{	//Map_length check, as it is sent by the client and we shouldn't trust it [Skotlex]
-		if (battle_config.error_log)
-			ShowError("skill_castend_map: Received map name '%s' too long!\n", map);
-		skill_failed(sd);
-		return 0;
-	}
-
 	pc_stop_attack(sd);
 	pc_stop_walking(sd,0);
 
@@ -6419,7 +6411,7 @@ int skill_castend_map (struct map_session_data *sd, int skill_num, const char *m
 				return 0;
 			}
 			//Now that there's a mapindex, use that in val3 rather than a string. [Skotlex]
-			group->val2=(x<<16)|y;
+			group->val2 = (x<<16)|y;
 			group->val3 = mapindex;
 		}
 		break;

+ 3 - 3
src/map/unit.c

@@ -709,13 +709,13 @@ int unit_can_move(struct block_list *bl)
 	
 	if (!ud)
 		return 0;
-
+	
 	if (ud->skilltimer != -1 && (!sd || !pc_checkskill(sd, SA_FREECAST) || skill_get_inf2(ud->skillid)&INF2_GUILD_SKILL))
 		return 0; // prevent moving while casting
-		
+	
 	if (DIFF_TICK(ud->canmove_tick, gettick()) > 0)
 		return 0;
-
+	
 	if (sd && (
 		pc_issit(sd) ||
 		sd->vender_id ||