Jump to content
Ilusionz

[RELEASE][Tutorial] Y-Menu Market Display (With item descriptions!) [5.0 - 4.4r3]

Recommended Posts

Market Display

This is a simple Dialog script for the Y-Menu which upon being opened, will pull a group of items from an array and displays a nice little description of the item along with the item's sell price (if any), buy price (if any) and weight.

This was made specifically for virtual items and will not work with items such as weapons, clothing, or other items from Arma 3.

 

Preview

ae13988c3b3604469e84617ee3d24d65.png

 

DISCLAIMER:

These scripts were made on and tested on the most recent Altis Life Framework(v5.0.0) & 4.4r3. They may not work if you are attempting to use them on anything lower. The scripts also do not support Dynamic Markets of any kind.

 

 

Tutorial

 

1. In your functions.hpp add the following to dialog\functions:

class marketLBChange {};
class marketUpdate {};
class marketMenu {};

 

2. Open dialog\functions and make a file called fn_marketLBChange:

#include "..\..\script_macros.hpp"
/*
    File: fn_marketLBChange.sqf
    Author: Bryan "Tonic" Boardwine
    Modified by Ilusionz
*/
private _itemControl = _this select 0;
private _itemIndex = _this select 1;

//Fetch some information.
private _iName = _itemControl lbData _itemIndex;

private _dName = M_CONFIG(getText,"VirtualItems",_iName,"displayName");
private _bPrice = M_CONFIG(getNumber,"VirtualItems",_iName,"buyPrice");
private _sPrice = M_CONFIG(getNumber,"VirtualItems",_iName,"sellPrice");
private _iWeight = M_CONFIG(getNumber,"VirtualItems",_iName,"weight");
private _iDescrip = M_CONFIG(getText,"VirtualItems",_iName,"description");

ctrlShow [60704,true];
ctrlShow [60705,true];
ctrlShow [60706,true];
ctrlShow [60707,true];
ctrlShow [60708,true];
ctrlShow [60709,true];
ctrlShow [60710,true];
ctrlShow [60711,true];
ctrlShow [60712,true];
ctrlSetText [60704, localize _dName];
ctrlSetText [60710,format ["%1",_iWeight]];
if (!(_bPrice isEqualTo -1)) then {
ctrlSetText [60712,format ["$%1",[_bPrice] call life_fnc_numberText]];
} else {
ctrlSetText [60712, "N/A"];
};
if (!(_sPrice isEqualTo -1)) then {
ctrlSetText [60711,format ["$%1",[_sPrice] call life_fnc_numberText]];
} else {
ctrlSetText [60711, "N/A"];
};
(CONTROL(60700,60709)) ctrlSetStructuredText parseText format["%1",_iDescrip];

 

3. In dialog\functions make another file called fn_marketMenu.sqf:

createDialog "marketdisplay";

[] call life_fnc_marketUpdate;

 

4. Again in dialog\functions create another file called fn_marketUpdate.sqf:

#include "..\..\script_macros.hpp"
/*
    File: fn_marketUpdate.sqf
    Author: Ilusionz

    Description:
    Update and fill the market menu.
*/
private ["_item_list","_shopItems","_name","_buyPrice","_sellPrice","_weight","_displayName"];
disableSerialization;

//Setup control vars.
_item_list = CONTROL(60700,67001);
ctrlShow [60704,false];
ctrlShow [60705,false];
ctrlShow [60706,false];
ctrlShow [60707,false];
ctrlShow [60708,false];
ctrlShow [60709,false];
ctrlShow [60710,false];
ctrlShow [60711,false];
ctrlShow [60712,false];

//Purge list
lbClear _item_list;

if (!isClass(missionConfigFile >> "VirtualShops" >> "ymarket")) exitWith {closeDialog 0; hint localize "STR_NOTF_ConfigDoesNotExist";};
ctrlSetText[67003,localize (M_CONFIG(getText,"VirtualShops","ymarket","name"))];
_shopItems = M_CONFIG(getArray,"VirtualShops","ymarket","items");

