396 lines
12 KiB
Plaintext
Executable File
396 lines
12 KiB
Plaintext
Executable File
/* AMX Mod script.
|
|
*
|
|
* (c) 2003, OLO
|
|
* This file is provided as is (no warranties).
|
|
*
|
|
* Admin commads:
|
|
* amx_pausemenu - displays menu by which you can pause, unpause and stop plugins
|
|
* amx_plugin - displays help for all commands for that plugin
|
|
*
|
|
* WARNING: Stopped plugins won't work properly after activation
|
|
* (without mapchange) due to unactive status during plugins initialization
|
|
* and at players connections. For proper activation clear the file with
|
|
* stopped plugins (option #7 in menu) or unstop selected one then change the map.
|
|
*/
|
|
|
|
#include <amxmod>
|
|
#include <amxmisc>
|
|
|
|
|
|
// Uncomment if you want to have two new commands
|
|
// amx_off - pause plugins not registered in the unpauseable list
|
|
// amx_on - enable all plugins not registered in the unpauseable list
|
|
//#define DIRECT_ONOFF
|
|
|
|
#define MAX_PLGDATA 64
|
|
#define MAX_PLUGINS 192
|
|
|
|
enum {
|
|
PLG_ERROR,
|
|
PLG_ON,
|
|
PLG_OFF,
|
|
PLG_STOPPED
|
|
}
|
|
|
|
new g_pluginList[MAX_PLGDATA][32]
|
|
new g_pluginListNum
|
|
new g_menuPos[33]
|
|
new g_dontPause[MAX_PLGDATA]
|
|
new g_dontPauseNum
|
|
new g_pluginStatus[MAX_PLUGINS]
|
|
new bool:g_Modified
|
|
|
|
new g_fileToSave[64]
|
|
new g_cstrikeRunning
|
|
|
|
public plugin_init(){
|
|
register_plugin("Pause Plugins","0.9","default")
|
|
|
|
#if defined DIRECT_ONOFF
|
|
register_concmd("amx_off","cmdOFF",ADMIN_CFG,"- pause some plugins")
|
|
register_concmd("amx_on","cmdON",ADMIN_CFG,"- unpause some plugins")
|
|
#endif
|
|
|
|
register_concmd("amx_plugin","cmdPause",ADMIN_CFG,"- list cmds. for pause/unpause managment")
|
|
register_clcmd("amx_pausemenu","cmdMenu",ADMIN_CFG,"- pause or unpause plugins via menu")
|
|
register_menucmd(register_menuid("Pause/Unpause Plugins"),1023,"actionMenu")
|
|
|
|
get_localinfo( "amx_basedir", g_fileToSave , 31 )
|
|
format( g_fileToSave , 63, "%s/ppause.ini" , g_fileToSave )
|
|
|
|
loadSettings(g_fileToSave)
|
|
|
|
new mod_name[32]
|
|
get_modname(mod_name,31)
|
|
g_cstrikeRunning = equal(mod_name,"cstrike")
|
|
}
|
|
|
|
new g_addCmd[] = "amx_plugin add ^"%s^""
|
|
|
|
public plugin_cfg() {
|
|
/* Put here titles of plugins which you don't want to pause. */
|
|
server_cmd(g_addCmd , "Pause Plugins" )
|
|
server_cmd(g_addCmd , "Admin Commands" )
|
|
server_cmd(g_addCmd , "TimeLeft" )
|
|
server_cmd(g_addCmd , "Slots Reservation" )
|
|
server_cmd(g_addCmd , "Admin Chat" )
|
|
server_cmd(g_addCmd , "NextMap" )
|
|
server_cmd(g_addCmd , "Admin Menu" )
|
|
server_cmd(g_addCmd , "Admin Help" )
|
|
server_cmd(g_addCmd , "Admin Base" )
|
|
server_cmd(g_addCmd , "Welcome Message" )
|
|
server_cmd(g_addCmd , "Stats Settings" )
|
|
}
|
|
|
|
public actionMenu(id,key){
|
|
switch(key){
|
|
case 6:{
|
|
if (file_exists(g_fileToSave)){
|
|
delete_file(g_fileToSave)
|
|
client_print(id,print_chat,"* Configuration file cleared")
|
|
}
|
|
else
|
|
client_print(id,print_chat,"* Configuration was already cleared!")
|
|
displayMenu(id,g_menuPos[id])
|
|
}
|
|
case 7:{
|
|
if (saveSettings(g_fileToSave)){
|
|
g_Modified = false
|
|
client_print(id,print_chat,"* Configuration saved successfully")
|
|
}
|
|
else
|
|
client_print(id,print_chat,"* Configuration saving failed!!!")
|
|
displayMenu(id,g_menuPos[id])
|
|
}
|
|
case 8: displayMenu(id,++g_menuPos[id])
|
|
case 9: displayMenu(id,--g_menuPos[id])
|
|
default:{
|
|
new option = g_menuPos[id] * 6 + key
|
|
new filename[32],title[32],version[2],author[2],status[2]
|
|
get_plugin(option,filename,31,title,31,version,0,author,0,status,1)
|
|
if (status[0]=='r'){
|
|
pause("ac",filename)
|
|
g_pluginStatus[option]=PLG_OFF
|
|
}
|
|
else if ( g_pluginStatus[option]!=PLG_STOPPED && status[0]=='p' ){
|
|
g_pluginStatus[option]=PLG_STOPPED
|
|
g_Modified = true
|
|
}
|
|
else {
|
|
unpause("ac",filename)
|
|
g_pluginStatus[option]=PLG_ON
|
|
}
|
|
displayMenu(id,g_menuPos[id])
|
|
}
|
|
}
|
|
return PLUGIN_HANDLED
|
|
}
|
|
|
|
displayMenu(id, pos){
|
|
if (pos < 0) return
|
|
new filename[32],title[32],version[2],author[2],status[2]
|
|
new datanum = get_pluginsnum()
|
|
new menu_body[512], start = pos * 6, k = 0
|
|
if (start >= datanum) start = pos = g_menuPos[id] = 0
|
|
new len = format(menu_body,511,
|
|
g_cstrikeRunning ? "\yPause/Unpause Plugins\R%d/%d^n\w^n" : "Pause/Unpause Plugins %d/%d^n^n" ,
|
|
pos + 1,((datanum/6)+((datanum%6)?1:0)))
|
|
new end = start + 6, keys = (1<<9)|(1<<7)|(1<<6)
|
|
if (end > datanum) end = datanum
|
|
for(new a = start; a < end; ++a){
|
|
get_plugin(a,filename,31,title,31,version,0,author,0,status,1)
|
|
if (dontPause(a)||(status[0]!='r'&&status[0]!='p')) {
|
|
if (g_cstrikeRunning){
|
|
len += format(menu_body[len],511-len, "\d%d. %s\R%s^n\w",++k,
|
|
title, ( status[0]=='r' ) ? "ON" : ( ( status[0]=='p' ) ? "OFF" : "ERROR" ) )
|
|
}
|
|
else{
|
|
++k
|
|
len += format(menu_body[len],511-len, "#. %s %s^n",
|
|
title, ( status[0]=='r' ) ? "ON" : ( ( status[0]=='p' ) ? "OFF" : "ERROR" ) )
|
|
}
|
|
}
|
|
else{
|
|
keys |= (1<<k)
|
|
len += format(menu_body[len],511-len,g_cstrikeRunning ? "%d. %s\y\R%s^n\w" : "%d. %s %s^n",++k,
|
|
title, ( status[0]=='r' ) ? "ON" : ((g_pluginStatus[a]==PLG_STOPPED)?"STOPPED":"OFF"))
|
|
}
|
|
}
|
|
len += format(menu_body[len],511-len,"^n7. Clear file with stopped^n")
|
|
len += format(menu_body[len],511-len,g_cstrikeRunning ? "8. Save stopped \y\R%s^n\w"
|
|
: "8. Save stopped %s^n" ,g_Modified ? "*" : "")
|
|
if (end != datanum){
|
|
format(menu_body[len],511-len,"^n9. More...^n0. %s", pos ? "Back" : "Exit")
|
|
keys |= (1<<8)
|
|
}
|
|
else format(menu_body[len],511-len,"^n0. %s", pos ? "Back" : "Exit")
|
|
show_menu(id,keys,menu_body)
|
|
}
|
|
|
|
public cmdMenu(id,level,cid){
|
|
if (!cmd_access(id,level,cid,1))
|
|
return PLUGIN_HANDLED
|
|
if (g_dontPauseNum != g_pluginListNum) chkStatus()
|
|
displayMenu(id,g_menuPos[id] = 0)
|
|
return PLUGIN_HANDLED
|
|
}
|
|
|
|
pasueALL(id){
|
|
if (g_dontPauseNum != g_pluginListNum) chkStatus()
|
|
new filename[32],title[32],version[2],author[2],status[2]
|
|
new count = 0, imax = get_pluginsnum()
|
|
for (new a=0;a<imax;++a){
|
|
get_plugin(a,filename,31,title,31,version,0,author,0,status,1)
|
|
if (dontPause(a)||status[0]!='r') continue
|
|
pause("ac",filename)
|
|
++count
|
|
console_print(id,"Pausing %s (file ^"%s^")",title,filename)
|
|
}
|
|
console_print(id,"Paused %d plugins",count)
|
|
}
|
|
|
|
unpauseALL(id){
|
|
if (g_dontPauseNum != g_pluginListNum) chkStatus()
|
|
new filename[32],title[32],version[2],author[2],status[2]
|
|
new count = 0, imax = get_pluginsnum()
|
|
for (new a=0;a<imax;++a){
|
|
get_plugin(a,filename,31,title,31,version,0,author,0,status,1)
|
|
if (dontPause(a)||status[0]!='p') continue
|
|
unpause("ac",filename)
|
|
++count
|
|
console_print(id,"Unpausing %s (file ^"%s^")",title,filename)
|
|
}
|
|
console_print(id,"Unpaused %d plugins",count)
|
|
}
|
|
|
|
#if defined DIRECT_ONOFF
|
|
|
|
public cmdOFF(id,level,cid){
|
|
if (cmd_access(id,level,cid,1))
|
|
pasueALL(id)
|
|
return PLUGIN_HANDLED
|
|
}
|
|
|
|
public cmdON(id,level,cid){
|
|
if (cmd_access(id,level,cid,1))
|
|
unpauseALL(id)
|
|
return PLUGIN_HANDLED
|
|
}
|
|
|
|
#endif
|
|
|
|
findPlugin(argument[32],&len){
|
|
new plugin[32],title[32],version[2],author[2],status[2]
|
|
new inum = get_pluginsnum()
|
|
for(new a = 0; a < inum; ++a){
|
|
get_plugin(a,plugin,31,title,31,version,0,author,0,status,1)
|
|
if ( equali(plugin,argument,len) && (status[0]=='r'||status[0]=='p') ){
|
|
len = copy(argument,31,plugin)
|
|
return a
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
|
|
public cmdPause(id,level,cid){
|
|
if (!cmd_access(id,level,cid,1))
|
|
return PLUGIN_HANDLED
|
|
new cmds[32]
|
|
read_argv(1,cmds,31)
|
|
if ( equal(cmds, "off" ) ){
|
|
pasueALL(id)
|
|
}
|
|
else if ( equal(cmds, "on" ) ){
|
|
unpauseALL(id)
|
|
}
|
|
else if ( equal(cmds, "save" ) ){
|
|
if (saveSettings(g_fileToSave)){
|
|
g_Modified = false
|
|
console_print(id,"Configuration saved successfully")
|
|
}
|
|
else
|
|
console_print(id,"Configuration saving failed!!!")
|
|
}
|
|
else if ( equal(cmds, "clear" ) ) {
|
|
if (file_exists(g_fileToSave)){
|
|
delete_file(g_fileToSave)
|
|
console_print(id,"Configuration file cleared")
|
|
}
|
|
else
|
|
console_print(id,"Configuration was already cleared!")
|
|
}
|
|
else if ( equal(cmds, "pause" ) ) {
|
|
new arg[32], len, a
|
|
if ( (len = read_argv(2,arg,31)) != 0 ){
|
|
if ( (a = findPlugin(arg,len)) != -1){
|
|
if (pause("ac",arg)) g_pluginStatus[a] = PLG_OFF
|
|
console_print(id,"Plugin matching ^"%s^" paused",arg)
|
|
}
|
|
}
|
|
if (!len || a==-1) console_print(id,"Couldn't find plugin matching ^"%s^"",arg)
|
|
}
|
|
else if ( equal(cmds, "unpause" ) ) {
|
|
new arg[32], len, a
|
|
if ( (len = read_argv(2,arg,31)) != 0 ){
|
|
if ( (a = findPlugin(arg,len)) != -1){
|
|
if (unpause("ac",arg)) g_pluginStatus[a] = PLG_ON
|
|
console_print(id,"Plugin matching ^"%s^" unpaused",arg)
|
|
}
|
|
}
|
|
if (!len || a==-1) console_print(id,"Couldn't find plugin matching ^"%s^"",arg)
|
|
}
|
|
else if ( equal(cmds, "stop" ) ) {
|
|
new arg[32], len, a
|
|
if ( (len = read_argv(2,arg,31)) != 0 ){
|
|
if ( (a = findPlugin(arg,len)) != -1){
|
|
pause("ac",arg)
|
|
g_pluginStatus[a] = PLG_STOPPED
|
|
g_Modified = true
|
|
console_print(id,"Plugin matching ^"%s^" stopped",arg)
|
|
}
|
|
}
|
|
if (!len || a==-1) console_print(id,"Couldn't find plugin matching ^"%s^"",arg)
|
|
}
|
|
else if ( equal(cmds, "list" ) ) {
|
|
new plugin[32],title[32],version[16],author[32],status[16]
|
|
new inum = get_pluginsnum()
|
|
console_print(id, "Currently loaded plugins:")
|
|
console_print(id, " name version author file status")
|
|
new running = 0, plugins = 0
|
|
for(new a = 0; a < inum; ++a){
|
|
plugins++
|
|
get_plugin(a,plugin,31,title,31,version,15,author,31,status,15)
|
|
if (status[0] == 'r') running++
|
|
console_print(id, " [%3d] %-18.17s %-8.7s %-17.16s %-16.15s %-9.8s",plugins,
|
|
title,version,author,plugin, (g_pluginStatus[a] == PLG_STOPPED) ? "stopped" : status )
|
|
}
|
|
console_print(id, "%d plugins, %d running",plugins,running)
|
|
}
|
|
else if ( equal(cmds, "add" ) && read_argc() > 2 ) {
|
|
if ( g_pluginListNum < MAX_PLGDATA )
|
|
read_argv(2,g_pluginList[g_pluginListNum++],31)
|
|
else
|
|
console_print(id, "Can't add more plugins to the unpauseable list, limit reached!")
|
|
}
|
|
else {
|
|
console_print(id,"Usage: amx_plugin <command> [name]")
|
|
console_print(id,"Commands:")
|
|
console_print(id,"^toff - pause all plugins not in the list")
|
|
console_print(id,"^ton - unpause all plugins")
|
|
console_print(id,"^tstop <file> - stop plugin")
|
|
console_print(id,"^tpause <file> - pause plugin")
|
|
console_print(id,"^tunpause <file> - unpause plugin")
|
|
console_print(id,"^tsave - save list of stopped plugins")
|
|
console_print(id,"^tclear - clear list of stopped plugins")
|
|
console_print(id,"^tlist - list plugins")
|
|
console_print(id,"^tadd <title> - add plugin to the unpauseable plugins list")
|
|
}
|
|
return PLUGIN_HANDLED
|
|
}
|
|
|
|
chkStatus(){
|
|
new filename[32],title[32],version[2],author[2],status[2]
|
|
new imax = get_pluginsnum()
|
|
for (new a=0;a<imax;++a){
|
|
get_plugin(a,filename,31,title,31,version,0,author,0,status,1)
|
|
if (status[0]=='p'){
|
|
if (g_pluginStatus[a]!=PLG_STOPPED)g_pluginStatus[a] = PLG_OFF
|
|
}
|
|
else if (status[0]=='r')
|
|
g_pluginStatus[a] = PLG_ON
|
|
else
|
|
g_pluginStatus[a] = PLG_ERROR
|
|
if (dontPausePre(title))
|
|
g_dontPause[g_dontPauseNum++] = a
|
|
}
|
|
}
|
|
|
|
bool:dontPause(myid) {
|
|
for(new a=0;a<g_dontPauseNum;++a)
|
|
if (g_dontPause[a]==myid)
|
|
return true
|
|
return false
|
|
}
|
|
|
|
bool:dontPausePre(name[]) {
|
|
for(new a=0;a<g_pluginListNum;++a)
|
|
if (equali(g_pluginList[a],name))
|
|
return true
|
|
return false
|
|
}
|
|
|
|
saveSettings(filename[]){
|
|
if (file_exists(filename))
|
|
delete_file(filename)
|
|
new text[256], plugin[32],title[32],version[2],author[2],status[2]
|
|
new inum = get_pluginsnum()
|
|
if (!write_file(filename,";Generated by Pause Plugins Plugin. Do not modify!^n;Filename Description"))
|
|
return 0
|
|
for(new a = 0; a < inum; ++a){
|
|
if (g_pluginStatus[a]==PLG_STOPPED){
|
|
get_plugin(a,plugin,31,title,31,version,0,author,0,status,1)
|
|
format(text,255,"%s ;%s",plugin,title)
|
|
write_file(filename,text)
|
|
}
|
|
}
|
|
return 1
|
|
}
|
|
|
|
loadSettings(filename[]){
|
|
if (!file_exists(filename)) return 0
|
|
new text[256], len, pos = 0
|
|
while (read_file(filename,pos++,text,255,len)){
|
|
if ( text[0] == ';' ) continue // line is a comment
|
|
parse(text,g_pluginList[g_pluginListNum++],31)
|
|
}
|
|
new plugin[32],title[32],version[2],author[2],status[2]
|
|
new inum = get_pluginsnum()
|
|
for(new a = 0; a < inum; ++a){
|
|
get_plugin(a,plugin,31,title,31,version,0,author,0,status,1)
|
|
if (!dontPausePre(plugin)) continue
|
|
pause("ac",plugin)
|
|
g_pluginStatus[a] = PLG_STOPPED
|
|
}
|
|
g_pluginListNum = 0
|
|
return 1
|
|
} |