diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp index 1b057f3f..02afd2f2 100755 --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -2552,6 +2552,18 @@ static cell AMX_NATIVE_CALL change_task(AMX *amx, cell *params) return g_tasksMngr.changeTasks(params[1], params[3] ? 0 : amx, flNewTime); } +static cell AMX_NATIVE_CALL change_level(AMX *amx, cell *params) +{ + int length; + const char* new_map = get_amxstring(amx, params[1], 0, length); + + // Same as calling "changelevel" command but will trigger "server_changelevel" AMXX forward as well. + // Filling second param will call "changelevel2" command, but this is not usable in multiplayer game. + g_pEngTable->pfnChangeLevel(new_map, NULL); + + return 1; +} + static cell AMX_NATIVE_CALL task_exists(AMX *amx, cell *params) /* 1 param */ { return g_tasksMngr.taskExists(params[1], params[2] ? 0 : amx); @@ -4816,6 +4828,7 @@ AMX_NATIVE_INFO amxmodx_Natives[] = {"callfunc_push_str", callfunc_push_str}, {"callfunc_push_array", callfunc_push_array}, {"change_task", change_task}, + {"change_level", change_level}, {"client_cmd", client_cmd}, {"client_print", client_print}, {"client_print_color", client_print_color}, diff --git a/plugins/admincmd.sma b/plugins/admincmd.sma index 3b2a958e..a36f5b0c 100755 --- a/plugins/admincmd.sma +++ b/plugins/admincmd.sma @@ -633,7 +633,7 @@ public cmdSlap(id, level, cid) public chMap(map[]) { - server_cmd("changelevel %s", map) + change_level(map); } public cmdMap(id, level, cid) diff --git a/plugins/include/amxmodx.inc b/plugins/include/amxmodx.inc index 36503ce0..7720ada8 100755 --- a/plugins/include/amxmodx.inc +++ b/plugins/include/amxmodx.inc @@ -85,6 +85,20 @@ native precache_sound(const name[]); /* Precaches any file. */ native precache_generic(const szFile[]); +/** + * Changes map. + * + * @note This calls the pfnChangelLevel engine function. + * @note This has the same behavior as calling the "changelevel" server command, + * but this will also trigger the server_changelevel() forward in AMXX plugins. + * It will also notify any Metamod plugins that are hooking pfnChangeLevel. + * + * @param map The map name to change. + * + * @noreturn + */ +native change_level(const map[]); + /* Sets info for player. */ native set_user_info(index,const info[],const value[]); diff --git a/plugins/mapsmenu.sma b/plugins/mapsmenu.sma index e7fc3bdf..ac7a6f74 100755 --- a/plugins/mapsmenu.sma +++ b/plugins/mapsmenu.sma @@ -300,7 +300,7 @@ public cmdMapsMenu(id, level, cid) } public delayedChange(mapname[]) - server_cmd("changelevel %s", mapname) + change_level(mapname) public actionVoteMapMenu(id, key) { diff --git a/plugins/nextmap.sma b/plugins/nextmap.sma index 386884a5..ff73fe58 100755 --- a/plugins/nextmap.sma +++ b/plugins/nextmap.sma @@ -97,7 +97,7 @@ public delayedChange(param[]) if (g_mp_chattime) { set_pcvar_float(g_mp_chattime, get_pcvar_float(g_mp_chattime) - 2.0) } - server_cmd("changelevel %s", param) + change_level(param) } public changeMap()