PHP Code:
//////////////////////////////////////////////////////////////////////////////////////////////////
/* Link: https://forums.alliedmods.net/showthread.php?t=240603
Number Quiz v1.1
----------------
At each round start, a number quiz will shown in the chat.
The first alive player to answer the quiz will receive a reward.
Available reward types:
1. HP reward ( default = 20HP )
2. HP + Armor reward ( default = 10HP + 50 Armor)
3. Godmode ( default = 15 seconds )
4. Superspeed ( default = 10 seconds )
Cvars:
quiz_type ( default = 1 ) Sets the type of quiz
-> 0 = No quiz
-> 1 = Two number addtion/subtraction
-> 2 = Three number addition/subtraction
-> 3 = Two number multiplication/division
-> 4 = Three number multiplication/division + addition/subtraction
quiz_random ( default = 0 ) If set to 1 and if quiz_type is not 0, it will put random types of quizes irrespective of the quiz_type value
quiz_hp ( default = 20 ) Sets the amount of hp reward
quiz_armor (default = 50 ) Sets the amount of armor reward
quiz_godmode_time ( default = 15 ) Sets the time in seconds for which Godmode will be active
quiz_superspeed_time ( default = 10 ) Sets the time in seconds for which Superspeed will be active
quiz_random_reward ( default = 0 ) If set to 1, the winner will receive a random reward
*/
//////////////////////////////////////////////////////////////////////////////////////////////////
#include <amxmodx>
#include <fun>
#define PLUGIN "Number Quiz"
#define VERSION "1.1"
#define AUTHOR "connoisseur"
#define TAG "[Number Quiz]"
//#define DEBUG
// Global Variables
new g_iAnswer
new bool:g_answered
new g_iPlayerSpeed[33]
static Array:g_DivisorsArray
// Cvar Handles
new hp_cvar
new type_cvar
new random_cvar
new armor_cvar
new gm_cvar
new ss_cvar
new random_reward_cvar
// Task offset
const TASK_ID = 1337
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
random_cvar = register_cvar("quiz_random", "0")
type_cvar = register_cvar("quiz_type", "1")
hp_cvar = register_cvar("quiz_hp", "50")
armor_cvar = register_cvar("quiz_armor", "500")
gm_cvar = register_cvar("quiz_godmode_time", "15")
ss_cvar = register_cvar("quiz_superspeed_time", "10")
random_reward_cvar = register_cvar("quiz_random_reward", "0")
register_logevent("eventRoundStart", 2, "1=Round_Start")
register_event("CurWeapon", "fixSpeed", "be", "1=1")
register_clcmd("say", "hookSay")
register_clcmd("say_team", "hookSay")
g_DivisorsArray = ArrayCreate(1)
}
public eventRoundStart()
{
g_answered = false
if( get_pcvar_num( type_cvar ) > 0 )
{
cmd_chat( 0, "!g%s %s = ?", TAG, generateQuiz() )
#if defined DEBUG
cmd_chat( 0, "!g%s Answer = %i", TAG, g_iAnswer )
#endif
}
new iPlayers[32]
new iNum, iPlayer
get_players(iPlayers, iNum)
for( new i; i < iNum; i++ )
{
iPlayer = iPlayers[i]
if( !g_iPlayerSpeed[iPlayer] )
continue
g_iPlayerSpeed[iPlayer] = 0
}
}
public fixSpeed(id)
{
if( is_user_alive(id) && is_user_connected(id) )
{
if( g_iPlayerSpeed[id] )
{
set_user_maxspeed(id , 800.0)
}
}
}
public hookSay(id)
{
if( !g_answered )
{
new szArgs[7]
new szAns[7]
read_args( szArgs, charsmax( szArgs ) )
remove_quotes( szArgs )
num_to_str( g_iAnswer, szAns, charsmax( szAns ) )
if( !strcmp( szArgs, szAns ) )
{
if( is_user_alive(id) )
{
g_answered = true
new szNick[32]
get_user_name(id, szNick, charsmax( szNick ) )
cmd_chat( 0, "!g%s %s has won with the correct answer ^"%i^"", TAG, szNick, g_iAnswer )
if( !get_pcvar_num( random_reward_cvar ) )
ShowMenu(id)
else
rewardPlayer( random_num( 0, 3 ) , id )
}
}
}
return PLUGIN_CONTINUE
}
generateQuiz()
{
new szQuiz[20]
new iType = get_pcvar_num( random_cvar ) ? random_num( 1, 4 ) : get_pcvar_num( type_cvar )
switch( iType )
{
case 2: // 3 number addition/subtraction
{
new iOperand[3]
new charOP[2]
iOperand[0] = random_num( 1, 100 )
iOperand[1] = random_num( 1, 100 )
iOperand[2] = random_num( 1, 100 )
charOP[0] = random_num( 0, 1 ) ? '+' : '-'
charOP[1] = random_num( 0, 1 ) ? '+' : '-'
if( charOP[0] == '+' && charOP[1] == '+' )
g_iAnswer = iOperand[0] + iOperand[1] + iOperand[2]
else if( charOP[0] == '+' && charOP[1] == '-' )
g_iAnswer = iOperand[0] + iOperand[1] - iOperand[2]
else if( charOP[0] == '-' && charOP[1] == '+' )
g_iAnswer = iOperand[0] - iOperand[1] + iOperand[2]
else
g_iAnswer = iOperand[0] - iOperand[1] - iOperand[2]
formatex( szQuiz, charsmax( szQuiz ), "%i %c %i %c %i", iOperand[0], charOP[0], iOperand[1], charOP[1], iOperand[2] )
}
case 3: // 2 number multiply/divide
{
new iOperand[2]
new charOP
charOP = random_num( 0, 1 ) ? '*' : '/'
if ( charOP == '*' )
{
iOperand[0] = random_num( 4, 99 )
iOperand[1] = random_num( 3, 9 )
g_iAnswer = iOperand[0] * iOperand[1]
}
else
{
iOperand[0] = random_num( 8, 99 )
while( isPrime( iOperand[0] ) )
iOperand[0] = random_num( 8, 99 )
iOperand[1] = getRandomDivisor( iOperand[0] )
g_iAnswer = iOperand[0] / iOperand[1]
}
formatex( szQuiz, charsmax( szQuiz ), "%i %c %i", iOperand[0], charOP, iOperand[1] )
}
case 4: // 3 num add, minus, mult, divide
{
new iOperand[3]
new charOP[2]
charOP[0] = random_num( 0, 1 ) ? '*' : '/'
charOP[1] = random_num( 0, 1 ) ? '+' : '-'
iOperand[2] = random_num( 1, 100 )
if ( charOP[0] == '*' )
{
iOperand[0] = random_num( 4, 99 )
iOperand[1] = random_num( 3, 9 )
g_iAnswer = iOperand[0] * iOperand[1]
}
else
{
iOperand[0] = random_num( 8, 99 )
while( isPrime( iOperand[0] ) )
iOperand[0] = random_num( 8, 99 )
iOperand[1] = getRandomDivisor( iOperand[0] )
g_iAnswer = iOperand[0] / iOperand[1]
}
if ( charOP[1] == '+' )
g_iAnswer += iOperand[2]
else
g_iAnswer -= iOperand[2]
formatex( szQuiz, charsmax( szQuiz ), "%i %c %i %c %i", iOperand[0], charOP[0], iOperand[1], charOP[1], iOperand[2] )
}
default:
{
new iOperand[2]
new charOP
iOperand[0] = random_num( 1, 100 )
iOperand[1] = random_num( 1, 100 )
charOP = random_num( 0, 1 ) ? '+' : '-'
if ( charOP == '+' )
g_iAnswer = iOperand[0] + iOperand[1]
else
g_iAnswer = iOperand[0] - iOperand[1]
formatex( szQuiz, charsmax( szQuiz ), "%i %c %i", iOperand[0], charOP, iOperand[1] )
}
}
return szQuiz
}
public ShowMenu(id)
{
new menu = menu_create("Choose a reward:", "rewardMenuHandler")
new szMsg[30]
formatex( szMsg, sizeof szMsg - 1, "+%i Health", get_pcvar_num( hp_cvar ) )
menu_additem(menu, szMsg, "", 0)
formatex( szMsg, sizeof szMsg - 1, "+%i Health +%i Armor", get_pcvar_num( hp_cvar )/2, get_pcvar_num( armor_cvar ) )
menu_additem(menu, szMsg, "", 0)
formatex( szMsg, sizeof szMsg - 1, "%i second Godmode", get_pcvar_num( gm_cvar ) )
menu_additem(menu, szMsg, "", 0)
formatex( szMsg, sizeof szMsg - 1, "%i second Superspeed", get_pcvar_num( ss_cvar ) )
menu_additem(menu, szMsg, "", 0)
menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER)
menu_setprop(menu, MPROP_NUMBER_COLOR, "\y")
menu_display(id, menu, 0)
return PLUGIN_HANDLED
}
public rewardMenuHandler( id, menu, item )
{
new command[6], name[64], access, callback
menu_item_getinfo( menu, item, access, command, sizeof command - 1, name, sizeof name - 1, callback )
rewardPlayer( item, id )
menu_destroy( menu )
return PLUGIN_HANDLED
}
rewardPlayer( item , id )
{
new szNick[32]
get_user_name(id, szNick, charsmax( szNick ) )
switch( item )
{
case 0:
{
new hp = get_pcvar_num( hp_cvar )
set_user_health( id, get_user_health(id) + hp )
cmd_chat( 0, "!g%s %s received +%i Health", TAG, szNick, hp)
}
case 1:
{
new hp = get_pcvar_num( hp_cvar )/2
new armor = get_pcvar_num( armor_cvar )
set_user_health( id, get_user_health(id) + hp )
set_user_armor( id, get_user_armor(id) + armor )
cmd_chat( 0, "!g%s %s received +%i Health and +%i Armor", TAG, szNick, hp, armor)
}
case 2:
{
set_user_godmode( id, 1 )
new gm = get_pcvar_num( gm_cvar )
set_task( gm + 0.0, "removeGodmode", id + TASK_ID )
cmd_chat( 0, "!g%s %s received %i second Godmode !", TAG, szNick, gm)
}
case 3:
{
set_user_maxspeed( id, 800.0 )
g_iPlayerSpeed[id] = 1
new ss = get_pcvar_num( ss_cvar )
set_task( ss + 0.0, "removeSuperspeed", id + TASK_ID )
cmd_chat( 0, "!g%s %s received %i second Superspeed ! Go Go Go !", TAG, szNick, ss)
}
}
}
public removeSuperspeed(id)
{
id -= TASK_ID
set_user_maxspeed( id, -1.0 )
g_iPlayerSpeed[id] = 0
cmd_chat( id, "!g%s Time up !! Your speed has been set back to normal !", TAG )
}
public removeGodmode(id)
{
id -= TASK_ID
set_user_godmode( id, 0 )
cmd_chat( id, "!g%s Time up !! You no longer have Godmode !", TAG )
}
getRandomDivisor( iNum )
{
for( new i = 2; i <= iNum/2 ; i++ ) //get all divisors
{
if( iNum % i == 0 )
ArrayPushCell( g_DivisorsArray, i )
}
new iDiv = ArrayGetCell( g_DivisorsArray, random_num( 0, ArraySize( g_DivisorsArray ) - 1 ) )
ArrayClear( g_DivisorsArray )
return iDiv
}
isPrime( iNum )
{
new bool:prime = true
for( new i = 2; i <= iNum/2 ; i++ )
{
if( iNum % i == 0 )
{
prime = false
break
}
}
return prime
}
public plugin_end()
{
ArrayDestroy( g_DivisorsArray )
}
stock cmd_chat(const id, const input[], any:...)
{
new count = 1, players[32];
static msg[191]; vformat(msg, 190, input, 3);
replace_all(msg, 190, "!g", "^4");
replace_all(msg, 190, "!y", "^1");
replace_all(msg, 190, "!t", "^3");
if (id) players[0] = id; else get_players(players,count,"ch");
for (new i=0;i<count;i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}