{
    _displayName = M_CONFIG(getText,"VirtualItems",_x,"displayName");
    _buyPrice = M_CONFIG(getNumber,"VirtualItems",_x,"buyPrice");
	_sellPrice = M_CONFIG(getNumber,"VirtualItems",_x,"sellPrice");
	_weight = M_CONFIG(getNumber,"VirtualItems",_x,"weight");
		_item_list lbAdd format ["%1",(localize _displayName)];
        _item_list lbSetData [(lbSize _item_list)-1,_x];
        _icon = M_CONFIG(getText,"VirtualItems",_x,"icon");
        if (!(_icon isEqualTo "")) then {
            _item_list lbSetPicture [(lbSize _item_list)-1,_icon];
        };
} forEach _shopItems;

 

5. Open your dialog folder and create market_menu.hpp:

class marketDisplay {
    idd = 60700;
    name= "marketDisplay";
    movingEnable = 0;
    enableSimulation = 1;

    class controlsBackground {
		class Life_RscTitleBackground: Life_RscText
		{
			idc = -1;
			text = "Altis Item Database"; //--- ToDo: Localize;
			x = 0.298906 * safezoneW + safezoneX;
			y = 0.27516 * safezoneH + safezoneY;
			w = 0.170156 * safezoneW;
			h = 0.022 * safezoneH;
			colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])","(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])"};
		};
		class MainBackground: Life_RscText
		{
			idc = -1;
			x = 0.298906 * safezoneW + safezoneX;
			y = 0.2976 * safezoneH + safezoneY;
			w = 0.402187 * safezoneW;
			h = 0.407 * safezoneH;
			colorBackground[] = {0,0,0,0.7};
		};
		class mText: Life_RscText
		{
			idc = -1;
			text = "Market Database"; //--- ToDo: Localize;
			x = 0.300969 * safezoneW + safezoneX;
			y = 0.302 * safezoneH + safezoneY;
			w = 0.195937 * safezoneW;
			h = 0.022 * safezoneH;
			colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])",0.5};
		};
		class mText2: Life_RscText
		{
			idc = -1;
			text = "Item Information"; //--- ToDo: Localize;
			x = 0.502062 * safezoneW + safezoneX;
			y = 0.302 * safezoneH + safezoneY;
			w = 0.195937 * safezoneW;
			h = 0.022 * safezoneH;
			colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])",0.5};
		};
    };

    class controls {
        class itemList: Life_RscListBox
		{
			idc = 67001;
			onLBSelChanged = "_this call life_fnc_marketLBChange";
			x = 0.304062 * safezoneW + safezoneX;
			y = 0.3328 * safezoneH + safezoneY;
			w = 0.190781 * safezoneW;
			h = 0.363 * safezoneH;
		};
		class Title: Life_RscTitle
		{
			idc = 67003;
			text = "Altis Item Database"; //--- ToDo: Localize;
			x = 0.298906 * safezoneW + safezoneX;
			y = 0.2756 * safezoneH + safezoneY;
			w = 0.170156 * safezoneW;
			h = 0.022 * safezoneH;
			colorText[] = {0.95,0.95,0.95,1};
			sizeEx = (((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1) * GUI_GRID_H;
		};
		class ButtonClose: Life_RscButtonMenu
		{
			onButtonClick = "closeDialog 0;";
			idc = 60702;
			text = "Close"; //--- ToDo: Localize;
			x = 0.636641 * safezoneW + safezoneX;
			y = 0.7046 * safezoneH + safezoneY;
			w = 0.0644531 * safezoneW;
			h = 0.022 * safezoneH;
			colorText[] = {1,1,1,1};
			colorBackground[] = {0,0,0,0.8};
		};
		class ItemName: Life_RscText
		{
			idc = 60704;
			text = "";
			x = 0.497937 * safezoneW + safezoneX;
			y = 0.335 * safezoneH + safezoneY;
			w = 0.190781 * safezoneW;
			h = 0.055 * safezoneH;
			sizeEx = 2.7 * 0.02;
		};
		class BuyPrice: Life_RscText
		{
			idc = 60705;
			text = "Buy Price:"; //--- ToDo: Localize;
			x = 0.498969 * safezoneW + safezoneX;
			y = 0.5308 * safezoneH + safezoneY;
			w = 0.190781 * safezoneW;
			h = 0.055 * safezoneH;
			sizeEx = 2.7 * 0.02;
		};
		class SellPrice: Life_RscText
		{
			idc = 60706;
			text = "Sell Price:"; //--- ToDo: Localize;
			x = 0.498969 * safezoneW + safezoneX;
			y = 0.5726 * safezoneH + safezoneY;
			w = 0.190781 * safezoneW;
			h = 0.055 * safezoneH;
			sizeEx = 2.7 * 0.02;
		};
		class Weight: Life_RscText
		{
			idc = 60707;
			text = "Weight:"; //--- ToDo: Localize;
			x = 0.498969 * safezoneW + safezoneX;
			y = 0.6166 * safezoneH + safezoneY;
			w = 0.190781 * safezoneW;
			h = 0.055 * safezoneH;
			sizeEx = 2.7 * 0.02;
		};
		class Description: Life_RscStructuredText
		{
			idc = 60708;
			text = "Description:"; //--- ToDo: Localize;
			x = 0.497937 * safezoneW + safezoneX;
			y = 0.379 * safezoneH + safezoneY;
			w = 0.06159 * safezoneW;
			h = 0.044 * safezoneH;
		};
		class DescriptionText: Life_RscStructuredText
		{
			idc = 60709;
			text = "";
			x = 0.497937 * safezoneW + safezoneX;
			y = 0.4164 * safezoneH + safezoneY;
			w = 0.195937 * safezoneW;
			h = 0.11 * safezoneH;
		};
		class WeightNum: Life_RscText
		{
			idc = 60710;
			text = "";
			x = 0.587635 * safezoneW + safezoneX;
			y = 0.6166 * safezoneH + safezoneY;
			w = 0.190781 * safezoneW;
			h = 0.055 * safezoneH;
			colorText[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])","(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])"};
			sizeEx = 2.7 * 0.02;
		};
		class SellNum: Life_RscText
		{
			idc = 60711;
			text = "";
			x = 0.587657 * safezoneW + safezoneX;
			y = 0.5726 * safezoneH + safezoneY;
			w = 0.190781 * safezoneW;
			h = 0.055 * safezoneH;
			colorText[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])","(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])"};
			sizeEx = 2.7 * 0.02;
		};
		class BuyNum: Life_RscText
		{
			idc = 60712;
			text = "";
			x = 0.587654 * safezoneW + safezoneX;
			y = 0.5308 * safezoneH + safezoneY;
			w = 0.190781 * safezoneW;
			h = 0.055 * safezoneH;
			colorText[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.3843])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.7019])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.8862])","(profilenamespace getvariable ['GUI_BCG_RGB_A',0.7])"};
			sizeEx = 2.7 * 0.02;
		};
    };
};

 

