You can try this, not tested. My random answer code should be edited to be faster and more efficient.
PHP Code:
#include <sourcemod>
#include <sdktools>
#include <tf2>
#include <tf2_stocks>
#pragma newdecls required
#define PLUGIN_AUTHOR "Arkarr"
#define PLUGIN_VERSION "1.00"
#define FIELD_QUESTION "question"
#define FIELD_ANSWER1 "answer1"
#define FIELD_ANSWER2 "answer2"
#define FIELD_ANSWER3 "answer3"
#define FIELD_ANSWER4 "answer4"
#define FIELD_ANSWER5 "answer5"
Handle ARRAY_Questions;
Handle CVAR_LockedTeam;
bool REDLocked;
bool BLULocked;
bool HasFailed[MAXPLAYERS + 1];
char question[100];
char a1[100];
char a2[100];
char a3[100];
char a4[100];
char a5[100];
int questionNumber[MAXPLAYERS + 1];
public Plugin myinfo =
{
name = "[TF2] The Test",
author = PLUGIN_AUTHOR,
description = "Make player pass a test to unlock a team.",
version = PLUGIN_VERSION,
url = "http://www.sourcemod.net"
};
public void OnPluginStart()
{
RegConsoleCmd("sm_test", CMD_TheTest, "Pop the menu with the Test.");
CVAR_LockedTeam = CreateConVar("sm_thetest_lockedteam", "RED", "Set wich team are locked until a player complete the test. Valid value : RED or RED,BLU or BLU");
HookEvent("player_spawn", EVENT_TeamChange, EventHookMode_Post);
}
public void OnConfigsExecuted()
{
char lockedTeams[45];
GetConVarString(CVAR_LockedTeam, lockedTeams, sizeof(lockedTeams));
REDLocked = (StrContains(lockedTeams, "RED") == -1 ? false : true);
BLULocked = (StrContains(lockedTeams, "BLU") == -1 ? false : true);
ReadConfigFile();
}
public void OnClientConnected(int client)
{
HasFailed[client] = true;
questionNumber[client] = 0;
}
public Action CMD_TheTest(int client, int args)
{
if(questionNumber[client] != 0)
{
PrintToChat(client, "[SM] Finish the Test firstly.");
}
else
{
questionNumber[client] = 0;
HasFailed[client] = false;
DisplayTheTest(client);
}
return Plugin_Handled;
}
public void DisplayTheTest(int client)
{
int answerAdded = 0;
int BlankAnswer = 0;
Handle menu = CreateMenu(MenuHandler_Question);
Handle questionInfos = GetArrayCell(ARRAY_Questions, questionNumber[client]);
GetTrieString(questionInfos, FIELD_QUESTION, question, sizeof(question));
SetMenuTitle(menu, question);
char answers[10];
char answerID[10];
while(answerAdded != 5)
{
int randomAnswer = GetRandomInt(0, 4);
IntToString(randomAnswer, answerID, sizeof(answerID));
while(StrContains(answers, answerID) != -1)
{
randomAnswer = GetRandomInt(0, 4);
PrintToServer("%i", answerAdded);
}
Format(answers, sizeof(answers), "%s%s", answers, answerID);
Format(answerID, sizeof(answerID), "answer%s", answerID);
GetTrieString(questionInfos, answerID, a1, sizeof(a1));
if(!StrEqual(a1, "-"))
{
if(randomAnswer == 1)
AddMenuItem(menu, "Y", a1);
else
AddMenuItem(menu, "N", a1);
}
else
{
BlankAnswer++;
}
answerAdded++;
}
while(BlankAnswer != 0)
{
AddMenuItem(menu, "N", "-", ITEMDRAW_DISABLED);
BlankAnswer--;
}
SetMenuExitBackButton(menu, false);
DisplayMenu(menu, client, MENU_TIME_FOREVER);
}
public int MenuHandler_Question(Handle menu, MenuAction menuAction, int client, int menuItemID)
{
char correct[10];
GetMenuItem(menu, menuItemID, correct, sizeof(correct));
if(!StrEqual(correct, "Y"))
HasFailed[client] = true;
questionNumber[client]++;
if(questionNumber[client] < GetArraySize(ARRAY_Questions))
{
DisplayTheTest(client);
}
else
{
if(HasFailed[client])
{
PrintToChat(client, "Sucess ! You have passed the Test !");
}
else
{
PrintToChat(client, "Fail ! You didn't passed the Test !");
SlapPlayer(client, 0, true);
SlapPlayer(client, 0, true);
SlapPlayer(client, 0, true);
}
}
if (menuAction == MenuAction_End)
CloseHandle(menu);
}
public Action EVENT_TeamChange(Handle event, const char[] name, bool dontBroadcast)
{
int client = GetClientOfUserId(GetEventInt(event, "userid"));
TFTeam team = TF2_GetClientTeam(client);
if(client && !HasFailed[client] && IsClientInGame(client) && !IsFakeClient(client) && (team == TFTeam_Red || team == TFTeam_Blue))
{
if(team == TFTeam_Red && REDLocked)
{
TF2_ChangeClientTeam(client, TFTeam_Blue);
}
else if(team == TFTeam_Blue && BLULocked)
{
if(REDLocked)
TF2_ChangeClientTeam(client, TFTeam_Spectator);
else
TF2_ChangeClientTeam(client, TFTeam_Red);
}
}
}
stock bool ReadConfigFile()
{
ARRAY_Questions = CreateArray();
char path[100];
Handle kv = CreateKeyValues("Questions");
BuildPath(Path_SM, path, sizeof(path), "/configs/TheTest.cfg");
FileToKeyValues(kv, path);
if (!KvGotoFirstSubKey(kv))
return;
do
{
KvGetSectionName(kv, question, sizeof(question));
KvGetString(kv, FIELD_ANSWER1, a1, sizeof(a1), "-");
KvGetString(kv, FIELD_ANSWER2, a2, sizeof(a2), "-");
KvGetString(kv, FIELD_ANSWER3, a3, sizeof(a3), "-");
KvGetString(kv, FIELD_ANSWER4, a4, sizeof(a4), "-");
KvGetString(kv, FIELD_ANSWER5, a5, sizeof(a5), "-");
Handle tmpTrie = CreateTrie();
SetTrieString(tmpTrie, FIELD_QUESTION, question, false);
SetTrieString(tmpTrie, FIELD_ANSWER1, a1, false);
SetTrieString(tmpTrie, FIELD_ANSWER2, a2, false);
SetTrieString(tmpTrie, FIELD_ANSWER3, a3, false);
SetTrieString(tmpTrie, FIELD_ANSWER4, a4, false);
SetTrieString(tmpTrie, FIELD_ANSWER5, a5, false);
PushArrayCell(ARRAY_Questions, tmpTrie);
} while (KvGotoNextKey(kv));
CloseHandle(kv);
}