瀏覽代碼

Fixes instance map name faults (#4945)

* Fixes #4915.
* Fixes instance map names when it reaches 1000.
* Fixes instances with more than 8 character crashing the client.
* Other minor cleanups.
Thanks to @voyfmyuh and @Atemo!
Co-authored-by: Atemo <Atemo@users.noreply.github.com>
Aleos 5 年之前
父節點
當前提交
15c954ef23
共有 2 個文件被更改,包括 17 次插入16 次删除
  1. 13 12
      src/map/instance.cpp
  2. 4 4
      src/map/map.cpp

+ 13 - 12
src/map/instance.cpp

@@ -616,7 +616,7 @@ int instance_create(int owner_id, const char *name, e_instance_mode mode) {
 	clif_instance_create(instance_id, instance_wait.id.size());
 	instance_subscription_timer(0,0,0,0);
 
-	ShowInfo("[Instance] Created: %s (%d).\n", name, instance_id);
+	ShowInfo("[Instance] Created: %s (%d)\n", name, instance_id);
 
 	// Start the instance timer on instance creation
 	instance_startkeeptimer(entry, instance_id);
@@ -708,11 +708,13 @@ int instance_addmap(int instance_id) {
  * Returns an instance map ID
  * @param m: Source map ID
  * @param instance_id: Instance to search
- * @return Map ID in this instance
+ * @return Map ID in this instance or -1 on failure
  */
 int16 instance_mapid(int16 m, int instance_id)
 {
-	if(m < 0) {
+	const char *name = map_mapid2mapname(m);
+
+	if (name == nullptr) {
 		ShowError("instance_mapid: Map ID %d does not exist.\n", m);
 		return -1;
 	}
@@ -722,18 +724,17 @@ int16 instance_mapid(int16 m, int instance_id)
 	if(!idata || idata->state != INSTANCE_BUSY)
 		return -1;
 
-	const char *iname = map_mapid2mapname(m);
-
 	for (const auto &it : idata->map) {
 		if (it.src_m == m) {
-			char alt_name[MAP_NAME_LENGTH];
+			char iname[MAP_NAME_LENGTH], alt_name[MAP_NAME_LENGTH];
+
+			strcpy(iname, name);
 
 			if (!(strchr(iname, '@')) && strlen(iname) > 8) {
-				memmove((void*)iname, iname + (strlen(iname) - 9), strlen(iname));
-				snprintf(alt_name, sizeof(alt_name), "%d#%s", instance_id, iname);
-			}
-			else
-				snprintf(alt_name, sizeof(alt_name), "%.3d%s", instance_id, iname);
+				memmove(iname, iname + (strlen(iname) - 9), strlen(iname));
+				snprintf(alt_name, sizeof(alt_name), "%d#%s", (instance_id % 1000), iname);
+			} else
+				snprintf(alt_name, sizeof(alt_name), "%.3d%s", (instance_id % 1000), iname);
 			return map_mapname2mapid(alt_name);
 		}
 	}
@@ -847,7 +848,7 @@ bool instance_destroy(int instance_id)
 	if( idata->regs.arrays )
 		idata->regs.arrays->destroy(idata->regs.arrays, script_free_array_db);
 
-	ShowInfo("[Instance] Destroyed %d.\n", instance_id);
+	ShowInfo("[Instance] Destroyed: %s (%d)\n", instance_db.find(idata->id)->name.c_str(), instance_id);
 
 	instances.erase(instance_id);
 

+ 4 - 4
src/map/map.cpp

@@ -2703,7 +2703,7 @@ int map_addinstancemap(int src_m, int instance_id)
 
 	if(strlen(name) > 20) {
 		// against buffer overflow
-		ShowError("map_addinstancemap: can't add long map name \"%s\"\n", name);
+		ShowError("map_addinstancemap: Map name \"%s\" is too long.\n", name);
 		return -2;
 	}
 
@@ -2732,7 +2732,7 @@ int map_addinstancemap(int src_m, int instance_id)
 	// Alter the name
 	// Due to this being custom we only worry about preserving as many characters as necessary for accurate map distinguishing
 	// This also allows us to maintain complete independence with main map functions
-	if ((strchr(iname, '@') == NULL) && strlen(iname) > 8) {
+	if ((strchr(iname, '@') == nullptr) && strlen(iname) > 8) {
 		memmove(iname, iname + (strlen(iname) - 9), strlen(iname));
 		snprintf(dst_map->name, sizeof(dst_map->name), "%d#%s", (instance_id % 1000), iname);
 	} else
@@ -2766,12 +2766,12 @@ int map_addinstancemap(int src_m, int instance_id)
 	dst_map->block_mob = (struct block_list **)aCalloc(1,size);
 
 	dst_map->index = mapindex_addmap(-1, dst_map->name);
-	dst_map->channel = NULL;
+	dst_map->channel = nullptr;
 	dst_map->mob_delete_timer = INVALID_TIMER;
 
 	map_data_copy(dst_map, src_map);
 
-	ShowInfo("[Instance] Created map '%s' ('%d') from map '%s' ('%d')\n", dst_map->name, dst_map->m, name, src_map->m);
+	ShowInfo("[Instance] Created map '%s' (%d) from '%s' (%d).\n", dst_map->name, dst_map->m, name, src_map->m);
 
 	map_addmap2db(dst_map);