6. In your dialog folder, open player_inv.hpp and add the following below ButtonSyncData:

class marketButton: Life_RscButtonMenu {
    idc = 60714;
    onButtonClick = "[] call life_fnc_marketMenu";
    text = "$STR_PM_yMarket"; //--- ToDo: Localize;
    x = 0.598484 * safezoneW + safezoneX;
    y = 0.66808 * safezoneH + safezoneY;
    w = 0.0644531 * safezoneW;
    h = 0.022 * safezoneH;
    colorText[] = {1,1,1,1};
    colorBackground[] = {0,0,0,0.8};
};

 

7. Open dialog\MasterHandler.hpp and add the following:

#include "market_menu.hpp"

 

8. Open config_vItems.hpp and add the following class below class cop:

If you are using Altis Life 5.0.0:

//THIS IS NOT A SHOP, IT IS JUST THE LIST OF ITEMS THE MARKET PULLS - IT IS IN ALPHABETICAL ORDER
class ymarket {
    name = "STR_Shops_yMarket";
    conditions = "";
    items[] = {"apple", "blastingcharge", "boltcutter", "cannabis", "catshark", "catshark_raw", "cement", "cocaine_processed", "cocaine_unprocessed", "coffee", "copper_refined", "copper_unrefined", "defibrillator", "defusekit", "diamond_cut", "diamond_uncut", "donuts", "fuelEmpty", "fuelFull", "glass", "goat", "goat_raw", "goldbar", "hen", "hen_raw", "heroin_processed", "heroin_unprocessed", "iron_refined", "iron_unrefined", "lockpick", "mackerel", "mackerel_raw", "marijuana", "mullet", "mullet_raw", "mushrooms", "oil_processed", "oil_unprocessed", "ornate", "ornate_raw", "peach", "pickaxe", "rabbit", "rabbit_raw", "redgull", "rock", "rooster", "rooster_raw", "salema", "salema_raw", "sand", "salt_refined", "salt_unrefined", "sheep", "sheep_raw", "spikeStrip", "storagebig", "storagesmall", "toolkit", "tbacon", "tuna", "tuna_raw",  "turtle_soup",  "turtle_raw",  "waterBottle"};
};

