diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp index 5dec0e6e..281eee5d 100755 --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -2574,6 +2574,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); @@ -4838,6 +4850,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 b233b0d3..e067b02e 100755 --- a/plugins/admincmd.sma +++ b/plugins/admincmd.sma @@ -654,7 +654,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 6c11fddd..6e7cb1a2 100755 --- a/plugins/include/amxmodx.inc +++ b/plugins/include/amxmodx.inc @@ -84,6 +84,19 @@ 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 "changelevel" server command, + * but this will trigger properly server_changelevel() forward. + * + * @aparam 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 b07ad7bc..9375df3c 100755 --- a/plugins/mapsmenu.sma +++ b/plugins/mapsmenu.sma @@ -321,7 +321,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 4af491fa..dc2fbe22 100755 --- a/plugins/nextmap.sma +++ b/plugins/nextmap.sma @@ -118,7 +118,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()