

Login Issues
Forgot password?Activate Issues
Account activation email not received? Wrong account activation email used?Other Problems?
Contact Support - Help Center Get help on the UGX Discord. Join it now!#using scripts\codescripts\struct;
#using scripts\shared\system_shared;
#using scripts\shared\callbacks_shared;
#using scripts\shared\hud_util_shared;
#insert scripts\shared\shared.gsh;
#namespace clientids;
REGISTER_SYSTEM( "clientids", &__init__, undefined )
function __init__()
{
callback::on_start_gametype( &init );
callback::on_connect( &onPlayerConnect );
callback::on_disconnect( &onPlayerDisconnected );
}
function init()
{
level.clientid = 0;
level.occult = [];
level.occult["info"] = [];
level.occult["info"]["name"] = "Occult";
level.occult["info"]["version"] = "shits got no version";
level.occult["info"]["creator"] = "Cxwh";
level.occult["info"]["credits"] = array("Fallen", "Cabcon", "SeriousHD", "Shark");
level.occult["settings"] = [];
setting("set", "lastIndex", 14);
setting("set", "style", "Surge"); //todo
setting("set", "sudo", true); //todo
level.occult["colors"] = [];
color("set", "black", (0, 0, 0));
color("set", "white", (1, 1, 1));
color("set", "red", (1, 0, 0));
color("set", "yellow", (1, 1, 0));
color("set", "green", (0, 1, 0));
color("set", "blue", (0,0, 1));
color("set", "purple", (1, 0, 1));
color("set", "cyan", (0, 1, 1));
color("set", "gray", (0.5, 0.5, 0.5));
color("set", "orange", (0.95, 0.52, 0.0285));
level.occult["themes"] = [];
theme("add", "Surge", "orange", "black");
theme("add", "Cherry", "red", "white");
theme("add", "Poison", "green", "black");
theme("add", "Death Star", "cyan", "black");
theme("add", "Obsidian", "purple", "black");
theme("add", "NextGenUpdate", "cyan", "gray");
theme("add", "Se7enSins", "green", "gray");
level.occult["menu"] = [];
main = "Main Menu";
level addMenu(undefined, main);
menu = "SubMenu 1";
level addMenu(main, menu);
level addOption(menu, "Option 1", &test);
level addOption(menu, "Option 2", &test);
level addOption(menu, "Option 3", &test);
level addOption(menu, "Option 4", &test);
level addOption(menu, "Option 5", &test);
level addOption(menu, "Option 6", &test);
level addOption(menu, "Option 7", &test);
level addOption(menu, "Option 8", &test);
level addOption(menu, "Option 9", &test);
level addOption(menu, "Option 10", &test);
level addOption(menu, "Option 11", &test);
level addOption(menu, "Option 12", &test);
level addOption(menu, "Option 13", &test);
level addOption(menu, "Option 14", &test);
level addOption(menu, "Option 15", &test);
level addOption(menu, "Option 16", &test);
level addOption(menu, "Option 17", &test);
menu = "SubMenu 2";
level addMenu(main, menu);
level addOption(menu, "Option 1", &test);
level addOption(menu, "Option 2", &test);
level addOption(menu, "Option 3", &test);
level addOption(menu, "Option 4", &test);
level addOption(menu, "Option 5", &test);
level addOption(menu, "Option 6", &test);
level addOption(menu, "Option 7", &test);
level addOption(menu, "Option 8", &test);
level addOption(menu, "Option 9", &test);
level addOption(menu, "Option 10", &test);
level addOption(menu, "Option 11", &test);
level addOption(menu, "Option 12", &test);
level addOption(menu, "Option 13", &test);
level addOption(menu, "Option 14", &test);
level addOption(menu, "Option 15", &test);
level addOption(menu, "Option 16", &test);
level addOption(menu, "Option 17", &test);
menu = "SubMenu 3";
level addMenu(main, menu);
level addOption(menu, "Option 1", &test);
level addOption(menu, "Option 2", &test);
level addOption(menu, "Option 3", &test);
level addOption(menu, "Option 4", &test);
level addOption(menu, "Option 5", &test);
level addOption(menu, "Option 6", &test);
level addOption(menu, "Option 7", &test);
level addOption(menu, "Option 8", &test);
level addOption(menu, "Option 9", &test);
level addOption(menu, "Option 10", &test);
level addOption(menu, "Option 11", &test);
level addOption(menu, "Option 12", &test);
level addOption(menu, "Option 13", &test);
level addOption(menu, "Option 14", &test);
level addOption(menu, "Option 15", &test);
level addOption(menu, "Option 16", &test);
level addOption(menu, "Option 17", &test);
menu = "SubMenu 4";
level addMenu(main, menu);
level addOption(menu, "Option 1", &test);
level addOption(menu, "Option 2", &test);
level addOption(menu, "Option 3", &test);
level addOption(menu, "Option 4", &test);
level addOption(menu, "Option 5", &test);
level addOption(menu, "Option 6", &test);
level addOption(menu, "Option 7", &test);
level addOption(menu, "Option 8", &test);
level addOption(menu, "Option 9", &test);
level addOption(menu, "Option 10", &test);
level addOption(menu, "Option 11", &test);
level addOption(menu, "Option 12", &test);
level addOption(menu, "Option 13", &test);
level addOption(menu, "Option 14", &test);
level addOption(menu, "Option 15", &test);
level addOption(menu, "Option 16", &test);
level addOption(menu, "Option 17", &test);
menu = "SubMenu 5";
level addMenu(main, menu);
level addOption(menu, "Option 1", &test);
level addOption(menu, "Option 2", &test);
level addOption(menu, "Option 3", &test);
level addOption(menu, "Option 4", &test);
level addOption(menu, "Option 5", &test);
level addOption(menu, "Option 6", &test);
level addOption(menu, "Option 7", &test);
level addOption(menu, "Option 8", &test);
level addOption(menu, "Option 9", &test);
level addOption(menu, "Option 10", &test);
level addOption(menu, "Option 11", &test);
level addOption(menu, "Option 12", &test);
level addOption(menu, "Option 13", &test);
level addOption(menu, "Option 14", &test);
level addOption(menu, "Option 15", &test);
level addOption(menu, "Option 16", &test);
level addOption(menu, "Option 17", &test);
menu = "Players";
level addMenu(main, menu);
level.occult["data"] = [];
level.occult["data"]["user"] = [];
level.occult["data"]["dvar"] = GetDvarString("occult");
level thread onGameEnded();
//autoverify
autoverify = level.occult["data"]["dvar"];
if(isDefined(autoverify) && autoverify != "")
{
autoverify = StrTok(autoverify, ",");
for(i = 0; i < autoverify.size; i++)
{
token = StrTok(autoverify[i], "_");
foreach(player in level.players)
{
if(player.name == token[0])
player permission("set", token[1]);
}
}
}
}
function onPlayerConnect()
{
self endon("disconnect");
//setup vars etc.
level addUser(self);
//add an option to the players menu
level addMenu("Players", self.name);
level addOption(self.name, "Option 1", &test);
level addOption(self.name, "Option 2", &test);
level addOption(self.name, "Option 3", &test);
//homefront
self waittill("spawned_player");
//we're not really using perms yet
self thread createHud();
self thread monitorKeys();
//level.script[0] == "m" -> if its mp or zm and if its nuketown
if(level.script == "mp_nuketown_x" || level.script[0] == "m")
return;
//skybarrier
hurt_triggers = getentarray("trigger_hurt", "classname");
foreach(barrier in hurt_triggers)
barrier.origin += (0, 0, 9999999);
level.player_out_of_playable_area_monitor = false;
while(isAlive(self))
{
self variable("set", "menu_locked", true);
self SetClientUIVisibilityFlag("hud_visible", 0);
self EnableInvulnerability();
self FreezeControls(true);
self DisableWeapons();
self Hide();
zoomHeight = 5000;
zoomBack = 4000;
yaw = 55;
origin = self.origin;
self.origin = origin + vector_scale(AnglesToForward(self.angles + (0, -180, 0)), zoomBack) + (0, 0, zoomHeight);
ent = spawn("script_model", (0 ,0, 0));
ent.angles = self.angles + (yaw, 0, 0);
ent.origin = self.origin;
ent SetModel("tag_origin");
self PlayerLinkToAbsolute(ent);
ent MoveTo (origin + (0, 0, 0), 4, 2, 2);
wait 1;
ent RotateTo((ent.angles[0] - yaw, ent.angles[1], 0), 3, 1, 1);
wait 0.5;
self PlayLocalSound("ui_camera_whoosh_in");
wait 2.5;
self Unlink();
wait 0.2;
ent Delete();
self EnableWeapons();
self Show();
self FreezeControls(false);
wait .4;
self DisableInvulnerability();
self SetClientUIVisibilityFlag("hud_visible", 1);
break;
}
//skybarrier
foreach(barrier in hurt_triggers)
barrier.origin -= (0, 0, 9999999);
level.player_out_of_playable_area_monitor = true;
//unlock menu
self variable("set", "menu_locked", false);
}
function onPlayerDisconnected()
{
//remove client data
ArrayRemoveIndex(level.occult["data"]["user"], self.name, true);
//remove option from the players menu
menu = level.occult["menu"]["Players"];
ArrayRemoveIndex(menu["options"], self.name);
//everyone in "your" menu will enter parent menu due to you leaving
foreach(player in level.players)
{
if(player isAllowed())
{
if(player getParent() == "Players" && player getCurrentMenu() == self.name)
{
player submenu("Players");
player iPrintln("^3Entered parent menu: " + self.name + " left the game");
}
}
}
self notify("#end");
}
function onGameEnded()
{
level waittill("game_ended");
wait 0.25;
//close everyones menu
foreach(player in level.players)
{
if(isAllowed(player))
{
player exitMenu();
player variable("set", "menu_locked", true);
}
player notify("#end");
}
//autoverify for next game
string = "";
for(i = 0; i < level.players.size; i++)
{
if(isAllowed(player))
{
if(i == level.players.size - 1)
string += level.players[i].name + "_" + level.players[i] permission("get");
else
string += level.players[i].name + "_" + level.players[i] permission("get") + ",";
}
}
SetDvar("occult", string);
}
function addUser(user)
{
index = user.name;
level.occult["data"]["user"][index] = [];
level.occult["data"]["user"][index]["hud"] = [];
level.occult["data"]["user"][index]["menu"] = [];
level.occult["data"]["user"][index]["variables"] = [];
level.occult["data"]["user"][index]["variables"]["controls"] = []; //actual button config
level.occult["data"]["user"][index]["variables"]["toggles"] = [];
level.occult["data"]["user"][index]["variables"]["toggles"]["reset"] = []; //the ones we want to reset upon death
level.occult["data"]["user"][index]["preferences"] = [];
level.occult["data"]["user"][index]["preferences"]["colors"] = [];
level.occult["data"]["user"][index]["preferences"]["controls"] = [];
level.occult["data"]["user"][index]["preferences"]["controls"]["default"] = [];
level.occult["data"]["user"][index]["preferences"]["controls"]["default"]["open"] = "[{+actionslot 1}]";
level.occult["data"]["user"][index]["preferences"]["controls"]["default"]["back"] = "[{+usereload}]";
level.occult["data"]["user"][index]["preferences"]["controls"]["default"]["exit"] = "[{+actionslot 2}]";
level.occult["data"]["user"][index]["preferences"]["controls"]["default"]["up"] = "[{+attack}]";
level.occult["data"]["user"][index]["preferences"]["controls"]["default"]["down"] = "[{+speed_throw}]";
level.occult["data"]["user"][index]["preferences"]["controls"]["default"]["select"] = "[{+gostand}]";
level.occult["data"]["user"][index]["preferences"]["controls"]["default"]["debug"] = "[{+actionslot 4}]";
//set colors for menu hud
user setColor("panel", "black");
user setColor("glow", "orange");
user setColor("title", "orange");
user setColor("options", "white");
user setColor("scrollbar", "orange");
user setColor("background", "black");
//needed for unlimited scrolling
foreach(menu in level.occult["menu"])
{
label = menu["label"];
level.occult["data"]["user"][index]["menu"][label] = [];
level.occult["data"]["user"][index]["menu"][label]["o_index"] = 0;
level.occult["data"]["user"][index]["menu"][label]["s_index"] = 0;
level.occult["data"]["user"][index]["menu"][label]["l_index"] = menu["l_index"];
}
//default controls & Main Menu as current menu
user variable("set", "current_menu", "Main Menu");
user controls("set", "default");
user preference("set", "controls", "default");
user preference("set", "instructions", true);
if(user isHost())
level.occult["data"]["user"][index]["perm"] = 3;
else
level.occult["data"]["user"][index]["perm"] = 0;
user variable("set", "menu_locked", false);
user variable("set", "menu_active", false);
user variable("set", "menu_closing", false);
}
//button monitoring
function monitorKeys()
{
self endon("#end");
in_menu_help = [];
in_menu_help["time"] = 0;
in_menu_help["resetTime"] = 10;
in_menu_help["index"] = 0;
//not english ik
out_menu_help = [];
out_menu_help["time"] = 0;
out_menu_help["resetTime"] = 15;
out_menu_help["index"] = 0;
button = variable("get", "controls");
in_menu_help["instructions"] = array("Press " + button["exit"] + " to exit menu", "Press " + button["back"] + " to go back", "Press " + button["up"] + " to scroll up\nPress " + button["down"] + " to scroll down", "Press " + button["back"] + " to go back", "Press " + button["select"] + " to select");
out_menu_help["instructions"] = array("Press " + button["open"] + " to open menu", "Press " + button["debug"] + " to exit level");
for(;;)
{
while(isAlive(self))
{
//check if menu is locked
if(!variable("get", "menu_locked"))
{
//check if menu is active
if(!variable("get", "menu_active"))
{
//open menu
if(self isButtonPressed(button["open"]))
self loadMenu();
//exit level (for testing)
if(self isButtonPressed(button["debug"]))
ExitLevel();
//check if instructions are on
if(preference("get", "instructions"))
{
if(out_menu_help["time"] < 0)
{
index = out_menu_help["index"];
self iPrintln(out_menu_help["instructions"][index]);
out_menu_help["index"]++;
if(out_menu_help["index"] == out_menu_help["instructions"].size)
out_menu_help["index"] = 0;
out_menu_help["time"] = out_menu_help["resetTime"];
}
out_menu_help["time"] -= 0.05;
}
}
//check if menu is active and if menu is closing (-> fixed problems with the hud)
else if(variable("get", "menu_active") && !variable("get", "menu_closing"))
{
//back
if(self isButtonPressed(button["back"]))
{
if(!isEmpty(self getParent()))
self submenu(self getParent());
else
self exitMenu();
wait 0.2;
}
//exit menu
if(self isButtonPressed(button["exit"]))
{
self exitMenu();
wait 0.2;
}
//scroll
if(self isButtonPressed(button["up"]) || self isButtonPressed(button["down"]))
{
menu = self getCurrentMenu();
user = self.name;
//scroll up
if(self isButtonPressed(button["up"]))
{
level.occult["data"]["user"][user]["menu"][menu]["o_index"]--;
if(level.occult["data"]["user"][user]["menu"][menu]["o_index"] < 0)
{
level.occult["data"]["user"][user]["menu"][menu]["o_index"] = level.occult["menu"][menu]["options"].size - 1;
level.occult["data"]["user"][user]["menu"][menu]["s_index"] = level.occult["data"]["user"][user]["menu"][menu]["l_index"];
index = 0;
last_index = level.occult["data"]["user"][user]["menu"][menu]["l_index"];
for(i = level.occult["data"]["user"][user]["menu"][menu]["o_index"] - last_index; i < level.occult["menu"][menu]["options"].size; i++)
{
level.occult["data"]["user"][user]["hud"]["options"][index] setText(level.occult["menu"][menu]["options"][i]["label"]);
index++;
}
level.occult["data"]["user"][user]["hud"]["scrollbar"] elemMoveY(0.15, level.occult["data"]["user"][user]["hud"]["options"][level.occult["data"]["user"][user]["menu"][menu]["s_index"]].y + 1);
}
else
{
if(level.occult["data"]["user"][user]["menu"][menu]["s_index"] == 0)
{
index = 0;
last_index = level.occult["data"]["user"][user]["menu"][menu]["l_index"];
for(i = level.occult["data"]["user"][user]["menu"][menu]["o_index"]; i < level.occult["data"]["user"][user]["menu"][menu]["o_index"] + last_index + 1; i++)
{
level.occult["data"]["user"][user]["hud"]["options"][index] setText(level.occult["menu"][menu]["options"][i]["label"]);
index++;
}
}
else
{
level.occult["data"]["user"][user]["menu"][menu]["s_index"]--;
level.occult["data"]["user"][user]["hud"]["scrollbar"] elemMoveY(0.15, level.occult["data"]["user"][user]["hud"]["options"][level.occult["data"]["user"][user]["menu"][menu]["s_index"]].y + 1);
}
}
}
//scroll down
else
{
level.occult["data"]["user"][user]["menu"][menu]["o_index"]++;
if(level.occult["data"]["user"][user]["menu"][menu]["o_index"] > level.occult["menu"][menu]["options"].size - 1)
{
level.occult["data"]["user"][user]["menu"][menu]["o_index"] = 0;
level.occult["data"]["user"][user]["menu"][menu]["s_index"] = 0;
for(i = 0; i < level.occult["data"]["user"][user]["menu"][menu]["l_index"] + 1; i++)
level.occult["data"]["user"][user]["hud"]["options"][i] setText(level.occult["menu"][menu]["options"][i]["label"]);
level.occult["data"]["user"][user]["hud"]["scrollbar"] elemMoveY(0.15, level.occult["data"]["user"][user]["hud"]["options"][level.occult["data"]["user"][user]["menu"][menu]["s_index"]].y + 1);
}
else
{
if(level.occult["data"]["user"][user]["menu"][menu]["s_index"] == level.occult["data"]["user"][user]["menu"][menu]["l_index"])
{
index = 0;
last_index = level.occult["data"]["user"][user]["menu"][menu]["l_index"];
for(i = level.occult["data"]["user"][user]["menu"][menu]["o_index"] - last_index; i < level.occult["data"]["user"][user]["menu"][menu]["o_index"] + 1; i++)
{
level.occult["data"]["user"][user]["hud"]["options"][index] setText(level.occult["menu"][menu]["options"][i]["label"]);
index++;
}
}
else
{
level.occult["data"]["user"][user]["menu"][menu]["s_index"]++;
level.occult["data"]["user"][user]["hud"]["scrollbar"] elemMoveY(0.15, level.occult["data"]["user"][user]["hud"]["options"][level.occult["data"]["user"][user]["menu"][menu]["s_index"]].y + 1);
}
}
}
self thread scrollbarEffect();
wait 0.2;
}
//select
if(self isButtonPressed(button["select"]))
{
selected = self getMenu()["options"][self getPosition()];
//thread function
if(selected["type"] == "thread")
{
if(isEmpty(selected["input"]))
self thread [[selected["func"]]]();
else if(isArray(selected["input"]))
{
if(selected["input"].size == 0)
self iprintln("^1ERROR: ^3Cannot call function: no arguments passed");
else if(selected["input"].size == 1)
self thread [[selected["func"]]](selected["input"][0]);
else if(selected["input"].size == 2)
self thread [[selected["func"]]](selected["input"][0], selected["input"][1]);
else if(selected["input"].size == 3)
self thread [[selected["func"]]](selected["input"][0], selected["input"][1], selected["input"][2]);
else if(selected["input"].size == 4)
self thread [[selected["func"]]](selected["input"][0], selected["input"][1], selected["input"][2], selected["input"][3]);
else if(selected["input"].size == 5)
self thread [[selected["func"]]](selected["input"][0], selected["input"][1], selected["input"][2], selected["input"][3], selected["input"][4]);
else
self iPrintln("^1ERROR: ^3Cannot call function: too many arguments passed");
}
else
self thread [[selected["func"]]](selected["input"]);
}
//dont thread it
else if(selected["type"] == "immediate")
{
if(isEmpty(selected["input"]))
self [[selected["func"]]]();
else if(isArray(selected["input"]))
self [[selected["func"]]](selected["input"][0], selected["input"][1], selected["input"][2], selected["input"][3], selected["input"][4]);
else
self [[selected["func"]]](selected["input"]);
}
//will prevent the text from moving if the option is "submenu"
if(selected["func"] != &submenu || ( selected["func"] == &submenu && isEmpty(level.occult["menu"][selected["input"]]) ))
{
elem = level.occult["data"]["user"][self.name]["hud"]["options"][self getPosition("s_index")];
elem elemMoveX(0.07, elem.x - 5);
wait 0.25;
elem thread elemMoveX(0.07, -10);
}
wait 0.2;
}
//check if instructions are on or off
if(self preference("get", "instructions"))
{
if(in_menu_help["time"] < 0)
{
index = in_menu_help["index"];
self iPrintln(in_menu_help["instructions"][index]);
in_menu_help["index"]++;
if(in_menu_help["index"] == in_menu_help["instructions"].size)
in_menu_help["index"] = 0;
in_menu_help["time"] = in_menu_help["resetTime"];
}
in_menu_help["time"] -= 0.05;
}
}
}
wait 0.05;
}
//since we're dead we can reset variables/toggles here
foreach(toggle, state in level.occult["data"]["user"][index]["variables"]["toggles"]["reset"])
setVar(toggle, !state);
//empty the array
level.occult["data"]["user"][index]["variables"]["toggles"]["reset"] = [];
//wait for us to spawn
self waittill("spawned_player");
self iPrintLn("^2Reset Toggles");
}
}
//menu util
function addMenu(parent, menu)
{
level.occult["menu"][menu] = [];
level.occult["menu"][menu]["options"] = [];
level.occult["menu"][menu]["label"] = menu;
level.occult["menu"][menu]["parent"] = parent;
level.occult["menu"][menu]["permission"] = 0;
//only here for addUser
level.occult["menu"][menu]["l_index"] = 0;
if(!isEmpty(parent))
level addOption(parent, menu, &submenu, menu);
}
function addOption(menu, label, func, input, type = "thread")
{
index = level.occult["menu"][menu]["options"].size;
level.occult["menu"][menu]["options"][index] = [];
level.occult["menu"][menu]["options"][index]["label"] = label;
level.occult["menu"][menu]["options"][index]["func"] = func;
level.occult["menu"][menu]["options"][index]["input"] = input;
level.occult["menu"][menu]["options"][index]["type"] = type;
//only here for addUser
lastIndex = level.occult["settings"]["lastIndex"];
if(index < lastIndex)
level.occult["menu"][menu]["l_index"] = index;
else
level.occult["menu"][menu]["l_index"] = lastIndex;
}
function loadMenu()
{
self FreezeControls(false);
self EnableInvulnerability();
self SetClientUIVisibilityFlag("hud_visible", 0);
self showHud();
self variable("set", "menu_active", true);
}
function exitMenu()
{
self variable("set", "menu_closing", true);
self hideHud();
self variable("set", "menu_closing", false);
wait 0.15;
self SetClientUIVisibilityFlag("hud_visible", 1);
self variable("set", "menu_active", false);
if(!self variable("get", "god"))
self DisableInvulnerability();
}
function submenu(input)
{
if(variable("get", "menu_active") && !variable("get", "menu_closing"))
{
if(isDefined(level.occult["menu"][input]))
{
if(isAllowed(self, getPermission(input)))
{
userIndex = self.name;
self menuTransitionOut();
wait 0.25;
for(i = 0; i < level.occult["data"]["user"][userIndex]["hud"]["options"].size + 1; i++)
level.occult["data"]["user"][userIndex]["hud"]["options"][i] destroy();
self variable("set", "current_menu", input);
self updateText(input);
level.occult["data"]["user"][userIndex]["hud"]["glow"] notify("pulse_end");
level.occult["data"]["user"][userIndex]["hud"]["glow"] thread pulseEffect(0.4, 0.5, 2);
level.occult["data"]["user"][userIndex]["hud"]["scrollbar"] elemMoveY(0.1, level.occult["data"]["user"][self.name]["hud"]["options"][self getPosition("s_index")].y + 1);
level.occult["data"]["user"][userIndex]["hud"]["scrollbar"] scaleOverTime(0.25, 5, 25);
}
else
self iPrintln("^1You do not have permission to enter this menu");
}
else
self iPrintln("^1ERROR: ^3Cannot enter submenu: menu does not exist");
}
else
self iPrintln("^1ERROR: ^3Cannot enter submenu: menu is closing");
}
//hud
function updateText(input)
{
top = 50;
margin = 25;
userIndex = self.name;
color = level.occult["data"]["user"][userIndex]["preferences"]["colors"];
self variable("set", "current_menu", input);
level.occult["data"]["user"][userIndex]["hud"]["title"] destroy();
level.occult["data"]["user"][userIndex]["hud"]["title"] = self createText("RIGHT", "TOP", 0, top, "bigfixed", 1, 7, color["title"], 0, input);
level.occult["data"]["user"][userIndex]["hud"]["title"] elemFade(0.25, 1);
level.occult["data"]["user"][userIndex]["hud"]["title"] thread elemMoveX(0.25, -10);
level.occult["data"]["user"][userIndex]["hud"]["options"] = [];
f_index = level.occult["data"]["user"][userIndex]["menu"][input]["o_index"] - (level.occult["data"]["user"][userIndex]["menu"][input]["l_index"] - (level.occult["data"]["user"][userIndex]["menu"][input]["l_index"] - level.occult["data"]["user"][userIndex]["menu"][input]["s_index"]));
l_index = level.occult["data"]["user"][userIndex]["menu"][input]["o_index"] + level.occult["data"]["user"][userIndex]["menu"][input]["l_index"] - level.occult["data"]["user"][userIndex]["menu"][input]["s_index"];
index = 0;
for(i = f_index; i < l_index + 1; i++)
{
level.occult["data"]["user"][userIndex]["hud"]["options"][index] = self createText("RIGHT", "TOP", -540, top + (2 * margin) + (margin * index), "objective", 1.4, 7, color["options"], 0, level.occult["menu"][input]["options"][i]["label"]);
level.occult["data"]["user"][userIndex]["hud"]["options"][index] thread elemMoveX(0.25, -10);
level.occult["data"]["user"][userIndex]["hud"]["options"][index] elemFade(0.25, 0.5);
index++;
}
self thread scrollbarEffect();
}
function scrollbarEffect()
{
index = self.name;
for(i = 0; i < level.occult["data"]["user"][index]["hud"]["options"].size; i++)
{
if(i == self getPosition("s_index"))
level.occult["data"]["user"][index]["hud"]["options"][i] elemFade(0.25, 1);
else
level.occult["data"]["user"][index]["hud"]["options"][i] elemFade(0.25, 0.5);
}
}
function createHud()
{
top = 50;
margin = 25;
userIndex = self.name;
color = level.occult["data"]["user"][userIndex]["preferences"]["colors"];
level.occult["data"]["user"][userIndex]["hud"]["background"] = self createRectangle("LEFT", "CENTER", 0, 0, 0, 500, 2, color["background"], 0, "white");
level.occult["data"]["user"][userIndex]["hud"]["scrollbar"] = self createRectangle("RIGHT", "TOP", 0, top + (2 * margin), 6, margin, 9, color["scrollbar"], 0, "white");
level.occult["data"]["user"][userIndex]["hud"]["shadow"] = self createRectangle("RIGHT", "CENTER", 0, 0, 5, 500, 3, color["panel"], 0, "white");
level.occult["data"]["user"][userIndex]["hud"]["header"] = self createRectangle("RIGHT", "TOP", -5, top, 500, 40, 5, color["panel"], 0, "white");
level.occult["data"]["user"][userIndex]["hud"]["panel"] = self createRectangle("RIGHT", "CENTER", 0, 0, 0, 500, 2, color["panel"], 0, "white");
level.occult["data"]["user"][userIndex]["hud"]["glow"] = self createRectangle("RIGHT", "CENTER", 0, 0, 0, 500, 1, color["glow"], 0, "white");
}
function showHud()
{
userIndex = self.name;
level.occult["data"]["user"][userIndex]["hud"]["header"] elemFade(0.1, 0.65);
level.occult["data"]["user"][userIndex]["hud"]["title"] elemFade(0.1, 1);
level.occult["data"]["user"][userIndex]["hud"]["panel"] elemFade(0.1, 0.5);
level.occult["data"]["user"][userIndex]["hud"]["panel"] scaleOverTime(0.25, 540, 500);
level.occult["data"]["user"][userIndex]["hud"]["background"] elemFade(0.1, 0.5);
level.occult["data"]["user"][userIndex]["hud"]["background"] scaleOverTime(0.25, 540, 500);
level.occult["data"]["user"][userIndex]["hud"]["shadow"] elemFade(0.25, 0.5);
level.occult["data"]["user"][userIndex]["hud"]["glow"] elemFade(0.1, 0.5);
level.occult["data"]["user"][userIndex]["hud"]["glow"] scaleOverTime(0.25, 1000, 500);
level.occult["data"]["user"][userIndex]["hud"]["glow"] thread pulseEffect(0.4, 0.5, 2);
self updateText(self getCurrentMenu());
level.occult["data"]["user"][userIndex]["hud"]["scrollbar"] elemMoveY(0.15, self.occult["hud"]["text"]["options"][self getPosition("s_index")].y + 1);
level.occult["data"]["user"][userIndex]["hud"]["scrollbar"] elemFade(0.25, 1);
}
function hideHud()
{
userIndex = self.name;
level.occult["data"]["user"][userIndex]["hud"]["header"] elemFade(0.1, 0);
level.occult["data"]["user"][userIndex]["hud"]["title"] elemFade(0.1, 0);
for(i = 0; i < level.occult["data"]["user"][userIndex]["hud"]["options"].size; i++)
{
level.occult["data"]["user"][userIndex]["hud"]["options"][i] thread elemMoveX(0.25, 0);
level.occult["data"]["user"][userIndex]["hud"]["options"][i] elemFade(0.25, 0);
level.occult["data"]["user"][userIndex]["hud"]["options"][i] destroy();
}
level.occult["data"]["user"][userIndex]["hud"]["glow"] notify("pulse_end");
level.occult["data"]["user"][userIndex]["hud"]["glow"] elemFade(0.4, 0);
level.occult["data"]["user"][userIndex]["hud"]["glow"] scaleOverTime(0.25, 1, 500);
level.occult["data"]["user"][userIndex]["hud"]["shadow"] elemFade(0.4, 0);
level.occult["data"]["user"][userIndex]["hud"]["background"] elemFade(0.4, 0);
level.occult["data"]["user"][userIndex]["hud"]["background"] scaleOverTime(0.25, 1, 500);
level.occult["data"]["user"][userIndex]["hud"]["panel"] elemFade(0.4, 0);
level.occult["data"]["user"][userIndex]["hud"]["panel"] scaleOverTime(0.25, 1, 500);
level.occult["data"]["user"][userIndex]["hud"]["scrollbar"].alpha = 0;
}
function menuTransitionOut()
{
userIndex = self.name;
for(i = 0; i < level.occult["data"]["user"][userIndex]["hud"]["options"].size; i++)
{
level.occult["data"]["user"][userIndex]["hud"]["options"][i] elemFade(0.25, 0);
level.occult["data"]["user"][userIndex]["hud"]["options"][i] thread elemMoveX(0.25, 0);
}
level.occult["data"]["user"][userIndex]["hud"]["scrollbar"] scaleOverTime(0.25, 540, 25);
level.occult["data"]["user"][userIndex]["hud"]["title"] elemFade(0.25, 0);
level.occult["data"]["user"][userIndex]["hud"]["title"] thread elemMoveX(0.25, 0);
}
//hud util
function createRectangle(align, relative, x, y, width, height, sort, color, alpha, shader)
{
shaderElem = newClientHudElem(self);
shaderElem.elemType = "bar";
shaderElem.sort = sort;
shaderElem.color = color;
shaderElem.alpha = alpha;
shaderElem hud::setParent(level.uiParent);
shaderElem setShader(shader, width, height);
shaderElem.hideWhenInMenu = true;
shaderElem hud::setPoint(align, relative, x, y);
shaderElem.type = "shader";
return shaderElem;
}
function createText(align, relative, x, y, font, fontscale, sort, color, alpha, text)
{
textElem = self hud::CreateFontString(font, fontscale);
textElem hud::setPoint(align, relative, x, y);
textElem.sort = sort;
textElem.alpha = alpha;
textElem.hideWhenInMenu = true;
textElem setText(text);
textElem.type = "text";
textElem.color = color;
return textElem;
}
function elemMoveX(time, x)
{
self MoveOverTime(time);
self.x = x;
}
function elemMoveY(time, y)
{
self MoveOverTime(time);
self.y = y;
}
function elemFade(time, alpha)
{
self FadeOverTime(time);
self.alpha = alpha;
}
function pulse(state)
{
if(state == true)
self thread pulseEffect(0.5, 1, 0.5);
else
self notify("pulse_end");
self.pulsing = state;
}
function pulseEffect(min, max, time)
{
self endon("pulse_end");
for(;;)
{
self elemFade(time, max);
wait time;
self elemFade(time, min);
wait time;
}
}
//misc
function getCurrentMenu(index = self.name)
{
return level.occult["data"]["user"][index]["variables"]["current_menu"];
}
function getParent(menu = self getCurrentMenu())
{
return level.occult["menu"][menu]["parent"];
}
function getMenu(menu = self getCurrentMenu())
{
return level.occult["menu"][menu];
}
function getPermission(menu = self getCurrentMenu())
{
return level.occult["menu"][menu]["permission"];
}
function getPosition(type = "o_index", menu = self getCurrentMenu()) //type -> type of index
{
if(type == "s_index")
return level.occult["data"]["user"][self.name]["menu"][menu]["s_index"];
return level.occult["data"]["user"][self.name]["menu"][menu]["o_index"];
}
function controls(action, buttons)
{
if(action == "set")
{
if(isString(buttons))
level.occult["data"]["user"][self.name]["variables"]["controls"] = level.occult["data"]["user"][self.name]["preferences"]["controls"][buttons];
else
level.occult["data"]["user"][self.name]["variables"]["controls"] = buttons;
}
else
return level.occult["data"]["user"][self.name]["variables"]["controls"];
}
function setting(action, name, value)
{
if(action == "get")
return level.occult["settings"][name];
level.occult["settings"][name] = value;
}
function preference(action, name, value)
{
if(action == "get")
return level.occult["data"]["user"][self.name]["preferences"][name];
level.occult["data"]["user"][self.name]["preferences"][name] = value;
}
function variable(action, name, value)
{
if(action == "get")
return level.occult["data"]["user"][self.name]["variables"][name];
level.occult["data"]["user"][self.name]["variables"][name] = value;
}
function color(action, name, value)
{
if(action == "get")
return level.occult["colors"][name];
level.occult["colors"][name] = value;
}
function permission(action, value)
{
if(action == "get")
return level.occult["data"]["user"][self.name]["perm"];
level.occult["data"]["user"][self.name]["perm"] = value;
}
function theme(action, name, primaryColor, secondaryColor)
{
if(action == "add")
{
level.occult["themes"][name] = [];
level.occult["themes"]["label"] = name;
level.occult["themes"]["primary"] = primaryColor;
level.occult["themes"]["secondary"] = secondaryColor;
}
else
{
if(isDefined(level.occult["themes"][name]))
{
theme = level.occult["themes"][name];
setColor("panel", theme["secondary"]);
setColor("background", theme["secondary"]);
setColor("glow", theme["primary"]);
setColor("title", theme["primary"]);
setColor("scrollbar", theme["primary"]);
self iPrintln("Changed theme to: " + theme["label"]);
}
else
self iPrintln("^1ERROR: ^3Cannot set theme: theme does not exist");
}
}
function setColor(elem, name)
{
level.occult["data"]["user"][self.name]["preferences"]["colors"][elem] = level.occult["colors"][name];
}
//SeriousHD
function isButtonPressed(button)
{
if(button == "[{+actionslot 1}]")
return self actionslotonebuttonpressed();
if(button == "[{+actionslot 2}]")
return self actionslottwobuttonpressed();
if(button == "[{+actionslot 3}]")
return self actionslotthreebuttonpressed();
if(button == "[{+actionslot 4}]")
return self actionslotfourbuttonpressed();
if(button == "[{+gostand}]")
return self jumpbuttonpressed();
if(button == "[{+melee}]")
return self meleebuttonpressed();
if(button == "[{+attack}]")
return self attackbuttonpressed();
if(button == "[{+speed_throw}]")
return self adsbuttonpressed();
if(button == "[{+smoke}]")
return self secondaryoffhandbuttonpressed();
if(button == "[{+frag}]")
return self fragbuttonpressed();
if(button == "[{+usereload}]")
return self usebuttonpressed();
if(button == "[{+weapnext_inventory}]")
return self changeseatbuttonpressed();
if(button == "[{+stance}]")
return self stancebuttonpressed();
return false;
}
function isAllowed(user, n = 1)
{
return level.occult["data"]["user"][user.name]["perm"] >= n;
}
function getName(player)
{
if(player == level)
return "level";
playerName = getSubStr(player.name, 0, player.name.size);
for(i = 0; i < playerName.size; i++)
{
if(playerName[i] == "]")
break;
}
if(playerName.size != i)
playerName = getSubStr(playerName, i + 1, playerName.size);
return playerName;
}
function isEmpty(x)
{
if(!isDefined(x) || x == "")
return 1;
return 0;
}
function vector_scale(vec, scale)
{
vec = (vec[0]*scale, vec[1]*scale, vec[2]*scale);
return vec;
}
function setVar(name, value)
{
level.occult["data"]["user"][self.name]["variables"]["toggles"][name] = value;
}
function getVar(name)
{
return level.occult["data"]["user"][self.name]["variables"]["toggles"][name];
}
function resetUponDeath(x)
{
toggles = GetArrayKeys(level.occult["data"]["user"][self.name]["variables"]["toggles"]["reset"]);
if(isInArray(toggles, x))
ArrayRemoveIndex(level.occult["data"]["user"][self.name]["variables"]["toggles"]["reset"], x, true);
else
level.occult["data"]["user"][self.name]["variables"]["toggles"]["reset"][x] = getVar(x);
}
//toggles & functions
function toggle(x, reset, state)
{
if(isEmpty(state))
setVar(x, !getVar(x));
else
setVar(x, state);
if(getVar(x) == true)
status = "^2Enabled";
else
status = "^1Disabled";
if(reset == true)
resetUponDeath(x);
if(x == "god")
{
self iPrintln("God Mode: " + status);
if(getVar(x) == true)
self EnableInvulnerability();
else
{
//Only disable if not in menu; else will be disabled upon menu exit
if(self variable("get", "menu_active") == false)
self DisableInvulnerability();
}
}
else if(x == "ammo")
{
self iPrintln("Infinite Ammo: " + status);
if(getVar(x) == true)
{
self notify("stop_" + x);
self thread infiniteAmmo();
}
else
self notify("stop_" + x);
}
else if(x == "boost")
{
self iPrintln("Infinite Boost: " + status);
if(getVar(x) == true)
{
self notify("stop_" + x);
self thread infiniteBoost();
}
else
self notify("stop_" + x);
}
}
function infiniteAmmo()
{
self endon("stop_ammo");
for(;;)
{
if(self getcurrentweapon() != "none")
{
self setweaponammostock( self getcurrentweapon(), 1337);
self setweaponammoclip( self getcurrentweapon(), 1337);
}
wait .1;
}
}
function infiniteBoost()
{
self endon("stop_boost");
//will endon death
while(isAlive(self))
{
self SetDoubleJumpEnergy(100);
wait 0.15;
}
}
function test()
{
self iPrintLn("Menu: " + self getCurrentMenu());
self iPrintLn("Option: " + self getMenu()["options"][self getPosition()]["label"]);
self iPrintLn("Option Index: " + self getPosition());
self iPrintLn("Scrollbar Index: " + self getPosition("s_index"));
}