If you are using Altis Life 4.x:

class ymarket {
    name = "STR_Shops_yMarket";
    side = "";
    icense = "";
    level[] = { "", "", -1, "" };
    items[] = {"apple", "blastingcharge", "boltcutter", "cannabis", "catshark", "catshark_raw", "cement", "cocaine_processed", "cocaine_unprocessed", "coffee", "copper_refined", "copper_unrefined", "defibrillator", "defusekit", "diamond_cut", "diamond_uncut", "donuts", "fuelEmpty", "fuelFull", "glass", "goat", "goat_raw", "goldbar", "hen", "hen_raw", "heroin_processed", "heroin_unprocessed", "iron_refined", "iron_unrefined", "lockpick", "mackerel", "mackerel_raw", "marijuana", "mullet", "mullet_raw", "mushrooms", "oil_processed", "oil_unprocessed", "ornate", "ornate_raw", "peach", "pickaxe", "rabbit", "rabbit_raw", "redgull", "rock", "rooster", "rooster_raw", "salema", "salema_raw", "sand", "salt_refined", "salt_unrefined", "sheep", "sheep_raw", "spikeStrip", "storagebig", "storagesmall", "toolkit", "tbacon", "tuna", "tuna_raw",  "turtle_soup",  "turtle_raw",  "waterBottle"};
};

 

9. These scripts introduce a new setting needed on every virtual item you would like on your market display. Which is a small description of the item. If you want to, you can remove it in fn_marketLBChange - but I highly recommend keeping it as filler for the menu (plus a little bonus).

Here are a few examples of a few I've used this (don't use these as their weights and prices may be different to yours):

    class marijuana {
        variable = "marijuana";
        displayName = "STR_Item_Marijuana";
        weight = 4;
        buyPrice = 7000;
        sellPrice = 5500;
        illegal = true;
        edible = -1;
        icon = "icons\ico_marijuana.paa";
        description = "Classic OG kush. Snoop would be proud. Sold at any drug dealer.";
    };
    class redgull {
        variable = "redgull";
        displayName = "STR_Item_RedGull";
        weight = 1;
        buyPrice = 1500;
        sellPrice = 200;
        illegal = false;
        edible = 100;
        icon = "icons\ico_redgull.paa";
        description = "Enery drink that certainly doesn't give you wings. Very high in sugar.";
    };
    class salt_unrefined {
        variable = "saltUnrefined";
        displayName = "STR_Item_Salt";
        weight = 5;
        buyPrice = -1;
        sellPrice = -1;
        illegal = false;
        edible = -1;
        icon = "icons\ico_saltUnprocessed.paa";
        description = "Un-refined Salt. Processed at the Salt Processor. Also gathered from the Tears of the Arma Community.";
    };

 

10. Finally, open your Stringtable.xml and add the following:

<Key ID="STR_PM_yMarket">
   <Original>Market</Original>
</Key>

<Key ID="STR_Shops_yMarket">
    <Original>Altis Market</Original>
