Removed Gambler
This commit is contained in:
parent
b6ba8aea5d
commit
7aa7ac1092
51 changed files with 0 additions and 134308 deletions
|
|
@ -1,3 +0,0 @@
|
||||||
# TheGambler
|
|
||||||
SPT mod
|
|
||||||
https://hub.sp-tarkov.com/files/file/2013-the-gambler-trader/
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
|
|
||||||
{
|
|
||||||
"manifest": []
|
|
||||||
}
|
|
||||||
|
|
@ -1,965 +0,0 @@
|
||||||
{
|
|
||||||
// Note: The Config stores all values that are configurable to personal preferences. You can manipulate Mystery Container prices, stock, and odd here
|
|
||||||
// PS: Sorry for the long and ugly file, I will try to make it more readable in the future.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Debug Option: Every Mystery Box opening will post its item information in the console before opening.
|
|
||||||
// This option is extremely verbose and will clutter your console with info
|
|
||||||
//
|
|
||||||
"debug": false, // Default is false
|
|
||||||
|
|
||||||
// Custom Trader Settings
|
|
||||||
//
|
|
||||||
// Trader Refresh time In Seconds. Trader will refresh inventory stock somewhere between Min-Max seconds .
|
|
||||||
"trader_update_min_time": 3600, // 3600 Seconds
|
|
||||||
"trader_update_max_time": 4000, // 4000 Seconds
|
|
||||||
|
|
||||||
// Custom Gambling Price And Stock Settings
|
|
||||||
//
|
|
||||||
// Setting Price_Multiplier for example to 1.20 will make all mystery containers 20% more expensive. Setting it to 0.80 will make all mystery containers 20% cheaper.
|
|
||||||
// this is meant as a quick and easy way to make all containers more expensive or cheaper if you wish. individual container prices can be changed below...
|
|
||||||
"price_multiplier": 1.0,
|
|
||||||
|
|
||||||
// All Mystery Container individual settings: price, stock, ... etc
|
|
||||||
// Configuarable Options:
|
|
||||||
// - container_enable:
|
|
||||||
// - If false, mystery box will be disabled, and NOT be sold by the trader
|
|
||||||
//
|
|
||||||
// - container_manual_pricing:
|
|
||||||
// - If true, the 'container_price' option will be used as the price of the Mystery Container, if false, the Automatic Price Balancer will
|
|
||||||
// determine the price of the Mystery Container based on the 'container_profit_percentage' option, odds, and flea price of all rewards.
|
|
||||||
//
|
|
||||||
// - container_price:
|
|
||||||
// - The price of the Mystery Container ONLY if 'container_manual_pricing' is set to true, will be overridden by the Automatic Price Balancer if false
|
|
||||||
//
|
|
||||||
// - container_unlimited_stock:
|
|
||||||
// - If false, the container stock will be limited to the value of 'container_stock' option. if true, the container will have unlimited stock
|
|
||||||
//
|
|
||||||
// - container_stock:
|
|
||||||
// - Amount of mystery containers available for purchase, only used if container_unlimited_stock is set to false
|
|
||||||
//
|
|
||||||
// - container_rewards_found_in_raid_status:
|
|
||||||
// - If true, the rewards in the Mystery Container will have the found in raid status. If false, rewards will NOT have the found in raid status
|
|
||||||
//
|
|
||||||
"container_config": {
|
|
||||||
// Mystery Wallet
|
|
||||||
"wallet_enable": true,
|
|
||||||
"wallet_manual_pricing": false,
|
|
||||||
"wallet_price": 100000,
|
|
||||||
"wallet_unlimited_stock": true,
|
|
||||||
"wallet_stock": 50,
|
|
||||||
"wallet_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// 100k Coin Flip
|
|
||||||
"100k_enable": true,
|
|
||||||
"100k_manual_pricing": false,
|
|
||||||
"100k_price": 100000,
|
|
||||||
"100k_unlimited_stock": true,
|
|
||||||
"100k_stock": 50,
|
|
||||||
"100k_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// 500k Coin Flip
|
|
||||||
"500k_enable": true,
|
|
||||||
"500k_manual_pricing": false,
|
|
||||||
"500k_price": 500000,
|
|
||||||
"500k_unlimited_stock": true,
|
|
||||||
"500k_stock": 50,
|
|
||||||
"500k_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// 1 Million Coin Flip
|
|
||||||
"1mil_enable": true,
|
|
||||||
"1mil_manual_pricing": false,
|
|
||||||
"1mil_price": 1000000,
|
|
||||||
"1mil_unlimited_stock": true,
|
|
||||||
"1mil_stock": 50,
|
|
||||||
"1mil_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Mystery Key
|
|
||||||
"key_enable": true,
|
|
||||||
"key_manual_pricing": false,
|
|
||||||
"key_price": 250000,
|
|
||||||
"key_unlimited_stock": true,
|
|
||||||
"key_stock": 20,
|
|
||||||
"key_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Mystery Stimulant
|
|
||||||
"stim_enable": true,
|
|
||||||
"stim_manual_pricing": false,
|
|
||||||
"stim_price": 36500,
|
|
||||||
"stim_unlimited_stock": true,
|
|
||||||
"stim_stock": 10,
|
|
||||||
"stim_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Mystery Medical Kit
|
|
||||||
"medical_enable": true,
|
|
||||||
"medical_manual_pricing": false,
|
|
||||||
"medical_price": 60000,
|
|
||||||
"medical_unlimited_stock": false,
|
|
||||||
"medical_stock": 1,
|
|
||||||
"medical_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Mystery Food
|
|
||||||
"food_enable": true,
|
|
||||||
"food_manual_pricing": false,
|
|
||||||
"food_price": 33000,
|
|
||||||
"food_unlimited_stock": true,
|
|
||||||
"food_stock": 50,
|
|
||||||
"food_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Mystery Bitcoin
|
|
||||||
"bitcoin_enable": true,
|
|
||||||
"bitcoin_unlimited_stock": true,
|
|
||||||
"bitcoin_stock": 20,
|
|
||||||
"bitcoin_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Mystery GP Coin
|
|
||||||
"gpcoin_enable": true,
|
|
||||||
"gpcoin_unlimited_stock": true,
|
|
||||||
"gpcoin_stock": 20,
|
|
||||||
"gpcoin_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Mystery Keycard
|
|
||||||
"keycard_enable": true,
|
|
||||||
"keycard_manual_pricing": false,
|
|
||||||
"keycard_price": 330000,
|
|
||||||
"keycard_unlimited_stock": true,
|
|
||||||
"keycard_stock": 30,
|
|
||||||
"keycard_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// 50/50 Case
|
|
||||||
"fiftyfifty_enable": true,
|
|
||||||
"fiftyfifty_manual_pricing": true,
|
|
||||||
"fiftyfifty_price": 2500000,
|
|
||||||
"fiftyfifty_unlimited_stock": true,
|
|
||||||
"fiftyfifty_stock": 5,
|
|
||||||
"fiftyfifty_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Mystery Melee
|
|
||||||
"melee_enable": true,
|
|
||||||
"melee_manual_pricing": false,
|
|
||||||
"melee_price": 78500,
|
|
||||||
"melee_unlimited_stock": true,
|
|
||||||
"melee_stock": 50,
|
|
||||||
"melee_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Weapon Mystery Box
|
|
||||||
"weapon_enable": true,
|
|
||||||
"weapon_manual_pricing": false,
|
|
||||||
"weapon_price": 150000,
|
|
||||||
"weapon_unlimited_stock": true,
|
|
||||||
"weapon_stock": 30,
|
|
||||||
"weapon_rewards_found_in_raid_status": false,
|
|
||||||
|
|
||||||
/* DOES NOTHING
|
|
||||||
// default_weapon Mystery Box
|
|
||||||
"default_weapon_enable": true,
|
|
||||||
"default_weapon_manual_pricing": false,
|
|
||||||
"default_weapon_price": 150000,
|
|
||||||
"default_weapon_unlimited_stock": true,
|
|
||||||
"default_weapon_stock": 999,
|
|
||||||
"default_weapon_rewards_found_in_raid_status": false,
|
|
||||||
|
|
||||||
// average_weapon Mystery Box
|
|
||||||
"average_weapon_enable": true,
|
|
||||||
"average_weapon_manual_pricing": false,
|
|
||||||
"average_weapon_price": 150000,
|
|
||||||
"average_weapon_unlimited_stock": true,
|
|
||||||
"average_weapon_stock": 999,
|
|
||||||
"average_weapon_rewards_found_in_raid_status": false,
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Premium Weapon Mystery Box
|
|
||||||
"premium_weapon_enable": true,
|
|
||||||
"premium_weapon_manual_pricing": false,
|
|
||||||
"premium_weapon_price": 245000,
|
|
||||||
"premium_weapon_unlimited_stock": false,
|
|
||||||
"premium_weapon_stock": 15,
|
|
||||||
"premium_weapon_rewards_found_in_raid_status": false,
|
|
||||||
|
|
||||||
// Mystery Helmet
|
|
||||||
"helmet_enable": true,
|
|
||||||
"helmet_manual_pricing": false,
|
|
||||||
"helmet_price": 65000,
|
|
||||||
"helmet_unlimited_stock": true,
|
|
||||||
"helmet_stock": 25,
|
|
||||||
"helmet_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Mystery Headset
|
|
||||||
"headset_enable": true,
|
|
||||||
"headset_manual_pricing": false,
|
|
||||||
"headset_price": 55000,
|
|
||||||
"headset_unlimited_stock": true,
|
|
||||||
"headset_stock": 25,
|
|
||||||
"headset_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Armor Mystery Box
|
|
||||||
"armor_enable": true,
|
|
||||||
"armor_manual_pricing": false,
|
|
||||||
"armor_price": 115000,
|
|
||||||
"armor_unlimited_stock": true,
|
|
||||||
"armor_stock": 25,
|
|
||||||
"armor_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Premium Armor Mystery Box
|
|
||||||
"premium_armor_enable": true,
|
|
||||||
"premium_armor_manual_pricing": false,
|
|
||||||
"premium_armor_price": 375000,
|
|
||||||
"premium_armor_unlimited_stock": false,
|
|
||||||
"premium_armor_stock": 10,
|
|
||||||
"premium_armor_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Sealed Weapon Case
|
|
||||||
"sealed_enable": true,
|
|
||||||
"sealed_manual_pricing": true,
|
|
||||||
"sealed_price": 350000,
|
|
||||||
"sealed_unlimited_stock": false,
|
|
||||||
"sealed_stock": 3,
|
|
||||||
"sealed_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Backpack Mystery Bag
|
|
||||||
"backpack_enable": true,
|
|
||||||
"backpack_manual_pricing": false,
|
|
||||||
"backpack_price": 45000,
|
|
||||||
"backpack_unlimited_stock": true,
|
|
||||||
"backpack_stock": 25,
|
|
||||||
"backpack_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// Mystery Loadout
|
|
||||||
"loadout_enable": true,
|
|
||||||
"loadout_manual_pricing": true,
|
|
||||||
"loadout_price": 400000,
|
|
||||||
"loadout_unlimited_stock": true,
|
|
||||||
"loadout_stock": 15,
|
|
||||||
"loadout_rewards_found_in_raid_status": false,
|
|
||||||
|
|
||||||
// Premium Mystery premium_loadout
|
|
||||||
"premium_loadout_enable": true,
|
|
||||||
"premium_loadout_manual_pricing": true,
|
|
||||||
"premium_loadout_price": 650000,
|
|
||||||
"premium_loadout_unlimited_stock": true,
|
|
||||||
"premium_loadout_stock": 10,
|
|
||||||
"premium_loadout_rewards_found_in_raid_status": false,
|
|
||||||
|
|
||||||
// Tactical Rig Mystery Box
|
|
||||||
"rig_enable": true,
|
|
||||||
"rig_manual_pricing": false,
|
|
||||||
"rig_price": 45000,
|
|
||||||
"rig_unlimited_stock": true,
|
|
||||||
"rig_stock": 15,
|
|
||||||
"rig_rewards_found_in_raid_status": true,
|
|
||||||
|
|
||||||
// All Mystery Ammo Container settings
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
"all_ammo_enable": true, // This will enable or disable trader from selling all Mystery Ammo containers
|
|
||||||
"all_ammo_rewards_found_in_raid_status": true, // found in raid status of all Mystery Ammo containers
|
|
||||||
|
|
||||||
// Mystery 7.62x25
|
|
||||||
"7.62x25_enable": false,
|
|
||||||
"7.62x25_manual_pricing": false,
|
|
||||||
"7.62x25_price": 6000,
|
|
||||||
"7.62x25_unlimited_stock": false,
|
|
||||||
"7.62x25_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 9x18
|
|
||||||
"9x18_enable": true,
|
|
||||||
"9x18_manual_pricing": false,
|
|
||||||
"9x18_price": 6000,
|
|
||||||
"9x18_unlimited_stock": false,
|
|
||||||
"9x18_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 9x19
|
|
||||||
"9x19_enable": true,
|
|
||||||
"9x19_manual_pricing": false,
|
|
||||||
"9x19_price": 9000,
|
|
||||||
"9x19_unlimited_stock": false,
|
|
||||||
"9x19_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 9x21
|
|
||||||
"9x21_enable": true,
|
|
||||||
"9x21_manual_pricing": false,
|
|
||||||
"9x21_price": 10000,
|
|
||||||
"9x21_unlimited_stock": false,
|
|
||||||
"9x21_stock": 15,
|
|
||||||
|
|
||||||
// Mystery .357
|
|
||||||
".357_enable": true,
|
|
||||||
".357_manual_pricing": false,
|
|
||||||
".357_price": 5000,
|
|
||||||
".357_unlimited_stock": false,
|
|
||||||
".357_stock": 15,
|
|
||||||
|
|
||||||
// Mystery .45_ACP
|
|
||||||
".45_enable": true,
|
|
||||||
".45_manual_pricing": false,
|
|
||||||
".45_price": 8000,
|
|
||||||
".45_unlimited_stock": false,
|
|
||||||
".45_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 4.6x30
|
|
||||||
"4.6x30_enable": true,
|
|
||||||
"4.6x30_manual_pricing": false,
|
|
||||||
"4.6x30_price": 9000,
|
|
||||||
"4.6x30_unlimited_stock": false,
|
|
||||||
"4.6x30_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 5.7x28
|
|
||||||
"5.7x28_enable": true,
|
|
||||||
"5.7x28_manual_pricing": false,
|
|
||||||
"5.7x28_price": 10000,
|
|
||||||
"5.7x28_unlimited_stock": false,
|
|
||||||
"5.7x28_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 5.45x39
|
|
||||||
"5.45x39_enable": true,
|
|
||||||
"5.45x39_manual_pricing": false,
|
|
||||||
"5.45x39_price": 10500,
|
|
||||||
"5.45x39_unlimited_stock": false,
|
|
||||||
"5.45x39_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 5.56x45
|
|
||||||
"5.56x45_enable": true,
|
|
||||||
"5.56x45_manual_pricing": false,
|
|
||||||
"5.56x45_price": 15000,
|
|
||||||
"5.56x45_unlimited_stock": false,
|
|
||||||
"5.56x45_stock": 15,
|
|
||||||
|
|
||||||
// Mystery .300_Blackout
|
|
||||||
".300_enable": true,
|
|
||||||
".300_manual_pricing": false,
|
|
||||||
".300_price": 14000,
|
|
||||||
".300_unlimited_stock": false,
|
|
||||||
".300_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 7.62x39
|
|
||||||
"7.62x39_enable": true,
|
|
||||||
"7.62x39_manual_pricing": false,
|
|
||||||
"7.62x39_price": 15000,
|
|
||||||
"7.62x39_unlimited_stock": false,
|
|
||||||
"7.62x39_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 7.62x51
|
|
||||||
"7.62x51_enable": true,
|
|
||||||
"7.62x51_manual_pricing": false,
|
|
||||||
"7.62x51_price": 16000,
|
|
||||||
"7.62x51_unlimited_stock": false,
|
|
||||||
"7.62x51_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 7.62x54
|
|
||||||
"7.62x54_enable": true,
|
|
||||||
"7.62x54_manual_pricing": false,
|
|
||||||
"7.62x54_price": 19000,
|
|
||||||
"7.62x54_unlimited_stock": false,
|
|
||||||
"7.62x54_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 9x39
|
|
||||||
".338_enable": true,
|
|
||||||
".338_manual_pricing": false,
|
|
||||||
".338_price": 50000,
|
|
||||||
".338_unlimited_stock": false,
|
|
||||||
".338_stock": 8,
|
|
||||||
|
|
||||||
// Mystery 9x39
|
|
||||||
"9x39_enable": true,
|
|
||||||
"9x39_manual_pricing": false,
|
|
||||||
"9x39_price": 13000,
|
|
||||||
"9x39_unlimited_stock": false,
|
|
||||||
"9x39_stock": 15,
|
|
||||||
|
|
||||||
// Mystery .366
|
|
||||||
".366_enable": true,
|
|
||||||
".366_manual_pricing": false,
|
|
||||||
".366_price": 6000,
|
|
||||||
".366_unlimited_stock": false,
|
|
||||||
".366_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 12.7x55
|
|
||||||
"12.7x55_enable": true,
|
|
||||||
"12.7x55_manual_pricing": false,
|
|
||||||
"12.7x55_price": 16000,
|
|
||||||
"12.7x55_unlimited_stock": false,
|
|
||||||
"12.7x55_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 12/70
|
|
||||||
"12/70_enable": true,
|
|
||||||
"12/70_manual_pricing": false,
|
|
||||||
"12/70_price": 6000,
|
|
||||||
"12/70_unlimited_stock": false,
|
|
||||||
"12/70_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 20/70
|
|
||||||
"20/70_enable": true,
|
|
||||||
"20/70_manual_pricing": false,
|
|
||||||
"20/70_price": 6000,
|
|
||||||
"20/70_unlimited_stock": false,
|
|
||||||
"20/70_stock": 15,
|
|
||||||
|
|
||||||
// Mystery 23x75
|
|
||||||
"23x75_enable": true,
|
|
||||||
"23x75_manual_pricing": false,
|
|
||||||
"23x75_price": 7000,
|
|
||||||
"23x75_unlimited_stock": false,
|
|
||||||
"23x75_stock": 10
|
|
||||||
},
|
|
||||||
|
|
||||||
// GAMBLING ODDS SECTION
|
|
||||||
//
|
|
||||||
// README:
|
|
||||||
// - Each Mystery Container has odds that you can manipulate yourself if you so choose.
|
|
||||||
//
|
|
||||||
// Example: (This is not the Mystery Wallet actual odds, just an example)
|
|
||||||
// 'Mystery Wallet' Odds: 0.5 + 2.5 + 4.0 + 8.0 + 15.0 + 35.0 + 0 = 65% chance at recieving a reward!
|
|
||||||
// 100.0% - 65.0% = 35% chance at recieving nothing!
|
|
||||||
//
|
|
||||||
// - Keep in mind this applies to ALL mystery containers
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Odds Definitions:
|
|
||||||
// - container_profit_percentage:
|
|
||||||
// - This is how profitable the mystery container will be, and is used as a calculation by the Automatic Price Balancer when determining the mystery container price.
|
|
||||||
// - The higher the percentage, the more expensive and less profitable the container will be, and vice versa. setting it to 1.0 will make the container in theory average out to 0% profit or break even. This however does not account for the flea market fee. So in reality, around 0.98-0.96 is the break even point.
|
|
||||||
//
|
|
||||||
// - container_extremely_rare / container_rare / container_uncommon / container_common / container_extra_common / container_base:
|
|
||||||
// - Theses are the odds for each rarity of a mystery container, increasing or decreasing odds will alter the mystery container price generation and the the chances at recieving a reward of that rarity.
|
|
||||||
// - If you manually change these values, make sure the total odds for each container DON'T go over 100%, anything under 100% will result in a chance at recieving nothing.
|
|
||||||
// - Manipulating the odds values will also alter the generated mystery container price
|
|
||||||
//
|
|
||||||
// - ammo_min: (Whole numbers only, no decimals)
|
|
||||||
// - The minimum amount of rounds generated during a mystery ammo opening, is also used as a calculation by the Automatic Price Balancer when determining the mystery ammo price
|
|
||||||
// - ammo_max: (Whole numbers only, no decimals)
|
|
||||||
// - The maximum amount of rounds generated during a mystery ammo opening, is also used as a calculation by the Automatic Price Balancer when determining the mystery ammo price
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Loadout Mystery Container Odds:
|
|
||||||
// - Currently the Mystery Loadout Container uses many of the below containers to generate a loadout, so manipulating any of these odds will also manipulate the loadout container generation in some way.
|
|
||||||
// I plan on changing this in the future to have more specific odds for the loadout container, but for now, this is how it works.
|
|
||||||
//
|
|
||||||
//
|
|
||||||
"odds": {
|
|
||||||
// Mystery Wallet
|
|
||||||
// Chance for each possibility in percentage from rarest to most common
|
|
||||||
"wallet_kinda_rare": 2.5, // 2 Million Roubles
|
|
||||||
"wallet_rare": 5.0, // 1 Million Roubles
|
|
||||||
"wallet_extra_uncommon": 7.5, // 500k Roubles
|
|
||||||
"wallet_more_uncommon": 10.0, // 250k Roubles
|
|
||||||
"wallet_uncommon": 15.0, // 100k Roubles
|
|
||||||
"wallet_common": 20.0, // 50k Roubles
|
|
||||||
"wallet_extra_common": 20.0, // 25K Roubles
|
|
||||||
"wallet_base": 20.0, // 0k Roubles
|
|
||||||
"wallet_profit_percentage": 0.95, //Container Profitability
|
|
||||||
|
|
||||||
// 100k Coin Flip
|
|
||||||
"100k_success": 50.0, // 200K Roubles
|
|
||||||
"100k_failure": 50.0, // 0 Roubles
|
|
||||||
|
|
||||||
// 500k Coin Flip
|
|
||||||
"500k_success": 50.0, // 1 Million Roubles
|
|
||||||
"500k_failure": 50.0, // 0 Roubles
|
|
||||||
|
|
||||||
// 1 Million Coin Flip
|
|
||||||
"1mil_success": 50.0, // 2 Million Roubles
|
|
||||||
"1mil_failure": 50.0, // 0 Roubles
|
|
||||||
|
|
||||||
// Mystery Keycard
|
|
||||||
"keycard_red": 0.1, // Red Keycard
|
|
||||||
"keycard_green": 0.2, // Green Keycard
|
|
||||||
"keycard_blue": 0.4, // Blue Keycard
|
|
||||||
"keycard_violet": 1.0, // Violet Keycard
|
|
||||||
"keycard_black": 2.0, // Black Keycard
|
|
||||||
"keycard_yellow": 3.0, // Yellow Keycard
|
|
||||||
"keycard_blue_marking": 4.0, // Keycard with blue marking
|
|
||||||
"keycard_21WS": 8.0, // 21WS Keycard
|
|
||||||
"keycard_11SR": 8.0, // 11SR Keycard
|
|
||||||
"keycard_access": 40.0, // Access Keycard
|
|
||||||
"keycard_profit_percentage": 0.93, // Container Profitability
|
|
||||||
|
|
||||||
|
|
||||||
// Mystery Key
|
|
||||||
"key_extremely_rare": 0.5, // Extremely Rare Key
|
|
||||||
"key_rare": 2.5, // Rare Key
|
|
||||||
"key_uncommon": 24.5, // Uncommon Key
|
|
||||||
"key_common": 72.5, // Common Key
|
|
||||||
"key_profit_percentage": 0.93,// Container Profitability
|
|
||||||
|
|
||||||
// Mystery Stimulant
|
|
||||||
"stim_extremely_rare": 10.0, // Extremely Rare Key
|
|
||||||
"stim_rare": 15.0, // Rare Stim
|
|
||||||
"stim_uncommon": 25.0, // Uncommon Stim
|
|
||||||
"stim_common": 50.0, // Common Stim
|
|
||||||
"stim_profit_percentage": 0.93,// Container Profitability
|
|
||||||
|
|
||||||
// Mystery Medical Box
|
|
||||||
"medical_rare": 12.0, // Rare Meds
|
|
||||||
"medical_uncommon": 30.0, // Uncommon Meds
|
|
||||||
"medical_common": 58.0, // Common Meds
|
|
||||||
"medical_profit_percentage": 1.00,// Container Profitability DOESN'T WORK AS THIS CONTAINER IS BOUGHT BY BARTER
|
|
||||||
|
|
||||||
// Mystery Food
|
|
||||||
"food_rare": 5.0, // Rare Food
|
|
||||||
"food_uncommon": 35.0, // Uncommon Food
|
|
||||||
"food_common": 60.0, // Common Food
|
|
||||||
"food_profit_percentage": 0.88,// Container Profitability
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// The following odds are for the Mystery Loadout Generation
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
// Loadout Grenade
|
|
||||||
// Chance for receiving Grenade with loadout
|
|
||||||
"loadout_grenade_rare": 30.0, // Rare Loadout Grenade supply
|
|
||||||
"loadout_grenade_uncommon": 40.0, // Uncommon Loadout Grenade supply
|
|
||||||
"loadout_grenade_common": 30.0, // Common Loadout Grenade supply
|
|
||||||
|
|
||||||
// Loadout facecovers
|
|
||||||
// Chance for receiving facecover with loadout
|
|
||||||
"loadout_facecovers_rare": 30.0, // Rare Loadout facecover supply
|
|
||||||
"loadout_facecovers_uncommon": 40.0, // Uncommon Loadout facecover supply
|
|
||||||
"loadout_facecovers_common": 30.0, // Common Loadout facecover supply
|
|
||||||
|
|
||||||
// Loadout Food
|
|
||||||
// Chance for receiving food with loadout
|
|
||||||
"loadout_food_rare": 30.0, // Rare Loadout Food supply
|
|
||||||
"loadout_food_uncommon": 40.0, // Uncommon Loadout Food supply
|
|
||||||
"loadout_food_common": 30.0, // Common Loadout Food supply
|
|
||||||
|
|
||||||
// Loadout Drink
|
|
||||||
// Chance for receiving drink with loadout
|
|
||||||
"loadout_drink_rare": 30.0, // Rare Loadout Drink supply
|
|
||||||
"loadout_drink_uncommon": 40.0, // Uncommon Loadout Drink supply
|
|
||||||
"loadout_drink_common": 30.0, // Common Loadout Drink supply
|
|
||||||
|
|
||||||
// Loadout Light Bleed
|
|
||||||
"loadout_light_bleed_rare": 30, // Rare Loadout Light Bleed supply
|
|
||||||
"loadout_light_bleed_uncommon": 40, // Uncommon Loadout Light Bleed supply
|
|
||||||
"loadout_light_bleed_common": 30, // Common Loadout Light Bleed supply
|
|
||||||
|
|
||||||
// Loadout Heavy Bleed
|
|
||||||
"loadout_heavy_bleed_rare": 30, // Rare Loadout heavy Bleed supply
|
|
||||||
"loadout_heavy_bleed_uncommon": 40, // Uncommon Loadout heavy Bleed supply
|
|
||||||
"loadout_heavy_bleed_common": 30, // Common Loadout heavy Bleed supply
|
|
||||||
|
|
||||||
// Loadout Stim
|
|
||||||
"loadout_stim_rare": 30, // Rare Loadout Stim supply
|
|
||||||
"loadout_stim_uncommon": 40, // Uncommon Loadout Stim supply
|
|
||||||
"loadout_stim_common": 30, // Common Loadout Stim supply
|
|
||||||
|
|
||||||
// Loadout Splint
|
|
||||||
"loadout_splint_rare": 30, // Rare Loadout Splint supply
|
|
||||||
"loadout_splint_uncommon": 40, // Uncommon Loadout Splint supply
|
|
||||||
"loadout_splint_common": 30, // Common Loadout Splint supply
|
|
||||||
|
|
||||||
// Loadout Headling
|
|
||||||
"loadout_healing_rare": 30, // Rare Loadout headling supply
|
|
||||||
"loadout_healing_uncommon": 40, // Uncommon Loadout headling supply
|
|
||||||
"loadout_healing_common": 30, // Common Loadout headling supply
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
// 5,000,000 Roubles 50/50
|
|
||||||
"roubles_success": 50.0, // 50/50 Success
|
|
||||||
"roubles_failure": 50.0, // 50/50 Failure
|
|
||||||
|
|
||||||
// Mystery Bitcoin 50/50
|
|
||||||
"bitcoin_success": 50.0, // Two Bitcoins
|
|
||||||
"bitcoin_failure": 50.0, // Two Bitcoins
|
|
||||||
|
|
||||||
// Mystery GP Coin 50/50
|
|
||||||
"gpcoin_success": 50.0, // Two Bitcoins
|
|
||||||
"gpcoin_failure": 50.0, // Two Bitcoins
|
|
||||||
|
|
||||||
// Mystery Melee
|
|
||||||
"melee_extremely_rare": 0.25, // Extremely Rare melee
|
|
||||||
"melee_rare": 2.0, // Rare melee
|
|
||||||
"melee_uncommon": 22.75, // Uncommon melee
|
|
||||||
"melee_common": 75.0, // Common melee
|
|
||||||
"melee_profit_percentage": 0.92, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery Backpack
|
|
||||||
"backpack_extremely_rare": 5.0, // Extremely Rare backpack
|
|
||||||
"backpack_rare": 20.0, // Rare backpack
|
|
||||||
"backpack_uncommon": 35.0, // Uncommon backpack
|
|
||||||
"backpack_common": 40.0, // Common backpack
|
|
||||||
"backpack_profit_percentage": 0.86, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery Tactical Rig
|
|
||||||
"rig_boss": 5.0, // Extremely Rare rig
|
|
||||||
"rig_late_wipe": 30.0, // Rare rig
|
|
||||||
"rig_early_wipe": 40.0, // Uncommon rig
|
|
||||||
"rig_scav": 25.0, // Common rig
|
|
||||||
"rig_profit_percentage": 0.93, // Container Profitability
|
|
||||||
|
|
||||||
// Weapon Mystery Box
|
|
||||||
"weapon_meta": 20.0, // Meta Weapon
|
|
||||||
"weapon_decent": 30.0, // Semi-modded Weapon
|
|
||||||
"weapon_scav": 22.3, // Scav Weapon
|
|
||||||
"weapon_meme": 7.7, // Meme Weapon
|
|
||||||
"weapon_base": 20.0, // Default Weapon
|
|
||||||
"weapon_profit_percentage": 0.74, // Container Profitability
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
// These settings do not work yet...
|
|
||||||
// Default Weapon Mystery Box
|
|
||||||
//"default_weapon_base": 100.0, // Default Weapon
|
|
||||||
//"default_weapon_profit_percentage": 0.80, // Container Profitability
|
|
||||||
|
|
||||||
// Average Weapon Mystery Box
|
|
||||||
//"average_weapon_meta": 22.0, // Meta Weapon
|
|
||||||
//"average_weapon_decent": 75.0, // Semi-modded Weapon
|
|
||||||
//"average_weapon_profit_percentage": 0.78, // Container Profitability
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Premium Weapon Mystery Box
|
|
||||||
"premium_weapon_meta": 100.0, // Rare Weapon
|
|
||||||
"premium_weapon_profit_percentage": 0.74, // Container Profitability
|
|
||||||
|
|
||||||
|
|
||||||
// Mystery Helmet
|
|
||||||
"helmet_extremely_rare": 0.25, // Extremely Rare Helmet
|
|
||||||
"helmet_rare": 17.5, // Rare Helmet
|
|
||||||
"helmet_uncommon": 27.65, // Uncommon Helmet
|
|
||||||
"helmet_common": 54.65, // Common Helmet
|
|
||||||
"helmet_profit_percentage": 0.85, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery Headset
|
|
||||||
"headset_rare": 15.0, // Rare Headset
|
|
||||||
"headset_uncommon": 40.0, // Uncommon Headset
|
|
||||||
"headset_common": 45.0, // Common Headset
|
|
||||||
"headset_profit_percentage": 0.93, // Container Profitability
|
|
||||||
|
|
||||||
// Armor Mystery Box
|
|
||||||
"armor_rare": 20.0, // Rare Armor
|
|
||||||
"armor_uncommon": 40.0, // Uncommon Armor
|
|
||||||
"armor_common": 40.5, // Common Armor
|
|
||||||
"armor_profit_percentage": 0.90, // Container Profitability
|
|
||||||
|
|
||||||
// Premium Armor Mystery Box
|
|
||||||
"premium_armor_rare": 100.0, // Rare Armor
|
|
||||||
"premium_armor_profit_percentage": 0.88, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery 7.62x25 NOT SOLD BY TRADER CURRENTLY, ONLY USED FOR LOADOUT AMMO GENERATION
|
|
||||||
"7.62x25_common": 45.0, // Common Round 7.62x25
|
|
||||||
"7.62x25_uncommon": 35.0, // Uncommon Round 7.62x25
|
|
||||||
"7.62x25_rare": 20.0, // Rare Round 7.62x25
|
|
||||||
"7.62x25_min": 15, // Minimum Rounds Generated
|
|
||||||
"7.62x25_max": 30, // Maximum Rounds Generated
|
|
||||||
"7.62x25_profit_percentage": 1.00,// Container Profitability
|
|
||||||
|
|
||||||
// Mystery 9x18
|
|
||||||
"9x18_common": 45.0, // Common Round 9x18mm
|
|
||||||
"9x18_uncommon": 35.0, // Uncommon Round 9x18mm
|
|
||||||
"9x18_rare": 20.0, // Rare Round 9x18mm
|
|
||||||
"9x18_min": 15, // Minimum Rounds Generated
|
|
||||||
"9x18_max": 30, // Maximum Rounds Generated
|
|
||||||
"9x18_profit_percentage": 1.00, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery 9x19
|
|
||||||
"9x19_common": 45.0, // Common Round 9x19
|
|
||||||
"9x19_uncommon": 35.0, // Uncommon Round 9x19
|
|
||||||
"9x19_rare": 20.0, // Rare Round 9x19
|
|
||||||
"9x19_min": 15, // Minimum Rounds Generated
|
|
||||||
"9x19_max": 30, // Maximum Rounds Generated
|
|
||||||
"9x19_profit_percentage": 0.96, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery 9x21
|
|
||||||
"9x21_common": 45.0, // Common Round 9x21
|
|
||||||
"9x21_uncommon": 35.0, // Uncommon Round 9x21
|
|
||||||
"9x21_rare": 20.0, // Rare Round 9x21
|
|
||||||
"9x21_min": 15, // Minimum Rounds Generated
|
|
||||||
"9x21_max": 30, // Maximum Rounds Generated
|
|
||||||
"9x21_profit_percentage": 0.94, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery .357
|
|
||||||
".357_common": 45.0, // Common Round .357
|
|
||||||
".357_uncommon": 35.0, // Uncommon Round .357
|
|
||||||
".357_rare": 20.0, // Rare Round .357
|
|
||||||
".357_min": 3, // Minimum Rounds Generated
|
|
||||||
".357_max": 10, // Maximum Rounds Generated
|
|
||||||
".357_profit_percentage": 2.0, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery .45_ACP
|
|
||||||
".45_common": 45.0, // Common Round .45
|
|
||||||
".45_uncommon": 35.0, // Uncommon Round .45
|
|
||||||
".45_rare": 20.0, // Rare Round .45
|
|
||||||
".45_min": 15, // Minimum Rounds Generated
|
|
||||||
".45_max": 30, // Maximum Rounds Generated
|
|
||||||
".45_profit_percentage": 1.04, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery 4.6x30
|
|
||||||
"4.6x30_common": 45.0, // Common Round 4.6x30
|
|
||||||
"4.6x30_uncommon": 35.0, // Uncommon Round 4.6x30
|
|
||||||
"4.6x30_rare": 20.0, // Rare Round 4.6x30
|
|
||||||
"4.6x30_min": 15, // Minimum Rounds Generated
|
|
||||||
"4.6x30_max": 30, // Maximum Rounds Generated
|
|
||||||
"4.6x30_profit_percentage": 1.04,// Container Profitability
|
|
||||||
|
|
||||||
// Mystery 5.7x28
|
|
||||||
"5.7x28_common": 45.0, // Common Round 5.7x28
|
|
||||||
"5.7x28_uncommon": 35.0, // Uncommon Round 5.7x28
|
|
||||||
"5.7x28_rare": 20.0, // Rare Round 5.7x28
|
|
||||||
"5.7x28_min": 15, // Minimum Rounds Generated
|
|
||||||
"5.7x28_max": 30, // Maximum Rounds Generated
|
|
||||||
"5.7x28_profit_percentage": 0.94, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery 5.45x39
|
|
||||||
"5.45x39_common": 45.0, // Common Round 5.45x39
|
|
||||||
"5.45x39_uncommon": 35.0, // Uncommon Round 5.45x39
|
|
||||||
"5.45x39_rare": 20.0, // Rare Round 5.45x39
|
|
||||||
"5.45x39_min": 15, // Minimum Rounds Generated
|
|
||||||
"5.45x39_max": 30, // Maximum Rounds Generated
|
|
||||||
"5.45x39_profit_percentage": 1.01,// Container Profitability
|
|
||||||
|
|
||||||
// Mystery 5.56x45
|
|
||||||
"5.56x45_common": 45.0, // Common Round 5.56x45
|
|
||||||
"5.56x45_uncommon": 35.0, // Uncommon Round 5.56x45
|
|
||||||
"5.56x45_rare": 20.0, // Rare Round 5.56x45
|
|
||||||
"5.56x45_min": 15, // Minimum Rounds Generated
|
|
||||||
"5.56x45_max": 30, // Maximum Rounds Generated
|
|
||||||
"5.56x45_profit_percentage": 0.94,// Container Profitability
|
|
||||||
|
|
||||||
// Mystery .300_Blackout
|
|
||||||
".300_common": 45.0, // Common Round .300
|
|
||||||
".300_uncommon": 35.0, // Uncommon Round .300
|
|
||||||
".300_rare": 20.0, // Rare Round .300
|
|
||||||
".300_min": 15, // Minimum Rounds Generated
|
|
||||||
".300_max": 30, // Maximum Rounds Generated
|
|
||||||
".300_profit_percentage": 0.95, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery 6.8x51 NOT SOLD BY TRADER CURRENTLY, ONLY USED FOR LOADOUT AMMO GENERATION
|
|
||||||
"6.8x51_common": 45.0, // Common Round 6.8x51
|
|
||||||
"6.8x51_uncommon": 25.0, // Uncommon Round 6.8x51
|
|
||||||
"6.8x51_rare": 30.0, // Rare Round 6.8x51
|
|
||||||
"6.8x51_min": 15, // Minimum Rounds Generated
|
|
||||||
"6.8x51_max": 30, // Maximum Rounds Generated
|
|
||||||
"6.8x51_profit_percentage": 0.97, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery 7.62x39
|
|
||||||
"7.62x39_common": 45.0, // Common Round 7.62x39
|
|
||||||
"7.62x39_uncommon": 35.0, // Uncommon Round 7.62x39
|
|
||||||
"7.62x39_rare": 20.0, // Rare Round 7.62x39
|
|
||||||
"7.62x39_min": 15, // Minimum Rounds Generated
|
|
||||||
"7.62x39_max": 30, // Maximum Rounds Generated
|
|
||||||
"7.62x39_profit_percentage": 0.88,// Container Profitability
|
|
||||||
|
|
||||||
// Mystery 7.62x51
|
|
||||||
"7.62x51_common": 45.0, // Common Round 7.62x51
|
|
||||||
"7.62x51_uncommon": 35.0, // Uncommon Round 7.62x51
|
|
||||||
"7.62x51_rare": 20.0, // Rare Round 7.62x51
|
|
||||||
"7.62x51_min": 15, // Minimum Rounds Generated
|
|
||||||
"7.62x51_max": 25, // Maximum Rounds Generated
|
|
||||||
"7.62x51_profit_percentage": 0.95,// Container Profitability
|
|
||||||
|
|
||||||
// Mystery 7.62x54
|
|
||||||
"7.62x54_common": 45.0, // Common Round 7.62x54
|
|
||||||
"7.62x54_uncommon": 35.0, // Uncommon Round 7.62x54
|
|
||||||
"7.62x54_rare": 20.0, // Rare Round 7.62x54
|
|
||||||
"7.62x54_min": 15, // Minimum Rounds Generated
|
|
||||||
"7.62x54_max": 25, // Maximum Rounds Generated
|
|
||||||
"7.62x54_profit_percentage": 0.90,// Container Profitability
|
|
||||||
|
|
||||||
// Mystery .338
|
|
||||||
".338_common": 62.5, // Common Round .338
|
|
||||||
".338_uncommon": 25.0, // Uncommon Round .338
|
|
||||||
".338_rare": 12.5, // Rare Round .338
|
|
||||||
".338_min": 5, // Minimum Rounds Generated
|
|
||||||
".338_max": 10, // Maximum Rounds Generated
|
|
||||||
".338_profit_percentage": 0.91, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery 9x39
|
|
||||||
"9x39_common": 45.0, // Common Round 9x39
|
|
||||||
"9x39_uncommon": 35.0, // Uncommon Round 9x39
|
|
||||||
"9x39_rare": 20.0, // Rare Round 9x39
|
|
||||||
"9x39_min": 15, // Minimum Rounds Generated
|
|
||||||
"9x39_max": 30, // Maximum Rounds Generated
|
|
||||||
"9x39_profit_percentage": 0.97, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery .366
|
|
||||||
".366_common": 45.0, // Common Round .366
|
|
||||||
".366_uncommon": 35.0, // Uncommon Round .366
|
|
||||||
".366_rare": 20.0, // Rare Round .366
|
|
||||||
".366_min": 15, // Minimum Rounds Generated
|
|
||||||
".366_max": 30, // Maximum Rounds Generated
|
|
||||||
".366_profit_percentage": 0.97, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery 12.7x55
|
|
||||||
"12.7x55_common": 45.0, // Common Round 12.7x55
|
|
||||||
"12.7x55_uncommon": 35.0, // Uncommon Round 12.7x55
|
|
||||||
"12.7x55_rare": 20.0, // Rare Round 12.7x55
|
|
||||||
"12.7x55_min": 15, // Minimum Rounds Generated
|
|
||||||
"12.7x55_max": 25, // Maximum Rounds Generated
|
|
||||||
"12.7x55_profit_percentage": 0.98,// Container Profitability
|
|
||||||
|
|
||||||
// Mystery 12/70
|
|
||||||
"12/70_common": 45.0, // Common Round 12/70
|
|
||||||
"12/70_uncommon": 35.0, // Uncommon Round 12/70
|
|
||||||
"12/70_rare": 20.0, // Rare Round 12/70
|
|
||||||
"12/70_min": 5, // Minimum Rounds Generated
|
|
||||||
"12/70_max": 10, // Maximum Rounds Generated
|
|
||||||
"12/70_profit_percentage": 1.25, // Container Profitability
|
|
||||||
|
|
||||||
// Mystery 20/70
|
|
||||||
"20/70_common": 45.0, // Common Round 20/70
|
|
||||||
"20/70_uncommon": 35.0, // Uncommon Round 20/70
|
|
||||||
"20/70_rare": 20.0, // Rare Round 20/70
|
|
||||||
"20/70_min": 5, // Minimum Rounds Generated
|
|
||||||
"20/70_max": 10, // Maximum Rounds Generated
|
|
||||||
"20/70_profit_percentage": 7.0, // Container Profitability (Rounds are extremely cheap in general)
|
|
||||||
|
|
||||||
// Mystery 23x75
|
|
||||||
"23x75_common": 45.0, // Common Round 23x75
|
|
||||||
"23x75_uncommon": 35.0, // Uncommon Round 23x75
|
|
||||||
"23x75_rare": 20.0, // Rare Round 23x75
|
|
||||||
"23x75_min": 2, // Minimum Rounds Generated
|
|
||||||
"23x75_max": 4, // Maximum Rounds Generated
|
|
||||||
"23x75_profit_percentage": 2.5 // Container Profitability
|
|
||||||
|
|
||||||
},
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// Mystery Container Automatic Price Balancer uses override prices (if applicable) instead of the items actual flea market price when generating optimal mystery container prices.
|
|
||||||
// Raising or lowering any of the values will manipulate the mystery container price in that direction
|
|
||||||
// - Why?:
|
|
||||||
// - I made this override section as I felt ammo and a few blacklisted items handbook prices were way too cheap.
|
|
||||||
// These changes are meant to help realistically balance mystery containers further.
|
|
||||||
// - Blacklisted ammo/armor should be expensive and I have created override prices reflecting this
|
|
||||||
//
|
|
||||||
// Enable or Disable override prices
|
|
||||||
// NOTE: If you use the Blacklist Mod and are satisfied with the flea market price of ammos and armors you can try setting this to 'false'
|
|
||||||
"mystery_container_override_enable": true, // Default 'true' - Automatic Balancer will use prices from "mystery_container_override_price" if applicable
|
|
||||||
// If 'false' - Automatic Balancer will only use items' flea market price (or handbook price if item is blacklisted)
|
|
||||||
|
|
||||||
"mystery_container_override_price": {
|
|
||||||
"ammo": { // Priced in Roubles
|
|
||||||
"57371aab2459775a77142f22": 205, // 9x18mm PMM PstM gzh
|
|
||||||
"573719df2459775a626ccbc2": 300, // 9x18mm PM PBM gzh
|
|
||||||
"5c0d56a986f774449d5de529": 500, // 9x19mm RIP
|
|
||||||
"5c925fa22e221601da359b7b": 450, // 9x19mm AP 6.3
|
|
||||||
"5efb0da7a29a85116f6ea05f": 1200, // 9x19mm PBP gzh
|
|
||||||
"6576f93989f0062e741ba952": 350, // 9x21mm 7U4
|
|
||||||
"5a26ac0ec4a28200741e1e18": 800, // 9x21mm BT gzh
|
|
||||||
"6576f4708ca9c4381d16cd9d": 950, // 9x21mm 7N42 "Zubilo"
|
|
||||||
"62330c18744e5e31df12f516": 260, // .357 Magnum JHP
|
|
||||||
"62330b3ed4dc74626d570b95": 300, // .357 Magnum FMJ
|
|
||||||
"5efb0d4f4bc50b58e81710f3": 110, // .45 ACP Lasermatch FMJ
|
|
||||||
"5e81f423763d9f754677bf2e": 150, // .45 ACP Match FMJ
|
|
||||||
"5efb0fc6aeb21837e749c801": 350, // .45 ACP Hydra-Shok
|
|
||||||
"5ea2a8e200685063ec28c05a": 600, // .45 ACP RIP
|
|
||||||
"5efb0cabfb3e451d70735af5": 950, // .45 ACP AP
|
|
||||||
"64b6979341772715af0f9c39": 320, // 4.6x30mm JSP SX
|
|
||||||
"5ba2678ad4351e44f824b344": 950, // 4.6x30mm FMJ SX
|
|
||||||
"5ba26835d4351e0035628ff5": 1800, // 4.6x30mm AP SX
|
|
||||||
"5cc80f67e4a949035e43bbba": 500, // 5.7x28mm SB193
|
|
||||||
"5cc80f53e4a949000e1ea4f8": 420, // 5.7x28mm L191
|
|
||||||
"5cc80f38e4a949001152b560": 700, // 5.7x28mm SS190
|
|
||||||
"56dff3afd2720bba668b4567": 200, // 5.45x39mm PS gs
|
|
||||||
"56dff2ced2720bb4668b4567": 350, // 5.45x39mm PP gs
|
|
||||||
"56dff061d2720bb5668b4567": 550, // 5.45x39mm BT gs
|
|
||||||
"56dfef82d2720bbd668b4567": 850, // 5.45x39mm BP gs
|
|
||||||
"61962b617c6c7b169525f168": 1000, // 5.45x39mm 7N40
|
|
||||||
"56dff026d2720bb8668b4567": 1350, // 5.45x39mm BS gs
|
|
||||||
"5c0d5e4486f77478390952fe": 1450, // 5.45x39mm PPBS gs "Igolnik"
|
|
||||||
"60194943740c5d77f6705eea": 500, // 5.56x45mm MK 318 Mod 0 (SOST)
|
|
||||||
"59e6906286f7746c9f75e847": 1000, // 5.56x45mm M856A1
|
|
||||||
"54527ac44bdc2d36668b4567": 1550, // 5.56x45mm M855A1
|
|
||||||
"59e690b686f7746c9f75e848": 1850, // 5.56x45mm M995
|
|
||||||
"601949593ae8f707c4608daa": 2000, // 5.56x45mm SSA AP
|
|
||||||
"5fbe3ffdf8b6a877a729ea82": 340, // .300 Blackout BCP FMJ
|
|
||||||
"619636be6db0f2477964e710": 800, // .300 Blackout M62 Tracer
|
|
||||||
"64b8725c4b75259c590fa899": 1100, // .300 Blackout CBJ
|
|
||||||
"5fd20ff893a8961fc660a954": 1400, // .300 Blackout AP
|
|
||||||
"5656d7c34bdc2d9d198b4587": 315, // 7.62x39mm PS gzh
|
|
||||||
"64b7af434b75259c590fa893": 650, // 7.62x39mm PP gzh
|
|
||||||
"59e0d99486f7744a32234762": 1500, // 7.62x39mm BP gzh
|
|
||||||
"601aa3d2b2bcb34913271e6d": 1650, // 7.62x39mm MAI AP
|
|
||||||
"58dd3ad986f77403051cba8f": 600, // 7.62x51mm M80
|
|
||||||
"5a608bf24f39f98ffc77720e": 850, // 7.62x51mm M62 Tracer
|
|
||||||
"5a6086ea4f39f99cd479502f": 2250, // 7.62x51mm M61
|
|
||||||
"5efb0c1bd79ff02a1f5e68d9": 2500, // 7.62x51mm M993
|
|
||||||
"5e023d34e8a400319a28ed44": 1500, // 7.62x54mm R BT gzh
|
|
||||||
"560d61e84bdc2da74d8b4571": 2000, // 7.62x54mm R SNB gzh
|
|
||||||
"5e023d48186a883be655e551": 2500, // 7.62x54mm R BS gs
|
|
||||||
"5fc382a9d724d907e2077dab": 50000,// .338 Lapua Magnum AP
|
|
||||||
"57a0dfb82459774d3078b56c": 239, // 9x39mm SP-5 gs
|
|
||||||
"5c0d668f86f7747ccb7f13b2": 517, // 9x39mm SPP gs
|
|
||||||
"61962d879bb3d20b0946d385": 850, // 9x39mm PAB-9 gs
|
|
||||||
"57a0e5022459774d1673f889": 1450, // 9x39mm SP-6 gs
|
|
||||||
"5c0d688c86f77413ae3407b2": 1600, // 9x39mm BP gs
|
|
||||||
"59e655cb86f77411dc52a77b": 150, // .366 TKM EKO
|
|
||||||
"5f0596629e22f464da6bbdd9": 1250, // .366 TKM AP-M
|
|
||||||
"5cadf6e5ae921500113bb973": 250, // 12.7x55mm PS12A // Prapor LL2
|
|
||||||
"5cadf6ddae9215051e1c23b2": 400, // 12.7x55mm PS12
|
|
||||||
"5cadf6eeae921500134b2799": 2250, // 12.7x55mm PS12B
|
|
||||||
"5d6e6806a4b936088465b17e": 670, // 12/70 8.5mm Magnum buckshot
|
|
||||||
"64b8ee384b75259c590fa89b": 403, // 12/70 Piranha
|
|
||||||
"5d6e6911a4b9361bd5780d52": 800, // 12/70 flechette
|
|
||||||
"5c0d591486f7744c505b416f": 900, // 12/70 RIP
|
|
||||||
"5d6e68c4a4b9361b93413f79": 600, // 12/70 makeshift .50 BMG slug
|
|
||||||
"5d6e68a8a4b9360b6c0d54e2": 1250, // 12/70 AP-20 armor-piercing slug
|
|
||||||
"5d6e69b9a4b9361bc8618958": 95, // 20/70 6.2mm buckshot
|
|
||||||
"5d6e6a5fa4b93614ec501745": 250, // 20/70 Devastator slug
|
|
||||||
"5d6e6a05a4b93618084f58d0": 120, // 20/70 Star slug
|
|
||||||
"5d6e6a42a4b9364f07165f52": 100, // 20/70 "Poleva-6u" slug
|
|
||||||
"5e85a9f4add9fe03027d9bf1": 4000, // 23x75mm Zvezda flashbang round
|
|
||||||
"5f647f31b6238e5dd066e196": 240, // 23x75mm Shrapnel-25 buckshot
|
|
||||||
"5e85a9a6eacf8c039e4e2ac1": 630, // 23x75mm Shrapnel-10 buckshot
|
|
||||||
"5e85aa1a988a8701445df1f5": 550 // 23x75mm Barrikada
|
|
||||||
},
|
|
||||||
"armor": {
|
|
||||||
// Uncommon Armors
|
|
||||||
"5ab8e79e86f7742d8b372e78": 175000, // BNTI Gzhel-K body armor
|
|
||||||
"63737f448b28897f2802b874": 155000, // Hexatac HPC Plate Carrier (MultiCam Black)
|
|
||||||
"5c0e655586f774045612eeb2": 165000, // HighCom Trooper TFO body armor (MultiCam)
|
|
||||||
"5ab8dced86f774646209ec87": 165000, // ANA Tactical M2 plate carrier (Digital Flora)
|
|
||||||
"5d5d87f786f77427997cfaef": 175000, // Ars Arma A18 Skanda plate carrier (MultiCam)
|
|
||||||
"544a5caa4bdc2d1a388b4568": 155000, // Crye Precision AVS plate carrier (Ranger Green)
|
|
||||||
|
|
||||||
// Rare Armors
|
|
||||||
"60a283193cb70855c43a381d": 475000, // NFM THOR Integrated Carrier body armor
|
|
||||||
"545cdb794bdc2d3a198b456a": 400000, // 6B43 Zabralo-Sh body armor (Digital Flora)
|
|
||||||
"5ca21c6986f77479963115a7": 350000, // FORT Redut-T5 body armor (Smog)
|
|
||||||
"5b44cd8b86f774503d30cba2": 300000, // IOTV Gen4 body armor (Full Protection Kit, MultiCam)
|
|
||||||
"5c0e541586f7747fa54205c9": 295000, // 6B13 M assault armor (Killa Edition)
|
|
||||||
"5ca2151486f774244a3b8d30": 235000, // FORT Redut-M body armor
|
|
||||||
"5e4abb5086f77406975c9342": 375000, // LBT-6094A Slick Plate Carrier (Black)
|
|
||||||
"6038b4b292ec1c3103795a0b": 300000, // LBT-6094A Slick Plate Carrier (Coyote Tan)
|
|
||||||
"6038b4ca92ec1c3103795a0d": 300000, // LBT-6094A Slick Plate Carrier (Olive Drab)
|
|
||||||
"5fd4c474dd870108a754b241": 325000, // 5.11 Tactical Hexgrid plate carrier
|
|
||||||
"5e9dacf986f774054d6b89f4": 225000, // FORT Defender-2 body armor
|
|
||||||
"5b44cf1486f77431723e3d05": 215000, // IOTV Gen4 body armor (Assault Kit, MultiCam)
|
|
||||||
"5b44d0de86f774503d30cba8": 200000, // IOTV Gen4 body armor (High Mobility Kit, MultiCam)
|
|
||||||
"5b44cad286f77402a54ae7e5": 245000, // 5.11 Tactical TacTec plate carrier (Ranger Green)
|
|
||||||
"5e4ac41886f77406a511c9a8": 195000, // Ars Arma CPC MOD.1 plate carrier (A-TACS FG)
|
|
||||||
"60a3c68c37ea821725773ef5": 195000, // CQC Osprey MK4A plate carrier (Protection, MTP)
|
|
||||||
"609e860ebd219504d8507525": 235000, // Crye Precision AVS plate carrier (Tagilla Edition)
|
|
||||||
"628b9c7d45122232a872358f": 295000, // Crye Precision CPC plate carrier (Goons Edition)
|
|
||||||
"64a5366719bab53bd203bf33": 285000, // Eagle Allied Industries MBSS plate carrier (Coyote Brown)
|
|
||||||
"628b9784bcf6e2659e09b8a2": 245000, // S&S Precision PlateFrame plate carrier (Goons Edition)
|
|
||||||
"628cd624459354321c4b7fa2": 185000, // Tasmanian Tiger SK plate carrier (MultiCam Black)
|
|
||||||
"5c0e625a86f7742d77340f62": 225000 // BNTI Zhuk body armor (Digital Flora)
|
|
||||||
},
|
|
||||||
"weapon": {
|
|
||||||
"5580223e4bdc2d1c128b457f": 30179, // MP-43-1C 12ga double-barrel shotgun
|
|
||||||
"5fc3f2d5900b1d5091531e57": 151318, // TDI KRISS Vector Gen.2 9x19 submachine gun
|
|
||||||
"5b3b713c5acfc4330140bd8d": 158152, // TT-33 7.62x25 TT pistol (Golden)
|
|
||||||
"579204f224597773d619e051": 79363, // Makarov PM (t) 9x18PM pistol
|
|
||||||
"5ae08f0a5acfc408fb1398a1": 68358, // Mosin 7.62x54R bolt-action rifle (Sniper)
|
|
||||||
"59d6088586f774275f37482f": 78000, // Kalashnikov AKM 7.62x39 assault rifle
|
|
||||||
"5b0bbe4e5acfc40dc528a72d": 115192, // DS Arms SA-58 7.62x51 assault rifle
|
|
||||||
"5447a9cd4bdc2dbd208b4567": 65730, // Colt M4A1 5.56x45 assault rifle
|
|
||||||
"57c44b372459772d2b39b8ce": 135210, // AS VAL 9x39 special assault rifle
|
|
||||||
"5c07c60e0db834002330051f": 33000 // ADAR 2-15 5.56x45 carbine
|
|
||||||
},
|
|
||||||
"helmet": {
|
|
||||||
"5c110624d174af029e69734c": 4000000, // T-7 Thermal Goggles with a Night Vision mount
|
|
||||||
"5a154d5cfcdbcb001a3b00da": 120000 // Fast MT Black variant
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,96 +0,0 @@
|
||||||
{
|
|
||||||
"_id": "67b7b52a4767af842e0521d0",
|
|
||||||
"working": true,
|
|
||||||
"availableInRaid": false,
|
|
||||||
"items_buy": {
|
|
||||||
"category": [
|
|
||||||
"5422acb9af1c889c16000029",
|
|
||||||
"5448e8d04bdc2ddf718b4569"
|
|
||||||
],
|
|
||||||
"id_list": []
|
|
||||||
},
|
|
||||||
"items_buy_prohibited": {
|
|
||||||
"category": [],
|
|
||||||
"id_list": []
|
|
||||||
},
|
|
||||||
"customization_seller": false,
|
|
||||||
"name": "Gambler",
|
|
||||||
"surname": " ",
|
|
||||||
"nickname": "Gambler",
|
|
||||||
"location": "Streets of Tarkov Casino",
|
|
||||||
"avatar": "/files/trader/avatar/thegambler.jpg",
|
|
||||||
"balance_rub": 5000000,
|
|
||||||
"balance_dol": 0,
|
|
||||||
"balance_eur": 0,
|
|
||||||
"unlockedByDefault": true,
|
|
||||||
"discount": 0,
|
|
||||||
"discount_end": 0,
|
|
||||||
"buyer_up": true,
|
|
||||||
"currency": "RUB",
|
|
||||||
"nextResupply": 1615141448,
|
|
||||||
"repair": {
|
|
||||||
"availability": false,
|
|
||||||
"quality": "2",
|
|
||||||
"excluded_id_list": [],
|
|
||||||
"excluded_category": [],
|
|
||||||
"currency": "5449016a4bdc2d6f028b456f",
|
|
||||||
"currency_coefficient": 1,
|
|
||||||
"price_rate": 10
|
|
||||||
},
|
|
||||||
"insurance": {
|
|
||||||
"availability": false,
|
|
||||||
"min_payment": 0,
|
|
||||||
"min_return_hour": 0,
|
|
||||||
"max_return_hour": 0,
|
|
||||||
"max_storage_time": 99,
|
|
||||||
"excluded_category": []
|
|
||||||
},
|
|
||||||
"gridHeight": 150,
|
|
||||||
"loyaltyLevels": [{
|
|
||||||
"minLevel": 1,
|
|
||||||
"minSalesSum": 0,
|
|
||||||
"minStanding": 0,
|
|
||||||
"buy_price_coef": 38,
|
|
||||||
"repair_price_coef": 175,
|
|
||||||
"insurance_price_coef": 10,
|
|
||||||
"exchange_price_coef": 0,
|
|
||||||
"heal_price_coef": 0
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"sell_category": [
|
|
||||||
"82e7fac0b7495d72d4083356",
|
|
||||||
"ac705d3440c1407645e33579",
|
|
||||||
"dc97aee367144dc03389405d",
|
|
||||||
"7ffcc96aa06c7e90940330c5",
|
|
||||||
"e8f46e3ad74b9d862121f9dc",
|
|
||||||
"5b47574386f77428ca22b33e",
|
|
||||||
"5b47574386f77428ca22b33f",
|
|
||||||
"5b5f78dc86f77409407a7f8e",
|
|
||||||
"5b47574386f77428ca22b346",
|
|
||||||
"5b47574386f77428ca22b340",
|
|
||||||
"5b47574386f77428ca22b344",
|
|
||||||
"5b47574386f77428ca22b342",
|
|
||||||
"5b47574386f77428ca22b341",
|
|
||||||
"5b47574386f77428ca22b345",
|
|
||||||
"5b47574386f77428ca22b343",
|
|
||||||
"5b5f71b386f774093f2ecf11",
|
|
||||||
"5b5f71c186f77409407a7ec0",
|
|
||||||
"5b5f71de86f774093f2ecf13",
|
|
||||||
"5b5f724186f77447ed5636ad",
|
|
||||||
"5b5f736886f774094242f193",
|
|
||||||
"5b5f73ec86f774093e6cb4fd",
|
|
||||||
"5b5f74cc86f77447ec5d770a",
|
|
||||||
"5b5f750686f774093e6cb503",
|
|
||||||
"5b5f751486f77447ec5d770c",
|
|
||||||
"5b5f752e86f774093e6cb505",
|
|
||||||
"5b5f754a86f774094242f19b",
|
|
||||||
"5b5f755f86f77447ec5d770e",
|
|
||||||
"5b5f757486f774093e6cb507",
|
|
||||||
"5b5f75b986f77447ec5d7710",
|
|
||||||
"5b5f75c686f774094242f19f",
|
|
||||||
"5b5f75e486f77447ec5d7712",
|
|
||||||
"5b5f760586f774093e6cb509",
|
|
||||||
"5b5f761f86f774094242f1a1",
|
|
||||||
"5b5f764186f77447ec5d7714"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
{
|
|
||||||
"name": "GamblerTrader",
|
|
||||||
"version": "0.2.8",
|
|
||||||
"sptVersion": "~3.11",
|
|
||||||
"loadBefore": [],
|
|
||||||
"loadAfter": ["zzDrakiaXYZ-LiveFleaPrices", "platinum-theblacklist"],
|
|
||||||
"incompatibilities": [],
|
|
||||||
"isBundleMod": false,
|
|
||||||
"main": "src/mod.js",
|
|
||||||
"scripts": {
|
|
||||||
"setup": "npm i",
|
|
||||||
"build": "node ./build.mjs",
|
|
||||||
"buildinfo": "node ./build.mjs --verbose"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "20.11",
|
|
||||||
"@typescript-eslint/eslint-plugin": "7.2",
|
|
||||||
"@typescript-eslint/parser": "7.2",
|
|
||||||
"archiver": "^6.0",
|
|
||||||
"eslint": "8.57",
|
|
||||||
"fs-extra": "11.2",
|
|
||||||
"ignore": "^5.2",
|
|
||||||
"tsyringe": "4.8.0",
|
|
||||||
"typescript": "5.4",
|
|
||||||
"winston": "3.12"
|
|
||||||
},
|
|
||||||
"author": "Hood",
|
|
||||||
"contributors": [],
|
|
||||||
"license": "MIT"
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 64 KiB |
|
|
@ -1,414 +0,0 @@
|
||||||
import { DependencyContainer } from "tsyringe";
|
|
||||||
import { ILogger } from "@spt/models/spt/utils/ILogger";
|
|
||||||
import { RandomUtil } from "@spt/utils/RandomUtil";
|
|
||||||
import { HashUtil } from "@spt/utils/HashUtil";
|
|
||||||
import { IAddItemDirectRequest } from "@spt/models/eft/inventory/IAddItemsDirectRequest";
|
|
||||||
import { Item } from "../common/tables/IItem";
|
|
||||||
|
|
||||||
|
|
||||||
import { ItemCreator } from "./itemCreator";
|
|
||||||
import { Keys } from "./containers/keys";
|
|
||||||
import { Stims } from "./containers/Stims";
|
|
||||||
import { Backpacks } from "./containers/Backpacks";
|
|
||||||
import { Rigs } from "./containers/Rigs";
|
|
||||||
import { Headsets } from "./containers/Headsets";
|
|
||||||
import { Ammo } from "./containers/Ammo";
|
|
||||||
import { Melees } from "./containers/Melees";
|
|
||||||
import { MysteryContainer } from "./MysteryContainer";
|
|
||||||
import { Foods } from "./containers/Foods";
|
|
||||||
|
|
||||||
|
|
||||||
export class Gamble {
|
|
||||||
|
|
||||||
public newItemsRequest: IAddItemDirectRequest;
|
|
||||||
public name: string;
|
|
||||||
private count: number;
|
|
||||||
private mysteryContainer: MysteryContainer;
|
|
||||||
private currentID: string;
|
|
||||||
private currentCaliber: string;
|
|
||||||
private currentMagazine: string;
|
|
||||||
private currentMagazineMaxAmmo: number;
|
|
||||||
private currentWeaponType: string;
|
|
||||||
private currentHeadsetCompatible: boolean;
|
|
||||||
private container: DependencyContainer;
|
|
||||||
private hashUtil: HashUtil;
|
|
||||||
private logger: ILogger;
|
|
||||||
private randomUtil: RandomUtil;
|
|
||||||
private config: any;
|
|
||||||
|
|
||||||
constructor(container: DependencyContainer, config: any, logger: ILogger, name :string){
|
|
||||||
this.name = name.replace('gambling_', '');
|
|
||||||
this.logger = logger;
|
|
||||||
this.container = container;
|
|
||||||
this.config = config;
|
|
||||||
this.count = 0;
|
|
||||||
this.randomUtil = container.resolve<RandomUtil>("RandomUtil");
|
|
||||||
this.hashUtil = container.resolve<HashUtil>("HashUtil");
|
|
||||||
this.mysteryContainer = new MysteryContainer(config, logger);
|
|
||||||
this.newItemsRequest = {
|
|
||||||
itemsWithModsToAdd: [],
|
|
||||||
foundInRaid: true,
|
|
||||||
useSortingTable : true
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public newGamble(name: string = this.name, roll: number = this.randomUtil.getFloat(0,100)): []{
|
|
||||||
//console.log('NEW GAMBLE: Creating ' + name + ' roll = ' + roll)
|
|
||||||
|
|
||||||
switch(name){
|
|
||||||
case 'wallet':
|
|
||||||
case '100k':
|
|
||||||
case '500k':
|
|
||||||
case '1mil':
|
|
||||||
case 'roubles':
|
|
||||||
case 'bitcoin':
|
|
||||||
case 'gpcoin':
|
|
||||||
case 'keycard':
|
|
||||||
case 'key':
|
|
||||||
case 'stim':
|
|
||||||
case 'medical':
|
|
||||||
case 'food':
|
|
||||||
case 'loadout_grenade':
|
|
||||||
case 'loadout_facecovers':
|
|
||||||
case 'loadout_food':
|
|
||||||
case 'loadout_drink':
|
|
||||||
case 'loadout_light_bleed':
|
|
||||||
case 'loadout_heavy_bleed':
|
|
||||||
case 'loadout_stim':
|
|
||||||
case 'loadout_splint':
|
|
||||||
case 'loadout_healing':
|
|
||||||
case 'melee':
|
|
||||||
case 'headset':
|
|
||||||
case 'backpack':
|
|
||||||
case 'rig':
|
|
||||||
case '7.62x25':
|
|
||||||
case '9x18':
|
|
||||||
case '9x19':
|
|
||||||
case '9x21':
|
|
||||||
case '.357':
|
|
||||||
case '.45':
|
|
||||||
case '4.6x30':
|
|
||||||
case '5.7x28':
|
|
||||||
case '5.45x39':
|
|
||||||
case '5.56x45':
|
|
||||||
case '.300':
|
|
||||||
case '6.8x51':
|
|
||||||
case '7.62x39':
|
|
||||||
case '7.62x51':
|
|
||||||
case '7.62x54':
|
|
||||||
case '.338':
|
|
||||||
case '9x39':
|
|
||||||
case '.366':
|
|
||||||
case '12.7x55':
|
|
||||||
case '12/70':
|
|
||||||
case '20/70':
|
|
||||||
case '23x75':
|
|
||||||
this.openReward(name, roll);
|
|
||||||
break;
|
|
||||||
case 'weapon':
|
|
||||||
case 'average_weapon':
|
|
||||||
case 'default_weapon':
|
|
||||||
case 'premium_weapon':
|
|
||||||
case 'helmet':
|
|
||||||
case 'armor':
|
|
||||||
case 'premium_armor':
|
|
||||||
this.openPreset(name, roll);
|
|
||||||
break;
|
|
||||||
case 'loadout':
|
|
||||||
this.openLoadoutContainer(name);
|
|
||||||
break;
|
|
||||||
case 'premium_loadout':
|
|
||||||
this.openLoadoutContainer(name, 10.0);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
this.logger.error(`[GamblerTrader] This Mystery Container Doesn't exist! Contact Author!`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.mysteryContainer.isAmmo(this.name)) {
|
|
||||||
this.newItemsRequest.foundInRaid = this.config.container_config["all_ammo_rewards_found_in_raid_status"];
|
|
||||||
} else {
|
|
||||||
this.newItemsRequest.foundInRaid = this.config.container_config[this.name + "_rewards_found_in_raid_status"];
|
|
||||||
}
|
|
||||||
return this.newItemsRequest;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Opens all rewards from the loadout container
|
|
||||||
private openLoadoutContainer(name: string = this.name, roll: number = this.randomUtil.getFloat(0,100)){ // 74.3 - 82 is meme // 82 MAX
|
|
||||||
this.logger.info(`[GamblerTrader][${name}] The container roll is: ${roll}!`);
|
|
||||||
const rewards = this.mysteryContainer.getGuaranteedRewards(name);
|
|
||||||
const randomness = this.mysteryContainer.getGuaranteedRandomness(name);
|
|
||||||
let currentCaliber: string, currentMagazine: string, currentMagazineMaxAmmo: number, currentWeaponType : string;
|
|
||||||
|
|
||||||
if (roll > 90) { // _scav
|
|
||||||
roll = this.randomUtil.getFloat(44.3, 74.3);
|
|
||||||
//roll = 65;
|
|
||||||
} else if (roll > 82) { // _decent
|
|
||||||
roll = this.randomUtil.getFloat(19.3, 44.3);
|
|
||||||
//roll = 38;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(let i = 0; i < rewards.length; i++) {
|
|
||||||
const current = rewards[i];
|
|
||||||
|
|
||||||
if (this.mysteryContainer.getName(current)) { // Rewards is a container
|
|
||||||
|
|
||||||
if(currentWeaponType == '_meme') {
|
|
||||||
this.newGamble(current, this.randomUtil.getFloat(5,65));
|
|
||||||
|
|
||||||
} else if (this.currentWeaponType == '_meta') {
|
|
||||||
|
|
||||||
this.newGamble(current, this.randomUtil.getFloat(5,25));
|
|
||||||
|
|
||||||
} else if (this.currentWeaponType == '_decent') {
|
|
||||||
|
|
||||||
this.newGamble(current, this.randomUtil.getFloat(12,50));
|
|
||||||
|
|
||||||
}else if (this.currentWeaponType == '_scav') {
|
|
||||||
|
|
||||||
this.newGamble(current, this.randomUtil.getFloat(35,70));
|
|
||||||
|
|
||||||
}else{
|
|
||||||
if (randomness[i]) {
|
|
||||||
this.newGamble(current);
|
|
||||||
} else {
|
|
||||||
this.newGamble(current, roll);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(current === 'helmet') {
|
|
||||||
if (!this.currentHeadsetCompatible) {
|
|
||||||
i++; // Skip the headset reward
|
|
||||||
} else if (this.mysteryContainer.items['helmet'].headset_incompatible_helmets.includes(this.currentID)) {
|
|
||||||
i++; // Skip the headset reward
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (current === 'headset'){
|
|
||||||
if (this.currentID == '5c06c6a80db834001b735491') {
|
|
||||||
this.openReward('headset', roll, '5c06c6a80db834001b735491', false, 1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (current === 'armor'){
|
|
||||||
const currentID = this.currentID;
|
|
||||||
let truth = false;
|
|
||||||
if (currentID) {
|
|
||||||
truth = true;
|
|
||||||
}
|
|
||||||
if (currentID && this.mysteryContainer.items['armor'].armor_rigs.includes(currentID)) {
|
|
||||||
i++; // Skip the rig reward
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(current === 'weapon') { // Ammo and Magazine generation
|
|
||||||
currentCaliber = this.currentCaliber;
|
|
||||||
currentMagazine = this.currentMagazine;
|
|
||||||
currentMagazineMaxAmmo = this.currentMagazineMaxAmmo
|
|
||||||
currentWeaponType = this.currentWeaponType;
|
|
||||||
let magazineCount = 3;
|
|
||||||
|
|
||||||
const badMagazines = [
|
|
||||||
'633ec6ee025b096d320a3b15', // RSh-12 12.7x55 5-round cylinder
|
|
||||||
'5ae0973a5acfc4001562206c', // Mosin Rifle 7.62x54R 5-round magazine
|
|
||||||
'587df3a12459772c28142567' // SKS 7.62x39 10-round internal box magazine
|
|
||||||
]
|
|
||||||
|
|
||||||
//push magazines and ammo
|
|
||||||
const caliber = this.mysteryContainer.items['ammo'].BSGCalibers[currentCaliber];
|
|
||||||
if (caliber != '20x70' && caliber != '23x75' && caliber != '12/70' && caliber != '.357' && !badMagazines.includes(currentMagazine)) {
|
|
||||||
//console.log('caliber: ' + caliber + ' magazine: ' + currentMagazine)
|
|
||||||
this.openReward(caliber, roll, currentMagazine, false, 1);
|
|
||||||
this.openReward(caliber, roll, currentMagazine, false, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
let tempRoll: number;
|
|
||||||
let min, max = 0;
|
|
||||||
// Depending on the ammo type, we want to generate a different rarity of ammo from the temproll
|
|
||||||
switch(currentWeaponType) {
|
|
||||||
case '_meme':
|
|
||||||
min = 5;
|
|
||||||
max = 30;
|
|
||||||
break;
|
|
||||||
case '_decent':
|
|
||||||
min = 10;
|
|
||||||
max = 45;
|
|
||||||
break;
|
|
||||||
case '_meta':
|
|
||||||
min = 2;
|
|
||||||
max = 26;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
min = 10;
|
|
||||||
max = 90
|
|
||||||
tempRoll = roll;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (caliber == '20x70' || caliber == '23x75' || caliber == '12/70') {
|
|
||||||
currentMagazineMaxAmmo = 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
let ammoID: string;
|
|
||||||
tempRoll = this.randomUtil.getFloat(min, max); // random roll for each ammo reward
|
|
||||||
for(let i = 0; i < magazineCount; i++){
|
|
||||||
|
|
||||||
if (!ammoID) {
|
|
||||||
this.openReward(caliber, tempRoll, 'NaN', true, currentMagazineMaxAmmo);
|
|
||||||
ammoID = this.currentID;
|
|
||||||
} else {
|
|
||||||
this.openReward(caliber, tempRoll, ammoID, true, currentMagazineMaxAmmo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else { // Reward is an item
|
|
||||||
const reward_amount = this.mysteryContainer.getRewardAmount(name, i);
|
|
||||||
const stackable = this.mysteryContainer.getStackable(name, i);
|
|
||||||
|
|
||||||
if(!stackable){
|
|
||||||
//console.log('OPEN GUARANTEED REWARDS: Item exists and NOT stackable... Adding to newItemsRequest...')
|
|
||||||
for(let i = 0; i < reward_amount; i++){
|
|
||||||
this.newItemsRequest.itemsWithModsToAdd[this.count] = [this.newItemFormat(current)];
|
|
||||||
this.count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
//console.log('OPEN GUARANTEED REWARDS: Item exists and is stackable... Adding to newItemsRequest...')
|
|
||||||
this.newItemsRequest.itemsWithModsToAdd[this.count] = [this.newItemFormat(current, reward_amount)];
|
|
||||||
this.count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private openReward(name: string = this.name, roll: number = this.randomUtil.getFloat(0,100), id: string = 'NaN', stackable: boolean = false, reward_amount: number = undefined) {
|
|
||||||
this.logger.info(`[GamblerTrader][${name}] The container roll is: ${roll}!`);
|
|
||||||
const odds: Array<number> = this.mysteryContainer.getOdds(name);
|
|
||||||
let guaranteed_rewards = this.mysteryContainer.getGuaranteedRewards(name);
|
|
||||||
let reward_rolls: Array<number> = this.mysteryContainer.getRewardRolls(name);
|
|
||||||
let generatedRewards = [];
|
|
||||||
|
|
||||||
/* // Not Implemented Yet...
|
|
||||||
if (guaranteed_rewards) {
|
|
||||||
this.openGuaranteedRewards(name, roll);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// If there is no defined ID, we need to generate a random item with a determined amound of rolls for each rarity (i.e. Medical container)
|
|
||||||
if (id === "NaN" && reward_rolls) {
|
|
||||||
const rewards = this.mysteryContainer.getRewards(name);
|
|
||||||
for(let i = 0; i < rewards.length; i++) {
|
|
||||||
for(let j = 0; j < reward_rolls[i]; j++) {
|
|
||||||
const item = this.mysteryContainer.getReward(name, i);
|
|
||||||
if (item == "NaN") { // Nothing
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
this.currentID = item;
|
|
||||||
this.newItemsRequest.itemsWithModsToAdd[this.count] = [this.newItemFormat(item)];
|
|
||||||
this.count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If there is no defined ID, we need to generate random reward(s) based off property (rolls)
|
|
||||||
if (id === "NaN" && !reward_rolls) {
|
|
||||||
for(let i = 0; i < odds.length; i++) {
|
|
||||||
if(roll <= odds[i]) {
|
|
||||||
//console.log('WIN! Creating ' + name + ' index = ' + i + ' rewards = ' + this.mysteryContainer.getReward(name, i))
|
|
||||||
id = this.mysteryContainer.getReward(name, i);
|
|
||||||
this.currentID = id;
|
|
||||||
if(!reward_amount){ // determined amount to receive
|
|
||||||
reward_amount = this.mysteryContainer.getRewardAmount(name, i);
|
|
||||||
}
|
|
||||||
if(!stackable){ // Item is not stackable
|
|
||||||
stackable = this.mysteryContainer.getStackable(name, i);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if(this.config.debug) {
|
|
||||||
this.logger.info("[GamblerTrader] Weapon Mystery Box Information...");
|
|
||||||
this.logger.info(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (id !== "NaN" && !reward_rolls) {
|
|
||||||
if(!reward_amount){ // ammo has min and max amount instead of a fixed amount
|
|
||||||
reward_amount = this.mysteryContainer.getRandomAmount(name);
|
|
||||||
}
|
|
||||||
if(!stackable){
|
|
||||||
for(let i = 0; i < reward_amount; i++){
|
|
||||||
this.newItemsRequest.itemsWithModsToAdd[this.count] = [this.newItemFormat(id)];
|
|
||||||
this.count++;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.newItemsRequest.itemsWithModsToAdd[this.count] = [this.newItemFormat(id, reward_amount)];
|
|
||||||
this.count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
this.logger.info(`[GamblerTrader][${name}] Case Opened... Received Nothing... Better luck next time :)`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private openPreset(name: string = this.name, roll: number = this.randomUtil.getFloat(0,100)){
|
|
||||||
this.logger.info(`[GamblerTrader][${name}] The container roll is: ${roll}!`);
|
|
||||||
//console.log('\nopenPreset()');
|
|
||||||
// ItemCreator stores all preset creation functions
|
|
||||||
let item = new ItemCreator(this.container);
|
|
||||||
let preset: Item[] = [];
|
|
||||||
const odds: Array<number> = this.mysteryContainer.getOdds(name);
|
|
||||||
|
|
||||||
for(let i = 0; i < odds.length; i++) {
|
|
||||||
if(roll <= odds[i]) {
|
|
||||||
const parent = this.mysteryContainer.getParent(name);
|
|
||||||
preset = item.createPreset(parent, this.mysteryContainer.getRarity(parent, i));
|
|
||||||
this.currentID = preset[0]._tpl;
|
|
||||||
|
|
||||||
if (name === 'weapon' || name === 'premium_weapon') {
|
|
||||||
// Store values for possible future use
|
|
||||||
this.currentCaliber = item.caliber;
|
|
||||||
this.currentMagazine = item.magazine;
|
|
||||||
this.currentWeaponType = item.weaponType;
|
|
||||||
this.currentMagazineMaxAmmo = item.magazineMaxAmmo;
|
|
||||||
}
|
|
||||||
if (name === 'helmet') {
|
|
||||||
this.currentHeadsetCompatible = item.headsetCompatible;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(this.config.debug) {
|
|
||||||
this.logger.info("[GamblerTrader] Weapon Mystery Box Information...");
|
|
||||||
this.logger.info(preset);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (preset.length != 0) {
|
|
||||||
this.newItemsRequest.itemsWithModsToAdd[this.count] = [...preset];
|
|
||||||
this.count++;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
this.logger.info(`[GamblerTrader][Weapon] Case Opened... Received Nothing... Better luck next time :)`);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private newItemFormat(tpl: string, count = undefined) {
|
|
||||||
|
|
||||||
const item = {
|
|
||||||
_id: this.hashUtil.generate(),
|
|
||||||
_tpl: tpl,
|
|
||||||
parentId: "hideout",
|
|
||||||
slotId: "hideout",
|
|
||||||
upd: {StackObjectsCount: count ? count : 1}
|
|
||||||
}
|
|
||||||
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,338 +0,0 @@
|
||||||
import { Ammo } from "./containers/Ammo";
|
|
||||||
import { Armors } from "./containers/Armors";
|
|
||||||
import { Backpacks } from "./containers/Backpacks";
|
|
||||||
import { Foods } from "./containers/Foods";
|
|
||||||
import { Headsets } from "./containers/Headsets";
|
|
||||||
import { Helmets } from "./containers/Helmets";
|
|
||||||
import { Keycard } from "./containers/Keycard";
|
|
||||||
import { Melees } from "./containers/Melees";
|
|
||||||
import { PremiumArmors } from "./containers/PremiumArmors";
|
|
||||||
import { PremiumWeapons } from "./containers/PremiumWeapons";
|
|
||||||
import { Rigs } from "./containers/Rigs";
|
|
||||||
import { Stims } from "./containers/Stims";
|
|
||||||
import { Wallet } from "./containers/Wallet";
|
|
||||||
import { Weapons } from "./containers/Weapons";
|
|
||||||
import { Keys } from "./containers/keys";
|
|
||||||
import { FlipRouble } from "./containers/FlipRouble";
|
|
||||||
import { FlipGPCoin } from "./containers/FlipGPCoin";
|
|
||||||
import { FlipBitcoin } from "./containers/FlipBitcoin";
|
|
||||||
import { Loadouts } from "./containers/Loadouts";
|
|
||||||
import { Medical } from "./containers/Medical";
|
|
||||||
import { LoadoutFood } from "./containers/LoadoutFood";
|
|
||||||
import { Loadoutdrink } from "./containers/LoadoutDrink";
|
|
||||||
import { LoadoutLightBleed } from "./containers/LoadoutLightBleed";
|
|
||||||
import { LoadoutHeavyBleed } from "./containers/LoadoutHeavyBleed";
|
|
||||||
import { LoadoutHealing } from "./containers/LoadoutHealing";
|
|
||||||
import { LoadoutGrenade } from "./containers/LoadoutGrenade";
|
|
||||||
import { LoadoutSplit } from "./containers/LoadoutSplint";
|
|
||||||
import { LoadoutFacecovers } from "./containers/LoadoutFacecovers";
|
|
||||||
import { LoadoutStim } from "./containers/LoadoutStim";
|
|
||||||
import type { itemProps } from "./MysteryContainerInfo";
|
|
||||||
import { MysteryContainerInfo } from "./MysteryContainerInfo";
|
|
||||||
import { CoinFlip500k } from "./containers/CoinFlip500k";
|
|
||||||
import { CoinFlip100k } from "./containers/CoinFlip100k";
|
|
||||||
import { CoinFlip1Mil } from "./containers/CoinFlip1Mil";
|
|
||||||
//import { AverageWeapons } from "./containers/AverageWeapons";
|
|
||||||
//import { DefaultWeapons } from "./containers/DefaultWeapons";
|
|
||||||
|
|
||||||
class Container {
|
|
||||||
|
|
||||||
public name: string;
|
|
||||||
public parent: string
|
|
||||||
public rarities: Array<string>;
|
|
||||||
public odds: Array<number>;
|
|
||||||
public stackable: Array<boolean>;
|
|
||||||
public min: number;
|
|
||||||
public max: number;
|
|
||||||
public isAmmo: boolean;
|
|
||||||
public isPreset: boolean;
|
|
||||||
public override: {};
|
|
||||||
public rolls: number;
|
|
||||||
public rarity_average_profit: Array<number>;
|
|
||||||
public profit_percentage: number;
|
|
||||||
public guaranteed_rewards: Array<string>;
|
|
||||||
public guaranteed_stackable: Array<boolean>;
|
|
||||||
public guaranteed_reward_amount: Array<number>;
|
|
||||||
public guaranteed_randomness: Array<boolean>;
|
|
||||||
public reward_amount: Array<number>;
|
|
||||||
public reward_rolls: Array<number>;
|
|
||||||
public rewards: any;
|
|
||||||
public presets_invalid_tpls: Array<string>;
|
|
||||||
public calculate_preset_prices: boolean;
|
|
||||||
public presets: Array<string>;
|
|
||||||
|
|
||||||
constructor(name: string) {
|
|
||||||
this.name = name;
|
|
||||||
this.parent = '';
|
|
||||||
this.rarities = [];
|
|
||||||
this.odds = [];
|
|
||||||
this.stackable = [];
|
|
||||||
this.override = {};
|
|
||||||
this.rarity_average_profit = [];
|
|
||||||
this.profit_percentage = 0;
|
|
||||||
this.reward_amount = [];
|
|
||||||
this.rewards = [];
|
|
||||||
this.presets_invalid_tpls = [];
|
|
||||||
this.presets = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class MysteryContainer {
|
|
||||||
|
|
||||||
private config;
|
|
||||||
private logger;
|
|
||||||
private containers;
|
|
||||||
private containerInfo: Record<string, itemProps>;
|
|
||||||
private names;
|
|
||||||
public items;
|
|
||||||
public simulation;
|
|
||||||
public override;
|
|
||||||
|
|
||||||
constructor(config, logger){
|
|
||||||
this.config = config;
|
|
||||||
this.logger = logger;
|
|
||||||
this.containerInfo = MysteryContainerInfo(this.config);
|
|
||||||
this.names = [
|
|
||||||
'wallet', '100k', '500k', '1mil', 'keycard', 'key', 'stim', 'medical', 'food', 'melee',
|
|
||||||
'backpack', 'rig', 'weapon', 'premium_weapon', 'helmet',
|
|
||||||
'headset', 'armor', 'premium_armor', 'roubles', 'bitcoin', 'gpcoin',
|
|
||||||
'loadout', 'premium_loadout', 'loadout_grenade', 'loadout_facecovers', 'loadout_food', 'loadout_drink', 'loadout_light_bleed', 'loadout_heavy_bleed', 'loadout_stim', 'loadout_splint', 'loadout_healing', 'ammo'
|
|
||||||
];
|
|
||||||
this.simulation = [] //['armor', 'premium_armor', 'headset', 'rig', 'backpack', 'key', 'melee', 'stim', 'food', 'keycard'];
|
|
||||||
this.override = ['ammo', 'armor', 'weapon', 'helmet'];
|
|
||||||
this.items = {
|
|
||||||
wallet: new Wallet(),
|
|
||||||
'100k': new CoinFlip100k(),
|
|
||||||
'500k': new CoinFlip500k(),
|
|
||||||
'1mil': new CoinFlip1Mil(),
|
|
||||||
keycard: new Keycard(),
|
|
||||||
key: new Keys(),
|
|
||||||
stim: new Stims(),
|
|
||||||
medical: new Medical(),
|
|
||||||
food: new Foods(),
|
|
||||||
melee: new Melees(),
|
|
||||||
backpack: new Backpacks(),
|
|
||||||
rig: new Rigs(),
|
|
||||||
helmet: new Helmets(),
|
|
||||||
headset: new Headsets(),
|
|
||||||
weapon: new Weapons(),
|
|
||||||
//default_weapon: new DefaultWeapons(),
|
|
||||||
//average_weapon: new AverageWeapons(),
|
|
||||||
premium_weapon: new PremiumWeapons(),
|
|
||||||
armor: new Armors(),
|
|
||||||
premium_armor: new PremiumArmors(),
|
|
||||||
ammo: new Ammo(),
|
|
||||||
roubles: new FlipRouble(),
|
|
||||||
bitcoin: new FlipBitcoin(),
|
|
||||||
gpcoin: new FlipGPCoin(),
|
|
||||||
loadout: new Loadouts(),
|
|
||||||
premium_loadout: new Loadouts(),
|
|
||||||
loadout_grenade: new LoadoutGrenade(),
|
|
||||||
loadout_facecovers: new LoadoutFacecovers(),
|
|
||||||
loadout_food: new LoadoutFood(),
|
|
||||||
loadout_drink: new Loadoutdrink(),
|
|
||||||
loadout_light_bleed: new LoadoutLightBleed(),
|
|
||||||
loadout_heavy_bleed: new LoadoutHeavyBleed(),
|
|
||||||
loadout_stim: new LoadoutStim(),
|
|
||||||
loadout_splint: new LoadoutSplit(),
|
|
||||||
loadout_healing: new LoadoutHealing()
|
|
||||||
}
|
|
||||||
this.containers = this.setContainers()
|
|
||||||
}
|
|
||||||
|
|
||||||
private setContainers(): { [key: string]: Container } {
|
|
||||||
const containers: { [key: string]: Container } = {};
|
|
||||||
|
|
||||||
const generateAmount = (length: number, value: boolean | number) => new Array(length).fill(value);
|
|
||||||
|
|
||||||
const calculateOddsAndRewards = (container: Container, item: any) => {
|
|
||||||
for(let j = 0; j < container.rarities.length; j++){
|
|
||||||
const key = `${container.name}${container.rarities[j]}`;
|
|
||||||
|
|
||||||
if(j == 0) {
|
|
||||||
container.odds[j] = this.config.odds[key];
|
|
||||||
} else {
|
|
||||||
container.odds[j] = this.config.odds[key] + container.odds[j-1];
|
|
||||||
}
|
|
||||||
container.rewards[j] = item.rewards? [...item.rewards[j]] : []
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const applyOverrides = (container: Container, item: any, isAmmo: boolean) => {
|
|
||||||
if (this.override.includes(container.name) || isAmmo) {
|
|
||||||
container.override = this.config.mystery_container_override_price[container.parent];
|
|
||||||
container.stackable = item.stackable || generateAmount(container.rarities.length, true);
|
|
||||||
}
|
|
||||||
if (!isAmmo) {
|
|
||||||
container.reward_amount = item.reward_amount || generateAmount(container.rarities.length, 1);
|
|
||||||
container.stackable = item.stackable || generateAmount(container.rarities.length, false);
|
|
||||||
if (item.is_preset) container.isPreset = true;
|
|
||||||
} else {
|
|
||||||
container.isAmmo = true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const setContainerProperties = (container: Container, name: string, item: any) => {
|
|
||||||
container.min = this.config.odds[`${name}_min`] || 1;
|
|
||||||
container.max = this.config.odds[`${name}_max`] || 1;
|
|
||||||
container.profit_percentage = this.config.odds[`${name}_profit_percentage`];
|
|
||||||
container.presets = item.presets? [...item.presets] : [];
|
|
||||||
container.rolls = item.rolls? item.rolls : 1;
|
|
||||||
container.guaranteed_stackable = item.guaranteed_stackable? item.guaranteed_stackable : undefined;
|
|
||||||
container.guaranteed_reward_amount = item.guaranteed_reward_amount? item.guaranteed_reward_amount : undefined;
|
|
||||||
container.guaranteed_rewards = item.guaranteed_rewards? item.guaranteed_rewards : undefined;
|
|
||||||
container.guaranteed_randomness = item.guaranteed_randomness? item.guaranteed_randomness : undefined;
|
|
||||||
container.reward_rolls = item.reward_rolls? item.reward_rolls : undefined;
|
|
||||||
container.calculate_preset_prices = item.calculate_preset_prices? item.calculate_preset_prices : false;
|
|
||||||
container.presets_invalid_tpls = item.presets_invalid_tpls? item.presets_invalid_tpls : undefined;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
const createAndConfigureContainer = (name: string, item: any, isAmmo: boolean) => {
|
|
||||||
const container = new Container(name);
|
|
||||||
container.rarities = [...item.rarities];
|
|
||||||
container.parent = item.parent;
|
|
||||||
if (item.price_generate) this.simulation.push(name);
|
|
||||||
|
|
||||||
calculateOddsAndRewards(container, item);
|
|
||||||
applyOverrides(container, item, isAmmo);
|
|
||||||
setContainerProperties(container, name, item);
|
|
||||||
|
|
||||||
containers[name] = container;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.names.forEach(name => createAndConfigureContainer(name, this.items[name], false));
|
|
||||||
this.items.ammo.names.forEach(name => createAndConfigureContainer(name, this.items.ammo.items[name], true));
|
|
||||||
|
|
||||||
//console.log('THE CONTAINER!!!');
|
|
||||||
//console.log(containers);
|
|
||||||
//console.log('TO SIMULATE NAMES')
|
|
||||||
//console.log(this.simulation)
|
|
||||||
return containers;
|
|
||||||
}
|
|
||||||
|
|
||||||
// getRandomInt(3) returns 0, 1, or 2
|
|
||||||
private getRandomInt(max: number) {
|
|
||||||
return Math.floor(Math.random() * max);
|
|
||||||
}
|
|
||||||
|
|
||||||
public getName(name: string): string{
|
|
||||||
return this.containers[name].name;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns all containers that have presets to price calculate in the simulation
|
|
||||||
public getPresetNames(): Array<string>{
|
|
||||||
let names: Array<string> = [];
|
|
||||||
for(const container in this.containers){
|
|
||||||
if(this.containers[container].calculate_preset_prices){
|
|
||||||
names.push(container);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return names;
|
|
||||||
}
|
|
||||||
|
|
||||||
public getParent(name: string): string{
|
|
||||||
return this.containers[name].parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
public getOdds(name: string): Array<number>{
|
|
||||||
return this.containers[name].odds;
|
|
||||||
}
|
|
||||||
|
|
||||||
public getRarity(name: string, index: number): string{
|
|
||||||
return this.containers[name].rarities[index];
|
|
||||||
}
|
|
||||||
public getRarities(name: string): Array<string>{
|
|
||||||
return this.containers[name].rarities;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
public getOpenAll(name: string): boolean{
|
|
||||||
return this.containers[name].openAll? this.containers[name].openAll : false;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
public getGuaranteedRewards(name: string): Array<string>{
|
|
||||||
return this.containers[name].guaranteed_rewards? this.containers[name].guaranteed_rewards : undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
public getGuaranteedRewardAmount(name: string, rarityIndex: number): any {
|
|
||||||
return this.containers[name].guaranteed_reward_amount[rarityIndex];
|
|
||||||
}
|
|
||||||
|
|
||||||
public getGuaranteedStackable(name: string, rarityIndex: number): boolean {
|
|
||||||
return this.containers[name].guaranteed_stackable[rarityIndex];
|
|
||||||
}
|
|
||||||
|
|
||||||
public getGuaranteedRandomness(name: string): Array<boolean> {
|
|
||||||
return this.containers[name].guaranteed_randomness;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public getPreset(name: string, rarityIndex: number): any {
|
|
||||||
return this.containers[name].presets[rarityIndex];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns random Reward from possible Rewards
|
|
||||||
public getReward(name: string, rarityIndex: number): any {
|
|
||||||
const rewards: [] = this.containers[name].rewards[rarityIndex];
|
|
||||||
const randomNumber = this.getRandomInt(rewards.length);
|
|
||||||
return rewards[randomNumber];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the amount of rolls for each set of items in rewards
|
|
||||||
public getRewardRolls(name: string): Array<number>{
|
|
||||||
return this.containers[name].reward_rolls? this.containers[name].reward_rolls : undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns all rewards from possible rewards
|
|
||||||
public getRewards(name: string): Array<string> {
|
|
||||||
return this.containers[name].rewards;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public getRewardAmount(name: string, rarityIndex: number): any {
|
|
||||||
return this.containers[name].reward_amount[rarityIndex];
|
|
||||||
}
|
|
||||||
|
|
||||||
public getStackable(name: string, rarityIndex: number): boolean {
|
|
||||||
return this.containers[name].stackable[rarityIndex];
|
|
||||||
}
|
|
||||||
|
|
||||||
public getRandomAmount(name: string): number {
|
|
||||||
const min = this.containers[name].min;
|
|
||||||
const max = this.containers[name].max;
|
|
||||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
||||||
}
|
|
||||||
|
|
||||||
public getRarityAverageProfit(name:string): number {
|
|
||||||
return this.containers[name].rarity_average_profit;
|
|
||||||
}
|
|
||||||
|
|
||||||
public getProfitPercentage(name:string): number {
|
|
||||||
return this.containers[name].profit_percentage;
|
|
||||||
}
|
|
||||||
|
|
||||||
public getOverride(name:string, item: any): number {
|
|
||||||
return this.containers[name].override[item];
|
|
||||||
}
|
|
||||||
|
|
||||||
public setRarityAverageProfit(name:string, profit: Array<number>): void {
|
|
||||||
//return this.containers[name]['override'][item];
|
|
||||||
this.containers[name].rarity_average_profit = profit;
|
|
||||||
}
|
|
||||||
|
|
||||||
public isAmmo(name: string): boolean {
|
|
||||||
return this.containers[name].isAmmo;
|
|
||||||
}
|
|
||||||
|
|
||||||
public isPreset(name: string): boolean {
|
|
||||||
return this.containers[name].isPreset;
|
|
||||||
}
|
|
||||||
|
|
||||||
public isMysteryContainer(name: string): boolean {
|
|
||||||
return this.containerInfo[name] ? true : false;
|
|
||||||
}
|
|
||||||
|
|
||||||
getMysteryContainerId(name: string): string {
|
|
||||||
return this.containerInfo[name]._id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,657 +0,0 @@
|
||||||
export type itemProps = {
|
|
||||||
_id: string,
|
|
||||||
_name: string,
|
|
||||||
quest_id: string,
|
|
||||||
name: string,
|
|
||||||
shortName: string,
|
|
||||||
desc: string,
|
|
||||||
fleaPriceRoubles: number,
|
|
||||||
handbookPriceRoubles: number,
|
|
||||||
prefab: string,
|
|
||||||
width: number,
|
|
||||||
height: number,
|
|
||||||
barter?: Record<string, number> // barter cost object: {key=itemTpl, value=amount}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function MysteryContainerInfo(config: any): Record<string, itemProps> {
|
|
||||||
return({
|
|
||||||
wallet: {
|
|
||||||
_id: "67b7b98b4767af842e0521e7",
|
|
||||||
_name: "gambling_wallet",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3e0",
|
|
||||||
name: "Mystery Wallet",
|
|
||||||
shortName: "Mystery Wallet",
|
|
||||||
desc: `Wager your Roubles to win more or lose it all!\n==============================\n0 Roubles - ${config.odds['wallet_base']}%\n25K Roubles - ${config.odds['wallet_extra_common']}%\n50k Roubles - ${config.odds['wallet_common']}%\n100k Roubles - ${config.odds['wallet_uncommon']}%\n250k Roubles - ${config.odds['wallet_more_uncommon']}%\n500k Roubles - ${config.odds['wallet_extra_uncommon']}%\n1 Million Roubles - ${config.odds['wallet_rare']}%\n2 Million Roubles - ${config.odds['wallet_kinda_rare']}%`,
|
|
||||||
fleaPriceRoubles: 130000,
|
|
||||||
handbookPriceRoubles: 130000,
|
|
||||||
prefab: "assets/content/items/barter/item_barter_walletwz/item_barter_walletwz.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
key: {
|
|
||||||
_id: "67b7b98b4767af842e0521e8",
|
|
||||||
_name: "gambling_key",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3e1",
|
|
||||||
name: "Mystery Key",
|
|
||||||
shortName: "Mystery Key",
|
|
||||||
desc: `So you want a brand-new key to your favorite looting spot? Or maybe you're looking for that pesky quest key. We have it all! (Seriously every single key found throughout Tarkov!) Try your luck!\n==============================\nCommon Key - ${config.odds['key_common']}%\nUncommon Key - ${config.odds['key_uncommon']}%\nRare Key - ${config.odds['key_rare']}%\nExtremely Rare Key - ${config.odds['key_extremely_rare']}%`,
|
|
||||||
fleaPriceRoubles: 90000,
|
|
||||||
handbookPriceRoubles: 90000,
|
|
||||||
prefab: "assets/content/items/spec/keys/item_key_14.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
keycard: {
|
|
||||||
_id: "67b7b98b4767af842e0521e9",
|
|
||||||
_name: "gambling_keycard",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3e2",
|
|
||||||
name: "Mystery Keycard",
|
|
||||||
shortName: "Mystery Keycard",
|
|
||||||
desc: `So you want to get into labs? Well your in luck! I have a few gambles I can offer you for the right price. Maybe you get the card you've been dreaming of or maybe you don't!\n==============================\nAccess Keycard - ${config.odds['keycard_access']}%\nNothing - 33.3%\n21WS Keycard - ${config.odds['keycard_21WS']}%\n11SR Keycard - ${config.odds['keycard_11SR']}%\nKeycard with a blue marking - ${config.odds['keycard_blue_marking']}%\nYellow Keycard - ${config.odds['keycard_yellow']}%\nBlack Keycard - ${config.odds['keycard_black']}%\nViolet Keycard - ${config.odds['keycard_violet']}%\nBlue Keycard - ${config.odds['keycard_blue']}%\nGreen Keycard - ${config.odds['keycard_green']}%\nRed Keycard - ${config.odds['keycard_red']}%`,
|
|
||||||
fleaPriceRoubles: 325000,
|
|
||||||
handbookPriceRoubles: 325000,
|
|
||||||
prefab: "assets/content/items/barter/item_container_cardholder/item_container_cardholder.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
bitcoin: {
|
|
||||||
_id: "67b7b98b4767af842e0521ec",
|
|
||||||
_name: "gambling_bitcoin",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af4e2", // NEED REPLACE
|
|
||||||
name: "Bitcoin Coinflip",
|
|
||||||
shortName: "Coinflip",
|
|
||||||
desc: `Feeling lucky? Looking to double up your spoils? Try your luck at double or nothing!\n==============================\n2 Bitcoins - ${config.odds['bitcoin_success']}%\nNothing - ${config.odds['bitcoin_failure']}%`,
|
|
||||||
fleaPriceRoubles: 1100000,
|
|
||||||
handbookPriceRoubles: 1100000,
|
|
||||||
prefab: "assets/content/items/barter/item_barter_valuable_bitcoin/item_barter_valuable_bitcoin.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: {
|
|
||||||
"59faff1d86f7746c51718c9c": 1 // Bitcoin
|
|
||||||
}
|
|
||||||
},
|
|
||||||
gpcoin: {
|
|
||||||
_id: "67b7b98b4767af842e0521ed",
|
|
||||||
_name: "gambling_gpcoin",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af5e2", // NEED REPLACE
|
|
||||||
name: "GP Coin Coinflip",
|
|
||||||
shortName: "Coinflip",
|
|
||||||
desc: `Feeling lucky? Looking to double up your spoils? Try your luck at double or nothing!\n==============================\n50 GP Coin - ${config.odds['gpcoin_success']}%\nNothing - ${config.odds['gpcoin_failure']}%`,
|
|
||||||
fleaPriceRoubles: 400000,
|
|
||||||
handbookPriceRoubles: 125000,
|
|
||||||
prefab: "assets/content/items/barter/item_barter_valuable_gp/item_barter_valuable_gp.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: {
|
|
||||||
"5d235b4d86f7742e017bc88a": 25 // GP Coin
|
|
||||||
}
|
|
||||||
},
|
|
||||||
medical: {
|
|
||||||
_id: "67b7b98b4767af842e0521fc",
|
|
||||||
_name: "gambling_medical",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af6e2", // NEED REPLACE
|
|
||||||
name: "Mystery Medical Kit",
|
|
||||||
shortName: "Mystery Medical Kit",
|
|
||||||
desc: `Hey soldier, looking for some meds to help keep you alive out there? I have a business to run here and I don't have time to sort through all this stuff. Take a chance and see what you get!`,
|
|
||||||
fleaPriceRoubles: 350000,
|
|
||||||
handbookPriceRoubles: 350000,
|
|
||||||
prefab: "assets/content/items/containers/item_container_meds/item_container_meds.bundle",
|
|
||||||
width: 3,
|
|
||||||
height: 3,
|
|
||||||
barter: {
|
|
||||||
"5d1b3a5d86f774252167ba22": 3, // Pile of meds
|
|
||||||
"619cc01e0a7c3a1a2731940c": 2, // Medical tools
|
|
||||||
"5b4335ba86f7744d2837a264": 1 // Bloodset
|
|
||||||
}
|
|
||||||
},
|
|
||||||
sealed: {
|
|
||||||
_id: "67b7b98b4767af842e0521e5",
|
|
||||||
_name: "event_container_airdrop_01",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3e3",
|
|
||||||
name: "Sealed Weapon Case",
|
|
||||||
shortName: "Sealed Weapon Case",
|
|
||||||
desc: "Looking for a weapon with some attachments that are left for you to attach yourself? Well do we have the perfect container for you. This is the same Sealed Weapon Case you would find in an airdrop and is not custom in any way.",
|
|
||||||
fleaPriceRoubles: 450000,
|
|
||||||
handbookPriceRoubles: 450000,
|
|
||||||
prefab: "assets/content/items/containers/item_container_weaponcase/item_container_weaponcase.bundle",
|
|
||||||
width: 5,
|
|
||||||
height: 2,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
food: {
|
|
||||||
_id: "67b7b98b4767af842e0521e6",
|
|
||||||
_name: "gambling_food",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3e4",
|
|
||||||
name: "Mystery Food",
|
|
||||||
shortName: "Mystery Food",
|
|
||||||
desc: `Come along friend, you look a little hungry. Try your luck at scoring a delicious snack!\n==============================\nCommon Food - ${config.odds['food_common']}%\nUncommon Food - ${config.odds['food_uncommon']}%\nRare Food - ${config.odds['food_rare']}%`,
|
|
||||||
fleaPriceRoubles: 35000,
|
|
||||||
handbookPriceRoubles: 35000,
|
|
||||||
prefab: "assets/content/weapons/usable_items/item_mre/item_mre_loot.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 2,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
melee: {
|
|
||||||
_id: "67b7b98b4767af842e0521ea",
|
|
||||||
_name: "gambling_melee",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3e5",
|
|
||||||
name: "Mystery Melee",
|
|
||||||
shortName: "Mystery Melee",
|
|
||||||
desc: `Looking for a shiny new weapon to beat your foes with? Come test your luck!\n\n PS: These weapons may or may have not been stolen from a sad little Timmy who didn't shove this up their pouch in time... poor timmy :'(\n==============================\nCommon Melee - ${config.odds['melee_common']}%\nUncommon Melee - ${config.odds['melee_uncommon']}%\nRare Melee - ${config.odds['melee_rare']}%\nExtremely Rare Melee - ${config.odds['melee_extremely_rare']}%`,
|
|
||||||
fleaPriceRoubles: 82500,
|
|
||||||
handbookPriceRoubles: 82500,
|
|
||||||
prefab: "assets/content/weapons/taiga/weapon_usvr_taiga_container.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 3,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
stim: {
|
|
||||||
_id: "67b7b98b4767af842e0521eb",
|
|
||||||
_name: "gambling_stim",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3e6",
|
|
||||||
name: "Mystery Stimulant",
|
|
||||||
shortName: "Mystery Stimulant",
|
|
||||||
desc: `Looking for your next pick me up? We have all the drugs you could ask for!\n==============================\nCommon Stimulant - ${config.odds['stim_common']}%\nUncommon Stimulant - ${config.odds['stim_uncommon']}%\nRare Stimulant - ${config.odds['stim_rare']}%`,
|
|
||||||
fleaPriceRoubles: 70000,
|
|
||||||
handbookPriceRoubles: 70000,
|
|
||||||
prefab: "assets/content/items/barter/item_container_injectorcase/item_container_injectorcase.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
fiftyfifty: {
|
|
||||||
_id: "67b7b98b4767af842e0521f9",
|
|
||||||
_name: "gambling_roubles",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3e7",
|
|
||||||
name: "50/50 Case",
|
|
||||||
shortName: "50/50 Case",
|
|
||||||
desc: `The true all in or nothing. This case was taken from Reshala's stash and has a 50% chance to double your money!. This could be your chance to win it all! "Scared money don't make money." -YG \n==============================\nDelicious Can of Beef Stew - 50.0%\n5 Million Roubles - 50.0%`,
|
|
||||||
fleaPriceRoubles: 2750000,
|
|
||||||
handbookPriceRoubles: 2750000,
|
|
||||||
prefab: "assets/content/items/containers/item_container_money/item_container_money.bundle",
|
|
||||||
width: 5,
|
|
||||||
height: 4,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
weapon: {
|
|
||||||
_id: "67b7b98b4767af842e0521f0",
|
|
||||||
_name: "gambling_weapon",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3e8",
|
|
||||||
name: "Weapon Mystery Box",
|
|
||||||
shortName: "Weapon Mystery Box",
|
|
||||||
desc: `Weapon Mystery Box, contains over 1000 different possible weapons ranging from premium meta weapons, early wipe weapons, scav weapons, meme/cursed weapons, and everything between... \n==============================\nFully Modded Weapon - ${config.odds['weapon_meta']}%\nSemi-modded Weapon - ${config.odds['weapon_decent']}%\nScav Weapon - ${config.odds['weapon_scav']}%\nDefault Weapon - ${config.odds['weapon_base']}%\nMeme Weapon - ${config.odds['weapon_meme']}%%`,
|
|
||||||
fleaPriceRoubles: 200000,
|
|
||||||
handbookPriceRoubles: 200000,
|
|
||||||
prefab: "assets/content/items/spec/item_spec_weaprepair/item_spec_weaprepair.bundle",
|
|
||||||
width: 4,
|
|
||||||
height: 4,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'100k': {
|
|
||||||
_id: "67b7b98b4767af842e0521f2",
|
|
||||||
_name: "gambling_100k",
|
|
||||||
quest_id: "66b57e52fcf233f4d70af7d4",
|
|
||||||
name: "100K Coinflip",
|
|
||||||
shortName: "Coinflip",
|
|
||||||
desc: `Wager your Roubles to win more or lose it all!\n==============================\n200K Roubles - 50.0%\nNothing - 50.0%`,
|
|
||||||
fleaPriceRoubles: 130000,
|
|
||||||
handbookPriceRoubles: 130000,
|
|
||||||
prefab: "assets/content/items/barter/wallet/item_wallet.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'500k': {
|
|
||||||
_id: "67b7b98b4767af842e0521f3",
|
|
||||||
_name: "gambling_500k",
|
|
||||||
quest_id: "66b57e52fcf253f4d70af7d4",
|
|
||||||
name: "500K Coinflip",
|
|
||||||
shortName: "Coinflip",
|
|
||||||
desc: `Wager your Roubles to win more or lose it all!\n==============================\n1 Million Roubles - 50.0%\nNothing - 50.0%`,
|
|
||||||
fleaPriceRoubles: 650000,
|
|
||||||
handbookPriceRoubles: 650000,
|
|
||||||
prefab: "assets/content/items/barter/wallet/item_wallet.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'1mil': {
|
|
||||||
_id: "67b7b98b4767af842e0521f4",
|
|
||||||
_name: "gambling_1mil",
|
|
||||||
quest_id: "66b57e52fcf244f4d70af7d4",
|
|
||||||
name: "1 Million Coinflip",
|
|
||||||
shortName: "Coinflip",
|
|
||||||
desc: `Wager your Roubles to win more or lose it all!\n==============================\n2 Million Roubles - 50.0%\nNothing - 50.0%`,
|
|
||||||
fleaPriceRoubles: 1200000,
|
|
||||||
handbookPriceRoubles: 1200000,
|
|
||||||
prefab: "assets/content/items/barter/wallet/item_wallet.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
backpack: {
|
|
||||||
_id: "67b7b98b4767af842e0521f5",
|
|
||||||
_name: "gambling_backpack",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af7d4",
|
|
||||||
name: "Backpack Mystery Bag",
|
|
||||||
shortName: "Backpack Mystery Bag",
|
|
||||||
desc: `Need a new bag for your next loot run? Come try these bags for size!\n==============================\nCommon Backpack - ${config.odds['backpack_common']}%\nUncommon Backpack - ${config.odds['backpack_uncommon']}%\nRare Backpack - ${config.odds['backpack_rare']}%\nExtremely Rare Backpack - ${config.odds['backpack_extremely_rare']}%`,
|
|
||||||
fleaPriceRoubles: 79750,
|
|
||||||
handbookPriceRoubles: 79750,
|
|
||||||
prefab: "assets/content/items/equipment/backpack_pilgrim/item_equipment_backpack_pilgrim_christmas.bundle",
|
|
||||||
width: 5,
|
|
||||||
height: 7,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
loadout: {
|
|
||||||
_id: "67b7b98b4767af842e0521f6",
|
|
||||||
_name: "gambling_loadout",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3ea",
|
|
||||||
name: "Mystery Loadout",
|
|
||||||
shortName: "Mystery Loadout",
|
|
||||||
desc: `Contains a random tiered loadout with mostly premium items and gear. All loadouts are randomly generated and corelate by rarity, meaning scav loadouts will generate mostly scav gear with an added chance that gear and items can upgrade tiers for added randomness. Same with all tiers of loadout. which means you will never recieve the same loadout twice. Items unboxed include:\n Weapon, Extra Magazines, Ammo, Grenades, Armor, Rig, Helmet, Headset, Backpack, Food, Drink, and Medical Supplies.`,
|
|
||||||
fleaPriceRoubles: 600000,
|
|
||||||
handbookPriceRoubles: 600000,
|
|
||||||
prefab: "assets/content/items/equipment/backpack_blackjack/item_equipment_backpack_blackjack.bundle",
|
|
||||||
width: 5,
|
|
||||||
height: 7,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
premium_loadout: {
|
|
||||||
_id: "67b7b98b4767af842e0521f7",
|
|
||||||
_name: "gambling_premium_loadout",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3f4",
|
|
||||||
name: "Premium Mystery Loadout",
|
|
||||||
shortName: "Premium Mystery Loadout",
|
|
||||||
desc: `Containes a high-tier loadout with mostly premium items and gear. All loadouts are randomly generated and corelate by rarity, meaning high-tier loadouts will generate mostly rare gear with an added chance that gear and items can be downgraded to average tier for added randomness. All tiers of loadout can have some items and gear go up or down rarities as well. which means you will never recieve the same loadout twice. Items unboxed include:\n Weapon, Extra Magazines, Ammo, Grenades, Armor, Rig, Helmet, Headset, Backpack, Food, Drink, and Medical Supplies.`,
|
|
||||||
fleaPriceRoubles: 850000,
|
|
||||||
handbookPriceRoubles: 850000,
|
|
||||||
prefab: "assets/content/items/equipment/backpack_6sh118/item_equipment_backpack_6sh118.bundle",
|
|
||||||
width: 5,
|
|
||||||
height: 7,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
rig: {
|
|
||||||
_id: "67b7b98b4767af842e0521f8",
|
|
||||||
_name: "gambling_rig",
|
|
||||||
quest_id: "66b57e52fcf263f4d70b0f45",
|
|
||||||
name: "Tactical Rig Mystery Box",
|
|
||||||
shortName: "Tactical Rig Mystery Box",
|
|
||||||
desc: `Looking for a brand new Tactical Rig? From Scav rigs to Boss Rigs We've got you covered!\n==============================\nScav Rig - ${config.odds['rig_scav']}%\nEarly Wipe Rig - ${config.odds['rig_early_wipe']}%\nLate Wipe Rig - ${config.odds['rig_late_wipe']}%\nBoss Rig - ${config.odds['rig_boss']}%`,
|
|
||||||
fleaPriceRoubles: 79750,
|
|
||||||
handbookPriceRoubles: 79750,
|
|
||||||
prefab: "assets/content/items/equipment/rig_boss_birdeye/item_equipment_rig_boss_birdeye.bundle",
|
|
||||||
width: 2,
|
|
||||||
height: 2,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
helmet: {
|
|
||||||
_id: "67b7b98b4767af842e0521fa",
|
|
||||||
_name: "gambling_helmet",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3ec",
|
|
||||||
name: "Mystery Helmet",
|
|
||||||
shortName: "Mystery Helmet",
|
|
||||||
desc: `Are you tired of Chad PMCs one tapping the largest part of your player? Well I can offer protection for you! Purchase a Helmet Mystery Box today!\n==============================\nCommon Helmet - ${config.odds['helmet_common']}%\nUncommon Helmet - ${config.odds['helmet_uncommon']}%\nRare Helmet - ${config.odds['helmet_rare']}%\nExtremely Rare T-7 Thermal Helmet - ${config.odds['helmet_extremely_rare']}%`,
|
|
||||||
fleaPriceRoubles: 100000,
|
|
||||||
handbookPriceRoubles: 100000,
|
|
||||||
prefab: "assets/content/items/equipment/helmet_altyn/item_equipment_helmet_altyn.bundle",
|
|
||||||
width: 2,
|
|
||||||
height: 2,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
headset: {
|
|
||||||
_id: "67b7b98b4767af842e0521fb",
|
|
||||||
_name: "gambling_headset",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3ed",
|
|
||||||
name: "Mystery Headset",
|
|
||||||
shortName: "Mystery Headset",
|
|
||||||
desc: `You can't expect to hear that sneaky USEC with those flimsy pair of headphones. Buy a Mystery Headset today!\n==============================\nCommon Headset - ${config.odds['headset_common']}%\nUncommon Headset - ${config.odds['headset_uncommon']}%\nRare Headset - ${config.odds['headset_rare']}%`,
|
|
||||||
fleaPriceRoubles: 79750,
|
|
||||||
handbookPriceRoubles: 79750,
|
|
||||||
prefab: "assets/content/items/equipment/headset_comtaciv/item_equipment_headset_comtaciv.bundle",
|
|
||||||
width: 2,
|
|
||||||
height: 2,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
armor: {
|
|
||||||
_id: "67b7b98b4767af842e0521ee",
|
|
||||||
_name: "gambling_armor",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3ee",
|
|
||||||
name: "Armor Mystery Box",
|
|
||||||
shortName: "Armor Mystery Box",
|
|
||||||
desc: `Need protection? Better be safe than sorry. Otherwise, that Timmy will catch you lacking.\n==============================\nCommon Armor - ${config.odds['armor_common']}%\nUncommon Armor - ${config.odds['armor_uncommon']}%\nRare Armor - ${config.odds['armor_rare']}%`,
|
|
||||||
fleaPriceRoubles: 130000,
|
|
||||||
handbookPriceRoubles: 130000,
|
|
||||||
prefab: "assets/content/items/spec/item_spec_armorrepair/item_spec_armorrepair.bundle",
|
|
||||||
width: 4,
|
|
||||||
height: 4,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
premium_armor: {
|
|
||||||
_id: "67b7b98b4767af842e0521ef",
|
|
||||||
_name: "gambling_premium_armor",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3ef",
|
|
||||||
name: "Premium Armor Mystery Box",
|
|
||||||
shortName: "Premium Armor Mystery Box",
|
|
||||||
desc: `So you need something a little better than a PACA? Alright... sheesh.. Since I like you a little better than the rest, I have a sweet deal I can offer you. I don't have much of these left to offer, but you can try your luck.\n==============================\nRare Armor - ${config.odds['premium_armor_rare']}%`,
|
|
||||||
fleaPriceRoubles: 350000,
|
|
||||||
handbookPriceRoubles: 350000,
|
|
||||||
prefab: "assets/content/items/spec/item_spec_armorrepair/item_spec_armorrepair.bundle",
|
|
||||||
width: 4,
|
|
||||||
height: 4,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
premium_weapon: {
|
|
||||||
_id: "67b7b98b4767af842e0521f1",
|
|
||||||
_name: "gambling_premium_weapon",
|
|
||||||
quest_id: "66b57e52fcf263f4d70af3eb",
|
|
||||||
name: "Premium Weapon Mystery Box",
|
|
||||||
shortName: "Premium Weapon Mystery Box",
|
|
||||||
desc: `Contains a heavily modded weapon, currently contains 250+ weapons in the loot pool\n==============================\nRare Weapon - ${config.odds['premium_weapon_meta']}%`,
|
|
||||||
fleaPriceRoubles: 300000,
|
|
||||||
handbookPriceRoubles: 300000,
|
|
||||||
prefab: "assets/content/items/spec/item_spec_weaprepair/item_spec_weaprepair.bundle",
|
|
||||||
width: 4,
|
|
||||||
height: 4,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'7.62x25': {
|
|
||||||
_id: "67b7b98b4767af842e0521d0",
|
|
||||||
_name: "gambling_7.62x25",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af000",
|
|
||||||
name: "Mystery 7.62x25mm",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Or maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nUnboxes ${config.odds['7.62x25_min']}%-${config.odds['7.62x25_max']}% Rounds\nCommon Rounds - ${config.odds["7.62x25_common"]}%\nUncommon Rounds - ${config.odds["7.62x25_uncommon"]}%\nRare Rounds - ${config.odds["7.62x25_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 10000,
|
|
||||||
handbookPriceRoubles: 10000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_762x25tt_pst_gzh.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'9x18': {
|
|
||||||
_id: "67b7b98b4767af842e0521d1",
|
|
||||||
_name: "gambling_9x18",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af421",
|
|
||||||
name: "Mystery 9x18mm Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['9x18_min']}-${config.odds['9x18_max']} Rounds\nCommon Rounds - ${config.odds["9x18_common"]}%\nUncommon Rounds - ${config.odds["9x18_uncommon"]}%\nRare Rounds - ${config.odds["9x18_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 5000,
|
|
||||||
handbookPriceRoubles: 5000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_9x18pm_pbm.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'9x19': {
|
|
||||||
_id: "67b7b98b4767af842e0521d2",
|
|
||||||
_name: "gambling_9x19",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af422",
|
|
||||||
name: "Mystery 9x19mm Parabellum Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['9x19_min']}-${config.odds['9x19_max']} Rounds\nCommon Rounds - ${config.odds["9x19_common"]}%\nUncommon Rounds - ${config.odds["9x19_uncommon"]}%\nRare Rounds - ${config.odds["9x19_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 10000,
|
|
||||||
handbookPriceRoubles: 10000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_9x19_7n31.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'9x21': {
|
|
||||||
_id: "67b7b98b4767af842e0521d3",
|
|
||||||
_name: "gambling_9x21",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af423",
|
|
||||||
name: "Mystery 9x21mm Gyurza Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['9x21_min']}-${config.odds['9x21_max']} Rounds\nCommon Rounds - ${config.odds["9x21_common"]}%\nUncommon Rounds - ${config.odds["9x21_uncommon"]}%\nRare Rounds - ${config.odds["9x21_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 19000,
|
|
||||||
handbookPriceRoubles: 19000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_9x21_7n42.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'.357': {
|
|
||||||
_id: "67b7b98b4767af842e0521d4",
|
|
||||||
_name: "gambling_.357",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af424",
|
|
||||||
name: "Mystery .357 Magnum Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['.357_min']}-${config.odds['.357_max']} Rounds\nCommon Rounds - ${config.odds[".357_common"]}%\nUncommon Rounds - ${config.odds[".357_uncommon"]}%\nRare Rounds - ${config.odds[".357_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 13000,
|
|
||||||
handbookPriceRoubles: 13000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_9x33r_fmj.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'.45': {
|
|
||||||
_id: "67b7b98b4767af842e0521d5",
|
|
||||||
_name: "gambling_.45",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af425",
|
|
||||||
name: "Mystery .45 ACP Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['.45_min']}-${config.odds['.45_max']} Rounds\nCommon Rounds - ${config.odds[".45_common"]}%\nUncommon Rounds - ${config.odds[".45_uncommon"]}%\nRare Rounds - ${config.odds[".45_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 19000,
|
|
||||||
handbookPriceRoubles: 19000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_1143x23_acp_ap.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'4.6x30': {
|
|
||||||
_id: "67b7b98b4767af842e0521d6",
|
|
||||||
_name: "gambling_4.6x30",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af426",
|
|
||||||
name: "Mystery 4.6x30mm HK Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['4.6x30_min']}-${config.odds['4.6x30_max']} Rounds\nCommon Rounds - ${config.odds["4.6x30_common"]}%\nUncommon Rounds - ${config.odds["4.6x30_uncommon"]}%\nRare Rounds - ${config.odds["4.6x30_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 23000,
|
|
||||||
handbookPriceRoubles: 23000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_46x30_ap_sx.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'5.7x28': {
|
|
||||||
_id: "67b7b98b4767af842e0521d7",
|
|
||||||
_name: "gambling_5.7x28",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af427",
|
|
||||||
name: "Mystery 5.7x28mm FN Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['5.7x28_min']}-${config.odds['5.7x28_max']} Rounds\nCommon Rounds - ${config.odds["5.7x28_common"]}%\nUncommon Rounds - ${config.odds["5.7x28_uncommon"]}%\nRare Rounds - ${config.odds["5.7x28_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 20000,
|
|
||||||
handbookPriceRoubles: 20000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_57x28_ss190.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'5.45x39': {
|
|
||||||
_id: "67b7b98b4767af842e0521d8",
|
|
||||||
_name: "gambling_5.45x39",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af428",
|
|
||||||
name: "Mystery 5.45x39mm Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['5.45x39_min']}-${config.odds['5.45x39_max']} Rounds\nCommon Rounds - ${config.odds["5.45x39_common"]}%\nUncommon Rounds - ${config.odds["5.45x39_uncommon"]}%\nRare Rounds - ${config.odds["5.45x39_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 20000,
|
|
||||||
handbookPriceRoubles: 20000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_545x39_bs.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'5.56x45': {
|
|
||||||
_id: "67b7b98b4767af842e0521d9",
|
|
||||||
_name: "gambling_5.56x45",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af429",
|
|
||||||
name: "Mystery 5.56x45mm NATO Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['5.56x45_min']}-${config.odds['5.56x45_max']} Rounds\nCommon Rounds - ${config.odds["5.56x45_common"]}%\nUncommon Rounds - ${config.odds["5.56x45_uncommon"]}%\nRare Rounds - ${config.odds["5.56x45_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 25000,
|
|
||||||
handbookPriceRoubles: 25000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_556x45_m995.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'.300': {
|
|
||||||
_id: "67b7b98b4767af842e0521da",
|
|
||||||
_name: "gambling_.300",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af42a",
|
|
||||||
name: "Mystery .300 Blackout Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['.300_min']}-${config.odds['.300_max']} Rounds\nCommon Rounds - ${config.odds[".300_common"]}%\nUncommon Rounds - ${config.odds[".300_uncommon"]}%\nRare Rounds - ${config.odds[".300_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 22500,
|
|
||||||
handbookPriceRoubles: 22500,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_762x35_ap.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'7.62x39': {
|
|
||||||
_id: "67b7b98b4767af842e0521db",
|
|
||||||
_name: "gambling_7.62x39",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af42b",
|
|
||||||
name: "Mystery 7.62x39mm Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['7.62x39_min']}-${config.odds['7.62x39_max']} Rounds\nCommon Rounds - ${config.odds["7.62x39_common"]}%\nUncommon Rounds - ${config.odds["7.62x39_uncommon"]}%\nRare Rounds - ${config.odds["7.62x39_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 22500,
|
|
||||||
handbookPriceRoubles: 22500,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_762x39_bp.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'7.62x51': {
|
|
||||||
_id: "67b7b98b4767af842e0521dc",
|
|
||||||
_name: "gambling_7.62x51",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af42c",
|
|
||||||
name: "Mystery 7.62x51mm NATO Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['7.62x51_min']}-${config.odds['7.62x51_max']} Rounds\nCommon Rounds - ${config.odds["7.62x51_common"]}%\nUncommon Rounds - ${config.odds["7.62x51_uncommon"]}%\nRare Rounds - ${config.odds["7.62x51_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 24500,
|
|
||||||
handbookPriceRoubles: 24500,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_762x51.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'7.62x54': {
|
|
||||||
_id: "67b7b98b4767af842e0521dd",
|
|
||||||
_name: "gambling_7.62x54",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af42d",
|
|
||||||
name: "Mystery 7.62x54mm Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['7.62x54_min']}-${config.odds['7.62x54_max']} Rounds\nCommon Rounds - ${config.odds["7.62x54_common"]}%\nUncommon Rounds - ${config.odds["7.62x54_uncommon"]}%\nRare Rounds - ${config.odds["7.62x54_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 26000,
|
|
||||||
handbookPriceRoubles: 26000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_762x54r_7n14.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'.338': {
|
|
||||||
_id: "67b7b98b4767af842e0521de",
|
|
||||||
_name: "gambling_.338",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af42e",
|
|
||||||
name: "Mystery .338 Lapua Magnum Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['.338_min']}-${config.odds['.338_max']} Rounds\nCommon Rounds - ${config.odds[".338_common"]}%\nUncommon Rounds - ${config.odds[".338_uncommon"]}%\nRare Rounds - ${config.odds[".338_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 80000,
|
|
||||||
handbookPriceRoubles: 80000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_86x70_lapua_magnum.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'9x39': {
|
|
||||||
_id: "67b7b98b4767af842e0521df",
|
|
||||||
_name: "gambling_9x39",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af42f",
|
|
||||||
name: "Mystery 9x39mm Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['9x39_min']}-${config.odds['9x39_max']} Rounds\nCommon Rounds - ${config.odds["9x39_common"]}%\nUncommon Rounds - ${config.odds["9x39_uncommon"]}%\nRare Rounds - ${config.odds["9x39_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 22000,
|
|
||||||
handbookPriceRoubles: 22000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_9x39_pab9.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'.366': {
|
|
||||||
_id: "67b7b98b4767af842e0521e0",
|
|
||||||
_name: "gambling_.366",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af430",
|
|
||||||
name: "Mystery .366 TKM Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['.366_min']}-${config.odds['.366_max']} Rounds\nCommon Rounds - ${config.odds[".366_common"]}%\nUncommon Rounds - ${config.odds[".366_uncommon"]}%\nRare Rounds - ${config.odds[".366_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 17000,
|
|
||||||
handbookPriceRoubles: 17000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_366_custom_ap.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'12.7x55': {
|
|
||||||
_id: "67b7b98b4767af842e0521e1",
|
|
||||||
_name: "gambling_12.7x55",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af431",
|
|
||||||
name: "Mystery 12.7x55mm Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['12.7x55_min']}-${config.odds['12.7x55_max']} Rounds\nCommon Rounds - ${config.odds["12.7x55_common"]}%\nUncommon Rounds - ${config.odds["12.7x55_uncommon"]}%\nRare Rounds - ${config.odds["12.7x55_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 25500,
|
|
||||||
handbookPriceRoubles: 25500,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_12,7x55_ps12b.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'12/70': {
|
|
||||||
_id: "67b7b98b4767af842e0521e2",
|
|
||||||
_name: "gambling_12/70",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af432",
|
|
||||||
name: "Mystery 12/70 Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['12/70_min']}-${config.odds['12/70_max']} Rounds\nCommon Rounds - ${config.odds["12/70_common"]}%\nUncommon Rounds - ${config.odds["12/70_uncommon"]}%\nRare Rounds - ${config.odds["12/70_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 14500,
|
|
||||||
handbookPriceRoubles: 14500,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_12x70.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'20/70': {
|
|
||||||
_id: "67b7b98b4767af842e0521e3",
|
|
||||||
_name: "gambling_20/70",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af433",
|
|
||||||
name: "Mystery 20/70 Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['20/70_min']}-${config.odds['20/70_max']} Rounds\nCommon Rounds - ${config.odds["20/70_common"]}%\nUncommon Rounds - ${config.odds["20/70_uncommon"]}%\nRare Rounds - ${config.odds["20/70_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 16000,
|
|
||||||
handbookPriceRoubles: 16000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_20x70.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
'23x75': {
|
|
||||||
_id: "67b7b98b4767af842e0521e4",
|
|
||||||
_name: "gambling_23x75",
|
|
||||||
quest_id: "66b59e1cfcf263f4d70af434",
|
|
||||||
name: "Mystery 23x75 Rounds",
|
|
||||||
shortName: "Mystery",
|
|
||||||
desc: `Are you tired of packing your magazines full of BBs? Maybe your Looking for that extra punch in your weapon to help put down that juicy PMC in The Lab. We have all the ammunition you could ask for!\n==============================\nRandomly Unboxes ${config.odds['23x75_min']}-${config.odds['23x75_max']} Rounds\nCommon Rounds - ${config.odds["23x75_common"]}%\nUncommon Rounds - ${config.odds["23x75_uncommon"]}%\nRare Rounds - ${config.odds["23x75_rare"]}%`,
|
|
||||||
fleaPriceRoubles: 18000,
|
|
||||||
handbookPriceRoubles: 18000,
|
|
||||||
prefab: "assets/content/items/ammo/patrons/patron_23x75_shrapnel_25.bundle",
|
|
||||||
width: 1,
|
|
||||||
height: 1,
|
|
||||||
barter: undefined
|
|
||||||
},
|
|
||||||
})
|
|
||||||
};
|
|
||||||
|
|
@ -1,311 +0,0 @@
|
||||||
import { DependencyContainer } from "tsyringe";
|
|
||||||
import { ILogger } from "@spt/models/spt/utils/ILogger";
|
|
||||||
import { DatabaseServer } from "@spt/servers/DatabaseServer";
|
|
||||||
import { IDatabaseTables } from "@spt/models/spt/server/IDatabaseTables";
|
|
||||||
import { ItemHelper } from "@spt/helpers/ItemHelper";
|
|
||||||
import { RandomUtil } from "@spt/utils/RandomUtil";
|
|
||||||
import { Ammo } from "./containers/Ammo";
|
|
||||||
import { MysteryContainer } from "./MysteryContainer";
|
|
||||||
import { Gamble } from "./Gamble";
|
|
||||||
import { Weapons } from "./containers/Weapons";
|
|
||||||
|
|
||||||
export class Price{
|
|
||||||
private container: DependencyContainer;
|
|
||||||
private config: any;
|
|
||||||
private logger: ILogger
|
|
||||||
private randomUtil: any
|
|
||||||
public MysteryContainer: MysteryContainer
|
|
||||||
|
|
||||||
constructor(container: DependencyContainer, config: any, logger: ILogger){
|
|
||||||
this.container = container;
|
|
||||||
this.config = config;
|
|
||||||
this.logger = logger;
|
|
||||||
this.MysteryContainer = new MysteryContainer(config, logger);
|
|
||||||
this.randomUtil = this.container.resolve<RandomUtil>("RandomUtil");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates the prices for the mystery containers.
|
|
||||||
*
|
|
||||||
* @returns An object containing the generated container prices.
|
|
||||||
*/
|
|
||||||
public generateContainerPrices(): {} {
|
|
||||||
let containerPrices = {};
|
|
||||||
const mysteryContainerNames = [...this.MysteryContainer.simulation, ...this.MysteryContainer.items.ammo.names];
|
|
||||||
//console.log(mysteryContainerNames)
|
|
||||||
|
|
||||||
for (let i = 0; i < mysteryContainerNames.length; i++) {
|
|
||||||
const name: string = this.MysteryContainer.getName(mysteryContainerNames[i]);
|
|
||||||
const parent: string = this.MysteryContainer.getParent(name);
|
|
||||||
const rarities: Array<string> = this.MysteryContainer.getRarities(name);
|
|
||||||
const odds: Array<number> = this.MysteryContainer.getOdds(name);
|
|
||||||
let currentPrices: Array<number> = [];
|
|
||||||
let currentContainerPrice = this.config.container_config[name + "_price"];
|
|
||||||
|
|
||||||
if (this.MysteryContainer.isAmmo(mysteryContainerNames[i])) {
|
|
||||||
const amount = ((this.config.odds[name + '_min'] + this.config.odds[name + '_max']) / 2);
|
|
||||||
const items = this.MysteryContainer.items['ammo'].items[name];
|
|
||||||
currentPrices = this.getMysteryContainerPrices(name, name, rarities, items, amount);
|
|
||||||
} else if (this.MysteryContainer.isPreset(mysteryContainerNames[i])) {
|
|
||||||
const items = this.MysteryContainer.items[parent];
|
|
||||||
currentPrices = this.getContainerPresetPrices(name, parent, rarities, items);
|
|
||||||
} else {
|
|
||||||
const items = this.MysteryContainer.items[name];
|
|
||||||
currentPrices = this.getMysteryContainerPrices(name, parent, rarities, items);
|
|
||||||
}
|
|
||||||
|
|
||||||
currentContainerPrice = this.generatePrices(name, odds, currentPrices, this.MysteryContainer.getProfitPercentage(name));
|
|
||||||
containerPrices[name + "_price"] = currentContainerPrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
//console.log("Mystery Container Prices")
|
|
||||||
//console.log(containerPrices)
|
|
||||||
return containerPrices;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates the price of an item based on the given parameters.
|
|
||||||
*
|
|
||||||
* @param parent - The parent item category.
|
|
||||||
* @param currentItem - The current item.
|
|
||||||
* @param amount - The quantity of the item.
|
|
||||||
* @returns The calculated price of the item.
|
|
||||||
*/
|
|
||||||
private getItemPrice(parent: string, currentItem: string, amount: number): number {
|
|
||||||
const itemHelper: ItemHelper = this.container.resolve<ItemHelper>("ItemHelper");
|
|
||||||
const override: number = this.MysteryContainer.getOverride(parent, currentItem);
|
|
||||||
let currentPrice: number = 0;
|
|
||||||
|
|
||||||
if (override && this.config['mystery_container_override_enable']) {
|
|
||||||
currentPrice = override;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
const traderPrice = this.traderAssortPrice(currentItem);
|
|
||||||
const fleaPrice = itemHelper.getDynamicItemPrice(currentItem);
|
|
||||||
|
|
||||||
if (traderPrice != 0 && fleaPrice == 0) {
|
|
||||||
currentPrice = traderPrice;
|
|
||||||
} else if (traderPrice == 0 && fleaPrice != 0) {
|
|
||||||
currentPrice = fleaPrice
|
|
||||||
} else {
|
|
||||||
currentPrice = Math.min(traderPrice, fleaPrice); // use cheapest option
|
|
||||||
}
|
|
||||||
|
|
||||||
if (currentPrice == 0) { // Item is not sold by trader or flea, must use handbook price. Nuclear option.
|
|
||||||
currentPrice = itemHelper.getItemMaxPrice(currentItem)
|
|
||||||
//console.log(currentItem)
|
|
||||||
//console.log(currentPrice)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return currentPrice * amount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates the average income for a Mystery Container sorted by rarity
|
|
||||||
*
|
|
||||||
* @param name - The name of the container.
|
|
||||||
* @param parent - The parent container.
|
|
||||||
* @param rarities - An array of rarities.
|
|
||||||
* @param items - The rewards in the container.
|
|
||||||
* @param amount - The quantity of items.
|
|
||||||
* @returns An array of prices.
|
|
||||||
*/
|
|
||||||
private getMysteryContainerPrices(name: string ,parent: string, rarities: Array<string>, items: any, amount: number = 1): Array<number> {
|
|
||||||
let prices: Array<number> = [];
|
|
||||||
let sum: number = 0;
|
|
||||||
|
|
||||||
for(let i = 0; i < rarities.length; i++){
|
|
||||||
let count = 0;
|
|
||||||
for (let j = 0; j < items.rewards[i].length; j++){
|
|
||||||
const currentItem = items.rewards[i][j];
|
|
||||||
let currentPrice: number = 0;
|
|
||||||
|
|
||||||
if (currentItem == '5449016a4bdc2d6f028b456f') { // isRoubles
|
|
||||||
currentPrice = this.MysteryContainer.items[parent].reward_amount[i];
|
|
||||||
//console.log('Roubles Price: ' + currentPrice)
|
|
||||||
} else {
|
|
||||||
currentPrice = this.getItemPrice(parent, currentItem, amount);
|
|
||||||
}
|
|
||||||
|
|
||||||
sum = sum + currentPrice;
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
//if (name == 'key') {
|
|
||||||
//console.log(prices);
|
|
||||||
//}
|
|
||||||
sum = sum / count;
|
|
||||||
prices.push(sum);
|
|
||||||
sum = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//console.log(name)
|
|
||||||
//if (name == 'key') {
|
|
||||||
//console.log(prices);
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
this.MysteryContainer.setRarityAverageProfit(name, prices);
|
|
||||||
return prices;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates the price of a given item in the trader's assort.
|
|
||||||
* Returns 0 if the item is not sold by a trader for roubles.
|
|
||||||
*
|
|
||||||
* @param currentItem - The item for which the price needs to be calculated.
|
|
||||||
* @returns The price of the item in the trader's assortment. If no trader sells the item, returns 0.
|
|
||||||
*/
|
|
||||||
private traderAssortPrice(currentItem: string): any {
|
|
||||||
const databaseServer: DatabaseServer = this.container.resolve<DatabaseServer>("DatabaseServer");
|
|
||||||
const tables = databaseServer.getTables();
|
|
||||||
const traderIDs = ['58330581ace78e27b8b10cee', '54cb50c76803fa8b248b4571', '5c0647fdd443bc2504c2d371', '5a7c2eca46aef81a7ca2145d', '5935c25fb3acc3127c3d8cd9', '5ac3b934156ae10c4430e83c'];
|
|
||||||
let price = 0;
|
|
||||||
|
|
||||||
for (const traderID of traderIDs) {
|
|
||||||
const traderAssort = tables.traders[traderID].assort
|
|
||||||
for (let i = 0; i < traderAssort.items.length; i++) {
|
|
||||||
if (traderAssort.items[i]._tpl == currentItem && traderAssort.items[i].slotId == 'hideout') {
|
|
||||||
const _id = traderAssort.items[i]._id;
|
|
||||||
//console.log('Trader ID = ' + traderID + 'item TPL = ' + traderAssort.items[i]._tpl + ' Item ID = ' + _id)
|
|
||||||
price = traderAssort.barter_scheme[_id][0][0].count;
|
|
||||||
|
|
||||||
if (price < 10) { // price is most likely a barter. This is a bad way of doing this, but fuck it.
|
|
||||||
price = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (traderID == '5935c25fb3acc3127c3d8cd9'){
|
|
||||||
price *= 142; // peacekeeper sells in dollars, must convert to roubles
|
|
||||||
}
|
|
||||||
return price;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return price; // No trader sells the item
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generates the average income for a preset Mystery Container sorted by rarity
|
|
||||||
*
|
|
||||||
* @param name - The name of the container.
|
|
||||||
* @param parent - The parent container.
|
|
||||||
* @param rarities - An array of rarities.
|
|
||||||
* @param items - The items in the container.
|
|
||||||
* @param amount - The amount of items. Default is 1.
|
|
||||||
* @returns An array of preset prices.
|
|
||||||
*/
|
|
||||||
private getContainerPresetPrices(name: string ,parent: string, rarities: Array<string>, items: any, amount: number = 1): Array<number> {
|
|
||||||
const itemHelper: ItemHelper = this.container.resolve<ItemHelper>("ItemHelper");
|
|
||||||
const weapons = new Weapons();
|
|
||||||
let prices: Array<number> = [];
|
|
||||||
let weaponPricesPerTier: Array<number> = [];
|
|
||||||
let tierTotal: number = 0;
|
|
||||||
let sum: number = 0;
|
|
||||||
const helmet_slots = ['helmet_top', 'helmet_back', 'helmet_ears', 'Helmet_top', 'Helmet_back', 'Helmet_ears'];
|
|
||||||
|
|
||||||
for(let i = 0; i < rarities.length; i++){
|
|
||||||
let count = 0;
|
|
||||||
for(let j = 0; j < items.presets[i].length; j++) {
|
|
||||||
for(let k = 0; k < items.presets[i][j].Items.length; k++){
|
|
||||||
|
|
||||||
let currentPrice: number = 0;
|
|
||||||
let currentItem = items.presets[i][j].Items[k]._tpl;
|
|
||||||
|
|
||||||
if (name == 'helmet') {
|
|
||||||
if (helmet_slots.includes(items.presets[i][j].Items[k].slotId)) continue; // skip usless helmet attachments
|
|
||||||
|
|
||||||
//if (i == 3 && j == 0) { // Testing
|
|
||||||
//console.log(items.presets[i][j].Items[k])
|
|
||||||
//console.log('ID = ' + currentItem);
|
|
||||||
//console.log(itemHelper.getDynamicItemPrice(currentItem))
|
|
||||||
//console.log(itemHelper.getItemMaxPrice(currentItem))
|
|
||||||
//console.log(this.traderAssortPrice(currentItem))
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
if (weapons.skip_base_attachments.includes(currentItem)) { // attachment is a base attachment, skip...
|
|
||||||
continue;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// Order of prices: Override -> Min(trader, flea) -> handbook -> prices.json
|
|
||||||
currentPrice = this.getItemPrice(parent, currentItem, amount);
|
|
||||||
sum = sum + currentPrice;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
count++
|
|
||||||
weaponPricesPerTier.push(Math.floor(sum));
|
|
||||||
sum = 0;
|
|
||||||
}
|
|
||||||
//if ( name == 'helmet') {
|
|
||||||
//console.log('Helmet Rarity = ' + rarities[i]);
|
|
||||||
//console.log(weaponPricesPerTier)
|
|
||||||
//}
|
|
||||||
const tierSum = weaponPricesPerTier.reduce((a, b) => a + b, 0);
|
|
||||||
sum = tierSum / count;
|
|
||||||
prices.push(Math.floor(sum));
|
|
||||||
sum = 0;
|
|
||||||
weaponPricesPerTier = [];
|
|
||||||
}
|
|
||||||
//if ( name == 'helmet') {
|
|
||||||
//console.log(prices)
|
|
||||||
//}
|
|
||||||
this.MysteryContainer.setRarityAverageProfit(name, prices);
|
|
||||||
return prices;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculates the most optimal mystery container price based on the given odds, prices, and desired profitability.
|
|
||||||
*
|
|
||||||
* @param name - name of the mystery container
|
|
||||||
* @param odds - An array of numbers representing the odds.
|
|
||||||
* @param prices - An array of numbers representing the prices.
|
|
||||||
* @param profitability - A number representing the profitability.
|
|
||||||
* @returns The calculated price generation.
|
|
||||||
*/
|
|
||||||
private generatePrices = (name: string, odds: Array<number>, prices: Array<number>, profitability: number) => {
|
|
||||||
let sum: number = 0;
|
|
||||||
let trackOdds = 0;
|
|
||||||
|
|
||||||
for(let i = 0; i < odds.length; i++){
|
|
||||||
const currentOdds = odds[i] - trackOdds;
|
|
||||||
trackOdds = odds[i]
|
|
||||||
sum += prices[i] * (currentOdds / 100);
|
|
||||||
}
|
|
||||||
sum *= profitability;
|
|
||||||
return Math.floor(sum);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Performs a loadout simulation and calculates the average price of the loadout.
|
|
||||||
*
|
|
||||||
* @returns The average price of the loadout.
|
|
||||||
*/
|
|
||||||
public loadoutSimulation = () => {
|
|
||||||
let sum = 0;
|
|
||||||
const weaponContainerPrice = 147000;
|
|
||||||
const extraItems = 5; // extra 2 mags and 3 ammo stacks
|
|
||||||
const simulations = 50000;
|
|
||||||
|
|
||||||
for(let i = 0; i < simulations; i++) {
|
|
||||||
const gamble = new Gamble(this.container, this.config, this.logger, 'loadout');
|
|
||||||
gamble.newGamble();
|
|
||||||
//console.log(gamble.newItemsRequest.itemsWithModsToAdd[1][0].upd.StackObjectsCount)
|
|
||||||
|
|
||||||
for (let j = 0; j < gamble.newItemsRequest.itemsWithModsToAdd.length; j++) {
|
|
||||||
if ( j != 0 && j != 1 + extraItems) { // Weapon, we dont price calculate
|
|
||||||
const indexItem = gamble.newItemsRequest.itemsWithModsToAdd[j][0];
|
|
||||||
const currentItem = indexItem._tpl;
|
|
||||||
const amount = indexItem.upd ? indexItem.upd.StackObjectsCount : 1;
|
|
||||||
const itemPrice = this.getItemPrice('weapon', currentItem, amount);
|
|
||||||
sum += itemPrice;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sum += weaponContainerPrice;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Math.floor(sum / simulations);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
export class ConfigLoader {
|
|
||||||
|
|
||||||
public config = require("../config/config.jsonc");
|
|
||||||
}
|
|
||||||
|
|
@ -1,591 +0,0 @@
|
||||||
export class Ammo {
|
|
||||||
|
|
||||||
public parent = "ammo";
|
|
||||||
//public price_generate = true;
|
|
||||||
|
|
||||||
public names = [
|
|
||||||
'7.62x25',
|
|
||||||
'9x18',
|
|
||||||
'9x19',
|
|
||||||
'9x21',
|
|
||||||
'.357',
|
|
||||||
'.45',
|
|
||||||
'4.6x30',
|
|
||||||
'5.7x28',
|
|
||||||
'5.45x39',
|
|
||||||
'5.56x45',
|
|
||||||
'.300',
|
|
||||||
'6.8x51',
|
|
||||||
'7.62x39',
|
|
||||||
'7.62x51',
|
|
||||||
'7.62x54',
|
|
||||||
'.338',
|
|
||||||
'9x39',
|
|
||||||
'.366',
|
|
||||||
'12.7x55',
|
|
||||||
'12/70',
|
|
||||||
'20/70',
|
|
||||||
'23x75',
|
|
||||||
]
|
|
||||||
|
|
||||||
public BSGCalibers = { // this is stupid
|
|
||||||
'Caliber762x25TT': '7.62x25',
|
|
||||||
'Caliber9x18PM': '9x18',
|
|
||||||
'Caliber9x19PARA': '9x19',
|
|
||||||
'Caliber9x21': '9x21',
|
|
||||||
'Caliber9x33R': '.357',
|
|
||||||
'Caliber1143x23ACP': '.45', // ?? why BSG
|
|
||||||
'Caliber46x30': '4.6x30',
|
|
||||||
'Caliber57x28': '5.7x28',
|
|
||||||
'Caliber545x39': '5.45x39',
|
|
||||||
'Caliber556x45NATO': '5.56x45',
|
|
||||||
'Caliber762x35': '.300',
|
|
||||||
'Caliber68x51': '6.8x51',
|
|
||||||
'Caliber762x39': '7.62x39',
|
|
||||||
'Caliber762x51': '7.62x51',
|
|
||||||
'Caliber762x54R': '7.62x54',
|
|
||||||
'Caliber86x70': '.338',
|
|
||||||
'Caliber9x39': '9x39',
|
|
||||||
'Caliber366TKM': '.366',
|
|
||||||
'Caliber127x55': '12.7x55',
|
|
||||||
'Caliber12g': '12/70',
|
|
||||||
'Caliber20g': '20/70',
|
|
||||||
'Caliber23x75': '23x75',
|
|
||||||
}
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
]
|
|
||||||
|
|
||||||
public items = {
|
|
||||||
"7.62x25": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"573603562459776430731618", // 7.62x25mm TT Pst gzh
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5735fdcd2459776445391d61", // 7.62x25mm TT AKBS
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"573602322459776445391df1", // 7.62x25mm TT LRNPC
|
|
||||||
"573601b42459776410737435", // 7.62x25mm TT LRN
|
|
||||||
"5735ff5c245977640e39ba7e", // 7.62x25mm TT FMJ43
|
|
||||||
"5736026a245977644601dc61", // 7.62x25mm TT P gl
|
|
||||||
"573603c924597764442bd9cb", // 7.62x25mm TT PT gzh
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"9x18": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"57371aab2459775a77142f22", // 9x18mm PMM PstM gzh
|
|
||||||
"573719df2459775a626ccbc2", // 9x18mm PM PBM gzh
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"57372140245977611f70ee91", // 9x18mm PM SP7 gzh
|
|
||||||
"5737218f245977612125ba51", // 9x18mm PM SP8 gzh
|
|
||||||
"573718ba2459775a75491131", // 9x18mm PM BZhT gzh
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5737207f24597760ff7b25f2", // 9x18mm PM PSV
|
|
||||||
"573719762459775a626ccbc1", // 9x18mm PM P gzh
|
|
||||||
"57371f8d24597761006c6a81", // 9x18mm PM PSO gzh
|
|
||||||
"57371f2b24597761224311f1", // 9x18mm PM PS gs PPO
|
|
||||||
"57371eb62459776125652ac1", // 9x18mm PM PRS gs
|
|
||||||
"57371b192459775a9f58a5e0", // 9x18mm PM PPe gzh
|
|
||||||
"57371e4124597760ff7b25f1", // 9x18mm PM PPT gzh
|
|
||||||
"5737201124597760fc4431f1", // 9x18mm PM Pst gzh
|
|
||||||
"573720e02459776143012541", // 9x18mm PM RG028 gzh
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"9x19": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"5c0d56a986f774449d5de529", // 9x19mm RIP
|
|
||||||
"5c925fa22e221601da359b7b", // 9x19mm AP 6.3
|
|
||||||
"5efb0da7a29a85116f6ea05f", // 9x19mm PBP gzh
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5efb0e16aeb21837e749c7ff", // 9x19mm QuakeMaker
|
|
||||||
"5a3c16fe86f77452b62de32a", // 9x19mm Luger CCI
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"58864a4f2459770fcc257101", // 9x19mm PSO gzh
|
|
||||||
"5c3df7d588a4501f290594e5", // 9x19mm Green Tracer
|
|
||||||
"64b7bbb74b75259c590fa897", // 9x19mm FMJ M882
|
|
||||||
"56d59d3ad2720bdb418b4577", // 9x19mm Pst gzh
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"9x21": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"5a26ac0ec4a28200741e1e18", // 9x21mm BT gzh
|
|
||||||
"6576f4708ca9c4381d16cd9d", // 9x21mm 7N42 "Zubilo"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5a269f97c4a282000b151807", // 9x21mm PS gzh
|
|
||||||
"6576f93989f0062e741ba952", // 9x21mm 7U4
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5a26ac06c4a282000c5a90a8", // 9x21mm PE gzh
|
|
||||||
"5a26abfac4a28232980eabff", // 9x21mm P gzh
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
".357": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"62330b3ed4dc74626d570b95", // .357 Magnum FMJ
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"62330c18744e5e31df12f516", // .357 Magnum JHP
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"62330c40bdd19b369e1e53d1", // .357 Magnum SP
|
|
||||||
"62330bfadc5883093563729b", // .357 Magnum HP
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
".45": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"5ea2a8e200685063ec28c05a", // .45 ACP RIP
|
|
||||||
"5efb0cabfb3e451d70735af5", // .45 ACP AP
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5efb0fc6aeb21837e749c801", // .45 ACP Hydra-Shok
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5efb0d4f4bc50b58e81710f3", // .45 ACP Lasermatch FMJ
|
|
||||||
"5e81f423763d9f754677bf2e", // .45 ACP Match FMJ
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"4.6x30": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"5ba26835d4351e0035628ff5", // 4.6x30mm AP SX
|
|
||||||
"5ba2678ad4351e44f824b344", // 4.6x30mm FMJ SX
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"64b6979341772715af0f9c39", // 4.6x30mm JSP SX
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5ba26844d4351e00334c9475", // 4.6x30mm Subsonic SX
|
|
||||||
"5ba26812d4351e003201fef1", // 4.6x30mm Action SX
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"5.7x28": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"5cc80f53e4a949000e1ea4f8", // 5.7x28mm L191
|
|
||||||
"5cc80f38e4a949001152b560", // 5.7x28mm SS190
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5cc80f8fe4a949033b0224a2", // 5.7x28mm SS197SR
|
|
||||||
"5cc80f67e4a949035e43bbba", // 5.7x28mm SB193
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5cc86832d7f00c000d3a6e6c", // 5.7x28mm R37.F
|
|
||||||
"5cc86840d7f00c002412c56c", // 5.7x28mm R37.X
|
|
||||||
"5cc80f79e4a949033c7343b2", // 5.7x28mm SS198LF
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"5.45x39": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"61962b617c6c7b169525f168", // 5.45x39mm 7N40
|
|
||||||
"56dfef82d2720bbd668b4567", // 5.45x39mm BP gs
|
|
||||||
"56dff026d2720bb8668b4567", // 5.45x39mm BS gs
|
|
||||||
"5c0d5e4486f77478390952fe", // 5.45x39mm PPBS gs "Igolnik"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"56dff3afd2720bba668b4567", // 5.45x39mm PS gs
|
|
||||||
"56dff2ced2720bb4668b4567", // 5.45x39mm PP gs
|
|
||||||
"56dff061d2720bb5668b4567", // 5.45x39mm BT gs
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"56dff216d2720bbd668b4568", // 5.45x39mm HP
|
|
||||||
"56dff338d2720bbd668b4569", // 5.45x39mm PRS gs
|
|
||||||
"56dff421d2720b5f5a8b4567", // 5.45x39mm SP
|
|
||||||
"56dff4ecd2720b5f5a8b4568", // 5.45x39mm US gs
|
|
||||||
"56dff4a2d2720bbd668b456a", // 5.45x39mm T gs
|
|
||||||
"56dff0bed2720bb0668b4567", // 5.45x39mm FMJ
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"5.56x45": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"54527ac44bdc2d36668b4567", // 5.56x45mm M855A1
|
|
||||||
"54527ac44bdc2d36668b4567", // 5.56x45mm M855A1
|
|
||||||
"59e690b686f7746c9f75e848", // 5.56x45mm M995
|
|
||||||
"601949593ae8f707c4608daa", // 5.56x45mm SSA AP
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"54527a984bdc2d4e668b4567", // 5.56x45mm M855
|
|
||||||
"60194943740c5d77f6705eea", // 5.56x45mm MK 318 Mod 0 (SOST)
|
|
||||||
"59e6906286f7746c9f75e847", // 5.56x45mm M856A1
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5c0d5ae286f7741e46554302", // 5.56x45mm Warmageddon
|
|
||||||
"59e6927d86f77411da468256", // 5.56x45mm HP
|
|
||||||
"59e6918f86f7746c9f75e849", // 5.56x45mm MK 255 Mod 0 (RRLP)
|
|
||||||
"59e6920f86f77411d82aa167", // 5.56x45mm FMJ
|
|
||||||
"59e68f6f86f7746c9f75e846", // 5.56x45mm M856
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
".300": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"64b8725c4b75259c590fa899", // .300 Blackout CBJ
|
|
||||||
"5fd20ff893a8961fc660a954", // .300 Blackout AP
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5fbe3ffdf8b6a877a729ea82", // .300 Blackout BCP FMJ
|
|
||||||
"619636be6db0f2477964e710", // .300 Blackout M62 Tracer
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"6196365d58ef8c428c287da1", // .300 Whisper
|
|
||||||
"6196364158ef8c428c287d9f", // .300 Blackout V-Max
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"6.8x51": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"6529243824cbe3c74a05e5c1", // 6.8x51mm SIG Hybrid
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"6529302b8c26af6326029fb7", // 6.8x51mm SIG FMJ
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"6529302b8c26af6326029fb7", // 6.8x51mm SIG FMJ
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"7.62x39": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"59e0d99486f7744a32234762", // 7.62x39mm BP gzh
|
|
||||||
"601aa3d2b2bcb34913271e6d", // 7.62x39mm MAI AP
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5656d7c34bdc2d9d198b4587", // 7.62x39mm PS gzh
|
|
||||||
"64b7af434b75259c590fa893", // 7.62x39mm PP gzh
|
|
||||||
"64b7af434b75259c590fa893", // 7.62x39mm PP gzh
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"59e4d3d286f774176a36250a", // 7.62x39mm HP
|
|
||||||
"64b7af734b75259c590fa895", // 7.62x39mm SP
|
|
||||||
"64b7af5a8532cf95ee0a0dbd", // 7.62x39mm FMJ
|
|
||||||
"59e4d24686f7741776641ac7", // 7.62x39mm US gzh
|
|
||||||
"59e4cf5286f7741778269d8a", // 7.62x39mm T-45M1 gzh
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"7.62x51": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"5a608bf24f39f98ffc77720e", // 7.62x51mm M62 Tracer
|
|
||||||
"5a6086ea4f39f99cd479502f", // 7.62x51mm M61
|
|
||||||
"6768c25aa7b238f14a08d3f6", // 7.62x51mm M80A1
|
|
||||||
"5efb0c1bd79ff02a1f5e68d9", // 7.62x51mm M993
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5e023e53d4353e3302577c4c", // 7.62x51mm BCP FMJ
|
|
||||||
"58dd3ad986f77403051cba8f", // 7.62x51mm M80
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5e023e88277cce2b522ff2b1", // 7.62x51mm Ultra Nosler
|
|
||||||
"5e023e6e34d52a55c3304f71", // 7.62x51mm TCW SP
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"7.62x54": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"5e023d34e8a400319a28ed44", // 7.62x54mm R BT gzh
|
|
||||||
"560d61e84bdc2da74d8b4571", // 7.62x54mm R SNB gzh
|
|
||||||
"5e023d48186a883be655e551", // 7.62x54mm R BS gs
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5e023cf8186a883be655e54f", // 7.62x54mm R T-46M gzh
|
|
||||||
"5887431f2459777e1612938f", // 7.62x54mm R LPS gzh
|
|
||||||
"59e77a2386f7742ee578960a", // 7.62x54mm R PS gzh
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"64b8f7c241772715af0f9c3d", // 7.62x54mm R HP BT
|
|
||||||
"64b8f7b5389d7ffd620ccba2", // 7.62x54mm R SP BT
|
|
||||||
"64b8f7968532cf95ee0a0dbf", // 7.62x54mm R FMJ
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
".338": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"5fc382a9d724d907e2077dab", // .338 Lapua Magnum AP
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5fc275cf85fd526b824a571a", // .338 Lapua Magnum FMJ
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5fc382b6d6fa9c00c571bbc3", // .338 Lapua Magnum TAC-X
|
|
||||||
"5fc382c1016cce60e8341b20", // .338 Lapua Magnum UCW
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"9x39": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"5c0d688c86f77413ae3407b2", // 9x39mm BP gs
|
|
||||||
"57a0e5022459774d1673f889", // 9x39mm SP-6 gs
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"57a0dfb82459774d3078b56c", // 9x39mm SP-5 gs
|
|
||||||
"5c0d668f86f7747ccb7f13b2", // 9x39mm SPP gs
|
|
||||||
"5c0d668f86f7747ccb7f13b2", // 9x39mm SPP gs
|
|
||||||
"61962d879bb3d20b0946d385", // 9x39mm PAB-9 gs
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"57a0dfb82459774d3078b56c", // 9x39mm SP-5 gs
|
|
||||||
"6576f96220d53a5b8f3e395e", // 9x39mm FMJ
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
".366": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"5f0596629e22f464da6bbdd9", // .366 TKM AP-M
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"59e655cb86f77411dc52a77b", // .366 TKM EKO
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"59e6658b86f77411d949b250", // .366 TKM Geksa
|
|
||||||
"59e6542b86f77411dc52a77a", // .366 TKM FMJ
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"12.7x55": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"5cadf6eeae921500134b2799", // 12.7x55mm PS12B
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5cadf6ddae9215051e1c23b2", // 12.7x55mm PS12
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5cadf6e5ae921500113bb973", // 12.7x55mm PS12A
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"12/70": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"5d6e6911a4b9361bd5780d52", // 12/70 flechette
|
|
||||||
"5c0d591486f7744c505b416f", // 12/70 RIP
|
|
||||||
"5d6e68a8a4b9360b6c0d54e2", // 12/70 AP-20 armor-piercing slug
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5d6e6806a4b936088465b17e", // 12/70 8.5mm Magnum buckshot
|
|
||||||
"64b8ee384b75259c590fa89b", // 12/70 Piranha
|
|
||||||
"5d6e68c4a4b9361b93413f79", // 12/70 makeshift .50 BMG slug
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5d6e6772a4b936088465b17c", // 12/70 5.25mm buckshot
|
|
||||||
"5d6e67fba4b9361bc73bc779", // 12/70 6.5mm Express buckshot
|
|
||||||
"560d5e524bdc2d25448b4571", // 12/70 7mm buckshot
|
|
||||||
"5d6e68d1a4b93622fe60e845", // 12/70 SuperFormance HP slug
|
|
||||||
"5d6e6869a4b9361c140bcfde", // 12/70 Grizzly 40 slug
|
|
||||||
"5d6e68b3a4b9361bca7e50b5", // 12/70 Copper Sabot Premier HP slug
|
|
||||||
"58820d1224597753c90aeb13", // 12/70 lead slug
|
|
||||||
"5d6e6891a4b9361bd473feea", // 12/70 "Poleva-3" slug
|
|
||||||
"5d6e68dea4b9361bcc29e659", // 12/70 Dual Sabot slug
|
|
||||||
"5d6e68e6a4b9361c140bcfe0", // 12/70 FTX Custom Lite slug
|
|
||||||
"5d6e689ca4b9361bc8618956", // 12/70 "Poleva-6u" slug
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"20/70": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"5d6e6a5fa4b93614ec501745", // 20/70 Devastator slug
|
|
||||||
"5d6e6a05a4b93618084f58d0", // 20/70 Star slug
|
|
||||||
"660137d8481cc6907a0c5cda", // 20/70 TSS Armor Piercing Slug
|
|
||||||
"660137d8481cc6907a0c5cda", // 20/70 TSS Armor Piercing Slug
|
|
||||||
"660137ef76c1b56143052be8", // 20/70 Dangerous Game Slug
|
|
||||||
"660137ef76c1b56143052be8", // 20/70 Dangerous Game Slug
|
|
||||||
"6601380580e77cfd080e3418", // 20/70 flechette
|
|
||||||
"6601380580e77cfd080e3418", // 20/70 flechette
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5d6e69c7a4b9360b6c0d54e4", // 20/70 7.3mm buckshot
|
|
||||||
"5d6e6a53a4b9361bd473feec", // 20/70 "Poleva-3" slug
|
|
||||||
"5d6e6a42a4b9364f07165f52", // 20/70 "Poleva-6u" slug
|
|
||||||
"6601380580e77cfd080e3418", // 20/70 flechette
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5d6e695fa4b936359b35d852", // 20/70 5.6mm buckshot
|
|
||||||
"5d6e69b9a4b9361bc8618958", // 20/70 6.2mm buckshot
|
|
||||||
"5a38ebd9c4a282000d722a5b", // 20/70 7.5mm buckshot
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"23x75": {
|
|
||||||
parent: "ammo",
|
|
||||||
rarities: [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
],
|
|
||||||
rewards: [
|
|
||||||
[
|
|
||||||
"5e85a9f4add9fe03027d9bf1", // 23x75mm Zvezda flashbang round
|
|
||||||
"5e85aa1a988a8701445df1f5", // 23x75mm Barrikada slug
|
|
||||||
"5e85a9a6eacf8c039e4e2ac1", // 23x75mm Shrapnel-10 buckshot
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5e85a9a6eacf8c039e4e2ac1", // 23x75mm Shrapnel-10 buckshot
|
|
||||||
"5f647f31b6238e5dd066e196", // 23x75mm Shrapnel-25 buckshot
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5f647f31b6238e5dd066e196", // 23x75mm Shrapnel-25 buckshot
|
|
||||||
],
|
|
||||||
]
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,17 +0,0 @@
|
||||||
export class AverageWeapons {
|
|
||||||
|
|
||||||
public parent = "weapon";
|
|
||||||
public is_preset = true;
|
|
||||||
public price_generate = true;
|
|
||||||
public calculate_preset_prices = false;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_decent",
|
|
||||||
"_meta",
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
"decent",
|
|
||||||
"meta",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,64 +0,0 @@
|
||||||
export class Backpacks {
|
|
||||||
|
|
||||||
public parent = "backpack";
|
|
||||||
public price_generate = true;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_extremely_rare",
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
"656e0436d44a1bb4220303a0", // Mystery Ranch SATL Bridger Assault Pack (Foliage)
|
|
||||||
"628bc7fb408e2b2e9c0801b1", // Mystery Ranch NICE COMM 3 BVS frame system (Coyote)
|
|
||||||
"61b9e1aaef9a1b5d6a79899a", // Santa's bag
|
|
||||||
"5c0e774286f77468413cc5b2", // Mystery Ranch Blackjack 50 backpack (MultiCam)
|
|
||||||
"5c0e774286f77468413cc5b2", // Mystery Ranch Blackjack 50 backpack (MultiCam)
|
|
||||||
],
|
|
||||||
[
|
|
||||||
//"5e4abc6786f77406812bd572", // LBT-2670 Slim Field Med Pack (Black)
|
|
||||||
//"5e997f0b86f7741ac73993e2", // Sanitar's bag
|
|
||||||
"5c0e805e86f774683f3dd637", // 3V Gear Paratus 3-Day Operator's Tactical backpack (Foliage Grey)
|
|
||||||
"5df8a4d786f77412672a1e3b", // 6Sh118 raid backpack (Digital Flora)
|
|
||||||
"5ab8ebf186f7742d8b372e80", // SSO Attack 2 raid backpack (Khaki)
|
|
||||||
"5b44c6ae86f7742d1627baea", // ANA Tactical Beta 2 Battle backpack (Olive Drab)
|
|
||||||
"62a1b7fbc30cfa1d366af586", // Gruppa 99 T30 backpack (MultiCam)
|
|
||||||
"5f5e46b96bdad616ad46d613", // Eberlestock F4 Terminator load bearing backpack (Tiger Stripe)
|
|
||||||
"628e1ffc83ec92260c0f437f", // Gruppa 99 T30 backpack (Black)
|
|
||||||
"6034d2d697633951dc245ea6", // Eberlestock G2 Gunslinger II backpack (Dry Earth)
|
|
||||||
"639346cc1c8f182ad90c8972", // Tasmanian Tiger Trooper 35 backpack (Khaki)
|
|
||||||
"639346cc1c8f182ad90c8972", // Tasmanian Tiger Trooper 35 backpack (Khaki)
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"656ddcf0f02d7bcea90bf395", // Tehinkom RK-PT-25 patrol backpack (Digital Flora)
|
|
||||||
"6034d103ca006d2dca39b3f0", // Hazard 4 Takedown sling backpack (Black)
|
|
||||||
"6038d614d10cbf667352dd44", // Hazard 4 Takedown sling backpack (MultiCam)
|
|
||||||
"619cf0335771dd3c390269ae", // Gruppa 99 T20 backpack (MultiCam)
|
|
||||||
"656f198fb27298d6fd005466", // Direct Action Dragon Egg Mark II backpack (Black)
|
|
||||||
"618cfae774bb2d036a049e7c", // LBT-1476A 3Day Pack (Woodland)
|
|
||||||
"60a272cc93ef783291411d8e", // Hazard 4 Drawbridge backpack (Coyote Tan)
|
|
||||||
"5d5d940f86f7742797262046", // Oakley Mechanism heavy duty backpack (Black)
|
|
||||||
"59e763f286f7742ee57895da", // Pilgrim tourist backpack
|
|
||||||
"5f5e467b0bc58666c37e7821", // Eberlestock F5 Switchblade backpack (Dry Earth)
|
|
||||||
"618bb76513f5097c8d5aa2d5", // Gruppa 99 T20 backpack (Umber Brown)
|
|
||||||
"545cdae64bdc2d39198b4568", // Camelbak Tri-Zip assault backpack (Foliage)
|
|
||||||
"545cdae64bdc2d39198b4568", // Camelbak Tri-Zip assault backpack (Foliage)
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5ab8f04f86f774585f4237d8", // Tactical sling bag (Khaki)
|
|
||||||
"5ab8ee7786f7742d8f33f0b9", // VKBO army bag
|
|
||||||
"56e33680d2720be2748b4576", // Transformer Bag
|
|
||||||
"56e33634d2720bd8058b456b", // Duffle bag
|
|
||||||
"544a5cde4bdc2d39388b456b", // Flyye MBSS backpack (UCP)
|
|
||||||
"5f5e45cc5021ce62144be7aa", // LolKek 3F Transfer tourist backpack
|
|
||||||
"5e9dcf5986f7746c417435b3", // LBT-8005A Day Pack backpack (MultiCam Black)
|
|
||||||
"60a2828e8689911a226117f9", // Hazard 4 Pillbox backpack (Black)
|
|
||||||
"5ca20d5986f774331e7c9602", // WARTECH Berkut BB-102 backpack (A-TACS FG)
|
|
||||||
"56e335e4d2720b6c058b456d", // Scav backpack
|
|
||||||
"56e335e4d2720b6c058b456d", // Scav backpack
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
export class CoinFlip100k {
|
|
||||||
|
|
||||||
public parent = "100k";
|
|
||||||
public price_generate = true;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_success",
|
|
||||||
"_failure",
|
|
||||||
]
|
|
||||||
public stackable = [true, true]
|
|
||||||
public reward_amount = [
|
|
||||||
200000,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
public rewards = [
|
|
||||||
['5449016a4bdc2d6f028b456f'],
|
|
||||||
['NaN'],
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
export class CoinFlip1Mil {
|
|
||||||
|
|
||||||
public parent = "1mil";
|
|
||||||
public price_generate = true;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_success",
|
|
||||||
"_failure",
|
|
||||||
]
|
|
||||||
public stackable = [true, true]
|
|
||||||
public reward_amount = [
|
|
||||||
2000000,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
public rewards = [
|
|
||||||
['5449016a4bdc2d6f028b456f'],
|
|
||||||
['NaN'],
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
export class CoinFlip500k {
|
|
||||||
|
|
||||||
public parent = "500k";
|
|
||||||
public price_generate = true;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_success",
|
|
||||||
"_failure",
|
|
||||||
]
|
|
||||||
public stackable = [true, true]
|
|
||||||
public reward_amount = [
|
|
||||||
1000000,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
public rewards = [
|
|
||||||
['5449016a4bdc2d6f028b456f'],
|
|
||||||
['NaN'],
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
export class DefaultWeapons {
|
|
||||||
|
|
||||||
public parent = "weapon";
|
|
||||||
public is_preset = true;
|
|
||||||
public price_generate = true;
|
|
||||||
public calculate_preset_prices = false;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_base",
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
"base",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
export class FlipBitcoin {
|
|
||||||
|
|
||||||
public parent = "money";
|
|
||||||
public rarities = [
|
|
||||||
"_success",
|
|
||||||
]
|
|
||||||
public stackable = [false]
|
|
||||||
public reward_amount = [2]
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
'59faff1d86f7746c51718c9c', // Bitcoin
|
|
||||||
],
|
|
||||||
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
export class FlipGPCoin {
|
|
||||||
|
|
||||||
public parent = "money";
|
|
||||||
public rarities = [
|
|
||||||
"_success",
|
|
||||||
]
|
|
||||||
public stackable = [true]
|
|
||||||
public reward_amount = [50]
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
'5d235b4d86f7742e017bc88a', // GP Coin
|
|
||||||
],
|
|
||||||
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
export class FlipRouble {
|
|
||||||
|
|
||||||
public parent = "money";
|
|
||||||
public rarities = [
|
|
||||||
"_success",
|
|
||||||
"_failure",
|
|
||||||
]
|
|
||||||
public stackable = [true, false]
|
|
||||||
public reward_amount = [5000000,1]
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
'5449016a4bdc2d6f028b456f', // 5,000,000 Roubles
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'57347d7224597744596b4e72', // Can of beef stew (Small)
|
|
||||||
],
|
|
||||||
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
||||||
export class Foods {
|
|
||||||
|
|
||||||
public parent = "food";
|
|
||||||
public price_generate = true;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
"5d1b33a686f7742523398398", // Canister with purified water
|
|
||||||
"5d1b376e86f774252519444e", // Bottle of Fierce Hatchling moonshine
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"656df4fec921ad01000481a2", // Pack of instant noodles
|
|
||||||
"5448fee04bdc2dbc018b4567", // Bottle of water (0.6L)
|
|
||||||
"5751496424597720a27126da", // Can of Hot Rod energy drink
|
|
||||||
"57347d8724597744596b4e76", // Can of squash spread
|
|
||||||
"57347d9c245977448b40fa85", // Can of herring
|
|
||||||
"5bc9c29cd4351e003562b8a3", // Can of sprats
|
|
||||||
"57347d7224597744596b4e72", // Can of beef stew (Small)
|
|
||||||
"65815f0e647e3d7246384e14", // Pack of Tarker dried meat
|
|
||||||
"5734773724597737fd047c14", // Can of condensed milk
|
|
||||||
"5751435d24597720a27126d1", // Can of Max Energy energy drink
|
|
||||||
"57347da92459774491567cf5", // Can of beef stew (Large)
|
|
||||||
"5673de654bdc2d180f8b456d", // Can of pacific saury
|
|
||||||
"614451b71e5874611e2c7ae5", // Bottle of Tarkovskaya vodka
|
|
||||||
"57347d5f245977448b40fa81", // Can of humpback salmon
|
|
||||||
"60098b1705871270cd5352a1", // Emergency Water Ration
|
|
||||||
"5e8f3423fd7471236e6e3b64", // Bottle of "Norvinskiy Yadreniy" premium kvass (0.6L)
|
|
||||||
"60b0f93284c20f0feb453da7", // Can of RatCola soda
|
|
||||||
"635a758bfefc88a93f021b8a", // Salty Dog beef sausage
|
|
||||||
"62a09f32621468534a797acb", // Bottle of Pevko Light beer
|
|
||||||
"5d403f9186f7743cac3f229b", // Bottle of Dan Jackiel whiskey
|
|
||||||
"57505f6224597709a92585a9", // Alyonka chocolate bar
|
|
||||||
"590c5f0d86f77413997acfab", // MRE ration pack
|
|
||||||
"575146b724597720a27126d5", // Pack of milk
|
|
||||||
"59e3577886f774176a362503", // Pack of sugar
|
|
||||||
],
|
|
||||||
[
|
|
||||||
|
|
||||||
"575062b524597720a31c09a1", // Can of Ice Green tea
|
|
||||||
"57513f07245977207e26a311", // Pack of apple juice
|
|
||||||
"5448ff904bdc2d6f028b456e", // Army crackers
|
|
||||||
"5751487e245977207e26a315", // Emelya rye croutons
|
|
||||||
"57513f9324597720a7128161", // Pack of Grand juice
|
|
||||||
"544fb62a4bdc2dfb738b4568", // Pack of Russian Army pineapple juice
|
|
||||||
"544fb6cc4bdc2d34748b456e", // Slickers chocolate bar
|
|
||||||
"57514643245977207f2c2d09", // Can of TarCola soda
|
|
||||||
"57513fcc24597720a31c09a6", // Pack of Vita juice
|
|
||||||
"57347d692459774491567cf1", // Can of green peas
|
|
||||||
"57347d90245977448f7b7f65", // Pack of oat flakes
|
|
||||||
"57347d3d245977448f7b7f61", // Rye croutons
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
export class Headsets {
|
|
||||||
|
|
||||||
public parent = "headset";
|
|
||||||
public price_generate = true;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
"628e4e576d783146b124c64d", // Peltor ComTac 4 Hybrid headset (Coyote Brown)
|
|
||||||
"66b5f6985891c84aab75ca76", // Peltor ComTac VI headset (Coyote Brown)
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"66b5f693acff495a294927e3", // Peltor ComTac V headset (OD Green)
|
|
||||||
"5645bcc04bdc2d363b8b4572", // Peltor ComTac 2 headset (OD Green)
|
|
||||||
"66b5f68de98be930d701c00e", // Safariland Liberator HP 2.0 Hearing Protection Headset (FDE)
|
|
||||||
"5f60cd6cf2bcbb675b00dac6", // Walker's XCEL 500BT Digital headset
|
|
||||||
"5e4d34ca86f774264f758330", // Walker's Razor Digital headset
|
|
||||||
"5c165d832e2216398b5a7e36", // Peltor Tactical Sport headset
|
|
||||||
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5b432b965acfc47a8774094e", // GSSh-01 active headset
|
|
||||||
"6033fa48ffd42c541047f728", // OPSMEN Earmor M32 headset
|
|
||||||
"5aa2ba71e5b5b000137b758f", // MSA Sordin Supreme PRO-X/L headset
|
|
||||||
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,33 +0,0 @@
|
||||||
export class Keycard {
|
|
||||||
|
|
||||||
public parent = "keycard";
|
|
||||||
public price_generate = true;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_red",
|
|
||||||
"_green",
|
|
||||||
"_blue",
|
|
||||||
"_violet",
|
|
||||||
"_black",
|
|
||||||
"_yellow",
|
|
||||||
"_blue_marking",
|
|
||||||
"_21WS",
|
|
||||||
"_11SR",
|
|
||||||
"_access"
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
["5c1d0efb86f7744baf2e7b7b"], // TerraGroup Labs keycard (Red)
|
|
||||||
["5c1d0dc586f7744baf2e7b79"], // TerraGroup Labs keycard (Green)
|
|
||||||
["5c1d0c5f86f7744bb2683cf0"], // TerraGroup Labs keycard (Blue)
|
|
||||||
["5c1e495a86f7743109743dfb"], // TerraGroup Labs keycard (Violet)
|
|
||||||
["5c1d0f4986f7744bb01837fa"], // TerraGroup Labs keycard (Black)
|
|
||||||
["5c1d0d6d86f7744bb2683e1f"], // TerraGroup Labs keycard (Yellow)
|
|
||||||
["5efde6b4f5448336730dbd61"], // Keycard with a blue marking
|
|
||||||
["5e42c83786f7742a021fdf3c"], // Object #21WS keycard
|
|
||||||
["5e42c81886f7742a01529f57"], // Object #11SR keycard
|
|
||||||
["5c94bbff86f7747ee735c08f"] // TerraGroup Labs access keycard
|
|
||||||
]
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
export class Loadoutdrink {
|
|
||||||
|
|
||||||
public parent = "loadout_drink";
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common",
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
"5e8f3423fd7471236e6e3b64", // Bottle of "Norvinskiy Yadreniy" premium kvass (0.6L)
|
|
||||||
"5448fee04bdc2dbc018b4567", // Bottle of water (0.6L)
|
|
||||||
"60098b1705871270cd5352a1", // Emergency Water Ration
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"575146b724597720a27126d5", // Pack of milk
|
|
||||||
"5751496424597720a27126da", // Can of Hot Rod energy drink
|
|
||||||
"57513fcc24597720a31c09a6", // Pack of Vita juice
|
|
||||||
"5751435d24597720a27126d1", // Can of Max Energy energy drink
|
|
||||||
"60b0f93284c20f0feb453da7", // Can of RatCola soda
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"57513f9324597720a7128161", // Pack of Grand juice
|
|
||||||
"575062b524597720a31c09a1", // Can of Ice Green tea
|
|
||||||
"57513f07245977207e26a311", // Pack of apple juice
|
|
||||||
"544fb62a4bdc2dfb738b4568", // Pack of Russian Army pineapple juice
|
|
||||||
"57514643245977207f2c2d09", // Can of TarCola soda
|
|
||||||
],
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,103 +0,0 @@
|
||||||
export class LoadoutFacecovers {
|
|
||||||
|
|
||||||
public parent = "loadout_facecovers";
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common",
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
'635267ab3c89e2112001f826', // Spooky skull mask
|
|
||||||
'5e54f76986f7740366043752', // Shroud half-mask
|
|
||||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
|
||||||
'6571bde39837cc51b800c212', // Ghost half-mask
|
|
||||||
'5ab8f4ff86f77431c60d91ba', // Ghost balaclava
|
|
||||||
'62a09dd4621468534a797ac7', // Baddie's red beard
|
|
||||||
'572b7f1624597762ae139822', // Balaclava
|
|
||||||
'5c1a1e3f2e221602b66cc4c2', // Fake white beard
|
|
||||||
'607f201b3c672b3b3a24a800', // Twitch Rivals 2021 balaclava
|
|
||||||
'5e71f6be86f77429f2683c44', // Twitch Rivals 2020 mask
|
|
||||||
'5e71fad086f77422443d4604', // Twitch Rivals 2020 half-mask
|
|
||||||
'5b4325355acfc40019478126', // Shemagh (Tan)
|
|
||||||
'5b4325355acfc40019478126', // Shemagh (Tan)
|
|
||||||
'5ab8f85d86f7745cd93a1cf5', // Shemagh (Green)
|
|
||||||
'5ab8f85d86f7745cd93a1cf5', // Shemagh (Green)
|
|
||||||
'5fd8d28367cb5e077335170f', // Smoke balaclava
|
|
||||||
'5fd8d28367cb5e077335170f', // Smoke balaclava
|
|
||||||
'5fd8d28367cb5e077335170f', // Smoke balaclava
|
|
||||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
|
||||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
|
||||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
|
||||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'5fd8d28367cb5e077335170f', // Smoke balaclava
|
|
||||||
'607f201b3c672b3b3a24a800', // Twitch Rivals 2021 balaclava
|
|
||||||
'5e71f6be86f77429f2683c44', // Twitch Rivals 2020 mask
|
|
||||||
'5e71fad086f77422443d4604', // Twitch Rivals 2020 half-mask
|
|
||||||
'62a09dd4621468534a797ac7', // Baddie's red beard
|
|
||||||
'572b7fa524597762b747ce82', // Lower half-mask
|
|
||||||
'572b7fa524597762b747ce82', // Lower half-mask
|
|
||||||
'572b7f1624597762ae139822', // Balaclava
|
|
||||||
'5ab8f4ff86f77431c60d91ba', // Ghost balaclava
|
|
||||||
'5e54f76986f7740366043752', // Shroud half-mask
|
|
||||||
'5c1a1e3f2e221602b66cc4c2', // Fake white beard
|
|
||||||
'5b4325355acfc40019478126', // Shemagh (Tan)
|
|
||||||
'5b4325355acfc40019478126', // Shemagh (Tan)
|
|
||||||
'5b4325355acfc40019478126', // Shemagh (Tan)
|
|
||||||
'5ab8f85d86f7745cd93a1cf5', // Shemagh (Green)
|
|
||||||
'5ab8f85d86f7745cd93a1cf5', // Shemagh (Green)
|
|
||||||
'5ab8f85d86f7745cd93a1cf5', // Shemagh (Green)
|
|
||||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
|
||||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
|
||||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
|
||||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
|
||||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
|
||||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
|
||||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
|
||||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
|
||||||
'NaN',
|
|
||||||
'NaN',
|
|
||||||
'NaN',
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'6571bde39837cc51b800c212', // Ghost half-mask
|
|
||||||
'62a09dd4621468534a797ac7', // Baddie's red beard
|
|
||||||
'5e71f6be86f77429f2683c44', // Twitch Rivals 2020 mask
|
|
||||||
'5e54f76986f7740366043752', // Shroud half-mask
|
|
||||||
'5fd8d28367cb5e077335170f', // Smoke balaclava
|
|
||||||
'572b7f1624597762ae139822', // Balaclava
|
|
||||||
'607f201b3c672b3b3a24a800', // Twitch Rivals 2021 balaclava
|
|
||||||
'5e71fad086f77422443d4604', // Twitch Rivals 2020 half-mask
|
|
||||||
'5c1a1e3f2e221602b66cc4c2', // Fake white beard
|
|
||||||
'5ab8f4ff86f77431c60d91ba', // Ghost balaclava
|
|
||||||
'5ab8f4ff86f77431c60d91ba', // Ghost balaclava
|
|
||||||
'5b4325355acfc40019478126', // Shemagh (Tan)
|
|
||||||
'5b4325355acfc40019478126', // Shemagh (Tan)
|
|
||||||
'5ab8f85d86f7745cd93a1cf5', // Shemagh (Green)
|
|
||||||
'5ab8f85d86f7745cd93a1cf5', // Shemagh (Green)
|
|
||||||
'572b7fa524597762b747ce82', // Lower half-mask
|
|
||||||
'572b7fa524597762b747ce82', // Lower half-mask
|
|
||||||
'572b7fa524597762b747ce82', // Lower half-mask
|
|
||||||
'572b7fa524597762b747ce82', // Lower half-mask
|
|
||||||
'5b4326435acfc433000ed01d', // Neoprene mask
|
|
||||||
'5b4326435acfc433000ed01d', // Neoprene mask
|
|
||||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
|
||||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
|
||||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
|
||||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
|
||||||
'5ab8f39486f7745cd93a1cca', // Cold Fear infrared balaclava
|
|
||||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
|
||||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
|
||||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
|
||||||
'5b432f3d5acfc4704b4a1dfb', // Momex balaclava
|
|
||||||
'NaN',
|
|
||||||
'NaN',
|
|
||||||
'NaN',
|
|
||||||
'NaN',
|
|
||||||
'NaN',
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
||||||
export class LoadoutFood {
|
|
||||||
|
|
||||||
public parent = "loadout_food";
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common",
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
"65815f0e647e3d7246384e14", // Pack of Tarker dried meat
|
|
||||||
"57347d5f245977448b40fa81", // Can of humpback salmon
|
|
||||||
"5bc9c29cd4351e003562b8a3", // Can of sprats
|
|
||||||
"57347d7224597744596b4e72", // Can of beef stew (Small)
|
|
||||||
"57347da92459774491567cf5", // Can of beef stew (Large)
|
|
||||||
"635a758bfefc88a93f021b8a", // Salty Dog beef sausage
|
|
||||||
"590c5f0d86f77413997acfab", // MRE ration pack
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"57347d692459774491567cf1", // Can of green peas
|
|
||||||
"57347d9c245977448b40fa85", // Can of herring
|
|
||||||
"57347d8724597744596b4e76", // Can of squash spread
|
|
||||||
"656df4fec921ad01000481a2", // Pack of instant noodles
|
|
||||||
"5673de654bdc2d180f8b456d", // Can of pacific saury
|
|
||||||
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"57347d3d245977448f7b7f61", // Rye croutons
|
|
||||||
"5448ff904bdc2d6f028b456e", // Army crackers
|
|
||||||
"5751487e245977207e26a315", // Emelya rye croutons
|
|
||||||
"544fb6cc4bdc2d34748b456e", // Slickers chocolate bar
|
|
||||||
|
|
||||||
]
|
|
||||||
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
export class LoadoutGrenade {
|
|
||||||
|
|
||||||
public parent = "loadout_grenade";
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common",
|
|
||||||
]
|
|
||||||
|
|
||||||
public stackable = [false, false, false]
|
|
||||||
|
|
||||||
//public reward_amount = [ // Amount of rolls for each reward tier, duplicate items
|
|
||||||
//2,
|
|
||||||
//2,
|
|
||||||
//1,
|
|
||||||
//]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
'NaN', // No grenade
|
|
||||||
'NaN', // No grenade
|
|
||||||
'NaN', // No grenade
|
|
||||||
'5e340dcdcb6d5863cc5e5efb', // VOG-25 Khattabka improvised hand grenade
|
|
||||||
'5e340dcdcb6d5863cc5e5efb', // VOG-25 Khattabka improvised hand grenade
|
|
||||||
'5e32f56fcb6d5863cc5e5ee4', // VOG-17 Khattabka improvised hand grenade
|
|
||||||
'5e32f56fcb6d5863cc5e5ee4', // VOG-17 Khattabka improvised hand grenade
|
|
||||||
'5710c24ad2720bc3458b45a3', // F-1 hand grenade
|
|
||||||
'5710c24ad2720bc3458b45a3', // F-1 hand grenade
|
|
||||||
'5710c24ad2720bc3458b45a3', // F-1 hand grenade
|
|
||||||
'58d3db5386f77426186285a0', // M67 hand grenade
|
|
||||||
'617fd91e5539a84ec44ce155', // RGN hand grenade
|
|
||||||
'618a431df1eb8e24b8741deb', // RGO hand grenade
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'NaN', // No grenade
|
|
||||||
'NaN', // No grenade
|
|
||||||
'58d3db5386f77426186285a0', // M67 hand grenade
|
|
||||||
'5710c24ad2720bc3458b45a3', // F-1 hand grenade
|
|
||||||
'5448be9a4bdc2dfd2f8b456a', // RGD-5 hand grenade
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'NaN', // No grenade
|
|
||||||
'NaN', // No grenade
|
|
||||||
'NaN', // No grenade
|
|
||||||
'NaN', // No grenade
|
|
||||||
'NaN', // No grenade
|
|
||||||
'NaN', // No grenade
|
|
||||||
'5710c24ad2720bc3458b45a3', // F-1 hand grenade
|
|
||||||
'5710c24ad2720bc3458b45a3', // F-1 hand grenade
|
|
||||||
'5448be9a4bdc2dfd2f8b456a', // RGD-5 hand grenade
|
|
||||||
'5448be9a4bdc2dfd2f8b456a', // RGD-5 hand grenade
|
|
||||||
'5448be9a4bdc2dfd2f8b456a', // RGD-5 hand grenade
|
|
||||||
'5a0c27731526d80618476ac4', // Zarya stun grenade
|
|
||||||
'5a0c27731526d80618476ac4', // Zarya stun grenade
|
|
||||||
'5a0c27731526d80618476ac4', // Zarya stun grenade
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
export class LoadoutHealing {
|
|
||||||
|
|
||||||
public parent = "loadout_light_healing";
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common",
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
'590c678286f77426c9660122', // IFAK individual first aid kit
|
|
||||||
'60098ad7c2240c0fe85c570a', // AFAK tactical individual first aid kit
|
|
||||||
'60098ad7c2240c0fe85c570a', // AFAK tactical individual first aid kit
|
|
||||||
'590c657e86f77412b013051d', // Grizzly medical kit
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'590c661e86f7741e566b646a', // Car first aid kit
|
|
||||||
'544fb45d4bdc2dee738b4568', // Salewa first aid kit
|
|
||||||
'590c678286f77426c9660122', // IFAK individual first aid kit
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'590c678286f77426c9660122', // IFAK individual first aid kit
|
|
||||||
'544fb45d4bdc2dee738b4568', // Salewa first aid kit
|
|
||||||
'5755356824597772cb798962', // AI-2 medkit
|
|
||||||
'5755356824597772cb798962', // AI-2 medkit
|
|
||||||
'590c661e86f7741e566b646a', // Car first aid kit
|
|
||||||
'590c661e86f7741e566b646a', // Car first aid kit
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
export class LoadoutHeavyBleed {
|
|
||||||
|
|
||||||
public parent = "loadout_heavy_bleed";
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common",
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
'5e8488fa988a8701445df1e4', // CALOK-B hemostatic applicator
|
|
||||||
'5e8488fa988a8701445df1e4', // CALOK-B hemostatic applicator
|
|
||||||
'5e8488fa988a8701445df1e4', // CALOK-B hemostatic applicator
|
|
||||||
'5e8488fa988a8701445df1e4', // CALOK-B hemostatic applicator
|
|
||||||
'60098af40accd37ef2175f27', // CAT hemostatic tourniquet
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'5e8488fa988a8701445df1e4', // CALOK-B hemostatic applicator
|
|
||||||
'5e8488fa988a8701445df1e4', // CALOK-B hemostatic applicator
|
|
||||||
'60098af40accd37ef2175f27', // CAT hemostatic tourniquet
|
|
||||||
'60098af40accd37ef2175f27', // CAT hemostatic tourniquet
|
|
||||||
'60098af40accd37ef2175f27', // CAT hemostatic tourniquet
|
|
||||||
'5e831507ea0a7c419c2f9bd9', // Esmarch tourniquet
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'5e831507ea0a7c419c2f9bd9', // Esmarch tourniquet
|
|
||||||
'5e831507ea0a7c419c2f9bd9', // Esmarch tourniquet
|
|
||||||
'5e831507ea0a7c419c2f9bd9', // Esmarch tourniquet
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
export class LoadoutLightBleed {
|
|
||||||
|
|
||||||
public parent = "loadout_light_bleed";
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common",
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
'5751a25924597722c463c472', // Army bandage
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'5751a25924597722c463c472', // Army bandage
|
|
||||||
'5751a25924597722c463c472', // Army bandage
|
|
||||||
'5751a25924597722c463c472', // Army bandage
|
|
||||||
'5751a25924597722c463c472', // Army bandage
|
|
||||||
'544fb25a4bdc2dfb738b4567', // Aseptic bandage
|
|
||||||
'544fb25a4bdc2dfb738b4567', // Aseptic bandage
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'5751a25924597722c463c472', // Army bandage
|
|
||||||
'5751a25924597722c463c472', // Army bandage
|
|
||||||
'5751a25924597722c463c472', // Army bandage
|
|
||||||
'544fb25a4bdc2dfb738b4567', // Aseptic bandage
|
|
||||||
'544fb25a4bdc2dfb738b4567', // Aseptic bandage
|
|
||||||
'544fb25a4bdc2dfb738b4567', // Aseptic bandage
|
|
||||||
'544fb25a4bdc2dfb738b4567', // Aseptic bandage
|
|
||||||
],
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
export class LoadoutSplit {
|
|
||||||
|
|
||||||
public parent = "loadout_splint";
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common",
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
'5af0454c86f7746bf20992e8', // Aluminum splint
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'544fb3364bdc2d34748b456a', // Immobilizing splint
|
|
||||||
'5af0454c86f7746bf20992e8', // Aluminum splint
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'544fb3364bdc2d34748b456a', // Immobilizing splint
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
export class LoadoutStim {
|
|
||||||
|
|
||||||
public parent = "loadout_stim";
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common",
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
'NaN', // None
|
|
||||||
'NaN', // None
|
|
||||||
'5c0e534186f7747fa1419867', // eTG-change regenerative stimulant injector
|
|
||||||
'637b6179104668754b72f8f5', // PNB (Product 16) stimulant injector
|
|
||||||
'5ed515e03a40a50460332579', // L1 (Norepinephrine) injector
|
|
||||||
'5ed515f6915ec335206e4152', // AHF1-M stimulant injector
|
|
||||||
'5c0e530286f7747fa1419862', // Propital regenerative stimulant injector
|
|
||||||
'5c0e530286f7747fa1419862', // Propital regenerative stimulant injector
|
|
||||||
'5c0e533786f7747fa23f4d47', // Zagustin hemostatic drug injector
|
|
||||||
'5c0e533786f7747fa23f4d47', // Zagustin hemostatic drug injector
|
|
||||||
'5c10c8fd86f7743d7d706df3', // Adrenaline injector
|
|
||||||
'544fb3f34bdc2d03748b456a', // Morphine injector
|
|
||||||
'544fb3f34bdc2d03748b456a', // Morphine injector
|
|
||||||
'544fb3f34bdc2d03748b456a', // Morphine injector
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'NaN', // None
|
|
||||||
'5ed515f6915ec335206e4152', // AHF1-M stimulant injector
|
|
||||||
'5c0e530286f7747fa1419862', // Propital regenerative stimulant injector
|
|
||||||
'5c10c8fd86f7743d7d706df3', // Adrenaline injector
|
|
||||||
'5c10c8fd86f7743d7d706df3', // Adrenaline injector
|
|
||||||
'544fb3f34bdc2d03748b456a', // Morphine injector
|
|
||||||
'544fb3f34bdc2d03748b456a' // Morphine injector
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'NaN', // None
|
|
||||||
'NaN', // None
|
|
||||||
'NaN', // None
|
|
||||||
'5c0e530286f7747fa1419862', // Propital regenerative stimulant injector
|
|
||||||
'5c10c8fd86f7743d7d706df3', // Adrenaline injector
|
|
||||||
'5c10c8fd86f7743d7d706df3', // Adrenaline injector
|
|
||||||
'544fb3f34bdc2d03748b456a' // Morphine injector
|
|
||||||
'544fb3f34bdc2d03748b456a' // Morphine injector
|
|
||||||
],
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
export class Loadouts {
|
|
||||||
|
|
||||||
public parent = "loadout";
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
];
|
|
||||||
|
|
||||||
public guaranteed_stackable = [false, false, false];
|
|
||||||
public guaranteed_reward_amount = [1,1,1];
|
|
||||||
public guaranteed_randomness = [false, false, true, false, false, false, false, false, false, false, false, false, false, false];
|
|
||||||
public guaranteed_rewards = [
|
|
||||||
'weapon', 'helmet', 'headset', 'armor', 'rig', 'backpack', 'loadout_grenade', 'loadout_grenade', 'loadout_facecovers', 'loadout_food', 'loadout_drink', 'loadout_light_bleed', 'loadout_heavy_bleed', 'loadout_stim', 'loadout_splint', 'loadout_healing',
|
|
||||||
];
|
|
||||||
|
|
||||||
public rewards = undefined;
|
|
||||||
}
|
|
||||||
|
|
@ -1,64 +0,0 @@
|
||||||
export class Medical {
|
|
||||||
|
|
||||||
public parent = "medical";
|
|
||||||
//public price_generate = true;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_uncommon",
|
|
||||||
"_uncommon",
|
|
||||||
"_uncommon",
|
|
||||||
"_uncommon",
|
|
||||||
"_uncommon",
|
|
||||||
"_uncommon",
|
|
||||||
"_uncommon"
|
|
||||||
]
|
|
||||||
|
|
||||||
public reward_rolls = [5, 5, 3, 4, 4, 3, 2] // Number of times rolled for each rarity (MAYBE)
|
|
||||||
public rewards = [
|
|
||||||
[ // Light Bleeds
|
|
||||||
'544fb25a4bdc2dfb738b4567', // Aseptic bandage
|
|
||||||
'5751a25924597722c463c472', // Army bandage
|
|
||||||
],
|
|
||||||
[ // Heavy Bleeds
|
|
||||||
'5e831507ea0a7c419c2f9bd9', // Esmarch tourniquet
|
|
||||||
'60098af40accd37ef2175f27', // CAT hemostatic tourniquet
|
|
||||||
'5e8488fa988a8701445df1e4', // CALOK-B hemostatic applicator
|
|
||||||
|
|
||||||
],
|
|
||||||
[ // Fractures
|
|
||||||
'544fb3364bdc2d34748b456a', // Immobilizing splint
|
|
||||||
'5af0454c86f7746bf20992e8', // Aluminum splint
|
|
||||||
|
|
||||||
],
|
|
||||||
[ // PainKiller
|
|
||||||
'544fb37f4bdc2dee738b4567', // Analgin painkillers
|
|
||||||
'544fb37f4bdc2dee738b4567', // Analgin painkillers
|
|
||||||
'544fb37f4bdc2dee738b4567', // Analgin painkillers
|
|
||||||
'590c695186f7741e566b64a2', // Augmentin antibiotic pills
|
|
||||||
'5755383e24597772cb798966', // Vaseline balm
|
|
||||||
'5af0548586f7743a532b7e99', // Ibuprofen painkillers
|
|
||||||
'5751a89d24597722aa0e8db0', // Golden Star balm
|
|
||||||
],
|
|
||||||
[ // Headling Kits
|
|
||||||
'5755356824597772cb798962', // AI-2 medkit
|
|
||||||
'5755356824597772cb798962', // AI-2 medkit
|
|
||||||
'590c661e86f7741e566b646a', // Car first aid kit
|
|
||||||
'544fb45d4bdc2dee738b4568', // Salewa first aid kit
|
|
||||||
],
|
|
||||||
[ // Advanced Healing Kits
|
|
||||||
'544fb45d4bdc2dee738b4568', // Salewa first aid kit
|
|
||||||
'544fb45d4bdc2dee738b4568', // Salewa first aid kit
|
|
||||||
'590c678286f77426c9660122', // IFAK individual first aid kit
|
|
||||||
'590c678286f77426c9660122', // IFAK individual first aid kit
|
|
||||||
'590c678286f77426c9660122', // IFAK individual first aid kit
|
|
||||||
'60098ad7c2240c0fe85c570a', // AFAK tactical individual first aid kit
|
|
||||||
'60098ad7c2240c0fe85c570a', // AFAK tactical individual first aid kit
|
|
||||||
'590c657e86f77412b013051d', // Grizzly medical kit
|
|
||||||
],
|
|
||||||
[ // Reapiratory Kits
|
|
||||||
'5d02778e86f774203e7dedbe', // CMS surgical kit
|
|
||||||
'5d02797c86f774203f38e30a', // Surv12 field surgical kit
|
|
||||||
]
|
|
||||||
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
export class Melees {
|
|
||||||
|
|
||||||
public parent = "melee";
|
|
||||||
public price_generate = true;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_extremely_rare",
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
"63920105a83e15700a00f168", // SOG Voodoo Hawk tactical tomahawk
|
|
||||||
"5bffe7930db834001b734a39", // Crash Axe
|
|
||||||
"601948682627df266209af05", // UVSR Taiga-1 survival machete
|
|
||||||
"65ca457b4aafb5d7fc0dcb5d", // United Cutlery M48 Tactical Kukri
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5c0126f40db834002a125382", // Red Rebel ice pick
|
|
||||||
"5bffdd7e0db834001b734a1a", // Miller Bros. Blades M-2 Tactical Sword
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5fc64ea372b0dd78d51159dc", // Cultist knife
|
|
||||||
"5bc9c1e2d4351e00367fbcf0", // Antique axe
|
|
||||||
"5c010e350db83400232feec7", // SP-8 Survival Machete
|
|
||||||
"5c012ffc0db834001d23f03f", // Camper axe
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5bffdc370db834001d23eca8", // 6Kh5 Bayonet
|
|
||||||
"57cd379a24597778e7682ecf", // Kiba Arms Tactical Tomahawk
|
|
||||||
"6540d2162ae6d96b540afcaf", // PR-Taran police baton
|
|
||||||
"54491bb74bdc2d09088b4567", // ER FULCRUM BAYONET
|
|
||||||
"5c07df7f0db834001b73588a", // Freeman crowbar
|
|
||||||
"57e26ea924597715ca604a09", // Bars A-2607 Damascus knife
|
|
||||||
"57e26fc7245977162a14b800", // Bars A-2607 95Kh18 knife
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
||||||
export class PremiumArmors {
|
|
||||||
|
|
||||||
public parent = "armor";
|
|
||||||
public price_generate = true;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
]
|
|
||||||
|
|
||||||
presets = [
|
|
||||||
"rare",
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
"5fd4c474dd870108a754b241", // 5.11 Tactical Hexgrid plate carrier
|
|
||||||
"5c0e541586f7747fa54205c9", // 6B13 M assault armor (Killa Edition)
|
|
||||||
"5e9dacf986f774054d6b89f4", // FORT Defender-2 body armor
|
|
||||||
"5ca21c6986f77479963115a7", // FORT Redut-T5 body armor (Smog)
|
|
||||||
"5ca2151486f774244a3b8d30", // FORT Redut-M body armor
|
|
||||||
"5b44cf1486f77431723e3d05", // IOTV Gen4 body armor (Assault Kit, MultiCam)
|
|
||||||
"5b44cd8b86f774503d30cba2", // IOTV Gen4 body armor (Full Protection Kit, MultiCam)
|
|
||||||
"5b44d0de86f774503d30cba8", // IOTV Gen4 body armor (High Mobility Kit, MultiCam)
|
|
||||||
"5e4abb5086f77406975c9342", // LBT-6094A Slick Plate Carrier (Black)
|
|
||||||
"6038b4ca92ec1c3103795a0d", // LBT-6094A Slick Plate Carrier (Olive Drab)
|
|
||||||
"60a283193cb70855c43a381d", // NFM THOR Integrated Carrier body armor
|
|
||||||
"5b44cad286f77402a54ae7e5", // 5.11 Tactical TacTec plate carrier (Ranger Green)
|
|
||||||
"5e4ac41886f77406a511c9a8", // Ars Arma CPC MOD.1 plate carrier (A-TACS FG)
|
|
||||||
"60a3c68c37ea821725773ef5", // CQC Osprey MK4A plate carrier (Protection, MTP)
|
|
||||||
"609e860ebd219504d8507525", // Crye Precision AVS plate carrier (Tagilla Edition)
|
|
||||||
"628b9c7d45122232a872358f", // Crye Precision CPC plate carrier (Goons Edition)
|
|
||||||
"64a5366719bab53bd203bf33", // Eagle Allied Industries MBSS plate carrier (Coyote Brown)
|
|
||||||
"628b9784bcf6e2659e09b8a2", // S&S Precision PlateFrame plate carrier (Goons Edition)
|
|
||||||
"628cd624459354321c4b7fa2", // Tasmanian Tiger SK plate carrier (MultiCam Black)
|
|
||||||
"545cdb794bdc2d3a198b456a", // 6B43 Zabralo-Sh body armor (Digital Flora)
|
|
||||||
"5c0e625a86f7742d77340f62", // BNTI Zhuk body armor (Digital Flora)
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
export class PremiumWeapons {
|
|
||||||
|
|
||||||
public parent = "weapon";
|
|
||||||
public is_preset = true;
|
|
||||||
public price_generate = true;
|
|
||||||
public calculate_preset_prices = false;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_meta",
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
"meta",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
||||||
export class RandomMysteryContainer {
|
|
||||||
|
|
||||||
public parent = "random_mystery_container";
|
|
||||||
public rarities = [
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common",
|
|
||||||
]
|
|
||||||
public rolls = 4; // number of rolls to make
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
'medical',
|
|
||||||
'keycard',
|
|
||||||
'premium_armor',
|
|
||||||
'premium_weapon',
|
|
||||||
'loadout',
|
|
||||||
'bitcoin',
|
|
||||||
'az_sealed_weapon_gamble',
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'helmet',
|
|
||||||
'armor',
|
|
||||||
'melee',
|
|
||||||
'weapon',
|
|
||||||
'armor',
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'wallet',
|
|
||||||
'key',
|
|
||||||
'stim',
|
|
||||||
'food',
|
|
||||||
'headset',
|
|
||||||
'backpack',
|
|
||||||
'rig',
|
|
||||||
'gpcoin',
|
|
||||||
'7.62x25',
|
|
||||||
'9x18',
|
|
||||||
'9x19',
|
|
||||||
'9x21',
|
|
||||||
'.357',
|
|
||||||
'.45',
|
|
||||||
'4.6x30',
|
|
||||||
'5.7x28',
|
|
||||||
'5.45x39',
|
|
||||||
'5.56x45',
|
|
||||||
'.300',
|
|
||||||
'7.62x39',
|
|
||||||
'7.62x51',
|
|
||||||
'7.62x54',
|
|
||||||
'.338',
|
|
||||||
'9x39',
|
|
||||||
'.366',
|
|
||||||
'12.7x55',
|
|
||||||
'12/70',
|
|
||||||
'20/70',
|
|
||||||
'23x75',
|
|
||||||
],
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
export class Rigs {
|
|
||||||
|
|
||||||
public parent = "rig";
|
|
||||||
public price_generate = true;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_boss",
|
|
||||||
"_late_wipe",
|
|
||||||
"_early_wipe",
|
|
||||||
"_scav"
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
'628baf0b967de16aab5a4f36', // LBT-1961A Load Bearing Chest Rig (Goons Edition)
|
|
||||||
'63611865ba5b90db0c0399d1', // Azimut SS "Khamelion" chest harness (Olive)
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'5c0e6a1586f77404597b4965', // Poyas-A + Poyas-B gear rig
|
|
||||||
'5df8a42886f77412640e2e75', // Velocity Systems MPPV Multi-Purpose Patrol Vest (Wolf Grey)
|
|
||||||
'603648ff5a45383c122086ac', // Azimut SS "Zhuk" chest harness (Black)
|
|
||||||
'6040dd4ddcf9592f401632d2', // Azimut SS "Zhuk" chest harness (SURPAT)
|
|
||||||
'592c2d1a86f7746dbe2af32a', // ANA Tactical Alpha chest rig (Olive Drab)
|
|
||||||
'5648a69d4bdc2ded0b8b457b', // BlackRock chest rig (Gray)
|
|
||||||
'5c0e9f2c86f77432297fe0a3', // BlackHawk! Commando chest harness (Black)
|
|
||||||
'5e9db13186f7742f845ee9d3', // LBT-1961A Load Bearing Chest Rig (MAS Grey)
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'5d5d85c586f774279a21cbdb', // Haley Strategic D3CRX Chest Harness (Ranger Green)
|
|
||||||
'5ca20abf86f77418567a43f2', // Dynaforce Triton M43-A chest harness (Black)
|
|
||||||
'5648a69d4bdc2ded0b8b457b', // BlackRock chest rig (Gray)
|
|
||||||
'5b44c8ea86f7742d1627baf1', // BlackHawk! Commando chest harness (Desert Tan)
|
|
||||||
'603648ff5a45383c122086ac', // Azimut SS "Zhuk" chest harness (Black)
|
|
||||||
'6040dd4ddcf9592f401632d2', // Azimut SS "Zhuk" chest harness (SURPAT)
|
|
||||||
'5c0e6a1586f77404597b4965', // Poyas-A + Poyas-B gear rig
|
|
||||||
'5f5f41f56760b4138443b352', // Direct Action Thunderbolt compact chest rig (Shadow Grey)
|
|
||||||
'5fd4c60f875c30179f5d04c2', // Gear Craft GC-BSS-MK1 chest rig (A-TACS FG)
|
|
||||||
'60a6220e953894617404b00a', // Stich Profi Chest Rig MK2 (Recon, A-TACS FG)
|
|
||||||
'60a621c49c197e4e8c4455e6', // Stich Profi Chest Rig MK2 (Assault, A-TACS FG)
|
|
||||||
'5ab8dab586f77441cd04f2a2', // WARTECH MK3 TV-104 chest rig (MultiCam)
|
|
||||||
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'572b7adb24597762ae139821', // Scav Vest
|
|
||||||
'5fd4c5477a8d854fa0105061', // Security vest
|
|
||||||
'64be7095047e826eae02b0c1', // Zulu Nylon Gear M4 Reduced Signature Chest Rig (Ranger Green)
|
|
||||||
'5e4abc1f86f774069619fbaa', // Spiritus Systems Bank Robber chest rig (MultiCam Black)
|
|
||||||
'5d5d8ca986f7742798716522', // SOE Micro Rig (MultiCam)
|
|
||||||
'64be7110bf597ba84a0a41ea', // Type 56 Chicom chest harness
|
|
||||||
'59e7643b86f7742cbf2c109a', // WARTECH TV-109 + TV-106 chest rig (A-TACS FG)
|
|
||||||
'6034d0230ca681766b6a0fb5', // CSA chest rig (Black)
|
|
||||||
'5929a2a086f7744f4b234d43', // UMTBS 6Sh112 Scout-Sniper chest rig (Digital Flora)
|
|
||||||
'5e4abfed86f77406a2713cf7', // Splav Tarzan M22 chest rig (Smog)
|
|
||||||
'6034cf5fffd42c541047f72e', // Umka M33-SET1 hunter vest (Olive Drab)
|
|
||||||
'5ab8dab586f77441cd04f2a2', // WARTECH MK3 TV-104 chest rig (MultiCam)
|
|
||||||
'60a621c49c197e4e8c4455e6', // Stich Profi Chest Rig MK2 (Assault, A-TACS FG)
|
|
||||||
'6040dd4ddcf9592f401632d2', // Azimut SS "Zhuk" chest harness (SURPAT)
|
|
||||||
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
export class Stims {
|
|
||||||
|
|
||||||
public parent = "stim";
|
|
||||||
public price_generate = true;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_extremely_rare",
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
]
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[
|
|
||||||
"5ed51652f6c34d2cc26336a1", // M.U.L.E. stimulant injector
|
|
||||||
"637b60c3b7afa97bfc3d7001", // "Obdolbos 2" cocktail injector
|
|
||||||
"5c0e534186f7747fa1419867", // eTG-change regenerative stimulant injector
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"637b612fb7afa97bfc3d7005", // SJ12 TGLabs combat stimulant injector
|
|
||||||
"5c0e531d86f7747fa23f4d42", // SJ6 TGLabs combat stimulant injector
|
|
||||||
"5ed5160a87bb8443d10680b5", // Meldonin injector
|
|
||||||
"5fca138c2a7b221b2852a5c6", // xTG-12 antidote injector
|
|
||||||
"637b620db7afa97bfc3d7009", // Trimadol stimulant injector
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"5c0e530286f7747fa1419862", // Propital regenerative stimulant injector
|
|
||||||
"5c0e533786f7747fa23f4d47", // Zagustin hemostatic drug injector
|
|
||||||
"5ed515c8d380ab312177c0fa", // 3-(b-TG) stimulant injector
|
|
||||||
"637b6251104668754b72f8f9", // Perfotoran (Blue Blood) stimulant injector
|
|
||||||
"637b6179104668754b72f8f5", // PNB (Product 16) stimulant injector
|
|
||||||
"5fca13ca637ee0341a484f46", // SJ9 TGLabs combat stimulant injector
|
|
||||||
"5ed5166ad380ab312177c100", // "Obdolbos" cocktail injector
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"544fb3f34bdc2d03748b456a", // Morphine injector
|
|
||||||
"5ed515e03a40a50460332579", // L1 (Norepinephrine) injector
|
|
||||||
"5c10c8fd86f7743d7d706df3", // Adrenaline injector
|
|
||||||
"5c0e531286f7747fa54205c2", // SJ1 TGLabs combat stimulant injector
|
|
||||||
"5ed515f6915ec335206e4152", // AHF1-M stimulant injector
|
|
||||||
"5ed515ece452db0eb56fc028", // P22 (Product 22) stimulant injector
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
export class Wallet {
|
|
||||||
|
|
||||||
public parent = "wallet";
|
|
||||||
public price_generate = true;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_kinda_rare",
|
|
||||||
"_rare",
|
|
||||||
"_extra_uncommon",
|
|
||||||
"_more_uncommon",
|
|
||||||
"_uncommon",
|
|
||||||
"_common",
|
|
||||||
"_extra_common",
|
|
||||||
"_base"
|
|
||||||
]
|
|
||||||
public stackable = [true, true, true, true, true, true, true, true]
|
|
||||||
public reward_amount = [
|
|
||||||
2000000,
|
|
||||||
1000000,
|
|
||||||
500000,
|
|
||||||
250000,
|
|
||||||
100000,
|
|
||||||
50000,
|
|
||||||
25000,
|
|
||||||
0
|
|
||||||
]
|
|
||||||
public rewards = [
|
|
||||||
['5449016a4bdc2d6f028b456f'],
|
|
||||||
['5449016a4bdc2d6f028b456f'],
|
|
||||||
['5449016a4bdc2d6f028b456f'],
|
|
||||||
['5449016a4bdc2d6f028b456f'],
|
|
||||||
['5449016a4bdc2d6f028b456f'],
|
|
||||||
['5449016a4bdc2d6f028b456f'],
|
|
||||||
['5449016a4bdc2d6f028b456f'],
|
|
||||||
['NaN']
|
|
||||||
]
|
|
||||||
|
|
||||||
/*
|
|
||||||
public items = {
|
|
||||||
wallet_extremely_rare: [
|
|
||||||
1000000
|
|
||||||
],
|
|
||||||
|
|
||||||
wallet_rare: [
|
|
||||||
500000
|
|
||||||
],
|
|
||||||
|
|
||||||
wallet_kinda_rare: [
|
|
||||||
300000
|
|
||||||
],
|
|
||||||
|
|
||||||
wallet_uncommon: [
|
|
||||||
100000
|
|
||||||
],
|
|
||||||
|
|
||||||
wallet_common: [
|
|
||||||
50000
|
|
||||||
]
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,224 +0,0 @@
|
||||||
export class Keys {
|
|
||||||
|
|
||||||
public parent = "key";
|
|
||||||
public price_generate = true;
|
|
||||||
|
|
||||||
public rarities = [
|
|
||||||
"_extremely_rare",
|
|
||||||
"_rare",
|
|
||||||
"_uncommon",
|
|
||||||
"_common"
|
|
||||||
]
|
|
||||||
|
|
||||||
// 0.2.0 Keys Total = 143 - 1 broken key
|
|
||||||
// 0.2.1 Keys Total = 216 - 1 broken key
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public rewards = [
|
|
||||||
[ // Extremely Rare
|
|
||||||
"5d80c60f86f77440373c4ece", // RB-BK
|
|
||||||
"5d80c62a86f7744036212b3f", // RB-VO
|
|
||||||
"63a3a93f8a56922e82001f5d", // Abandoned Marked Key
|
|
||||||
"5780cf7f2459777de4559322", // 314 Dorms Marked Key
|
|
||||||
"64ccc25f95763a1ae376e447", // Mysterious Room Marked Key
|
|
||||||
"63a39fc0af870e651d58e6ae", // Chek 15 key
|
|
||||||
"5ede7a8229445733cb4c18e2", // RB-PKPM Key
|
|
||||||
"64d4b23dc1b37504b41ac2b6", // Rusted bloody key
|
|
||||||
],
|
|
||||||
[ // Rare
|
|
||||||
"664d3db6db5dea2bad286955", // Shatun's hideout
|
|
||||||
"664d3dd590294949fe2d81b7", // Grumpy's hideout key
|
|
||||||
"664d3ddfdda2e85aca370d75", // Voron's hideout key
|
|
||||||
"664d3de85f2355673b09aed5", // Leon's hideout key
|
|
||||||
"5c1f79a086f7746ed066fb8f", // TerraGroup Labs arsenal storage room key
|
|
||||||
"63a397d3af870e651d58e65b", // Car dealership closed section key
|
|
||||||
"5e42c71586f7747f245e1343", // ULTRA medical storage key
|
|
||||||
"62987dfc402c7f69bf010923", // Shared bedroom marked key
|
|
||||||
"5448ba0b4bdc2d02308b456c", // Factory emergency exit key
|
|
||||||
"5ad5d7d286f77450166e0a89", // Kiba Arms outer door key
|
|
||||||
"63a71e922b25f7513905ca20", // Concordia apartment 64 key
|
|
||||||
"5d08d21286f774736e7c94c3", // Shturman's stash key
|
|
||||||
"63a39f6e64283b5e9c56b289", // Iron gate key
|
|
||||||
"5eff09cd30a7dc22fd1ddfed", // Health Resort office key with a blue tape
|
|
||||||
"6398fd8ad3de3849057f5128", // Backup hideout key
|
|
||||||
],
|
|
||||||
[ // Uncommon
|
|
||||||
"5c1e2d1f86f77431e9280bee", // TerraGroup Labs weapon testing area key
|
|
||||||
"5ad7247386f7747487619dc3", // Goshan cash register key
|
|
||||||
"61aa5b7db225ac1ead7957c1", // USEC cottage first safe key
|
|
||||||
"64ccc246ff54fb38131acf29", // X-ray room key
|
|
||||||
"61aa5ba8018e9821b7368da9", // USEC cottage second safe key
|
|
||||||
"5c1e2a1e86f77431ea0ea84c", // TerraGroup Labs manager's office room key
|
|
||||||
"5a0eb6ac86f7743124037a28", // Cottage back door key
|
|
||||||
"64ce572331dd890873175115", // Aspect company office key
|
|
||||||
"63a39f08cd6db0635c197600", // Pinewood hotel room 215 key
|
|
||||||
"5ad5db3786f7743568421cce", // EMERCOM medical unit key
|
|
||||||
"63a399193901f439517cafb6", // Car dealership director's office room key
|
|
||||||
"5ad5d64486f774079b080af8", // NecrusPharm pharmacy key
|
|
||||||
"63a71e86b7f4570d3a293169", // Concordia apartment 64 office room key
|
|
||||||
"64ccc24de61ea448b507d34d", // TerraGroup security armory key
|
|
||||||
"64ccc1fe088064307e14a6f7", // Beluga restaurant director key
|
|
||||||
"5d80cbd886f77470855c26c2", // RB-MP13 key
|
|
||||||
"5d80cbd886f77470855c26c2", // RB-MP13 key
|
|
||||||
"63a39c7964283b5e9c56b280", // Concordia security room key
|
|
||||||
"5d8e3ecc86f774414c78d05e", // RB-GN key
|
|
||||||
"63a71ed21031ac76fe773c7f", // Financial institution small office key
|
|
||||||
"5d80c6fc86f774403a401e3c", // RB-TB key
|
|
||||||
"5d80c8f586f77440373c4ed0", // RB-OP key
|
|
||||||
"62987cb98081af308d7558c8", // Conference room key
|
|
||||||
"5d80cb5686f77440545d1286", // RB-PSV1 key
|
|
||||||
"5d95d6be86f77424444eb3a7", // RB-PSV2 key
|
|
||||||
"61a64492ba05ef10d62adcc1", // Rogue USEC stash key
|
|
||||||
"5d8e15b686f774445103b190", // HEP station storage room key
|
|
||||||
"61aa81fcb225ac1ead7957c3", // Rogue USEC workshop key
|
|
||||||
"63a71e781031ac76fe773c7d", // Concordia apartment 8 room key
|
|
||||||
"5d80cb3886f77440556dbf09", // RB-PSP1 key
|
|
||||||
"5d80ca9086f774403a401e40", // RB-MP21 key
|
|
||||||
"62987e26a77ec735f90a2995", // Water treatment plant storage room key
|
|
||||||
"5a0f006986f7741ffd2fe484", // Weather station safe key
|
|
||||||
"5a0448bc86f774736f14efa8", // Key to the closed premises of the Health Resort
|
|
||||||
"63a39e1d234195315d4020bd", // Primorsky 46-48 skybridge key
|
|
||||||
//"6391fcf5744e45201147080f", // Primorsky Ave apartment key
|
|
||||||
"5d80ccdd86f77474f7575e02", // RB-ORB2 key
|
|
||||||
"5d947d4e86f774447b415895", // RB-KSM key
|
|
||||||
"5d8e0e0e86f774321140eb56", // RB-KPRL key
|
|
||||||
"64ccc1ec1779ad6ba200a137", // Concordia apartment 8 home cinema key
|
|
||||||
"5d9f1fa686f774726974a992", // RB-ST key
|
|
||||||
"64ccc1d4a0f13c24561edf27", // Concordia apartment 34 room key
|
|
||||||
"5a0f0f5886f7741c4e32a472", // Health Resort management warehouse safe key
|
|
||||||
"5a0f08bc86f77478f33b84c2", // Health Resort management office safe key
|
|
||||||
"5a0ea79b86f7741d4a35298e", // Health Resort universal utility room key
|
|
||||||
"5a13f35286f77413ef1436b0", // Health Resort east wing room 226 key
|
|
||||||
"5a145d7b86f7744cbb6f4a13", // Health Resort east wing room 308 key
|
|
||||||
"5a0ea64786f7741707720468", // Health Resort east wing office room 107 key
|
|
||||||
"5a144bdb86f7741d374bbde0", // Health Resort east wing room 205 key
|
|
||||||
"5a0ee4b586f7743698200d22", // Health Resort east wing room 206 key
|
|
||||||
"5a0ee72c86f77436955d3435", // Health Resort east wing room 213 key
|
|
||||||
"5a0ee76686f7743698200d5c", // Health Resort east wing room 216 key
|
|
||||||
"5a13f24186f77410e57c5626", // Health Resort east wing room 222 key
|
|
||||||
"5a145d4786f7744cbb6f4a12", // Health Resort east wing room 306 key
|
|
||||||
"5a0eec9686f77402ac5c39f2", // Health Resort east wing room 310 key
|
|
||||||
"5a0eecf686f7740350630097", // Health Resort east wing room 313 key
|
|
||||||
"5a0eed4386f77405112912aa", // Health Resort east wing room 314 key
|
|
||||||
"5a145ebb86f77458f1796f05", // Health Resort east wing room 316 key
|
|
||||||
"5a0eee1486f77402aa773226", // Health Resort east wing room 328 key
|
|
||||||
"5a0dc45586f7742f6b0b73e3", // Health Resort west wing office room 104 key
|
|
||||||
"5a0dc95c86f77452440fc675", // Health Resort west wing office room 112 key
|
|
||||||
"5a144dfd86f77445cb5a0982", // Health Resort west wing room 203 key
|
|
||||||
"5a0ec6d286f7742c0b518fb5", // Health Resort west wing room 205 key
|
|
||||||
"5a0ee30786f774023b6ee08f", // Health Resort west wing room 216 key
|
|
||||||
"5a13eebd86f7746fd639aa93", // Health Resort west wing room 218 key
|
|
||||||
"5a13ef0686f7746e5a411744", // Health Resort west wing room 219 key
|
|
||||||
"5a0ee34586f774023b6ee092", // Health Resort west wing room 220 key
|
|
||||||
"5a0ee37f86f774023657a86f", // Health Resort west wing room 221 key
|
|
||||||
"5a1452ee86f7746f33111763", // Health Resort west wing room 222 key
|
|
||||||
"5a13ef7e86f7741290491063", // Health Resort west wing room 301 key
|
|
||||||
"5a0eeb1a86f774688b70aa5c", // Health Resort west wing room 303 key
|
|
||||||
"5a13f46386f7741dd7384b04", // Health Resort west wing room 306 key
|
|
||||||
"5a0eff2986f7741fd654e684", // Health Resort west wing room 321 safe key
|
|
||||||
"63a39cb1c9b3aa4b61683ee2", // Construction site bunkhouse key
|
|
||||||
"5d80c93086f7744036212b41", // RB-MP11 key
|
|
||||||
"63a39ce4cd6db0635c1975fa", // Supply department director's office key
|
|
||||||
"5da5cdcd86f774529238fb9b", // RB-RH key
|
|
||||||
"5d80c95986f77440351beef3", // RB-MP12 key
|
|
||||||
"5d80c66d86f774405611c7d6", // RB-AO key
|
|
||||||
"63a39fdf1e21260da44a0256", // Cargo container mesh door key
|
|
||||||
"63a39fd1c9b3aa4b61683efb", // Stair landing key
|
|
||||||
"63a71eb5b7f4570d3a29316b", // Primorsky 48 apartment key
|
|
||||||
"5d95d6fa86f77424484aa5e9", // RB-PSP2 key
|
|
||||||
"5d80cab086f77440535be201", // RB-MP22 key
|
|
||||||
"5d80c88d86f77440556dbf07", // RB-AM key
|
|
||||||
"5a0f068686f7745b0d4ea242", // Cottage safe key
|
|
||||||
"62987c658081af308d7558c6", // Radar station commandant room key
|
|
||||||
"5780cf722459777a5108b9a1", // Dorm room 308 key
|
|
||||||
"5d80cd1a86f77402aa362f42", // RB-ORB3 key
|
|
||||||
"5d947d3886f774447b415893", // RB-SMP key
|
|
||||||
"5d80ccac86f77470841ff452", // RB-ORB1 key
|
|
||||||
"5913877a86f774432f15d444", // Gas station storage room key
|
|
||||||
"59387a4986f77401cc236e62", // Dorm room 114 key
|
|
||||||
"5addaffe86f77470b455f900", // Kiba Arms inner grate door key
|
|
||||||
"6582dbf0b8d7830efc45016f", // Relaxation room key
|
|
||||||
"6582dc5740562727a654ebb1", // Real estate agency office room key
|
|
||||||
"5d80c6c586f77440351beef1", // RB-OB key
|
|
||||||
"63a39667c9b3aa4b61683e98", // Financial institution office key
|
|
||||||
"5448ba0b4bdc2d02308b456c", // Factory emergency exit key
|
|
||||||
"64ccc1f4ff54fb38131acf27", // Concordia apartment 63 room key
|
|
||||||
"5ad5cfbd86f7742c825d6104", // OLI logistics department office key
|
|
||||||
"62987da96188c076bc0d8c51", // Operating room key
|
|
||||||
"64ccc206793ca11c8f450a38", // TerraGroup meeting room key
|
|
||||||
"5da743f586f7744014504f72", // USEC stash key
|
|
||||||
"5ad7217186f7746744498875", // OLI cash register key
|
|
||||||
"61a64428a8c6aa1b795f0ba1", // Convenience store storage room key
|
|
||||||
"5a0f045e86f7745b0f0d0e42", // Gas station safe key
|
|
||||||
"66265d7be65f224b2e17c6aa", // USEC cottage room key
|
|
||||||
"5d80c78786f774403a401e3e", // RB-AK key
|
|
||||||
],
|
|
||||||
[ // Common
|
|
||||||
"5780d0532459777a5108b9a2", // Tarcone Director's office key
|
|
||||||
"61aa5b518f5e7a39b41416e2", // Merin car trunk key
|
|
||||||
"5d8e0db586f7744450412a42", // RB-KORL key
|
|
||||||
"5913915886f774123603c392", // Military checkpoint key
|
|
||||||
"5780d0652459777df90dcb74", // Gas station office key
|
|
||||||
"62a9cb937377a65d7b070cef", // Rogue USEC barrack key
|
|
||||||
"64ccc2111779ad6ba200a139", // Tarbank cash register department key
|
|
||||||
"591382d986f774465a6413a7", // Dorm room 105 key
|
|
||||||
"61a6444b8c141d68246e2d2f", // Hillside house key
|
|
||||||
"6582dc4b6ba9e979af6b79f4", // MVD academy entrance hall guard room key
|
|
||||||
"62a09ec84f842e1bd12da3f2", // Missam forklift key
|
|
||||||
"63a39c69af870e651d58e6aa", // Store manager's key
|
|
||||||
"63a39dfe3901f439517cafba", // Zmeisky 3 apartment 8 key
|
|
||||||
"63a39df18a56922e82001f25", // Zmeisky 5 apartment 20 key
|
|
||||||
"57a349b2245977762b199ec7", // Pumping station front door key
|
|
||||||
"593858c486f774253a24cb52", // Pumping station back door key
|
|
||||||
"591ae8f986f77406f854be45", // Yotota car key
|
|
||||||
"5780d07a2459777de4559324", // Portable cabin key
|
|
||||||
"6582dbe43a2e5248357dbe9a", // "Negotiation" room key
|
|
||||||
"5a0dc45586f7742f6b0b73e3", // SMW car key
|
|
||||||
"64ccc268c41e91416064ebc7", // PE teacher's office key
|
|
||||||
"59136f6f86f774447a1ed173", // Folding car key
|
|
||||||
"59136a4486f774447a1ed172", // Dorm guard desk key
|
|
||||||
"5938994586f774523a425196", // Dorm room 103 key
|
|
||||||
"591383f186f7744a4c5edcf3", // Dorm room 104 key
|
|
||||||
"591382d986f774465a6413a7", // Dorm room 104 key
|
|
||||||
"5914578086f774123569ffa4", // Dorm room 108 key
|
|
||||||
"59136e1e86f774432f15d133", // Dorm room 110 key
|
|
||||||
"5672c92d4bdc2d180f8b4567", // Dorm room 118 key
|
|
||||||
"5938504186f7740991483f30", // Dorm room 203 key
|
|
||||||
"59148c8a86f774197930e983", // Dorm room 204 key
|
|
||||||
"5938603e86f77435642354f4", // Dorm room 206 key
|
|
||||||
"5780cf942459777df90dcb72", // Dorm room 214 key
|
|
||||||
"5780cf9e2459777df90dcb73", // Dorm room 218 key
|
|
||||||
"5780cfa52459777dfb276eb1", // Dorm room 220 key
|
|
||||||
"593aa4be86f77457f56379f8", // Dorm room 303 key
|
|
||||||
"5780cda02459777b272ede61", // Dorm room 306 key
|
|
||||||
"5780cf722459777a5108b9a1", // Dorm room 308 key
|
|
||||||
"5780cf692459777de4559321", // Dorm room 315 key
|
|
||||||
"5da46e3886f774653b7a83fe", // RB-RS key
|
|
||||||
"5ad7242b86f7740a6a3abd43", // IDEA cash register key
|
|
||||||
"5a0ec70e86f7742c0b518fba", // Health Resort west wing room 207 key
|
|
||||||
"5a0eeb8e86f77461257ed71a", // Health Resort west wing room 309 key
|
|
||||||
"5a0ea69f86f7741cd5406619", // Health Resort east wing office room 108 key
|
|
||||||
"5a0ee62286f774369454a7ac", // Health Resort east wing room 209 key
|
|
||||||
"5a0eedb386f77403506300be", // Health Resort east wing room 322 key
|
|
||||||
"5a0eebed86f77461230ddb3d", // Health Resort west wing room 325 key
|
|
||||||
"5a13ee1986f774794d4c14cd", // Health Resort west wing room 323 key
|
|
||||||
"63a39e49cd6db0635c1975fc", // Archive room key
|
|
||||||
"63a39f18c2d53c2c6839c1d3", // Pinewood hotel room 206 key
|
|
||||||
"5ad5ccd186f774446d5706e9", // OLI administration office key
|
|
||||||
"5938144586f77473c2087145", // Portable bunkhouse key
|
|
||||||
"5937ee6486f77408994ba448", // Machinery key
|
|
||||||
"5ad5d49886f77455f9731921", // Power substation utility cabin key
|
|
||||||
"658199972dc4e60f6d556a2f", // Underground parking utility room key
|
|
||||||
"5d80cb8786f774405611c7d9", // RB-PP key
|
|
||||||
"5ad5d20586f77449be26d877", // OLI outlet utility room key
|
|
||||||
"6581998038c79576a2569e11", // Unity Credit Bank cash register key
|
|
||||||
"5913651986f774432f15d132", // VAZ car key
|
|
||||||
"5a0f075686f7745bcc42ee12", // Store safe key
|
|
||||||
"5913611c86f77479e0084092", // Trailer park portable cabin key
|
|
||||||
"59148f8286f7741b951ea113", // Weapon safe key
|
|
||||||
"61aa5aed32a4743c3453d319", // Police truck cabin key
|
|
||||||
"591afe0186f77431bd616a11", // ZB-014 key
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,177 +0,0 @@
|
||||||
import { Item } from "@spt/models/eft/common/tables/IItem";
|
|
||||||
import { IBarterScheme, ITrader } from "@spt/models/eft/common/tables/ITrader";
|
|
||||||
import { Money } from "@spt/models/enums/Money";
|
|
||||||
import { ILogger } from "@spt/models/spt/utils/ILogger";
|
|
||||||
import { HashUtil } from "@spt/utils/HashUtil";
|
|
||||||
|
|
||||||
export class FluentAssortConstructor
|
|
||||||
{
|
|
||||||
protected itemsToSell: Item[] = [];
|
|
||||||
protected barterScheme: Record<string, IBarterScheme[][]> = {};
|
|
||||||
protected loyaltyLevel: Record<string, number> = {};
|
|
||||||
protected hashUtil: HashUtil;
|
|
||||||
protected logger: ILogger;
|
|
||||||
|
|
||||||
constructor(hashutil: HashUtil, logger: ILogger)
|
|
||||||
{
|
|
||||||
this.hashUtil = hashutil
|
|
||||||
this.logger = logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Start selling item with tpl
|
|
||||||
* @param itemTpl Tpl id of the item you want trader to sell
|
|
||||||
* @param itemId Optional - set your own Id, otherwise unique id will be generated
|
|
||||||
*/
|
|
||||||
public createSingleAssortItem(itemTpl: string, itemId = undefined): FluentAssortConstructor
|
|
||||||
{
|
|
||||||
// Create item ready for insertion into assort table
|
|
||||||
const newItemToAdd: Item = {
|
|
||||||
_id: !itemId ? this.hashUtil.generate(): itemId,
|
|
||||||
_tpl: itemTpl,
|
|
||||||
parentId: "hideout", // Should always be "hideout"
|
|
||||||
slotId: "hideout", // Should always be "hideout"
|
|
||||||
upd: {
|
|
||||||
UnlimitedCount: false,
|
|
||||||
StackObjectsCount: 100
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
this.itemsToSell.push(newItemToAdd);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public createComplexAssortItem(items: Item[]): FluentAssortConstructor
|
|
||||||
{
|
|
||||||
items[0].parentId = "hideout";
|
|
||||||
items[0].slotId = "hideout";
|
|
||||||
|
|
||||||
if (!items[0].upd)
|
|
||||||
{
|
|
||||||
items[0].upd = {}
|
|
||||||
}
|
|
||||||
|
|
||||||
items[0].upd.UnlimitedCount = false;
|
|
||||||
items[0].upd.StackObjectsCount = 100;
|
|
||||||
|
|
||||||
this.itemsToSell.push(...items);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public addStackCount(stackCount: number, unlimited: boolean = false): FluentAssortConstructor
|
|
||||||
{
|
|
||||||
this.itemsToSell[0].upd.StackObjectsCount = stackCount;
|
|
||||||
|
|
||||||
if (unlimited) this.itemsToSell[0].upd.UnlimitedCount = true;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public addUnlimitedStackCount(): FluentAssortConstructor
|
|
||||||
{
|
|
||||||
this.itemsToSell[0].upd.StackObjectsCount = 999999;
|
|
||||||
this.itemsToSell[0].upd.UnlimitedCount = true;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public makeStackCountUnlimited(): FluentAssortConstructor
|
|
||||||
{
|
|
||||||
this.itemsToSell[0].upd.StackObjectsCount = 999999;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public addBuyRestriction(maxBuyLimit: number): FluentAssortConstructor
|
|
||||||
{
|
|
||||||
this.itemsToSell[0].upd.BuyRestrictionMax = maxBuyLimit;
|
|
||||||
this.itemsToSell[0].upd.BuyRestrictionCurrent = 0;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public addLoyaltyLevel(level: number)
|
|
||||||
{
|
|
||||||
this.loyaltyLevel[this.itemsToSell[0]._id] = level;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public addMoneyCost(currencyType: Money, amount: number): FluentAssortConstructor
|
|
||||||
{
|
|
||||||
this.barterScheme[this.itemsToSell[0]._id] = [
|
|
||||||
[
|
|
||||||
{
|
|
||||||
count: amount,
|
|
||||||
_tpl: currencyType
|
|
||||||
}
|
|
||||||
]
|
|
||||||
];
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public addBarterCost(itemTpl: string, count: number): FluentAssortConstructor
|
|
||||||
{
|
|
||||||
const sellableItemId = this.itemsToSell[0]._id;
|
|
||||||
|
|
||||||
// No data at all, create
|
|
||||||
if (Object.keys(this.barterScheme).length === 0)
|
|
||||||
{
|
|
||||||
this.barterScheme[sellableItemId] = [[
|
|
||||||
{
|
|
||||||
count: count,
|
|
||||||
_tpl: itemTpl
|
|
||||||
}
|
|
||||||
]];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Item already exists, add to
|
|
||||||
const existingData = this.barterScheme[sellableItemId][0].find(x => x._tpl === itemTpl);
|
|
||||||
if (existingData)
|
|
||||||
{
|
|
||||||
// itemtpl already a barter for item, add to count
|
|
||||||
existingData.count+= count;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// No barter for item, add it fresh
|
|
||||||
this.barterScheme[sellableItemId][0].push({
|
|
||||||
count: count,
|
|
||||||
_tpl: itemTpl
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset objet ready for reuse
|
|
||||||
* @returns
|
|
||||||
*/
|
|
||||||
public export(data: ITrader): FluentAssortConstructor
|
|
||||||
{
|
|
||||||
const itemBeingSoldId = this.itemsToSell[0]._id;
|
|
||||||
if (data.assort.items.find(x => x._id === itemBeingSoldId))
|
|
||||||
{
|
|
||||||
this.logger.error(`Unable to add complex item with item key ${this.itemsToSell[0]._id}, key already used`);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
data.assort.items.push(...this.itemsToSell);
|
|
||||||
data.assort.barter_scheme[itemBeingSoldId] = this.barterScheme[itemBeingSoldId];
|
|
||||||
data.assort.loyal_level_items[itemBeingSoldId] = this.loyaltyLevel[itemBeingSoldId];
|
|
||||||
|
|
||||||
this.itemsToSell = [];
|
|
||||||
this.barterScheme = {};
|
|
||||||
this.loyaltyLevel = {};
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,132 +0,0 @@
|
||||||
import { DependencyContainer } from "tsyringe";
|
|
||||||
import { CustomItemService } from "@spt/services/mod/CustomItemService";
|
|
||||||
import { NewItemDetails } from "@spt/models/spt/mod/NewItemDetails";
|
|
||||||
import { NewItemFromCloneDetails } from "@spt/models/spt/mod/NewItemDetails";
|
|
||||||
import { MysteryContainerInfo } from "./MysteryContainerInfo";
|
|
||||||
import { itemProps } from "./MysteryContainerInfo";
|
|
||||||
import * as fs from 'fs';
|
|
||||||
import { jsonc } from "jsonc";
|
|
||||||
import path from "path";
|
|
||||||
|
|
||||||
export class ItemCreateHelper {
|
|
||||||
|
|
||||||
public config: any;
|
|
||||||
public loot: Array<NewItemFromCloneDetails> = [];
|
|
||||||
|
|
||||||
// builds all mystery containers and pushes to database
|
|
||||||
public createItems(container: DependencyContainer) {
|
|
||||||
this.config = jsonc.parse(fs.readFileSync(path.resolve(__dirname, "../config/config.jsonc"), "utf-8"));
|
|
||||||
const info: Record<string, itemProps> = MysteryContainerInfo(this.config);
|
|
||||||
const customItem = container.resolve<CustomItemService>("CustomItemService");
|
|
||||||
|
|
||||||
for (const [_, value] of Object.entries(info)) {
|
|
||||||
|
|
||||||
const item: NewItemDetails = {
|
|
||||||
newItem: {
|
|
||||||
_id: value._id,
|
|
||||||
_name: value._name,
|
|
||||||
_parent: "62f109593b54472778797866",
|
|
||||||
_props: {
|
|
||||||
"AnimationVariantsNumber": 0,
|
|
||||||
"BackgroundColor": "orange",
|
|
||||||
"BlocksArmorVest": false,
|
|
||||||
"CanPutIntoDuringTheRaid": true,
|
|
||||||
"CanRequireOnRagfair": false,
|
|
||||||
"CanSellOnRagfair": false,
|
|
||||||
"CantRemoveFromSlotsDuringRaid": [],
|
|
||||||
"ConflictingItems": [],
|
|
||||||
"Description": value.desc,
|
|
||||||
"DiscardLimit": -1,
|
|
||||||
"DiscardingBlock": false,
|
|
||||||
"DropSoundType": "None",
|
|
||||||
"ExamineExperience": 100,
|
|
||||||
"ExamineTime": 1,
|
|
||||||
"ExaminedByDefault": true,
|
|
||||||
"ExtraSizeDown": 0,
|
|
||||||
"ExtraSizeForceAdd": false,
|
|
||||||
"ExtraSizeLeft": 0,
|
|
||||||
"ExtraSizeRight": 0,
|
|
||||||
"ExtraSizeUp": 0,
|
|
||||||
"Grids": [
|
|
||||||
{
|
|
||||||
"_id": "6489c03c8bc5233fdc78e789",
|
|
||||||
"_name": "main",
|
|
||||||
"_parent": "6489c03c8bc5233fdc78e788",
|
|
||||||
"_props": {
|
|
||||||
"cellsH": 1,
|
|
||||||
"cellsV": 1,
|
|
||||||
"filters": [
|
|
||||||
{
|
|
||||||
"ExcludedFilter": [
|
|
||||||
"54009119af1c881c07000029"
|
|
||||||
],
|
|
||||||
"Filter": []
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"isSortingTable": false,
|
|
||||||
"maxCount": 99,
|
|
||||||
"maxWeight": 0,
|
|
||||||
"minCount": 1
|
|
||||||
},
|
|
||||||
"_proto": "55d329c24bdc2d892f8b4567"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"Height": value.height,
|
|
||||||
"HideEntrails": true,
|
|
||||||
"InsuranceDisabled": false,
|
|
||||||
"IsAlwaysAvailableForInsurance": false,
|
|
||||||
"IsLockedafterEquip": false,
|
|
||||||
"IsSpecialSlotOnly": false,
|
|
||||||
"IsUnbuyable": false,
|
|
||||||
"IsUndiscardable": false,
|
|
||||||
"IsUngivable": false,
|
|
||||||
"IsUnremovable": false,
|
|
||||||
"IsUnsaleable": false,
|
|
||||||
"ItemSound": "container_plastic",
|
|
||||||
"LootExperience": 20,
|
|
||||||
"MergesWithChildren": false,
|
|
||||||
"Name": value.name,
|
|
||||||
"NotShownInSlot": false,
|
|
||||||
"Prefab": {
|
|
||||||
"path": value.prefab,
|
|
||||||
"rcid": ""
|
|
||||||
},
|
|
||||||
"QuestItem": false,
|
|
||||||
"QuestStashMaxCount": 0,
|
|
||||||
"RagFairCommissionModifier": 1,
|
|
||||||
"RepairCost": 0,
|
|
||||||
"RepairSpeed": 0,
|
|
||||||
"SearchSound": "drawer_metal_looting",
|
|
||||||
"ShortName": value.shortName,
|
|
||||||
"Slots": [],
|
|
||||||
"StackMaxSize": 1,
|
|
||||||
"StackObjectsCount": 1,
|
|
||||||
"Unlootable": false,
|
|
||||||
"UnlootableFromSide": [],
|
|
||||||
"UnlootableFromSlot": "FirstPrimaryWeapon",
|
|
||||||
"UsePrefab": {
|
|
||||||
"path": "",
|
|
||||||
"rcid": ""
|
|
||||||
},
|
|
||||||
"Weight": 2,
|
|
||||||
"Width": value.width,
|
|
||||||
"ReverbVolume": 0
|
|
||||||
},
|
|
||||||
_proto: "",
|
|
||||||
_type: "Item"
|
|
||||||
},
|
|
||||||
fleaPriceRoubles: value.fleaPriceRoubles,
|
|
||||||
handbookPriceRoubles: value.handbookPriceRoubles,
|
|
||||||
handbookParentId: "5b5f6fa186f77409407a7eb7",
|
|
||||||
locales: {
|
|
||||||
"en": {
|
|
||||||
name: value.name,
|
|
||||||
shortName: value.shortName,
|
|
||||||
description: value.desc
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
customItem.createItem(item)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,182 +0,0 @@
|
||||||
import { DependencyContainer } from "tsyringe";
|
|
||||||
import { HashUtil } from "@spt/utils/HashUtil";
|
|
||||||
import { Item } from "@spt/models/eft/common/tables/IItem";
|
|
||||||
import { ItemHelper } from "@spt/helpers/ItemHelper";
|
|
||||||
import { Weapons } from "./containers/Weapons";
|
|
||||||
import { Helmets } from "./containers/Helmets";
|
|
||||||
import { Armors } from "./containers/Armors";
|
|
||||||
|
|
||||||
|
|
||||||
export class ItemCreator {
|
|
||||||
|
|
||||||
public armors: any;
|
|
||||||
public helmets: any;
|
|
||||||
public weapons: any;
|
|
||||||
public headsetCompatible: boolean;
|
|
||||||
public caliber: string;
|
|
||||||
public magazine: string;
|
|
||||||
public magazineMaxAmmo: number;
|
|
||||||
public weaponType: string;
|
|
||||||
private hashUtil: HashUtil;
|
|
||||||
private itemHelper: ItemHelper;
|
|
||||||
|
|
||||||
constructor(container: DependencyContainer){
|
|
||||||
this.armors = new Armors();
|
|
||||||
this.helmets = new Helmets();
|
|
||||||
this.weapons = new Weapons();
|
|
||||||
this.headsetCompatible = true;
|
|
||||||
this.hashUtil = container.resolve<HashUtil>("HashUtil");
|
|
||||||
this.itemHelper = container.resolve<ItemHelper>("ItemHelper");
|
|
||||||
}
|
|
||||||
|
|
||||||
// getRandomInt(3) returns 0, 1, or 2
|
|
||||||
private getRandomInt(max: number) {
|
|
||||||
return Math.floor(Math.random() * max);
|
|
||||||
}
|
|
||||||
|
|
||||||
public createPreset(name: string, rarity: string): Item{
|
|
||||||
let itemPreset: Item[] = [];
|
|
||||||
//console.log('createPreset ' + name + ' ' + rarity)
|
|
||||||
|
|
||||||
switch(name){
|
|
||||||
case 'helmet':
|
|
||||||
itemPreset = this.createHelmet(rarity);
|
|
||||||
break;
|
|
||||||
case 'armor':
|
|
||||||
itemPreset = this.createArmor(rarity);
|
|
||||||
break;
|
|
||||||
case 'weapon':
|
|
||||||
itemPreset = this.createGun(rarity);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return itemPreset
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns a random helmet from helmets
|
|
||||||
private createHelmet(which: string): Item{
|
|
||||||
let baseHelmet: Item[];
|
|
||||||
|
|
||||||
for(let i = 0; i < this.helmets.rarities.length; i++){
|
|
||||||
if (which === this.helmets.rarities[i]) {
|
|
||||||
baseHelmet = this.helmets.presets[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const randomHelmet = this.getRandomInt(baseHelmet.length);
|
|
||||||
let getItem = baseHelmet[randomHelmet];
|
|
||||||
|
|
||||||
return this.generateItem(getItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns a random Armor from armors
|
|
||||||
private createArmor(which: string): Item{
|
|
||||||
let baseArmor: Item[];
|
|
||||||
|
|
||||||
for(let i = 0; i < this.armors.rarities.length; i++){
|
|
||||||
if (which === this.armors.rarities[i]) {
|
|
||||||
baseArmor = this.armors.presets[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const randomArmor = this.getRandomInt(baseArmor.length);
|
|
||||||
let getItem = baseArmor[randomArmor];
|
|
||||||
|
|
||||||
return this.generateItem(getItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns a random gun from weapons
|
|
||||||
private createGun(which: string): Item{
|
|
||||||
let weaponBuilds: Item[];
|
|
||||||
|
|
||||||
|
|
||||||
for(let i = 0; i < this.weapons.rarities.length; i++){
|
|
||||||
if (which === this.weapons.rarities[i]) {
|
|
||||||
weaponBuilds = this.weapons.presets[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const randomBuild = this.getRandomInt(weaponBuilds.length);
|
|
||||||
let getItem = weaponBuilds[randomBuild];
|
|
||||||
this.weaponType = which;
|
|
||||||
return this.generateItem(getItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
private generateItem(build: any): Item[] {
|
|
||||||
const item: Item[] = [];
|
|
||||||
// We map every build[i]._id to a newly generated _id inside of parenIdMap. We HAVE to do this as if we have two duplicate items they would have the same _id which will brick the player inventory.
|
|
||||||
const parentIdMap = {};
|
|
||||||
const _randomId = this.hashUtil.generate(); // New Item baseId;
|
|
||||||
const weapon_name = build['Name']? build['Name'] : undefined;
|
|
||||||
build = build.Items;
|
|
||||||
|
|
||||||
let baseId;
|
|
||||||
for(let i = 0; i < build.length; i++){
|
|
||||||
|
|
||||||
if (build[i]._tpl == "5a16b9fffcdbcb0176308b34") { // helmet has a headset
|
|
||||||
this.headsetCompatible = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(i == 0) { // item base
|
|
||||||
baseId = build[i]._id; // Need the base to reference in attachments
|
|
||||||
parentIdMap[baseId] = _randomId; // base id = _randomId
|
|
||||||
item.push({
|
|
||||||
_id: _randomId,
|
|
||||||
_tpl: build[i]._tpl
|
|
||||||
});
|
|
||||||
} else { // Children Attachments
|
|
||||||
|
|
||||||
const newId = this.hashUtil.generate();
|
|
||||||
|
|
||||||
// Every _id is mapped to a newly generated _id, so every item is unique and doesn"t _id collide
|
|
||||||
if(parentIdMap[build[i]._id] == undefined) {
|
|
||||||
parentIdMap[build[i]._id] = newId;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(build[i].parentId != baseId) { // Attachments with parents that are not the base Item
|
|
||||||
|
|
||||||
item.push({
|
|
||||||
_id: newId,
|
|
||||||
_tpl: build[i]._tpl,
|
|
||||||
parentId: parentIdMap[build[i].parentId],
|
|
||||||
slotId: build[i].slotId,
|
|
||||||
upd: build[i].upd?.Togglable? ({
|
|
||||||
Togglable: {
|
|
||||||
On: true,
|
|
||||||
}
|
|
||||||
}) : {}
|
|
||||||
});
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if(build[i].slotId == "mod_magazine") {
|
|
||||||
// Save magazine
|
|
||||||
this.magazine = build[i]._tpl;
|
|
||||||
// Maximum rounds in saved magazine
|
|
||||||
const magInfo = this.itemHelper.getItem(this.magazine)
|
|
||||||
this.magazineMaxAmmo = magInfo[1]._props.Cartridges[0]._max_count;
|
|
||||||
}
|
|
||||||
item.push({
|
|
||||||
_id: newId,
|
|
||||||
_tpl: build[i]._tpl,
|
|
||||||
parentId: _randomId,
|
|
||||||
slotId: build[i].slotId,
|
|
||||||
upd: build[i].upd?.Togglable? ({
|
|
||||||
Togglable: {
|
|
||||||
On: true,
|
|
||||||
}
|
|
||||||
}) : {}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const itemInfo = this.itemHelper.getItem(item[0]._tpl)
|
|
||||||
this.caliber = itemInfo[1]._props.ammoCaliber; // save caliber
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,242 +0,0 @@
|
||||||
// SPT types
|
|
||||||
import { DependencyContainer } from "tsyringe";
|
|
||||||
import { IPreSptLoadMod } from "@spt/models/external/IPreSptLoadMod";
|
|
||||||
import { ILogger } from "@spt/models/spt/utils/ILogger";
|
|
||||||
import { PreSptModLoader } from "@spt/loaders/PreSptModLoader";
|
|
||||||
import { IPostDBLoadMod } from "@spt/models/external/IPostDBLoadMod";
|
|
||||||
import { IPostSptLoadMod } from "@spt/models/external/IPostSptLoadMod";
|
|
||||||
import { DatabaseServer } from "@spt/servers/DatabaseServer";
|
|
||||||
import { ImageRouter } from "@spt/routers/ImageRouter";
|
|
||||||
import { ConfigServer } from "@spt/servers/ConfigServer";
|
|
||||||
import { ConfigTypes } from "@spt/models/enums/ConfigTypes";
|
|
||||||
import { ITraderConfig } from "@spt/models/spt/config/ITraderConfig";
|
|
||||||
import { IRagfairConfig } from "@spt/models/spt/config/IRagfairConfig";
|
|
||||||
import { JsonUtil } from "@spt/utils/JsonUtil";
|
|
||||||
import { IOpenRandomLootContainerRequestData } from "@spt/models/eft/inventory/IOpenRandomLootContainerRequestData";
|
|
||||||
import { Traders } from "@spt/models/enums/Traders";
|
|
||||||
import { IItemEventRouterResponse } from "@spt/models/eft/itemEvent/IItemEventRouterResponse";
|
|
||||||
import { LootGenerator } from "@spt/generators/LootGenerator";
|
|
||||||
import { InventoryHelper } from "@spt/helpers/InventoryHelper";
|
|
||||||
import { ItemHelper } from "@spt/helpers/ItemHelper";
|
|
||||||
import { EventOutputHolder } from "@spt/routers/EventOutputHolder";
|
|
||||||
import { InventoryController } from "@spt/controllers/InventoryController";
|
|
||||||
import { IPmcData } from "@spt/models/eft/common/IPmcData";
|
|
||||||
import { HashUtil } from "@spt/utils/HashUtil";
|
|
||||||
import { IAddItemDirectRequest } from "@spt/models/eft/inventory/IAddItemsDirectRequest";
|
|
||||||
import * as fs from 'fs';
|
|
||||||
import * as baseJson from "../db/base.json";
|
|
||||||
import { TraderHelper } from "./traderHelpers";
|
|
||||||
import { ItemCreateHelper } from "./itemCreateHelper";
|
|
||||||
import { FluentAssortConstructor as FluentAssortCreator } from "./fluentTraderAssortCreator";
|
|
||||||
import { jsonc } from "jsonc";
|
|
||||||
import path from "path";
|
|
||||||
import { Gamble } from "./Gamble";
|
|
||||||
|
|
||||||
class SampleTrader implements IPreSptLoadMod, IPostDBLoadMod, IPostSptLoadMod
|
|
||||||
{
|
|
||||||
private mod: string
|
|
||||||
private logger: ILogger
|
|
||||||
private traderHelper: TraderHelper
|
|
||||||
private fluentAssortCreator: FluentAssortCreator
|
|
||||||
private hashUtil: HashUtil;
|
|
||||||
public config: any;
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
this.mod = "GamblerTrader";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* I'm just here so I won't get fined.
|
|
||||||
* @param container Dependency container
|
|
||||||
*/
|
|
||||||
public preSptLoad(container: DependencyContainer): void {
|
|
||||||
this.logger = container.resolve<ILogger>("WinstonLogger");
|
|
||||||
|
|
||||||
container.afterResolution("InventoryController", (_t, result: InventoryController) =>
|
|
||||||
{
|
|
||||||
result.openRandomLootContainer = (pmcData: IPmcData, body: IOpenRandomLootContainerRequestData, sessionID : string) =>
|
|
||||||
{
|
|
||||||
return this.newOpenRandomLoot(container, pmcData, body, sessionID);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.logger.debug(`[${this.mod}] preAki Loaded`);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* I'm just 'bout that gambler action boss.
|
|
||||||
* @param container Dependency container
|
|
||||||
*/
|
|
||||||
public postDBLoad(container: DependencyContainer): void {
|
|
||||||
|
|
||||||
this.logger.debug(`[${this.mod}] postDb Loading... `);
|
|
||||||
const preSptModLoader: PreSptModLoader = container.resolve<PreSptModLoader>("PreSptModLoader");
|
|
||||||
const imageRouter: ImageRouter = container.resolve<ImageRouter>("ImageRouter");
|
|
||||||
const hashUtil: HashUtil = container.resolve<HashUtil>("HashUtil");
|
|
||||||
const configServer = container.resolve<ConfigServer>("ConfigServer");
|
|
||||||
const traderConfig: ITraderConfig = configServer.getConfig<ITraderConfig>(ConfigTypes.TRADER);
|
|
||||||
const ragfairConfig = configServer.getConfig<IRagfairConfig>(ConfigTypes.RAGFAIR);
|
|
||||||
const databaseServer: DatabaseServer = container.resolve<DatabaseServer>("DatabaseServer");
|
|
||||||
const tables = databaseServer.getTables();
|
|
||||||
const jsonUtil: JsonUtil = container.resolve<JsonUtil>("JsonUtil");
|
|
||||||
const itemCreate = new ItemCreateHelper();
|
|
||||||
this.config = jsonc.parse(fs.readFileSync(path.resolve(__dirname, "../config/config.jsonc"), "utf-8"));
|
|
||||||
this.hashUtil = hashUtil;
|
|
||||||
this.traderHelper = new TraderHelper();
|
|
||||||
this.fluentAssortCreator = new FluentAssortCreator(this.hashUtil, this.logger);
|
|
||||||
this.traderHelper.registerProfileImage(baseJson, 'GamblerTrader', preSptModLoader, imageRouter, "thegambler.jpg");
|
|
||||||
this.traderHelper.setTraderUpdateTime(traderConfig, baseJson, this.config.trader_update_min_time, this.config.trader_update_max_time);
|
|
||||||
|
|
||||||
// Add trader to trader enum
|
|
||||||
Traders[baseJson._id] = baseJson._id;
|
|
||||||
// Add trader to flea market
|
|
||||||
ragfairConfig.traders[baseJson._id] = true;
|
|
||||||
// Creates and stores new gambling items in database
|
|
||||||
itemCreate.createItems(container)
|
|
||||||
|
|
||||||
// Add new trader to the trader dictionary in DatabaseServer - has no assorts (items) yet
|
|
||||||
this.traderHelper.addTraderToDb(baseJson, tables, jsonUtil);
|
|
||||||
|
|
||||||
// Add gambling containers to trader
|
|
||||||
this.traderHelper.addSingleItemsToTrader(tables, baseJson._id, this.fluentAssortCreator, container, this.logger);
|
|
||||||
|
|
||||||
// WARNING: adds the same text to ALL locales (e.g. chinese/french/english)
|
|
||||||
this.traderHelper.addTraderToLocales(baseJson, tables, baseJson.name, "Gambler", baseJson.nickname, baseJson.location, "Welcome Traveler! May I indulge you in purchasing some mystery boxes?");
|
|
||||||
|
|
||||||
/*
|
|
||||||
const maps = [
|
|
||||||
"bigmap", // customs
|
|
||||||
"factory4_day",
|
|
||||||
"factory4_night",
|
|
||||||
"woods",
|
|
||||||
"rezervbase",
|
|
||||||
"shoreline",
|
|
||||||
"interchange",
|
|
||||||
"tarkovstreets",
|
|
||||||
"lighthouse",
|
|
||||||
"laboratory",
|
|
||||||
"sandbox", // groundzero
|
|
||||||
"sandbox_high"// groundzero20
|
|
||||||
];
|
|
||||||
|
|
||||||
//console.log(tables.locations["bigmap"].staticLoot["578f87a3245977356274f2cb"].itemDistribution) // Drawer
|
|
||||||
//
|
|
||||||
// adds poker chips to static loot containers on all maps
|
|
||||||
for (const item of itemCreate.loot){
|
|
||||||
for(const map of maps){
|
|
||||||
const mapStaticLoot = tables.locations[map].staticLoot;
|
|
||||||
const staticLootProbabilities = item.addToStaticLoot;
|
|
||||||
for(const [lootContainer, probability] of Object.entries(staticLootProbabilities)){
|
|
||||||
|
|
||||||
try{
|
|
||||||
mapStaticLoot[lootContainer].itemDistribution.push({
|
|
||||||
"tpl": item.newId,
|
|
||||||
"relativeProbability": probability
|
|
||||||
});
|
|
||||||
} catch (e){
|
|
||||||
this.logger.debug("Could not add " + item.newId + " to container " + lootContainer + " on map " + map)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
this.logger.debug(`[${this.mod}] postDb Loaded`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update container prices after all mods have loaded
|
|
||||||
public postSptLoad(container: DependencyContainer): void {\
|
|
||||||
this.logger.success("[Gambler Trader] Generating Mystery Container Prices...");
|
|
||||||
const databaseServer: DatabaseServer = container.resolve<DatabaseServer>("DatabaseServer");
|
|
||||||
const tables = databaseServer.getTables();
|
|
||||||
this.traderHelper.updateContainerPrices(tables, baseJson._id, this.fluentAssortCreator, container, this.logger);
|
|
||||||
this.logger.success("[Gambler Trader] Finished Loading! Ready To Launch.");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public newOpenRandomLoot(container: DependencyContainer, pmcData: IPmcData, body: IOpenRandomLootContainerRequestData, sessionID: string): IItemEventRouterResponse {
|
|
||||||
// Needed reference methods
|
|
||||||
const lootGenerator = container.resolve<LootGenerator>("LootGenerator");
|
|
||||||
const itemHelper = container.resolve<ItemHelper>("ItemHelper");
|
|
||||||
const inventoryHelper = container.resolve<InventoryHelper>("InventoryHelper");
|
|
||||||
const eventOutputHolder = container.resolve<EventOutputHolder>("EventOutputHolder");
|
|
||||||
const openedItem = pmcData.Inventory.items.find(x => x._id === body.item);
|
|
||||||
const output = eventOutputHolder.getOutput(sessionID);
|
|
||||||
|
|
||||||
if (itemHelper.getItem(openedItem._tpl) == undefined){
|
|
||||||
this.logger.error("[GamblerTrader] Cannot find unboxed mystery container in Inventory... Best option is to restart game.. I am not fully sure why this happens...")
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
const containerDetails = itemHelper.getItem(openedItem._tpl);
|
|
||||||
let gamble: Gamble;
|
|
||||||
|
|
||||||
const newItemsRequest: IAddItemDirectRequest = {
|
|
||||||
itemsWithModsToAdd: [],
|
|
||||||
foundInRaid: true,
|
|
||||||
useSortingTable : true
|
|
||||||
};
|
|
||||||
|
|
||||||
const isSealedWeaponBox = containerDetails[1]._name.includes("event_container_airdrop"); // default airdrop container
|
|
||||||
const isGamblingContainer = containerDetails[1]._name.includes("gambling_"); // Gambler items are tagged with `gambling_${container}` identifier
|
|
||||||
const unlockedWeaponCrates = [
|
|
||||||
"665829424de4820934746ce6",
|
|
||||||
"665732e7ac60f009f270d1ef",
|
|
||||||
"665888282c4a1b73af576b77",
|
|
||||||
];
|
|
||||||
|
|
||||||
if (isGamblingContainer) {
|
|
||||||
// All Gambler containers
|
|
||||||
const currentContainer = containerDetails[1];
|
|
||||||
gamble = new Gamble(container, this.config, this.logger, currentContainer._name);
|
|
||||||
gamble.newGamble();
|
|
||||||
|
|
||||||
if(gamble.newItemsRequest.itemsWithModsToAdd.length != 0) {
|
|
||||||
newItemsRequest.itemsWithModsToAdd = [...gamble.newItemsRequest.itemsWithModsToAdd]
|
|
||||||
newItemsRequest.foundInRaid = gamble.newItemsRequest.foundInRaid;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// All other sealed containers
|
|
||||||
if (isSealedWeaponBox || unlockedWeaponCrates.includes(containerDetails[1]._id)) {
|
|
||||||
const containerSettings = inventoryHelper.getInventoryConfig().sealedAirdropContainer;
|
|
||||||
newItemsRequest.itemsWithModsToAdd.push(...lootGenerator.getSealedWeaponCaseLoot(containerSettings));
|
|
||||||
|
|
||||||
if (containerSettings.foundInRaid) {
|
|
||||||
newItemsRequest.foundInRaid = containerSettings.foundInRaid;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const rewardContainerDetails = inventoryHelper.getRandomLootContainerRewardDetails(openedItem._tpl);
|
|
||||||
if (!rewardContainerDetails || !rewardContainerDetails.rewardCount) {
|
|
||||||
this.logger.error(`Unable to add loot to container: ${openedItem._tpl}, no rewards found`);
|
|
||||||
} else {
|
|
||||||
newItemsRequest.itemsWithModsToAdd.push(...lootGenerator.getRandomLootContainerLoot(rewardContainerDetails));
|
|
||||||
|
|
||||||
if (rewardContainerDetails.foundInRaid) {
|
|
||||||
newItemsRequest.foundInRaid = rewardContainerDetails.foundInRaid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let multipleItems: any;
|
|
||||||
|
|
||||||
if (newItemsRequest.itemsWithModsToAdd.length != 0) {
|
|
||||||
|
|
||||||
if (inventoryHelper.canPlaceItemsInInventory(sessionID, newItemsRequest.itemsWithModsToAdd)){
|
|
||||||
inventoryHelper.removeItem(pmcData, body.item, sessionID, output);
|
|
||||||
inventoryHelper.addItemsToStash(sessionID, newItemsRequest, pmcData, output);
|
|
||||||
} else {
|
|
||||||
// notifierHelper.createNewMessageNotification(message); // Notifier Not Working
|
|
||||||
this.logger.error(`[${this.mod}] Cannot Open Container! Inventory Is Full!`);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Container returned nothing...
|
|
||||||
inventoryHelper.removeItem(pmcData, body.item, sessionID, output);
|
|
||||||
}
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = { mod: new SampleTrader() }
|
|
||||||
|
|
@ -1,237 +0,0 @@
|
||||||
import { DependencyContainer } from "tsyringe";
|
|
||||||
import { PreAkiModLoader } from "@spt/loaders/PreAkiModLoader";
|
|
||||||
import { Item } from "@spt/models/eft/common/tables/IItem";
|
|
||||||
import { ITraderBase, ITraderAssort } from "@spt/models/eft/common/tables/ITrader";
|
|
||||||
import { ITraderConfig, UpdateTime } from "@spt/models/spt/config/ITraderConfig";
|
|
||||||
import { IDatabaseTables } from "@spt/models/spt/server/IDatabaseTables";
|
|
||||||
import { ImageRouter } from "@spt/routers/ImageRouter";
|
|
||||||
import { JsonUtil } from "@spt/utils/JsonUtil";
|
|
||||||
import { ILogger } from "@spt/models/spt/utils/ILogger";
|
|
||||||
|
|
||||||
import { FluentAssortConstructor as FluentAssortCreator } from "./fluentTraderAssortCreator";
|
|
||||||
import { Money } from "@spt/models/enums/Money";
|
|
||||||
import * as baseJson from "../db/base.json";
|
|
||||||
|
|
||||||
import * as fs from 'fs';
|
|
||||||
import { jsonc } from "jsonc";
|
|
||||||
import path from "path";
|
|
||||||
import { Price } from "./Price";
|
|
||||||
import type { itemProps } from "./MysteryContainerInfo";
|
|
||||||
import { MysteryContainerInfo } from "./MysteryContainerInfo";
|
|
||||||
|
|
||||||
|
|
||||||
export class TraderHelper
|
|
||||||
{
|
|
||||||
|
|
||||||
// getRandomInt(3) returns 0, 1, or 2
|
|
||||||
protected getRandomInt(max: number) {
|
|
||||||
return Math.floor(Math.random() * max);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add profile picture to our trader
|
|
||||||
* @param baseJson json file for trader (db/base.json)
|
|
||||||
* @param preAkiModLoader mod loader class - used to get the mods file path
|
|
||||||
* @param imageRouter image router class - used to register the trader image path so we see their image on trader page
|
|
||||||
* @param traderImageName Filename of the trader icon to use
|
|
||||||
*/
|
|
||||||
public registerProfileImage(baseJson: any, modName: string, preAkiModLoader: PreAkiModLoader, imageRouter: ImageRouter, traderImageName: string): void
|
|
||||||
{
|
|
||||||
// Reference the mod "res" folder
|
|
||||||
const imageFilepath = `./${preAkiModLoader.getModPath(modName)}res`;
|
|
||||||
|
|
||||||
// Register a route to point to the profile picture - remember to remove the .jpg from it
|
|
||||||
imageRouter.addRoute(baseJson.avatar.replace(".jpg", ""), `${imageFilepath}/${traderImageName}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add record to trader config to set the refresh time of trader in seconds (default is 60 minutes)
|
|
||||||
* @param traderConfig trader config to add our trader to
|
|
||||||
* @param baseJson json file for trader (db/base.json)
|
|
||||||
* @param refreshTimeSecondsMin How many seconds between trader stock refresh min time
|
|
||||||
* @param refreshTimeSecondsMax How many seconds between trader stock refresh max time
|
|
||||||
*/
|
|
||||||
public setTraderUpdateTime(traderConfig: ITraderConfig, baseJson: any, refreshTimeSecondsMin: number, refreshTimeSecondsMax: number): void
|
|
||||||
{
|
|
||||||
// Add refresh time in seconds to config
|
|
||||||
const traderRefreshRecord: UpdateTime = {
|
|
||||||
traderId: baseJson._id,
|
|
||||||
seconds: {
|
|
||||||
min: refreshTimeSecondsMin,
|
|
||||||
max: refreshTimeSecondsMax
|
|
||||||
} };
|
|
||||||
|
|
||||||
traderConfig.updateTime.push(traderRefreshRecord);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add our new trader to the database
|
|
||||||
* @param traderDetailsToAdd trader details
|
|
||||||
* @param tables database
|
|
||||||
* @param jsonUtil json utility class
|
|
||||||
*/
|
|
||||||
// rome-ignore lint/suspicious/noExplicitAny: traderDetailsToAdd comes from base.json, so no type
|
|
||||||
public addTraderToDb(traderDetailsToAdd: any, tables: IDatabaseTables, jsonUtil: JsonUtil): void
|
|
||||||
{
|
|
||||||
// Add trader to trader table, key is the traders id
|
|
||||||
tables.traders[traderDetailsToAdd._id] = {
|
|
||||||
assort: this.createAssortTable(), // assorts are the 'offers' trader sells, can be a single item (e.g. carton of milk) or multiple items as a collection (e.g. a gun)
|
|
||||||
base: jsonUtil.deserialize(jsonUtil.serialize(traderDetailsToAdd)) as ITraderBase, // Deserialise/serialise creates a copy of the json and allows us to cast it as an ITraderBase
|
|
||||||
questassort: {
|
|
||||||
started: {},
|
|
||||||
success: {
|
|
||||||
/*
|
|
||||||
"66b15c72b10189169400fb52": "gambler_intro",
|
|
||||||
"66b59e1cfcf263f4d70af422": "gambler_ammo_part_1",
|
|
||||||
"66b59e1cfcf263f4d70af432": "gambler_ammo_part_2",
|
|
||||||
"66b59e1cfcf263f4d70af433": "gambler_ammo_part_3",
|
|
||||||
"66b59e1cfcf263f4d70af423": "gambler_ammo_part_4",
|
|
||||||
"66b59e1cfcf263f4d70af430": "gambler_ammo_part_5",
|
|
||||||
"66b59e1cfcf263f4d70af425": "gambler_ammo_part_6",
|
|
||||||
"66b59e1cfcf263f4d70af428": "gambler_ammo_part_7",
|
|
||||||
"66b59e1cfcf263f4d70af427": "gambler_ammo_part_8",
|
|
||||||
"66b59e1cfcf263f4d70af42a": "gambler_ammo_part_9",
|
|
||||||
"66b59e1cfcf263f4d70af429": "gambler_ammo_part_10",
|
|
||||||
"66b59e1cfcf263f4d70af434": "gambler_ammo_part_11",
|
|
||||||
"66b59e1cfcf263f4d70af42b": "gambler_ammo_part_12",
|
|
||||||
"66b59e1cfcf263f4d70af42f": "gambler_ammo_part_13",
|
|
||||||
"66b59e1cfcf263f4d70af431": "gambler_ammo_part_14",
|
|
||||||
"66b59e1cfcf263f4d70af42d": "gambler_ammo_part_15",
|
|
||||||
"66b59e1cfcf263f4d70af42c": "gambler_ammo_part_16",
|
|
||||||
"66b59e1cfcf263f4d70af42e": "gambler_ammo_part_17"
|
|
||||||
*/
|
|
||||||
},
|
|
||||||
fail: {}
|
|
||||||
} // questassort is empty as trader has no assorts unlocked by quests
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create basic data for trader + add empty assorts table for trader
|
|
||||||
* @param tables SPT db
|
|
||||||
* @param jsonUtil SPT JSON utility class
|
|
||||||
* @returns ITraderAssort
|
|
||||||
*/
|
|
||||||
private createAssortTable(): ITraderAssort
|
|
||||||
{
|
|
||||||
// Create a blank assort object, ready to have items added
|
|
||||||
const assortTable: ITraderAssort = {
|
|
||||||
nextResupply: 0,
|
|
||||||
items: [],
|
|
||||||
barter_scheme: {},
|
|
||||||
loyal_level_items: {}
|
|
||||||
}
|
|
||||||
|
|
||||||
return assortTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add container to trader PostDBLoad.
|
|
||||||
* @param tables SPT db
|
|
||||||
* @param traderId Traders id (basejson/_id value)
|
|
||||||
*/
|
|
||||||
public addSingleItemsToTrader(tables: IDatabaseTables, traderId: string, assortCreator: FluentAssortCreator, container: DependencyContainer, logger: ILogger) : void {
|
|
||||||
const config = jsonc.parse(fs.readFileSync(path.resolve(__dirname, "../config/config.jsonc"), "utf-8"));
|
|
||||||
const info: Record<string, itemProps> = MysteryContainerInfo(config);
|
|
||||||
|
|
||||||
for (const [key, value] of Object.entries(info)) {
|
|
||||||
|
|
||||||
// store containers to trader assort
|
|
||||||
if (config.container_config[key + '_enable']){
|
|
||||||
|
|
||||||
// isAmmo and ammo is disabled: SKIP all ammo
|
|
||||||
if ((parseInt(key.substring(0,1)) || key.substring(0,1) == '.') && !config.container_config['all_ammo_enable']) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const newTrade = assortCreator.createSingleAssortItem(value._id, value.quest_id)
|
|
||||||
|
|
||||||
if (value.barter) {
|
|
||||||
|
|
||||||
for (const [barter, amount] of Object.entries(value.barter)) {
|
|
||||||
newTrade.addBarterCost(barter, amount);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
newTrade.addMoneyCost(Money.ROUBLES, config.container_config[key + '_price'] * config.price_multiplier)
|
|
||||||
}
|
|
||||||
|
|
||||||
newTrade.addStackCount(config.container_config[key + '_unlimited_stock'] ? 999999 : config.container_config[key + '_stock'], config.container_config[key + '_unlimited_stock'])
|
|
||||||
newTrade.addLoyaltyLevel(1)
|
|
||||||
newTrade.export(tables.traders[baseJson._id]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// find container info based on its quest_id
|
|
||||||
private findItem(quest_id: string, info: Record<string, itemProps>): string {
|
|
||||||
|
|
||||||
for (const [key, value] of Object.entries(info)){
|
|
||||||
|
|
||||||
if (quest_id == value.quest_id) {
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updated container prices PostSPTLoad
|
|
||||||
* @param tables SPT db
|
|
||||||
* @param traderId Traders id (basejson/_id value)
|
|
||||||
*/
|
|
||||||
public updateContainerPrices(tables: IDatabaseTables, traderId: string, assortCreator: FluentAssortCreator, container: DependencyContainer, logger: ILogger) : void {
|
|
||||||
const config = jsonc.parse(fs.readFileSync(path.resolve(__dirname, "../config/config.jsonc"), "utf-8"));
|
|
||||||
const info: Record<string, itemProps> = MysteryContainerInfo(config);
|
|
||||||
const price = new Price(container, config, logger);
|
|
||||||
const fleaPrices = tables.templates.prices;
|
|
||||||
const generatedPrices = price.generateContainerPrices();
|
|
||||||
const gamblerAssort = tables.traders[traderId].assort;
|
|
||||||
|
|
||||||
//update trader assort prices
|
|
||||||
for (const [key, _] of Object.entries(gamblerAssort.barter_scheme)) {
|
|
||||||
const currentItem = this.findItem(key, info);
|
|
||||||
|
|
||||||
if (generatedPrices[currentItem + '_price']) {
|
|
||||||
gamblerAssort.barter_scheme[key][0][0].count = generatedPrices[currentItem + '_price'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// updated container flea prices
|
|
||||||
for (const [key, value] of Object.entries(info)) {
|
|
||||||
|
|
||||||
if (generatedPrices[key + '_price'] > 250000) {
|
|
||||||
if (generatedPrices[key + '_price']){
|
|
||||||
fleaPrices[value._id] = generatedPrices[key + '_price'] * 1.20;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (generatedPrices[key + '_price']){
|
|
||||||
fleaPrices[value._id] = generatedPrices[key + '_price'] * 1.35;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add traders name/location/description to the locale table
|
|
||||||
* @param baseJson json file for trader (db/base.json)
|
|
||||||
* @param tables database tables
|
|
||||||
* @param fullName Complete name of trader
|
|
||||||
* @param firstName First name of trader
|
|
||||||
* @param nickName Nickname of trader
|
|
||||||
* @param location Location of trader (e.g. "Here in the cat shop")
|
|
||||||
* @param description Description of trader
|
|
||||||
*/
|
|
||||||
public addTraderToLocales(baseJson: any, tables: IDatabaseTables, fullName: string, firstName: string, nickName: string, location: string, description: string)
|
|
||||||
{
|
|
||||||
// For each language, add locale for the new trader
|
|
||||||
const locales = Object.values(tables.locales.global) as Record<string, string>[];
|
|
||||||
for (const locale of locales) {
|
|
||||||
locale[`${baseJson._id} FullName`] = fullName;
|
|
||||||
locale[`${baseJson._id} FirstName`] = firstName;
|
|
||||||
locale[`${baseJson._id} Nickname`] = nickName;
|
|
||||||
locale[`${baseJson._id} Location`] = location;
|
|
||||||
locale[`${baseJson._id} Description`] = description;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue