nyx

The first CODM discrod bot -- cath.exe Template
git clone https://codeberg.org/night0721/nyx
Log | Files | Refs | LICENSE

commit 1a3e93ddf95118afb7fd611a7404144608dbe210
parent 3a4050176280a28a97854df32d1096cb304e8559
Author: night0721 <[email protected]>
Date:   Tue,  1 Feb 2022 22:00:50 +0800

updates

Diffstat:
ACODM/loadout.js | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ACODM/new-stats.js | 774+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcommand/CODM/build.js | 25+++++++++++++++++--------
Mcommand/CODM/scorestreak.js | 9+++------
Autil/Data/cwts.json | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Autil/Data/loadout.json | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 1044 insertions(+), 14 deletions(-)

diff --git a/CODM/loadout.js b/CODM/loadout.js @@ -0,0 +1,78 @@ +const { MessageEmbed } = require("discord.js"); //@night0721 You need to make this +const items = require("../../util/Data/loadout.json"); +module.exports = { + name: "class", + description: "Generate A Random Loadout", + category: "CODM", + run: async (client, interaction) => { + // const data = async () => { + // const d = await model.findOne({}); + // const types = d.Categories; + // const names = d.Primary; + // const category = types[Math.floor(Math.random() * types.length)]; + // const weapons = names[0][category]; + // return `${weapons[Math.floor(Math.random() * weapons.length)]}`; + // }; + // const primary_weapon = await data(); + // const primary = primary_weapon.replace(/[ -]/g, "_").replace(/\./g, ""); + // const slots = shuffle(Object.keys(Attachments[primary][0])); + // const slot_1 = slots.next().value, + // slot_2 = slots.next().value, + // slot_3 = slots.next().value, + // slot_4 = slots.next().value, + // slot_5 = slots.next().value; + const result = new MessageEmbed() + .setColor(client.color) + .setFooter(`Made by ${client.author}`) + .setURL(client.web) + .setTitle(`🎲 A Randomly Generated Loadout 🎲`) + .setDescription( + `This loadout is a randomly generated, Also try, \`\`\`\`/gun\`\`\`\` to get a randomally generated primary weapon gunsmith build` + ) + .addFields( + { + name: `Secondary Weapon`, + value: ``, + inline: true, + }, + { + name: `Operator Skill`, + value: ``, + inline: true, + }, + { + name: `Scorestreak`, // 3 perks + value: ``, + inline: true, + }, + { + name: `Red Perk`, + value: ``, + inline: true, + }, + { + name: `Green Perk`, + value: ``, + inline: true, + }, + { + name: `Blue Perk`, + value: ``, + inline: true, + } + ) + .setTimestamp(); + interaction.followUp({ embeds: [result] }); + + // function* shuffle(array) { + // let i = array.length; + // while (i--) { + // yield array.splice(Math.floor(Math.random() * (i + 1)), 1)[0]; + // } + // } + // function getAttachment(gun, slot) { + // const ca = Attachments[gun][0][slot]; + // return ca[Math.floor(Math.random() * ca.length)]; + // } + }, +}; diff --git a/CODM/new-stats.js b/CODM/new-stats.js @@ -0,0 +1,774 @@ +const { MessageEmbed } = require("discord.js"); +const moment = require("moment"); +const axios = require("axios"); +module.exports = { + name: "stats", + description: "Check Stats of a Weapon by SOD", + usage: "[Weapon Name]", + category: "CODM", + options: [ + { + type: "SUB_COMMAND", + name: "assault_rifle", + description: "Get a Stats for Assault Rifle", + options: [ + { + type: 3, + name: "Weapon", + description: "Name of the Gun", + required: true, + choices: [ + { + name: "Type 25", + value: "A01", + }, + { + name: "M16", + value: "A02", + }, + { + name: "AK117", + value: "A03", + }, + { + name: "AK-47", + value: "A04", + }, + { + name: "ASM10", + value: "A05", + }, + { + name: "M4", + value: "A06", + }, + { + name: "BK57", + value: "A07", + }, + { + name: "LK24", + value: "A08", + }, + { + name: "ICR-1", + value: "A09", + }, + { + name: "Man-o-War", + value: "A10", + }, + { + name: "KN-44", + value: "A11", + }, + { + name: "HBRa3", + value: "A12", + }, + { + name: "HVK-30", + value: "A13", + }, + { + name: "DR-H", + value: "A14", + }, + { + name: "Peacekeeper MK2", + value: "A15", + }, + { + name: "FR .556", + value: "A16", + }, + { + name: "AS VAL", + value: "A17", + }, + { + name: "CR-56 AMAX", + value: "A18", + }, + { + name: "M13", + value: "A19", + }, + { + name: "Swordfish", + value: "A20", + }, + { + name: "Kilo 141", + value: "A21", + }, + ], + }, + ], + }, + { + type: "SUB_COMMAND", + name: "sub_machine_gun", + description: "Get a Stats for Sub Machine Gun", + options: [ + { + type: 3, + name: "Weapon", + description: "Name of the Gun", + required: true, + choices: [ + { + name: "RUS-79u", + value: "D01", + }, + { + name: "Chicom", + value: "D02", + }, + { + name: "PDW-57", + value: "D03", + }, + { + name: "Razorback", + value: "D04", + }, + { + name: "MSMC", + value: "D05", + }, + { + name: "HG40", + value: "D06", + }, + { + name: "Pharo", + value: "D07", + }, + { + name: "GKS", + value: "D08", + }, + { + name: "Cordite", + value: "D09", + }, + { + name: "QQ9", + value: "D10", + }, + { + name: "Fennec", + value: "D11", + }, + { + name: "AGR 556", + value: "D12", + }, + { + name: "QXR", + value: "D13", + }, + { + name: "PP19 Bizon", + value: "D14", + }, + { + name: "MX9", + value: "D15", + }, + { + name: "CBR4", + value: "D16", + }, + { + name: "PPSh 41", + value: "D17", + }, + ], + }, + ], + }, + { + type: "SUB_COMMAND", + name: "sniper_rifle", + description: "Get a Stats for Sniper Rifle", + options: [ + { + type: 3, + name: "Weapon", + description: "Name of the Gun", + required: true, + choices: [ + // { + // name: "XPR-50", + // value: "B01", + // }, + { + name: "Arctic .50", + value: "B02", + }, + { + name: "M21 EBR", + value: "B03", + }, + { + name: "DL Q33", + value: "B04", + }, + { + name: "Locus", + value: "B05", + }, + // { + // name: "NA-45", + // value: "B06", + // }, + { + name: "Outlaw", + value: "B07", + }, + { + name: "Rytec AMR", + value: "B08", + }, + { + name: "SVD", + value: "B09", + }, + ], + }, + ], + }, + { + type: "SUB_COMMAND", + name: "light_machine_gun", + description: "Get a Stats for Light Machine Gun", + options: [ + { + type: 3, + name: "Weapon", + description: "Name of the Gun", + required: true, + choices: [ + { + name: "S36", + value: "C01", + }, + { + name: "UL736", + value: "C02", + }, + { + name: "RPD", + value: "C03", + }, + { + name: "M4 LMG", + value: "C04", + }, + { + name: "Chopper", + value: "C05", + }, + { + name: "Holger 26", + value: "C06", + }, + { + name: "Hades", + value: "C07", + }, + { + name: "PKM", + value: "C08", + }, + ], + }, + ], + }, + { + type: "SUB_COMMAND", + name: "shotgun", + description: "Get a Stats for Shotgun", + options: [ + { + type: 3, + name: "Weapon", + description: "Name of the Gun", + required: true, + choices: [ + { + name: "HS2126", + value: "E01", + }, + { + name: "BY15", + value: "E02", + }, + { + name: "HS0405", + value: "E03", + }, + { + name: "Striker", + value: "E04", + }, + { + name: "KRM_262", + value: "E05", + }, + { + name: "Echo", + value: "E06", + }, + { + name: "R9-0", + value: "E07", + }, + ], + }, + ], + }, + { + type: "SUB_COMMAND", + name: "marksman_rifle", + description: "Get a Stats for Marksman Rifle", + options: [ + { + type: 3, + name: "Weapon", + description: "Name of the Gun", + required: true, + choices: [ + { + name: "Kilo Bolt-Action", + value: "F01", + }, + { + name: "SKS", + value: "F02", + }, + { + name: "SP-R 208", + value: "F03", + }, + { + name: "MK2", + value: "F04", + }, + ], + }, + ], + }, + { + type: "SUB_COMMAND", + name: "pistol", + description: "Get a Stats for Pistol", + options: [ + { + type: 3, + name: "Weapon", + description: "Name of the Gun", + required: true, + choices: [ + { + name: "J358", + value: "G01", + }, + { + name: "MW11", + value: "G02", + }, + { + name: ".50 GS", + value: "G03", + }, + { + name: "Renetti", + value: "G04", + }, + { + name: "Shorty", + value: "G05", + }, + { + name: "Crossbow", + value: "G06", + }, + ], + }, + ], + }, + ], + // It's not complete, Still work in progress. + run: async (client, interaction, args) => { + const cwts = args[1]; + const data = await axios + .get(`${process.env.api}/api/v1/codm/builds?cwts=${cwts}`, { + headers: { + Authorization: process.env.CODM_API_KEY, + }, + }) + .then((res) => res.data) + .catch((e) => null); + + if (!data?.ID) { + const embed = new MessageEmbed() + .setDescription( + `<:nyx_not_available:897378400031879188> Sorry, We currently don't have Stats for this Weapon` + ) + .setColor(client.color); + interaction.followUp({ embeds: [embed] }); + } else { + const embed = new MessageEmbed() + .setTitle( + `${data.author} Statistical Breakdown` + ) + .setColor(16580400) + .setImage(data.imageUrl) + .setFooter( + `Stats Curtosy of Round Table`, + ) + // .setFooter( + // `Stats Curtosy of Stats on Duty`, + // ) + .setDescription( + `<:nyx_description:897379659665264650> **Description** \n${data.description}` + ) + .addFields( + { + name: ":id: CWTS:", + value: `\`\`\`\n${data.cwts}\n\`\`\``, + inline: true, + }, + { + name: "<a:lastupdate:897381474330873887> Last Updated:", + value: `\`\`\`\n${moment(Date.parse(data.lastUpdate)).format( + "MMMM Do YYYY" + )}\n\`\`\``, + inline: true, + }, + { + name: "Basic Stats", + value: `\`\`\`\n + BSA Score: ${data.bsa_score} + Hipfire Score: ${data.hipfire_score} + Rate of Fire\t\t\t\t: ${data.rof} + Penetration Level\t\t: ${data.penetration} + Firing Mode\t\t\t\t\t: Full Auto + + \n\`\`\``, + inline: false, + }, + { + name: "Handling & Mobility", + value: `\`\`\`\n + Drop Time : 416.6 ms + Raise Time : 650 ms + Sprinting Speed : 6.09 m/s + Walking Speed : 4.51 m/s + Sprint-to-Fire Time : 165 ms + \n\`\`\``, + inline: false, + }, + { + name: "Ammunation Stats", + value: `\`\`\`\n + Magazine : 30 + Reserve : 120 + Reload Type : Magazine + Cancel Reload Time : 1.9 s + Reload Time : 2.3 s + Full Reload Time : 3.2 s + \n\`\`\``, + inline: false, + }, + { + name: ":paperclip: Attachments:", + value: arr.join("\n"), + }, + { + name: "<a:tags:897034924140404776> Tags", + value: data.tags.join(", "), + } + ) + .setURL(client.web); + interaction.followUp({ embeds: [embed] }); + } + }, +}; + +// @night0721 Damage profile will be avalable by different command + + + +// recoilAvailable = false; +// hasError = false; +// console.log(args); +// const repEmb = statsHandler(args.join(" ").replace("\n", " ")); +// if (hasError) { +// interaction.followUp({ embeds: [repEmb] }); +// } +// if (recoilAvailable) { +// repEmb.fields.push({ +// name: "**Recoil Graph**", +// value: +// "```\nThe Recoil graph below is dynamic (change based on attachment equipped)```", +// }); +// const recoilImageLink = await chart.getShortUrl(); +// repEmb.image = { url: recoilImageLink }; +// } +// interaction.followUp({ embeds: [repEmb] }); +// }, +// } + + +// run: async (client, interaction, args) => { +// recoilAvailable = false; +// hasError = false; +// console.log(args); +// const repEmb = statsHandler(args.join(" ").replace("\n", " ")); +// if (hasError) { +// interaction.followUp({ embeds: [repEmb] }); +// } +// if (recoilAvailable) { +// repEmb.fields.push({ +// name: "**Recoil Graph**", +// value: +// "```\nThe Recoil graph below is dynamic (change based on attachment equipped)```", +// }); +// const recoilImageLink = await chart.getShortUrl(); +// repEmb.image = { url: recoilImageLink }; +// } +// interaction.followUp({ embeds: [repEmb] }); +// }, +// }; + +// function inpHandler(inpmsg) { +// statsHandler(inpmsg.split("+")[0]); +// } + +// function statsHandler(inpmsg) { +// let statsNames = [ +// "Pellets", +// "Detonation Range", +// "Explosion Radius", +// "Explosion Damage", +// "Firing Mode", +// "Rate of Fire", +// "Bullet in Burst", +// "Time Between Burst", +// "Bullet Speed", +// "Penetration Level", +// "Bullet Spread", +// "Idle Sway", +// "Hipfire Pellet Spread", +// "ADS Pellet Spread", +// "ADS Time", +// "Sprint-to-Fire Time", +// "ADS Zoom", +// "Magazine", +// "Reserve", +// "Reload Type", +// "Cancel Reload Time", +// "Reload Time", +// "Full Reload Time", +// "Drop Time", +// "Raise Time", +// "Sprinting Speed", +// "Walking Speed", +// "Straifing Speed", +// "Damage per Tick", +// "Number of Ticks", +// "Time Between Ticks", +// "Breath Hold Time", +// "shouldNeverHappen0", +// "shouldNeverHappen1", +// "shouldNeverHappen2", +// "shouldNeverHappen3", +// "shouldNeverHappen4", +// ], +// out = []; + +// currGun = common.weaponIdentifier(inpmsg); +// if (typeof currGun == "string") { +// hasError = true; +// return currGun; +// } +// currStats = currGun.stats; +// currDRM = currGun.drm[0]; +// currAttachments = []; +// currAttachments = common.attachmentsIdentifier( +// inpmsg, +// currGun.aments, +// currStats +// ); +// if (typeof currAttachments == "string") { +// hasError = true; +// return currAttachments; +// } +// currRecoilArr = [1, 1, currGun.stats[17]]; +// if (currAttachments.length != 0) { +// const totalEffects = common.totaler(currAttachments); + +// currStats = common.updateStatswithEffects(totalEffects, currStats); +// currRecoilArr = [totalEffects[2], totalEffects[3], currGun.stats[17]]; // must happen after currStats update +// currDRM = currGun.drm[totalEffects[37]]; +// currDRM.range = currDRM.range.map(x => +// Math.round(x * (1 + totalEffects[13] / 100)) +// ); +// out = common.attachmentHandler(totalEffects, currStats); +// } +// function statsWorker() { +// if (currStats[19] === 2) { +// currStats[21] = +// currStats[20] + currStats[21] * currStats[17] + currStats[22]; +// currStats[20] = 0; +// currStats[22] = 0; +// } +// currStats[25] = (currStats[25] * currStats[26]) / 100; + +// const outReady = currStats.map((x, i) => +// x ? statsNames[i].padEnd(24) + ":".padEnd(3) + beautifier(i) : "" +// ); +// out = [ +// ...[ +// "Basic Stats", +// "ADS Stats", +// "Bullet Stats", +// "Magazine", +// "Handling Stats", +// "Mobility Stats", +// "Miscellaneous Stats", +// ].map((x, i) => +// fieldMaker( +// x, +// [ +// [04, 05, 09], +// [14, 16, 11, 31], +// [00, 06, 07, 08, 10, 12, 13], +// [17, 18, 19, 20, 21, 22], +// [23, 24], +// [25, 26, 27, 15], +// [28, 29, 30, 01, 02, 03], +// ][i] +// ) +// ), +// ...out, +// ]; +// function fieldMaker(inpName, inpIndx) { +// inpIndx = inpIndx.filter(x => outReady[x]); +// return inpIndx.length +// ? { +// name: "**" + inpName + "**", +// value: "```\n" + inpIndx.map(x => outReady[x]).join("\n") + "```", +// } +// : ""; +// } +// } +// statsWorker(); + +// function beautifier(j) { +// switch (j) { +// case 04: +// return data.firingModes[currStats[j] - 1]; +// case 09: +// return data.penetrationLevels[currStats[j] - 1]; +// case 19: +// return data.reloadTypes[currStats[j] - 1]; +// case 08: +// if (currStats[j] == -1) { +// return "Infinity"; +// } else { +// return parseFloat(currStats[j].toFixed(2)).toString() + " m/s"; +// } +// case 03: +// return parseFloat(currStats[j].toFixed(2)) +// .toString() +// .replace(".", " ~ "); +// default: +// return parseFloat(currStats[j].toFixed(2)).toString() + addUnit(j); +// } + +// function addUnit(j) { +// switch (j) { +// case 07: +// case 14: +// case 15: +// case 23: +// case 24: +// case 31: +// return " ms"; +// case 27: +// case 28: +// case 25: +// case 26: +// return " m/s"; +// case 20: +// case 21: +// case 22: +// return " s"; +// case 16: +// return "%"; +// case 06: +// return " Rounds"; +// case 05: +// return " RPM"; +// default: +// return ""; +// } +// } +// } +// interpretion = currGun.gunname + common.interpretioner(currAttachments); +// if (currGun.recoil.hr.length > 2) { +// chart = common.recoilHandler( +// currGun.recoil.hr, +// currGun.recoil.vr, +// currRecoilArr[0], +// currRecoilArr[1], +// currRecoilArr[2] +// ); +// recoilAvailable = true; +// } else { +// recoilAvailable = false; +// } +// if (chart == "none") { +// recoilAvailable = false; +// } +// if (chart == "err" || currAttachments == "err") { +// hasError = true; +// return "Cocaineeee"; +// } +// const dmg = +// common.damageHandler( +// currDRM.damage, +// currDRM.range, +// 1, +// 100, +// 60000 / currStats[5], +// currStats[7], +// currStats[6], +// currStats[0] +// ) || "```This should never happen```"; +// out = [ +// currGun.description +// ? { +// name: "**Description:**", +// value: "```\n" + currGun.description + "```", +// } +// : {}, +// { name: "**Damage Profile:**", value: dmg }, +// ...out, +// ]; +// out = out.filter(x => x.value); +// return { +// title: interpretion, +// color: 5814783, +// fields: out, +// footer: { +// text: "[OUTDATED] All data courtesy of Project Lighthouse 2.0 and CoDM Research Crew", +// icon_url: +// "https://media.discordapp.net/attachments/735590814662656102/806960573753327657/cc.png", +// }, +// }; diff --git a/command/CODM/build.js b/command/CODM/build.js @@ -4,6 +4,7 @@ const axios = require("axios"); module.exports = { name: "build", description: "Get gunsmith builds", + usage: "[Weapon Name] [Author] [Tag]", type: "CHAT_INPUT", category: "CODM", options: [ @@ -106,7 +107,7 @@ module.exports = { }, { type: 3, - name: "youtuber", + name: "Author", description: "Select a Content Creator", required: true, choices: [ @@ -233,7 +234,7 @@ module.exports = { }, { type: 3, - name: "youtuber", + name: "Author", description: "Select a Content Creator", required: true, choices: [ @@ -324,7 +325,7 @@ module.exports = { }, { type: 3, - name: "youtuber", + name: "Author", description: "Select a Content Creator", required: true, choices: [ @@ -407,7 +408,7 @@ module.exports = { }, { type: 3, - name: "youtuber", + name: "Author", description: "Select a Content Creator", required: true, choices: [ @@ -471,7 +472,7 @@ module.exports = { value: "E04", }, { - name: "KRM_262", + name: "KRM 262", value: "E05", }, { @@ -486,7 +487,7 @@ module.exports = { }, { type: 3, - name: "youtuber", + name: "Author", description: "Select a Content Creator", required: true, choices: [ @@ -549,7 +550,7 @@ module.exports = { }, { type: 3, - name: "youtuber", + name: "Author", description: "Select a Content Creator", required: true, choices: [ @@ -557,6 +558,10 @@ module.exports = { name: "path.exe", value: "path.exe", }, + // { + // name: "Stats On Duty", + // value: "sod", + // }, ], }, { @@ -620,7 +625,7 @@ module.exports = { }, { type: 3, - name: "youtuber", + name: "Author", description: "Select a Content Creator", required: true, choices: [ @@ -628,6 +633,10 @@ module.exports = { name: "path.exe", value: "path.exe", }, + // { + // name: "Stats On Duty", + // value: "sod", + // }, ], }, { diff --git a/command/CODM/scorestreak.js b/command/CODM/scorestreak.js @@ -132,7 +132,9 @@ module.exports = { const embed = new MessageEmbed() .setTitle(d.name) .setURL(d.preview_video) - .setDescription(`\`\`\`${d.description}\`\`\``) + .setDescription( + `<:nyx_description:897379659665264650> **Description** \`\`\`\n${d.description}\`\`\`` + ) .addFields( { name: "Cost", @@ -148,11 +150,6 @@ module.exports = { : "<a:nyx_checkmark:897240322411724841> Yes" }`, inline: true, - }, - { - name: "More Info", - value: `\`\`\`${d.special ? d.special : "None"}\`\`\``, - inline: false, } ) .setThumbnail(d.preview) diff --git a/util/Data/cwts.json b/util/Data/cwts.json @@ -0,0 +1,74 @@ +{ + "A01": "Type 25", + "A02": "M16", + "A03": "AK117", + "A04": "AK-47", + "A05": "ASM10", + "A06": "M4", + "A07": "BK57", + "A08": "LK24", + "A09": "ICR-1", + "A10": "Man-o-War", + "A11": "KN-44", + "A12": "HBRa3", + "A13": "HVK-30", + "A14": "DR-H", + "A15": "Peacekeeper MK2", + "A16": "FR .556", + "A17": "AS VAL", + "A18": "CR-56 AMAX", + "A19": "M13", + "A20": "Swordfish", + "A21": "Kilo 141", + "B01": "XPR-50", + "B02": "Arctic .50", + "B03": "M21 EBR", + "B04": "DL Q33", + "B05": "Locus", + "B06": "NA-45", + "B07": "Outlaw", + "B08": "Rytec AMR", + "B09": "SVD", + "C01": "S36", + "C02": "UL736", + "C03": "RPD", + "C04": "M4 LMG", + "C05": "Chopper", + "C06": "Holger 26", + "C07": "Hades", + "C08": "PKM", + "D01": "RUS-79u", + "D02": "Chicom", + "D03": "PDW-57", + "D04": "Razorback", + "D05": "MSMC", + "D06": "HG40", + "D07": "Pharo", + "D08": "GKS", + "D09": "Cordite", + "D10": "QQ9", + "D11": "Fennec", + "D12": "AGR 556", + "D13": "QXR", + "D14": "PP19 Bizon", + "D15": "MX9", + "D16": "CBR4", + "D17": "PPSh 41", + "E01": "HS2126", + "E02": "BY15", + "E03": "HS0405", + "E04": "Striker", + "E05": "KRM 262", + "E06": "Echo", + "E07": "R9-0", + "F01": "Kilo Bolt-Action", + "F02": "SKS", + "F03": "SP-R 208", + "F04": "MK2", + "G01": "J358", + "G02": "MW11", + "G03": ".50 GS", + "G04": "Renetti", + "G05": "Shorty", + "G06": "Crossbow" +} diff --git a/util/Data/loadout.json b/util/Data/loadout.json @@ -0,0 +1,98 @@ +{ + "secondary": [ + "Knife / Base Melee", + "Axe", + "Shovel", + "Baseball Bat", + "Nunchucks", + "Prizefighter", + "Wrench", + "Sickle", + "Machete", + "Katana", + "FHJ-18", + "SMRS", + "D13 Sector", + "Thumper" + ], + "perk_1": [ + "Fast Recover", + "Persistence", + "Flak Jacket", + "Skulker", + "Agile", + "Lightweight", + "Restock", + "Tactician", + "Overclock", + "Martyrdom", + "Iron Lungs" + ], + "perk_2": [ + "Vulture", + "Toughness", + "Tracker", + "Ghost", + "Cold Blooded", + "Hard Wired", + "Quick Fix", + "Amped", + "Recon", + "Gung-Ho" + ], + "perk_3": [ + "Hard Line", + "Demo Expert", + "Tactical Mask", + "Alert", + "Engineer", + "Dead Silence", + "Shrapnel", + "Hard Alert", + "Launcher Plus" + ], + "scorestreek": [ + "Shield Turret", + "UAV", + "Shock RC", + "Hunter Killer Drone", + "Care Package", + "Counter UAV", + "MQ-27 Dragonfire", + "SAM Turret", + "Predator Missile", + "Hawk X3", + "Sentry Gun", + "Lightning Strike", + "Orbital Laser", + "XS1 Goliath", + "Cluster Strike", + "Chopper Gunner", + "Stealth Chopper", + "Swarm", + "Napalm", + "Advance UAV", + "EMP Systems", + "VTOL" + ], + "operator_skill": [ + "Purifier", + "War Machine", + "Death Machine", + "Tranform Shield", + "K9 UNIT", + "Sparrow", + "Tempest", + "H.I.V.E. ", + "Gravity Spikes", + "Annihilator", + "Shadow Blade", + "Equalizer", + "Ballistic Shield", + "Gravity Vortex Gun", + "Bull Charge", + "Kinetic Armor", + "TAK-5", + "Munitions Box" + ] +}