commit 9db31abc02c157b1a5fb889fe8dbee5688e70f2c
parent 6e8fbe15e76fb7193314e124c400144303122e57
Author: night0721 <[email protected]>
Date: Sun, 23 Jan 2022 09:06:11 +0800
no idea wtf is happening
Diffstat:
5 files changed, 672 insertions(+), 681 deletions(-)
diff --git a/command/CODM/stats.js b/command/CODM/stats.js
@@ -1,6 +1,6 @@
const common = require("../../util/functions/common");
const data = require("../../util/Data/data.json");
-const Discord = require("discord.js");
+const { MessageEmbed } = require("discord.js");
let currGun,
currStats,
@@ -52,12 +52,15 @@ module.exports = {
},
],
run: async (client, interaction, args) => {
+ repEmb = null;
recoilAvailable = false;
hasError = false;
- console.log(args);
- const repEmb = statsHandler(args.join(" ").replace("\n", " "));
+ if (args.length == 1)
+ repEmb = statsHandler(args.join(" ").replace("\n", " "));
+ else repEmb = statsHandler(args.join(" + ").replace("\n", " "));
+
if (hasError) {
- interaction.followUp({ embeds: [repEmb] });
+ interaction.followUp({ embeds: [new MessageEmbed(repEmb)] });
}
if (recoilAvailable) {
repEmb.fields.push({
@@ -68,7 +71,7 @@ module.exports = {
const recoilImageLink = await chart.getShortUrl();
repEmb.image = { url: recoilImageLink };
}
- interaction.followUp({ embeds: [repEmb] });
+ interaction.followUp({ embeds: [new MessageEmbed(repEmb)] });
},
};
diff --git a/index.js b/index.js
@@ -1,7 +1,8 @@
+const { HTTPError, DiscordAPIError } = require("discord.js");
const NYX = require("./client/NYX");
const client = new NYX();
module.exports = client;
process.on("unhandledRejection", err => {
- console.log(err);
+ console.error(err);
});
client.start();
diff --git a/scorestreak.js b/scorestreak.js
@@ -166,7 +166,7 @@ module.exports = {
inline: false,
}
)
- .setThumbnail(`${d.preview}`)
+ .setThumbnail(d.preview)
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
.setColor(
d.type == "lethal"
diff --git a/util/dist/handler.js b/util/dist/handler.js
@@ -1,3 +1,4 @@
+const { DiscordAPIError, HTTPError } = require("discord.js");
const fs = require("fs");
const cmds = [];
const ownercmds = [];
@@ -30,27 +31,28 @@ module.exports = async client => {
client.on("ready", async () => {
const gg = client.guilds.cache.get("840225563193114624");
await gg.commands.set(ownercmds);
- await client.application.commands.set(cmds).then(async cmd => {
- client.guilds.cache.forEach(g => {
- const getroles = name => {
- const perms = cmds.find(n => n.name == name).UserPerms;
- if (!perms) return null;
- return g.roles.cache.filter(
- z => z.permissions.has(perms) && !z.managed
- );
- };
- const fullPermissions = cmd.reduce((accumulator, v) => {
- const roles = getroles(v.name);
- if (!roles) return accumulator;
- const permissions = roles.reduce((a, w) => {
- return [...a, { id: w.id, type: "ROLE", permission: true }];
+ await client.application.commands
+ .set(cmds)
+ .then(async cmd => {
+ client.guilds.cache.forEach(g => {
+ const getroles = name => {
+ const perms = cmds.find(n => n.name == name).UserPerms;
+ if (!perms) return null;
+ return g.roles.cache.filter(
+ z => z.permissions.has(perms) && !z.managed
+ );
+ };
+ const fullPermissions = cmd.reduce((accumulator, v) => {
+ const roles = getroles(v.name);
+ if (!roles) return accumulator;
+ const permissions = roles.reduce((a, w) => {
+ return [...a, { id: w.id, type: "ROLE", permission: true }];
+ }, []);
+ return [...accumulator, { id: v.id, permissions }];
}, []);
- return [...accumulator, { id: v.id, permissions }];
- }, []);
- try {
- g.commands.permissions.set({ fullPermissions });
- } catch {}
- });
- });
+ g.commands.permissions.set({ fullPermissions }).catch(null);
+ });
+ })
+ .catch(null);
});
};
diff --git a/util/functions/common.js b/util/functions/common.js
@@ -4,150 +4,149 @@ const nmDt = require("../Data/aliases.json");
const weaponActualName = nmDt.weaponActualName;
const weaponAlliasName = nmDt.weaponAlliasName;
Object.defineProperty(String.prototype, "Simplify", {
- value: function Simplify() {
- return this.toLowerCase().replace(/[^0-9a-z]/g, "");
- },
- writable: true,
- configurable: true,
+ value: function Simplify() {
+ return this.toLowerCase().replace(/[^0-9a-z]/g, "");
+ },
+ writable: true,
+ configurable: true,
});
Object.defineProperty(Number.prototype, "IsPositive", {
- value: function IsPositive() {
- if (this > 0) {
- return true;
- }
- return false;
- },
- writable: true,
- configurable: true,
+ value: function IsPositive() {
+ if (this > 0) {
+ return true;
+ }
+ return false;
+ },
+ writable: true,
+ configurable: true,
});
Object.defineProperty(Number.prototype, "IsNegative", {
- value: function IsNegative() {
- if (this < 0) {
- return true;
- }
- return false;
- },
- writable: true,
- configurable: true,
+ value: function IsNegative() {
+ if (this < 0) {
+ return true;
+ }
+ return false;
+ },
+ writable: true,
+ configurable: true,
});
Object.defineProperty(Number.prototype, "ToBool", {
- value: function ToBool() {
- if (this == 1) {
- return true;
- }
- return false;
- },
- writable: true,
- configurable: true,
+ value: function ToBool() {
+ if (this == 1) {
+ return true;
+ }
+ return false;
+ },
+ writable: true,
+ configurable: true,
});
Object.defineProperty(Number.prototype, "PlusHL", {
- value: function PlusHL() {
- if (this.toString()[0] == "-") {
- return parseFloat(this.toFixed(2)).toString();
- }
- return "+" + parseFloat(this.toFixed(2)).toString();
- },
- writable: true,
- configurable: true,
+ value: function PlusHL() {
+ if (this.toString()[0] == "-") {
+ return parseFloat(this.toFixed(2)).toString();
+ }
+ return "+" + parseFloat(this.toFixed(2)).toString();
+ },
+ writable: true,
+ configurable: true,
});
function inpFixer(inpmsg) {
- const parts = partExtracter(inpmsg);
- nmDt.attachmentAlliasName[0].map((x, i) =>
- x.map(y => {
- if (parts[0].startsWith(y + " ") || parts[0].endsWith(" " + y)) {
- inpmsg =
+ const parts = partExtracter(inpmsg);
+ nmDt.attachmentAlliasName[0].map((x, i) =>
+ x.map(y => {
+ if (parts[0].startsWith(y + " ") || parts[0].endsWith(" " + y)) {
+ inpmsg =
parts[0].replace(y + " ", "").replace(" " + y, "") +
(parts[1] ? ", " : " + ") +
nmDt.attachmentActualName[0][i];
- }
- }),
- );
- return inpmsg;
+ }
+ })
+ );
+ return inpmsg;
}
function partExtracter(inpmsg) {
- if (inpmsg.includes(" + ")) {
- const out = inpmsg
- .split(" + ")
- .map(x => x.split("+"))
- .flat();
- return [out.shift(), out.join(", ")];
- }
- return inpmsg.split(" with ");
+ if (inpmsg.includes(" + ")) {
+ const out = inpmsg
+ .split(" + ")
+ .map(x => x.split("+"))
+ .flat();
+ return [out.shift(), out.join(", ")];
+ }
+ return inpmsg.split(" with ");
}
function hasAttachments(inpmsg) {
- inpmsg = inpFixer(inpmsg);
- if (
- inpmsg.split(" with ").filter(x => x.Simplify()).length > 1 ||
+ inpmsg = inpFixer(inpmsg);
+ if (
+ inpmsg.split(" with ").filter(x => x.Simplify()).length > 1 ||
inpmsg.split(" + ").filter(x => x.Simplify()).length > 1
- ) {
- return true;
- }
- return false;
+ ) {
+ return true;
+ }
+ return false;
}
function isolator(inpmsg) {
- return partExtracter(inpFixer(inpmsg));
+ return partExtracter(inpFixer(inpmsg));
}
function weaponIdentifier(inpmsg) {
- const inpWeaponName = isolator(inpmsg)[0];
- if (inpWeaponName.length < 2) {
- return inpmsg.trim().length
- ? "The name `" + inpmsg.trim() + "` is too short."
- : "Empty weapon name";
- }
- let probableWeapons = [];
- for (let i = 0; i < data.cguns.length; i++) {
- if (inpWeaponName.Simplify() == data.cguns[i].gunname.Simplify()) {
- return JSON.parse(JSON.stringify(data.cguns[i]));
- }
- else if (
- data.cguns[i].gunname.Simplify().includes(inpWeaponName.Simplify())
- ) {
- probableWeapons.push(i);
- }
- }
-
- if (probableWeapons.length == 1) {
- return JSON.parse(JSON.stringify(data.cguns[probableWeapons[0]]));
- }
-
- for (let i = 0; i < weaponAlliasName.length; i++) {
- for (let j = 0; j < weaponAlliasName[i].length; j++) {
- if (weaponAlliasName[i][j].Simplify() == inpWeaponName.Simplify()) {
- for (let i2 = 0; i2 < data.cguns.length; i2++) {
- if (
- weaponActualName[i].Simplify() == data.cguns[i2].gunname.Simplify()
- ) {
- return JSON.parse(JSON.stringify(data.cguns[i2]));
- }
- }
- }
- }
- }
- probableWeapons = [...new Set(probableWeapons)];
- if (probableWeapons.length == 1) {
- return JSON.parse(JSON.stringify(data.cguns[probableWeapons[0]]));
- }
- if (probableWeapons.length > 1) {
- return (
- "Did you mean `" +
+ const inpWeaponName = isolator(inpmsg)[0];
+ if (inpWeaponName.length < 2) {
+ return inpmsg.trim().length
+ ? "The name `" + inpmsg.trim() + "` is too short."
+ : "Empty weapon name";
+ }
+ let probableWeapons = [];
+ for (let i = 0; i < data.cguns.length; i++) {
+ if (inpWeaponName.Simplify() == data.cguns[i].gunname.Simplify()) {
+ return JSON.parse(JSON.stringify(data.cguns[i]));
+ } else if (
+ data.cguns[i].gunname.Simplify().includes(inpWeaponName.Simplify())
+ ) {
+ probableWeapons.push(i);
+ }
+ }
+
+ if (probableWeapons.length == 1) {
+ return JSON.parse(JSON.stringify(data.cguns[probableWeapons[0]]));
+ }
+
+ for (let i = 0; i < weaponAlliasName.length; i++) {
+ for (let j = 0; j < weaponAlliasName[i].length; j++) {
+ if (weaponAlliasName[i][j].Simplify() == inpWeaponName.Simplify()) {
+ for (let i2 = 0; i2 < data.cguns.length; i2++) {
+ if (
+ weaponActualName[i].Simplify() == data.cguns[i2].gunname.Simplify()
+ ) {
+ return JSON.parse(JSON.stringify(data.cguns[i2]));
+ }
+ }
+ }
+ }
+ }
+ probableWeapons = [...new Set(probableWeapons)];
+ if (probableWeapons.length == 1) {
+ return JSON.parse(JSON.stringify(data.cguns[probableWeapons[0]]));
+ }
+ if (probableWeapons.length > 1) {
+ return (
+ "Did you mean `" +
probableWeapons
- .map(x => data.cguns[x].gunname)
- .reduce((out, x, i) =>
- [out, x].join(i === probableWeapons.length - 1 ? "` or `" : "`, `"),
- ) +
+ .map(x => data.cguns[x].gunname)
+ .reduce((out, x, i) =>
+ [out, x].join(i === probableWeapons.length - 1 ? "` or `" : "`, `")
+ ) +
"`?"
- );
- }
- return "Couldn't identify the weapon: `" + '"' + inpWeaponName + '"`';
+ );
+ }
+ return "Couldn't identify the weapon: `" + '"' + inpWeaponName + '"`';
}
function attachmentsIdentifier(inpmsg, attachmentsData, inpStats) {
@@ -190,197 +189,195 @@ function attachmentsIdentifier(inpmsg, attachmentsData, inpStats) {
for (let j = 0; j < splitAttachmentsDataName[i].length; j++) {
splitAttachmentsDataName[i][j] =
splitAttachmentsDataName[i][j].Simplify();
- }
- }
-
- for (let i = 0; i < inputAttachmentsNames.length; i++) {
- var probables = [];
- var splitInputAttachmentsName = inputAttachmentsNames[i]
- .split(" ")
- .filter(x => x);
-
- function finder() {
- for (let j = 0; j < splitAttachmentsDataName.length; j++) {
- for (let i2 = 0; i2 < splitAttachmentsDataName[j].length; i2++) {
- for (let i3 = 0; i3 < splitInputAttachmentsName.length; i3++) {
- if (
- splitAttachmentsDataName[j][i2].includes(
- splitInputAttachmentsName[i3].Simplify(),
- )
- ) {
- let probablePushed = false;
- for (let i4 = 0; i4 < probables.length; i4++) {
- if (!probables[i4].includes(j)) {
- probables[i4].push(j);
- probablePushed = true;
- break;
- }
- }
- if (!probablePushed) {
- probables.push([j]);
- }
- }
- }
- }
- }
- }
- finder();
- if (
- (inputAttachmentsNames[i].includes(" rounds mag") ||
+ }
+ }
+
+ for (let i = 0; i < inputAttachmentsNames.length; i++) {
+ var probables = [];
+ var splitInputAttachmentsName = inputAttachmentsNames[i]
+ .split(" ")
+ .filter(x => x);
+
+ function finder() {
+ for (let j = 0; j < splitAttachmentsDataName.length; j++) {
+ for (let i2 = 0; i2 < splitAttachmentsDataName[j].length; i2++) {
+ for (let i3 = 0; i3 < splitInputAttachmentsName.length; i3++) {
+ if (
+ splitAttachmentsDataName[j][i2].includes(
+ splitInputAttachmentsName[i3].Simplify()
+ )
+ ) {
+ let probablePushed = false;
+ for (let i4 = 0; i4 < probables.length; i4++) {
+ if (!probables[i4].includes(j)) {
+ probables[i4].push(j);
+ probablePushed = true;
+ break;
+ }
+ }
+ if (!probablePushed) {
+ probables.push([j]);
+ }
+ }
+ }
+ }
+ }
+ }
+ finder();
+ if (
+ (inputAttachmentsNames[i].includes(" rounds mag") ||
inputAttachmentsNames[i].includes(" round mag")) &&
inputAttachmentsNames[i].startsWith(
- inputAttachmentsNames[i].replace(/\D/g, ""),
+ inputAttachmentsNames[i].replace(/\D/g, "")
)
- ) {
- var tmp1 = parseInt(inputAttachmentsNames[i]);
- const tmp2 = attachmentsData.filter(
- x =>
- x.type === 8 && x.effects[27] + x.effects[28] + inpStats[17] === tmp1,
- );
- if (tmp2.length === 1) {
- outAttachments.push(tmp2[0]);
- continue;
- }
- }
- if (
- probables.length === 0 ||
+ ) {
+ var tmp1 = parseInt(inputAttachmentsNames[i]);
+ const tmp2 = attachmentsData.filter(
+ x =>
+ x.type === 8 && x.effects[27] + x.effects[28] + inpStats[17] === tmp1
+ );
+ if (tmp2.length === 1) {
+ outAttachments.push(tmp2[0]);
+ continue;
+ }
+ }
+ if (
+ probables.length === 0 ||
probables[probables.length - 1].length !== 1 ||
probables.length < splitInputAttachmentsName.length
- ) {
- probables = [];
- splitInputAttachmentsName.map((x, i5) =>
- nmDt.attachmentAlliasName[1].map((y, i6) =>
- y.map(z => {
- if (x.Simplify() === z.Simplify()) {
- splitInputAttachmentsName[i5] = nmDt.attachmentActualName[1][i6];
- }
- }),
- ),
- );
- splitInputAttachmentsName = splitInputAttachmentsName
- .join(" ")
- .split(" ")
- .filter(x => x);
- finder();
- if (
- probables.length === 0 ||
+ ) {
+ probables = [];
+ splitInputAttachmentsName.map((x, i5) =>
+ nmDt.attachmentAlliasName[1].map((y, i6) =>
+ y.map(z => {
+ if (x.Simplify() === z.Simplify()) {
+ splitInputAttachmentsName[i5] = nmDt.attachmentActualName[1][i6];
+ }
+ })
+ )
+ );
+ splitInputAttachmentsName = splitInputAttachmentsName
+ .join(" ")
+ .split(" ")
+ .filter(x => x);
+ finder();
+ if (
+ probables.length === 0 ||
probables[probables.length - 1].length !== 1 ||
probables.length < splitInputAttachmentsName.length
- ) {
- probables = [];
- splitInputAttachmentsName = inputAttachmentsNames[i]
- .split(" ")
- .filter(x => x);
- finder();
- }
- }
-
- if (probables.length === 0) {
- unidentifined.push(inputAttachmentsNames[i]);
- continue;
- }
-
- var curr = probables[probables.length - 1];
- const temp1 = probables[probables.length - 1].filter(
- x =>
- attachmentsData[x].name.Simplify() ==
- inputAttachmentsNames[i].Simplify(),
- );
- const temp2 = probables[probables.length - 1].filter(
- x =>
- splitAttachmentsDataName[x].length == splitInputAttachmentsName.length,
- );
- /**/ if (temp1.length === 1 && temp2.length !== 1) {
- probables.push([temp1]);
- }
- else if (temp1.length !== 1 && temp2.length === 1) {
- probables.push([temp2]);
- }
- else if (
- temp1.length === 1 &&
+ ) {
+ probables = [];
+ splitInputAttachmentsName = inputAttachmentsNames[i]
+ .split(" ")
+ .filter(x => x);
+ finder();
+ }
+ }
+
+ if (probables.length === 0) {
+ unidentifined.push(inputAttachmentsNames[i]);
+ continue;
+ }
+
+ var curr = probables[probables.length - 1];
+ const temp1 = probables[probables.length - 1].filter(
+ x =>
+ attachmentsData[x].name.Simplify() ==
+ inputAttachmentsNames[i].Simplify()
+ );
+ const temp2 = probables[probables.length - 1].filter(
+ x =>
+ splitAttachmentsDataName[x].length == splitInputAttachmentsName.length
+ );
+ /**/ if (temp1.length === 1 && temp2.length !== 1) {
+ probables.push([temp1]);
+ } else if (temp1.length !== 1 && temp2.length === 1) {
+ probables.push([temp2]);
+ } else if (
+ temp1.length === 1 &&
temp2.length === 1 &&
temp1[0] == temp2[0]
- ) {
- probables.push([temp1]);
- }
- if (
- probables[probables.length - 1].length != 1 ||
+ ) {
+ probables.push([temp1]);
+ }
+ if (
+ probables[probables.length - 1].length != 1 ||
probables.length < splitInputAttachmentsName.length
- ) {
- errors.push(
- "`" +
+ ) {
+ errors.push(
+ "`" +
curr
- .map(x => attachmentsData[x].name)
- .reduce((out, x, i) =>
- [out, x].join(i === curr.length - 1 ? "` or `" : "`, `"),
- ) +
+ .map(x => attachmentsData[x].name)
+ .reduce((out, x, i) =>
+ [out, x].join(i === curr.length - 1 ? "` or `" : "`, `")
+ ) +
'` by `"' +
inputAttachmentsNames[i] +
- '"`',
- );
- }
- outAttachments.push(attachmentsData[probables[probables.length - 1][0]]);
- }
- const outAttachmentsTypes = outAttachments.map(x => x.type - 1),
- t1 = outAttachments
- .map(x => x.effects[35])
- .reduce((t, x) => t + x, 0)
- .toString()
- .padStart(11, "0")
- .toString()
- .split("")
- .map((x, i) =>
- parseInt(x) !== 0 && outAttachmentsTypes.includes(i) ? parseInt(i) : -1,
- )
- .filter(x => x !== -1);
-
- errorMsgs += t1.length
- ? "Can't equip `" +
+ '"`'
+ );
+ }
+ outAttachments.push(attachmentsData[probables[probables.length - 1][0]]);
+ }
+ const outAttachmentsTypes = outAttachments.map(x => x.type - 1),
+ t1 = outAttachments
+ .map(x => x.effects[35])
+ .reduce((t, x) => t + x, 0)
+ .toString()
+ .padStart(11, "0")
+ .toString()
+ .split("")
+ .map((x, i) =>
+ parseInt(x) !== 0 && outAttachmentsTypes.includes(i) ? parseInt(i) : -1
+ )
+ .filter(x => x !== -1);
+
+ errorMsgs += t1.length
+ ? "Can't equip `" +
t1
- .map(x => data.attachmentTypes[x])
- .reduce((out, x, i, a) =>
- [out, x].join(i === a.length - 1 ? "` or `" : "`, `"),
- ) +
+ .map(x => data.attachmentTypes[x])
+ .reduce((out, x, i, a) =>
+ [out, x].join(i === a.length - 1 ? "` or `" : "`, `")
+ ) +
"` with " +
outAttachments
- .filter(x => x.effects[35])
- .map(x => x.name)
- .reduce((out, x, i, a) =>
- [out, x].join(i === a.length - 1 ? " and " : ", "),
- )
- : "";
- errorMsgs += errors.length
- ? "\nDid you mean " + errors.join(";\n") + "?\n"
- : "";
- errorMsgs += unidentifined.length
- ? "\nCouldn't identify the attachment" +
+ .filter(x => x.effects[35])
+ .map(x => x.name)
+ .reduce((out, x, i, a) =>
+ [out, x].join(i === a.length - 1 ? " and " : ", ")
+ )
+ : "";
+ errorMsgs += errors.length
+ ? "\nDid you mean " + errors.join(";\n") + "?\n"
+ : "";
+ errorMsgs += unidentifined.length
+ ? "\nCouldn't identify the attachment" +
(unidentifined.length === 1 ? "" : "s") +
': `"' +
unidentifined.join('"`, `"') +
'"`\n'
- : "";
- errorMsgs +=
+ : "";
+ errorMsgs +=
outAttachments.length > 5 ? "\nCan't equip more than 5 attachments!\n" : "";
- errorMsgs += outAttachments.filter((x, i, a) => a.indexOf(x) !== i).length
- ? "\nMultiple of same attachments found!\n"
- : "";
- errorMsgs += outAttachments
- .map(x => x.type)
- .filter((x, i, a) => a.indexOf(x) !== i).length
- ? "\nMultiple of attachments the same type found!\n"
- : "";
- errorMsgs += tooSmall.length
- ? "\nThe name" +
+ errorMsgs += outAttachments.filter((x, i, a) => a.indexOf(x) !== i).length
+ ? "\nMultiple of same attachments found!\n"
+ : "";
+ errorMsgs += outAttachments
+ .map(x => x.type)
+ .filter((x, i, a) => a.indexOf(x) !== i).length
+ ? "\nMultiple of attachments the same type found!\n"
+ : "";
+ errorMsgs += tooSmall.length
+ ? "\nThe name" +
(tooSmall.length === 1 ? "" : "s") +
': `"' +
tooSmall.reduce((out, x, i) =>
- [out, x].join(i === curr.length - 1 ? '"` and `"' : '"`, `"'),
+ [out, x].join(i === curr.length - 1 ? '"` and `"' : '"`, `"')
) +
'"` ' +
(tooSmall.length === 1 ? "is" : "are") +
" too short\n"
- : "";
- return errorMsgs ? errorMsgs.trim() : outAttachments;
+ : "";
+ return errorMsgs ? errorMsgs.trim() : outAttachments;
}
// console.log(attachmentsIdentifier("chopper with heavy handle, red sight, granulated", data.cguns[38].aments)); makeError();
// console.log(attachmentsIdentifier("ak + 5mw lazer", data.cguns[0].aments)); //makeError();
@@ -388,87 +385,84 @@ function attachmentsIdentifier(inpmsg, attachmentsData, inpStats) {
// console.log(attachmentsIdentifier("117 + rtc muzzle brake, rubberized griptape, tac lazer sight, 40 round mag, no stock", data.cguns[1].aments)); makeError();
function damageHandler(
- currDmgs,
- currRngs,
- damageMulti,
- hp,
- tbs,
- tbb,
- bib,
- pellets,
+ currDmgs,
+ currRngs,
+ damageMulti,
+ hp,
+ tbs,
+ tbb,
+ bib,
+ pellets
) {
- currDmgs = [...currDmgs];
- currRngs = [...currRngs];
-
- currRngs = currRngs.filter(x => x < 100).map(x => Math.round(x));
- currDmgs.length = currRngs.length + 1;
- currDmgs = currDmgs.map(x => Math.round(x * damageMulti));
- let currSTKs = currDmgs.map(x => stk(x)),
- currTTKs = currDmgs.map(x => ttk(x)),
- currPDmg = null,
- n = Math.max(...currTTKs.map(x => x.toString().length));
- n = n < 3 ? 3 : n;
- function worker1(inp) {
- return inp.map(x => x.toString().padStart(n)).join(" -- ") + "\n";
- }
- function worker2(inp) {
- return (
- "".padStart(n + 1) +
+ currDmgs = [...currDmgs];
+ currRngs = [...currRngs];
+
+ currRngs = currRngs.filter(x => x < 100).map(x => Math.round(x));
+ currDmgs.length = currRngs.length + 1;
+ currDmgs = currDmgs.map(x => Math.round(x * damageMulti));
+ let currSTKs = currDmgs.map(x => stk(x)),
+ currTTKs = currDmgs.map(x => ttk(x)),
+ currPDmg = null,
+ n = Math.max(...currTTKs.map(x => x.toString().length));
+ n = n < 3 ? 3 : n;
+ function worker1(inp) {
+ return inp.map(x => x.toString().padStart(n)).join(" -- ") + "\n";
+ }
+ function worker2(inp) {
+ return (
+ "".padStart(n + 1) +
inp.map(x => x.toString().padStart(2)).join("".padStart(n + 2)) +
"\n"
- );
- }
- function stk(dmg) {
- let out;
- if (!pellets) {
- out = Math.ceil(hp / dmg);
- }
- else {
- out = Math.ceil(hp / (dmg * pellets));
- }
- out = out == Infinity ? "∞" : out;
- return out;
- }
- function ttk(dmg) {
- const stkVal = stk(dmg);
- if (stkVal == "∞") {
- return stkVal;
- }
- if (!bib) {
- return Math.round((stkVal - 1) * tbs);
- }
- let out = 0;
- if (dmg > 0) {
- if (stkVal % bib == 0) {
- for (var i = 0; i < Math.floor(stkVal / bib) - 1; i++) {
- out += tbs * (bib - 1) + tbb;
- }
- out = out + tbs * (bib - 1);
- }
- else if (stkVal % bib != 0) {
- for (var i = 0; i <= Math.floor(stkVal / bib) - 1; i++) {
- out += tbs * (bib - 1) + tbb;
- }
- for (var i = 0; i < (stkVal % bib) - 1; i++) {
- out += tbs;
- }
- }
- out = Math.round(out);
- if (out == Infinity) {
- return "∞";
- }
- }
- else {
- out = "No";
- }
- return out;
- }
- if (pellets) {
- currPDmg = currDmgs.map(x => x + "×" + pellets);
- n = Math.max(...currPDmg.map(x => x.toString().length));
- }
- return (
- "```swift\n" +
+ );
+ }
+ function stk(dmg) {
+ let out;
+ if (!pellets) {
+ out = Math.ceil(hp / dmg);
+ } else {
+ out = Math.ceil(hp / (dmg * pellets));
+ }
+ out = out == Infinity ? "∞" : out;
+ return out;
+ }
+ function ttk(dmg) {
+ const stkVal = stk(dmg);
+ if (stkVal == "∞") {
+ return stkVal;
+ }
+ if (!bib) {
+ return Math.round((stkVal - 1) * tbs);
+ }
+ let out = 0;
+ if (dmg > 0) {
+ if (stkVal % bib == 0) {
+ for (var i = 0; i < Math.floor(stkVal / bib) - 1; i++) {
+ out += tbs * (bib - 1) + tbb;
+ }
+ out = out + tbs * (bib - 1);
+ } else if (stkVal % bib != 0) {
+ for (var i = 0; i <= Math.floor(stkVal / bib) - 1; i++) {
+ out += tbs * (bib - 1) + tbb;
+ }
+ for (var i = 0; i < (stkVal % bib) - 1; i++) {
+ out += tbs;
+ }
+ }
+ out = Math.round(out);
+ if (out == Infinity) {
+ return "∞";
+ }
+ } else {
+ out = "No";
+ }
+ return out;
+ }
+ if (pellets) {
+ currPDmg = currDmgs.map(x => x + "×" + pellets);
+ n = Math.max(...currPDmg.map(x => x.toString().length));
+ }
+ return (
+ "```swift\n" +
"Damage : " +
worker1(currPDmg || currDmgs) +
(pellets ? "Total : " + worker1(currDmgs.map(x => x * pellets)) : "") +
@@ -479,340 +473,331 @@ function damageHandler(
"Range : " +
(currRngs.length ? worker2(currRngs) : worker1(["∞"])) +
"```"
- );
+ );
}
// console.log(damageHandler([30, 25, 20], [10, 20], 1, 100, 60000 / 720, 0, 0)); makeError();
// console.log(damageHandler([ 33, 23 ], [ 39 ], 1, 100, 109.0909090909091, 0, 0 )); makeError();
function recoilHandler(
- xRecoil,
- yRecoil,
- xMultiplier,
- yMultiplier,
- bulletCount,
+ xRecoil,
+ yRecoil,
+ xMultiplier,
+ yMultiplier,
+ bulletCount
) {
- if (xRecoil.length != yRecoil.length) {
- return "err";
- }
- const recoilLength = xRecoil.length;
- if (recoilLength == 0) {
- return "none";
- }
- const recoilPattern = [
- {
- x: 0,
- y: 0,
- },
- ];
- let recoilObj;
- for (let i = 0; i < bulletCount; i++) {
- const xContinuationVal =
+ if (xRecoil.length != yRecoil.length) {
+ return "err";
+ }
+ const recoilLength = xRecoil.length;
+ if (recoilLength == 0) {
+ return "none";
+ }
+ const recoilPattern = [
+ {
+ x: 0,
+ y: 0,
+ },
+ ];
+ let recoilObj;
+ for (let i = 0; i < bulletCount; i++) {
+ const xContinuationVal =
xRecoil[recoilLength - 1] - xRecoil[recoilLength - 2];
- const yContinuationVal =
+ const yContinuationVal =
yRecoil[recoilLength - 1] - yRecoil[recoilLength - 2];
- if (i < recoilLength) {
- recoilObj = {
- x: xRecoil[i] * (1 + xMultiplier / 100),
- y: yRecoil[i] * (1 + yMultiplier / 100),
- };
- }
- else {
- recoilObj = {
- x:
+ if (i < recoilLength) {
+ recoilObj = {
+ x: xRecoil[i] * (1 + xMultiplier / 100),
+ y: yRecoil[i] * (1 + yMultiplier / 100),
+ };
+ } else {
+ recoilObj = {
+ x:
(recoilPattern[recoilPattern.length - 1].x + xContinuationVal) *
xMultiplier,
- y:
+ y:
(recoilPattern[recoilPattern.length - 1].y + yContinuationVal) *
yMultiplier,
- };
- }
- recoilPattern.push(recoilObj);
- }
- const chart = new QuickChart();
- chart
- .setConfig({
- type: "scatter",
- data: {
- datasets: [
- {
- data: recoilPattern,
- showLine: true,
- fill: false,
- pointRadius: 3,
- backgroundColor: "rgba(056,205,255,1.00)", // "#38CDFF" fully transparent
- borderColor: "rgba(056,205,255,0.75)", // "#38CDFF" 75% transparent
- },
- ],
- },
- options: {
- plugins: {
- backgroundImageUrl: "https://i.imgur.com/jFAFaWF.png",
- },
- legend: {
- display: false,
- },
- scales: {
- yAxes: [
- {
- ticks: {
- display: false,
- min: 0,
- max: 5050,
- },
- },
- ],
- xAxes: [
- {
- ticks: {
- display: false,
- min: -4495,
- max: 4495,
- },
- },
- ],
- },
- },
- })
- .setWidth(1780)
- .setHeight(1000);
-
- return chart;
+ };
+ }
+ recoilPattern.push(recoilObj);
+ }
+ const chart = new QuickChart();
+ chart
+ .setConfig({
+ type: "scatter",
+ data: {
+ datasets: [
+ {
+ data: recoilPattern,
+ showLine: true,
+ fill: false,
+ pointRadius: 3,
+ backgroundColor: "rgba(056,205,255,1.00)", // "#38CDFF" fully transparent
+ borderColor: "rgba(056,205,255,0.75)", // "#38CDFF" 75% transparent
+ },
+ ],
+ },
+ options: {
+ plugins: {
+ backgroundImageUrl: "https://i.imgur.com/jFAFaWF.png",
+ },
+ legend: {
+ display: false,
+ },
+ scales: {
+ yAxes: [
+ {
+ ticks: {
+ display: false,
+ min: 0,
+ max: 5050,
+ },
+ },
+ ],
+ xAxes: [
+ {
+ ticks: {
+ display: false,
+ min: -4495,
+ max: 4495,
+ },
+ },
+ ],
+ },
+ },
+ })
+ .setWidth(1780)
+ .setHeight(1000);
+
+ return chart;
}
function updateStatswithEffects(inpEffects, inpStats) {
- const l = inpStats[18] / inpStats[17];
- const outStats = [...inpStats];
-
- var inpStatsarr = [1, 2, 5, 11, 14, 15, 20, 21, 22, 26, 27, 31];
- var inpEfecsarr = [17, 18, 16, 19, 1, 10, 14, 14, 14, 6, 7, 42]; // Efecs is short for Effects
- for (let i = 0; i < inpEffects.length; i++) {
- if (inpEffects[inpEfecsarr[i]] != 0) {
- outStats[inpStatsarr[i]] *= (inpEffects[inpEfecsarr[i]] + 100) / 100;
- }
- }
- var inpStatsarr = [3, 4, 16, 28, 29, 30];
- var inpEfecsarr = [20, 38, 0, 39, 40, 41];
- for (let i = 0; i < inpEffects.length; i++) {
- if (inpEffects[inpEfecsarr[i]] != 0) {
- outStats[inpStatsarr[i]] = inpEffects[inpEfecsarr[i]];
- }
- }
- var inpStatsarr = [0, 17, 25];
- var inpEfecsarr = [29, 27, 9];
- for (let i = 0; i < inpEffects.length; i++) {
- if (inpEffects[inpEfecsarr[i]] != 0) {
- outStats[inpStatsarr[i]] += inpEffects[inpEfecsarr[i]];
- }
- }
-
- if (inpEffects[4] != 0) {
- outStats[10] = 11 - (11 - inpStats[10]) * (1 + inpEffects[4] / 100); //
- }
- if (inpEffects[43] != 0 && inpStats[8] != -1) {
- outStats[8] *= (inpEffects[43] + 100) / 100;
- }
- if (inpEffects[16] != 0) {
- outStats[7] *= inpEffects[16] / -100 + 1;
- }
- outStats[18] = inpStats[17] * l;
- return outStats;
+ const l = inpStats[18] / inpStats[17];
+ const outStats = [...inpStats];
+
+ var inpStatsarr = [1, 2, 5, 11, 14, 15, 20, 21, 22, 26, 27, 31];
+ var inpEfecsarr = [17, 18, 16, 19, 1, 10, 14, 14, 14, 6, 7, 42]; // Efecs is short for Effects
+ for (let i = 0; i < inpEffects.length; i++) {
+ if (inpEffects[inpEfecsarr[i]] != 0) {
+ outStats[inpStatsarr[i]] *= (inpEffects[inpEfecsarr[i]] + 100) / 100;
+ }
+ }
+ var inpStatsarr = [3, 4, 16, 28, 29, 30];
+ var inpEfecsarr = [20, 38, 0, 39, 40, 41];
+ for (let i = 0; i < inpEffects.length; i++) {
+ if (inpEffects[inpEfecsarr[i]] != 0) {
+ outStats[inpStatsarr[i]] = inpEffects[inpEfecsarr[i]];
+ }
+ }
+ var inpStatsarr = [0, 17, 25];
+ var inpEfecsarr = [29, 27, 9];
+ for (let i = 0; i < inpEffects.length; i++) {
+ if (inpEffects[inpEfecsarr[i]] != 0) {
+ outStats[inpStatsarr[i]] += inpEffects[inpEfecsarr[i]];
+ }
+ }
+
+ if (inpEffects[4] != 0) {
+ outStats[10] = 11 - (11 - inpStats[10]) * (1 + inpEffects[4] / 100); //
+ }
+ if (inpEffects[43] != 0 && inpStats[8] != -1) {
+ outStats[8] *= (inpEffects[43] + 100) / 100;
+ }
+ if (inpEffects[16] != 0) {
+ outStats[7] *= inpEffects[16] / -100 + 1;
+ }
+ outStats[18] = inpStats[17] * l;
+ return outStats;
}
function attachmentHandler(currEffects, currStats) {
- const pos = [],
- neg = [],
- atr = [];
- if (currEffects[0] > currStats[16]) {
- pos.push(
- currEffects[0] +
+ const pos = [],
+ neg = [],
+ atr = [];
+ if (currEffects[0] > currStats[16]) {
+ pos.push(
+ currEffects[0] +
"% zoom (+" +
(currEffects[0] - currStats[16]) +
- "% zoom)",
- );
- }
- else if (currEffects[0] != 0 && currEffects[0] != currStats[16]) {
- neg.push(
- currEffects[0] +
+ "% zoom)"
+ );
+ } else if (currEffects[0] != 0 && currEffects[0] != currStats[16]) {
+ neg.push(
+ currEffects[0] +
"% zoom (-" +
(currStats[16] - currEffects[0]) +
- "% zoom)",
- );
- }
- if (currEffects[0] != 0 && currStats[16] <= 110) {
- atr.push("Easier to Aim");
- }
- negGood1(1, "ADS time");
- negGood1(2, "Vertical Recoil");
- negGood1(3, "Horizontal Recoil");
- negGood1(4, "Bullet Spread");
- negGood1(5, "Moving Bullet Spread");
- posGood1(6, "Mobility");
- posGood1(7, "ADS Mobility");
- negGood1(8, "Recoil when Crouched or Prone");
- posGood1(9, "Sprint Mobility");
- negGood1(10, "Sprint to Fire Time");
- negGood1(11, "Flinch");
- negGood1(12, "Hipfire Spread");
- posGood1(13, "Damage Range");
- negGood1(14, "Reload Time");
- posGood1(15, "Headshot Damage");
- posGood1(16, "Rate of Fire");
- posGood1(17, "Detonation Range");
- posGood1(18, "Explosion Radius");
- negGood1(19, "Idle Sway");
- if (currEffects[20] > currStats[3]) {
- pos.push(
- currEffects[20].ToString().Replace(".", " ~ ") + " Explosion Damage",
- );
- }
- else if (currEffects[20] != 0 && currEffects[20] != currStats[3]) {
- neg.push(
- currEffects[20].ToString().Replace(".", " ~ ") + " Explosion Damage",
- );
- }
- atrPush3(21, "Visible Laser when not ADS-ed");
- atrPush3(22, "Visible Laser when ADS-ed");
- atrPush3(23, "Visible Laser");
- atrPush3(24, "Silenced Gunfire");
- atrPush3(25, "Hidden Muzzle Flash");
- posGood2(27, "Rounds/Mag");
- posGood2(28, "Rounds/Tube");
- posGood2(29, "Pellets per Shot");
- posGood2(30, "Damage Over Time");
- atrPush3(32, "Reworked ADS");
- atrPush3(33, "Faster Melee QTE");
- if (currEffects[35]) {
- atr.push(
- "Can Not use " +
+ "% zoom)"
+ );
+ }
+ if (currEffects[0] != 0 && currStats[16] <= 110) {
+ atr.push("Easier to Aim");
+ }
+ negGood1(1, "ADS time");
+ negGood1(2, "Vertical Recoil");
+ negGood1(3, "Horizontal Recoil");
+ negGood1(4, "Bullet Spread");
+ negGood1(5, "Moving Bullet Spread");
+ posGood1(6, "Mobility");
+ posGood1(7, "ADS Mobility");
+ negGood1(8, "Recoil when Crouched or Prone");
+ posGood1(9, "Sprint Mobility");
+ negGood1(10, "Sprint to Fire Time");
+ negGood1(11, "Flinch");
+ negGood1(12, "Hipfire Spread");
+ posGood1(13, "Damage Range");
+ negGood1(14, "Reload Time");
+ posGood1(15, "Headshot Damage");
+ posGood1(16, "Rate of Fire");
+ posGood1(17, "Detonation Range");
+ posGood1(18, "Explosion Radius");
+ negGood1(19, "Idle Sway");
+ if (currEffects[20] > currStats[3]) {
+ pos.push(
+ currEffects[20].ToString().Replace(".", " ~ ") + " Explosion Damage"
+ );
+ } else if (currEffects[20] != 0 && currEffects[20] != currStats[3]) {
+ neg.push(
+ currEffects[20].ToString().Replace(".", " ~ ") + " Explosion Damage"
+ );
+ }
+ atrPush3(21, "Visible Laser when not ADS-ed");
+ atrPush3(22, "Visible Laser when ADS-ed");
+ atrPush3(23, "Visible Laser");
+ atrPush3(24, "Silenced Gunfire");
+ atrPush3(25, "Hidden Muzzle Flash");
+ posGood2(27, "Rounds/Mag");
+ posGood2(28, "Rounds/Tube");
+ posGood2(29, "Pellets per Shot");
+ posGood2(30, "Damage Over Time");
+ atrPush3(32, "Reworked ADS");
+ atrPush3(33, "Faster Melee QTE");
+ if (currEffects[35]) {
+ atr.push(
+ "Can Not use " +
currEffects[35]
- .toString()
- .padStart(11, "0")
- .toString()
- .split("")
- .map((x, i) => (parseInt(x) !== 0 ? data.attachmentTypes[i] : 0))
- .filter(x => x),
- );
- }
- atrPush3(36, "Can't ADS");
- if (currEffects[37] != 0) {
- atr.push("New Lethality Profile");
- }
- if (currEffects[38] != 0 && currEffects[38] < currStats[4]) {
- pos.push("Turns to " + data.firingModes[currEffects[38] - 1]);
- }
- else if (currEffects[38] != 0 && currEffects[38] != currStats[4]) {
- neg.push("Turns to " + data.firingModes[currEffects[38] - 1]);
- }
- posGood2(39, "Tick Damage");
- posGood2(40, "Ticks");
- negGood2(41, "ms Tick Interval");
- posGood2(42, "Breath Holding Time");
- posGood1(43, "Bullet Speed");
- if (currEffects[44] == 1) {
- atr.push("Higher Penetraion Damage");
- }
- else if (currEffects[44] == -1) {
- atr.push("Lower Penetraion Damage");
- }
- posGood2(45, "Round" + (currEffects[45] - 1 ? "s" : "") + " in Reserve");
-
- function posGood1(i, ext) {
- if (currEffects[i].IsPositive()) {
- pos.push(currEffects[i].PlusHL() + "% " + ext);
- }
- else if (currEffects[i].IsNegative()) {
- neg.push(currEffects[i].PlusHL() + "% " + ext);
- }
- }
-
- function negGood1(i, ext) {
- if (currEffects[i].IsNegative()) {
- pos.push(currEffects[i].PlusHL() + "% " + ext);
- }
- else if (currEffects[i].IsPositive()) {
- neg.push(currEffects[i].PlusHL() + "% " + ext);
- }
- }
-
- function posGood2(i, ext) {
- if (currEffects[i].IsPositive()) {
- pos.push(currEffects[i].PlusHL() + " " + ext);
- }
- else if (currEffects[i].IsNegative()) {
- neg.push(currEffects[i].PlusHL() + " " + ext);
- }
- }
-
- function negGood2(i, ext) {
- if (currEffects[i].IsNegative()) {
- pos.push(currEffects[i].PlusHL() + " " + ext);
- }
- else if (currEffects[i].IsPositive()) {
- neg.push(currEffects[i].PlusHL() + " " + ext);
- }
- }
-
- function atrPush3(i, ext) {
- if (currEffects[i].ToBool()) {
- atr.push(ext);
- }
- }
-
- return [
- pos.length
- ? {
- name: "**Positives:**",
- value: "```ini\n[" + pos.join("]\n[") + "]\n```",
- inline: true,
- }
- : 0,
- neg.length
- ? {
- name: "**Negatives:**",
- value: "```css\n[" + neg.join("]\n[") + "]\n```",
- inline: true,
- }
- : 0,
- atr.length
- ? {
- name: "**Attributes:**",
- value: "```fix\n[" + atr.join("]\n[") + "]\n```",
- }
- : 0,
- ].filter(x => x);
+ .toString()
+ .padStart(11, "0")
+ .toString()
+ .split("")
+ .map((x, i) => (parseInt(x) !== 0 ? data.attachmentTypes[i] : 0))
+ .filter(x => x)
+ );
+ }
+ atrPush3(36, "Can't ADS");
+ if (currEffects[37] != 0) {
+ atr.push("New Lethality Profile");
+ }
+ if (currEffects[38] != 0 && currEffects[38] < currStats[4]) {
+ pos.push("Turns to " + data.firingModes[currEffects[38] - 1]);
+ } else if (currEffects[38] != 0 && currEffects[38] != currStats[4]) {
+ neg.push("Turns to " + data.firingModes[currEffects[38] - 1]);
+ }
+ posGood2(39, "Tick Damage");
+ posGood2(40, "Ticks");
+ negGood2(41, "ms Tick Interval");
+ posGood2(42, "Breath Holding Time");
+ posGood1(43, "Bullet Speed");
+ if (currEffects[44] == 1) {
+ atr.push("Higher Penetraion Damage");
+ } else if (currEffects[44] == -1) {
+ atr.push("Lower Penetraion Damage");
+ }
+ posGood2(45, "Round" + (currEffects[45] - 1 ? "s" : "") + " in Reserve");
+
+ function posGood1(i, ext) {
+ if (currEffects[i].IsPositive()) {
+ pos.push(currEffects[i].PlusHL() + "% " + ext);
+ } else if (currEffects[i].IsNegative()) {
+ neg.push(currEffects[i].PlusHL() + "% " + ext);
+ }
+ }
+
+ function negGood1(i, ext) {
+ if (currEffects[i].IsNegative()) {
+ pos.push(currEffects[i].PlusHL() + "% " + ext);
+ } else if (currEffects[i].IsPositive()) {
+ neg.push(currEffects[i].PlusHL() + "% " + ext);
+ }
+ }
+
+ function posGood2(i, ext) {
+ if (currEffects[i].IsPositive()) {
+ pos.push(currEffects[i].PlusHL() + " " + ext);
+ } else if (currEffects[i].IsNegative()) {
+ neg.push(currEffects[i].PlusHL() + " " + ext);
+ }
+ }
+
+ function negGood2(i, ext) {
+ if (currEffects[i].IsNegative()) {
+ pos.push(currEffects[i].PlusHL() + " " + ext);
+ } else if (currEffects[i].IsPositive()) {
+ neg.push(currEffects[i].PlusHL() + " " + ext);
+ }
+ }
+
+ function atrPush3(i, ext) {
+ if (currEffects[i].ToBool()) {
+ atr.push(ext);
+ }
+ }
+
+ return [
+ pos.length
+ ? {
+ name: "**Positives:**",
+ value: "```ini\n[" + pos.join("]\n[") + "]\n```",
+ inline: true,
+ }
+ : 0,
+ neg.length
+ ? {
+ name: "**Negatives:**",
+ value: "```css\n[" + neg.join("]\n[") + "]\n```",
+ inline: true,
+ }
+ : 0,
+ atr.length
+ ? {
+ name: "**Attributes:**",
+ value: "```fix\n[" + atr.join("]\n[") + "]\n```",
+ }
+ : 0,
+ ].filter(x => x);
}
function interpretioner(inpAttachments) {
- return inpAttachments.length
- ? " with " + inpAttachments.map(x => x.name).join(", ")
- : "";
+ return inpAttachments.length
+ ? " with " + inpAttachments.map(x => x.name).join(", ")
+ : "";
}
function totaler(inpAttachments) {
- const totalEffects = inpAttachments[0].effects;
- for (let j = 1; j < inpAttachments.length; j++) {
- for (let i2 = 0; i2 < totalEffects.length; i2++) {
- totalEffects[i2] += inpAttachments[j].effects[i2];
- }
- }
- return totalEffects;
+ const totalEffects = inpAttachments[0].effects;
+ for (let j = 1; j < inpAttachments.length; j++) {
+ for (let i2 = 0; i2 < totalEffects.length; i2++) {
+ totalEffects[i2] += inpAttachments[j].effects[i2];
+ }
+ }
+ return totalEffects;
}
function makeError() {
- let m;
- m.split("L");
+ let m;
+ m.split("L");
}
module.exports = {
- weaponIdentifier,
- attachmentsIdentifier,
- recoilHandler,
- attachmentHandler,
- updateStatswithEffects,
- makeError,
- interpretioner,
- damageHandler,
- isolator,
- totaler,
- hasAttachments,
+ weaponIdentifier,
+ attachmentsIdentifier,
+ recoilHandler,
+ attachmentHandler,
+ updateStatswithEffects,
+ makeError,
+ interpretioner,
+ damageHandler,
+ isolator,
+ totaler,
+ hasAttachments,
};