MP Store Editing Guide
Notice: ME3Tweaks does not condone cheating in online multiplayer. This guide is for informational and educational purposes only.
This is a very advanced guide, I will explain it as best as I can.
WARNING: DO NOT REPLACE THE SERVER COALESCED (ServerCoalesced.bin with Balance Changes Replacer ASI installed) WITH ONE THAT IS NOT DERIVED FROM THE ORIGINAL SERVER COALESCED. You will destroy your online profile and it cannot be recovered.
This guide will show you how to modify what you can get in the store. For this guide we will add levels to existing cards.
Here are the tools you will need to follow this guide.
- TankMaster's Coalesce tool (included in Mod Manager)
- Mod Manager
- Live Balance Changes Coalesced
You should understand the concepts in the DLC Editing Guide well before attempting this guide.
Table of Contents
- The MP Store
- How packs are defined
- How pack contents are defined
- Adding items to the store
- Testing your changes
The MP Store
The store in multiplayer, while commonly believed to be on the server, is actually nearly fully defined on the client. While lottery chances are defined by the server (live balance changes), these changes are downloaded at game startup to your machine.
Some of the pools used in packs are defined in Patch2, which allow us to edit some contents of items in the store.
Before we begin there are some key terms you should know.
Cards are the items you see when you open packs. They consist of images, descriptions (and optionally tokens), and rarity.
Tokens are a list of values that are substituted into the description of cards. These are often used on consumables. These tokens have no effect on the actual values the consumable uses and are there only for being in the description.
Rarity, contrary to its name, is used for determining what kind of card is used in the background of an item. It has absolutely no impact on how often the card comes up.
This is the image that appears representing the item in the middle of the card.
This image summarizes the above information.
A card pack is one you see in the store listing. For us standard users, these include: Recruit, Veteran, Spectre, Premium Spectre, Arsenal and Reserves Pack. I believe it used to include Jumbo Premium Spectre Pack for a very short duration in 2012. Packs include a list of pools for each slot in the pack, which for all but the jumbo packs is 5. It includes a list of chances for what pool to draw from, and has backups in the event that the ones before it are not chosen due to random chances.
This is how we now know that players have a 7.5% chance for cards in the ultra rare pools. However, we do not have the ability to modify these packs without replacing the server coalesced file. We won't be doing that in this guide as it can be dangerous if you don't know what you're doing. If we did however, we could make our own packs and put them in the store. We'll take another look at packs further in this guide.
Finally, we have the concept of pools. Pools will be where we spend the majority of our time in this guide. Pools contain a collection of cards that are drawn from when your client needs a card. For example, we have a pool defined below.
<Section name="sfxgawreinforcementingameconsumable_bronzeconsumable sfxgawreinforcementingameconsumable"> <Property name="cardlist"> <Value type="3">(UniqueName="SFXGameMPContent.SFXPowerCustomActionMP_Consumable_Ammo")</Value> <Value type="3">(UniqueName="SFXGameMPContent.SFXPowerCustomActionMP_Consumable_Revive")</Value> <Value type="3">(UniqueName="SFXGameMPContent.SFXPowerCustomActionMP_Consumable_Rocket")</Value> <Value type="3">(UniqueName="SFXGameMPContent.SFXPowerCustomActionMP_Consumable_Shield")</Value> </Property> <Property name="poolname" type="0">bronzeconsumable</Property> </Section>
This is a pool from Patch2, named bronzeconsumable, as you can see. It contains the 4 match consumables. When a pack is chosen in the store, it determines what pools to draw from. Once it does that, it randomly draws a card from the selected pool, and this is the card you are rewarded.
These steps are done before any cards are shown to you in the store purchase window. This all is done very quickly as the store is fully on your machine at this point, but the lag is because you are saving your profile to the server with your new cards.
How packs are defined
At this point we will open up the ME3BINI.bin file with TankMaster's compiler, and open up BioGame.xml from the decompiled files.
Searching for consumableidpacknamemap, we see the following data.
<Property name="consumableidpacknamemap"> <Value type="1">null</Value> <Value type="3">(ID=200000, PackName="silver")</Value> <Value type="3">(ID=300000, PackName="gold")</Value> <Value type="3">(ID=350000, PackName="goldpremium")</Value> <Value type="3">(ID=300500, PackName="goldjumbo")</Value> <Value type="3">(ID=500500, PackName="equipjumbo")</Value> <Value type="3">(ID=650100, PackName="n7equipment")</Value> <Value type="3">(ID=650200, PackName="arsenal")</Value> <Value type="3">(ID=650300, PackName="reserves")</Value> </Property>
As you can tell this is the list of packs we have in the MP store. However, they don't all make sense. For starters there is an extra pack in this list (goldjumbo) that nobody has seen before. However, I know the following:
|Pack Name||Internal Name|
|Recruit Pack||bronze (always available)|
|Premium Spectre Pack||goldpremium|
|Jumbo Equipment Pack||equipjumbo|
Since this is the live balance changes file we can't edit this, as it's always downloaded from the ME3 server. These pack names are used directly below to show what goes into a pack, and will be useful when inserting items into the store. It's fairly hard to read so I would suggest turning word wrap off.
How pack contents are defined
Below is the definition for a Veteran Pack's list of pools.
<Value type="3">(PackName="silver", Quantity=2, Pools=((PoolName="silverconsumable")), BackupPool="silvercommon")</Value> <Value type="3">(PackName="silver", Quantity=1, Pools=((PoolName="silvercommonweapon",Weight=0.4),(PoolName="silvercommon",Weight=0.6)), BackupPool="silvercommon")</Value> <Value type="3">(PackName="silver", Quantity=1, Pools=((PoolName="silvermod",Weight=0.55),(PoolName="goldmod",Weight=0.05),(PoolName="xpchar",Weight=0.1),(PoolName="silvercommon",Weight=0.3)), BackupPool="silvercommon")</Value> <Value type="3">(PackName="silver", Quantity=1, Pools=((PoolName="silvergear",Weight=0.125),(PoolName="goldgear",Weight=0.025),(PoolName="silverweapon",Weight=0.525),(PoolName="silverchar",Weight=0.225),(PoolName="goldperm",Weight=0.02),(PoolName="goldweapon",Weight=0.02),(PoolName="goldchar",Weight=0.02),(PoolName="respec",Weight=0.04)), BackupPool="silverbackup")</Value>
This is pretty hard to decipher at first, so let's tackle it one piece at a time.
All of these values are type 3, which mean they are in an array. The packname's are all silver, which ties all of these entries together to a single pack, in this case, silver. Following that, we have the quantity of cards that we are defining. After this, we have a list of pools that can be selected from.
The way a pool is chosen is a bit confusing. By the name of the variable, each pool (except the last one) has a selection weight, like wavelists. This would make you think they all add up to a weight for selection, but the backup pool does not have a weight. For this calculation, I beleive the following is how a pool is chosen:
- In order of each pool, for each pool, it is checked if the pool has any available cards. (You might have maxxed respec cards for example). If it is not, it is skipped.
- For each pool remaining, a random number is generated between 0 and 1 inclusive.
- If the pool number is less than the selection weight, that pool is selected and the process is over.
- If that number is not less than the selection weight, this pool is skipped and the next one is calculated in the same fashion.
- If the backup pool is reached, that pool is used and the cards are rewarded.
The higher the weight, the higher the chance of getting something from that pool. This is how I found that ultra rares have a drop rate of 7.5%, but this method leads to an inconsistency. In a goldpremium pack, the final 2 slots start with goldweapon and goldchar preceeding goldultrarare (ultra rares) in the list. This still works however, because once you max out your gold weapons and characters, they no longer drop, which gives you the full 7.5% drop rate once your manifest is nearly finished.
As you can see in this file, there are tons of extra packs we never got to see, like press packs, testing packs, and other things. Since the list of packs has a type 1 null at the top of it, we cannot edit the list either.
Now you might be wondering, why does any of this matter? This will be reference for where we put our store items. We're going to add Polonium Rounds IV to the store through Patch 2. This will cover several things:
- Adding an item to the store
- Adding a new rank to an existing item
- Saving a new item to the server
Adding an item to the store
Our first order of business is to add an item to the store. We can do this by adding it to a pool. We have access to pools through the Patch2 BioGame.xml file, so decompile Patch2 and open that file.
In this file there are multiple pieces of information that when put together define a card in the store as well as your inventory. They are closely tied together. We'll take a look at the different ways the game does this for different pieces of inventory.
We're going to attempt to keep our cards in the correct pools so they don't appear in the wrong packs or out of order, so our polonium rounds will go with other ammo types.
By searching this file for an ammo type (such as phasic) we find the following pool data.
<Section name="sfxgawreinforcementmatchconsumable_bronzecommonmp4 sfxgawreinforcementmatchconsumable"> <Property name="cardlist"> <Value type="3">(UniqueName="SFXGameContentDLC_CON_MP4.SFXGameEffect_MatchConsumable_AmmoPower_Needler", VersionIdx = 0)</Value> <Value type="3">(UniqueName="SFXGameContentDLC_CON_MP4.SFXGameEffect_MatchConsumable_AmmoPower_Phasic", VersionIdx = 0)</Value> <Value type="3">(UniqueName="SFXGameContentDLC_CON_MP4.SFXGameEffect_MatchConsumable_AmmoPower_Eraser", VersionIdx = 0)</Value> </Property> <Property name="poolname" type="0">bronzecommon</Property> <Property name="requireddlcmoduleids" type="3">3050</Property> <Property name="tokenslist"> <Value type="3">(UniqueName="SFXGameContentDLC_CON_MP4.SFXGameEffect_MatchConsumable_AmmoPower_Needler", Custom0Token=0.1f, Custom1Token=50.f, Custom3Token=1.5f)</Value> <Value type="3">(UniqueName="SFXGameContentDLC_CON_MP4.SFXGameEffect_MatchConsumable_AmmoPower_Phasic", Custom0Token=0.05f, Custom2Token=1.f, Custom5Token=15.f)</Value> <Value type="3">(UniqueName="SFXGameContentDLC_CON_MP4.SFXGameEffect_MatchConsumable_AmmoPower_Eraser", Custom0Token=0.1f, Custom1Token=1.f, Custom2Token=0.1f)</Value> </Property> </Section>
Another scary wall of text, but we'll deconstruct it once again. The section name is comprised of two parts, the first is a unique name for this pool data object (bronzecommonp4), and the second one is what object this belongs to. This is an ingameconsumable. This section format is also notably seen with how wavelist objects are defined.
Inside of this object we have a cardlist, a poolname, a tokenslist, and a requireddlcmoduleids. For our purposes of modding we will ignore the requireddlcmoduleids as we have all the DLCs installed. The other 3 are what is important.
The cardlist is an array of cards that belong to this pool. In this one, we have needler (explosive), phasic, and eraser (drill) rounds. The uniquename element indicates what this card does when applied in game. We'll explain this a bit more later.
It is important to note that consumed items that have levels use the VersionIdx system. Gear is not consumed, and match consumables are not leveled, so they don't use VersionIdx.
The tokens list is the same, however it contains a list of "tokens", which are values substituted into strings when being displayed. For example, in the image above it was 15% for Vibration Damper I.
The poolname is the same as the one's we saw in pack chances above in the ME3BINI files. You'll notice this is bronzecommon, while the section is bronzecommonmp4. As you can have any assortment of DLCs installed or not installed, having them installed will add this (dependent on the requireddlcmoduleids variable) set of cards to that pool.
Because there is no VersionIdx identifier in this style of pool we cannot put two different levels of the same card in this pool data object as it won't know what token set to bring up.
Adding Polonium Rounds I
To add Polonium Rounds I we must now add a new Type 3 entry to both the cardlist and tokenslist. Copy and pasting the Eraser entry, and changing it to Polonium, will finish our cardlist change.
For our tokenslist, we want to make it reflect the correct values, so we need to open up MP4's BioGame.xml file and look up the stats for Polonium. Open it, and search for polonium. Your results should be the following.
<Section name="sfxgamecontentdlc_con_mp4.sfxgameeffect_matchconsumable_ammopower_polonium"> <Property name="dotdamage" type="0">0.2f</Property> <Property name="dotdamage" type="0">0.3f</Property> <Property name="dotdamage" type="0">0.4f</Property> <Property name="dotduration" type="0">10.f</Property> <Property name="dotduration" type="0">10.f</Property> <Property name="dotduration" type="0">10.f</Property> <Property name="versioncount" type="0">3</Property> </Section>
These values define the stats for Polonium Rounds in a match. As we can see, Polonium rounds has 2 different pieces of information, dotdamage and dotduration. That means we will need 2 tokens in the tokenslist entry.
Copy and pate the eraser's token entry and change it to Polonium like we did above. Polonium Rounds only uses two tokens, Custom0Token and Custom3Token. If you were to decompile the TLK (strings) files for MP4, you would see an entry similar to the following:
<CUSTOM0> / <CUSTOM1> Targets Eliminated
The words CUSTOMX indicate what token name to use. I don't know why they don't just 0 to X. Once this is done, you've added Polonium Rounds I to the store.
To add the other two versions (Polonium II and III), find other pools you'd like to add them to and repeat this procedure, just using VersionIdx = 1 and VerisonIdx = 2. Substitute the correct values for tokens above and the cards will appear correctly in the store for you.
Testing your changes so far
If you do not have a DLC authorizer installed, you can use Mod Manager 3 to install one through the tools menu. Install Launcher WV if necessary or Binkw32 if you prefer a more permanent solution. Create your new Patch2 Coalesced file by dragging the Coalesced.xml file back onto TankMaster's compiler, and then either manually install the file, or create a Mod Manager mod and run AutoTOC on it with a PCConsoleTOC.bin file in the PATCH2 folder. (Use an existing mod to speed this up).
Install your mod. Once you get to the store, you'll want to know what packs to buy. Using the ME3BINI BioGame file, and what pools you added it to (through the poolname), you'll know what packs to buy and what chances you'll have. For this guide we added it to bronzecommon, so we'll need to buy packs that have a chance for bronzecommon.
Searching for bronzecommon in the ME3BINI BioGame.xml file shows us multiple places. Trilogy, the starter pack, and others have it, but the most reliable I found was the Jumbo Equipment Pack. It has 2 slots where it is a backup pool. So purchase several of these, sometimes it takes a while to find them.
Once you've found it, check your inventory and make sure it's there.