</Key>

 

And that's it! All done.

 

SIDE NOTE:

Make sure any new items you add to the virtual item config are also added to the market array, otherwise they won't show up!

Edited by Ilusionz
  • Like 6
  • Thanks 1

Share this post


Link to post
Share on other sites

I'm running 5.0.0 when I click on the Market under Y menu I see all the items on the left but the entire right side (Item information) is empty. this is my rpt.

Error loading control mpmissions\__CUR_MP.Altis\description.ext/marketDisplay/controls/Title/

 

Share this post


Link to post
Share on other sites
5 hours ago, Mr.BananaMan said:

Nice working!! thanks

No problem, just be sure to add new stuff that you want on your market to the array. Can't stress this enough.

  • Like 1

Share this post


Link to post
Share on other sites
5 hours ago, BeastDog666 said:

is it working on 4.4r4?

if so then - is it easy to add items and to change prices of things???

I don't know, I didn't make it with 4.x in mind to be honest. It's all done in the same file, whichever item you want on your market, add it to the array and it will pull the price of it out of your config and will display it. The only thing you need to do to the prices is change the config.

Share this post


Link to post
Share on other sites

Added compatibility for 4.x (I tested specifically on 4.4r3 so if you run in to any issues on other versions please message me)

Please use this in your config_vItems.hpp:

//THIS IS NOT A SHOP, IT IS JUST THE LIST OF ITEMS THE MARKET PULLS - IT IS IN ALPHABETICAL ORDER
class ymarket {
    name = "STR_Shops_yMarket";
    side = "";
    license = "";
    level[] = { "", "", -1, "" };
    items[] = {"apple", "blastingcharge", "boltcutter", "cannabis", "catshark", "catshark_raw", "cement", "cocaine_processed", "cocaine_unprocessed", "coffee", "copper_refined", "copper_unrefined", "defibrillator", "defusekit", "diamond_cut", "diamond_uncut", "donuts", "fuelEmpty", "fuelFull", "glass", "goat", "goat_raw", "goldbar", "hen", "hen_raw", "heroin_processed", "heroin_unprocessed", "iron_refined", "iron_unrefined", "lockpick", "mackerel", "mackerel_raw", "marijuana", "mullet", "mullet_raw", "mushrooms", "oil_processed", "oil_unprocessed", "ornate", "ornate_raw", "peach", "pickaxe", "rabbit", "rabbit_raw", "redgull", "rock", "rooster", "rooster_raw", "salema", "salema_raw", "sand", "salt_refined", "salt_unrefined", "sheep", "sheep_raw", "spikeStrip", "storagebig", "storagesmall", "toolkit", "tbacon", "tuna", "tuna_raw",  "turtle_soup",  "turtle_raw",  "waterBottle"};
};

 

Share this post


Link to post
Share on other sites
On 2017-5-5 at 5:47 PM, Mitch said:

Fixed.

 

I've been busy working so I missed your original post. Could you please elaborate on what you 'fixed'? Just in case it is a problem with my original scripts? That would be helpful.

Share this post


Link to post
Share on other sites

great work man, i just needed change all new files from dialog/function to core/functions in 5.0 framework and woriking fine.

 

thanks a lot!

Share this post


Link to post
Share on other sites

@Ilusionz this is awesome! 

This forum is great. All of these scripts to make great servers, in one place.

I am running v5.0. Got it to work first run, after proofing it with the editor just to see my errors in the vitems list I added.

Thanks again. :D

 

market.jpg

Edited by one
  • Thanks 1

Share this post


Link to post
Share on other sites
On 2017-6-19 at 5:05 PM, one said:

@Ilusionz this is awesome! 

This forum is great. All of these scripts to make great servers, in one place.

I am running v5.0. Got it to work first run, after proofing it with the editor just to see my errors in the vitems list I added.

Thanks again. :D

 

market.jpg

 Not a problem. Glad you like it.

  • Like 1

Share this post


Link to post
Share on other sites
On 8/5/2017 at 2:10 AM, Feared said:

Solved ! Its the ymarket you have to change for the placement of the item in the market !

Yup, like I said every class name (not the string that appears in the menu) is in alphabetical order in the menu config. That's why it's probably a bit confusing. 

  • Thanks 1

Share this post


Link to post
Share on other sites
On 3/26/2017 at 11:29 AM, Ilusionz said:

8. Open config_vItems.hpp and add the following class below class cop:

If you are using Altis Life 5.0.0:

//THIS IS NOT A SHOP, IT IS JUST THE LIST OF ITEMS THE MARKET PULLS - IT IS IN ALPHABETICAL ORDER
class ymarket {
    name = "STR_Shops_yMarket";
    conditions = "";
    items[] = {"apple", "blastingcharge", "boltcutter", "cannabis", "catshark", "catshark_raw", "cement", "cocaine_processed", "cocaine_unprocessed", "coffee", "copper_refined", "copper_unrefined", "defibrillator", "defusekit", "diamond_cut", "diamond_uncut", "donuts", "fuelEmpty", "fuelFull", "glass", "goat", "goat_raw", "goldbar", "hen", "hen_raw", "heroin_processed", "heroin_unprocessed", "iron_refined", "iron_unrefined", "lockpick", "mackerel", "mackerel_raw", "marijuana", "mullet", "mullet_raw", "mushrooms", "oil_processed", "oil_unprocessed", "ornate", "ornate_raw", "peach", "pickaxe", "rabbit", "rabbit_raw", "redgull", "rock", "rooster", "rooster_raw", "salema", "salema_raw", "sand", "salt_refined", "salt_unrefined", "sheep", "sheep_raw", "spikeStrip", "storagebig", "storagesmall", "toolkit", "tbacon", "tuna", "tuna_raw",  "turtle_soup",  "turtle_raw",  "waterBottle"};
};

I Can't Find the config_vIteams.hpp anywhere in my Mission File can anyone Help?

Share this post


Link to post
Share on other sites
3 hours ago, GamingPanthers said:

I Can't Find the config_vIteams.hpp anywhere in my Mission File can anyone Help?

missionfile\config\Config_vItems.hpp

I put the classes together to group things together. The mushrooms are used as a spacer.

//THIS IS NOT A SHOP, IT IS JUST THE LIST OF ITEMS THE MARKET PULLS - IT IS IN ALPHABETICAL ORDER
	class ymarket {
		name = "STR_Shops_yMarket";
		conditions = "";
		items[] = { "waterBottle", "coffee", "redgull", "grapeSoda", "mushrooms", "apple", "peach",
"donuts", "rabbit", "catshark", "goat", "hen", "mackerel", "mullet", "ornate", "rooster", "salema",
"sheep", "tbacon", "tuna", "turtle_soup", "mushrooms", "catshark_raw", "goat_raw", "hen_raw", "mackerel_raw",
"mullet_raw", "ornate_raw", "rabbit_raw", "rooster_raw", "salema_raw", "sheep_raw", "tuna_raw", "turtle_raw",
"mushrooms", "toolkit", "fuelEmpty", "fuelFull", "pickaxe", "storagesmall", "storagebig", "mushrooms",
"blastingcharge", "blindfold", "boltcutter", "defibrillator", "defusekit", "emp", "laptop", "lockpick",
"spikeStrip", "zipties", "mushrooms", "rock", "cement", "copper_unrefined", "copper_refined", "iron_unrefined",
"iron_refined", "salt_unrefined", "salt_refined", "sand", "glass", "diamond_uncut", "diamond_cut", "ruby_uncut",
"ruby_cut", "gold_unrefined", "gold_refined", "goldbar", "oil_unprocessed", "oil_processed", "mushrooms",
"cannabis", "marijuana", "cocaine_unprocessed", "cocaine_processed", "heroin_unprocessed", "heroin_processed",
"meth_unprocessed", "meth_processed", "plutonium_unrefined", "plutonium_refined", "uranium_unrefined",
"uranium_refined" };
		};
	};

 

Edited by one
  • Thanks 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×