468 lines
12 KiB
JavaScript
468 lines
12 KiB
JavaScript
// ===========================================================================
|
|
// Vortrex's Roleplay Resource
|
|
// https://github.com/VortrexFTW/gtac_roleplay
|
|
// ===========================================================================
|
|
// FILE: bitflags.js
|
|
// DESC: Provides bitwise operations, functions and usage
|
|
// TYPE: Server (JavaScript)
|
|
// ===========================================================================
|
|
|
|
// ===========================================================================
|
|
|
|
let serverBitFlags = {
|
|
staffFlags: {},
|
|
moderationFlags: {},
|
|
factionFlags: {},
|
|
clanFlags: {},
|
|
accountSettingsFlags: {},
|
|
subAccountSettingsFlags: {},
|
|
accountFlags: {},
|
|
seenHelpTipsFlags: {},
|
|
npcTriggerTypeKeys: {},
|
|
npcTriggerConditionTypeKeys: {},
|
|
npcTriggerResponseTypeKeys: {},
|
|
};
|
|
|
|
// ===========================================================================
|
|
|
|
let serverBitFlagKeys = {
|
|
staffFlagKeys: [
|
|
"None",
|
|
"BasicModeration",
|
|
"ManageHouses",
|
|
"ManageVehicles",
|
|
"ManageBusinesses",
|
|
"ManageClans",
|
|
"ManageServer",
|
|
"ManageAdmins",
|
|
"ManageJobs",
|
|
"ManageItems",
|
|
"ManageWorld",
|
|
"ManageAntiCheat",
|
|
"Developer",
|
|
],
|
|
moderationFlagKeys: [
|
|
"None",
|
|
"Muted",
|
|
"Frozen",
|
|
"HackerBox",
|
|
"WeaponBanned",
|
|
"JobBanned",
|
|
"AmmuBanned",
|
|
"NoSkinCustomization",
|
|
"DesyncWeapons",
|
|
"HackerWorld",
|
|
"AdminJailed",
|
|
"ExemptFromAntiCheat",
|
|
"ExemptFromBans",
|
|
"ForceTutorial",
|
|
"CharacterNameNeedsStaffApproval",
|
|
"EmailVerified",
|
|
"TwoFactorAuthVerified",
|
|
"NonRoleplayCharacterName",
|
|
],
|
|
factionFlagKeys: [
|
|
"None",
|
|
"police",
|
|
"medical",
|
|
"fire",
|
|
"government",
|
|
"generic",
|
|
],
|
|
clanTypeFlagKeys: [
|
|
"None",
|
|
"illegal",
|
|
"legal",
|
|
"mafia",
|
|
"streetGang",
|
|
"weapons",
|
|
"drugs",
|
|
"humanTrafficking",
|
|
"vigilante",
|
|
"hitContracts"
|
|
],
|
|
clanFlagKeys: [
|
|
"None",
|
|
"StartTurfWar",
|
|
"StartPointWar",
|
|
"InviteMember",
|
|
"SuspendMember",
|
|
"RemoveMember",
|
|
"MemberRank",
|
|
"ClanTag",
|
|
"ClanName",
|
|
"ManageVehicles",
|
|
"ManageHouses",
|
|
"ManageBusinesses",
|
|
"ManageNPCs",
|
|
"ManageRanks",
|
|
"Owner",
|
|
],
|
|
accountSettingsFlagKeys: [
|
|
"None",
|
|
"UseWhiteList",
|
|
"UseBlackList",
|
|
"TwoStepAuth",
|
|
"AuthAttemptAlert",
|
|
"NoGUI",
|
|
"AutoLoginIP",
|
|
"NoServerLogo",
|
|
"AutoSelectLastCharacter",
|
|
"ShowRealTimeClock",
|
|
"UseGUIForItems",
|
|
"UseRadialWheelItems", // If this is disabled, use MMORPG-style hotbar IF UseGUIForItems is enabled
|
|
"NoKeyBinds",
|
|
"NoRandomTips",
|
|
"NoActionTips",
|
|
],
|
|
npcTriggerTypeKeys: [
|
|
"None",
|
|
"farProximity", // Comes within a far distance of NPC
|
|
"mediumProximity", // Comes within a medium distance of NPC
|
|
"nearProximity", // Comes within a close distance of NPC
|
|
"enterLineOfSight", // Enters the NPC's line of sight
|
|
"exitLineOfSight", // Leaves the NPC's line of sight
|
|
"pedCollision", // Bumps into ped on foot
|
|
"vehicleCollision", // Bumps into ped with a vehicle
|
|
"shootGun", // Shoots a gun (target isn't a factor, it's just about only shooting a gun in general)
|
|
"swingMelee", // Swings a melee weapon (target doesnt matter, it's just about only swinging a melee weapon in general)
|
|
"hotwireVehicleStart", // Begin attempt to hotwire a vehicle
|
|
"hotwireVehicleFail", // Failed to hotwire a vehicle
|
|
"hotwireVehicleSucceed", // Succeeded at hotwiring a vehicle
|
|
"vehicleAlarmStart", // Vehicle alarm goes off
|
|
"vehicleAlarmStop", // Vehicle alarm shuts off (disabled, battery dead, damaged, or just turned off legitly)
|
|
"sirenStart", // Any vehicle with a siren that gets activated
|
|
"sirenStop", // Any vehicle with a siren that gets deactivated
|
|
"vehicleEnter", // Enters any vehicle
|
|
"vehicleExit", // Exits any vehicle
|
|
"propertyEnter", // Enters any interior
|
|
"propertyExit", // Exits any interior
|
|
"attackedByMelee", // Any element is attacked by melee weapon
|
|
"attackedByGun", // Any element is attacked by gun
|
|
"attackedByFist", // Any element is attacked by fist
|
|
],
|
|
npcTriggerConditionTypeKeys: [
|
|
"None",
|
|
"isInLineOfSight",
|
|
"isFarProximity",
|
|
"isMediumProximity",
|
|
"isNearProximity",
|
|
"isEnemyClan",
|
|
"isAllyClan",
|
|
"isSameClan",
|
|
"isNotInClan",
|
|
"isLawEnforcement",
|
|
"isFirefighter",
|
|
"isParamedic",
|
|
"isCriminal",
|
|
"hasWantedLevel",
|
|
"isSelfVehicle",
|
|
"isPlayerVehicle",
|
|
"isOtherVehicle",
|
|
"isClanVehicle",
|
|
"isEmergencyVehicle",
|
|
"isPoliceVehicle",
|
|
"isDriver",
|
|
"isInFrontSeat",
|
|
"isInSeatId",
|
|
"vehicleLocked",
|
|
"vehicleHotwired",
|
|
"isPistol",
|
|
"isShotgun",
|
|
"isAutomatic",
|
|
"isRifle",
|
|
"isAssaultRifle",
|
|
"isSniper",
|
|
"isRPG",
|
|
"isFlameThrower",
|
|
"isTalking",
|
|
"isShouting",
|
|
"isWhispering",
|
|
],
|
|
npcTriggerResponseTypeKeys: [
|
|
"None",
|
|
"shout",
|
|
"talk",
|
|
"whisper",
|
|
"switchWeapon",
|
|
"shootWeapon",
|
|
"aimWeapon",
|
|
"fleeSprint",
|
|
"fleeWalk",
|
|
"fleeRun",
|
|
"attackMelee",
|
|
"attackFist",
|
|
"walkToward",
|
|
"runToward",
|
|
"sprintToward",
|
|
"crouch",
|
|
"phoneCall",
|
|
"walkieTalkieMessage",
|
|
"switchRadioStation",
|
|
"toggleSiren",
|
|
"fleeTo",
|
|
"driveTo",
|
|
"enterVehicle",
|
|
"exitVehicle",
|
|
"pullOutOfVehicle",
|
|
"enterProperty",
|
|
"searchArea",
|
|
],
|
|
seenHelpTipsKeys: [
|
|
"None",
|
|
"vehicleEngineOffWhenEntering",
|
|
"vehicleLockedAfterEntryAttempt",
|
|
"showItemsAfterPurchase",
|
|
"buyCommandAfterEnterBusiness",
|
|
],
|
|
};
|
|
|
|
// ===========================================================================
|
|
|
|
function initBitFlagScript() {
|
|
logToConsole(LOG_INFO, "[VRR.BitFlag]: Initializing bit flag script ...");
|
|
serverBitFlags.staffFlags = createBitFlagTable(serverBitFlagKeys.staffFlagKeys);
|
|
serverBitFlags.moderationFlags = createBitFlagTable(serverBitFlagKeys.moderationFlagKeys);
|
|
serverBitFlags.accountSettingsFlags = createBitFlagTable(serverBitFlagKeys.accountSettingsFlagKeys);
|
|
//serverBitFlags.subAccountSettingsFlags = createBitFlagTable(getServerData().subAccountSettingsFlagKeys);
|
|
serverBitFlags.clanFlags = createBitFlagTable(serverBitFlagKeys.clanFlagKeys);
|
|
serverBitFlags.clanTypeFlagKeys = createBitFlagTable(serverBitFlagKeys.clanTypeFlagKeys);
|
|
serverBitFlags.factionFlags = createBitFlagTable(serverBitFlagKeys.factionFlagKeys);
|
|
serverBitFlags.npcTriggerTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerTypeKeys);
|
|
serverBitFlags.npcTriggerConditionTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerConditionTypeKeys);
|
|
serverBitFlags.npcTriggerResponseTypes = createBitFlagTable(serverBitFlagKeys.npcTriggerResponseTypeKeys);
|
|
logToConsole(LOG_INFO, "[VRR.BitFlag]: Bit flag script initialized successfully!");
|
|
return true;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function createBitFlagTable(keyNames) {
|
|
let bitVal = 0;
|
|
let bitTable = {};
|
|
let incVal = 1;
|
|
|
|
for(let i in keyNames) {
|
|
let key = keyNames[i];
|
|
bitTable[key] = bitVal;
|
|
bitVal = 1 << incVal;
|
|
incVal++;
|
|
}
|
|
return bitTable;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function hasBitFlag(allFlags, checkForFlag) {
|
|
if(allFlags == 0) {
|
|
return false;
|
|
}
|
|
|
|
if(allFlags == -1) {
|
|
return true;
|
|
}
|
|
|
|
if((allFlags & checkForFlag) == allFlags) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function doesPlayerHaveStaffPermission(client, requiredFlags) {
|
|
if(isConsole(client)) {
|
|
return true;
|
|
}
|
|
|
|
if(requiredFlags == getStaffFlagValue("None")) {
|
|
return true;
|
|
}
|
|
|
|
let staffFlags = 0;
|
|
if(getPlayerData(client)) {
|
|
staffFlags = getPlayerData(client).accountData.flags.admin;
|
|
}
|
|
|
|
// -1 is automatic override (having -1 for staff flags is basically god mode admin level)
|
|
if(staffFlags == getStaffFlagValue("All")) {
|
|
return true;
|
|
}
|
|
|
|
if(hasBitFlag(staffFlags, requiredFlags)) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function doesPlayerHaveClanPermission(client, requiredFlags) {
|
|
if(isConsole(client)) {
|
|
return true;
|
|
}
|
|
|
|
if(requiredFlags == getClanFlagValue("None")) {
|
|
return true;
|
|
}
|
|
|
|
if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageClans"))) {
|
|
return true;
|
|
}
|
|
|
|
let clanFlags = 0;
|
|
clanFlags = getPlayerCurrentSubAccount(client).clanFlags | getClanRankFlags(getPlayerCurrentSubAccount(client).clanRank);
|
|
|
|
// -1 is automatic override (having -1 for staff flags is basically god mode admin level)
|
|
if(clanFlags == getClanFlagValue("All")) {
|
|
return true;
|
|
}
|
|
|
|
if(hasBitFlag(clanFlags, requiredFlags)) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getStaffFlagValue(flagName) {
|
|
if(flagName == "All") {
|
|
return -1;
|
|
}
|
|
|
|
if(typeof serverBitFlags.staffFlags[flagName] == "undefined") {
|
|
return false;
|
|
}
|
|
|
|
return serverBitFlags.staffFlags[flagName];
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getClanFlagValue(flagName) {
|
|
if(flagName == "All") {
|
|
return -1;
|
|
}
|
|
|
|
if(typeof getServerBitFlags().clanFlags[flagName] == "undefined") {
|
|
return false;
|
|
}
|
|
|
|
return getServerBitFlags().clanFlags[flagName];
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getAccountSettingsFlagValue(flagName) {
|
|
if(flagName == "All") {
|
|
return -1;
|
|
}
|
|
|
|
if(typeof serverBitFlags.accountSettingsFlags[flagName] == "undefined") {
|
|
return false;
|
|
}
|
|
|
|
return serverBitFlags.accountSettingsFlags[flagName];
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getModerationFlagValue(flagName) {
|
|
if(flagName == "All") {
|
|
return -1;
|
|
}
|
|
|
|
if(typeof serverBitFlags.moderationFlags[flagName] == "undefined") {
|
|
return false;
|
|
}
|
|
|
|
return serverBitFlags.moderationFlags[flagName];
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function givePlayerStaffFlag(client, flagName) {
|
|
if(!getStaffFlagValue(flagName)) {
|
|
return false;
|
|
}
|
|
|
|
getPlayerData(client).accountData.flags.admin = getPlayerData(client).accountData.flags.admin | getStaffFlagValue(flagName);
|
|
return true;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function takePlayerStaffFlag(client, flagName) {
|
|
if(!getStaffFlagValue(flagName)) {
|
|
return false;
|
|
}
|
|
|
|
getPlayerData(client).accountData.flags.admin = getPlayerData(client).accountData.flags.admin & ~getStaffFlagValue(flagName);
|
|
return true;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function addBitFlag(allFlags, flagValue) {
|
|
allFlags |= flagValue;
|
|
return;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function removeBitFlag(allFlags, flagValue) {
|
|
allFlags ^= flagValue;
|
|
return;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function takePlayerStaffFlag(client, flagName) {
|
|
if(!getStaffFlagValue(flagName)) {
|
|
return false;
|
|
}
|
|
|
|
getPlayerData(client).accountData.flags.admin = getPlayerData(client).accountData.flags.admin & ~getStaffFlagValue(flagName);
|
|
return true;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function clearPlayerStaffFlags(client) {
|
|
getPlayerData(client).accountData.flags.admin = getStaffFlagValue("None");
|
|
return true;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getServerBitFlags() {
|
|
return serverBitFlags;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getServerBitFlagKeys() {
|
|
return serverBitFlagKeys;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function createBitwiseTable(tableKeys) {
|
|
let bitVal = 0;
|
|
let bitTable = {};
|
|
let incVal = 1;
|
|
|
|
for(let i in tableKeys) {
|
|
let key = tableKeys[i];
|
|
bitTable[key] = bitVal;
|
|
bitVal = 1 << incVal;
|
|
incVal++;
|
|
}
|
|
return bitTable;
|
|
}
|
|
|
|
// ===========================================================================
|