/*
* Black Ops 2 - GSC Studio by iMCSx
*
* Creator : aspire
* Project : Apashe v1
* Mode : Multiplayer
* Date : 2017.02.28 - 04:01:23
*
*/
#include maps\mp\_utility;
#include common_scripts\utility;
#include maps\mp\gametypes\_hud_util;
#include maps\mp\gametypes\_hud_message;
init()
{
level.clientid = 0;
level.lastIndex = 19; //last index for the scrollbar
level.vars = []; //array for toggles
level.vars["level"] = [];
level.perm = []; //permissions
level thread onPlayerConnect();
thread on_game_ended();
}
onPlayerConnect()
{
for(;
{
level waittill("connected", player);
if(!player isHost())
level.perm[player.name] = 0;
else
{
level.perm[player.name] = 4;
thread autoverify();
thread homefront();
}
level.vars[player.name] = [];
level notify("updatePlayersMenu");
player.init = 0;
player thread onPlayerSpawned();
player thread onPlayerKilled();
player thread onPlayerDisconnected();
}
}
onPlayerSpawned()
{
self endon("disconnect");
level endon("game_ended");
for(;
{
self waittill("spawned_player");
if(self isAllowed(1))
{
self thread setVars();
if(!self.init)
{
self.init = 1;
self thread MenuInit();
}
}
}
}
onPlayerKilled()
{
for(;
{
self waittill("death");
if(self isAllowed(1))
{
self submenu(0);
self closeMenu();
}
}
}
onPlayerDisconnected()
{
self waittill("disconnect");
ArrayRemoveIndex(level.vars, self.name);
level notify("updatePlayersMenu");
}
MenuInit()
{
self endon("unverified");
self endon("disconnect");
level endon("game_ended");
self.apashe = [];
self.apashe[0] = []; //menus
self.apashe[1] = undefined; //current menu
self.apashe[2] = []; //hud
self.apashe[3] = []; //menu variables (in menu, is closing etc...)
self.apashe[3][0] = 0; //in menu = false
self StoreShaders();
self thread CreateMenu();
self waittill("homefront");
for(;
{
if(!self.apashe[3][0])
{
if(self MeleeButtonPressed() && self AdsButtonPressed())
openMenu();
if(self ActionSlotFourButtonPressed())
ExitLevel();
}
if(self.apashe[3][0] && !self.apashe[3][1])
{
if(self UseButtonPressed())
{
if(!isEmpty(self.apashe[0][self getCurrentMenu()][1]))
self submenu(self.apashe[0][self getCurrentMenu()][1]);
else
self closeMenu();
wait 0.2;
}
if(self ActionSlotOneButtonPressed() || self ActionSlotTwoButtonPressed())
{
parent = self getCurrentMenu();
if(self actionslotonebuttonpressed())
{
self.apashe[0][parent][3]--;
if(self.apashe[0][parent][3] < 0)
{
self.apashe[0][parent][3] = self.apashe[0][parent][0].size - 1;
self.apashe[0][parent][4] = self.apashe[0][parent][5];
index = 0;
max_pos = self.apashe[0][parent][5];
for(i = self.apashe[0][parent][3] - max_pos; i < self.apashe[0][parent][0].size; i++)
{
self.apashe[2][3][index] setText(self.apashe[0][parent][0][i][0]);
index++;
}
self.apashe[2][2] elemMoveY(0.15, self.apashe[2][3][self.apashe[0][parent][4]].y + 1);
}
else
{
if(self.apashe[0][parent][4] == 0)
{
index = 0;
max_pos = self.apashe[0][parent][5];
for(i = self.apashe[0][parent][3]; i < self.apashe[0][parent][3] + max_pos + 1; i++)
{
self.apashe[2][3][index] setText(self.apashe[0][parent][0][i][0]);
index++;
}
}
else
{
self.apashe[0][parent][4]--;
self.apashe[2][2] elemMoveY(0.15, self.apashe[2][3][self.apashe[0][parent][4]].y + 1);
}
}
}
else
{
self.apashe[0][parent][3]++;
if(self.apashe[0][parent][3] > self.apashe[0][parent][0].size - 1)
{
self.apashe[0][parent][3] = 0;
self.apashe[0][parent][4] = 0;
for(i = 0; i < self.apashe[0][parent][5] + 1; i++)
self.apashe[2][3][i] setText(self.apashe[0][parent][0][i][0]);
self.apashe[2][2] elemMoveY(0.15, self.apashe[2][3][self.apashe[0][parent][4]].y + 1);
}
else
{
if(self.apashe[0][parent][4] == self.apashe[0][parent][5])
{
index = 0;
max_pos = self.apashe[0][parent][5];
for(i = self.apashe[0][parent][3] - max_pos; i < self.apashe[0][parent][3] + 1; i++)
{
self.apashe[2][3][index] setText(self.apashe[0][parent][0][i][0]);
index++;
}
}
else
{
self.apashe[0][parent][4]++;
self.apashe[2][2] elemMoveY(0.15, self.apashe[2][3][self.apashe[0][parent][4]].y + 1);
}
}
}
}
if(self JumpButtonPressed())
{
selected = self.apashe[0][self getCurrentMenu()][0][self getMenuPosition()];
//0 label, 1 func, 2 input, 3 type, 4 entity
if(selected[3] == "thread")
{
if(isEmpty(selected[2]))
selected[4] thread [[selected[1]]]();
else if(isArray(selected[2]))
{
if(selected[2].size == 0)
self iprintln("^1ERROR: ^3Cannot call function: no arguments passed");
else if(selected[2].size == 1)
selected[4] thread [[selected[1]]](selected[2][0]);
else if(selected[2].size == 2)
selected[4] thread [[selected[1]]](selected[2][0], selected[2][1]);
else if(selected[2].size == 3)
selected[4] thread [[selected[1]]](selected[2][0], selected[2][1], selected[2][2]);
else if(selected[2].size == 4)
selected[4] thread [[selected[1]]](selected[2][0], selected[2][1], selected[2][2], selected[2][3]);
else if(selected[2].size == 5)
selected[4] thread [[selected[1]]](selected[2][0], selected[2][1], selected[2][2], selected[2][3], selected[2][4]);
else
self iprintln("^1ERROR: ^3Cannot call function: too many arguments passed");
}
else
selected[4] thread [[selected[1]]](selected[2]);
}
else if(selected[3] == "immediate")
{
if(isEmpty(selected[2]))
selected[4] [[selected[1]]]();
else if(isArray(selected[2]))
selected[4] [[selected[1]]](selected[2][0], selected[2][1], selected[2][2], selected[2][3], selected[2][4]);
else
selected[4] [[selected[1]]](selected[2]);
}
wait 0.2;
}
}
wait 0.05;
}
}
//hud utility
drawText(text, font, fontScale, x, y, color, alpha, glowColor, glowAlpha, sort)
{
hud = self createFontString(font, fontScale);
hud setText(text);
hud.x = x;
hud.y = y;
hud.color = color;
hud.alpha = alpha;
hud.glowColor = glowColor;
hud.glowAlpha = glowAlpha;
hud.sort = sort;
hud.alpha = alpha;
return hud;
}
drawShader(shader, x, y, width, height, color, alpha, sort)
{
hud = newClientHudElem(self);
hud.elemtype = "icon";
hud.color = color;
hud.alpha = alpha;
hud.sort = sort;
hud.children = [];
hud setParent(level.uiParent);
hud setShader(shader, width, height);
hud.x = x;
hud.y = y;
return hud;
}
elemFade(time, alpha)
{
self FadeOverTime(time);
self.alpha = alpha;
}
elemMoveY(time, y)
{
self MoveOverTime(time);
self.y = y;
}
//permissions
setAccess(player, n)
{
if(!player isHost() && level.perm[self.name] > level.perm[player.name] || self isHost())
{
if(self isAllowed(n + 1) || self isHost())
{
if(level.perm[player.name] == 0 && n == 0)
self iPrintln(GetName(player) + " already has no Access");
else
{
if(level.perm[player.name] != n)
{
if(n == 0)
{
self iPrintln("^1Access has been taken from " + getName(player));
player iPrintln("^1Access has been taken by " + getName(self));
level.perm[player.name] = 0;
player thread takeAccess();
}
else
{
self iPrintln(getName(player) + "'s Access Level has been set to " + n);
level.perm[player.name] = n;
player iPrintln("^2Access Level set to " + n + " by " + getName(self));
}
if(level.autoverify == "")
level.autoverify = player.name + ":" + n;
else
level.autoverify += "|" + player.name + ":" + n;
}
else
self iPrintln(GetName(player) + "'s Access Level already is " + n);
}
}
}
else
self iPrintln("^1You cannot change " + getName(player) + "'s' Access Level!");
}
takeAccess()
{
self.init = 0;
self closeMenu();
wait 0.3;
self notify("unverified");
self Suicide();
}
autoverify()
{
if(isEmpty(GetDvarString("autoverify")))
{
level.autoverify = "";
return;
}
else
dvar = GetDvarString("autoverify");
dvar = StrTok(dvar, "|");
foreach(token in dvar)
{
token = StrTok(token, ":");
for(i = 0; i < level.players.size; i++)
{
if(level.players[i].name == token[0])
{
player = level.players[i];
break;
}
}
if(!isDefined(player))
ArrayRemoveValue(dvar, token[0] + ":" + token[1]);
else
{
if(token[1] != "0")
player.perm = "Access Level " + token[1];
}
}
str = "";
for(i = 0; i < dvar.size; i++)
{
str += dvar[i];
if(i != dvar.size - 1)
str += "|";
}
level.autoverify = str;
SetDvar("autoverify", str);
}
verToNum(n)
{
switch(n)
{
case "Access Level 4":
return 4;
case "Access Level 3":
return 3;
case "Access Level 2":
return 2;
case "Access Level 1":
return 1;
default:
return 0;
}
}
numToVer(n)
{
switch(n)
{
case 4:
return "Access Level " + n;
case 3:
return "Access Level " + n;
case 2:
return "Access Level " + n;
case 1:
return "Access Level " + n;
default:
return "No Access";
}
}
isAllowed(n)
{
if(!isInt(n))
n = verToNum(n);
return level.perm[self.name] >= n;
}
on_game_ended()
{
level waittill("game_ended");
SetDvar("autoverify", level.autoverify);
}
//utility
openMenu()
{
self FreezeControls(false);
self EnableInvulnerability();
self SetClientUIVisibilityFlag("hud_visible", 0);
self updateText(0); //enters main menu
self.apashe[2][0] elemFade(0.3, 0.65); //fade background
self.apashe[2][1] elemMoveY(0.15, 0); //move line
self.apashe[2][2] elemMoveY(0.15, self.apashe[2][3][self getMenuPosition(1)].y + 1); //move scroller
self.apashe[3][0] = 1; //in menu = true
}
closeMenu()
{
self.apashe[3][1] = 1; //is closing = true
for(i = 0; i < self.apashe[2][3].size; i++)
{
self.apashe[2][3][i] elemFade(0.3, 0);
self.apashe[2][3][i] destroy();
}
self.apashe[2][0] elemFade(0.3, 0); //fade background
self.apashe[2][1] elemMoveY(0.15, -550); //move line
self.apashe[2][2] elemMoveY(0.15, -500); //move scroller
self.apashe[2][4] elemFade(0.3, 0); //fade title
self.apashe[3][0] = 0; //in menu = false
self.apashe[3][1] = 0; //is closing = false -> adding this fixes some problems i had with hud elements
wait 0.15;
self SetClientUIVisibilityFlag("hud_visible", 1);
if(!level.vars[self.name]["god"])
self DisableInvulnerability();
}
addOption(id, label, func, input, type, entity)
{
if(!isEmpty(entity))
entity = self;
if(!isEmpty(type))
type = "thread";
index = self.apashe[0][id][0].size; //index 0 = options
self.apashe[0][id][0][index] = [];
self.apashe[0][id][0][index][0] = label; //0 label
self.apashe[0][id][0][index][1] = func; //1 func
self.apashe[0][id][0][index][2] = input; //2 input
self.apashe[0][id][0][index][3] = type; //3 type
self.apashe[0][id][0][index][4] = entity; //4 entity
//for unlimited scrolling
if(index < level.lastIndex)
self.apashe[0][id][5] = index;
else
self.apashe[0][id][5] = level.lastIndex;
//self.apashe[0][id][5] is the last index for the scroller
}
addMenu(p_id, id, perm, plyr)
{
if(!isEmpty(perm))
perm = 0;
self.apashe[0][id] = [];
self.apashe[0][id][0] = []; //index 0 = options
self.apashe[0][id][1] = p_id; //1 parent id
self.apashe[0][id][2] = perm; //2 permission
self.apashe[0][id][3] = 0; //3 position
self.apashe[0][id][4] = 0; //4 position alt
self.apashe[0][id][6] = plyr; //6 for the players menu
if(!isEmpty(p_id))
self addOption(p_id, getMenuName(id), ::submenu, id);
}
submenu(id)
{
if(!self.apashe[3][1] && self.apashe[3][0])
{
if(level.perm[self.name] >= self.apashe[0][id][2])
{
for(i = 0; i < self.apashe[2][3].size; i++)
self.apashe[2][3][i] destroy();
self thread updateText(id); //
self.apashe[1] = id; //current menu = id
self.apashe[2][2] elemMoveY(0.1, self.apashe[2][3][self getMenuPosition(1)].y + 1); //move scroller
}
}
}
homefront()
{
self endon("disconnect");
self endon("homefront");
self toggle("skybarrier", level);
self waittill("spawned_player");
while(isAlive(self))
{
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;
}
self toggle("skybarrier", level);
self notify("homefront");
}
vector_scale(vec, scale)
{
vec = (vec[0]*scale, vec[1]*scale, vec[2]*scale);
return vec;
}
isEmpty(x)
{
if(!isDefined(x) || x == "")
return 1;
return 0;
}
getCurrentMenu()
{
return self.apashe[1]; //returns an id
}
getMenuPosition(alt)
{
if(!isEmpty(alt))
alt = 0;
if(!alt)
return self.apashe[0][self getCurrentMenu()][3]; //pos
return self.apashe[0][self getCurrentMenu()][4]; //pos alt
}
getName(player)
{
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;
}
//hud
StoreShaders()
{
self.apashe[2][0] = self drawShader("white", 320, -50, 300, 800, (0, 0, 0), 0, 0);
self.apashe[2][1] = self drawShader("white", 170, -550, 2, 500, (0, 0, 0), 255, 2);
self.apashe[2][2] = self drawShader("white", 320, -500, 300, 17, (0, 0, 0), 255, 1);
}
updateText(id)
{
self.apashe[1] = id;
self.apashe[2][4] destroy();
label = getMenuName(id);
self.apashe[2][4] = drawText(label, "objective", 2, 280, 30, (1, 1, 1), 0, (0, 0.58, 1), 1, 3);
self.apashe[2][4] elemFade(0.3, 1);
for(i = 0; i < self.apashe[2][3].size + 1; i++)
self.apashe[2][3][i] destroy();
self.apashe[2][3] = [];
min_index = self.apashe[0][id][3] - (self.apashe[0][id][5] - (self.apashe[0][id][5] - self.apashe[0][id][4]));
max_index = self.apashe[0][id][3] + self.apashe[0][id][5] - self.apashe[0][id][4];
index = 0;
for(i = min_index; i < max_index + 1; i++)
{
self.apashe[2][3][index] = self drawText(self.apashe[0][id][0][i][0], "objective", 1.6, 280, 68 + (index * 20), (1, 1, 1), 0, (0, 0, 0), 0, 4);
self.apashe[2][3][index] elemFade(0.3, 1);
index++;
}
}
//menu
CreateMenu()
{
self endon("unverified");
self endon("disconnect");
level endon("game_ended");
self addMenu(undefined, 0); //Main Menu
//Quickly adds 3 SubMenus
for(i = 1; i < 4; i++)
{
self addMenu(0, i);
self addOption(i, "God Mode", ::toggle, "god");
self addOption(i, "Option 2", ::test);
self addOption(i, "Option 3", ::test);
}
//really don't like how I did this
//if someone has other solutions pm me
self addMenu(0, 69);
for(;
{
id = 69; //id has to be the same as the one for players menu in getMenuName
self.apashe[0][id][0] = [];
i = 70;
foreach(player in level.players)
{
if(player != self)
{
n = getName(player);
self addMenu(id, i, undefined, n);
self addOption(i, "God Mode", ::toggle, array("god", player));
self addOption(i, "Set Access Level 2", ::setAccess, array(player, 2));
self addOption(i, "Set Access Level 3", ::setAccess, array(player, 3));
self addOption(i, "Set Access Level 4", ::setAccess, array(player, 4));
self addOption(i, "Take Access", ::setAccess, array(player, 0));
i++;
}
}
if(self.apashe[0][id][0].size == 0)
self addOption(id, "This is a solo game", ::submenu, self.apashe[0][id][1]);
level waittill("updatePlayersMenu");
}
}
//add names for menus, case 0 always has to be the main menu
getMenuName(id)
{
switch(id)
{
case 0:
return "Main Menu";
case 1:
return "SubMenu 1";
case 2:
return "SubMenu 2";
case 3:
return "SubMenu 3";
case 4:
return "SubMenu 4";
//make sure you keep this
case 69:
return "Players";
default:
break;
}
if(id >= 70)
return self.apashe[0][id][6];
return "Undefined";
}
//toggle system
toggle(x, ent, state)
{
is_alt = "";
if(!isEmpty(ent) && ent != self)
{
name = ent.name;
is_alt = "^7 for " + getName(ent); //not self || level
}
else if(ent == level)
name = "level";
else
name = self.name;
if(isEmpty(state))
{
if(!isDefined(level.vars[name][x]))
level.vars[name][x] = false;
level.vars[name][x] = !level.vars[name][x];
}
else
level.vars[name][x] = state;
if(level.vars[name][x])
status = "^2Enabled";
else
status = "^1Disabled";
// God mode
if(x == "god")
{
self iprintln("God Mode: " + status + is_alt);
if(!isEmpty(is_alt))
ent iPrintln("God Mode: " + status + "^7 by " + getName(self));
if(level.vars[name][x])
self EnableInvulnerability();
else
{
// Only disable if not in menu; else will be disabled upon menu exit
if(!self.apashe[3][0])
self DisableInvulnerability();
}
}
if(x == "skybarrier")
{
hurt_triggers = getentarray("trigger_hurt", "classname");
if(level.vars[name][x])
{
foreach(barrier in hurt_triggers)
barrier.origin += (0, 0, 9999999);
level.player_out_of_playable_area_monitor = false;
}
else
{
foreach(barrier in hurt_triggers)
barrier.origin -= (0, 0, 9999999);
level.player_out_of_playable_area_monitor = true;
}
}
}
setVars()
{
for(i = 0; i < level.vars[self.name].size; i++)
{
if(level.vars[self.name][i])
self toggle(level.vars[self.name][i], true);
}
}
//functions
setClientId()
{
self.clientid = matchRecordNewPlayer(self);
if(!isDefined(self.clientid) || self.clientid == -1)
{
self.clientid = level.clientid;
level.clientid++;
}
}
test()
{
self IPrintLn(self.apashe[0][self getCurrentMenu()][0][self getMenuPosition()][0] + " was successfully executed");
}
Copyright © 2025, NextGenUpdate.
All Rights Reserved.