PHP Code:
#include <sourcemod>
char g_szClasses[][] = {"scout", "soldier", "pyro", "demoman", "heavy", "engineer", "medic", "sniper", "spy"};
ArrayList pWeaponNames[sizeof(g_szClasses)];
ArrayList pWeaponIndexes[sizeof(g_szClasses)];
public void OnPluginStart()
{
for(int i = 0; i < sizeof(g_szClasses); i++)
{
pWeaponNames[i] = new ArrayList(128);
pWeaponIndexes[i] = new ArrayList();
}
char path[PLATFORM_MAX_PATH];
BuildPath(Path_SM, path, sizeof(path), "data/test.kv");
KeyValues kv = new KeyValues("weapons");
if(kv.ImportFromFile(path))
{
kv.GotoFirstSubKey(true);
do
{
char sec[128];
kv.GetSectionName(sec, sizeof(sec));
int index = -1;
for(int i = 0; i < sizeof(g_szClasses); i++)
{
if(StrEqual(g_szClasses[i], sec))
{
index = i;
break;
}
}
if(index == -1)
{
PrintToServer("Invalid key found, exiting");
delete kv;
return;
}
kv.GotoFirstSubKey(false);
do
{
kv.GetSectionName(sec, sizeof(sec));
pWeaponNames[index].PushString(sec);
pWeaponIndexes[index].Push(kv.GetNum(NULL_STRING));
}while(kv.GotoNextKey(false))
kv.GoBack();
}while(kv.GotoNextKey(true))
//Print everything out.
for(int x = 0; x < sizeof(g_szClasses); x++)
{
PrintToServer(g_szClasses[x]);
for(int i = 0; i < pWeaponNames[x].Length; i++)
{
char name[128];
pWeaponNames[x].GetString(i, name, sizeof(name));
PrintToServer(" %s -> %i", name, pWeaponIndexes[x].Get(i));
}
}
delete kv;
return;
}
PrintToServer("Failed to parse test.kv");
delete kv;
}
Thats an example, everything is stored in arraylists. There is a sample of looping through everything in there too. I made it check against a list of classes so no matter the order of the kv the classes will still be mapped correctly.