Advertisement
CheezPuff

[Free] JB Challenges First [New Version v2,1]

Dec 21st, 2024 (edited)
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 12.15 KB | None | 0 0
  1. /* 21/12/2024 Latest Version of JB Challenges
  2.     v2.2 - Fixed HUD and chat handling, improved code stability
  3. */
  4.  
  5. #include <amxmodx>
  6. #include <amxmisc>
  7. #include <cstrike>
  8. #include <hamsandwich>
  9.  
  10. #define ADMIN_FLAG ADMIN_KICK
  11. #define MAX_PLAYERS 32
  12. #define CHALLENGE_TIMEOUT 30.0
  13. #define CHECK_INTERVAL 10.0
  14. #define TASK_GUESS_TIMER 987456
  15.  
  16. new bool:g_GameActive = false;
  17. new g_CountdownTime;
  18. new g_Answer[32];
  19. new bool:g_WinnerFound = false;
  20. new g_GameType;
  21. new g_NoResponseCount = 0;
  22. new bool:g_CountdownActive = false;
  23. new Float:g_StartTime;
  24. new Float:g_TimeElapsed;
  25.  
  26. // Guess game variables
  27. new g_PlayerGuesses[MAX_PLAYERS + 1];
  28. new g_BestGuessPlayer;
  29. new g_GuessCount = 0;
  30.  
  31. enum _:GameTypes {
  32.     GAME_FIRSTWRITE = 1,
  33.     GAME_GUESS,
  34.     GAME_MATH
  35. }
  36.  
  37. public plugin_init() {
  38.     register_plugin("JB Challenges", "2.1", "CheezPuff (Ariel)");
  39.  
  40.     register_concmd("say /first", "CmdStartGame", ADMIN_FLAG);
  41.     register_concmd("say /random", "CmdStartGame", ADMIN_FLAG);
  42.     register_concmd("say /fw", "CmdStartGame", ADMIN_FLAG);
  43.     register_concmd("say /stopfw", "CmdStopGame", ADMIN_FLAG);
  44.     register_concmd("say /stopfirst", "CmdStopGame", ADMIN_FLAG);
  45.    
  46.     register_clcmd("say", "HandleSay");
  47.     register_clcmd("say_team", "HandleSay");
  48.    
  49.     set_task(CHECK_INTERVAL, "CheckTerroristCount", .flags="b");
  50. }
  51.  
  52. public plugin_precache() {
  53.     precache_sound("fvox/1.wav");
  54.     precache_sound("fvox/2.wav");
  55.     precache_sound("fvox/3.wav");
  56.     precache_sound("fvox/4.wav");
  57.     precache_sound("fvox/5.wav");
  58. }
  59.  
  60. public CheckTerroristCount(taskid) {
  61.     if (g_GameActive)
  62.         return;
  63.        
  64.     new tCount = get_team_count(CS_TEAM_T);
  65.     if (tCount >= 9) {
  66.         StartGameCountdown();
  67.     }
  68. }
  69.  
  70. public CmdStartGame(id, level, cid) {
  71.     if (!cmd_access(id, level, cid, 1))
  72.         return PLUGIN_HANDLED;
  73.    
  74.     if (g_GameActive) {
  75.         client_print_color(id, print_team_default, "^4[JB]^1 A challenge is already in progress!");
  76.         return PLUGIN_HANDLED;
  77.     }
  78.    
  79.     new tCount = get_team_count(CS_TEAM_T);
  80.     if (tCount < 2) {
  81.         client_print_color(id, print_team_default, "^4[JB]^1 Need at least 2 terrorists to start a challenge!");
  82.         return PLUGIN_HANDLED;
  83.     }
  84.    
  85.     StartGameCountdown();
  86.     return PLUGIN_HANDLED;
  87. }
  88.  
  89. public CmdStopGame(id, level, cid) {
  90.     if (!cmd_access(id, level, cid, 1))
  91.         return PLUGIN_HANDLED;
  92.    
  93.     if (!g_GameActive && !g_CountdownActive) {
  94.         client_print_color(id, print_team_default, "^4[JB]^1 No challenge is currently running!");
  95.         return PLUGIN_HANDLED;
  96.     }
  97.    
  98.     // Clear HUD messages explicitly before resetting game state
  99.     set_hudmessage(0, 0, 0, -1.0, 0.35, 0, 0.1, 0.1, 0.0, 0.0);
  100.     show_hudmessage(0, "");
  101.    
  102.     ResetGameState();
  103.     client_print_color(0, print_team_default, "^4[JB]^1 An admin has stopped the current challenge.");
  104.     return PLUGIN_HANDLED;
  105. }
  106.  
  107. stock get_team_count(CsTeams:team) {
  108.     new players[MAX_PLAYERS], num;
  109.     get_players(players, num, "ae", team == CS_TEAM_T ? "TERRORIST" : "CT");
  110.     return num;
  111. }
  112.  
  113. public StartGameCountdown() {
  114.     // Clear any existing HUD messages first
  115.     ClearAllHudMessages();
  116.    
  117.     ResetGameState();
  118.     g_GameActive = true;
  119.     g_CountdownActive = true;
  120.     g_CountdownTime = 5;
  121.    
  122.     // Select random game type with equal probability
  123.     new randomValue = random_num(1, 3);
  124.     switch(randomValue) {
  125.         case 1: g_GameType = GAME_FIRSTWRITE;
  126.         case 2: g_GameType = GAME_GUESS;
  127.         case 3: g_GameType = GAME_MATH;
  128.     }
  129.    
  130.     new gameTypeName[32];
  131.     GetGameTypeName(g_GameType, gameTypeName, charsmax(gameTypeName));
  132.    
  133.     set_hudmessage(0, 255, 255, -1.0, 0.35, 0, 6.0, 12.0, 0.1, 0.1);
  134.     show_hudmessage(0, "%s will start in 5 seconds", gameTypeName);
  135.    
  136.     client_print_color(0, print_team_default, "^4[JB]^1 %s will start in 5 seconds", gameTypeName);
  137.    
  138.     set_task(1.0, "CountdownTimer");
  139. }
  140.  
  141. public CountdownTimer() {
  142.     static Float:lastMessageTime;
  143.     new Float:currentTime = get_gametime();
  144.  
  145.     if ((currentTime - lastMessageTime) < 0.8) {
  146.         set_task(0.2, "CountdownTimer");
  147.         return;
  148.     }
  149.    
  150.     if (g_CountdownTime > 0) {
  151.         // Show countdown with game type in cyan
  152.         set_hudmessage(0, 255, 255, -1.0, 0.35, 0, 0.8, 0.8, 0.1, 0.1);
  153.        
  154.         new gameTypeName[32];
  155.         GetGameTypeName(g_GameType, gameTypeName, charsmax(gameTypeName));
  156.         show_hudmessage(0, "%s will start in %d seconds", gameTypeName, g_CountdownTime);
  157.        
  158.         // Play countdown sound
  159.         new sound[32];
  160.         formatex(sound, charsmax(sound), "fvox/%d.wav", g_CountdownTime);
  161.         emit_sound(0, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM);
  162.        
  163.         lastMessageTime = currentTime;
  164.         g_CountdownTime--;
  165.         set_task(1.0, "CountdownTimer");
  166.     } else {
  167.         g_CountdownActive = false;
  168.         StartSelectedGame();
  169.     }
  170. }
  171.  
  172. public StartSelectedGame() {
  173.     // Store start time for calculating elapsed time
  174.     g_StartTime = get_gametime();
  175.    
  176.     switch(g_GameType) {
  177.         case GAME_FIRSTWRITE: {
  178.             new chars[] = "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
  179.             new output[8];
  180.             for (new i = 0; i < 6; i++) {
  181.                 output[i] = chars[random_num(0, strlen(chars) - 1)];
  182.             }
  183.             output[6] = 0;
  184.             copy(g_Answer, charsmax(g_Answer), output);
  185.            
  186.             set_hudmessage(0, 255, 255, -1.0, 0.35, 0, CHALLENGE_TIMEOUT, CHALLENGE_TIMEOUT);
  187.             show_hudmessage(0, "First to write: %s", output);
  188.             client_print_color(0, print_team_default, "^4[JB]^1 First to write: ^4%s^1", output);
  189.         }
  190.        
  191.         case GAME_GUESS: {
  192.             new num = random_num(1, 150);
  193.             num_to_str(num, g_Answer, charsmax(g_Answer));
  194.            
  195.             // Start timer task for guess game
  196.             g_TimeElapsed = CHALLENGE_TIMEOUT;
  197.             set_task(1.0, "UpdateGuessTimer", TASK_GUESS_TIMER);
  198.            
  199.             UpdateGuessTimer();
  200.         }
  201.        
  202.         case GAME_MATH: {
  203.             new num1 = random_num(1, 50);
  204.             new num2 = random_num(1, 50);
  205.             new operation = random_num(1, 2);
  206.             new result;
  207.            
  208.             if (operation == 1) {
  209.                 result = num1 + num2;
  210.                 num_to_str(result, g_Answer, charsmax(g_Answer));
  211.                 set_hudmessage(0, 255, 255, -1.0, 0.35, 0, CHALLENGE_TIMEOUT, CHALLENGE_TIMEOUT);
  212.                 show_hudmessage(0, "Math Question: %d + %d = ?", num1, num2);
  213.                 client_print_color(0, print_team_default, "^4[JB]^1 Math Question: %d + %d = ?", num1, num2);
  214.             } else {
  215.                 result = num1 - num2;
  216.                 num_to_str(result, g_Answer, charsmax(g_Answer));
  217.                 set_hudmessage(0, 255, 255, -1.0, 0.35, 0, CHALLENGE_TIMEOUT, CHALLENGE_TIMEOUT);
  218.                 show_hudmessage(0, "Math Question: %d - %d = ?", num1, num2);
  219.                 client_print_color(0, print_team_default, "^4[JB]^1 Math Question: ^4%d ^1- ^4%d^1 = ?", num1, num2);
  220.             }
  221.         }
  222.     }
  223.    
  224.     set_task(CHALLENGE_TIMEOUT, "EndGameNoWinner");
  225. }
  226.  
  227. public HandleSay(id) {
  228.     if (!g_GameActive || g_WinnerFound || !is_user_connected(id) || g_CountdownActive)
  229.         return PLUGIN_CONTINUE;
  230.    
  231.     if (cs_get_user_team(id) != CS_TEAM_T)
  232.         return PLUGIN_CONTINUE;
  233.    
  234.     new said[32];
  235.     read_args(said, charsmax(said));
  236.     remove_quotes(said);
  237.     trim(said);
  238.    
  239.     if (strlen(said) < 1)
  240.         return PLUGIN_CONTINUE;
  241.    
  242.     switch(g_GameType) {
  243.         case GAME_FIRSTWRITE: {
  244.             if (equal(said, g_Answer, strlen(g_Answer))) {
  245.                 DeclareWinner(id, "First Write");
  246.                 return PLUGIN_HANDLED;
  247.             }
  248.         }
  249.        
  250.         case GAME_GUESS: {
  251.             if (!is_str_num(said) || g_PlayerGuesses[id] != 0)
  252.                 return PLUGIN_CONTINUE;
  253.            
  254.             new guess = str_to_num(said);
  255.             if (guess < 1 || guess > 150)
  256.                 return PLUGIN_CONTINUE;
  257.            
  258.             g_PlayerGuesses[id] = guess;
  259.             g_GuessCount++;
  260.            
  261.             client_print_color(id, print_team_default, "^4[JB]^1 You guessed number: ^4%d^1!", guess);
  262.            
  263.             new answer = str_to_num(g_Answer);
  264.             if (guess == answer) {
  265.                 DeclareWinner(id, "Number Guess - Perfect!");
  266.                 return PLUGIN_HANDLED;
  267.             }
  268.            
  269.             new currentDiff = abs(guess - answer);
  270.             if (g_BestGuessPlayer == 0 || currentDiff < abs(g_PlayerGuesses[g_BestGuessPlayer] - answer)) {
  271.                 g_BestGuessPlayer = id;
  272.             }
  273.            
  274.             return PLUGIN_HANDLED;
  275.         }
  276.        
  277.         case GAME_MATH: {
  278.             if (str_to_num(said) == str_to_num(g_Answer)) {
  279.                 DeclareWinner(id, "Math");
  280.                 return PLUGIN_HANDLED;
  281.             }
  282.         }
  283.     }
  284.    
  285.     return PLUGIN_CONTINUE;
  286. }
  287.  
  288. public DeclareWinner(id, const gameType[]) {
  289.     if (g_WinnerFound || !is_user_connected(id))
  290.         return;
  291.    
  292.     g_WinnerFound = true;
  293.     g_GameActive = false;
  294.     g_NoResponseCount = 0;
  295.  
  296.     // Store elapsed time
  297.     g_StartTime = get_gametime() - g_StartTime;
  298.    
  299.     cs_set_user_team(id, CS_TEAM_CT);
  300.     ExecuteHamB(Ham_CS_RoundRespawn, id);
  301.    
  302.     new name[32];
  303.     get_user_name(id, name, charsmax(name));
  304.     client_print_color(0, print_team_default, "^4[JB]^3 %s ^1has won the^4 %s ^1and moved to CT! Answer was: %s",
  305.     name, gameType, g_Answer);
  306.    
  307.     remove_task();
  308.     set_task(5.0, "CheckTerroristCount");
  309. }
  310.  
  311. public EndGameNoWinner() {
  312.     if (!g_GameActive)
  313.         return;
  314.        
  315.     if (g_GameType == GAME_GUESS && g_BestGuessPlayer && g_GuessCount > 0) {
  316.         DeclareWinner(g_BestGuessPlayer, "Number Guess - Closest!");
  317.         return;
  318.     }
  319.    
  320.     g_GameActive = false;
  321.     g_NoResponseCount++;
  322.    
  323.     client_print_color(0, print_team_default, "^4[JB]^1 Time's up! No one won the challenge.");
  324.    
  325.     if (g_NoResponseCount >= 2) {
  326.         client_print_color(0, print_team_default, "^4[JB]^1 Starting a new challenge automatically...");
  327.         g_NoResponseCount = 0;
  328.         set_task(3.0, "StartGameCountdown");
  329.     }
  330.    
  331.     set_task(5.0, "CheckTerroristCount");
  332. }
  333.  
  334. stock ClearAllHudMessages() {
  335.     // Multiple calls with different parameters to ensure clearing
  336.     set_hudmessage(0, 0, 0, -1.0, 0.35, 0, 0.1, 0.1, 0.0, 0.0);
  337.     show_hudmessage(0, "");
  338.    
  339.     set_hudmessage(0, 0, 0, -1.0, 0.35, 1, 0.1, 0.1, 0.0, 0.0);
  340.     show_hudmessage(0, " ");
  341.    
  342.     // Small delay before allowing new messages
  343.     set_task(0.2, "EnableHudMessages");
  344. }
  345.  
  346. public EnableHudMessages() {
  347.     // This function exists just to provide a delay
  348.     return PLUGIN_CONTINUE;
  349. }
  350.  
  351. public UpdateGuessTimer() {
  352.     if (!g_GameActive || g_WinnerFound)
  353.         return;
  354.        
  355.     g_TimeElapsed--;
  356.    
  357.     if (g_TimeElapsed <= 0) {
  358.         remove_task();
  359.         EndGameNoWinner();
  360.         return;
  361.     }
  362.    
  363.     set_hudmessage(0, 255, 255, -1.0, 0.35, 0, 9999.0, 1.0, 0.1, 0.1);
  364.     show_hudmessage(0, "Guess the number between 1 and 150!^n^nTime remaining: %.0f seconds", g_TimeElapsed);
  365.    
  366.     // Ensure the task continues
  367.     set_task(1.0, "UpdateGuessTimer", TASK_GUESS_TIMER);
  368. }
  369.  
  370. public ResetGameState() {
  371.     g_GameActive = false;
  372.     g_WinnerFound = false;
  373.     g_CountdownActive = false;
  374.     g_NoResponseCount = 0;
  375.     g_GuessCount = 0;
  376.     g_BestGuessPlayer = 0;
  377.    
  378.     for (new i = 1; i <= MAX_PLAYERS; i++) {
  379.         g_PlayerGuesses[i] = 0;
  380.     }
  381.    
  382.     // Important: Clear all tasks first
  383.     remove_task();
  384.    
  385.     // Clear HUD messages
  386.     ClearAllHudMessages();
  387. }
  388.  
  389. GetGameTypeName(type, output[], len) {
  390.     switch(type) {
  391.         case GAME_FIRSTWRITE: copy(output, len, "First Write Challenge");
  392.         case GAME_GUESS: copy(output, len, "Number Guess Challenge");
  393.         case GAME_MATH: copy(output, len, "Math Challenge");
  394.         default: copy(output, len, "Unknown Challenge");
  395.     }
  396. }
Tags: #cs1.6
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement