Senior Member
Join Date: Feb 2021
Location: Russia
04-07-2021
, 18:46
how to deal with task spam?
#1
Hello ppl! I have some trouble with set_task. I'm catching a specified messages and if caught, i starting a task that displaying hud messages to players. But when i'm catching an msg it starts to spam hud msgs. What i made(it's just a part of my useless code):
Thanks in advance
PHP Code:
#include <amxmodx> #include <csx> #include <dhudmessage> #define MESS_LEN 64 #define NAME_LEN 32 #define DH_R_STD 251 #define DH_G_STD 126 #define DH_B_STD 20 #define DH_XPOS -1.0 #define DH_YPOS 0.63 #define HUD_SHIFT 0.04 #define DH_FX 0 #define DH_FX_TIME 0.0 #define DH_HOLD_TIME 2.7 #define DH_FADEIN 0.5 #define DH_FADEOUT 0.8 enum { NO_MSG = 0 , BOMB_PLANTED , BOMB_DEFUSED } enum { NO_WINNER = 0 , W_TEAM_CT , W_TEAM_T } new submsg = NO_MSG #define TASK_ID_XO 457 public plugin_init () { register_plugin ( "messages" , "latest" , "kww" ) register_message ( get_user_msgid ( "TextMsg" ), "onMessageSent" ) register_event ( "HLTV" , "onRoundStart" , "a" , "1=0" , "2=0" ) } public onRoundStart () { //reset variables submsg = NO_MSG } public bomb_planted ( planter ) { get_user_name ( planter , g_mvp , charsmax ( g_mvp )) } public bomb_defused ( defuser ) { get_user_name ( defuser , g_mvp , charsmax ( g_mvp )) } public onMessageSent ( iMessage , iDest , id ) { //get message sent static szMessage [ MESS_LEN ] get_msg_arg_string ( 2 , szMessage , charsmax ( szMessage )) if( equali ( szMessage , "#Bomb_Defused" )) { winnerTeam = W_TEAM_CT submsg = BOMB_DEFUSED } else if( equali ( szMessage , "#Target_Bombed" )) { winnerTeam = W_TEAM_CT submsg = BOMB_PLANTED } //if bomb defused or exploded then run task if( winnerTeam ) { set_task ( 0.1 , "message_send" , id + TASK_ID_XO ) return PLUGIN_HANDLED } return PLUGIN_CONTINUE } public message_send ( taskid ) { new id = taskid - TASK_ID_XO // i think if onMessageSent() is calling every time when every player catching a message // then task will run as many times as they receive message, so if 7 palyers on server then 7 tasks // will start(?) and i tried to get players' ids from started tasks and show hudmessages to them but failed // and idk why client_print ( 0 , print_console , "[*] executed " ) //for debug //format 1st string static szText [ MESS_LEN ] formatex ( szText , charsmax ( szText ), "placeholder" ) //show it set_dhudmessage ( DH_R_STD , DH_G_STD , DH_B_STD , DH_XPOS , DH_YPOS , DH_FX , DH_FX_TIME , DH_HOLD_TIME , DH_FADEIN , DH_FADEOUT ) show_dhudmessage ( id , szText ) //format substring new szSubText [ MESS_LEN * 2 ] switch( submsg ) { case BOMB_PLANTED : { formatex ( szSubText , charsmax ( szSubText ), "Bomb exploded" ) } case BOMB_DEFUSED : { formatex ( szSubText , charsmax ( szSubText ), "Bomb defused" ) } default: return PLUGIN_HANDLED } //show it too set_hudmessage ( DH_R_STD , DH_G_STD , DH_B_STD , DH_XPOS , DH_YPOS + HUD_SHIFT , DH_FX , DH_FX_TIME , DH_HOLD_TIME , DH_FADEIN , DH_FADEOUT , - 1 ) show_hudmessage ( id , szSubText ) return PLUGIN_HANDLED }
full code, test it if u want to see what is happening
PHP Code:
#include <amxmodx> #include <csx> // bomb_defused(), bomb_planted() forwards #include <dhudmessage> #define ACCESS_ADMIN ADMIN_KICK #define MESS_LEN 64 #define NAME_LEN 32 #define DH_R_STD 251 //221 #define DH_G_STD 126 #define DH_B_STD 20 #define DH_XPOS -1.0 #define DH_YPOS 0.63 #define HUD_SHIFT 0.04 #define DH_FX 0 #define DH_FX_TIME 0.0 #define DH_HOLD_TIME 2.7 #define DH_FADEIN 0.5 #define DH_FADEOUT 0.8 new old_ct_name [ NAME_LEN ] = "Counter-Terrorists" , old_t_name [ NAME_LEN ] = "Terrorists" new g_mvp [ NAME_LEN ] new mp_teamname_ct , mp_teamname_t new g_suffix [ 32 ] = "Win" , g_suffix2 [ 32 ] = "Wins The Round" new g_iEnemiesKilled [ 33 ], g_iHostagesRescued [ 33 ] new g__debug [ 33 ] // enabled for admins with ACCESS_ADMIN (line #8) flag enum { NO_MSG = 0 , // 0 CT_WIN , // 1 T_WIN , // 2 TARGET_SAVED , // 3 BOMB_PLANTED , // 4 BOMB_DEFUSED , // 5 HOSTAGES_RESCUED , // 6 HOSTAGES_NOT_RESCUED , // 7 VIP_ESCAPED , // 8 VIP_ASSASSINATED // 9 } enum { NO_WINNER = 0 , // 0 W_TEAM_CT , // 1 W_TEAM_T // 2 } new winnerTeam = NO_WINNER , submsg = NO_MSG #define TASK_ID_XO 457 public plugin_init () { register_plugin ( "messages" , "latest" , "kww" ) register_message ( get_user_msgid ( "TextMsg" ), "onMessageSent" ) register_event ( "HLTV" , "onRoundStart" , "a" , "1=0" , "2=0" ) register_event ( "DeathMsg" , "Event_DeathMsg" , "a" ) register_logevent ( "Event_HostageRescued" , 3 , "2=Rescued_A_Hostage" ) mp_teamname_ct = register_cvar ( "mp_teamname_ct" , old_ct_name , FCVAR_SERVER ) mp_teamname_t = register_cvar ( "mp_teamname_t" , old_t_name , FCVAR_SERVER ) register_concmd ( "mp_teamname_reset_ct" , "rtn_ct" , ACCESS_ADMIN , _ ) register_concmd ( "mp_teamname_reset_t" , "rtn_t" , ACCESS_ADMIN , _ ) register_concmd ( "mp_teamname_reset" , "rtn" , ACCESS_ADMIN , _ ) } public client_putinserver ( id ) { if( get_user_flags ( id ) & ACCESS_ADMIN ) g__debug [ id ] = 1 } public onRoundStart () { client_print ( 0 , print_chat , "[*] New round started" ) //reset variables g_mvp = "" winnerTeam = NO_WINNER submsg = NO_MSG arrayset ( g_iEnemiesKilled , 0 , sizeof ( g_iEnemiesKilled )) arrayset ( g_iHostagesRescued , 0 , sizeof ( g_iHostagesRescued )) } /************************************** * Map objectives events * **************************************/ public bomb_planted ( planter ) { get_user_name ( planter , g_mvp , charsmax ( g_mvp )) } public bomb_defused ( defuser ) { get_user_name ( defuser , g_mvp , charsmax ( g_mvp )) } /************************************** * Catch sent messages * **************************************/ public onMessageSent ( iMessage , iDest , id ) { //get message sent static szMessage [ MESS_LEN ] get_msg_arg_string ( 2 , szMessage , charsmax ( szMessage )) /************************************** * CT events * **************************************/ if( equali ( szMessage , "#CTs_win" )) { winnerTeam = W_TEAM_CT submsg = CT_WIN } else if( equali ( szMessage , "#Bomb_Defused" )) { winnerTeam = W_TEAM_CT submsg = BOMB_DEFUSED } else if( equali ( szMessage , "#Target_Saved" )) { winnerTeam = W_TEAM_CT submsg = TARGET_SAVED } else if( equali ( szMessage , "#All_Hostages_Rescued" )) { winnerTeam = W_TEAM_CT submsg = HOSTAGES_RESCUED } else if( equali ( szMessage , "#VIP_Escaped" )) { winnerTeam = W_TEAM_CT submsg = VIP_ESCAPED } /************************************** * T events * **************************************/ else if( equali ( szMessage , "#Terrorists_Win" )) { winnerTeam = W_TEAM_T submsg = T_WIN } else if( equali ( szMessage , "#Target_Bombed" )) { winnerTeam = W_TEAM_T submsg = BOMB_PLANTED } else if( equali ( szMessage , "#Hostages_Not_Rescued" )) { winnerTeam = W_TEAM_T submsg = HOSTAGES_NOT_RESCUED } else if( equali ( szMessage , "#VIP_Assassinated" )) { winnerTeam = W_TEAM_T submsg = VIP_ASSASSINATED } if( winnerTeam ) { new id = taskid - TASK_ID_XO return PLUGIN_HANDLED } /************************************** * Some debug for admins * **************************************/ if( g__debug [ id ] == 1 ) client_print ( id , print_chat , "[*] %s" , szMessage ) return PLUGIN_CONTINUE } public message_send ( taskid ) { new id = taskid - TASK_ID_XO client_print ( 0 , print_console , "[*] executed " ) //get teamname and show message depending on winner team static teamname [ NAME_LEN ] //add suffix variable to change it when custom teamnames used static suffix [ 32 ]; suffix = g_suffix if( winnerTeam == W_TEAM_CT ) { get_pcvar_string ( mp_teamname_ct , teamname , charsmax ( teamname )) if(! equal ( teamname , old_ct_name )) suffix = g_suffix2 } else if( winnerTeam == W_TEAM_T ) { get_pcvar_string ( mp_teamname_t , teamname , charsmax ( teamname )) if(! equal ( teamname , old_t_name )) suffix = g_suffix2 } static szText [ MESS_LEN ] formatex ( szText , charsmax ( szText ), "%s %s" , teamname , suffix ) set_dhudmessage ( DH_R_STD , DH_G_STD , DH_B_STD , DH_XPOS , DH_YPOS , DH_FX , DH_FX_TIME , DH_HOLD_TIME , DH_FADEIN , DH_FADEOUT ) show_dhudmessage ( id , szText ) new szSubText [ MESS_LEN * 2 ] switch( submsg ) { case CT_WIN , T_WIN : { new who = ( submsg == 1 ? GetTopKiller ( 1 ) : GetTopKiller ( 2 )) if(!( who == - 1 )) { get_user_name ( who , g_mvp , charsmax ( g_mvp )) formatex ( szSubText , charsmax ( szSubText ), "MVP: %s for most eliminations" , g_mvp ) } } case TARGET_SAVED : { formatex ( szSubText , charsmax ( szSubText ), "Target has been saved" ) } case BOMB_PLANTED : { formatex ( szSubText , charsmax ( szSubText ), "MVP: %s for planting the bomb" , g_mvp ) } case BOMB_DEFUSED : { formatex ( szSubText , charsmax ( szSubText ), "MVP: %s for defusing the bomb" , g_mvp ) } case HOSTAGES_RESCUED : { get_user_name ( GetTopRescuer (), g_mvp , charsmax ( g_mvp )) formatex ( szSubText , charsmax ( szSubText ), "MVP: %s for rescuing most hostages" , g_mvp ) } case HOSTAGES_NOT_RESCUED : { formatex ( szSubText , charsmax ( szSubText ), "Hostages are not rescued" ) } case VIP_ESCAPED : { formatex ( szSubText , charsmax ( szSubText ), "VIP escaped successfully!" ) } case VIP_ASSASSINATED : { formatex ( szSubText , charsmax ( szSubText ), "VIP has been assassinated!" ) } default: return PLUGIN_HANDLED } set_hudmessage ( DH_R_STD , DH_G_STD , DH_B_STD , DH_XPOS , DH_YPOS + HUD_SHIFT , DH_FX , DH_FX_TIME , DH_HOLD_TIME , DH_FADEIN , DH_FADEOUT , - 1 ) show_hudmessage ( id , szSubText ) return PLUGIN_HANDLED } /************************************** * From Kia's MVP v1.0.3 * **************************************/ // Get top killer public Event_DeathMsg () g_iEnemiesKilled [ read_data ( 1 )]++ public GetTopKiller ( iTeam ) { // 1 - Counter-Terrorists, 2 - Terrorists new iPlayers [ 32 ], iPlayersnum get_players ( iPlayers , iPlayersnum , "e" , iTeam == 1 ? "CT" : "TERRORIST" ) SortCustom1D ( iPlayers , iPlayersnum , "SortByKills" ) if(! g_iEnemiesKilled [ iPlayers [ 0 ]]) return - 1 else return iPlayers [ 0 ] return PLUGIN_CONTINUE } public SortByKills ( elem1 , elem2 ) { if ( g_iEnemiesKilled [ elem1 ] > g_iEnemiesKilled [ elem2 ]) return - 1 else if ( g_iEnemiesKilled [ elem1 ] < g_iEnemiesKilled [ elem2 ]) return 1 return 0 } // Get top rescuer (only for CT) public Event_HostageRescued () { static szText [ 80 ], rescuerName [ 32 ], rescuerID read_logargv ( 0 , szText , charsmax ( szText )) parse_loguser ( szText , rescuerName , charsmax ( rescuerName )) rescuerID = get_user_index ( rescuerName ) g_iHostagesRescued [ rescuerID ]++ } public GetTopRescuer () { // Only for CT so we dont need to pass any parameters new iPlayers [ 32 ], iPlayersnum get_players ( iPlayers , iPlayersnum , "e" , "CT" ) SortCustom1D ( iPlayers , iPlayersnum , "SortByHostages" ) return iPlayers [ 0 ] } public SortByHostages ( elem1 , elem2 ) { if( g_iHostagesRescued [ elem1 ] > g_iHostagesRescued [ elem2 ]) return - 1 else if( g_iHostagesRescued [ elem1 ] < g_iHostagesRescued [ elem2 ]) return 1 return 0 } /************************************** * Reset teamnames * **************************************/ public rtn_ct ( id ) set_pcvar_string ( mp_teamname_ct , old_ct_name ) public rtn_t ( id ) set_pcvar_string ( mp_teamname_t , old_t_name ) public rtn ( id ) { rtn_ct ( id ); rtn_t ( id ); }
Last edited by kww; 04-08-2021 at 11:30 .