568 lines
13 KiB
JavaScript
568 lines
13 KiB
JavaScript
// ===========================================================================
|
|
// Asshat-Gaming Roleplay
|
|
// https://github.com/VortrexFTW/gtac_asshat_rp
|
|
// Copyright (c) 2021 Asshat-Gaming (https://asshatgaming.com)
|
|
// ===========================================================================
|
|
// FILE: native.js
|
|
// DESC: Provides util funcs for native wrapping
|
|
// TYPE: Shared (JavaScript)
|
|
// ===========================================================================
|
|
|
|
"use strict";
|
|
setErrorMode(RESOURCEERRORMODE_STRICT);
|
|
|
|
// ===========================================================================
|
|
|
|
function and(var1, var2) {
|
|
return (var1 && var2);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function or(var1, var2) {
|
|
return (var1 || var2);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function not(var1) {
|
|
return !var1;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function bitAnd(var1, var2) {
|
|
return var1 & var2;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function bitOr(var1, var2) {
|
|
return var1 | var2;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function bitXor(var1, var2) {
|
|
return var1 ^ var2;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function bitNot(var1) {
|
|
return ~var1;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function bitLeftShift(var1, var2) {
|
|
return var1 << var2;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function bitRightShift(var1, var2) {
|
|
return var1 >> var2;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function greaterThan(var1, var2) {
|
|
return var1 > var2;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function lessThan(var1, var2) {
|
|
return (var1 < var2);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function greaterThanOrEqualTo(var1, var2) {
|
|
return (var1 >= var2);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function lessThanOrEqualTo(var1, var2) {
|
|
return (var1 <= var2);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function equals(var1, var2) {
|
|
return (var1 == var2);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function modulo(var1, var2) {
|
|
return var1 % var2;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function add(...args) {
|
|
return args.reduce((acc, a) => {
|
|
return acc + a;
|
|
}, 0);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function subtract(...args) {
|
|
return args.reduce((acc, a) => {
|
|
return acc - a;
|
|
}, 0);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function multiply(...args) {
|
|
return args.reduce((acc, a) => {
|
|
return acc * a;
|
|
}, 0);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function divide(...args) {
|
|
return args.reduce((acc, a) => {
|
|
return acc / a;
|
|
}, 0);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function toArray(...args) {
|
|
return args;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function toInteger(val) {
|
|
return Number(val);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function toFloat(val, fixed = 2) {
|
|
return parseFloat((val).toFixed(fixed));
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function toString(val) {
|
|
return String(val);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function toVector3(x, y, z) {
|
|
return new Vec3(x, y, z);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function toVector2(x, y) {
|
|
return new Vec2(x, y);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function toUpperCase(val) {
|
|
return String(val).toUpperCase();
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function toLowerCase(val) {
|
|
return String(val).toLowerCase();
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function isNull(val) {
|
|
if(val == null) {
|
|
return true;
|
|
}
|
|
|
|
if(typeof val === "undefined") {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getEntityData(entity, dataName) {
|
|
if(entity != null) {
|
|
if(entity.getData != null) {
|
|
return entity.getData(dataName);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function setEntityData(entity, dataName, dataValue, syncToClients = true) {
|
|
if(entity != null) {
|
|
if(!isNull(server)) {
|
|
return entity.setData(dataName, dataValue, syncToClients);
|
|
} else {
|
|
return entity.setData(dataName, dataValue);
|
|
}
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function removeEntityData(entity, dataName) {
|
|
if(entity != null) {
|
|
return entity.removeData(dataName);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function doesEntityDataExist(entity, dataName) {
|
|
if(entity != null) {
|
|
return (entity.getData(dataName) != null);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getDistance(vec1, vec2) {
|
|
if(isNull(vec1) || isNull(vec2)) {
|
|
return false;
|
|
}
|
|
return vec1.distance(vec2);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function isConsole(client) {
|
|
if(client == null) {
|
|
return false;
|
|
}
|
|
|
|
return client.console;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function logToConsole(tempLogLevel, text) {
|
|
if((logLevel & tempLogLevel) || logLevel == LOG_ALL) {
|
|
if(tempLogLevel == LOG_ERROR) {
|
|
console.error(text);
|
|
return true;
|
|
} else if(tempLogLevel == LOG_WARN) {
|
|
console.warn(text);
|
|
return true;
|
|
} else {
|
|
console.log(text);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function isSamePlayer(client1, client2) {
|
|
return (client1 == client2);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getClientFromIndex(index) {
|
|
let clients = getClients();
|
|
for(let i in clients) {
|
|
if(clients[i].index == index) {
|
|
return clients[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getConsoleClient() {
|
|
let clients = getClients();
|
|
for(let i in clients) {
|
|
if(isConsole(clients[i])) {
|
|
return clients[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getPlayerFromParams(params) {
|
|
let clients = getClients();
|
|
if(isNaN(params)) {
|
|
for(let i in clients) {
|
|
if(!clients[i].console) {
|
|
if(toLowerCase(clients[i].name).indexOf(toLowerCase(params)) != -1) {
|
|
return clients[i];
|
|
}
|
|
|
|
if(toLowerCase(getCharacterFullName(clients[i])).indexOf(toLowerCase(params)) != -1) {
|
|
return clients[i];
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if(typeof clients[toInteger(params)] != "undefined") {
|
|
return clients[toInteger(params)];
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getPosToRightOfPos(pos, angle, distance) {
|
|
let x = (pos.x+((Math.cos((-angle+1.57)+(Math.PI/2)))*distance));
|
|
let y = (pos.y+((Math.sin((-angle+1.57)+(Math.PI/2)))*distance));
|
|
|
|
let rightPos = toVector3(x, y, pos.z);
|
|
|
|
return rightPos;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getPosToLeftOfPos(pos, angle, distance) {
|
|
let x = (pos.x+((Math.cos((angle+1.57)+(Math.PI/2)))*distance));
|
|
let y = (pos.y+((Math.sin((angle+1.57)+(Math.PI/2)))*distance));
|
|
|
|
let leftPos = toVector3(x, y, pos.z);
|
|
|
|
return leftPos;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getPosInFrontOfPos(pos, angle, distance) {
|
|
let x = (pos.x+((Math.cos(angle+(Math.PI/2)))*distance));
|
|
let y = (pos.y+((Math.sin(angle+(Math.PI/2)))*distance));
|
|
let z = pos.z;
|
|
|
|
return toVector3(x, y, z);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getPosBehindPos(pos, angle, distance) {
|
|
let x = (pos.x+((Math.cos(angle-(Math.PI/2)))*distance));
|
|
let y = (pos.y+((Math.sin(angle-(Math.PI/2)))*distance));
|
|
let z = pos.z;
|
|
|
|
return toVector3(x,y,z);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getPosAbovePos(pos, distance) {
|
|
return toVector3(pos.x, pos.y, pos.z+distance);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getPosBelowPos(pos, distance) {
|
|
return toVector3(pos.x, pos.y, pos.z-distance);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function applyOffsetToPos(position, position2) {
|
|
return toVector3(position.x+position2.x, position.y+position2.y, position.z+position2.z);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getRandom(min, max) {
|
|
return Math.floor(Math.random() * (toInteger(max) - toInteger(min) + 1)) + toInteger(min)
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getArrayOfElementId(elements) {
|
|
let tempArray = [];
|
|
for(let i in elements) {
|
|
tempArray.push(elements[i].id);
|
|
}
|
|
|
|
return tempArray;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function Enum(constantsList) {
|
|
let tempTable = {};
|
|
for(let i in constantsList) {
|
|
tempTable[constantsList[i]] = i;
|
|
}
|
|
return tempTable;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getSyncerFromId(syncerId) {
|
|
let clients = getClients();
|
|
return clients[syncerId];
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getGame() {
|
|
if(isServerScript()) {
|
|
return server.game;
|
|
} else {
|
|
return gta.game;
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function isServerScript() {
|
|
return (typeof server != "undefined");
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function doesGameHaveSnow(gameId) {
|
|
return (getGame() != GAME_GTA_IV);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function isGTAIV() {
|
|
return (getGame() == GAME_GTA_IV);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function arrayBufferToString(arrayBuffer) {
|
|
return String.fromCharCode.apply(null, new Uint8Array(arrayBuffer));
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function vec3ToVec2(pos) {
|
|
return toVector2(pos[0], pos[1]);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function vec2ToVec3(pos, z) {
|
|
return toVector3(pos[0], pos[1], z);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function degToRad(deg) {
|
|
return deg * Math.PI / 180;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function radToDeg(rad) {
|
|
return rad * 180 / Math.PI;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getHeadingFromPosToPos(pos1, pos2) {
|
|
let x = pos2.x-pos1.x;
|
|
let y = pos2.y-pos1.y;
|
|
let rad = Math.atan2(y, x);
|
|
let deg = radToDeg(rad);
|
|
deg -= 90;
|
|
deg = deg % 360;
|
|
return degToRad(deg);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getAngleInCircleFromCenter(center, total, current) {
|
|
let gap = 360 / total;
|
|
let deg = Math.floor(gap*current);
|
|
|
|
if(deg <= 0) {
|
|
deg = 1;
|
|
} else {
|
|
if(deg >= 360) {
|
|
deg = 359;
|
|
}
|
|
}
|
|
|
|
return degToRad(deg);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function areParamsEmpty(params) {
|
|
if(!params || params == "" || params.length == 0 || typeof params == "undefined") {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getParamsCount(params, delimiter = " ") {
|
|
return params.split(delimiter).length;
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function areThereEnoughParams(params, requiredAmount, delimiter = " ") {
|
|
return (params.split(delimiter).length >= requiredAmount);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getParams(params, delimiter, index) {
|
|
return params.split(delimiter)[index];
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function packData(...args) {
|
|
for(let i in args) {
|
|
switch(args[i].constructor.name) {
|
|
case "Vec3":
|
|
let x = args[i].x.toFixed(2);
|
|
let y = args[i].y.toFixed(2);
|
|
let z = args[i].z.toFixed(2);
|
|
x = x * 100;
|
|
y = z * 100;
|
|
z = z * 100;
|
|
let result = combine(x, y, z);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function combine(a, b, c) {
|
|
return toInteger((a << 20) | (b << 10) | c);
|
|
}
|
|
|
|
// ===========================================================================
|
|
|
|
function getPercentage(num, per) {
|
|
return (num/100)*per;
|
|
}
|
|
|
|
// ===========================================================================
|